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

1997/0904/ip/udp.c (diff list | history)

1997/0327/sys/src/9/ip/udp.c:80,891997/0403/sys/src/9/ip/udp.c:80,91 (short | long)
1997/0327    
	return 1; 
} 
 
static void 
udpannounce(Conv *c) 
1997/0403    
static char* 
udpannounce(Conv *c, char**, int) 
1997/0327    
{ 
	Fsconnected(&fs, c, nil); 
1997/0403    
 
	return nil; 
1997/0327    
} 
 
static void 
1997/0403/sys/src/9/ip/udp.c:81,881997/0411/sys/src/9/ip/udp.c:81,93 (short | long)
1997/0327    
} 
 
1997/0403    
static char* 
udpannounce(Conv *c, char**, int) 
1997/0411    
udpannounce(Conv *c, char** argv, int argc) 
1997/0327    
{ 
1997/0411    
	char *e; 
 
	e = Fsstdannounce(c, argv, argc); 
	if(e != nil) 
		return e; 
1997/0327    
	Fsconnected(&fs, c, nil); 
1997/0403    
 
	return nil; 
1997/0411/sys/src/9/ip/udp.c:200,2061997/0423/sys/src/9/ip/udp.c:200,206 (short | long)
1997/0327    
} 
 
void 
udpiput(Block *bp) 
1997/0423    
udpiput(Media *m, Block *bp) 
1997/0327    
{ 
	int len; 
	Udphdr *uh; 
1997/0411/sys/src/9/ip/udp.c:209,2141997/0423/sys/src/9/ip/udp.c:209,215
1997/0327    
	Udpcb *ucb; 
	ushort dport, sport; 
 
1997/0423    
	USED(m); 
1997/0327    
	uh = (Udphdr*)(bp->rp); 
 
	/* Put back pseudo header for checksum */ 
1997/0423/sys/src/9/ip/udp.c:15,221997/0530/sys/src/9/ip/udp.c:15,21 (short | long)
1997/0327    
	UDP_HDRSIZE	= 20, 
	UDP_IPHDR	= 8, 
	IP_UDPPROTO	= 17, 
	UDP_USEAD	= 6, 
	UDP_RELSIZE	= 16, 
1997/0530    
	UDP_USEAD	= 12, 
1997/0327    
 
	Udprxms		= 200, 
	Udptickms	= 100, 
1997/0423/sys/src/9/ip/udp.c:123,1301997/0530/sys/src/9/ip/udp.c:122,129
1997/0327    
udpkick(Conv *c, int l) 
{ 
	Udphdr *uh; 
	ushort port; 
	Ipaddr addr; 
1997/0530    
	ushort rport; 
	Ipaddr laddr, raddr; 
1997/0327    
	Block *bp, *f; 
	Udpcb *ucb; 
	int dlen, ptcllen; 
1997/0423/sys/src/9/ip/udp.c:143,1551997/0530/sys/src/9/ip/udp.c:142,161
1997/0327    
			freeblist(bp); 
			return; 
		} 
		addr = nhgetl(bp->rp); 
1997/0530    
		raddr = nhgetl(bp->rp); 
1997/0327    
		bp->rp += 4; 
		port = nhgets(bp->rp); 
1997/0530    
		laddr = nhgetl(bp->rp); 
		if(laddr != 0 && Mediaforme(bp->rp) <= 0) 
			laddr = 0; 
		bp->rp += 4; 
		rport = nhgets(bp->rp); 
1997/0327    
		bp->rp += 2; 
1997/0530    
		/* ignore local port number */ 
		bp->rp += 2; 
1997/0327    
	} else { 
		addr = 0; 
		port = 0; 
1997/0530    
		raddr = 0; 
		rport = 0; 
		laddr = 0; 
1997/0327    
	} 
 
	/* Round packet up to even number of bytes */ 
1997/0423/sys/src/9/ip/udp.c:179,1891997/0530/sys/src/9/ip/udp.c:185,196
1997/0327    
	uh->frag[1] = 0; 
	hnputs(uh->udpplen, ptcllen); 
	if(ucb->headers) { 
		hnputl(uh->udpdst, addr); 
		hnputs(uh->udpdport, port); 
                 
		/* pick the closest source address (best we can do) */ 
		hnputl(uh->udpsrc, Mediagetsrc(uh->udpdst)); 
1997/0530    
		hnputl(uh->udpdst, raddr); 
		hnputs(uh->udpdport, rport); 
		if(laddr) 
			hnputl(uh->udpsrc, laddr); 
		else 
			hnputl(uh->udpsrc, Mediagetsrc(uh->udpdst)); 
1997/0327    
	} else { 
		hnputl(uh->udpdst, c->raddr); 
		hnputs(uh->udpdport, c->rport); 
1997/0423/sys/src/9/ip/udp.c:204,2131997/0530/sys/src/9/ip/udp.c:211,220
1997/0327    
{ 
	int len; 
	Udphdr *uh; 
	Ipaddr addr; 
	Conv *c, **p; 
	Udpcb *ucb; 
	ushort dport, sport; 
1997/0530    
	Ipaddr raddr, laddr; 
	ushort rport, lport; 
1997/0327    
 
1997/0423    
	USED(m); 
1997/0327    
	uh = (Udphdr*)(bp->rp); 
1997/0423/sys/src/9/ip/udp.c:217,2231997/0530/sys/src/9/ip/udp.c:224,231
1997/0327    
	len = nhgets(uh->udplen); 
	hnputs(uh->udpplen, len); 
 
	addr = nhgetl(uh->udpsrc); 
1997/0530    
	raddr = nhgetl(uh->udpsrc); 
	laddr = nhgetl(uh->udpdst); 
1997/0327    
 
	if(udpsum && nhgets(uh->udpcksum)) { 
		if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { 
1997/0423/sys/src/9/ip/udp.c:228,2351997/0530/sys/src/9/ip/udp.c:236,243
1997/0327    
		} 
	} 
 
	dport = nhgets(uh->udpdport); 
	sport = nhgets(uh->udpsport); 
1997/0530    
	lport = nhgets(uh->udpdport); 
	rport = nhgets(uh->udpsport); 
1997/0327    
 
	/* Look for a conversation structure for this port */ 
	c = nil; 
1997/0423/sys/src/9/ip/udp.c:237,2431997/0530/sys/src/9/ip/udp.c:245,251
1997/0327    
		c = *p; 
		if(c->inuse == 0) 
			continue; 
		if(c->lport == dport && (c->rport == 0 || c->rport == sport)) 
1997/0530    
		if(c->lport == lport && (c->rport == 0 || c->rport == rport)) 
1997/0327    
			break; 
	} 
 
1997/0423/sys/src/9/ip/udp.c:261,2741997/0530/sys/src/9/ip/udp.c:269,284
1997/0327    
	if(ucb->headers) { 
		/* pass the src address */ 
		bp = padblock(bp, UDP_USEAD); 
		hnputl(bp->rp, addr); 
		hnputs(bp->rp+4, sport); 
1997/0530    
		hnputl(bp->rp, raddr); 
		hnputl(bp->rp+4, laddr); 
		hnputs(bp->rp+8, rport); 
		hnputs(bp->rp+10, lport); 
1997/0327    
	} else { 
		/* connection oriented udp */ 
		if(c->raddr == 0){ 
			/* save the src address in the conversation */ 
		 	c->raddr = addr; 
			c->rport = sport; 
1997/0530    
		 	c->raddr = raddr; 
			c->rport = rport; 
1997/0327    
 
			/* reply with the same ip address (if not broadcast) */ 
			if(Mediaforme(uh->udpdst) > 0) 
1997/0530/sys/src/9/ip/udp.c:270,2761997/0708/sys/src/9/ip/udp.c:270,279 (short | long)
1997/0327    
		/* pass the src address */ 
		bp = padblock(bp, UDP_USEAD); 
1997/0530    
		hnputl(bp->rp, raddr); 
		hnputl(bp->rp+4, laddr); 
1997/0708    
		if(Mediaforme(uh->udpdst) > 0) 
			hnputl(bp->rp+4, laddr); 
		else 
			hnputl(bp->rp+4, m->myip[0]); 
1997/0530    
		hnputs(bp->rp+8, rport); 
		hnputs(bp->rp+10, lport); 
1997/0327    
	} else { 
1997/0530/sys/src/9/ip/udp.c:282,2881997/0708/sys/src/9/ip/udp.c:285,293
1997/0327    
 
			/* reply with the same ip address (if not broadcast) */ 
			if(Mediaforme(uh->udpdst) > 0) 
				c->laddr = nhgetl(uh->udpdst); 
1997/0708    
				c->laddr = laddr; 
			else 
				c->laddr = m->myip[0]; 
1997/0327    
		} 
	} 
	if(bp->next) 
1997/0708/sys/src/9/ip/udp.c:226,2311997/0725/sys/src/9/ip/udp.c:226,233 (short | long)
1997/0327    
 
1997/0530    
	raddr = nhgetl(uh->udpsrc); 
	laddr = nhgetl(uh->udpdst); 
1997/0725    
	lport = nhgets(uh->udpdport); 
	rport = nhgets(uh->udpsport); 
1997/0327    
 
	if(udpsum && nhgets(uh->udpcksum)) { 
		if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { 
1997/0708/sys/src/9/ip/udp.c:236,2441997/0725/sys/src/9/ip/udp.c:238,243
1997/0327    
		} 
	} 
 
1997/0530    
	lport = nhgets(uh->udpdport); 
	rport = nhgets(uh->udpsport); 
1997/0327    
                 
	/* Look for a conversation structure for this port */ 
	c = nil; 
	for(p = udp.conv; *p; p++) { 
1997/0708/sys/src/9/ip/udp.c:250,2551997/0725/sys/src/9/ip/udp.c:249,256
1997/0327    
	} 
 
	if(*p == nil) { 
1997/0725    
		netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", uh->udpsrc, rport, 
			uh->udpdst, lport); 
1997/0327    
		freeblist(bp); 
		return; 
	} 
