plan 9 kernel history: overview | file list | diff list

1998/0313/ip/il.c (diff list | history)

1998/0307/sys/src/9/ip/il.c:121,1321998/0313/sys/src/9/ip/il.c:121,143 (short | long | prev | next)
1998/0306    
	uchar	ilack[4];	/* Acked sequence */ 
1997/0327    
}; 
 
1997/0916    
static struct Ilstats 
1998/0313    
 
typedef struct Ilpriv Ilpriv; 
struct Ilpriv 
1997/0916    
{ 
	ulong	dup; 
	ulong	dupb; 
} ilstats; 
 
1998/0313    
	/* non-MIB stats */ 
	ulong		csumerr;		/* checksum errors */ 
	ulong		hlenerr;		/* header length error */ 
	ulong		lenerr;			/* short packet */ 
	ulong		order;			/* out of order */ 
	ulong		rexmit;			/* retransmissions */ 
	ulong		dup; 
	ulong		dupb; 
 
	Rendez		ilr; 
}; 
 
1997/0327    
/* Always Acktime < Fasttime < Slowtime << Ackkeepalive */ 
enum 
{ 
1998/0307/sys/src/9/ip/il.c:164,1811998/0313/sys/src/9/ip/il.c:175,188
1997/0327    
void	ilbackoff(Ilcb*); 
void	iltimers(Ilcb*); 
char*	ilstart(Conv*, int, int); 
void	ilackproc(); 
1998/0313    
void	ilackproc(void*); 
1997/0327    
void	iloutoforder(Conv*, Ilhdr*, Block*); 
1998/0306    
void	iliput(uchar*, Block*); 
1997/0327    
void	iladvise(Block*, char*); 
1998/0313    
void	iliput(Proto*, uchar*, Block*); 
void	iladvise(Proto*, Block*, char*); 
1997/0804    
int	ilnextqt(Ilcb*); 
1997/0327    
 
#define DBG(x)	if((logmask & Logilmsg) && (iponly == 0 || x == iponly))netlog 
                 
	Proto	il; 
	int 	ilcksum = 1; 
static 	int 	initseq = 25001; 
extern	Fs	fs; 
 
static char* 
ilconnect(Conv *c, char **argv, int argc) 
1998/0307/sys/src/9/ip/il.c:222,2281998/0313/sys/src/9/ip/il.c:229,235
1997/0327    
	e = ilstart(c, IL_LISTEN, 20); 
1997/0403    
	if(e != nil) 
		return e; 
	Fsconnected(&fs, c, nil); 
1998/0313    
	Fsconnected(c, nil); 
1997/0403    
 
	return nil; 
1997/0327    
} 
1998/0307/sys/src/9/ip/il.c:266,2741998/0313/sys/src/9/ip/il.c:273,283
1997/0327    
	int dlen; 
	ulong id; 
	Block *bp; 
1998/0313    
	Fs *f; 
1997/0327    
 
	USED(l); 
 
1998/0313    
	f = c->p->f; 
1997/0327    
	ic = (Ilcb*)c->ptcl; 
 
	bp = qget(c->wq); 
1998/0307/sys/src/9/ip/il.c:327,3331998/0313/sys/src/9/ip/il.c:336,342
1997/0327    
	} 
	ic->acktime = Ackkeepalive; 
 
	ipoput(bp, 0, c->ttl); 
1998/0313    
	ipoput(f, bp, 0, c->ttl); 
1997/0327    
} 
 
static void 
1998/0307/sys/src/9/ip/il.c:338,3771998/0313/sys/src/9/ip/il.c:347,392
1997/0327    
} 
 
