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