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