Lindent pass
[akaros.git] / kern / src / net / iprouter.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 struct IProuter iprouter;
17
18 /*
19  *  User level routing.  Ip packets we don't know what to do with
20  *  come here.
21  */
22 void useriprouter(struct Fs *f, struct Ipifc *ifc, struct block *bp)
23 {
24         qlock(&(&f->iprouter)->qlock);
25         if (f->iprouter.q != NULL) {
26                 bp = padblock(bp, IPaddrlen);
27                 if (bp == NULL)
28                         return;
29                 ipmove(bp->rp, ifc->lifc->local);
30                 qpass(f->iprouter.q, bp);
31         } else
32                 freeb(bp);
33         qunlock(&(&f->iprouter)->qlock);
34 }
35
36 void iprouteropen(struct Fs *f)
37 {
38         qlock(&(&f->iprouter)->qlock);
39         f->iprouter.opens++;
40         if (f->iprouter.q == NULL)
41                 f->iprouter.q = qopen(64 * 1024, 0, 0, 0);
42         else if (f->iprouter.opens == 1)
43                 qreopen(f->iprouter.q);
44         qunlock(&(&f->iprouter)->qlock);
45 }
46
47 void iprouterclose(struct Fs *f)
48 {
49         qlock(&(&f->iprouter)->qlock);
50         f->iprouter.opens--;
51         if (f->iprouter.opens == 0)
52                 qclose(f->iprouter.q);
53         qunlock(&(&f->iprouter)->qlock);
54 }
55
56 long iprouterread(struct Fs *f, void *a, int n)
57 {
58         return qread(f->iprouter.q, a, n);
59 }