1997/0708/sys/src/9/ip/udp.c:260,2651997/0725/sys/src/9/ip/udp.c:261,268
1997/0327    
	len -= (UDP_HDRSIZE-UDP_PHDRSIZE); 
	bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); 
	if(bp == nil){ 
1997/0725    
		netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", uh->udpsrc, rport, 
			uh->udpdst, lport); 
1997/0327    
		udp.lenerr++; 
		return; 
	} 
1997/0708/sys/src/9/ip/udp.c:293,3011997/0725/sys/src/9/ip/udp.c:296,306
1997/0327    
	if(bp->next) 
		bp = concatblock(bp); 
 
	if(qfull(c->rq)) 
1997/0725    
	if(qfull(c->rq)){ 
		netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", uh->udpsrc, rport, 
			uh->udpdst, lport); 
1997/0327    
		freeblist(bp); 
	else 
1997/0725    
	}else 
1997/0327    
		qpass(c->rq, bp); 
} 
 
1997/0725/sys/src/9/ip/udp.c:95,1021997/0806/sys/src/9/ip/udp.c:95,102 (short | long)
1997/0327    
static void 
udpcreate(Conv *c) 
{ 
	c->rq = qopen(16*1024, 1, 0, 0); 
	c->wq = qopen(16*1024, 0, 0, 0); 
1997/0806    
	c->rq = qopen(64*1024, 1, 0, 0); 
	c->wq = qopen(64*1024, 0, 0, 0); 
1997/0327    
} 
 
static void 
1997/0725/sys/src/9/ip/udp.c:124,1301997/0806/sys/src/9/ip/udp.c:124,130
1997/0327    
	Udphdr *uh; 
1997/0530    
	ushort rport; 
	Ipaddr laddr, raddr; 
1997/0327    
	Block *bp, *f; 
1997/0806    
	Block *bp; 
1997/0327    
	Udpcb *ucb; 
	int dlen, ptcllen; 
 
1997/0725/sys/src/9/ip/udp.c:158,1751997/0806/sys/src/9/ip/udp.c:158,164
1997/0530    
		laddr = 0; 
1997/0327    
	} 
 
	/* Round packet up to even number of bytes */ 
	dlen = blocklen(bp); 
	if(dlen & 1) { 
		for(f = bp; f->next; f = f->next) 
			; 
		if(f->wp >= f->lim) { 
			f->next = allocb(1); 
			f = f->next; 
		} 
		*f->wp++ = 0; 
		dlen++;	 
	} 
 
	/* Make space to fit udp & ip header */ 
	bp = padblock(bp, UDP_IPHDR+UDP_HDRSIZE); 
1997/0725/sys/src/9/ip/udp.c:266,2711997/0806/sys/src/9/ip/udp.c:255,263
1997/0327    
		udp.lenerr++; 
		return; 
	} 
1997/0806    
 
	netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", uh->udpsrc, rport, 
		uh->udpdst, lport, len); 
1997/0327    
 
	ucb = (Udpcb*)c->ptcl; 
 
1997/0806/sys/src/9/ip/udp.c:204,2091997/0815/sys/src/9/ip/udp.c:204,211 (short | long)
1997/0327    
	Udpcb *ucb; 
1997/0530    
	Ipaddr raddr, laddr; 
	ushort rport, lport; 
1997/0815    
	uchar dst[IPaddrlen]; 
	uchar src[IPaddrlen]; 
1997/0327    
 
1997/0423    
	USED(m); 
1997/0327    
	uh = (Udphdr*)(bp->rp); 
1997/0806/sys/src/9/ip/udp.c:217,2271997/0815/sys/src/9/ip/udp.c:219,231
1997/0530    
	laddr = nhgetl(uh->udpdst); 
1997/0725    
	lport = nhgets(uh->udpdport); 
	rport = nhgets(uh->udpsport); 
1997/0815    
	memmove(src, uh->udpsrc, IPaddrlen); 
	memmove(dst, uh->udpdst, IPaddrlen); 
1997/0327    
 
	if(udpsum && nhgets(uh->udpcksum)) { 
		if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { 
			udp.csumerr++; 
			netlog(Logudp, "udp: checksum error %I\n", uh->udpsrc); 
1997/0815    
			netlog(Logudp, "udp: checksum error %I\n", src); 
1997/0327    
			freeblist(bp); 
			return; 
		} 
1997/0806/sys/src/9/ip/udp.c:238,2451997/0815/sys/src/9/ip/udp.c:242,249
1997/0327    
	} 
 
	if(*p == nil) { 
1997/0725    
		netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", uh->udpsrc, rport, 
			uh->udpdst, lport); 
1997/0815    
		netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport, 
			dst, lport); 
1997/0327    
		freeblist(bp); 
		return; 
	} 
1997/0806/sys/src/9/ip/udp.c:250,2631997/0815/sys/src/9/ip/udp.c:254,267
1997/0327    
	len -= (UDP_HDRSIZE-UDP_PHDRSIZE); 
	bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); 
	if(bp == nil){ 
1997/0725    
		netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", uh->udpsrc, rport, 
			uh->udpdst, lport); 
1997/0815    
		netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", src, rport, 
			dst, lport); 
1997/0327    
		udp.lenerr++; 
		return; 
	} 
1997/0806    
 
	netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", uh->udpsrc, rport, 
		uh->udpdst, lport, len); 
1997/0815    
	netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", src, rport, 
		dst, lport, len); 
1997/0327    
 
	ucb = (Udpcb*)c->ptcl; 
 
1997/0806/sys/src/9/ip/udp.c:265,2711997/0815/sys/src/9/ip/udp.c:269,275
1997/0327    
		/* pass the src address */ 
		bp = padblock(bp, UDP_USEAD); 
1997/0530    
		hnputl(bp->rp, raddr); 
1997/0708    
		if(Mediaforme(uh->udpdst) > 0) 
1997/0815    
		if(Mediaforme(dst) > 0) 
1997/0708    
			hnputl(bp->rp+4, laddr); 
		else 
			hnputl(bp->rp+4, m->myip[0]); 
1997/0806/sys/src/9/ip/udp.c:279,2851997/0815/sys/src/9/ip/udp.c:283,289
1997/0530    
			c->rport = rport; 
1997/0327    
 
			/* reply with the same ip address (if not broadcast) */ 
			if(Mediaforme(uh->udpdst) > 0) 
1997/0815    
			if(Mediaforme(dst) > 0) 
1997/0708    
				c->laddr = laddr; 
			else 
				c->laddr = m->myip[0]; 
1997/0806/sys/src/9/ip/udp.c:289,2961997/0815/sys/src/9/ip/udp.c:293,300
1997/0327    
		bp = concatblock(bp); 
 
1997/0725    
	if(qfull(c->rq)){ 
		netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", uh->udpsrc, rport, 
			uh->udpdst, lport); 
1997/0815    
		netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", src, rport, 
			dst, lport); 
1997/0327    
		freeblist(bp); 
1997/0725    
	}else 
1997/0327    
		qpass(c->rq, bp); 
1997/0815/sys/src/9/ip/udp.c:318,3231997/0829/sys/src/9/ip/udp.c:318,351 (short | long)
1997/0327    
} 
 
