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

1991/1023/port/devip.c (diff list | history)

1991/1019/sys/src/9/port/devip.c:226,2311991/1023/sys/src/9/port/devip.c:226,255 (short | long | prev | next)
1991/0424    
	base = ipconv[c->dev]; 
	etab = &base[conf.ip]; 
	for(new = base; new < etab; new++) { 
1991/1023    
		new = ipincoming(c->dev); 
		if(new == 0) 
			error(Enodev); 
 
		c->qid.path = CHDIR|STREAMQID(new-base, ipchanqid); 
		devwalk(c, "ctl", 0, 0, streamgen); 
 
		streamopen(c, &ipinfo); 
		pushq(c->stream, new->stproto); 
		new->ref--; 
		return new; 
	} 
 
	error(Enodev); 
} 
 
Ipconv * 
ipincoming(int dev) 
{ 
	Ipconv *base, *new, *etab; 
 
	base = ipconv[dev]; 
	etab = &base[conf.ip]; 
	for(new = base; new < etab; new++) { 
1991/0424    
		if(new->ref == 0 && canqlock(new)) { 
			if(new->ref || 
1991/1015    
		          (new->stproto == &tcpinfo && new->tcpctl.state != CLOSED) || 
1991/1019/sys/src/9/port/devip.c:234,2511991/1023/sys/src/9/port/devip.c:258,268
1991/0424    
				continue; 
			} 
			new->ref++; 
			c->qid.path = CHDIR|STREAMQID(new-base, ipchanqid); 
			devwalk(c, "ctl", 0, 0, streamgen); 
			qunlock(new); 
                 
			streamopen(c, &ipinfo); 
			pushq(c->stream, new->stproto); 
			new->ref--; 
			return new; 
		}	 
	} 
                 
	error(Enodev); 
1991/1023    
	return 0; 
1991/0424    
} 
 
void 
1991/1019/sys/src/9/port/devip.c:642,6481991/1023/sys/src/9/port/devip.c:659,665
1991/0424    
} 
 
int 
tcp_havecon(Ipconv *s) 
1991/1023    
iphavecon(Ipconv *s) 
1991/0424    
{ 
	return s->curlog; 
} 
1991/1019/sys/src/9/port/devip.c:655,6821991/1023/sys/src/9/port/devip.c:672,696
1991/0424    
	qlock(&s->listenq); 
 
	for(;;) { 
		sleep(&s->listenr, tcp_havecon, s); 
1991/1023    
		sleep(&s->listenr, iphavecon, s); 
1991/0424    
 
		/* Search for the new connection, clone the control channel and 
		 * return an open channel to the listener 
		 */ 
		for(new = base, etab = &base[conf.ip]; new < etab; new++) { 
			if(new->psrc == s->psrc && new->pdst != 0 &&  
			   new->dst && (new->tcpctl.flags & CLONE) == 0) { 
				new->ref++; 
                 
1991/1023    
		new = base; 
 		for(etab = &base[conf.ip]; new < etab; new++) { 
			if(new->newcon) { 
1991/0424    
				/* Remove the listen channel reference */ 
				streamclose(c); 
 
				s->curlog--; 
1991/1023    
 
1991/0424    
				/* Attach the control channel to the new connection */ 
1991/1023    
				new->newcon = 0; 
1991/0424    
				c->qid.path = CHDIR|STREAMQID(new-base, ipchanqid); 
				devwalk(c, "ctl", 0, 0, streamgen); 
				streamopen(c, &ipinfo); 
				pushq(c->stream, new->stproto); 
				new->ref--; 
                 
				qunlock(&s->listenq); 
1991/1023    
 
1991/0424    
				return; 
			} 
		} 


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