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

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

1990/0315/sys/src/9/port/sturp.c:39,501990/0321/sys/src/9/port/sturp.c:39,51 (short | long | prev | next)
1990/0312    
	Rendez	r;		/* process waiting for close */ 
1990/0227    
 
	/* input */ 
                 
1990/0321    
	QLock	ack;		/* ack lock */ 
1990/0312    
	Queue	*rq;		/* input queue */ 
1990/0227    
	uchar	iseq;		/* last good input sequence number */ 
	uchar	lastecho;	/* last echo/rej sent */ 
	uchar	trbuf[3];	/* trailer being collected */ 
	short	trx;		/* # bytes in trailer being collected */ 
1990/0321    
	int	blocks; 
1990/0227    
 
	/* output */ 
 
1990/0315/sys/src/9/port/sturp.c:110,1151990/0321/sys/src/9/port/sturp.c:111,118
1990/0227    
static void	rcvack(Urp*, int); 
static void	flushinput(Urp*); 
1990/0312    
static void	sendctl(Urp*, int); 
1990/0321    
static void	sendack(Urp*); 
static void	sendrej(Urp*); 
1990/0227    
static void	initoutput(Urp*, int); 
static void	initinput(Urp*, int); 
1990/0312    
static void	urpkproc(void *arg); 
1990/0315/sys/src/9/port/sturp.c:123,1301990/0321/sys/src/9/port/sturp.c:126,131
1990/0227    
	int i; 
1990/0312    
	char name[128]; 
1990/0227    
 
1990/0315    
	DPRINT("urpopen\n"); 
                 
1990/0227    
	/* 
	 *  find a free urp structure 
	 */ 
1990/0315/sys/src/9/port/sturp.c:200,2121990/0321/sys/src/9/port/sturp.c:201,211
1990/0312    
		i = 7; 
	rcvack(up, ECHO+i); 
	qunlock(&up->xmit); 
	DPRINT("urpclose(%ux)\n", up); 
 
	/* 
	 *  kill off the kernel process 
	 */ 
	wakeup(&up->rq->r); 
	DPRINT("urpclosed(%ux)\n", up); 
1990/0227    
} 
 
/* 
1990/0315/sys/src/9/port/sturp.c:309,3181990/0321/sys/src/9/port/sturp.c:308,319
1990/0227    
 
	case SEQ+0: case SEQ+1: case SEQ+2: case SEQ+3: 
	case SEQ+4: case SEQ+5: case SEQ+6: case SEQ+7: 
1990/0321    
		qlock(&up->ack); 
1990/0312    
		i = ctl & Nmask; 
		if(q->next->len < Streamhi) 
			sendctl(up, up->lastecho = ECHO+i); 
		up->iseq = i; 
1990/0321    
		qunlock(&up->ack); 
1990/0227    
		break; 
	} 
} 
1990/0315/sys/src/9/port/sturp.c:381,3871990/0321/sys/src/9/port/sturp.c:382,389
1990/0227    
	case 0: 
		break; 
	case ENQ: 
1990/0315    
		print("rENQ %uo %uo\n", up->lastecho, ACK+up->iseq); 
1990/0321    
		DPRINT("rENQ %d %uo %uo\n", up->blocks, up->lastecho, ACK+up->iseq); 
		up->blocks = 0; 
1990/0227    
		urpstat.enqsr++; 
1990/0312    
		sendctl(up, up->lastecho); 
		sendctl(up, ACK+up->iseq); 
1990/0315/sys/src/9/port/sturp.c:422,4281990/0321/sys/src/9/port/sturp.c:424,430
1990/0227    
 
	case REJ+0: case REJ+1: case REJ+2: case REJ+3: 
	case REJ+4: case REJ+5: case REJ+6: case REJ+7: 
1990/0312    
		print("rREJ\n"); 
1990/0321    
		DPRINT("rREJ\n"); 
1990/0227    
		rcvack(up, ctl); 
		break; 
	 
1990/0315/sys/src/9/port/sturp.c:444,4641990/0321/sys/src/9/port/sturp.c:446,460
1990/0312    
		i = ctl & Nmask; 
1990/0227    
		if(up->trx != 3){ 
			urpstat.rjtrs++; 
			flushinput(up); 
1990/0315    
			print("sREJ1 %d\n", up->iseq); 
1990/0312    
			sendctl(up, up->lastecho = REJ+up->iseq); 
1990/0321    
			sendrej(up); 
1990/0227    
			break; 
		} else if(q->len != up->trbuf[1] + (up->trbuf[2]<<8)){ 
			urpstat.rjpks++; 
			flushinput(up); 
1990/0315    
			print("sREJ2 %d\n", up->iseq); 
1990/0312    
			sendctl(up, up->lastecho = REJ+up->iseq); 
1990/0321    
			sendrej(up); 
1990/0227    
			break; 
1990/0312    
		} else if(i != ((up->iseq+1)&Nmask)) { 
1990/0227    
			urpstat.rjseq++; 
			flushinput(up); 
1990/0315    
			print("sREJ3 %d %d\n", i, up->iseq); 
1990/0312    
			sendctl(up, up->lastecho = REJ+up->iseq); 
1990/0321    
			sendrej(up); 
1990/0227    
			break; 
		} 
 
1990/0315/sys/src/9/port/sturp.c:480,4911990/0321/sys/src/9/port/sturp.c:476,486
1990/0227    
		/* 
		 *  acknowledge receipt 
		 */ 
		if(q->next->len < Streamhi){ 
1990/0312    
			sendctl(up, ECHO+i); 
			up->lastecho = ECHO+i; 
			wakeup(&up->rq->r); 
1990/0227    
		} 
