summaryrefslogtreecommitdiff
path: root/os/ip/iprouter.c
diff options
context:
space:
mode:
Diffstat (limited to 'os/ip/iprouter.c')
-rw-r--r--os/ip/iprouter.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/os/ip/iprouter.c b/os/ip/iprouter.c
new file mode 100644
index 00000000..631e728b
--- /dev/null
+++ b/os/ip/iprouter.c
@@ -0,0 +1,56 @@
+#include "u.h"
+#include "../port/lib.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "../port/error.h"
+#include "../ip/ip.h"
+
+IProuter iprouter;
+
+/*
+ * User level routing. Ip packets we don't know what to do with
+ * come here.
+ */
+void
+useriprouter(Fs *f, Ipifc *ifc, Block *bp)
+{
+ qlock(&f->iprouter);
+ if(f->iprouter.q != nil){
+ bp = padblock(bp, IPaddrlen);
+ if(bp == nil)
+ return;
+ ipmove(bp->rp, ifc->lifc->local);
+ qpass(f->iprouter.q, bp);
+ }else
+ freeb(bp);
+ qunlock(&f->iprouter);
+}
+
+void
+iprouteropen(Fs *f)
+{
+ qlock(&f->iprouter);
+ f->iprouter.opens++;
+ if(f->iprouter.q == nil)
+ f->iprouter.q = qopen(64*1024, 0, 0, 0);
+ else if(f->iprouter.opens == 1)
+ qreopen(f->iprouter.q);
+ qunlock(&f->iprouter);
+}
+
+void
+iprouterclose(Fs *f)
+{
+ qlock(&f->iprouter);
+ f->iprouter.opens--;
+ if(f->iprouter.opens == 0)
+ qclose(f->iprouter.q);
+ qunlock(&f->iprouter);
+}
+
+long
+iprouterread(Fs *f, void *a, int n)
+{
+ return qread(f->iprouter.q, a, n);
+}