diff options
Diffstat (limited to 'os/ip/iprouter.c')
| -rw-r--r-- | os/ip/iprouter.c | 56 |
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); +} |
