Charles.Forsyth20060303644188019 years agoHistory
56 lines · 977 B · C
RawDownload
#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. */voiduseriprouter(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);} voidiprouteropen(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);} voidiprouterclose(Fs *f){	qlock(&f->iprouter);	f->iprouter.opens--;	if(f->iprouter.opens == 0)		qclose(f->iprouter.q);	qunlock(&f->iprouter);} longiprouterread(Fs *f, void *a, int n){	return qread(f->iprouter.q, a, n);}