xref: /freebsd/contrib/tcpdump/print-udp.c (revision 6990ffd8a95caaba6858ad44ff1b3157d1efba8f)
1 /*
2  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that: (1) source code distributions
7  * retain the above copyright notice and this paragraph in its entirety, (2)
8  * distributions including binary code include the above copyright notice and
9  * this paragraph in its entirety in the documentation or other materials
10  * provided with the distribution, and (3) all advertising materials mentioning
11  * features or use of this software display the following acknowledgement:
12  * ``This product includes software developed by the University of California,
13  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14  * the University nor the names of its contributors may be used to endorse
15  * or promote products derived from this software without specific prior
16  * written permission.
17  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  * $FreeBSD$
22  */
23 
24 #ifndef lint
25 static const char rcsid[] =
26     "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.90 2000/12/23 20:55:22 guy Exp $ (LBL)";
27 #endif
28 
29 #ifdef HAVE_CONFIG_H
30 #include "config.h"
31 #endif
32 
33 #include <sys/param.h>
34 #include <sys/time.h>
35 
36 #include <netinet/in.h>
37 
38 #ifdef SEGSIZE
39 #undef SEGSIZE
40 #endif
41 #include <arpa/tftp.h>
42 
43 #include <rpc/rpc.h>
44 
45 #include <stdio.h>
46 #include <string.h>
47 
48 #include "interface.h"
49 #include "addrtoname.h"
50 #include "appletalk.h"
51 
52 #include "udp.h"
53 
54 #include "ip.h"
55 #ifdef INET6
56 #include "ip6.h"
57 #endif
58 
59 #ifdef NOERROR
60 #undef NOERROR					/* Solaris sucks */
61 #endif
62 #ifdef T_UNSPEC
63 #undef T_UNSPEC					/* SINIX does too */
64 #endif
65 #include "nameser.h"
66 #include "nfs.h"
67 #include "bootp.h"
68 
69 struct rtcphdr {
70 	u_int16_t rh_flags;	/* T:2 P:1 CNT:5 PT:8 */
71 	u_int16_t rh_len;	/* length of message (in words) */
72 	u_int32_t rh_ssrc;	/* synchronization src id */
73 };
74 
75 typedef struct {
76 	u_int32_t upper;	/* more significant 32 bits */
77 	u_int32_t lower;	/* less significant 32 bits */
78 } ntp64;
79 
80 /*
81  * Sender report.
82  */
83 struct rtcp_sr {
84 	ntp64 sr_ntp;		/* 64-bit ntp timestamp */
85 	u_int32_t sr_ts;	/* reference media timestamp */
86 	u_int32_t sr_np;	/* no. packets sent */
87 	u_int32_t sr_nb;	/* no. bytes sent */
88 };
89 
90 /*
91  * Receiver report.
92  * Time stamps are middle 32-bits of ntp timestamp.
93  */
94 struct rtcp_rr {
95 	u_int32_t rr_srcid;	/* sender being reported */
96 	u_int32_t rr_nl;	/* no. packets lost */
97 	u_int32_t rr_ls;	/* extended last seq number received */
98 	u_int32_t rr_dv;	/* jitter (delay variance) */
99 	u_int32_t rr_lsr;	/* orig. ts from last rr from this src  */
100 	u_int32_t rr_dlsr;	/* time from recpt of last rr to xmit time */
101 };
102 
103 /*XXX*/
104 #define RTCP_PT_SR	200
105 #define RTCP_PT_RR	201
106 #define RTCP_PT_SDES	202
107 #define 	RTCP_SDES_CNAME	1
108 #define 	RTCP_SDES_NAME	2
109 #define 	RTCP_SDES_EMAIL	3
110 #define 	RTCP_SDES_PHONE	4
111 #define 	RTCP_SDES_LOC	5
112 #define 	RTCP_SDES_TOOL	6
113 #define 	RTCP_SDES_NOTE	7
114 #define 	RTCP_SDES_PRIV	8
115 #define RTCP_PT_BYE	203
116 #define RTCP_PT_APP	204
117 
118 static void
119 vat_print(const void *hdr, u_int len, register const struct udphdr *up)
120 {
121 	/* vat/vt audio */
122 	u_int ts = *(u_int16_t *)hdr;
123 	if ((ts & 0xf060) != 0) {
124 		/* probably vt */
125 		(void)printf(" udp/vt %u %d / %d",
126 			     (u_int32_t)(ntohs(up->uh_ulen) - sizeof(*up)),
127 			     ts & 0x3ff, ts >> 10);
128 	} else {
129 		/* probably vat */
130 		u_int32_t i0 = (u_int32_t)ntohl(((u_int *)hdr)[0]);
131 		u_int32_t i1 = (u_int32_t)ntohl(((u_int *)hdr)[1]);
132 		printf(" udp/vat %u c%d %u%s",
133 			(u_int32_t)(ntohs(up->uh_ulen) - sizeof(*up) - 8),
134 			i0 & 0xffff,
135 			i1, i0 & 0x800000? "*" : "");
136 		/* audio format */
137 		if (i0 & 0x1f0000)
138 			printf(" f%d", (i0 >> 16) & 0x1f);
139 		if (i0 & 0x3f000000)
140 			printf(" s%d", (i0 >> 24) & 0x3f);
141 	}
142 }
143 
144 static void
145 rtp_print(const void *hdr, u_int len, register const struct udphdr *up)
146 {
147 	/* rtp v1 or v2 */
148 	u_int *ip = (u_int *)hdr;
149 	u_int hasopt, hasext, contype, hasmarker;
150 	u_int32_t i0 = (u_int32_t)ntohl(((u_int *)hdr)[0]);
151 	u_int32_t i1 = (u_int32_t)ntohl(((u_int *)hdr)[1]);
152 	u_int dlen = ntohs(up->uh_ulen) - sizeof(*up) - 8;
153 	const char * ptype;
154 
155 	ip += 2;
156 	len >>= 2;
157 	len -= 2;
158 	hasopt = 0;
159 	hasext = 0;
160 	if ((i0 >> 30) == 1) {
161 		/* rtp v1 */
162 		hasopt = i0 & 0x800000;
163 		contype = (i0 >> 16) & 0x3f;
164 		hasmarker = i0 & 0x400000;
165 		ptype = "rtpv1";
166 	} else {
167 		/* rtp v2 */
168 		hasext = i0 & 0x10000000;
169 		contype = (i0 >> 16) & 0x7f;
170 		hasmarker = i0 & 0x800000;
171 		dlen -= 4;
172 		ptype = "rtp";
173 		ip += 1;
174 		len -= 1;
175 	}
176 	printf(" udp/%s %d c%d %s%s %d %u",
177 		ptype,
178 		dlen,
179 		contype,
180 		(hasopt || hasext)? "+" : "",
181 		hasmarker? "*" : "",
182 		i0 & 0xffff,
183 		i1);
184 	if (vflag) {
185 		printf(" %u", (u_int32_t)ntohl(((u_int *)hdr)[2]));
186 		if (hasopt) {
187 			u_int i2, optlen;
188 			do {
189 				i2 = ip[0];
190 				optlen = (i2 >> 16) & 0xff;
191 				if (optlen == 0 || optlen > len) {
192 					printf(" !opt");
193 					return;
194 				}
195 				ip += optlen;
196 				len -= optlen;
197 			} while ((int)i2 >= 0);
198 		}
199 		if (hasext) {
200 			u_int i2, extlen;
201 			i2 = ip[0];
202 			extlen = (i2 & 0xffff) + 1;
203 			if (extlen > len) {
204 				printf(" !ext");
205 				return;
206 			}
207 			ip += extlen;
208 		}
209 		if (contype == 0x1f) /*XXX H.261 */
210 			printf(" 0x%04x", ip[0] >> 16);
211 	}
212 }
213 
214 static const u_char *
215 rtcp_print(const u_char *hdr, const u_char *ep)
216 {
217 	/* rtp v2 control (rtcp) */
218 	struct rtcp_rr *rr = 0;
219 	struct rtcp_sr *sr;
220 	struct rtcphdr *rh = (struct rtcphdr *)hdr;
221 	u_int len;
222 	u_int16_t flags;
223 	int cnt;
224 	double ts, dts;
225 	if ((u_char *)(rh + 1) > ep) {
226 		printf(" [|rtcp]");
227 		return (ep);
228 	}
229 	len = (ntohs(rh->rh_len) + 1) * 4;
230 	flags = ntohs(rh->rh_flags);
231 	cnt = (flags >> 8) & 0x1f;
232 	switch (flags & 0xff) {
233 	case RTCP_PT_SR:
234 		sr = (struct rtcp_sr *)(rh + 1);
235 		printf(" sr");
236 		if (len != cnt * sizeof(*rr) + sizeof(*sr) + sizeof(*rh))
237 			printf(" [%d]", len);
238 		if (vflag)
239 			printf(" %u", (u_int32_t)ntohl(rh->rh_ssrc));
240 		if ((u_char *)(sr + 1) > ep) {
241 			printf(" [|rtcp]");
242 			return (ep);
243 		}
244 		ts = (double)((u_int32_t)ntohl(sr->sr_ntp.upper)) +
245 		    ((double)((u_int32_t)ntohl(sr->sr_ntp.lower)) /
246 		    4294967296.0);
247 		printf(" @%.2f %u %up %ub", ts, (u_int32_t)ntohl(sr->sr_ts),
248 		    (u_int32_t)ntohl(sr->sr_np), (u_int32_t)ntohl(sr->sr_nb));
249 		rr = (struct rtcp_rr *)(sr + 1);
250 		break;
251 	case RTCP_PT_RR:
252 		printf(" rr");
253 		if (len != cnt * sizeof(*rr) + sizeof(*rh))
254 			printf(" [%d]", len);
255 		rr = (struct rtcp_rr *)(rh + 1);
256 		if (vflag)
257 			printf(" %u", (u_int32_t)ntohl(rh->rh_ssrc));
258 		break;
259 	case RTCP_PT_SDES:
260 		printf(" sdes %d", len);
261 		if (vflag)
262 			printf(" %u", (u_int32_t)ntohl(rh->rh_ssrc));
263 		cnt = 0;
264 		break;
265 	case RTCP_PT_BYE:
266 		printf(" bye %d", len);
267 		if (vflag)
268 			printf(" %u", (u_int32_t)ntohl(rh->rh_ssrc));
269 		cnt = 0;
270 		break;
271 	default:
272 		printf(" type-0x%x %d", flags & 0xff, len);
273 		cnt = 0;
274 		break;
275 	}
276 	if (cnt > 1)
277 		printf(" c%d", cnt);
278 	while (--cnt >= 0) {
279 		if ((u_char *)(rr + 1) > ep) {
280 			printf(" [|rtcp]");
281 			return (ep);
282 		}
283 		if (vflag)
284 			printf(" %u", (u_int32_t)ntohl(rr->rr_srcid));
285 		ts = (double)((u_int32_t)ntohl(rr->rr_lsr)) / 65536.;
286 		dts = (double)((u_int32_t)ntohl(rr->rr_dlsr)) / 65536.;
287 		printf(" %ul %us %uj @%.2f+%.2f",
288 		    (u_int32_t)ntohl(rr->rr_nl) & 0x00ffffff,
289 		    (u_int32_t)ntohl(rr->rr_ls),
290 		    (u_int32_t)ntohl(rr->rr_dv), ts, dts);
291 	}
292 	return (hdr + len);
293 }
294 
295 static int udp_cksum(register const struct ip *ip,
296 		     register const struct udphdr *up,
297 		     register int len)
298 {
299 	int i, tlen;
300 	union phu {
301 		struct phdr {
302 			u_int32_t src;
303 			u_int32_t dst;
304 			u_char mbz;
305 			u_char proto;
306 			u_int16_t len;
307 		} ph;
308 		u_int16_t pa[6];
309 	} phu;
310 	register const u_int16_t *sp;
311 	u_int32_t sum;
312 	tlen = ntohs(ip->ip_len) - ((const char *)up-(const char*)ip);
313 
314 	/* pseudo-header.. */
315 	phu.ph.len = htons(tlen);
316 	phu.ph.mbz = 0;
317 	phu.ph.proto = IPPROTO_UDP;
318 	memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
319 	memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
320 
321 	sp = &phu.pa[0];
322 	sum = sp[0]+sp[1]+sp[2]+sp[3]+sp[4]+sp[5];
323 
324 	sp = (const u_int16_t *)up;
325 
326 	for (i=0; i<(tlen&~1); i+= 2)
327 		sum += *sp++;
328 
329 	if (tlen & 1) {
330 		sum += htons( (*(const u_int8_t *)sp) << 8);
331 	}
332 
333 	while (sum > 0xffff)
334 		sum = (sum & 0xffff) + (sum >> 16);
335 	sum = ~sum & 0xffff;
336 
337 	return (sum);
338 }
339 
340 #ifdef INET6
341 static int udp6_cksum(const struct ip6_hdr *ip6, const struct udphdr *up,
342 	int len)
343 {
344 	int i, tlen;
345 	register const u_int16_t *sp;
346 	u_int32_t sum;
347 	union {
348 		struct {
349 			struct in6_addr ph_src;
350 			struct in6_addr ph_dst;
351 			u_int32_t	ph_len;
352 			u_int8_t	ph_zero[3];
353 			u_int8_t	ph_nxt;
354 		} ph;
355 		u_int16_t pa[20];
356 	} phu;
357 
358 	tlen = ntohs(ip6->ip6_plen) + sizeof(struct ip6_hdr) -
359 	    ((const char *)up - (const char*)ip6);
360 
361 	/* pseudo-header */
362 	memset(&phu, 0, sizeof(phu));
363 	phu.ph.ph_src = ip6->ip6_src;
364 	phu.ph.ph_dst = ip6->ip6_dst;
365 	phu.ph.ph_len = htonl(tlen);
366 	phu.ph.ph_nxt = IPPROTO_UDP;
367 
368 	sum = 0;
369 	for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++)
370 		sum += phu.pa[i];
371 
372 	sp = (const u_int16_t *)up;
373 
374 	for (i = 0; i < (tlen & ~1); i += 2)
375 		sum += *sp++;
376 
377 	if (tlen & 1)
378 		sum += htons((*(const u_int8_t *)sp) << 8);
379 
380 	while (sum > 0xffff)
381 		sum = (sum & 0xffff) + (sum >> 16);
382 	sum = ~sum & 0xffff;
383 
384 	return (sum);
385 }
386 #endif
387 
388 
389 /* XXX probably should use getservbyname() and cache answers */
390 #define TFTP_PORT 69		/*XXX*/
391 #define KERBEROS_PORT 88	/*XXX*/
392 #define SUNRPC_PORT 111		/*XXX*/
393 #define SNMP_PORT 161		/*XXX*/
394 #define NTP_PORT 123		/*XXX*/
395 #define SNMPTRAP_PORT 162	/*XXX*/
396 #define ISAKMP_PORT 500		/*XXX*/
397 #define TIMED_PORT 525		/*XXX*/
398 #define RIP_PORT 520		/*XXX*/
399 #define KERBEROS_SEC_PORT 750	/*XXX*/
400 #define L2TP_PORT 1701		/*XXX*/
401 #define ISAKMP_PORT_USER1 7500	/*??? - nonstandard*/
402 #define ISAKMP_PORT_USER2 8500	/*??? - nonstandard*/
403 #define RX_PORT_LOW 7000	/*XXX*/
404 #define RX_PORT_HIGH 7009	/*XXX*/
405 #define NETBIOS_NS_PORT   137
406 #define NETBIOS_DGRAM_PORT   138
407 #define CISCO_AUTORP_PORT 496	/*XXX*/
408 #define RADIUS_PORT 1645
409 #define RADIUS_NEW_PORT 1812
410 #define RADIUS_ACCOUNTING_PORT 1646
411 #define RADIUS_NEW_ACCOUNTING_PORT 1813
412 
413 #ifdef INET6
414 #define RIPNG_PORT 521		/*XXX*/
415 #define DHCP6_SERV_PORT 546	/*XXX*/
416 #define DHCP6_CLI_PORT 547	/*XXX*/
417 #endif
418 
419 void
420 udp_print(register const u_char *bp, u_int length,
421 	  register const u_char *bp2, int fragmented)
422 {
423 	register const struct udphdr *up;
424 	register const struct ip *ip;
425 	register const u_char *cp;
426 	register const u_char *ep = bp + length;
427 	u_int16_t sport, dport, ulen;
428 #ifdef INET6
429 	register const struct ip6_hdr *ip6;
430 #endif
431 
432 	if (ep > snapend)
433 		ep = snapend;
434 	up = (struct udphdr *)bp;
435 	ip = (struct ip *)bp2;
436 #ifdef INET6
437 	if (IP_V(ip) == 6)
438 		ip6 = (struct ip6_hdr *)bp2;
439 	else
440 		ip6 = NULL;
441 #endif /*INET6*/
442 	cp = (u_char *)(up + 1);
443 	if (cp > snapend) {
444 		(void)printf("%s > %s: [|udp]",
445 			ipaddr_string(&ip->ip_src), ipaddr_string(&ip->ip_dst));
446 		return;
447 	}
448 	if (length < sizeof(struct udphdr)) {
449 		(void)printf("%s > %s: truncated-udp %d",
450 			ipaddr_string(&ip->ip_src), ipaddr_string(&ip->ip_dst),
451 			length);
452 		return;
453 	}
454 	length -= sizeof(struct udphdr);
455 
456 	sport = ntohs(up->uh_sport);
457 	dport = ntohs(up->uh_dport);
458 	ulen = ntohs(up->uh_ulen);
459 	if (ulen < 8) {
460 		(void)printf("%s > %s: truncated-udplength %d",
461 			     ipaddr_string(&ip->ip_src),
462 			     ipaddr_string(&ip->ip_dst),
463 			     ulen);
464 		return;
465 	}
466 	if (packettype) {
467 		register struct rpc_msg *rp;
468 		enum msg_type direction;
469 
470 		switch (packettype) {
471 
472 		case PT_VAT:
473 			(void)printf("%s.%s > %s.%s:",
474 				ipaddr_string(&ip->ip_src),
475 				udpport_string(sport),
476 				ipaddr_string(&ip->ip_dst),
477 				udpport_string(dport));
478 			vat_print((void *)(up + 1), length, up);
479 			break;
480 
481 		case PT_WB:
482 			(void)printf("%s.%s > %s.%s:",
483 				ipaddr_string(&ip->ip_src),
484 				udpport_string(sport),
485 				ipaddr_string(&ip->ip_dst),
486 				udpport_string(dport));
487 			wb_print((void *)(up + 1), length);
488 			break;
489 
490 		case PT_RPC:
491 			rp = (struct rpc_msg *)(up + 1);
492 			direction = (enum msg_type)ntohl(rp->rm_direction);
493 			if (direction == CALL)
494 				sunrpcrequest_print((u_char *)rp, length,
495 				    (u_char *)ip);
496 			else
497 				nfsreply_print((u_char *)rp, length,
498 				    (u_char *)ip);			/*XXX*/
499 			break;
500 
501 		case PT_RTP:
502 			(void)printf("%s.%s > %s.%s:",
503 				ipaddr_string(&ip->ip_src),
504 				udpport_string(sport),
505 				ipaddr_string(&ip->ip_dst),
506 				udpport_string(dport));
507 			rtp_print((void *)(up + 1), length, up);
508 			break;
509 
510 		case PT_RTCP:
511 			(void)printf("%s.%s > %s.%s:",
512 				ipaddr_string(&ip->ip_src),
513 				udpport_string(sport),
514 				ipaddr_string(&ip->ip_dst),
515 				udpport_string(dport));
516 			while (cp < ep)
517 				cp = rtcp_print(cp, ep);
518 			break;
519 
520 		case PT_SNMP:
521 			(void)printf("%s.%s > %s.%s:",
522 				ipaddr_string(&ip->ip_src),
523 				udpport_string(sport),
524 				ipaddr_string(&ip->ip_dst),
525 				udpport_string(dport));
526 			snmp_print((const u_char *)(up + 1), length);
527 			break;
528 
529 		case PT_CNFP:
530 			(void)printf("%s.%s > %s.%s:",
531 				ipaddr_string(&ip->ip_src),
532 				udpport_string(sport),
533 				ipaddr_string(&ip->ip_dst),
534 				udpport_string(dport));
535 			cnfp_print(cp, length, (const u_char *)ip);
536 			break;
537 		}
538 		return;
539 	}
540 
541 	if (!qflag) {
542 		register struct rpc_msg *rp;
543 		enum msg_type direction;
544 
545 		rp = (struct rpc_msg *)(up + 1);
546 		if (TTEST(rp->rm_direction)) {
547 			direction = (enum msg_type)ntohl(rp->rm_direction);
548 			if (dport == NFS_PORT && direction == CALL) {
549 				nfsreq_print((u_char *)rp, length,
550 				    (u_char *)ip);
551 				return;
552 			}
553 			if (sport == NFS_PORT && direction == REPLY) {
554 				nfsreply_print((u_char *)rp, length,
555 				    (u_char *)ip);
556 				return;
557 			}
558 #ifdef notdef
559 			if (dport == SUNRPC_PORT && direction == CALL) {
560 				sunrpcrequest_print((u_char *)rp, length, (u_char *)ip);
561 				return;
562 			}
563 #endif
564 		}
565 		if (TTEST(((struct LAP *)cp)->type) &&
566 		    ((struct LAP *)cp)->type == lapDDP &&
567 		    (atalk_port(sport) || atalk_port(dport))) {
568 			if (vflag)
569 				fputs("kip ", stdout);
570 			llap_print(cp, length);
571 			return;
572 		}
573 	}
574 #if 0
575 	(void)printf("%s.%s > %s.%s:",
576 		ipaddr_string(&ip->ip_src), udpport_string(sport),
577 		ipaddr_string(&ip->ip_dst), udpport_string(dport));
578 #else
579 #ifdef INET6
580 	if (ip6) {
581 		if (ip6->ip6_nxt == IPPROTO_UDP) {
582 			(void)printf("%s.%s > %s.%s: ",
583 				ip6addr_string(&ip6->ip6_src),
584 				udpport_string(sport),
585 				ip6addr_string(&ip6->ip6_dst),
586 				udpport_string(dport));
587 		} else {
588 			(void)printf("%s > %s: ",
589 				udpport_string(sport), udpport_string(dport));
590 		}
591 	} else
592 #endif /*INET6*/
593 	{
594 		if (ip->ip_p == IPPROTO_UDP) {
595 			(void)printf("%s.%s > %s.%s: ",
596 				ipaddr_string(&ip->ip_src),
597 				udpport_string(sport),
598 				ipaddr_string(&ip->ip_dst),
599 				udpport_string(dport));
600 		} else {
601 			(void)printf("%s > %s: ",
602 				udpport_string(sport), udpport_string(dport));
603 		}
604 	}
605 #endif
606 
607 	if (IP_V(ip) == 4 && vflag && !fragmented) {
608 		int sum = up->uh_sum;
609 		if (sum == 0) {
610 			(void)printf(" [no cksum]");
611 		} else if (TTEST2(cp[0], length)) {
612 			sum = udp_cksum(ip, up, length);
613 			if (sum != 0)
614 				(void)printf(" [bad udp cksum %x!]", sum);
615 			else
616 				(void)printf(" [udp sum ok]");
617 		}
618 	}
619 #ifdef INET6
620 	if (IP_V(ip) == 6 && ip6->ip6_plen && vflag && !fragmented) {
621 		int sum = up->uh_sum;
622 		/* for IPv6, UDP checksum is mandatory */
623 		if (TTEST2(cp[0], length)) {
624 			sum = udp6_cksum(ip6, up, length);
625 			if (sum != 0)
626 				(void)printf(" [bad udp cksum %x!]", sum);
627 			else
628 				(void)printf(" [udp sum ok]");
629 		}
630 	}
631 #endif
632 
633 	if (!qflag) {
634 #define ISPORT(p) (dport == (p) || sport == (p))
635 		if (ISPORT(NAMESERVER_PORT))
636 			ns_print((const u_char *)(up + 1), length);
637 		else if (ISPORT(TIMED_PORT))
638 			timed_print((const u_char *)(up + 1), length);
639 		else if (ISPORT(TFTP_PORT))
640 			tftp_print((const u_char *)(up + 1), length);
641 		else if (ISPORT(IPPORT_BOOTPC) || ISPORT(IPPORT_BOOTPS))
642 			bootp_print((const u_char *)(up + 1), length,
643 			    sport, dport);
644 		else if (ISPORT(RIP_PORT))
645 			rip_print((const u_char *)(up + 1), length);
646 		else if (ISPORT(ISAKMP_PORT))
647 			isakmp_print((const u_char *)(up + 1), length, bp2);
648 #if 1 /*???*/
649 		else if (ISPORT(ISAKMP_PORT_USER1) || ISPORT(ISAKMP_PORT_USER2))
650 			isakmp_print((const u_char *)(up + 1), length, bp2);
651 #endif
652 		else if (ISPORT(SNMP_PORT) || ISPORT(SNMPTRAP_PORT))
653 			snmp_print((const u_char *)(up + 1), length);
654 		else if (ISPORT(NTP_PORT))
655 			ntp_print((const u_char *)(up + 1), length);
656 		else if (ISPORT(KERBEROS_PORT) || ISPORT(KERBEROS_SEC_PORT))
657 			krb_print((const void *)(up + 1), length);
658 		else if (ISPORT(L2TP_PORT))
659 			l2tp_print((const u_char *)(up + 1), length);
660  		else if (ISPORT(NETBIOS_NS_PORT)) {
661 			nbt_udp137_print((const u_char *)(up + 1), length);
662  		}
663  		else if (ISPORT(NETBIOS_DGRAM_PORT)) {
664  			nbt_udp138_print((const u_char *)(up + 1), length);
665  		}
666 		else if (dport == 3456)
667 			vat_print((const void *)(up + 1), length, up);
668  		/*
669  		 * Since there are 10 possible ports to check, I think
670  		 * a <> test would be more efficient
671  		 */
672  		else if ((sport >= RX_PORT_LOW && sport <= RX_PORT_HIGH) ||
673  			 (dport >= RX_PORT_LOW && dport <= RX_PORT_HIGH))
674  			rx_print((const void *)(up + 1), length, sport, dport,
675  				 (u_char *) ip);
676 #ifdef INET6
677 		else if (ISPORT(RIPNG_PORT))
678 			ripng_print((const u_char *)(up + 1), length);
679 		else if (ISPORT(DHCP6_SERV_PORT) || ISPORT(DHCP6_CLI_PORT)) {
680 			dhcp6_print((const u_char *)(up + 1), length,
681 				sport, dport);
682 		}
683 #endif /*INET6*/
684 		/*
685 		 * Kludge in test for whiteboard packets.
686 		 */
687 		else if (dport == 4567)
688 			wb_print((const void *)(up + 1), length);
689 		else if (ISPORT(CISCO_AUTORP_PORT))
690 			cisco_autorp_print((const void *)(up + 1), length);
691 		else if (ISPORT(RADIUS_PORT) ||
692 		         ISPORT(RADIUS_NEW_PORT) ||
693 		         ISPORT(RADIUS_ACCOUNTING_PORT) ||
694 		         ISPORT(RADIUS_NEW_ACCOUNTING_PORT) )
695 		         radius_print((const u_char *)(up+1), length);
696 		else
697 			(void)printf(" udp %u",
698 			    (u_int32_t)(ulen - sizeof(*up)));
699 #undef ISPORT
700 	} else
701 		(void)printf(" udp %u", (u_int32_t)(ulen - sizeof(*up)));
702 }
703