freebsd-skq/contrib/tcpdump/print-udp.c

719 lines
21 KiB
C
Raw Normal View History

/*
1998-09-15 19:36:32 +00:00
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code distributions
* retain the above copyright notice and this paragraph in its entirety, (2)
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution, and (3) all advertising materials mentioning
* features or use of this software display the following acknowledgement:
* ``This product includes software developed by the University of California,
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
2017-01-31 19:17:06 +00:00
/* \summary: UDP printer */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
2017-01-31 19:17:06 +00:00
#include <netdissect-stdinc.h>
2017-01-31 19:17:06 +00:00
#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
#include "appletalk.h"
#include "udp.h"
#include "ip.h"
#include "ip6.h"
#include "ipproto.h"
#include "rpc_auth.h"
#include "rpc_msg.h"
#include "nfs.h"
2017-01-31 19:17:06 +00:00
static const char vat_tstr[] = " [|vat]";
static const char rtp_tstr[] = " [|rtp]";
static const char rtcp_tstr[] = " [|rtcp]";
static const char udp_tstr[] = " [|udp]";
struct rtcphdr {
2015-01-06 19:03:11 +00:00
uint16_t rh_flags; /* T:2 P:1 CNT:5 PT:8 */
uint16_t rh_len; /* length of message (in words) */
uint32_t rh_ssrc; /* synchronization src id */
};
typedef struct {
2015-01-06 19:03:11 +00:00
uint32_t upper; /* more significant 32 bits */
uint32_t lower; /* less significant 32 bits */
} ntp64;
/*
* Sender report.
*/
struct rtcp_sr {
ntp64 sr_ntp; /* 64-bit ntp timestamp */
2015-01-06 19:03:11 +00:00
uint32_t sr_ts; /* reference media timestamp */
uint32_t sr_np; /* no. packets sent */
uint32_t sr_nb; /* no. bytes sent */
};
/*
* Receiver report.
* Time stamps are middle 32-bits of ntp timestamp.
*/
struct rtcp_rr {
2015-01-06 19:03:11 +00:00
uint32_t rr_srcid; /* sender being reported */
uint32_t rr_nl; /* no. packets lost */
uint32_t rr_ls; /* extended last seq number received */
uint32_t rr_dv; /* jitter (delay variance) */
uint32_t rr_lsr; /* orig. ts from last rr from this src */
uint32_t rr_dlsr; /* time from recpt of last rr to xmit time */
};
/*XXX*/
1997-05-27 02:11:31 +00:00
#define RTCP_PT_SR 200
#define RTCP_PT_RR 201
#define RTCP_PT_SDES 202
#define RTCP_SDES_CNAME 1
#define RTCP_SDES_NAME 2
#define RTCP_SDES_EMAIL 3
#define RTCP_SDES_PHONE 4
#define RTCP_SDES_LOC 5
#define RTCP_SDES_TOOL 6
1997-05-27 02:11:31 +00:00
#define RTCP_SDES_NOTE 7
#define RTCP_SDES_PRIV 8
#define RTCP_PT_BYE 203
#define RTCP_PT_APP 204
static void
2015-01-06 19:03:11 +00:00
vat_print(netdissect_options *ndo, const void *hdr, register const struct udphdr *up)
{
/* vat/vt audio */
2017-01-31 19:17:06 +00:00
u_int ts;
ND_TCHECK_16BITS((const u_int *)hdr);
ts = EXTRACT_16BITS(hdr);
if ((ts & 0xf060) != 0) {
/* probably vt */
2017-01-31 19:17:06 +00:00
ND_TCHECK_16BITS(&up->uh_ulen);
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "udp/vt %u %d / %d",
(uint32_t)(EXTRACT_16BITS(&up->uh_ulen) - sizeof(*up)),
ts & 0x3ff, ts >> 10));
} else {
/* probably vat */
2017-01-31 19:17:06 +00:00
uint32_t i0, i1;
ND_TCHECK_32BITS(&((const u_int *)hdr)[0]);
i0 = EXTRACT_32BITS(&((const u_int *)hdr)[0]);
ND_TCHECK_32BITS(&((const u_int *)hdr)[1]);
i1 = EXTRACT_32BITS(&((const u_int *)hdr)[1]);
ND_TCHECK_16BITS(&up->uh_ulen);
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "udp/vat %u c%d %u%s",
(uint32_t)(EXTRACT_16BITS(&up->uh_ulen) - sizeof(*up) - 8),
i0 & 0xffff,
2015-01-06 19:03:11 +00:00
i1, i0 & 0x800000? "*" : ""));
/* audio format */
if (i0 & 0x1f0000)
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " f%d", (i0 >> 16) & 0x1f));
if (i0 & 0x3f000000)
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " s%d", (i0 >> 24) & 0x3f));
}
2017-01-31 19:17:06 +00:00
trunc:
ND_PRINT((ndo, "%s", vat_tstr));
}
static void
2015-01-06 19:03:11 +00:00
rtp_print(netdissect_options *ndo, const void *hdr, u_int len,
register const struct udphdr *up)
{
/* rtp v1 or v2 */
2017-01-31 19:17:06 +00:00
const u_int *ip = (const u_int *)hdr;
u_int hasopt, hasext, contype, hasmarker, dlen;
uint32_t i0, i1;
1997-05-27 02:11:31 +00:00
const char * ptype;
2017-01-31 19:17:06 +00:00
ND_TCHECK_32BITS(&((const u_int *)hdr)[0]);
i0 = EXTRACT_32BITS(&((const u_int *)hdr)[0]);
ND_TCHECK_32BITS(&((const u_int *)hdr)[1]);
i1 = EXTRACT_32BITS(&((const u_int *)hdr)[1]);
ND_TCHECK_16BITS(&up->uh_ulen);
dlen = EXTRACT_16BITS(&up->uh_ulen) - sizeof(*up) - 8;
ip += 2;
len >>= 2;
len -= 2;
1997-05-27 02:11:31 +00:00
hasopt = 0;
hasext = 0;
if ((i0 >> 30) == 1) {
2017-01-31 19:17:06 +00:00
/* rtp v1 - draft-ietf-avt-rtp-04 */
hasopt = i0 & 0x800000;
contype = (i0 >> 16) & 0x3f;
hasmarker = i0 & 0x400000;
ptype = "rtpv1";
1997-05-27 02:11:31 +00:00
} else {
2017-01-31 19:17:06 +00:00
/* rtp v2 - RFC 3550 */
1997-05-27 02:11:31 +00:00
hasext = i0 & 0x10000000;
contype = (i0 >> 16) & 0x7f;
hasmarker = i0 & 0x800000;
dlen -= 4;
ptype = "rtp";
ip += 1;
len -= 1;
}
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "udp/%s %d c%d %s%s %d %u",
ptype,
dlen,
contype,
1997-05-27 02:11:31 +00:00
(hasopt || hasext)? "+" : "",
hasmarker? "*" : "",
1997-05-27 02:11:31 +00:00
i0 & 0xffff,
2015-01-06 19:03:11 +00:00
i1));
if (ndo->ndo_vflag) {
2017-01-31 19:17:06 +00:00
ND_TCHECK_32BITS(&((const u_int *)hdr)[2]);
ND_PRINT((ndo, " %u", EXTRACT_32BITS(&((const u_int *)hdr)[2])));
if (hasopt) {
u_int i2, optlen;
do {
2017-01-31 19:17:06 +00:00
ND_TCHECK_32BITS(ip);
i2 = EXTRACT_32BITS(ip);
optlen = (i2 >> 16) & 0xff;
if (optlen == 0 || optlen > len) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " !opt"));
return;
}
ip += optlen;
1997-05-27 02:11:31 +00:00
len -= optlen;
} while ((int)i2 >= 0);
}
1997-05-27 02:11:31 +00:00
if (hasext) {
u_int i2, extlen;
2017-01-31 19:17:06 +00:00
ND_TCHECK_32BITS(ip);
i2 = EXTRACT_32BITS(ip);
1997-05-27 02:11:31 +00:00
extlen = (i2 & 0xffff) + 1;
if (extlen > len) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " !ext"));
1997-05-27 02:11:31 +00:00
return;
}
ip += extlen;
}
2017-01-31 19:17:06 +00:00
ND_TCHECK_32BITS(ip);
1997-05-27 02:11:31 +00:00
if (contype == 0x1f) /*XXX H.261 */
2017-01-31 19:17:06 +00:00
ND_PRINT((ndo, " 0x%04x", EXTRACT_32BITS(ip) >> 16));
}
2017-01-31 19:17:06 +00:00
trunc:
ND_PRINT((ndo, "%s", rtp_tstr));
}
1997-05-27 02:11:31 +00:00
static const u_char *
2015-01-06 19:03:11 +00:00
rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
{
/* rtp v2 control (rtcp) */
2017-01-31 19:17:06 +00:00
const struct rtcp_rr *rr = 0;
const struct rtcp_sr *sr;
const struct rtcphdr *rh = (const struct rtcphdr *)hdr;
1997-05-27 02:11:31 +00:00
u_int len;
2015-01-06 19:03:11 +00:00
uint16_t flags;
1997-05-27 02:11:31 +00:00
int cnt;
double ts, dts;
2017-01-31 19:17:06 +00:00
if ((const u_char *)(rh + 1) > ep)
goto trunc;
ND_TCHECK(*rh);
len = (EXTRACT_16BITS(&rh->rh_len) + 1) * 4;
flags = EXTRACT_16BITS(&rh->rh_flags);
1997-05-27 02:11:31 +00:00
cnt = (flags >> 8) & 0x1f;
switch (flags & 0xff) {
case RTCP_PT_SR:
2017-01-31 19:17:06 +00:00
sr = (const struct rtcp_sr *)(rh + 1);
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " sr"));
if (len != cnt * sizeof(*rr) + sizeof(*sr) + sizeof(*rh))
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " [%d]", len));
if (ndo->ndo_vflag)
ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rh->rh_ssrc)));
2017-01-31 19:17:06 +00:00
if ((const u_char *)(sr + 1) > ep)
goto trunc;
ND_TCHECK(*sr);
ts = (double)(EXTRACT_32BITS(&sr->sr_ntp.upper)) +
((double)(EXTRACT_32BITS(&sr->sr_ntp.lower)) /
1997-05-27 02:11:31 +00:00
4294967296.0);
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " @%.2f %u %up %ub", ts, EXTRACT_32BITS(&sr->sr_ts),
EXTRACT_32BITS(&sr->sr_np), EXTRACT_32BITS(&sr->sr_nb)));
2017-01-31 19:17:06 +00:00
rr = (const struct rtcp_rr *)(sr + 1);
break;
case RTCP_PT_RR:
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " rr"));
if (len != cnt * sizeof(*rr) + sizeof(*rh))
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " [%d]", len));
2017-01-31 19:17:06 +00:00
rr = (const struct rtcp_rr *)(rh + 1);
2015-01-06 19:03:11 +00:00
if (ndo->ndo_vflag)
ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rh->rh_ssrc)));
break;
case RTCP_PT_SDES:
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " sdes %d", len));
if (ndo->ndo_vflag)
ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rh->rh_ssrc)));
cnt = 0;
break;
case RTCP_PT_BYE:
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " bye %d", len));
if (ndo->ndo_vflag)
ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rh->rh_ssrc)));
cnt = 0;
break;
default:
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " type-0x%x %d", flags & 0xff, len));
cnt = 0;
break;
}
if (cnt > 1)
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " c%d", cnt));
while (--cnt >= 0) {
2017-01-31 19:17:06 +00:00
if ((const u_char *)(rr + 1) > ep)
goto trunc;
ND_TCHECK(*rr);
2015-01-06 19:03:11 +00:00
if (ndo->ndo_vflag)
ND_PRINT((ndo, " %u", EXTRACT_32BITS(&rr->rr_srcid)));
ts = (double)(EXTRACT_32BITS(&rr->rr_lsr)) / 65536.;
dts = (double)(EXTRACT_32BITS(&rr->rr_dlsr)) / 65536.;
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, " %ul %us %uj @%.2f+%.2f",
EXTRACT_32BITS(&rr->rr_nl) & 0x00ffffff,
EXTRACT_32BITS(&rr->rr_ls),
2015-01-06 19:03:11 +00:00
EXTRACT_32BITS(&rr->rr_dv), ts, dts));
}
return (hdr + len);
2017-01-31 19:17:06 +00:00
trunc:
ND_PRINT((ndo, "%s", rtcp_tstr));
return ep;
}
2015-01-06 19:03:11 +00:00
static int udp_cksum(netdissect_options *ndo, register const struct ip *ip,
register const struct udphdr *up,
register u_int len)
{
2017-01-31 19:17:06 +00:00
return nextproto4_cksum(ndo, ip, (const uint8_t *)(const void *)up, len, len,
2015-01-06 19:03:11 +00:00
IPPROTO_UDP);
}
2017-01-31 19:17:06 +00:00
static int udp6_cksum(netdissect_options *ndo, const struct ip6_hdr *ip6,
const struct udphdr *up, u_int len)
{
2017-01-31 19:17:06 +00:00
return nextproto6_cksum(ndo, ip6, (const uint8_t *)(const void *)up, len, len,
IPPROTO_UDP);
}
static void
2015-01-06 19:03:11 +00:00
udpipaddr_print(netdissect_options *ndo, const struct ip *ip, int sport, int dport)
{
const struct ip6_hdr *ip6;
if (IP_V(ip) == 6)
ip6 = (const struct ip6_hdr *)ip;
else
ip6 = NULL;
if (ip6) {
if (ip6->ip6_nxt == IPPROTO_UDP) {
if (sport == -1) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "%s > %s: ",
ip6addr_string(ndo, &ip6->ip6_src),
ip6addr_string(ndo, &ip6->ip6_dst)));
} else {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "%s.%s > %s.%s: ",
ip6addr_string(ndo, &ip6->ip6_src),
2017-01-31 19:17:06 +00:00
udpport_string(ndo, sport),
2015-01-06 19:03:11 +00:00
ip6addr_string(ndo, &ip6->ip6_dst),
2017-01-31 19:17:06 +00:00
udpport_string(ndo, dport)));
}
} else {
if (sport != -1) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "%s > %s: ",
2017-01-31 19:17:06 +00:00
udpport_string(ndo, sport),
udpport_string(ndo, dport)));
}
}
2017-01-31 19:17:06 +00:00
} else {
if (ip->ip_p == IPPROTO_UDP) {
if (sport == -1) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "%s > %s: ",
ipaddr_string(ndo, &ip->ip_src),
ipaddr_string(ndo, &ip->ip_dst)));
} else {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "%s.%s > %s.%s: ",
ipaddr_string(ndo, &ip->ip_src),
2017-01-31 19:17:06 +00:00
udpport_string(ndo, sport),
2015-01-06 19:03:11 +00:00
ipaddr_string(ndo, &ip->ip_dst),
2017-01-31 19:17:06 +00:00
udpport_string(ndo, dport)));
}
} else {
if (sport != -1) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "%s > %s: ",
2017-01-31 19:17:06 +00:00
udpport_string(ndo, sport),
udpport_string(ndo, dport)));
}
}
}
}
void
2015-01-06 19:03:11 +00:00
udp_print(netdissect_options *ndo, register const u_char *bp, u_int length,
register const u_char *bp2, int fragmented)
{
register const struct udphdr *up;
register const struct ip *ip;
register const u_char *cp;
1997-05-27 02:11:31 +00:00
register const u_char *ep = bp + length;
2015-01-06 19:03:11 +00:00
uint16_t sport, dport, ulen;
register const struct ip6_hdr *ip6;
2015-01-06 19:03:11 +00:00
if (ep > ndo->ndo_snapend)
ep = ndo->ndo_snapend;
2017-01-31 19:17:06 +00:00
up = (const struct udphdr *)bp;
ip = (const struct ip *)bp2;
if (IP_V(ip) == 6)
2017-01-31 19:17:06 +00:00
ip6 = (const struct ip6_hdr *)bp2;
else
ip6 = NULL;
2015-01-06 19:03:11 +00:00
if (!ND_TTEST(up->uh_dport)) {
udpipaddr_print(ndo, ip, -1, -1);
2017-01-31 19:17:06 +00:00
goto trunc;
}
sport = EXTRACT_16BITS(&up->uh_sport);
dport = EXTRACT_16BITS(&up->uh_dport);
if (length < sizeof(struct udphdr)) {
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
ND_PRINT((ndo, "truncated-udp %d", length));
return;
}
2017-01-31 19:17:06 +00:00
if (!ND_TTEST(up->uh_ulen)) {
udpipaddr_print(ndo, ip, sport, dport);
goto trunc;
}
ulen = EXTRACT_16BITS(&up->uh_ulen);
if (ulen < sizeof(struct udphdr)) {
udpipaddr_print(ndo, ip, sport, dport);
ND_PRINT((ndo, "truncated-udplength %d", ulen));
return;
}
ulen -= sizeof(struct udphdr);
length -= sizeof(struct udphdr);
if (ulen < length)
length = ulen;
2017-01-31 19:17:06 +00:00
cp = (const u_char *)(up + 1);
2015-01-06 19:03:11 +00:00
if (cp > ndo->ndo_snapend) {
udpipaddr_print(ndo, ip, sport, dport);
2017-01-31 19:17:06 +00:00
goto trunc;
}
2015-01-06 19:03:11 +00:00
if (ndo->ndo_packettype) {
2017-01-31 19:17:06 +00:00
register const struct sunrpc_msg *rp;
enum sunrpc_msg_type direction;
2015-01-06 19:03:11 +00:00
switch (ndo->ndo_packettype) {
case PT_VAT:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
2017-01-31 19:17:06 +00:00
vat_print(ndo, (const void *)(up + 1), up);
break;
case PT_WB:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
2017-01-31 19:17:06 +00:00
wb_print(ndo, (const void *)(up + 1), length);
break;
case PT_RPC:
2017-01-31 19:17:06 +00:00
rp = (const struct sunrpc_msg *)(up + 1);
direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);
if (direction == SUNRPC_CALL)
2017-01-31 19:17:06 +00:00
sunrpcrequest_print(ndo, (const u_char *)rp, length,
(const u_char *)ip);
else
2017-01-31 19:17:06 +00:00
nfsreply_print(ndo, (const u_char *)rp, length,
(const u_char *)ip); /*XXX*/
break;
case PT_RTP:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
2017-01-31 19:17:06 +00:00
rtp_print(ndo, (const void *)(up + 1), length, up);
break;
case PT_RTCP:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
1997-05-27 02:11:31 +00:00
while (cp < ep)
2015-01-06 19:03:11 +00:00
cp = rtcp_print(ndo, cp, ep);
break;
case PT_SNMP:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
snmp_print(ndo, (const u_char *)(up + 1), length);
break;
case PT_CNFP:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
cnfp_print(ndo, cp);
break;
case PT_TFTP:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
tftp_print(ndo, cp, length);
break;
case PT_AODV:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
aodv_print(ndo, (const u_char *)(up + 1), length,
ip6 != NULL);
break;
2013-05-30 06:46:26 +00:00
case PT_RADIUS:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
radius_print(ndo, cp, length);
2013-05-30 06:46:26 +00:00
break;
case PT_VXLAN:
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
vxlan_print(ndo, (const u_char *)(up + 1), length);
break;
case PT_PGM:
case PT_PGM_ZMTP1:
udpipaddr_print(ndo, ip, sport, dport);
pgm_print(ndo, cp, length, bp2);
break;
case PT_LMP:
udpipaddr_print(ndo, ip, sport, dport);
lmp_print(ndo, cp, length);
2013-05-30 06:46:26 +00:00
break;
}
return;
}
2015-01-06 19:03:11 +00:00
udpipaddr_print(ndo, ip, sport, dport);
if (!ndo->ndo_qflag) {
2017-01-31 19:17:06 +00:00
register const struct sunrpc_msg *rp;
enum sunrpc_msg_type direction;
2017-01-31 19:17:06 +00:00
rp = (const struct sunrpc_msg *)(up + 1);
2015-01-06 19:03:11 +00:00
if (ND_TTEST(rp->rm_direction)) {
direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);
if (dport == NFS_PORT && direction == SUNRPC_CALL) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "NFS request xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
2017-01-31 19:17:06 +00:00
nfsreq_print_noaddr(ndo, (const u_char *)rp, length,
(const u_char *)ip);
1997-05-27 02:11:31 +00:00
return;
}
if (sport == NFS_PORT && direction == SUNRPC_REPLY) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "NFS reply xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
2017-01-31 19:17:06 +00:00
nfsreply_print_noaddr(ndo, (const u_char *)rp, length,
(const u_char *)ip);
1997-05-27 02:11:31 +00:00
return;
}
#ifdef notdef
if (dport == SUNRPC_PORT && direction == SUNRPC_CALL) {
2017-01-31 19:17:06 +00:00
sunrpcrequest_print((const u_char *)rp, length, (const u_char *)ip);
return;
}
1997-05-27 02:11:31 +00:00
#endif
}
}
2015-01-06 19:03:11 +00:00
if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) {
2012-05-14 08:01:48 +00:00
/* Check the checksum, if possible. */
2015-01-06 19:03:11 +00:00
uint16_t sum, udp_sum;
2012-05-14 08:01:48 +00:00
/*
* XXX - do this even if vflag == 1?
* TCP does, and we do so for UDP-over-IPv6.
*/
2015-01-06 19:03:11 +00:00
if (IP_V(ip) == 4 && (ndo->ndo_vflag > 1)) {
2012-05-14 08:01:48 +00:00
udp_sum = EXTRACT_16BITS(&up->uh_sum);
if (udp_sum == 0) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "[no cksum] "));
} else if (ND_TTEST2(cp[0], length)) {
sum = udp_cksum(ndo, ip, up, length + sizeof(struct udphdr));
2012-05-14 08:01:48 +00:00
if (sum != 0) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "[bad udp cksum 0x%04x -> 0x%04x!] ",
2012-05-14 08:01:48 +00:00
udp_sum,
2015-01-06 19:03:11 +00:00
in_cksum_shouldbe(udp_sum, sum)));
2012-05-14 08:01:48 +00:00
} else
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "[udp sum ok] "));
2012-05-14 08:01:48 +00:00
}
}
2012-05-14 08:01:48 +00:00
else if (IP_V(ip) == 6 && ip6->ip6_plen) {
/* for IPv6, UDP checksum is mandatory */
2015-01-06 19:03:11 +00:00
if (ND_TTEST2(cp[0], length)) {
2017-01-31 19:17:06 +00:00
sum = udp6_cksum(ndo, ip6, up, length + sizeof(struct udphdr));
2012-05-14 08:01:48 +00:00
udp_sum = EXTRACT_16BITS(&up->uh_sum);
if (sum != 0) {
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "[bad udp cksum 0x%04x -> 0x%04x!] ",
2012-05-14 08:01:48 +00:00
udp_sum,
2015-01-06 19:03:11 +00:00
in_cksum_shouldbe(udp_sum, sum)));
2012-05-14 08:01:48 +00:00
} else
2015-01-06 19:03:11 +00:00
ND_PRINT((ndo, "[udp sum ok] "));
2012-05-14 08:01:48 +00:00
}
}
2012-05-14 08:01:48 +00:00
}
2015-01-06 19:03:11 +00:00
if (!ndo->ndo_qflag) {
2017-01-31 19:17:06 +00:00
if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT))
2015-01-06 19:03:11 +00:00
ns_print(ndo, (const u_char *)(up + 1), length, 0);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(MULTICASTDNS_PORT))
2015-01-06 19:03:11 +00:00
ns_print(ndo, (const u_char *)(up + 1), length, 1);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(TIMED_PORT))
2015-01-06 19:03:11 +00:00
timed_print(ndo, (const u_char *)(up + 1));
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(TFTP_PORT))
2015-01-06 19:03:11 +00:00
tftp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(BOOTPC_PORT) || IS_SRC_OR_DST_PORT(BOOTPS_PORT))
2015-01-06 19:03:11 +00:00
bootp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(RIP_PORT))
2015-01-06 19:03:11 +00:00
rip_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(AODV_PORT))
2015-01-06 19:03:11 +00:00
aodv_print(ndo, (const u_char *)(up + 1), length,
ip6 != NULL);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT))
2015-01-06 19:03:11 +00:00
isakmp_print(ndo, (const u_char *)(up + 1), length, bp2);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_NATT))
2015-01-06 19:03:11 +00:00
isakmp_rfc3948_print(ndo, (const u_char *)(up + 1), length, bp2);
#if 1 /*???*/
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER1) || IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER2))
2015-01-06 19:03:11 +00:00
isakmp_print(ndo, (const u_char *)(up + 1), length, bp2);
#endif
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(SNMP_PORT) || IS_SRC_OR_DST_PORT(SNMPTRAP_PORT))
2015-01-06 19:03:11 +00:00
snmp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(NTP_PORT))
2015-01-06 19:03:11 +00:00
ntp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(KERBEROS_PORT) || IS_SRC_OR_DST_PORT(KERBEROS_SEC_PORT))
2015-01-06 19:03:11 +00:00
krb_print(ndo, (const void *)(up + 1));
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(L2TP_PORT))
2015-01-06 19:03:11 +00:00
l2tp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
#ifdef ENABLE_SMB
else if (IS_SRC_OR_DST_PORT(NETBIOS_NS_PORT))
2015-01-06 19:03:11 +00:00
nbt_udp137_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(NETBIOS_DGRAM_PORT))
2015-01-06 19:03:11 +00:00
nbt_udp138_print(ndo, (const u_char *)(up + 1), length);
#endif
2015-01-06 19:03:11 +00:00
else if (dport == VAT_PORT)
vat_print(ndo, (const void *)(up + 1), up);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(ZEPHYR_SRV_PORT) || IS_SRC_OR_DST_PORT(ZEPHYR_CLT_PORT))
2015-01-06 19:03:11 +00:00
zephyr_print(ndo, (const void *)(up + 1), length);
/*
* Since there are 10 possible ports to check, I think
* a <> test would be more efficient
*/
else if ((sport >= RX_PORT_LOW && sport <= RX_PORT_HIGH) ||
(dport >= RX_PORT_LOW && dport <= RX_PORT_HIGH))
2015-01-06 19:03:11 +00:00
rx_print(ndo, (const void *)(up + 1), length, sport, dport,
2017-01-31 19:17:06 +00:00
(const u_char *) ip);
else if (IS_SRC_OR_DST_PORT(RIPNG_PORT))
2015-01-06 19:03:11 +00:00
ripng_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(DHCP6_SERV_PORT) || IS_SRC_OR_DST_PORT(DHCP6_CLI_PORT))
2015-01-06 19:03:11 +00:00
dhcp6_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(AHCP_PORT))
2015-01-06 19:03:11 +00:00
ahcp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(BABEL_PORT) || IS_SRC_OR_DST_PORT(BABEL_PORT_OLD))
2015-01-06 19:03:11 +00:00
babel_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(HNCP_PORT))
hncp_print(ndo, (const u_char *)(up + 1), length);
/*
* Kludge in test for whiteboard packets.
*/
2015-01-06 19:03:11 +00:00
else if (dport == WB_PORT)
wb_print(ndo, (const void *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(CISCO_AUTORP_PORT))
2015-01-06 19:03:11 +00:00
cisco_autorp_print(ndo, (const void *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(RADIUS_PORT) ||
IS_SRC_OR_DST_PORT(RADIUS_NEW_PORT) ||
IS_SRC_OR_DST_PORT(RADIUS_ACCOUNTING_PORT) ||
IS_SRC_OR_DST_PORT(RADIUS_NEW_ACCOUNTING_PORT) ||
IS_SRC_OR_DST_PORT(RADIUS_CISCO_COA_PORT) ||
IS_SRC_OR_DST_PORT(RADIUS_COA_PORT) )
2015-01-06 19:03:11 +00:00
radius_print(ndo, (const u_char *)(up+1), length);
else if (dport == HSRP_PORT)
2015-01-06 19:03:11 +00:00
hsrp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(LWRES_PORT))
2015-01-06 19:03:11 +00:00
lwres_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(LDP_PORT))
2015-01-06 19:03:11 +00:00
ldp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(OLSR_PORT))
2015-01-06 19:03:11 +00:00
olsr_print(ndo, (const u_char *)(up + 1), length,
Update tcpdump to 4.1.1. Changes: Thu. April 1, 2010. guy@alum.mit.edu. Summary for 4.1.1 tcpdump release Fix build on systems with PF, such as FreeBSD and OpenBSD. Don't blow up if a zero-length link-layer address is passed to linkaddr_string(). Thu. March 11, 2010. ken@netfunctional.ca/guy@alum.mit.edu. Summary for 4.1.0 tcpdump release Fix printing of MAC addresses for VLAN frames with a length field Add some additional bounds checks and use the EXTRACT_ macros more Add a -b flag to print the AS number in BGP packets in ASDOT notation rather than ASPLAIN notation Add ICMPv6 RFC 5006 support Decode the access flags in NFS access requests Handle the new DLT_ for memory-mapped USB captures on Linux Make the default snapshot (-s) the maximum Print name of device (when -L is used) Support for OpenSolaris (and SXCE build 125 and later) Print new TCP flags Add support for RPL DIO Add support for TCP User Timeout (UTO) Add support for non-standard Ethertypes used by 3com PPPoE gear Add support for 802.11n and 802.11s Add support for Transparent Ethernet Bridge ethertype in GRE Add 4 byte AS support for BGP printer Add support for the MDT SAFI 66 BG printer Add basic IPv6 support to print-olsr Add USB printer Add printer for ForCES Handle frames with an FCS Handle 802.11n Control Wrapper, Block Acq Req and Block Ack frames Fix TCP sequence number printing Report 802.2 packets as 802.2 instead of 802.3 Don't include -L/usr/lib in LDFLAGS On x86_64 Linux, look in lib64 directory too Lots of code clean ups Autoconf clean ups Update testcases to make output changes Fix compiling with/out smi (--with{,out}-smi) Fix compiling without IPv6 support (--disable-ipv6)
2010-10-28 16:23:25 +00:00
(IP_V(ip) == 6) ? 1 : 0);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(MPLS_LSP_PING_PORT))
2015-01-06 19:03:11 +00:00
lspping_print(ndo, (const u_char *)(up + 1), length);
else if (dport == BFD_CONTROL_PORT ||
dport == BFD_ECHO_PORT )
2015-01-06 19:03:11 +00:00
bfd_print(ndo, (const u_char *)(up+1), length, dport);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(LMP_PORT))
2015-01-06 19:03:11 +00:00
lmp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(VQP_PORT))
2015-01-06 19:03:11 +00:00
vqp_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(SFLOW_PORT))
2015-01-06 19:03:11 +00:00
sflow_print(ndo, (const u_char *)(up + 1), length);
2009-03-21 16:23:46 +00:00
else if (dport == LWAPP_CONTROL_PORT)
2015-01-06 19:03:11 +00:00
lwapp_control_print(ndo, (const u_char *)(up + 1), length, 1);
2009-03-21 16:23:46 +00:00
else if (sport == LWAPP_CONTROL_PORT)
2015-01-06 19:03:11 +00:00
lwapp_control_print(ndo, (const u_char *)(up + 1), length, 0);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(LWAPP_DATA_PORT))
2015-01-06 19:03:11 +00:00
lwapp_data_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(SIP_PORT))
2015-01-06 19:03:11 +00:00
sip_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT))
2015-01-06 19:03:11 +00:00
syslog_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(OTV_PORT))
2015-01-06 19:03:11 +00:00
otv_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(VXLAN_PORT))
2015-01-06 19:03:11 +00:00
vxlan_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(GENEVE_PORT))
geneve_print(ndo, (const u_char *)(up + 1), length);
2017-01-31 19:17:06 +00:00
else if (IS_SRC_OR_DST_PORT(LISP_CONTROL_PORT))
lisp_print(ndo, (const u_char *)(up + 1), length);
else if (IS_SRC_OR_DST_PORT(VXLAN_GPE_PORT))
vxlan_gpe_print(ndo, (const u_char *)(up + 1), length);
else if (ND_TTEST(((const struct LAP *)cp)->type) &&
((const struct LAP *)cp)->type == lapDDP &&
(atalk_port(sport) || atalk_port(dport))) {
if (ndo->ndo_vflag)
ND_PRINT((ndo, "kip "));
llap_print(ndo, cp, length);
} else {
if (ulen > length)
ND_PRINT((ndo, "UDP, bad length %u > %u",
ulen, length));
else
ND_PRINT((ndo, "UDP, length %u", ulen));
}
} else {
if (ulen > length)
ND_PRINT((ndo, "UDP, bad length %u > %u",
ulen, length));
else
ND_PRINT((ndo, "UDP, length %u", ulen));
}
2017-01-31 19:17:06 +00:00
return;
trunc:
ND_PRINT((ndo, "%s", udp_tstr));
}
/*
* Local Variables:
* c-style: whitesmith
* c-basic-offset: 8
* End:
*/