1990/0321    
		qlock(&up->ack); 
1990/0312    
		up->iseq = i; 
1990/0321    
		if(q->next->len < Streamhi) 
			sendctl(up, up->lastecho = ECHO|i); 
		qunlock(&up->ack); 
1990/0227    
		break; 
	} 
} 
1990/0315/sys/src/9/port/sturp.c:510,5161990/0321/sys/src/9/port/sturp.c:505,510
1990/0227    
				outwin = strtoul(fields[0], 0, 0); 
			} 
1990/0312    
/*			initinput(up, inwin); */ 
			DPRINT("initoutput %d\n", outwin); 
1990/0227    
			initoutput(up, outwin); 
			freeb(bp); 
			return; 
1990/0315/sys/src/9/port/sturp.c:596,6021990/0321/sys/src/9/port/sturp.c:590,596
1990/0312    
	 *  if a retransmit time has elapsed since a transmit, send an ENQ 
	 */ 
	if(up->unechoed != up->next && NOW > up->timer){ 
		print("sENQ\n"); 
1990/0321    
		DPRINT("sENQ\n"); 
1990/0312    
		up->timer = NOW + MSrexmit; 
		up->state &= ~REJECTING; 
		sendctl(up, ENQ); 
1990/0315/sys/src/9/port/sturp.c:638,6431990/0321/sys/src/9/port/sturp.c:632,684
1990/0227    
} 
 
1990/0312    
/* 
1990/0321    
 *  send a reject 
 */ 
static void 
sendrej(Urp *up) 
{ 
	flushinput(up); 
	qlock(&up->ack); 
	if((up->lastecho&~Nmask) == ECHO){ 
		DPRINT("REJ %d\n", up->iseq); 
		sendctl(up, up->lastecho = REJ|up->iseq); 
	} 
	qunlock(&up->ack); 
} 
 
/* 
 *  send an acknowledge 
 */ 
static void 
sendack(Urp *up) 
{ 
	Block *bp; 
 
	/* 
	 *  check the precondition for acking 
	 */ 
	if(up->rq->next->len>=Streamhi || (up->lastecho&Nmask)==up->iseq) 
		return; 
 
	if(!canqlock(&up->ack)) 
		return; 
 
	/* 
	 *  check again now that we've locked 
	 */ 
	if(up->rq->next->len>=Streamhi || (up->lastecho&Nmask)==up->iseq){ 
		qunlock(&up->ack); 
		return; 
	} 
 
	/* 
	 *  send the ack 
	 */ 
	sendctl(up, up->lastecho = ECHO|up->iseq); 
	qunlock(&up->ack); 
} 
 
/* 
1990/0312    
 *  send a block. 
 */ 
static void 
1990/0315/sys/src/9/port/sturp.c:803,8081990/0321/sys/src/9/port/sturp.c:844,850
1990/0227    
	/* 
	 *  restart all sequence parameters 
	 */ 
1990/0321    
	up->blocks = 0; 
1990/0227    
	up->trx = 0; 
	up->iseq = 0; 
	up->lastecho = ECHO+0; 
1990/0315/sys/src/9/port/sturp.c:826,8321990/0321/sys/src/9/port/sturp.c:868,873
1990/0312    
	Urp *up; 
 
	up = (Urp *)arg; 
1990/0315    
	DPRINT("urpkproc started\n"); 
1990/0312    
 
	for(;;){ 
		if(up->state & (HUNGUP|CLOSING)){ 
1990/0315/sys/src/9/port/sturp.c:835,8461990/0321/sys/src/9/port/sturp.c:876,885
1990/0312    
			if(up->state & HUNGUP) 
				break; 
		} 
		if((up->lastecho&Nmask)!=up->iseq && up->rq->next->len<Streamhi) 
			sendctl(up, up->lastecho = ECHO+up->iseq); 
1990/0321    
		sendack(up); 
1990/0312    
		output(up); 
		tsleep(&up->rq->r, todo, up, MSrexmit/2); 
	} 
	DPRINT("urpkproc exiting %ux\n", up); 
	up->kstarted = 0; 
	up->state = 0; 
1990/0227    
} 


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