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

1991/0112/port/devnonet.c (diff list | history)

1991/0112/sys/src/9/port/devnonet.c:517,5231991/01151/sys/src/9/port/devnonet.c:517,523 (short | long | prev | next)
1990/1210    
	Nomsg *mp; 
 
	mp = (Nomsg *)a; 
	return mp->acked; 
1991/01151    
	return mp->inuse; 
1990/1210    
} 
static void 
nonetoput(Queue *q, Block *bp) 
1991/0112/sys/src/9/port/devnonet.c:549,5591991/01151/sys/src/9/port/devnonet.c:549,564
1990/1210    
	mp = 0; 
	if(waserror()){ 
		if(mp){ 
1991/01151    
			q->len = 0; 
			q->first = q->last = 0; 
1990/1210    
			if(mp->first){ 
				freeb(mp->first); 
				mp->first = 0; 
			} 
			mp->inuse = 0; 
1991/01151    
			mp->acked = 0; 
			if(((cp->first+1)%Nnomsg) == cp->next) 
				cp->first = cp->next; 
1991/0109    
		} 
		qunlock(&cp->mlock); 
		nexterror(); 
1991/0112/sys/src/9/port/devnonet.c:584,6101991/01151/sys/src/9/port/devnonet.c:589,601
1990/1210    
	q->len = 0; 
	q->first = q->last = 0; 
	cp->sent++; 
	qunlock(&cp->mlock); 
 
	/* 
	 *  wait for acknowledgement 
1991/01151    
	 *  send the message, the kproc will retry 
1990/1210    
	 */ 
1991/0108    
	retries = 0; 
1990/1210    
	while(!mp->acked && cp->state!=Chungup){ 
		sendmsg(cp, mp); 
		tsleep(&mp->r, acked, mp, MSrexmit); 
1991/0108    
		if(retries++ > 100) 
1991/0109    
			errors("too many nonet rexmits"); 
1990/1210    
	} 
1991/01151    
	sendmsg(cp, mp); 
	qunlock(&cp->mlock); 
1991/0109    
	poperror(); 
1990/1210    
                 
	/* 
	 *  free buffer 
	 */ 
	freeb(mp->first); 
	mp->first = 0; 
	mp->inuse = 0; 
	wakeup(&cp->r); 
} 
 
/* 
1991/0112/sys/src/9/port/devnonet.c:871,8811991/01151/sys/src/9/port/devnonet.c:862,886
1990/1210    
		return; 
 
	/* 
	 *  wakeup the sender 
1991/01151    
 	 *  free it 
1990/1210    
	 */ 
1991/01151    
	cp->rexmit = 0; 
1990/1210    
	mp->acked = 1; 
	wakeup(&mp->r); 
	cp->lastacked = mid; 
1991/01151    
	freeb(mp->first); 
	mp->first = 0; 
	mp->inuse = 0; 
 
	/* 
	 *  advance first if this is the first 
	 */ 
	if((mid&Nmask) == cp->first){ 
		while(cp->first != cp->next){ 
			if(cp->out[cp->first].acked == 0) 
				break; 
			cp->first = (cp->first+1) % Nnomsg; 
		} 
	} 
1990/1210    
} 
 
/* 
1991/0112/sys/src/9/port/devnonet.c:1094,11031991/01151/sys/src/9/port/devnonet.c:1099,1108
1990/1210    
		 *  start of message packet 
		 */ 
		if(mp->first){ 
			DPRINT("mp->mid==%d mp->rem==%d buf r==%d\n", mp->mid, mp->rem, r); 
			cp->bad++; 
			freeb(bp); 
			return; 
1991/01151    
			DPRINT("mp->mid==%d mp->rem==%d r==%d\n", mp->mid, mp->rem, r); 
			freeb(mp->first); 
			mp->first = mp->last = 0; 
			mp->len = 0; 
1990/1210    
		} 
		mp->rem = r; 
	} else { 
1991/0112/sys/src/9/port/devnonet.c:1105,11111991/01151/sys/src/9/port/devnonet.c:1110,1116
1990/1210    
		 *  a continuation 
		 */ 
		if(-r != mp->rem) { 
			DPRINT("mp->mid==%d mp->rem==%d buf r==%d\n", mp->mid, mp->rem, r); 
1991/01151    
			DPRINT("mp->mid==%d mp->rem==%d r==%d\n", mp->mid, mp->rem, r); 
1990/1210    
			cp->bad++; 
			freeb(bp); 
			return; 
1991/0112/sys/src/9/port/devnonet.c:1275,12871991/01151/sys/src/9/port/devnonet.c:1280,1318
1991/0108    
	} 
 
loop: 
1991/01151    
	/* 
	 *  loop through all active interfaces 
	 */ 
1991/0108    
	for(ifc = noifc; ifc < &noifc[conf.nnoifc]; ifc++){ 
		if(ifc->wq==0 || !canlock(ifc)) 
			continue; 
1991/01151    
 
		/* 
		 *  loop through all active conversations 
		 */ 
1991/0108    
		ep = ifc->conv + conf.nnoconv; 
		for(cp = ifc->conv; cp < ep; cp++){ 
			if(cp->state==Cclosed || !canqlock(cp)) 
				continue; 
1991/01151    
			if(cp->state == Cclosed){ 
				qunlock(cp); 
				continue; 
			} 
 
			/* 
			 *  resend the first message 
			 */ 
			if(cp->first!=cp->next && cp->out[cp->first].time>=NOW){ 
				if(cp->rexmit++ > 100){ 
					print("hanging up\n"); 
					hangup(cp); 
				} else 
					sendmsg(cp, &(cp->out[cp->first])); 
			} 
 
			/* 
			 *  resend an acknowledge 
			 */ 
1991/0108    
			if(cp->afirst != cp->anext){ 
				DPRINT("sending ack %d\n", cp->ack[cp->afirst]); 
				sendctlmsg(cp, 0, 0); 
1991/0112/sys/src/9/port/devnonet.c:1294,13001991/01151/sys/src/9/port/devnonet.c:1325,1332
1991/0108    
	goto loop; 
} 
 
1990/1229    
nonettoggle() 
1991/01151    
void 
nonettoggle(void) 
1990/1229    
{ 
	pnonet ^= 1; 
1990/1210    
} 


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