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