Lindent pass
[akaros.git] / kern / src / net / pktmedium.c
1 // INFERNO
2 #include <vfs.h>
3 #include <kfs.h>
4 #include <slab.h>
5 #include <kmalloc.h>
6 #include <kref.h>
7 #include <string.h>
8 #include <stdio.h>
9 #include <assert.h>
10 #include <error.h>
11 #include <cpio.h>
12 #include <pmap.h>
13 #include <smp.h>
14 #include <ip.h>
15
16 static void pktbind(struct Ipifc *i, int unused_int, char **unused_char_pp_t);
17 static void pktunbind(struct Ipifc *i);
18 static void pktbwrite(struct Ipifc *i, struct block *, int unused_int,
19                                           uint8_t * unused_uint8_p_t);
20 static void pktin(struct Fs *f, struct Ipifc *i, struct block *b);
21
22 struct medium pktmedium = {
23         .name = "pkt",
24         .hsize = 14,
25         .mintu = 40,
26         .maxtu = 4 * 1024,
27         .maclen = 6,
28         .bind = pktbind,
29         .unbind = pktunbind,
30         .bwrite = pktbwrite,
31         .pktin = pktin,
32         .unbindonclose = 1,
33 };
34
35 /*
36  *  called to bind an IP ifc to an ethernet device
37  *  called with ifc wlock'd
38  */
39 static void pktbind(struct Ipifc *i, int unused_int, char **unused_char_pp_t)
40 {
41 }
42
43 /*
44  *  called with ifc wlock'd
45  */
46 static void pktunbind(struct Ipifc *i)
47 {
48 }
49
50 /*
51  *  called by ipoput with a single packet to write
52  */
53 static void
54 pktbwrite(struct Ipifc *ifc, struct block *bp, int unused_int,
55                   uint8_t * unused_uint8_p_t)
56 {
57         /* enqueue onto the conversation's rq */
58         bp = concatblock(bp);
59         if (atomic_read(&ifc->conv->snoopers) > 0)
60                 qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
61         qpass(ifc->conv->rq, bp);
62 }
63
64 /*
65  *  called with ifc rlocked when someone write's to 'data'
66  */
67 static void pktin(struct Fs *f, struct Ipifc *ifc, struct block *bp)
68 {
69         if (ifc->lifc == NULL)
70                 freeb(bp);
71         else {
72                 if (atomic_read(&ifc->conv->snoopers) > 0)
73                         qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
74                 ipiput4(f, ifc, bp);
75         }
76 }
77
78 void pktmediumlink(void)
79 {
80         addipmedium(&pktmedium);
81 }