xref: /plan9-contrib/sys/src/9k/ip/pktmedium.c (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
1*9ef1f84bSDavid du Colombier #include "u.h"
2*9ef1f84bSDavid du Colombier #include "../port/lib.h"
3*9ef1f84bSDavid du Colombier #include "mem.h"
4*9ef1f84bSDavid du Colombier #include "dat.h"
5*9ef1f84bSDavid du Colombier #include "fns.h"
6*9ef1f84bSDavid du Colombier #include "../port/error.h"
7*9ef1f84bSDavid du Colombier 
8*9ef1f84bSDavid du Colombier #include "ip.h"
9*9ef1f84bSDavid du Colombier 
10*9ef1f84bSDavid du Colombier 
11*9ef1f84bSDavid du Colombier static void	pktbind(Ipifc*, int, char**);
12*9ef1f84bSDavid du Colombier static void	pktunbind(Ipifc*);
13*9ef1f84bSDavid du Colombier static void	pktbwrite(Ipifc*, Block*, int, uchar*);
14*9ef1f84bSDavid du Colombier static void	pktin(Fs*, Ipifc*, Block*);
15*9ef1f84bSDavid du Colombier 
16*9ef1f84bSDavid du Colombier Medium pktmedium =
17*9ef1f84bSDavid du Colombier {
18*9ef1f84bSDavid du Colombier .name=		"pkt",
19*9ef1f84bSDavid du Colombier .hsize=		14,
20*9ef1f84bSDavid du Colombier .mintu=		40,
21*9ef1f84bSDavid du Colombier .maxtu=		4*1024,
22*9ef1f84bSDavid du Colombier .maclen=	6,
23*9ef1f84bSDavid du Colombier .bind=		pktbind,
24*9ef1f84bSDavid du Colombier .unbind=	pktunbind,
25*9ef1f84bSDavid du Colombier .bwrite=	pktbwrite,
26*9ef1f84bSDavid du Colombier .pktin=		pktin,
27*9ef1f84bSDavid du Colombier };
28*9ef1f84bSDavid du Colombier 
29*9ef1f84bSDavid du Colombier /*
30*9ef1f84bSDavid du Colombier  *  called to bind an IP ifc to an ethernet device
31*9ef1f84bSDavid du Colombier  *  called with ifc wlock'd
32*9ef1f84bSDavid du Colombier  */
33*9ef1f84bSDavid du Colombier static void
pktbind(Ipifc *,int argc,char ** argv)34*9ef1f84bSDavid du Colombier pktbind(Ipifc*, int argc, char **argv)
35*9ef1f84bSDavid du Colombier {
36*9ef1f84bSDavid du Colombier 	USED(argc, argv);
37*9ef1f84bSDavid du Colombier }
38*9ef1f84bSDavid du Colombier 
39*9ef1f84bSDavid du Colombier /*
40*9ef1f84bSDavid du Colombier  *  called with ifc wlock'd
41*9ef1f84bSDavid du Colombier  */
42*9ef1f84bSDavid du Colombier static void
pktunbind(Ipifc *)43*9ef1f84bSDavid du Colombier pktunbind(Ipifc*)
44*9ef1f84bSDavid du Colombier {
45*9ef1f84bSDavid du Colombier }
46*9ef1f84bSDavid du Colombier 
47*9ef1f84bSDavid du Colombier /*
48*9ef1f84bSDavid du Colombier  *  called by ipoput with a single packet to write
49*9ef1f84bSDavid du Colombier  */
50*9ef1f84bSDavid du Colombier static void
pktbwrite(Ipifc * ifc,Block * bp,int,uchar *)51*9ef1f84bSDavid du Colombier pktbwrite(Ipifc *ifc, Block *bp, int, uchar*)
52*9ef1f84bSDavid du Colombier {
53*9ef1f84bSDavid du Colombier 	/* enqueue onto the conversation's rq */
54*9ef1f84bSDavid du Colombier 	bp = concatblock(bp);
55*9ef1f84bSDavid du Colombier 	if(ifc->conv->snoopers.ref > 0)
56*9ef1f84bSDavid du Colombier 		qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
57*9ef1f84bSDavid du Colombier 	qpass(ifc->conv->rq, bp);
58*9ef1f84bSDavid du Colombier }
59*9ef1f84bSDavid du Colombier 
60*9ef1f84bSDavid du Colombier /*
61*9ef1f84bSDavid du Colombier  *  called with ifc rlocked when someone write's to 'data'
62*9ef1f84bSDavid du Colombier  */
63*9ef1f84bSDavid du Colombier static void
pktin(Fs * f,Ipifc * ifc,Block * bp)64*9ef1f84bSDavid du Colombier pktin(Fs *f, Ipifc *ifc, Block *bp)
65*9ef1f84bSDavid du Colombier {
66*9ef1f84bSDavid du Colombier 	if(ifc->lifc == nil)
67*9ef1f84bSDavid du Colombier 		freeb(bp);
68*9ef1f84bSDavid du Colombier 	else {
69*9ef1f84bSDavid du Colombier 		if(ifc->conv->snoopers.ref > 0)
70*9ef1f84bSDavid du Colombier 			qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
71*9ef1f84bSDavid du Colombier 		ipiput4(f, ifc, bp);
72*9ef1f84bSDavid du Colombier 	}
73*9ef1f84bSDavid du Colombier }
74*9ef1f84bSDavid du Colombier 
75*9ef1f84bSDavid du Colombier void
pktmediumlink(void)76*9ef1f84bSDavid du Colombier pktmediumlink(void)
77*9ef1f84bSDavid du Colombier {
78*9ef1f84bSDavid du Colombier 	addipmedium(&pktmedium);
79*9ef1f84bSDavid du Colombier }
80