void 
1997/0829    
udpadvise(Block *bp, char *msg) 
{ 
	Udphdr *h; 
	Ipaddr source, dest; 
	ushort psource, pdest; 
	Conv *s, **p; 
 
	h = (Udphdr*)(bp->rp); 
 
	dest = nhgetl(h->udpdst); 
	source = nhgetl(h->udpsrc); 
	psource = nhgets(h->udpsport); 
	pdest = nhgets(h->udpdport); 
 
	/* Look for a connection */ 
	for(p = udp.conv; *p; p++) { 
		s = *p; 
		if(s->rport == pdest && s->lport == psource) 
		if(s->raddr == dest && s->laddr == source){ 
			qhangup(s->rq, msg); 
			qhangup(s->wq, msg); 
			break; 
		} 
	} 
	freeblist(bp); 
} 
 
void 
1997/0327    
udpinit(Fs *fs) 
{ 
	udp.name = "udp"; 
1997/0815/sys/src/9/ip/udp.c:329,3341997/0829/sys/src/9/ip/udp.c:357,363
1997/0327    
	udp.create = udpcreate; 
	udp.close = udpclose; 
	udp.rcv = udpiput; 
1997/0829    
	udp.advise = udpadvise; 
1997/0327    
	udp.ipproto = IP_UDPPROTO; 
	udp.nc = 16; 
	udp.ptclsize = sizeof(Udpcb); 
1997/0829/sys/src/9/ip/udp.c:271,2781997/0901/sys/src/9/ip/udp.c:271,282 (short | long)
1997/0530    
		hnputl(bp->rp, raddr); 
1997/0815    
		if(Mediaforme(dst) > 0) 
1997/0708    
			hnputl(bp->rp+4, laddr); 
		else 
1997/0901    
		else if(m != 0) 
1997/0708    
			hnputl(bp->rp+4, m->myip[0]); 
1997/0901    
		else if(media != 0) 
			hnputl(bp->rp+4, media->myip[0]); 
		else 
			hnputl(bp->rp+4, laddr); 
1997/0530    
		hnputs(bp->rp+8, rport); 
		hnputs(bp->rp+10, lport); 
1997/0327    
	} else { 
1997/0901/sys/src/9/ip/udp.c:244,2491997/0903/sys/src/9/ip/udp.c:244,250 (short | long)
1997/0327    
	if(*p == nil) { 
1997/0815    
		netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport, 
			dst, lport); 
1997/0903    
		icmpnoconv(bp); 
1997/0327    
		freeblist(bp); 
		return; 
	} 
1997/0903/sys/src/9/ip/udp.c:198,2041997/0904/sys/src/9/ip/udp.c:198,204 (short | long)
1997/0327    
void 
1997/0423    
udpiput(Media *m, Block *bp) 
1997/0327    
{ 
	int len; 
1997/0904    
	int len, olen, ottl; 
1997/0327    
	Udphdr *uh; 
	Conv *c, **p; 
	Udpcb *ucb; 
1997/0903/sys/src/9/ip/udp.c:210,2181997/0904/sys/src/9/ip/udp.c:210,220
1997/0423    
	USED(m); 
1997/0327    
	uh = (Udphdr*)(bp->rp); 
 
	/* Put back pseudo header for checksum */ 
1997/0904    
	/* Put back pseudo header for checksum (remember old values for icmpnoconv()) */ 
	ottl = uh->Unused; 
1997/0327    
	uh->Unused = 0; 
	len = nhgets(uh->udplen); 
1997/0904    
	olen = nhgets(uh->udpplen); 
1997/0327    
	hnputs(uh->udpplen, len); 
 
1997/0530    
	raddr = nhgetl(uh->udpsrc); 
1997/0903/sys/src/9/ip/udp.c:244,2501997/0904/sys/src/9/ip/udp.c:246,257
1997/0327    
	if(*p == nil) { 
1997/0815    
		netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport, 
			dst, lport); 
1997/0903    
		icmpnoconv(bp); 
1997/0904    
		/* don't complain about broadcasts... */ 
		if(Mediaforme(dst) > 0){ 
			uh->Unused = ottl; 
			hnputs(uh->udpplen, olen); 
			icmpnoconv(bp); 
		} 
1997/0327    
		freeblist(bp); 
		return; 
	} 
1997/0904/sys/src/9/ip/udp.c:15,211998/0306/sys/src/9/ip/udp.c:15,21 (short | long)
1997/0327    
	UDP_HDRSIZE	= 20, 
	UDP_IPHDR	= 8, 
	IP_UDPPROTO	= 17, 
1997/0530    
	UDP_USEAD	= 12, 
1998/0306    
	UDP_USEAD	= 36, 
1997/0327    
 
	Udprxms		= 200, 
	Udptickms	= 100, 
1997/0904/sys/src/9/ip/udp.c:26,471998/0306/sys/src/9/ip/udp.c:26,47
1997/0327    
struct Udphdr 
{ 
	/* ip header */ 
	byte	vihl;		/* Version and header length */ 
	byte	tos;		/* Type of service */ 
	byte	length[2];	/* packet length */ 
	byte	id[2];		/* Identification */ 
	byte	frag[2];	/* Fragment information */ 
	byte	Unused;	 
	byte	udpproto;	/* Protocol */ 
	byte	udpplen[2];	/* Header plus data length */ 
	byte	udpsrc[4];	/* Ip source */ 
	byte	udpdst[4];	/* Ip destination */ 
1998/0306    
	uchar	vihl;		/* Version and header length */ 
	uchar	tos;		/* Type of service */ 
	uchar	length[2];	/* packet length */ 
	uchar	id[2];		/* Identification */ 
	uchar	frag[2];	/* Fragment information */ 
	uchar	Unused;	 
	uchar	udpproto;	/* Protocol */ 
	uchar	udpplen[2];	/* Header plus data length */ 
	uchar	udpsrc[4];	/* Ip source */ 
	uchar	udpdst[4];	/* Ip destination */ 
1997/0327    
 
	/* udp header */ 
	byte	udpsport[2];	/* Source port */ 
	byte	udpdport[2];	/* Destination port */ 
	byte	udplen[2];	/* data length */ 
	byte	udpcksum[2];	/* Checksum */ 
1998/0306    
	uchar	udpsport[2];	/* Source port */ 
	uchar	udpdport[2];	/* Destination port */ 
	uchar	udplen[2];	/* data length */ 
	uchar	udpcksum[2];	/* Checksum */ 
1997/0327    
}; 
 
/* 
1997/0904/sys/src/9/ip/udp.c:51,571998/0306/sys/src/9/ip/udp.c:51,57
1997/0327    
struct Udpcb 
{ 
	QLock; 
	byte	headers; 
1998/0306    
	uchar	headers; 
1997/0327    
}; 
 
	Proto	udp; 
1997/0904/sys/src/9/ip/udp.c:71,821998/0306/sys/src/9/ip/udp.c:71,81
1997/0327    
	return e; 
} 
 
int 
udpstate(char **s, Conv *c) 
1998/0306    
static int 
udpstate(Conv *c, char *state, int n) 
1997/0327    
{ 
	USED(c); 
	*s = "Datagram"; 
	return 1; 
1998/0306    
	return snprint(state, n, "%s", "Datagram"); 
1997/0327    
} 
 
1997/0403    
static char* 
1997/0904/sys/src/9/ip/udp.c:107,1141998/0306/sys/src/9/ip/udp.c:106,113
1997/0327    
	qclose(c->rq); 
	qclose(c->wq); 
	qclose(c->eq); 
	c->laddr = 0; 
	c->raddr = 0; 
1998/0306    
	ipmove(c->laddr, IPnoaddr); 
	ipmove(c->raddr, IPnoaddr); 
1997/0327    
	c->lport = 0; 
	c->rport = 0; 
 
1997/0904/sys/src/9/ip/udp.c:119,1351998/0306/sys/src/9/ip/udp.c:118,133
1997/0327    
} 
 
void 
udpkick(Conv *c, int l) 
1998/0306    
udpkick(Conv *c, int) 
1997/0327    
{ 
	Udphdr *uh; 
1997/0530    
	ushort rport; 
	Ipaddr laddr, raddr; 
1998/0306    
	uchar laddr[IPaddrlen], raddr[IPaddrlen]; 
1997/0806    
	Block *bp; 
1997/0327    
	Udpcb *ucb; 
	int dlen, ptcllen; 
 
	USED(l); 
                 
1998/0306    
	netlog(Logudp, "udp: kick\n"); 
1997/0327    
	bp = qget(c->wq); 
	if(bp == nil) 
		return; 
1997/0904/sys/src/9/ip/udp.c:138,1611998/0306/sys/src/9/ip/udp.c:136,155
1997/0327    
	if(ucb->headers) { 
		/* get user specified addresses */ 
		bp = pullupblock(bp, UDP_USEAD); 
		if(bp == nil) { 
			freeblist(bp); 
1998/0306    
		if(bp == nil) 
1997/0327    
			return; 
		} 
1997/0530    
		raddr = nhgetl(bp->rp); 
