pktmedium.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
pktmedium.c (1298B)
---
1 #include "u.h"
2 #include "lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 #include "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
34 pktbind(Ipifc* _, int argc, char **argv)
35 {
36 }
37
38 /*
39 * called with ifc wlock'd
40 */
41 static void
42 pktunbind(Ipifc* _)
43 {
44 }
45
46 /*
47 * called by ipoput with a single packet to write
48 */
49 static void
50 pktbwrite(Ipifc *ifc, Block *bp, int _, uchar* __)
51 {
52 /* enqueue onto the conversation's rq */
53 bp = concatblock(bp);
54 if(ifc->conv->snoopers.ref > 0)
55 qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
56 qpass(ifc->conv->rq, bp);
57 }
58
59 /*
60 * called with ifc rlocked when someone write's to 'data'
61 */
62 static void
63 pktin(Fs *f, Ipifc *ifc, Block *bp)
64 {
65 if(ifc->lifc == nil)
66 freeb(bp);
67 else {
68 if(ifc->conv->snoopers.ref > 0)
69 qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
70 ipiput4(f, ifc, bp);
71 }
72 }
73
74 void
75 pktmediumlink(void)
76 {
77 addipmedium(&pktmedium);
78 }