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
1151711cb6SDavid du Colombier static void pktbind(Ipifc*, int, char**);
1251711cb6SDavid du Colombier static void pktunbind(Ipifc*);
1351711cb6SDavid du Colombier static void pktbwrite(Ipifc*, Block*, int, uchar*);
1451711cb6SDavid du Colombier static void pktin(Fs*, Ipifc*, Block*);
157dd7cddfSDavid du Colombier
167dd7cddfSDavid du Colombier Medium pktmedium =
177dd7cddfSDavid du Colombier {
187dd7cddfSDavid du Colombier .name= "pkt",
197dd7cddfSDavid du Colombier .hsize= 14,
203f695129SDavid du Colombier .mintu= 40,
213f695129SDavid du Colombier .maxtu= 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 };
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier /*
307dd7cddfSDavid du Colombier * called to bind an IP ifc to an ethernet device
317dd7cddfSDavid du Colombier * called with ifc wlock'd
327dd7cddfSDavid du Colombier */
337dd7cddfSDavid du Colombier static void
pktbind(Ipifc *,int argc,char ** argv)34*14cc0f53SDavid du Colombier pktbind(Ipifc*, int argc, char **argv)
357dd7cddfSDavid du Colombier {
36*14cc0f53SDavid du Colombier USED(argc, argv);
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
pktunbind(Ipifc *)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
pktbwrite(Ipifc * ifc,Block * bp,int,uchar *)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);
55ef9eff0bSDavid du Colombier if(ifc->conv->snoopers.ref > 0)
56ef9eff0bSDavid 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
pktin(Fs * f,Ipifc * ifc,Block * bp)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);
68ef9eff0bSDavid du Colombier else {
69ef9eff0bSDavid du Colombier if(ifc->conv->snoopers.ref > 0)
70ef9eff0bSDavid du Colombier qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
713ff48bf5SDavid du Colombier ipiput4(f, ifc, bp);
727dd7cddfSDavid du Colombier }
73ef9eff0bSDavid du Colombier }
747dd7cddfSDavid du Colombier
757dd7cddfSDavid du Colombier void
pktmediumlink(void)767dd7cddfSDavid du Colombier pktmediumlink(void)
777dd7cddfSDavid du Colombier {
787dd7cddfSDavid du Colombier addipmedium(&pktmedium);
797dd7cddfSDavid du Colombier }
80