1997/0327    
		bp->rp += 4; 
1997/0530    
		laddr = nhgetl(bp->rp); 
		if(laddr != 0 && Mediaforme(bp->rp) <= 0) 
			laddr = 0; 
		bp->rp += 4; 
1998/0306    
		ipmove(raddr, bp->rp); 
		bp->rp += IPaddrlen; 
		ipmove(laddr, bp->rp); 
		bp->rp += IPaddrlen; 
		if(ipforme(laddr) != Runi) 
			findlocalip(laddr, raddr);	/* pick interface closest to dest */ 
1997/0530    
		rport = nhgets(bp->rp); 
1997/0327    
		bp->rp += 2; 
1997/0530    
		/* ignore local port number */ 
		bp->rp += 2; 
1997/0327    
	} else { 
1997/0530    
		raddr = 0; 
		rport = 0; 
		laddr = 0; 
1997/0327    
	} 
 
	dlen = blocklen(bp); 
1997/0904/sys/src/9/ip/udp.c:174,1891998/0306/sys/src/9/ip/udp.c:168,182
1997/0327    
	uh->frag[1] = 0; 
	hnputs(uh->udpplen, ptcllen); 
	if(ucb->headers) { 
1997/0530    
		hnputl(uh->udpdst, raddr); 
1998/0306    
		v6tov4(uh->udpdst, raddr); 
1997/0530    
		hnputs(uh->udpdport, rport); 
		if(laddr) 
			hnputl(uh->udpsrc, laddr); 
		else 
			hnputl(uh->udpsrc, Mediagetsrc(uh->udpdst)); 
1998/0306    
		v6tov4(uh->udpsrc, laddr); 
1997/0327    
	} else { 
		hnputl(uh->udpdst, c->raddr); 
1998/0306    
		v6tov4(uh->udpdst, c->raddr); 
1997/0327    
		hnputs(uh->udpdport, c->rport); 
		hnputl(uh->udpsrc, c->laddr); 
1998/0306    
		if(ipcmp(c->laddr, IPnoaddr) == 0) 
			findlocalip(c->laddr, c->raddr);	/* pick interface closest to dest */ 
		v6tov4(uh->udpsrc, c->laddr); 
1997/0327    
	} 
	hnputs(uh->udpsport, c->lport); 
	hnputs(uh->udplen, ptcllen); 
1997/0904/sys/src/9/ip/udp.c:196,2131998/0306/sys/src/9/ip/udp.c:189,203
1997/0327    
} 
 
void 
1997/0423    
udpiput(Media *m, Block *bp) 
1998/0306    
udpiput(uchar *ia, Block *bp) 
1997/0327    
{ 
1997/0904    
	int len, olen, ottl; 
1997/0327    
	Udphdr *uh; 
	Conv *c, **p; 
	Udpcb *ucb; 
1997/0530    
	Ipaddr raddr, laddr; 
1998/0306    
	uchar raddr[IPaddrlen], laddr[IPaddrlen]; 
1997/0530    
	ushort rport, lport; 
1997/0815    
	uchar dst[IPaddrlen]; 
	uchar src[IPaddrlen]; 
1997/0327    
 
1997/0423    
	USED(m); 
1997/0327    
	uh = (Udphdr*)(bp->rp); 
 
1997/0904    
	/* Put back pseudo header for checksum (remember old values for icmpnoconv()) */ 
1997/0904/sys/src/9/ip/udp.c:217,2331998/0306/sys/src/9/ip/udp.c:207,221
1997/0904    
	olen = nhgets(uh->udpplen); 
1997/0327    
	hnputs(uh->udpplen, len); 
 
1997/0530    
	raddr = nhgetl(uh->udpsrc); 
	laddr = nhgetl(uh->udpdst); 
1998/0306    
	v4tov6(raddr, uh->udpsrc); 
	v4tov6(laddr, uh->udpdst); 
1997/0725    
	lport = nhgets(uh->udpdport); 
	rport = nhgets(uh->udpsport); 
1997/0815    
	memmove(src, uh->udpsrc, IPaddrlen); 
	memmove(dst, uh->udpdst, IPaddrlen); 
1997/0327    
 
	if(udpsum && nhgets(uh->udpcksum)) { 
		if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { 
			udp.csumerr++; 
1997/0815    
			netlog(Logudp, "udp: checksum error %I\n", src); 
1998/0306    
			netlog(Logudp, "udp: checksum error %I\n", raddr); 
1997/0327    
			freeblist(bp); 
			return; 
		} 
1997/0904/sys/src/9/ip/udp.c:244,2531998/0306/sys/src/9/ip/udp.c:232,241
1997/0327    
	} 
 
	if(*p == nil) { 
1997/0815    
		netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport, 
			dst, lport); 
1998/0306    
		netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", raddr, rport, 
			laddr, lport); 
1997/0904    
		/* don't complain about broadcasts... */ 
		if(Mediaforme(dst) > 0){ 
1998/0306    
		if(ipforme(raddr) == 0){ 
1997/0904    
			uh->Unused = ottl; 
			hnputs(uh->udpplen, olen); 
			icmpnoconv(bp); 
1997/0904/sys/src/9/ip/udp.c:262,2751998/0306/sys/src/9/ip/udp.c:250,263
1997/0327    
	len -= (UDP_HDRSIZE-UDP_PHDRSIZE); 
	bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); 
	if(bp == nil){ 
1997/0815    
		netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", src, rport, 
			dst, lport); 
1998/0306    
		netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", raddr, rport, 
			laddr, lport); 
1997/0327    
		udp.lenerr++; 
		return; 
	} 
1997/0806    
 
1997/0815    
	netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", src, rport, 
		dst, lport, len); 
1998/0306    
	netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", raddr, rport, 
		laddr, lport, len); 
1997/0327    
 
	ucb = (Udpcb*)c->ptcl; 
 
1997/0904/sys/src/9/ip/udp.c:276,3041998/0306/sys/src/9/ip/udp.c:264,288
1997/0327    
	if(ucb->headers) { 
		/* pass the src address */ 
		bp = padblock(bp, UDP_USEAD); 
1997/0530    
		hnputl(bp->rp, raddr); 
1997/0815    
		if(Mediaforme(dst) > 0) 
1997/0708    
			hnputl(bp->rp+4, laddr); 
1997/0901    
		else if(m != 0) 
1997/0708    
			hnputl(bp->rp+4, m->myip[0]); 
1997/0901    
		else if(media != 0) 
			hnputl(bp->rp+4, media->myip[0]); 
1998/0306    
		ipmove(bp->rp, raddr); 
		if(ipforme(laddr) == Runi) 
			ipmove(bp->rp+IPaddrlen, laddr); 
1997/0901    
		else 
			hnputl(bp->rp+4, laddr); 
1997/0530    
		hnputs(bp->rp+8, rport); 
		hnputs(bp->rp+10, lport); 
1998/0306    
			ipmove(bp->rp+IPaddrlen, ia); 
		hnputs(bp->rp+2*IPaddrlen, rport); 
		hnputs(bp->rp+2*IPaddrlen+2, lport); 
1997/0327    
	} else { 
		/* connection oriented udp */ 
		if(c->raddr == 0){ 
			/* save the src address in the conversation */ 
1997/0530    
		 	c->raddr = raddr; 
1998/0306    
		 	ipmove(c->raddr, raddr); 
1997/0530    
			c->rport = rport; 
1997/0327    
 
			/* reply with the same ip address (if not broadcast) */ 
1997/0815    
			if(Mediaforme(dst) > 0) 
1997/0708    
				c->laddr = laddr; 
1998/0306    
			if(ipforme(laddr) == Runi) 
				ipmove(c->laddr, laddr); 
1997/0708    
			else 
				c->laddr = m->myip[0]; 
1998/0306    
				ipmove(c->laddr, ia); 
1997/0327    
		} 
	} 
	if(bp->next) 
1997/0904/sys/src/9/ip/udp.c:305,3121998/0306/sys/src/9/ip/udp.c:289,296
1997/0327    
		bp = concatblock(bp); 
 
1997/0725    
	if(qfull(c->rq)){ 
1997/0815    
		netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", src, rport, 
			dst, lport); 
1998/0306    
		netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", raddr, rport, 
			laddr, lport); 
1997/0327    
		freeblist(bp); 
1997/0725    
	}else 
1997/0327    
		qpass(c->rq, bp); 