1997/0916    
int 
ilxstats(char *buf, int len) 
1998/0313    
ilxstats(Proto *il, char *buf, int len) 
1997/0916    
{ 
1998/0306    
	int n; 
1998/0313    
	Ilpriv *ipriv; 
1998/0306    
 
1998/0313    
	ipriv = il->priv; 
 
1998/0306    
	n = snprint(buf, len, 
		"il: csum %d hlen %d len %d order %d rexmit %d", 
		il.csumerr, il.hlenerr, il.lenerr, il.order, il.rexmit); 
1998/0313    
		ipriv->csumerr, ipriv->hlenerr, ipriv->lenerr, ipriv->order, ipriv->rexmit); 
1998/0306    
	n += snprint(buf+n, len-n, " dupp %d dupb %d\n", 
		ilstats.dup, ilstats.dupb); 
1998/0313    
		ipriv->dup, ipriv->dupb); 
1998/0307    
	return n; 
1997/0916    
} 
 
1997/0327    
void 
ilinit(Fs *fs) 
1998/0313    
ilinit(Fs *f) 
1997/0327    
{ 
	il.name = "il"; 
	il.kick = ilkick; 
	il.connect = ilconnect; 
	il.announce = ilannounce; 
	il.state = ilstate; 
	il.create = ilcreate; 
	il.close = ilclose; 
	il.rcv = iliput; 
	il.ctl = nil; 
	il.advise = iladvise; 
1997/0916    
	il.stats = ilxstats; 
1998/0306    
	il.inuse = ilinuse; 
1997/0327    
	il.ipproto = IP_ILPROTO; 
	il.nc = Nchans; 
	il.ptclsize = sizeof(Ilcb); 
1998/0313    
	Proto *il; 
1997/0327    
 
	kproc("ilack", ilackproc, 0); 
1998/0313    
	il = smalloc(sizeof(Proto)); 
	il->priv = smalloc(sizeof(Ilpriv)); 
	il->name = "il"; 
	il->kick = ilkick; 
	il->connect = ilconnect; 
	il->announce = ilannounce; 
	il->state = ilstate; 
	il->create = ilcreate; 
	il->close = ilclose; 
	il->rcv = iliput; 
	il->ctl = nil; 
	il->advise = iladvise; 
	il->stats = ilxstats; 
	il->inuse = ilinuse; 
	il->ipproto = IP_ILPROTO; 
	il->nc = Nchans; 
	il->ptclsize = sizeof(Ilcb); 
	Fsproto(f, il); 
1997/0327    
 
	Fsproto(fs, &il); 
1998/0313    
	kproc("ilack", ilackproc, il); 
1997/0327    
} 
 
void 
1998/0307/sys/src/9/ip/il.c:467,4731998/0313/sys/src/9/ip/il.c:482,488
1997/0327    
} 
 
