xref: /plan9/sys/src/9/ip/pktmedium.c (revision ef9eff0badb330e9dfd6ba476ea333c24db47db4)
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