1997/0904/sys/src/9/ip/udp.c:333,3461998/0306/sys/src/9/ip/udp.c:317,330
1997/0829    
udpadvise(Block *bp, char *msg) 
{ 
	Udphdr *h; 
	Ipaddr source, dest; 
1998/0306    
	uchar source[IPaddrlen], dest[IPaddrlen]; 
1997/0829    
	ushort psource, pdest; 
	Conv *s, **p; 
 
	h = (Udphdr*)(bp->rp); 
 
	dest = nhgetl(h->udpdst); 
	source = nhgetl(h->udpsrc); 
1998/0306    
	v4tov6(dest, h->udpdst); 
	v4tov6(source, h->udpsrc); 
1997/0829    
	psource = nhgets(h->udpsport); 
	pdest = nhgets(h->udpdport); 
 
1997/0904/sys/src/9/ip/udp.c:347,3541998/0306/sys/src/9/ip/udp.c:331,340
1997/0829    
	/* Look for a connection */ 
	for(p = udp.conv; *p; p++) { 
		s = *p; 
		if(s->rport == pdest && s->lport == psource) 
		if(s->raddr == dest && s->laddr == source){ 
1998/0306    
		if(s->rport == pdest) 
		if(s->lport == psource) 
		if(ipcmp(s->raddr, dest) == 0) 
		if(ipcmp(s->laddr, source) == 0){ 
1997/0829    
			qhangup(s->rq, msg); 
			qhangup(s->wq, msg); 
			break; 
1997/0904/sys/src/9/ip/udp.c:357,3621998/0306/sys/src/9/ip/udp.c:343,356
1997/0829    
	freeblist(bp); 
} 
 
1998/0306    
int 
udpstats(char *buf, int len) 
{ 
	return snprint(buf, len, 
		"udp: csum %d hlen %d len %d order %d rexmit %d\n", 
		udp.csumerr, udp.hlenerr, udp.lenerr, udp.order, udp.rexmit); 
} 
 
1997/0829    
void 
1997/0327    
udpinit(Fs *fs) 
{ 
1997/0904/sys/src/9/ip/udp.c:370,3751998/0306/sys/src/9/ip/udp.c:364,370
1997/0327    
	udp.close = udpclose; 
	udp.rcv = udpiput; 
1997/0829    
	udp.advise = udpadvise; 
1998/0306    
	udp.stats = udpstats; 
1997/0327    
	udp.ipproto = IP_UDPPROTO; 
	udp.nc = 16; 
	udp.ptclsize = sizeof(Udpcb); 
1998/0306/sys/src/9/ip/udp.c:15,211998/0311/sys/src/9/ip/udp.c:15,21 (short | long)
1997/0327    
	UDP_HDRSIZE	= 20, 
	UDP_IPHDR	= 8, 
	IP_UDPPROTO	= 17, 
1998/0306    
	UDP_USEAD	= 36, 
1998/0311    
	UDP_USEAD	= 12, 
1997/0327    
 
	Udprxms		= 200, 
	Udptickms	= 100, 
1998/0311/sys/src/9/ip/udp.c:15,211998/0313/sys/src/9/ip/udp.c:15,22 (short | long)
1997/0327    
	UDP_HDRSIZE	= 20, 
	UDP_IPHDR	= 8, 
	IP_UDPPROTO	= 17, 
1998/0311    
	UDP_USEAD	= 12, 
1998/0313    
	UDP_USEAD6	= 36, 
	UDP_USEAD4	= 12, 
1997/0327    
 
	Udprxms		= 200, 
	Udptickms	= 100, 
1998/0311/sys/src/9/ip/udp.c:44,491998/0313/sys/src/9/ip/udp.c:45,71
1998/0306    
	uchar	udpcksum[2];	/* Checksum */ 
1997/0327    
}; 
 
1998/0313    
/* MIB II counters */ 
typedef struct Udpstats Udpstats; 
struct Udpstats 
{ 
	ulong	udpInDatagrams; 
	ulong	udpNoPorts; 
	ulong	udpInErrors; 
	ulong	udpOutDatagrams; 
}; 
 
typedef struct Udppriv Udppriv; 
struct Udppriv 
{ 
	/* MIB counters */ 
	Udpstats	ustats; 
 
	/* non-MIB stats */ 
	ulong		csumerr;		/* checksum errors */ 
	ulong		lenerr;			/* short packet */ 
}; 
 
1997/0327    
/* 
 *  protocol specific part of Conv 
 */ 
1998/0311/sys/src/9/ip/udp.c:54,651998/0313/sys/src/9/ip/udp.c:76,81
1998/0306    
	uchar	headers; 
1997/0327    
}; 
 
	Proto	udp; 
	int	udpsum; 
	uint	generation; 
extern	Fs	fs; 
	int	udpdebug; 
                 
static char* 
udpconnect(Conv *c, char **argv, int argc) 
{ 
1998/0311/sys/src/9/ip/udp.c:66,761998/0313/sys/src/9/ip/udp.c:82,93
1997/0327    
	char *e; 
 
	e = Fsstdconnect(c, argv, argc); 
	Fsconnected(&fs, c, e); 
1998/0313    
	Fsconnected(c, e); 
1997/0327    
 
	return e; 
} 
 
1998/0313    
 
1998/0306    
static int 
udpstate(Conv *c, char *state, int n) 
1997/0327    
{ 
1998/0311/sys/src/9/ip/udp.c:86,921998/0313/sys/src/9/ip/udp.c:103,109
1997/0411    
	e = Fsstdannounce(c, argv, argc); 
	if(e != nil) 
		return e; 
1997/0327    
	Fsconnected(&fs, c, nil); 
1998/0313    
	Fsconnected(c, nil); 
1997/0403    
 
	return nil; 
1997/0327    
} 
1998/0311/sys/src/9/ip/udp.c:126,1411998/0313/sys/src/9/ip/udp.c:143,164
1997/0806    
	Block *bp; 
1997/0327    
	Udpcb *ucb; 
	int dlen, ptcllen; 
1998/0313    
	Udppriv *upriv; 
	Fs *f; 
1997/0327    
 
1998/0306    
	netlog(Logudp, "udp: kick\n"); 
1998/0313    
	upriv = c->p->priv; 
	f = c->p->f; 
 
	netlog(c->p->f, Logudp, "udp: kick\n"); 
1997/0327    
	bp = qget(c->wq); 
	if(bp == nil) 
		return; 
 
	ucb = (Udpcb*)c->ptcl; 
	if(ucb->headers) { 
1998/0313    
	switch(ucb->headers) { 
	case 6: 
1997/0327    
		/* get user specified addresses */ 
		bp = pullupblock(bp, UDP_USEAD); 
1998/0313    
		bp = pullupblock(bp, UDP_USEAD6); 
1998/0306    
		if(bp == nil) 
1997/0327    
			return; 
1998/0306    
		ipmove(raddr, bp->rp); 
1998/0311/sys/src/9/ip/udp.c:142,1551998/0313/sys/src/9/ip/udp.c:165,196
1998/0306    
		bp->rp += IPaddrlen; 
		ipmove(laddr, bp->rp); 
		bp->rp += IPaddrlen; 
		if(ipforme(laddr) != Runi) 
			findlocalip(laddr, raddr);	/* pick interface closest to dest */ 
1998/0313    
		if(ipforme(f, laddr) != Runi) 
			findlocalip(f, laddr, raddr);	/* pick interface closest to dest */ 
1997/0530    
		rport = nhgets(bp->rp); 
1997/0327    
		bp->rp += 2; 
1997/0530    
		/* ignore local port number */ 
		bp->rp += 2; 
1997/0327    
	} else { 
1998/0313    
		break; 
	case 4: 
		/* get user specified addresses */ 
		bp = pullupblock(bp, UDP_USEAD4); 
		if(bp == nil) 
			return; 
		v4tov6(raddr, bp->rp); 
		bp->rp += IPv4addrlen; 
		v4tov6(laddr, bp->rp); 
		bp->rp += IPv4addrlen; 
		if(ipforme(f, laddr) != Runi) 
			findlocalip(f, laddr, raddr);	/* pick interface closest to dest */ 
		rport = nhgets(bp->rp); 
		bp->rp += 2; 
		/* ignore local port number */ 
		bp->rp += 2; 
		break; 
	default: 
1997/0530    
		rport = 0; 
1998/0313    
		break; 
1997/0327    
	} 
 
	dlen = blocklen(bp); 
1998/0311/sys/src/9/ip/udp.c:167,1821998/0313/sys/src/9/ip/udp.c:208,231
1997/0327    
	uh->frag[0] = 0; 
	uh->frag[1] = 0; 
	hnputs(uh->udpplen, ptcllen); 
	if(ucb->headers) { 
1998/0313    
	switch(ucb->headers){ 
	case 6: 
1998/0306    
		v6tov4(uh->udpdst, raddr); 
1997/0530    
		hnputs(uh->udpdport, rport); 
1998/0306    
		v6tov4(uh->udpsrc, laddr); 
1997/0327    
	} else { 
1998/0313    
		break; 
	case 4: 
		memmove(uh->udpdst, raddr, IPv4addrlen); 
		hnputs(uh->udpdport, rport); 
		memmove(uh->udpsrc, laddr, IPv4addrlen); 
		break; 
	default: 
1998/0306    
		v6tov4(uh->udpdst, c->raddr); 
1997/0327    
		hnputs(uh->udpdport, c->rport); 
1998/0306    
		if(ipcmp(c->laddr, IPnoaddr) == 0) 
			findlocalip(c->laddr, c->raddr);	/* pick interface closest to dest */ 
1998/0313    
			findlocalip(f, c->laddr, c->raddr);	/* pick interface closest to dest */ 
1998/0306    
		v6tov4(uh->udpsrc, c->laddr); 
1998/0313    
		break; 
1997/0327    
	} 
	hnputs(uh->udpsport, c->lport); 
	hnputs(uh->udplen, ptcllen); 
1998/0311/sys/src/9/ip/udp.c:185,1951998/0313/sys/src/9/ip/udp.c:234,245
1997/0327    
 
	hnputs(uh->udpcksum, ptclcsum(bp, UDP_IPHDR, dlen+UDP_HDRSIZE)); 
 
	ipoput(bp, 0, c->ttl); 
1998/0313    
	upriv->ustats.udpOutDatagrams++; 
	ipoput(f, bp, 0, c->ttl); 
1997/0327    
} 
 
void 
1998/0306    
udpiput(uchar *ia, Block *bp) 
1998/0313    
udpiput(Proto *udp, uchar *ia, Block *bp) 
1997/0327    
{ 
1997/0904    
	int len, olen, ottl; 
1997/0327    
	Udphdr *uh; 
1998/0311/sys/src/9/ip/udp.c:197,2031998/0313/sys/src/9/ip/udp.c:247,260
1997/0327    
	Udpcb *ucb; 
1998/0306    
	uchar raddr[IPaddrlen], laddr[IPaddrlen]; 
1997/0530    
	ushort rport, lport; 
1998/0313    
	Udppriv *upriv; 
	Fs *f; 
1997/0327    
 
1998/0313    
	upriv = udp->priv; 
	f = udp->f; 
 
	upriv->ustats.udpInDatagrams++; 
 
1997/0327    
	uh = (Udphdr*)(bp->rp); 
 
1997/0904    
	/* Put back pseudo header for checksum (remember old values for icmpnoconv()) */ 
1998/0311/sys/src/9/ip/udp.c:212,2211998/0313/sys/src/9/ip/udp.c:269,278
1997/0725    
	lport = nhgets(uh->udpdport); 
	rport = nhgets(uh->udpsport); 
1997/0327    
 
	if(udpsum && nhgets(uh->udpcksum)) { 
1998/0313    
	if(nhgets(uh->udpcksum)) { 
1997/0327    
		if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { 
			udp.csumerr++; 
1998/0306    
			netlog(Logudp, "udp: checksum error %I\n", raddr); 
1998/0313    
			upriv->ustats.udpInErrors++; 
			netlog(f, Logudp, "udp: checksum error %I\n", raddr); 
1997/0327    
			freeblist(bp); 
			return; 
		} 
1998/0311/sys/src/9/ip/udp.c:223,2291998/0313/sys/src/9/ip/udp.c:280,286
1997/0327    
 
	/* Look for a conversation structure for this port */ 
	c = nil; 
	for(p = udp.conv; *p; p++) { 
1998/0313    
	for(p = udp->conv; *p; p++) { 
1997/0327    
		c = *p; 
		if(c->inuse == 0) 
			continue; 
1998/0311/sys/src/9/ip/udp.c:232,2441998/0313/sys/src/9/ip/udp.c:289,302
1997/0327    
	} 
 
	if(*p == nil) { 
1998/0306    
		netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", raddr, rport, 
1998/0313    
		upriv->ustats.udpNoPorts++; 
		netlog(f, Logudp, "udp: no conv %I.%d -> %I.%d\n", raddr, rport, 
1998/0306    
			laddr, lport); 
1997/0904    
		/* don't complain about broadcasts... */ 
1998/0306    
		if(ipforme(raddr) == 0){ 
1998/0313    
		if(ipforme(f, raddr) == 0){ 
1997/0904    
			uh->Unused = ottl; 
			hnputs(uh->udpplen, olen); 
			icmpnoconv(bp); 
1998/0313    
			icmpnoconv(f, bp); 
1997/0904    
		} 
1997/0327    
		freeblist(bp); 
		return; 
1998/0311/sys/src/9/ip/udp.c:250,2771998/0313/sys/src/9/ip/udp.c:308,348
1997/0327    
	len -= (UDP_HDRSIZE-UDP_PHDRSIZE); 
	bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); 
	if(bp == nil){ 
1998/0306    
		netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", raddr, rport, 
1998/0313    
		netlog(f, Logudp, "udp: len err %I.%d -> %I.%d\n", raddr, rport, 
1998/0306    
			laddr, lport); 
1997/0327    
		udp.lenerr++; 
1998/0313    
		upriv->lenerr++; 
1997/0327    
		return; 
	} 
1997/0806    
 
1998/0306    
	netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", raddr, rport, 
1998/0313    
	netlog(f, Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", raddr, rport, 
1998/0306    
		laddr, lport, len); 
1997/0327    
 
	ucb = (Udpcb*)c->ptcl; 
 
	if(ucb->headers) { 
1998/0313    
	switch(ucb->headers){ 
	case 6: 
1997/0327    
		/* pass the src address */ 
		bp = padblock(bp, UDP_USEAD); 
1998/0313    
		bp = padblock(bp, UDP_USEAD6); 
1998/0306    
		ipmove(bp->rp, raddr); 
		if(ipforme(laddr) == Runi) 
1998/0313    
		if(ipforme(f, laddr) == Runi) 
1998/0306    
			ipmove(bp->rp+IPaddrlen, laddr); 
1997/0901    
		else 
1998/0306    
			ipmove(bp->rp+IPaddrlen, ia); 
		hnputs(bp->rp+2*IPaddrlen, rport); 
		hnputs(bp->rp+2*IPaddrlen+2, lport); 
1997/0327    
	} else { 
1998/0313    
		break; 
	case 4: 
		/* pass the src address */ 
		bp = padblock(bp, UDP_USEAD4); 
		memmove(bp->rp, raddr, IPv4addrlen); 
		if(ipforme(f, laddr) == Runi) 
			memmove(bp->rp+IPv4addrlen, laddr, IPv4addrlen); 
		else 
			memmove(bp->rp+IPv4addrlen, ia, IPv4addrlen); 
		hnputs(bp->rp + 2*IPv4addrlen, rport); 
		hnputs(bp->rp + 2*IPv4addrlen + 2, lport); 
		break; 
	default: 
1997/0327    
		/* connection oriented udp */ 
		if(c->raddr == 0){ 
			/* save the src address in the conversation */ 
1998/0311/sys/src/9/ip/udp.c:279,2951998/0313/sys/src/9/ip/udp.c:350,367
1997/0530    
			c->rport = rport; 
1997/0327    
 
			/* reply with the same ip address (if not broadcast) */ 
1998/0306    
			if(ipforme(laddr) == Runi) 
1998/0313    
			if(ipforme(f, laddr) == Runi) 
1998/0306    
				ipmove(c->laddr, laddr); 
1997/0708    
			else 
1998/0306    
				ipmove(c->laddr, ia); 
1998/0313    
				v4tov6(c->laddr, ia); 
1997/0327    
		} 
1998/0313    
		break; 
1997/0327    
	} 
	if(bp->next) 
		bp = concatblock(bp); 
 
1997/0725    
	if(qfull(c->rq)){ 
1998/0306    
		netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", raddr, rport, 
1998/0313    
		netlog(f, Logudp, "udp: qfull %I.%d -> %I.%d\n", raddr, rport, 
1998/0306    
			laddr, lport); 
1997/0327    
		freeblist(bp); 
1997/0725    
	}else 
1998/0311/sys/src/9/ip/udp.c:302,3201998/0313/sys/src/9/ip/udp.c:374,393
1997/0327    
	Udpcb *ucb; 
 
	ucb = (Udpcb*)c->ptcl; 
	if(n == 1 && strcmp(f[0], "headers") == 0){ 
		ucb->headers = 1; 
		return nil; 
1998/0313    
	if(n == 1){ 
		if(strcmp(f[0], "headers4") == 0){ 
			ucb->headers = 4; 
			return nil; 
		} else if(strcmp(f[0], "headers") == 0){ 
			ucb->headers = 6; 
			return nil; 
		} 
1997/0327    
	} 
	if(n == 1 && strcmp(f[0], "debug") == 0){ 
		udpdebug = 1; 
		return nil; 
	} 
	return "unknown control request"; 
} 
 
void 
1997/0829    
udpadvise(Block *bp, char *msg) 
1998/0313    
udpadvise(Proto *udp, Block *bp, char *msg) 
1997/0829    
{ 
	Udphdr *h; 
1998/0306    
	uchar source[IPaddrlen], dest[IPaddrlen]; 
1998/0311/sys/src/9/ip/udp.c:329,3351998/0313/sys/src/9/ip/udp.c:402,408
1997/0829    
	pdest = nhgets(h->udpdport); 
 
	/* Look for a connection */ 
	for(p = udp.conv; *p; p++) { 
1998/0313    
	for(p = udp->conv; *p; p++) { 
1997/0829    
		s = *p; 
1998/0306    
		if(s->rport == pdest) 
		if(s->lport == psource) 
1998/0311/sys/src/9/ip/udp.c:344,3731998/0313/sys/src/9/ip/udp.c:417,455
1997/0829    
} 
 
1998/0306    
int 
udpstats(char *buf, int len) 
1998/0313    
udpstats(Proto *udp, char *buf, int len) 
1998/0306    
{ 
	return snprint(buf, len, 
		"udp: csum %d hlen %d len %d order %d rexmit %d\n", 
		udp.csumerr, udp.hlenerr, udp.lenerr, udp.order, udp.rexmit); 
1998/0313    
	Udppriv *upriv; 
 
	upriv = udp->priv; 
	return snprint(buf, len, "%d %d %d %d", 
		upriv->ustats.udpInDatagrams, 
		upriv->ustats.udpNoPorts, 
		upriv->ustats.udpInErrors, 
		upriv->ustats.udpOutDatagrams); 
1998/0306    
} 
 
1997/0829    
void 
1997/0327    
udpinit(Fs *fs) 
{ 
	udp.name = "udp"; 
	udp.kick = udpkick; 
	udp.connect = udpconnect; 
	udp.announce = udpannounce; 
	udp.ctl = udpctl; 
	udp.state = udpstate; 
	udp.create = udpcreate; 
	udp.close = udpclose; 
	udp.rcv = udpiput; 
1997/0829    
	udp.advise = udpadvise; 
1998/0306    
	udp.stats = udpstats; 
1997/0327    
	udp.ipproto = IP_UDPPROTO; 
	udp.nc = 16; 
	udp.ptclsize = sizeof(Udpcb); 
1998/0313    
	Proto *udp; 
1997/0327    
 
	Fsproto(fs, &udp); 
1998/0313    
	udp = smalloc(sizeof(Proto)); 
	udp->priv = smalloc(sizeof(Udppriv)); 
	udp->name = "udp"; 
	udp->kick = udpkick; 
	udp->connect = udpconnect; 
	udp->announce = udpannounce; 
	udp->ctl = udpctl; 
	udp->state = udpstate; 
	udp->create = udpcreate; 
	udp->close = udpclose; 
	udp->rcv = udpiput; 
	udp->advise = udpadvise; 
	udp->stats = udpstats; 
	udp->ipproto = IP_UDPPROTO; 
	udp->nc = 16; 
	udp->ptclsize = sizeof(Udpcb); 
 
	Fsproto(fs, udp); 
1997/0327    
} 
1998/0313/sys/src/9/ip/udp.c:165,1791998/0414/sys/src/9/ip/udp.c:165,177 (short | long)
Reformatting. XXX confused by udp->headers switch.
rsc Fri Mar 4 12:44:25 2005
1998/0306    
		bp->rp += IPaddrlen; 
		ipmove(laddr, bp->rp); 
		bp->rp += IPaddrlen; 
1998/0414    
		/* pick interface closest to dest */ 
1998/0313    
		if(ipforme(f, laddr) != Runi) 
			findlocalip(f, laddr, raddr);	/* pick interface closest to dest */ 
1998/0414    
			findlocalip(f, laddr, raddr); 
1997/0530    
		rport = nhgets(bp->rp); 
1997/0327    
		bp->rp += 2; 
1997/0530    
		/* ignore local port number */ 
		bp->rp += 2; 
1998/0414    
		bp->rp += 2+2;			/* Igonore local port */ 
1998/0313    
		break; 
	case 4: 
		/* get user specified addresses */ 
		bp = pullupblock(bp, UDP_USEAD4); 
		if(bp == nil) 
			return; 
1998/0313/sys/src/9/ip/udp.c:182,1921998/0414/sys/src/9/ip/udp.c:180,188
1998/0313    
		v4tov6(laddr, bp->rp); 
		bp->rp += IPv4addrlen; 
		if(ipforme(f, laddr) != Runi) 
			findlocalip(f, laddr, raddr);	/* pick interface closest to dest */ 
1998/0414    
			findlocalip(f, laddr, raddr); 
1998/0313    
		rport = nhgets(bp->rp); 
		bp->rp += 2; 
		/* ignore local port number */ 
		bp->rp += 2; 
1998/0414    
		bp->rp += 2+2; 
1998/0313    
		break; 
	default: 
1997/0530    
		rport = 0; 
1998/0313/sys/src/9/ip/udp.c:209,2291998/0414/sys/src/9/ip/udp.c:205,221
1997/0327    
	uh->frag[1] = 0; 
	hnputs(uh->udpplen, ptcllen); 
1998/0313    
	switch(ucb->headers){ 
1998/0414    
	case 4: 
1998/0313    
	case 6: 
1998/0306    
		v6tov4(uh->udpdst, raddr); 
1997/0530    
		hnputs(uh->udpdport, rport); 
1998/0306    
		v6tov4(uh->udpsrc, laddr); 
1998/0313    
		break; 
	case 4: 
		memmove(uh->udpdst, raddr, IPv4addrlen); 
		hnputs(uh->udpdport, rport); 
		memmove(uh->udpsrc, laddr, IPv4addrlen); 
		break; 
	default: 
1998/0306    
		v6tov4(uh->udpdst, c->raddr); 
1997/0327    
		hnputs(uh->udpdport, c->rport); 
1998/0306    
		if(ipcmp(c->laddr, IPnoaddr) == 0) 
1998/0313    
			findlocalip(f, c->laddr, c->raddr);	/* pick interface closest to dest */ 
1998/0414    
			findlocalip(f, c->laddr, c->raddr); 
1998/0306    
		v6tov4(uh->udpsrc, c->laddr); 
1998/0313    
		break; 
1997/0327    
	} 
1998/0313/sys/src/9/ip/udp.c:290,2961998/0414/sys/src/9/ip/udp.c:282,288
1997/0327    
 
	if(*p == nil) { 
1998/0313    
		upriv->ustats.udpNoPorts++; 
		netlog(f, Logudp, "udp: no conv %I.%d -> %I.%d\n", raddr, rport, 
1998/0414    
		netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport, 
1998/0306    
			laddr, lport); 
1997/0904    
		/* don't complain about broadcasts... */ 
1998/0313    
		if(ipforme(f, raddr) == 0){ 
1998/0313/sys/src/9/ip/udp.c:334,3421998/0414/sys/src/9/ip/udp.c:326,334
1998/0313    
	case 4: 
		/* pass the src address */ 
		bp = padblock(bp, UDP_USEAD4); 
		memmove(bp->rp, raddr, IPv4addrlen); 
1998/0414    
		v6tov4(bp->rp, raddr); 
1998/0313    
		if(ipforme(f, laddr) == Runi) 
			memmove(bp->rp+IPv4addrlen, laddr, IPv4addrlen); 
1998/0414    
			v6tov4(bp->rp+IPv4addrlen, laddr); 
1998/0313    
		else 
			memmove(bp->rp+IPv4addrlen, ia, IPv4addrlen); 
		hnputs(bp->rp + 2*IPv4addrlen, rport); 
1998/0313/sys/src/9/ip/udp.c:422,4281998/0414/sys/src/9/ip/udp.c:414,420
1998/0313    
	Udppriv *upriv; 
 
	upriv = udp->priv; 
	return snprint(buf, len, "%d %d %d %d", 
1998/0414    
	return snprint(buf, len, "%d %d %d %d\n", 
1998/0313    
		upriv->ustats.udpInDatagrams, 
		upriv->ustats.udpNoPorts, 
		upriv->ustats.udpInErrors, 
1998/0414/sys/src/9/ip/udp.c:284,2951998/0509/sys/src/9/ip/udp.c:284,292 (short | long)
1998/0313    
		upriv->ustats.udpNoPorts++; 
1998/0414    
		netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport, 
1998/0306    
			laddr, lport); 
1997/0904    
		/* don't complain about broadcasts... */ 
1998/0313    
		if(ipforme(f, raddr) == 0){ 
1997/0904    
			uh->Unused = ottl; 
			hnputs(uh->udpplen, olen); 
1998/0313    
			icmpnoconv(f, bp); 
1997/0904    
		} 
1998/0509    
		uh->Unused = ottl; 
		hnputs(uh->udpplen, olen); 
		icmpnoconv(f, bp); 
1997/0327    
		freeblist(bp); 
		return; 
	} 
1998/0509/sys/src/9/ip/udp.c:327,3331998/0604/sys/src/9/ip/udp.c:327,333 (short | long)
1998/0313    
		if(ipforme(f, laddr) == Runi) 
1998/0414    
			v6tov4(bp->rp+IPv4addrlen, laddr); 
1998/0313    
		else 
			memmove(bp->rp+IPv4addrlen, ia, IPv4addrlen); 
1998/0604    
			v6tov4(bp->rp+IPv4addrlen, ia); 
1998/0313    
		hnputs(bp->rp + 2*IPv4addrlen, rport); 
		hnputs(bp->rp + 2*IPv4addrlen + 2, lport); 
		break; 
1998/0604/sys/src/9/ip/udp.c:265,2701998/0630/sys/src/9/ip/udp.c:265,271 (short | long)
1997/0327    
		if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { 
1998/0313    
			upriv->ustats.udpInErrors++; 
			netlog(f, Logudp, "udp: checksum error %I\n", raddr); 
1998/0630    
			DPRINT("udp: checksum error %I\n", raddr); 
1997/0327    
			freeblist(bp); 
			return; 
		} 
1998/0630/sys/src/9/ip/udp.c:277,2841998/0728/sys/src/9/ip/udp.c:277,295 (short | long)
1997/0327    
		c = *p; 
		if(c->inuse == 0) 
			continue; 
1997/0530    
		if(c->lport == lport && (c->rport == 0 || c->rport == rport)) 
1997/0327    
			break; 
1998/0728    
		if(c->lport == lport){ 
			ucb = (Udpcb*)c->ptcl; 
 
			/* with headers turned on, descriminate only on local port */ 
			if(ucb->headers) 
				break; 
 
			/* otherwise discriminate on lport, rport, and raddr */ 
			if(c->rport == 0 || c->rport == rport) 
			if(ipisbm(c->raddr) || ipcmp(c->raddr, IPnoaddr) == 0 
			   || ipcmp(c->raddr, raddr) == 0) 
				break; 
		} 
1997/0327    
	} 
 
	if(*p == nil) { 
1998/0728/sys/src/9/ip/udp.c:345,3511998/0731/sys/src/9/ip/udp.c:345,351 (short | long)
1998/0313    
		break; 
	default: 
1997/0327    
		/* connection oriented udp */ 
		if(c->raddr == 0){ 
1998/0731    
		if(ipcmp(c->raddr, IPnoaddr) == 0){ 
1997/0327    
			/* save the src address in the conversation */ 
1998/0306    
		 	ipmove(c->raddr, raddr); 
1997/0530    
			c->rport = rport; 
1998/0731/sys/src/9/ip/udp.c:91,981998/0801/sys/src/9/ip/udp.c:91,97 (short | long)
1998/0306    
static int 
udpstate(Conv *c, char *state, int n) 
1997/0327    
{ 
	USED(c); 
1998/0306    
	return snprint(state, n, "%s", "Datagram"); 
1998/0801    
	return snprint(state, n, "%s", c->inuse?"Open":"Closed"); 
1997/0327    
} 
 
1997/0403    
static char* 
1998/0801/sys/src/9/ip/udp.c:422,4281998/0813/sys/src/9/ip/udp.c:422,428 (short | long)
1998/0313    
	Udppriv *upriv; 
 
	upriv = udp->priv; 
1998/0414    
	return snprint(buf, len, "%d %d %d %d\n", 
1998/0813    
	return snprint(buf, len, "%d %d %d %d", 
1998/0313    
		upriv->ustats.udpInDatagrams, 
		upriv->ustats.udpNoPorts, 
		upriv->ustats.udpInErrors, 
1998/0813/sys/src/9/ip/udp.c:422,4281998/0825/sys/src/9/ip/udp.c:422,428 (short | long)
Bug fix: print format.
rsc Fri Mar 4 12:44:25 2005
1998/0313    
	Udppriv *upriv; 
 
	upriv = udp->priv; 
1998/0813    
	return snprint(buf, len, "%d %d %d %d", 
1998/0825    
	return snprint(buf, len, "%lud %lud %lud %lud", 
1998/0313    
		upriv->ustats.udpInDatagrams, 
		upriv->ustats.udpNoPorts, 
		upriv->ustats.udpInErrors, 
1998/0825/sys/src/9/ip/udp.c:130,1361999/0302/sys/src/9/ip/udp.c:130,136 (short | long)
1997/0327    
	ucb = (Udpcb*)c->ptcl; 
	ucb->headers = 0; 
 
	unlock(c); 
1999/0302    
	qunlock(c); 
1997/0327    
} 
 
void 
1998/0825/sys/src/9/ip/udp.c:270,2751999/0302/sys/src/9/ip/udp.c:270,277
1997/0327    
		} 
	} 
 
1999/0302    
	qlock(udp); 
 
1997/0327    
	/* Look for a conversation structure for this port */ 
	c = nil; 
1998/0313    
	for(p = udp->conv; *p; p++) { 
1998/0825/sys/src/9/ip/udp.c:293,2981999/0302/sys/src/9/ip/udp.c:295,301
1997/0327    
 
	if(*p == nil) { 
1998/0313    
		upriv->ustats.udpNoPorts++; 
1999/0302    
		qunlock(udp); 
1998/0414    
		netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport, 
1998/0306    
			laddr, lport); 
1998/0509    
		uh->Unused = ottl; 
1998/0825/sys/src/9/ip/udp.c:302,3071999/0302/sys/src/9/ip/udp.c:305,314
1997/0327    
		return; 
	} 
 
1999/0302    
	ucb = (Udpcb*)c->ptcl; 
	qlock(c); 
	qunlock(udp); 
 
1997/0327    
	/* 
	 * Trim the packet down to data size 
	 */ 
1998/0825/sys/src/9/ip/udp.c:308,3131999/0302/sys/src/9/ip/udp.c:315,321
1997/0327    
	len -= (UDP_HDRSIZE-UDP_PHDRSIZE); 
	bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); 
	if(bp == nil){ 
1999/0302    
		qunlock(c); 
1998/0313    
		netlog(f, Logudp, "udp: len err %I.%d -> %I.%d\n", raddr, rport, 
1998/0306    
			laddr, lport); 
1998/0313    
		upriv->lenerr++; 
1998/0825/sys/src/9/ip/udp.c:317,3241999/0302/sys/src/9/ip/udp.c:325,330
1998/0313    
	netlog(f, Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", raddr, rport, 
1998/0306    
		laddr, lport, len); 
1997/0327    
 
	ucb = (Udpcb*)c->ptcl; 
                 
1998/0313    
	switch(ucb->headers){ 
	case 6: 
1997/0327    
		/* pass the src address */ 
1998/0825/sys/src/9/ip/udp.c:361,3711999/0302/sys/src/9/ip/udp.c:367,382
1997/0327    
		bp = concatblock(bp); 
 
1997/0725    
	if(qfull(c->rq)){ 
1999/0302    
		qunlock(c); 
1998/0313    
		netlog(f, Logudp, "udp: qfull %I.%d -> %I.%d\n", raddr, rport, 
1998/0306    
			laddr, lport); 
1997/0327    
		freeblist(bp); 
1997/0725    
	}else 
1997/0327    
		qpass(c->rq, bp); 
1999/0302    
		return; 
	} 
 
	qpass(c->rq, bp); 
	qunlock(c); 
 
1997/0327    
} 
 
char* 
1998/0825/sys/src/9/ip/udp.c:402,4071999/0302/sys/src/9/ip/udp.c:413,419
1997/0829    
	pdest = nhgets(h->udpdport); 
 
	/* Look for a connection */ 
1999/0302    
	qlock(udp); 
1998/0313    
	for(p = udp->conv; *p; p++) { 
1997/0829    
		s = *p; 
1998/0306    
		if(s->rport == pdest) 
1998/0825/sys/src/9/ip/udp.c:408,4181999/0302/sys/src/9/ip/udp.c:420,435
1998/0306    
		if(s->lport == psource) 
		if(ipcmp(s->raddr, dest) == 0) 
		if(ipcmp(s->laddr, source) == 0){ 
1999/0302    
			qlock(s); 
			qunlock(udp); 
1997/0829    
			qhangup(s->rq, msg); 
			qhangup(s->wq, msg); 
			break; 
1999/0302    
			qunlock(s); 
			freeblist(bp); 
			return; 
1997/0829    
		} 
	} 
1999/0302    
	qunlock(udp); 
1997/0829    
	freeblist(bp); 
} 
 
Too many diffs (26 > 25). Stopping.


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