pktmedium.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "u.h"
  2. #include "../port/lib.h"
  3. #include "mem.h"
  4. #include "dat.h"
  5. #include "fns.h"
  6. #include "../port/error.h"
  7. #include "ip.h"
  8. static void pktbind(Ipifc*, int, char**);
  9. static void pktunbind(Ipifc*);
  10. static void pktbwrite(Ipifc*, Block*, int, uchar*);
  11. static void pktin(Fs*, Ipifc*, Block*);
  12. Medium pktmedium =
  13. {
  14. .name= "pkt",
  15. .hsize= 14,
  16. .mintu= 40,
  17. .maxtu= 4*1024,
  18. .maclen= 6,
  19. .bind= pktbind,
  20. .unbind= pktunbind,
  21. .bwrite= pktbwrite,
  22. .pktin= pktin,
  23. };
  24. /*
  25. * called to bind an IP ifc to an ethernet device
  26. * called with ifc wlock'd
  27. */
  28. static void
  29. pktbind(Ipifc*, int argc, char **argv)
  30. {
  31. USED(argc, argv);
  32. }
  33. /*
  34. * called with ifc wlock'd
  35. */
  36. static void
  37. pktunbind(Ipifc*)
  38. {
  39. }
  40. /*
  41. * called by ipoput with a single packet to write
  42. */
  43. static void
  44. pktbwrite(Ipifc *ifc, Block *bp, int, uchar*)
  45. {
  46. /* enqueue onto the conversation's rq */
  47. bp = concatblock(bp);
  48. if(ifc->conv->snoopers.ref > 0)
  49. qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
  50. qpass(ifc->conv->rq, bp);
  51. }
  52. /*
  53. * called with ifc rlocked when someone write's to 'data'
  54. */
  55. static void
  56. pktin(Fs *f, Ipifc *ifc, Block *bp)
  57. {
  58. if(ifc->lifc == nil)
  59. freeb(bp);
  60. else {
  61. if(ifc->conv->snoopers.ref > 0)
  62. qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
  63. ipiput4(f, ifc, bp);
  64. }
  65. }
  66. void
  67. pktmediumlink(void)
  68. {
  69. addipmedium(&pktmedium);
  70. }