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

1990/0509/port/sturp.c (diff list | history)

1990/0509/sys/src/9/port/sturp.c:48,541990/0511/sys/src/9/port/sturp.c:48,53 (short | long | prev | next)
1990/0321    
	int	blocks; 
1990/0227    
 
	/* output */ 
                 
1990/0312    
	QLock	xmit;		/* output lock, only one process at a time */ 
	Queue	*wq;		/* output queue */ 
	int	maxout;		/* maximum outstanding unacked blocks */ 
1990/0509/sys/src/9/port/sturp.c:60,651990/0511/sys/src/9/port/sturp.c:59,65
1990/0227    
	Block	*xb[8];		/* the xmit window buffer */ 
1990/0312    
	QLock	xl[8]; 
	ulong	timer;		/* timeout for xmit */ 
1990/0511    
	int	rexmit; 
1990/0312    
 
	int	kstarted; 
1990/0227    
}; 
1990/0509/sys/src/9/port/sturp.c:168,1811990/0511/sys/src/9/port/sturp.c:168,173
1990/0227    
	up = (Urp *)a; 
1990/0509    
	return (up->state&HUNGUP) || (up->unechoed==up->nxb && up->wq->len==0); 
1990/0227    
} 
1990/0312    
static int 
isdead(void *a) 
{ 
	Urp *up; 
                 
	up = (Urp *)a; 
	return up->kstarted == 0; 
} 
static void 
1990/0227    
urpclose(Queue *q) 
{ 
1990/0509/sys/src/9/port/sturp.c:219,2261990/0511/sys/src/9/port/sturp.c:211,220
1990/0509    
		} 
	qunlock(&up->xmit); 
1990/0403    
 
	if(up->kstarted == 0) 
1990/0511    
	if(up->kstarted == 0){ 
		DPRINT("urpclose %ux\n", up); 
1990/0403    
		up->state = 0; 
1990/0511    
	} 
1990/0227    
} 
 
/* 
1990/0509/sys/src/9/port/sturp.c:471,4761990/0511/sys/src/9/port/sturp.c:465,474
1990/0227    
			urpstat.rjseq++; 
1990/0321    
			sendrej(up); 
1990/0227    
			break; 
1990/0511    
		} else if(q->next->len > (3*Streamhi)/2 
			|| q->next->nb > (3*Streambhi)/2) { 
			flushinput(up); 
			break; 
1990/0227    
		} 
 
		/* 
1990/0509/sys/src/9/port/sturp.c:559,5641990/0511/sys/src/9/port/sturp.c:557,563
1990/0312    
	ulong now; 
	Queue *q; 
	int n; 
1990/0511    
	int i; 
1990/0227    
 
1990/0312    
	if(!canqlock(&up->xmit)) 
		return; 
1990/0509/sys/src/9/port/sturp.c:607,6141990/0511/sys/src/9/port/sturp.c:606,612
1990/0312    
	/* 
	 *  if a retransmit time has elapsed since a transmit, send an ENQ 
	 */ 
	if(up->unechoed != up->next && NOW > up->timer){ 
1990/0321    
		DPRINT("sENQ\n"); 
1990/0511    
	if(up->unechoed!=up->next && NOW>up->timer){ 
1990/0312    
		up->timer = NOW + MSrexmit; 
		up->state &= ~REJECTING; 
		sendctl(up, ENQ); 
1990/0509/sys/src/9/port/sturp.c:620,6301990/0511/sys/src/9/port/sturp.c:618,638
1990/0312    
	/* 
	 *  if there's a window open, push some blocks out 
	 */ 
	while(WINDOW(up)>0 && up->xb[up->next]!=0 && canqlock(&up->xl[up->next])){ 
		if(up->xb[up->next]) 
			sendblock(up, up->next); 
		qunlock(&up->xl[up->next]); 
1990/0511    
	if(up->rexmit){ 
		up->rexmit = 0; 
		up->next = up->unechoed; 
	} 
	while(WINDOW(up)>0 && up->xb[up->next]!=0){ 
		i = up->next; 
		qlock(&up->xl[i]); 
		if(waserror()){ 
			qunlock(&up->xl[i]); 
			nexterror(); 
		} 
		sendblock(up, i); 
		qunlock(&up->xl[i]); 
1990/0312    
		up->next = NEXT(up->next); 
1990/0511    
		poperror(); 
1990/0312    
	} 
	qunlock(&up->xmit); 
	poperror(); 
1990/0509/sys/src/9/port/sturp.c:745,7501990/0511/sys/src/9/port/sturp.c:753,759
1990/0227    
{ 
	int seqno; 
	int next; 
1990/0511    
	int i; 
1990/0227    
 
1990/0312    
	seqno = msg&Nmask; 
	next = NEXT(seqno); 
1990/0509/sys/src/9/port/sturp.c:754,7641990/0511/sys/src/9/port/sturp.c:763,774
1990/0312    
	 */ 
	if(IN(seqno, up->unacked, up->next)){ 
		for(; up->unacked != next; up->unacked = NEXT(up->unacked)){ 
			qlock(&up->xl[up->unacked]); 
			if(up->xb[up->unacked]) 
				freeb(up->xb[up->unacked]); 
			up->xb[up->unacked] = 0; 
			qunlock(&up->xl[up->unacked]); 
1990/0511    
			i = up->unacked; 
			qlock(&up->xl[i]); 
			if(up->xb[i]) 
				freeb(up->xb[i]); 
			up->xb[i] = 0; 
			qunlock(&up->xl[i]); 
1990/0312    
		} 
	} 
1990/0227    
 
1990/0509/sys/src/9/port/sturp.c:786,7921990/0511/sys/src/9/port/sturp.c:796,802
1990/0312    
		 */ 
		if(up->unechoed==next && !(up->state & REJECTING)){ 
			up->state |= REJECTING; 
			up->next = next; 
1990/0511    
			up->rexmit = 1; 
1990/0227    
		} 
		break; 
	} 
1990/0509/sys/src/9/port/sturp.c:831,8361990/0511/sys/src/9/port/sturp.c:841,847
1990/0312    
	up->unacked = 1; 
	up->next = 1; 
	up->nxb = 1; 
1990/0511    
	up->rexmit = 0; 
1990/0227    
 
	/* 
1990/0312    
	 *  free any outstanding blocks 
1990/0509/sys/src/9/port/sturp.c:886,8911990/0511/sys/src/9/port/sturp.c:897,903
1990/0312    
	up = (Urp *)arg; 
 
1990/0403    
	if(waserror()){ 
1990/0511    
		print("urpkproc error %ux\n", up); 
1990/0403    
		up->state = 0; 
		up->kstarted = 0; 
		wakeup(&up->r); 
1990/0509/sys/src/9/port/sturp.c:898,9071990/0511/sys/src/9/port/sturp.c:910,925
1990/0312    
			if(up->state & HUNGUP) 
				break; 
		} 
1990/0321    
		sendack(up); 
1990/0511    
		if(up->state == 0){ 
			DPRINT("urpkproc: %ux->state == 0\n", up); 
			break; 
		} 
		if(!QFULL(up->rq->next)) 
			sendack(up); 
1990/0312    
		output(up); 
		tsleep(&up->rq->r, todo, up, MSrexmit/2); 
	} 
	up->state = 0; 
1990/0403    
	up->kstarted = 0; 
1990/0511    
	DPRINT("urpkproc %ux\n", up); 
1990/0227    
} 


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