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