if (debug) {
if (net_debug) {
readudp(d, pkt, len, tleft)	register struct iodesc *d;	register void *pkt;	register size_t len;	time_t tleft;{	register ssize_t n;	register size_t hlen;	register struct ip *ip;	register struct udphdr *uh;	register struct udpiphdr *ui;	struct ip tip;	u_int16_t etype;	/* host order */#ifdef NET_DEBUG	if (debug)		printf("readudp: called\n");#endif	uh = (struct udphdr *)pkt - 1;	ip = (struct ip *)uh - 1;	n = readether(d, ip, len + sizeof(*ip) + sizeof(*uh), tleft, &etype);	if (n == -1 || n < sizeof(*ip) + sizeof(*uh))		return -1;	/* Ethernet address checks now in readether() */	/* Need to respond to ARP requests. */	if (etype == ETHERTYPE_ARP) {		struct arphdr *ah = (void *)ip;		if (ah->ar_op == htons(ARPOP_REQUEST)) {			/* Send ARP reply */			arp_reply(d, ah);		}		return -1;	}	if (etype != ETHERTYPE_IP) {#ifdef NET_DEBUG		if (debug)			printf("readudp: not IP. ether_type=%x\n", etype);#endif		return -1;	}	/* Check ip header */	if (ip->ip_v != IPVERSION ||	    ip->ip_p != IPPROTO_UDP) {	/* half char */#ifdef NET_DEBUG		if (debug)			printf("readudp: IP version or not UDP. ip_v=%d ip_p=%d\n", ip->ip_v, ip->ip_p);#endif		return -1;	}	hlen = ip->ip_hl << 2;	if (hlen < sizeof(*ip) ||	    in_cksum(ip, hlen) != 0) {#ifdef NET_DEBUG		if (debug)			printf("readudp: short hdr or bad cksum.\n");#endif		return -1;	}	NTOHS(ip->ip_len);	if (n < ip->ip_len) {#ifdef NET_DEBUG		if (debug)			printf("readudp: bad length %d < %d.\n", n, ip->ip_len);#endif		return -1;	}	if (d->myip.s_addr && ip->ip_dst.s_addr != d->myip.s_addr) {#ifdef NET_DEBUG		if (debug) {			printf("readudp: bad saddr %s != ", inet_ntoa(d->myip));			printf("%s\n", inet_ntoa(ip->ip_dst));		}#endif		return -1;	}	/* If there were ip options, make them go away */	if (hlen != sizeof(*ip)) {		bcopy(((u_char *)ip) + hlen, uh, len - hlen);		ip->ip_len = sizeof(*ip);		n -= hlen - sizeof(*ip);	}	if (uh->uh_dport != d->myport) {#ifdef NET_DEBUG		if (debug)			printf("readudp: bad dport %d != %d\n",				d->myport, ntohs(uh->uh_dport));#endif		return -1;	}	if (uh->uh_sum) {		n = ntohs(uh->uh_ulen) + sizeof(*ip);		if (n > RECV_SIZE - ETHER_SIZE) {			printf("readudp: huge packet, udp len %d\n", n);			return -1;		}		/* Check checksum (must save and restore ip header) */		tip = *ip;		ui = (struct udpiphdr *)ip;		bzero(ui->ui_x1, sizeof(ui->ui_x1));		ui->ui_len = uh->uh_ulen;		if (in_cksum(ui, n) != 0) {#ifdef NET_DEBUG			if (debug)				printf("readudp: bad cksum\n");#endif			*ip = tip;			return -1;		}		*ip = tip;	}	NTOHS(uh->uh_dport);	NTOHS(uh->uh_sport);	NTOHS(uh->uh_ulen);	if (uh->uh_ulen < sizeof(*uh)) {#ifdef NET_DEBUG		if (debug)			printf("readudp: bad udp len %d < %d\n",				uh->uh_ulen, sizeof(*uh));#endif		return -1;	}	n -= sizeof(*ip) + sizeof(*uh);	return (n);}