17dd7cddfSDavid du Colombier #include "u.h" 27dd7cddfSDavid du Colombier #include "../port/lib.h" 37dd7cddfSDavid du Colombier #include "mem.h" 47dd7cddfSDavid du Colombier #include "dat.h" 57dd7cddfSDavid du Colombier #include "fns.h" 67dd7cddfSDavid du Colombier #include "../port/error.h" 77dd7cddfSDavid du Colombier 87dd7cddfSDavid du Colombier #include "ip.h" 97dd7cddfSDavid du Colombier 107dd7cddfSDavid du Colombier 117dd7cddfSDavid du Colombier static void pktbind(Ipifc *ifc, int argc, char **argv); 127dd7cddfSDavid du Colombier static void pktunbind(Ipifc *ifc); 137dd7cddfSDavid du Colombier static void pktbwrite(Ipifc *ifc, Block *bp, int version, uchar *ip); 147dd7cddfSDavid du Colombier static void pktin(Fs*, Ipifc *ifc, Block *bp); 157dd7cddfSDavid du Colombier 167dd7cddfSDavid du Colombier Medium pktmedium = 177dd7cddfSDavid du Colombier { 187dd7cddfSDavid du Colombier .name= "pkt", 197dd7cddfSDavid du Colombier .hsize= 14, 207dd7cddfSDavid du Colombier .minmtu= 40, 217dd7cddfSDavid du Colombier .maxmtu= 4*1024, 227dd7cddfSDavid du Colombier .maclen= 6, 237dd7cddfSDavid du Colombier .bind= pktbind, 247dd7cddfSDavid du Colombier .unbind= pktunbind, 257dd7cddfSDavid du Colombier .bwrite= pktbwrite, 267dd7cddfSDavid du Colombier .pktin= pktin, 277dd7cddfSDavid du Colombier .unbindonclose= 1, 287dd7cddfSDavid du Colombier }; 297dd7cddfSDavid du Colombier 307dd7cddfSDavid du Colombier /* 317dd7cddfSDavid du Colombier * called to bind an IP ifc to an ethernet device 327dd7cddfSDavid du Colombier * called with ifc wlock'd 337dd7cddfSDavid du Colombier */ 347dd7cddfSDavid du Colombier static void 357dd7cddfSDavid du Colombier pktbind(Ipifc*, int, char**) 367dd7cddfSDavid du Colombier { 377dd7cddfSDavid du Colombier } 387dd7cddfSDavid du Colombier 397dd7cddfSDavid du Colombier /* 407dd7cddfSDavid du Colombier * called with ifc wlock'd 417dd7cddfSDavid du Colombier */ 427dd7cddfSDavid du Colombier static void 437dd7cddfSDavid du Colombier pktunbind(Ipifc*) 447dd7cddfSDavid du Colombier { 457dd7cddfSDavid du Colombier } 467dd7cddfSDavid du Colombier 477dd7cddfSDavid du Colombier /* 487dd7cddfSDavid du Colombier * called by ipoput with a single packet to write 497dd7cddfSDavid du Colombier */ 507dd7cddfSDavid du Colombier static void 517dd7cddfSDavid du Colombier pktbwrite(Ipifc *ifc, Block *bp, int, uchar*) 527dd7cddfSDavid du Colombier { 537dd7cddfSDavid du Colombier /* enqueue onto the conversation's rq */ 547dd7cddfSDavid du Colombier bp = concatblock(bp); 55*ef9eff0bSDavid du Colombier if(ifc->conv->snoopers.ref > 0) 56*ef9eff0bSDavid du Colombier qpass(ifc->conv->sq, copyblock(bp, BLEN(bp))); 577dd7cddfSDavid du Colombier qpass(ifc->conv->rq, bp); 587dd7cddfSDavid du Colombier } 597dd7cddfSDavid du Colombier 607dd7cddfSDavid du Colombier /* 617dd7cddfSDavid du Colombier * called with ifc rlocked when someone write's to 'data' 627dd7cddfSDavid du Colombier */ 637dd7cddfSDavid du Colombier static void 647dd7cddfSDavid du Colombier pktin(Fs *f, Ipifc *ifc, Block *bp) 657dd7cddfSDavid du Colombier { 667dd7cddfSDavid du Colombier if(ifc->lifc == nil) 677dd7cddfSDavid du Colombier freeb(bp); 68*ef9eff0bSDavid du Colombier else { 69*ef9eff0bSDavid du Colombier if(ifc->conv->snoopers.ref > 0) 70*ef9eff0bSDavid du Colombier qpass(ifc->conv->sq, copyblock(bp, BLEN(bp))); 713ff48bf5SDavid du Colombier ipiput4(f, ifc, bp); 727dd7cddfSDavid du Colombier } 73*ef9eff0bSDavid du Colombier } 747dd7cddfSDavid du Colombier 757dd7cddfSDavid du Colombier void 767dd7cddfSDavid du Colombier pktmediumlink(void) 777dd7cddfSDavid du Colombier { 787dd7cddfSDavid du Colombier addipmedium(&pktmedium); 797dd7cddfSDavid du Colombier } 80