void 
1998/0306    
iliput(uchar*, Block *bp) 
1998/0313    
iliput(Proto *il, uchar*, Block *bp) 
1997/0327    
{ 
	char *st; 
	Ilcb *ic; 
1998/0307/sys/src/9/ip/il.c:477,4951998/0313/sys/src/9/ip/il.c:492,513
1997/0327    
	ushort sp, dp, csum; 
	int plen, illen; 
	Conv *s, **p, *new, *spec, *gen; 
1998/0313    
	Ilpriv *ipriv; 
1997/0327    
 
1998/0313    
	ipriv = il->priv; 
 
1997/0327    
	ih = (Ilhdr *)bp->rp; 
	plen = blocklen(bp); 
	if(plen < IL_IPSIZE+IL_HDRSIZE){ 
		netlog(Logil, "il: hlenerr\n"); 
		il.hlenerr++; 
1998/0313    
		netlog(il->f, Logil, "il: hlenerr\n"); 
		ipriv->hlenerr++; 
1997/0327    
		goto raise; 
	} 
 
	illen = nhgets(ih->illen); 
	if(illen+IL_IPSIZE > plen){ 
		netlog(Logil, "il: lenerr\n"); 
		il.lenerr++; 
1998/0313    
		netlog(il->f, Logil, "il: lenerr\n"); 
		ipriv->lenerr++; 
1997/0327    
		goto raise; 
	} 
 
1998/0307/sys/src/9/ip/il.c:497,5141998/0313/sys/src/9/ip/il.c:515,532
1997/0327    
	dp = nhgets(ih->ilsrc); 
1998/0306    
	v4tov6(raddr, ih->src); 
1997/0327    
 
	if(ilcksum && (csum = ptclcsum(bp, IL_IPSIZE, illen)) != 0) { 
1998/0313    
	if((csum = ptclcsum(bp, IL_IPSIZE, illen)) != 0) { 
1997/0327    
		if(ih->iltype < 0 || ih->iltype > Ilclose) 
			st = "?"; 
		else 
			st = iltype[ih->iltype]; 
		il.csumerr++; 
1998/0306    
		netlog(Logil, "il: cksum %ux %ux, pkt(%s id %lud ack %lud %I/%d->%d)\n", 
1998/0313    
		ipriv->csumerr++; 
		netlog(il->f, Logil, "il: cksum %ux %ux, pkt(%s id %lud ack %lud %I/%d->%d)\n", 
1998/0306    
			csum, st, nhgetl(ih->ilid), nhgetl(ih->ilack), raddr, sp, dp); 
1997/0327    
		goto raise; 
	} 
 
	for(p = il.conv; *p; p++) { 
1998/0313    
	for(p = il->conv; *p; p++) { 
1997/0327    
		s = *p; 
1998/0306    
		if(s->lport == sp) 
		if(s->rport == dp) 
1998/0307/sys/src/9/ip/il.c:523,5291998/0313/sys/src/9/ip/il.c:541,547
1997/0327    
			st = "?"; 
		else 
			st = iltype[ih->iltype]; 
1998/0306    
		netlog(Logil, "il: no channel, pkt(%s id %lud ack %lud %I/%ud->%ud)\n", 
1998/0313    
		netlog(il->f, Logil, "il: no channel, pkt(%s id %lud ack %lud %I/%ud->%ud)\n", 
1998/0306    
			st, nhgetl(ih->ilid), nhgetl(ih->ilack), raddr, sp, dp);  
1997/0327    
		goto raise; 
	} 
1998/0307/sys/src/9/ip/il.c:530,5361998/0313/sys/src/9/ip/il.c:548,554
1997/0327    
 
	gen = nil; 
	spec = nil; 
	for(p = il.conv; *p; p++) { 
1998/0313    
	for(p = il->conv; *p; p++) { 
1997/0327    
		s = *p; 
		ic = (Ilcb*)s->ptcl; 
		if(ic->state != Illistening) 
1998/0307/sys/src/9/ip/il.c:555,5631998/0313/sys/src/9/ip/il.c:573,581
1997/0327    
		goto raise; 
 
1998/0306    
	v4tov6(laddr, ih->dst); 
	new = Fsnewcall(&fs, s, raddr, dp, laddr, sp); 
1998/0313    
	new = Fsnewcall(s, raddr, dp, laddr, sp); 
1997/0327    
	if(new == nil){ 
1998/0306    
		netlog(Logil, "il: bad newcall %I/%ud->%ud\n", raddr, sp, dp); 
1998/0313    
		netlog(il->f, Logil, "il: bad newcall %I/%ud->%ud\n", raddr, sp, dp); 
1997/0804    
		ilsendctl(nil, ih, Ilclose, 0, nhgetl(ih->ilid), 0); 
1997/0327    
		goto raise; 
	} 
1998/0307/sys/src/9/ip/il.c:602,6081998/0313/sys/src/9/ip/il.c:620,626
1997/0327    
 
	switch(ic->state) { 
	default: 
		netlog(Logil, "il: unknown state %d\n", ic->state); 
1998/0313    
		netlog(s->p->f, Logil, "il: unknown state %d\n", ic->state); 
1997/0327    
	case Ilclosed: 
		freeblist(bp); 
		break; 
1998/0307/sys/src/9/ip/il.c:618,6241998/0313/sys/src/9/ip/il.c:636,642
1997/0327    
				ic->rstart = id; 
1997/0804    
				ilsendctl(s, nil, Ilack, ic->next, ic->recvd, 0); 
1997/0327    
				ic->state = Ilestablished; 
				Fsconnected(&fs, s, nil); 
1998/0313    
				Fsconnected(s, nil); 
1997/0327    
				ilpullup(s); 
				iltimers(ic); 
			} 
1998/0307/sys/src/9/ip/il.c:742,7471998/0313/sys/src/9/ip/il.c:760,766
1997/0803    
	Conv *c; 
	ulong id; 
1997/0804    
	int x; 
1998/0313    
	Ilpriv *ipriv; 
1997/0327    
 
	nb = nil; 
	qlock(&ic->ackq); 
1998/0307/sys/src/9/ip/il.c:759,7741998/0313/sys/src/9/ip/il.c:778,793
1997/0804    
	h->ilspec = ilnextqt(ic); 
1997/0327    
	h->ilsum[0] = 0; 
	h->ilsum[1] = 0; 
	if(ilcksum) 
		hnputs(h->ilsum, ptclcsum(nb, IL_IPSIZE, nhgets(h->illen))); 
1998/0313    
	hnputs(h->ilsum, ptclcsum(nb, IL_IPSIZE, nhgets(h->illen))); 
1997/0327    
 
1997/0803    
	c = ic->conv; 
1998/0313    
	ipriv = c->p->priv; 
1997/0803    
	id = nhgetl(h->ilid); 
	netlog(Logil, "il: rexmit %ud %ud: %d %d: %i %d/%d\n", id, ic->recvd, 
1998/0313    
	netlog(c->p->f, Logil, "il: rexmit %ud %ud: %d %d: %i %d/%d\n", id, ic->recvd, 
1997/0803    
		ic->fasttime, ic->timeout, 
		c->raddr, c->lport, c->rport); 
 
1997/0327    
	il.rexmit++; 
1998/0313    
	ipriv->rexmit++; 
1997/0730    
	ic->rexmit++; 
1997/0803    
 
	/* 
1998/0307/sys/src/9/ip/il.c:782,7881998/0313/sys/src/9/ip/il.c:801,807
1997/0803    
	if(x >= (1<<LogAGain)) 
		ic->rate = x; 
 
1997/0327    
	ipoput(nb, 0, ic->conv->ttl); 
1998/0313    
	ipoput(c->p->f, nb, 0, ic->conv->ttl); 
1997/0327    
} 
 
/* DEBUG */ 
1998/0307/sys/src/9/ip/il.c:794,8001998/0313/sys/src/9/ip/il.c:813,819
1997/0327    
	ic = (Ilcb*)s->ptcl; 
 
	USED(ic); 
	DBG(s->raddr)(Logilmsg, "%11s rcv %d/%d snt %d/%d pkt(%s id %d ack %d %d->%d) ", 
1998/0313    
	netlog(s->p->f, Logilmsg, "%11s rcv %d/%d snt %d/%d pkt(%s id %d ack %d %d->%d) ", 
1997/0327    
		ilstates[ic->state],  ic->rstart, ic->recvd, ic->start,  
		ic->next, iltype[h->iltype], nhgetl(h->ilid),  
		nhgetl(h->ilack), nhgets(h->ilsrc), nhgets(h->ildst)); 
1998/0307/sys/src/9/ip/il.c:801,8071998/0313/sys/src/9/ip/il.c:820,826
1997/0327    
 
	_ilprocess(s, h, bp); 
 
	DBG(s->raddr)(Logilmsg, "%11s rcv %d snt %d\n", ilstates[ic->state], ic->recvd, ic->next); 
1998/0313    
	netlog(s->p->f, Logilmsg, "%11s rcv %d snt %d\n", ilstates[ic->state], ic->recvd, ic->next); 
1997/0327    
} 
 
void 
1998/0307/sys/src/9/ip/il.c:810,8161998/0313/sys/src/9/ip/il.c:829,835
1997/0327    
	Ilcb *ic; 
	int callout; 
 
1998/0306    
	netlog(Logil, "il: hangup! %I %d/%d: %s\n", s->raddr, s->lport, s->rport, msg?msg:"no reason"); 
1998/0313    
	netlog(s->p->f, Logil, "il: hangup! %I %d/%d: %s\n", s->raddr, s->lport, s->rport, msg?msg:"no reason"); 
1997/0327    
 
	ic = (Ilcb*)s->ptcl; 
	callout = ic->state == Ilsyncer; 
1998/0307/sys/src/9/ip/il.c:820,8261998/0313/sys/src/9/ip/il.c:839,845
1997/0327    
	qhangup(s->wq, msg); 
 
	if(callout) 
		Fsconnected(&fs, s, msg); 
1998/0313    
		Fsconnected(s, msg); 
1997/0327    
} 
 
void 
1998/0307/sys/src/9/ip/il.c:830,8351998/0313/sys/src/9/ip/il.c:849,855
1997/0327    
	Ilhdr *oh; 
	Block *bp; 
	ulong oid, dlen; 
1998/0313    
	Ilpriv *ipriv; 
1997/0327    
 
	ic = (Ilcb*)s->ptcl; 
	if(ic->state != Ilestablished) 
1998/0307/sys/src/9/ip/il.c:846,8521998/0313/sys/src/9/ip/il.c:866,873
1997/0327    
			continue; 
		} 
1997/0916    
		if(oid != ic->recvd+1){ 
			il.order++; 
1998/0313    
			ipriv = s->p->priv; 
			ipriv->order++; 
1997/0327    
			break; 
1997/0916    
		} 
1997/0327    
 
1998/0307/sys/src/9/ip/il.c:875,8811998/0313/sys/src/9/ip/il.c:896,904
1998/0306    
	uchar *lid; 
1997/0327    
	Block *f, **l; 
	ulong id, newid; 
1998/0313    
	Ilpriv *ipriv; 
1997/0327    
 
1998/0313    
	ipriv = s->p->priv; 
1997/0327    
	ic = (Ilcb*)s->ptcl; 
	bp->list = nil; 
 
1998/0307/sys/src/9/ip/il.c:882,8881998/0313/sys/src/9/ip/il.c:905,911
1997/0327    
	id = nhgetl(h->ilid); 
	/* Window checks */ 
	if(id <= ic->recvd || id > ic->recvd+ic->window) { 
		netlog(Logil, "il: message outside window %ud <%ud-%ud>: %i %d/%d\n", 
1998/0313    
		netlog(s->p->f, Logil, "il: message outside window %ud <%ud-%ud>: %i %d/%d\n", 
1997/0327    
			id, ic->recvd, ic->recvd+ic->window, s->raddr, s->lport, s->rport); 
		freeblist(bp); 
		return; 
1998/0307/sys/src/9/ip/il.c:899,9061998/0313/sys/src/9/ip/il.c:922,929
1997/0327    
			newid = nhgetl(lid); 
			if(id <= newid) { 
				if(id == newid) { 
1997/0916    
					ilstats.dup++; 
					ilstats.dupb += blocklen(bp); 
1998/0313    
					ipriv->dup++; 
					ipriv->dupb += blocklen(bp); 
1997/0327    
					qunlock(&ic->outo); 
					freeblist(bp); 
					return; 
1998/0307/sys/src/9/ip/il.c:964,9871998/0313/sys/src/9/ip/il.c:987,1014
1997/0327    
		hnputs(ih->ilsum, ptclcsum(bp, IL_IPSIZE, IL_HDRSIZE)); 
 
	if(ipc){ 
		DBG(ipc->raddr)(Logilmsg, "ctl(%s id %d ack %d %d->%d)\n", 
1998/0313    
		netlog(ipc->p->f, Logilmsg, "ctl(%s id %d ack %d %d->%d)\n", 
1997/0327    
		iltype[ih->iltype], nhgetl(ih->ilid), nhgetl(ih->ilack),  
		nhgets(ih->ilsrc), nhgets(ih->ildst)); 
	} 
 
	ipoput(bp, 0, ttl); 
1998/0313    
	ipoput(ipc->p->f, bp, 0, ttl); 
1997/0327    
} 
 
void 
ilackproc() 
1998/0313    
ilackproc(void *x) 
1997/0327    
{ 
	Ilcb *ic; 
	Conv **s, *p; 
	static Rendez ilr; 
1998/0313    
	Proto *il; 
	Ilpriv *ipriv; 
1997/0327    
 
1998/0313    
	il = x; 
	ipriv = il->priv; 
 
1997/0327    
loop: 
	tsleep(&ilr, return0, 0, Iltickms); 
	for(s = il.conv; s && *s; s++) { 
1998/0313    
	tsleep(&ipriv->ilr, return0, 0, Iltickms); 
	for(s = il->conv; s && *s; s++) { 
1997/0327    
		p = *s; 
		ic = (Ilcb*)p->ptcl; 
 
1998/0307/sys/src/9/ip/il.c:1016,10221998/0313/sys/src/9/ip/il.c:1043,1049
1997/0327    
			if(ic->querytime <= 0){ 
				ic->deathtime -= Querytime; 
				if(ic->deathtime < 0){ 
					netlog(Logil, "il: hangup due to deathtime (%d) < 0 \n", ic->deathtime); 
1998/0313    
					netlog(il->f, Logil, "il: hangup due to deathtime (%d) < 0 \n", ic->deathtime); 
1997/0327    
					ilhangup(p, etime); 
					break; 
				} 
1998/0307/sys/src/9/ip/il.c:1032,10381998/0313/sys/src/9/ip/il.c:1059,1065
1997/0327    
				ilbackoff(ic); 
			} 
			if(ic->timeout >= ic->slowtime) { 
				netlog(Logil, "il: hangup due to timeout (%d) >= slowtime (%d)\n", ic->timeout, ic->slowtime); 
1998/0313    
				netlog(il->f, Logil, "il: hangup due to timeout (%d) >= slowtime (%d)\n", ic->timeout, ic->slowtime); 
1997/0327    
				ilhangup(p, etime); 
				break; 
			} 
1998/0307/sys/src/9/ip/il.c:1080,10861998/0313/sys/src/9/ip/il.c:1107,1113
1997/0327    
 
	switch(type) { 
	default: 
		netlog(Logil, "il: start: type %d\n", type); 
1998/0313    
		netlog(c->p->f, Logil, "il: start: type %d\n", type); 
1997/0327    
		break; 
	case IL_LISTEN: 
		ic->state = Illistening; 
1998/0307/sys/src/9/ip/il.c:1132,11381998/0313/sys/src/9/ip/il.c:1159,1165
1997/0327    
} 
 
void 
iladvise(Block *bp, char *msg) 
1998/0313    
iladvise(Proto *il, Block *bp, char *msg) 
1997/0327    
{ 
	Ilhdr *h; 
	Ilcb *ic;		 
1998/0307/sys/src/9/ip/il.c:1148,11541998/0313/sys/src/9/ip/il.c:1175,1181
1997/0327    
 
 
	/* Look for a connection, unfortunately the destination port is missing */ 
	for(p = il.conv; *p; p++) { 
1998/0313    
	for(p = il->conv; *p; p++) { 
1997/0327    
		s = *p; 
1998/0306    
		if(s->lport == psource) 
		if(ipcmp(s->laddr, source) == 0) 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)