i just wanted to make the udp payload printing line up nicely, but
i noticed some issues and went a bit further.
the biggest problem i noticed was that a lot of the udp printing
code assumes that it is encapsulated in ipv4. this is not true, it
could be ipv6, and some other parts give the impression that NULL
is passed as an ip header. so this factors out the outer address
handling, and does the hostname.port > hostname.port printing once,
consistently. particular payload handling no longer has to concern
itself with the outer ip header, which removes a lot of duplication
of the wrong code.
i refactored the checksum handling as part of the outer ip address
bits. it moves that code into in_cksum.c, and adds to the api to
allow incremental accumulation of the checksum. this is used to
feed the ipv4 or ipv6 addresses into the udp pseudo header checksum
handling, before moving on to the rest of the accumulation.
finally, this applies the principal that an encapsulator (eg, udp,
gre, udpencap, etc) should leave a trailing space on its output so
the payload doesnt have to do that. previously udp left no space,
so payloads had to do it. they did it inconsistently though, so
this unifies them all.
i could split the in_cksum changes out, but the other two bits are
kind of twisted together.
thoughts?
ps, can we get rid of some protocol parsers? eg, the whiteboard
stuff.
Index: in_cksum.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/in_cksum.c,v
retrieving revision 1.1
diff -u -p -r1.1 in_cksum.c
--- in_cksum.c 20 Jun 2014 04:01:42 -0000 1.1
+++ in_cksum.c 4 Jul 2018 03:29:21 -0000
@@ -86,3 +86,46 @@ in_cksum_shouldbe(u_int16_t sum, u_int16
shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16);
return shouldbe;
}
+
+uint32_t
+in_cksum_word(uint16_t word, uint32_t cksum)
+{
+ return (cksum + word);
+}
+
+uint32_t
+in_cksum_add(const void *buf, size_t len, uint32_t sum)
+{
+ const uint16_t *words = buf;
+
+ while (len > 1) {
+ sum = in_cksum_word(*words++, sum);
+ len -= sizeof(*words);
+ }
+
+ if (len == 1) {
+ uint8_t byte = *(const uint8_t *)words;
+ sum = in_cksum_word(byte << 8, sum);
+ }
+
+ return (sum);
+}
+
+uint16_t
+in_cksum_fini(uint32_t sum)
+{
+ sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
+ sum += (sum >> 16); /* add carry */
+
+ return (~sum);
+}
+
+/*
+ * compute an IP header checksum.
+ * don't modifiy the packet.
+ */
+uint16_t
+in_cksum(const void *addr, size_t len, uint32_t sum)
+{
+ return (in_cksum_fini(in_cksum_add(addr, len, sum)));
+}
Index: interface.h
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/interface.h,v
retrieving revision 1.72
diff -u -p -r1.72 interface.h
--- interface.h 10 Feb 2018 10:00:32 -0000 1.72
+++ interface.h 4 Jul 2018 03:29:21 -0000
@@ -255,11 +255,11 @@ extern void sl_bsdos_if_print(u_char *,
const u_char *);
extern void snmp_print(const u_char *, u_int);
extern void sunrpcrequest_print(const u_char *, u_int, const u_char *);
-extern void cnfp_print(const u_char *, u_int, const u_char *);
+extern void cnfp_print(const u_char *, u_int);
extern void tcp_print(const u_char *, u_int, const u_char *);
extern void tftp_print(const u_char *, u_int);
extern void timed_print(const u_char *, u_int);
-extern void udp_print(const u_char *, u_int, const u_char *);
+extern void udp_print(const u_char *, u_int, const void *);
extern void wb_print(const void *, u_int);
extern void ike_print(const u_char *, u_int);
extern void udpencap_print(const u_char *, u_int, const u_char *);
@@ -295,5 +295,8 @@ extern void ospf6_print(const u_char *,
extern void dhcp6_print(const u_char *, u_int, u_short, u_short);
#endif /*INET6*/
-extern u_short in_cksum(const u_short *addr, int len, int csum);
+extern uint32_t in_cksum_add(const void *, size_t, uint32_t);
+extern uint32_t in_cksum_word(uint16_t, uint32_t);
+extern uint16_t in_cksum_fini(uint32_t);
+extern uint16_t in_cksum(const void *, size_t, uint32_t);
extern u_int16_t in_cksum_shouldbe(u_int16_t, u_int16_t);
Index: print-bootp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-bootp.c,v
retrieving revision 1.22
diff -u -p -r1.22 print-bootp.c
--- print-bootp.c 22 Dec 2015 21:01:07 -0000 1.22
+++ print-bootp.c 4 Jul 2018 03:29:21 -0000
@@ -63,17 +63,17 @@ bootp_print(const u_char *cp, u_int leng
case BOOTREQUEST:
/* Usually, a request goes from a client to a server */
if (sport != IPPORT_BOOTPC || dport != IPPORT_BOOTPS)
- printf(" (request)");
+ printf("(request)");
break;
case BOOTREPLY:
/* Usually, a reply goes from a server to a client */
if (sport != IPPORT_BOOTPS || dport != IPPORT_BOOTPC)
- printf(" (reply)");
+ printf("(reply)");
break;
default:
- printf(" bootp-#%d", bp->bp_op);
+ printf("bootp-#%d", bp->bp_op);
}
TCHECK(bp->bp_flags);
Index: print-cnfp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-cnfp.c,v
retrieving revision 1.9
diff -u -p -r1.9 print-cnfp.c
--- print-cnfp.c 15 Nov 2015 20:35:36 -0000 1.9
+++ print-cnfp.c 4 Jul 2018 03:29:21 -0000
@@ -68,15 +68,13 @@ struct nfrec {
};
void
-cnfp_print(const u_char *cp, u_int len, const u_char *bp)
+cnfp_print(const u_char *cp, u_int len)
{
const struct nfhdr *nh;
const struct nfrec *nr;
- const struct ip *ip;
int nrecs, ver, proto;
time_t t;
- ip = (struct ip *)bp;
nh = (struct nfhdr *)cp;
if ((u_char *)(nh + 1) > snapend)
Index: print-domain.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-domain.c,v
retrieving revision 1.24
diff -u -p -r1.24 print-domain.c
--- print-domain.c 27 Feb 2017 11:44:23 -0000 1.24
+++ print-domain.c 4 Jul 2018 03:29:21 -0000
@@ -589,7 +589,7 @@ ns_print(const u_char *bp, u_int length,
if (DNS_QR(np)) {
/* this is a response */
- printf(" %d%s%s%s%s%s%s",
+ printf("%d%s%s%s%s%s%s",
EXTRACT_16BITS(&np->id),
ns_ops[DNS_OPCODE(np)],
ns_resp[DNS_RCODE(np)],
@@ -657,7 +657,7 @@ ns_print(const u_char *bp, u_int length,
}
else {
/* this is a request */
- printf(" %d%s%s%s", EXTRACT_16BITS(&np->id),
ns_ops[DNS_OPCODE(np)],
+ printf("%d%s%s%s", EXTRACT_16BITS(&np->id),
ns_ops[DNS_OPCODE(np)],
DNS_RD(np) ? "+" : "",
DNS_CD(np) ? "%" : "");
@@ -739,7 +739,7 @@ ns_print(const u_char *bp, u_int length,
goto trunc;
}
}
- printf(" (%d)", length);
+ printf("(%d)", length);
return;
trunc:
Index: print-gtp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-gtp.c,v
retrieving revision 1.9
diff -u -p -r1.9 print-gtp.c
--- print-gtp.c 22 Dec 2015 21:01:07 -0000 1.9
+++ print-gtp.c 4 Jul 2018 03:29:21 -0000
@@ -304,12 +304,12 @@ gtp_print(const u_char *cp, u_int length
else if (version == GTP_VERSION_1)
gtp_v1_print(cp, length, sport, dport);
else
- printf(" GTP (version %i)", version);
+ printf("GTP (version %i)", version);
return;
trunc:
- printf(" [|GTP]");
+ printf("[|GTP]");
}
/*
@@ -502,7 +502,7 @@ gtp_v0_print(const u_char *cp, u_int len
cp += sizeof(struct gtp_v0_hdr);
len = ntohs(gh->length);
bcopy(&gh->tid, &tid, sizeof(tid));
- printf(" GTPv0 (len %u, seqno %u, flow %u, N-PDU %u, tid 0x%llx) ",
+ printf("GTPv0 (len %u, seqno %u, flow %u, N-PDU %u, tid 0x%llx) ",
ntohs(gh->length), ntohs(gh->seqno), ntohs(gh->flow),
ntohs(gh->npduno), betoh64(tid));
@@ -549,7 +549,7 @@ gtp_v0_print_prime(const u_char *cp)
cp += sizeof(*gph);
len = ntohs(gph->length);
- printf(" GTPv0' (len %u, seq %u) ", len, ntohs(gph->seqno));
+ printf("GTPv0' (len %u, seq %u) ", len, ntohs(gph->seqno));
/* Decode GTP message. */
printf("%s", tok2str(gtp_v0_msgtype, "Message Type %u", gph->msgtype));
Index: print-iapp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-iapp.c,v
retrieving revision 1.5
diff -u -p -r1.5 print-iapp.c
--- print-iapp.c 16 Jan 2015 06:40:21 -0000 1.5
+++ print-iapp.c 4 Jul 2018 03:29:21 -0000
@@ -52,7 +52,7 @@ iapp_print(const u_char *p, u_int len)
TCHECK2(*wf, sizeof(struct ieee80211_iapp_frame));
/* Print common IAPP information */
- printf(" IAPPv%u ", wf->i_version);
+ printf("IAPPv%u ", wf->i_version);
if (wf->i_command & 0xf0)
printf("unknown: 0x%0x ", wf->i_command);
else
@@ -100,6 +100,6 @@ iapp_print(const u_char *p, u_int len)
return;
trunc:
- printf(" [|IAPP]");
+ printf("[|IAPP]");
}
Index: print-ike.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ike.c,v
retrieving revision 1.37
diff -u -p -r1.37 print-ike.c
--- print-ike.c 16 Jan 2015 06:40:21 -0000 1.37
+++ print-ike.c 4 Jul 2018 03:29:21 -0000
@@ -203,9 +203,7 @@ ike_print (const u_int8_t *cp, u_int len
/* 'ep' points to the end of avaible data. */
ep = snapend;
- printf(" isakmp");
-
- printf(" v%d.%d", ih->version >> 4, ih->version & 0xf);
+ printf("isakmp v%u.%u", ih->version >> 4, ih->version & 0xf);
printf(" exchange ");
if (ih->exgtype < (sizeof exgtypes/sizeof exgtypes[0]))
Index: print-ip.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ip.c,v
retrieving revision 1.49
diff -u -p -r1.49 print-ip.c
--- print-ip.c 10 Feb 2018 10:00:32 -0000 1.49
+++ print-ip.c 4 Jul 2018 03:29:21 -0000
@@ -312,40 +312,6 @@ trunc:
}
/*
- * compute an IP header checksum.
- * don't modifiy the packet.
- */
-u_short
-in_cksum(const u_short *addr, int len, int csum)
-{
- int nleft = len;
- const u_short *w = addr;
- u_short answer;
- int sum = csum;
-
- /*
- * Our algorithm is simple, using a 32 bit accumulator (sum),
- * we add sequential 16 bit words to it, and at the end, fold
- * back all the carry bits from the top 16 bits into the lower
- * 16 bits.
- */
- while (nleft > 1) {
- sum += *w++;
- nleft -= 2;
- }
- if (nleft == 1)
- sum += htons(*(u_char *)w<<8);
-
- /*
- * add back carry outs from top 16 bits to low 16 bits
- */
- sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
- sum += (sum >> 16); /* add carry */
- answer = ~sum; /* truncate to 16 bits */
- return (answer);
-}
-
-/*
* print an IP datagram.
*/
void
@@ -464,15 +430,10 @@ ip_print(const u_char *bp, u_int length)
#endif
case IPPROTO_IPIP:
/* ip-in-ip encapsulation */
- if (vflag)
- (void)printf("%s > %s: ",
- ipaddr_string(&ip->ip_src),
- ipaddr_string(&ip->ip_dst));
+ (void)printf("%s > %s: ipv4 ",
+ ipaddr_string(&ip->ip_src),
+ ipaddr_string(&ip->ip_dst));
ip_print(cp, len);
- if (! vflag) {
- printf(" (encap)");
- goto out;
- }
break;
#ifdef INET6
@@ -481,17 +442,22 @@ ip_print(const u_char *bp, u_int length)
#endif
case IPPROTO_IPV6:
/* ip6-in-ip encapsulation */
- if (vflag)
- (void)printf("%s > %s: ",
- ipaddr_string(&ip->ip_src),
- ipaddr_string(&ip->ip_dst));
+ (void)printf("%s > %s: ipv6 ",
+ ipaddr_string(&ip->ip_src),
+ ipaddr_string(&ip->ip_dst));
ip6_print(cp, len);
- if (! vflag) {
- printf(" (encap)");
- goto out;
- }
break;
#endif /*INET6*/
+
+#ifndef IPPROTO_MPLS
+#define IPPROTO_MPLS 137
+#endif
+ case IPPROTO_MPLS:
+ (void)printf("%s > %s: mpls ",
+ ipaddr_string(&ip->ip_src),
+ ipaddr_string(&ip->ip_dst));
+ mpls_print(cp, len);
+ break;
#ifndef IPPROTO_GRE
#define IPPROTO_GRE 47
Index: print-ipsec.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ipsec.c,v
retrieving revision 1.23
diff -u -p -r1.23 print-ipsec.c
--- print-ipsec.c 16 Nov 2015 00:16:39 -0000 1.23
+++ print-ipsec.c 4 Jul 2018 03:29:21 -0000
@@ -201,33 +201,15 @@ esp_decrypt (const u_char *bp, u_int len
void
esp_print (const u_char *bp, u_int len, const u_char *bp2)
{
- const struct ip *ip;
const struct esp_hdr *esp;
- u_int plen = len;
-#ifdef INET6
- const struct ip6_hdr *ip6;
-#endif
-
- ip = (const struct ip *)bp2;
-#ifdef INET6
- if (ip->ip_v == 6) {
- ip6 = (const struct ip6_hdr *)bp2;
- printf("esp %s > %s", ip6addr_string(&ip6->ip6_src),
- ip6addr_string(&ip6->ip6_dst));
- } else
-#endif
- {
- printf("esp %s > %s",
- ipaddr_string(&ip->ip_src), ipaddr_string(&ip->ip_dst));
- }
- if (plen < sizeof(struct esp_hdr)) {
+ if (len < sizeof(struct esp_hdr)) {
printf("[|esp]");
return;
}
esp = (const struct esp_hdr *)bp;
- printf(" spi 0x%08x seq %u len %d",
+ printf("esp spi 0x%08x seq %u len %d",
ntohl(esp->esp_spi), ntohl(esp->esp_seq), len);
if (espinit)
Index: print-krb.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-krb.c,v
retrieving revision 1.11
diff -u -p -r1.11 print-krb.c
--- print-krb.c 16 Nov 2015 00:16:39 -0000 1.11
+++ print-krb.c 4 Jul 2018 03:29:21 -0000
@@ -271,17 +271,17 @@ krb_print(const u_char *dat, u_int lengt
case 1:
case 2:
case 3:
- printf(" v%d", kp->pvno);
+ printf("v%d", kp->pvno);
break;
case 4:
- printf(" v%d", kp->pvno);
+ printf("v%d", kp->pvno);
krb4_print((const u_char *)kp);
break;
case 106:
case 107:
- fputs(" v5", stdout);
+ fputs("v5", stdout);
/* Decode ASN.1 here "someday" */
break;
}
Index: print-l2tp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-l2tp.c,v
retrieving revision 1.9
diff -u -p -r1.9 print-l2tp.c
--- print-l2tp.c 5 Dec 2015 05:56:26 -0000 1.9
+++ print-l2tp.c 4 Jul 2018 03:29:21 -0000
@@ -632,12 +632,12 @@ l2tp_print(const u_char *dat, u_int leng
TCHECK2(*dat, sizeof(val));
memcpy(&val, dat, sizeof(val));
if ((ntohs(val) & L2TP_VERSION_MASK) == L2TP_VERSION_L2TP) {
- printf(" l2tp:");
+ printf("l2tp:");
} else if ((ntohs(val) & L2TP_VERSION_MASK) == L2TP_VERSION_L2F) {
- printf(" l2f:");
+ printf("l2f:");
return; /* nothing to do */
} else {
- printf(" Unknown Version, neither L2F(1) nor L2TP(2)");
+ printf("Unknown Version, neither L2F(1) nor L2TP(2)");
return; /* nothing we can do */
}
Index: print-lwres.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-lwres.c,v
retrieving revision 1.8
diff -u -p -r1.8 print-lwres.c
--- print-lwres.c 16 Nov 2015 00:16:39 -0000 1.8
+++ print-lwres.c 4 Jul 2018 03:29:21 -0000
@@ -354,7 +354,7 @@ lwres_print(const u_char *bp, u_int leng
np = (const struct lwres_lwpacket *)bp;
TCHECK(np->authlength);
- printf(" lwres");
+ printf("lwres");
v = ntohs(np->version);
if (vflag || v != LWRES_LWPACKETVERSION_0)
printf(" v%u", v);
Index: print-ntp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ntp.c,v
retrieving revision 1.17
diff -u -p -r1.17 print-ntp.c
--- print-ntp.c 16 Nov 2015 00:16:39 -0000 1.17
+++ print-ntp.c 4 Jul 2018 03:29:21 -0000
@@ -67,7 +67,7 @@ ntp_print(const u_char *cp, u_int length
TCHECK(bp->status);
version = (int)(bp->status & VERSIONMASK) >> 3;
- printf(" v%d", version);
+ printf("v%d", version);
leapind = bp->status & LEAPMASK;
switch (leapind) {
Index: print-radius.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-radius.c,v
retrieving revision 1.11
diff -u -p -r1.11 print-radius.c
--- print-radius.c 16 Nov 2015 00:16:39 -0000 1.11
+++ print-radius.c 4 Jul 2018 03:29:21 -0000
@@ -241,7 +241,7 @@ void radius_print(const u_char *data, u_
int first, l, ac, al;
if(len < sizeof(struct radius_header)) {
- fputs(" [|radius]", stdout);
+ fputs("[|radius]", stdout);
return;
}
@@ -249,15 +249,15 @@ void radius_print(const u_char *data, u_
if(rhp->code > DEFINED_OPCODES ||
rhp->code < 1)
- fprintf(stdout, " Code:%d id:%x [%d]",
+ fprintf(stdout, "Code:%d id:%x [%d]",
rhp->code, rhp->id, ntohs(rhp->len));
else
- fprintf(stdout, " %s id:%x [%d]",
+ fprintf(stdout, "%s id:%x [%d]",
radius_codes[rhp->code].name,
rhp->id, ntohs(rhp->len));
if(ntohs(rhp->len) > len) {
- fputs(" [|radius]", stdout);
+ fputs("[|radius]", stdout);
return;
}
Index: print-rip.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-rip.c,v
retrieving revision 1.16
diff -u -p -r1.16 print-rip.c
--- print-rip.c 16 Nov 2015 00:16:39 -0000 1.16
+++ print-rip.c 4 Jul 2018 03:29:21 -0000
@@ -159,7 +159,7 @@ rip_print(const u_char *dat, u_int lengt
i = min(length, snapend - dat) - sizeof(*rp);
if (i < 0) {
- printf(" [|rip]");
+ printf("[|rip]");
return;
}
@@ -167,21 +167,21 @@ rip_print(const u_char *dat, u_int lengt
switch (rp->rip_vers) {
case 0:
/* RFC 1058 */
- printf(" RIPv0: ");
+ printf("RIPv0: ");
rip_printblk((u_char *)(rp + 1), snapend);
break;
default:
switch (rp->rip_cmd) {
case RIPCMD_REQUEST:
- printf(" RIPv%d-req %d", rp->rip_vers, length);
+ printf("RIPv%d-req %d", rp->rip_vers, length);
break;
case RIPCMD_RESPONSE:
j = length / sizeof(*ni);
if (j * sizeof(*ni) != length - 4)
- printf(" RIPv%d-resp [items %d] [%d]:",
+ printf("RIPv%d-resp [items %d] [%d]:",
rp->rip_vers, j, length);
else
- printf(" RIPv%d-resp [items %d]:",
+ printf("RIPv%d-resp [items %d]:",
rp->rip_vers, j);
trunc = (i / sizeof(*ni)) != j;
ni = (struct rip_netinfo *)(rp + 1);
@@ -195,21 +195,21 @@ rip_print(const u_char *dat, u_int lengt
printf("[|rip]");
break;
case RIPCMD_TRACEON:
- printf(" RIPv%d-traceon %d: \"", rp->rip_vers, length);
+ printf("RIPv%d-traceon %d: \"", rp->rip_vers, length);
(void)fn_print((const u_char *)(rp + 1), snapend);
fputs("\"", stdout);
break;
case RIPCMD_TRACEOFF:
- printf(" RIPv%d-traceoff %d", rp->rip_vers, length);
+ printf("RIPv%d-traceoff %d", rp->rip_vers, length);
break;
case RIPCMD_POLL:
- printf(" RIPv%d-poll %d", rp->rip_vers, length);
+ printf("RIPv%d-poll %d", rp->rip_vers, length);
break;
case RIPCMD_POLLENTRY:
- printf(" RIPv%d-pollentry %d", rp->rip_vers, length);
+ printf("RIPv%d-pollentry %d", rp->rip_vers, length);
break;
default:
- printf(" RIPv%d-#%d %d", rp->rip_vers, rp->rip_cmd,
+ printf("RIPv%d-#%d %d", rp->rip_vers, rp->rip_cmd,
length);
break;
}
Index: print-ripng.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-ripng.c,v
retrieving revision 1.5
diff -u -p -r1.5 print-ripng.c
--- print-ripng.c 16 Nov 2015 00:16:39 -0000 1.5
+++ print-ripng.c 4 Jul 2018 03:29:21 -0000
@@ -75,13 +75,13 @@ ripng_print(const u_char *dat, int lengt
if (j == 1
&& rp->rip6_nets->rip6_metric == HOPCNT_INFINITY6
&& IN6_IS_ADDR_UNSPECIFIED(&rp->rip6_nets->rip6_dest)) {
- printf(" ripng-req dump");
+ printf("ripng-req dump");
break;
}
if (j * sizeof(*ni) != length - 4)
- printf(" ripng-req %d[%d]:", j, length);
+ printf("ripng-req %d[%d]:", j, length);
else
- printf(" ripng-req %d:", j);
+ printf("ripng-req %d:", j);
trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
for (ni = rp->rip6_nets; (i -= sizeof(*ni)) >= 0; ++ni) {
if (vflag)
@@ -94,9 +94,9 @@ ripng_print(const u_char *dat, int lengt
case RIP6_RESPONSE:
j = length / sizeof(*ni);
if (j * sizeof(*ni) != length - 4)
- printf(" ripng-resp %d[%d]:", j, length);
+ printf("ripng-resp %d[%d]:", j, length);
else
- printf(" ripng-resp %d:", j);
+ printf("ripng-resp %d:", j);
trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
for (ni = rp->rip6_nets; (i -= sizeof(*ni)) >= 0; ++ni) {
if (vflag)
@@ -109,7 +109,7 @@ ripng_print(const u_char *dat, int lengt
printf("[|rip]");
break;
default:
- printf(" ripng-%d ?? %d", rp->rip6_cmd, length);
+ printf("ripng-%d ?? %d", rp->rip6_cmd, length);
break;
}
if (rp->rip6_vers != RIP6_VERSION)
Index: print-snmp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-snmp.c,v
retrieving revision 1.21
diff -u -p -r1.21 print-snmp.c
--- print-snmp.c 15 Mar 2016 05:03:11 -0000 1.21
+++ print-snmp.c 4 Jul 2018 03:29:21 -0000
@@ -1048,8 +1048,6 @@ snmp_print(const u_char *np, u_int lengt
length = snapend - np;
}
- putchar(' ');
-
/* initial Sequence */
if ((count = asn1_parse(np, length, &elem)) < 0)
return;
Index: print-tftp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-tftp.c,v
retrieving revision 1.12
diff -u -p -r1.12 print-tftp.c
--- print-tftp.c 16 Nov 2015 00:16:39 -0000 1.12
+++ print-tftp.c 4 Jul 2018 03:29:21 -0000
@@ -77,7 +77,7 @@ tftp_print(const u_char *bp, u_int lengt
tp = (const struct tftphdr *)bp;
/* Print length */
- printf(" %d", length);
+ printf("%d", length);
/* Print tftp request type */
TCHECK(tp->th_opcode);
Index: print-udp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-udp.c,v
retrieving revision 1.42
diff -u -p -r1.42 print-udp.c
--- print-udp.c 3 Jul 2018 23:51:13 -0000 1.42
+++ print-udp.c 4 Jul 2018 03:29:21 -0000
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-udp.c,v 1.42 2018/07/03 23:51:13 dlg Exp $ */
+/* $OpenBSD: print-udp.c,v 1.41 2018/07/03 06:56:52 dlg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
@@ -118,14 +118,14 @@ vat_print(const void *hdr, u_int len, co
u_int ts = *(u_short *)hdr;
if ((ts & 0xf060) != 0) {
/* probably vt */
- (void)printf(" udp/vt %u %d / %d",
+ (void)printf("udp/vt %u %d / %d",
(u_int32_t)(ntohs(up->uh_ulen) - sizeof(*up)),
ts & 0x3ff, ts >> 10);
} else {
/* probably vat */
u_int i0 = ntohl(((u_int *)hdr)[0]);
u_int i1 = ntohl(((u_int *)hdr)[1]);
- printf(" udp/vat %u c%d %u%s",
+ printf("udp/vat %u c%d %u%s",
(u_int32_t)(ntohs(up->uh_ulen) - sizeof(*up) - 8),
i0 & 0xffff,
i1, i0 & 0x800000? "*" : "");
@@ -288,66 +288,6 @@ rtcp_print(const u_char *hdr, const u_ch
return (hdr + len);
}
-static int
-udp_cksum(const struct ip *ip, const struct udphdr *up, int len)
-{
- union phu {
- struct phdr {
- u_int32_t src;
- u_int32_t dst;
- u_char mbz;
- u_char proto;
- u_int16_t len;
- } ph;
- u_int16_t pa[6];
- } phu;
- const u_int16_t *sp;
- u_int32_t sum;
-
- /* pseudo-header.. */
- phu.ph.len = htons((u_int16_t)len);
- phu.ph.mbz = 0;
- phu.ph.proto = IPPROTO_UDP;
- memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
- memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
-
- sp = &phu.pa[0];
- sum = sp[0]+sp[1]+sp[2]+sp[3]+sp[4]+sp[5];
-
- return in_cksum((u_short *)up, len, sum);
-}
-
-#ifdef INET6
-static int
-udp6_cksum(const struct ip6_hdr *ip6, const struct udphdr *up, u_int len)
-{
- union {
- struct {
- struct in6_addr ph_src;
- struct in6_addr ph_dst;
- u_int32_t ph_len;
- u_int8_t ph_zero[3];
- u_int8_t ph_nxt;
- } ph;
- u_int16_t pa[20];
- } phu;
- size_t i;
- u_int32_t sum = 0;
-
- /* pseudo-header */
- memset(&phu, 0, sizeof(phu));
- phu.ph.ph_src = ip6->ip6_src;
- phu.ph.ph_dst = ip6->ip6_dst;
- phu.ph.ph_len = htonl(len);
- phu.ph.ph_nxt = IPPROTO_UDP;
-
- for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++)
- sum += phu.pa[i];
-
- return in_cksum((u_short *)up, len, sum);
-}
-#endif
-
/* XXX probably should use getservbyname() and cache answers */
#define TFTP_PORT 69 /*XXX*/
#define KERBEROS_PORT 88 /*XXX*/
@@ -383,101 +323,146 @@ udp6_cksum(const struct ip6_hdr *ip6, co
#endif
void
-udp_print(const u_char *bp, u_int length, const u_char *bp2)
+udp_print(const u_char *bp, u_int length, const void *iph)
{
const struct udphdr *up;
- const struct ip *ip;
const u_char *cp;
const u_char *ep = bp + length;
u_int16_t sport, dport, ulen;
-#ifdef INET6
- const struct ip6_hdr *ip6;
-#endif
+ const char *ipsrc = NULL, *ipdst = NULL;
+ unsigned int ipv = 0;
+ uint32_t cksum = IPPROTO_UDP;
if (ep > snapend)
ep = snapend;
- up = (struct udphdr *)bp;
- ip = (struct ip *)bp2;
+
+ if (iph != NULL) {
+ const struct ip *ip = iph;
+ ipv = ip->ip_v;
+
+ switch (ipv) {
#ifdef INET6
- if (ip->ip_v == 6)
- ip6 = (struct ip6_hdr *)bp2;
- else
- ip6 = NULL;
+ case 6: {
+ const struct ip6_hdr *ip6 = iph;
+
+ ipsrc = ip6addr_string(&ip6->ip6_src);
+ ipdst = ip6addr_string(&ip6->ip6_dst);
+
+ cksum = in_cksum_add(&ip6->ip6_src,
+ sizeof(ip6->ip6_src), cksum);
+ cksum = in_cksum_add(&ip6->ip6_dst,
+ sizeof(ip6->ip6_dst), cksum);
+ break;
+ }
#endif /*INET6*/
- cp = (u_char *)(up + 1);
+ case 4:
+ ipsrc = ipaddr_string(&ip->ip_src);
+ ipdst = ipaddr_string(&ip->ip_dst);
+
+ cksum = in_cksum_add(&ip->ip_src,
+ sizeof(ip->ip_src), cksum);
+ cksum = in_cksum_add(&ip->ip_dst,
+ sizeof(ip->ip_dst), cksum);
+ break;
+ }
+ }
+
+ up = (const struct udphdr *)bp;
+ cp = (const u_char *)(up + 1);
+
+ /* check if the udp header was captured */
if (cp > snapend) {
+ if (ipv)
+ printf("%s > %s: ", ipsrc, ipdst);
+
printf("[|udp]");
return;
}
- if (length < sizeof(struct udphdr)) {
- (void)printf(" truncated-udp %d", length);
+
+ /* check if the packet payload is long enough */
+ if (length < sizeof(*up)) {
+ if (ipv)
+ printf("%s > %s: ", ipsrc, ipdst);
+
+ printf("truncated-udp %u", length);
return;
}
+
+ cksum = in_cksum_word(length, cksum);
length -= sizeof(struct udphdr);
sport = ntohs(up->uh_sport);
dport = ntohs(up->uh_dport);
ulen = ntohs(up->uh_ulen);
+
+ if (ipv) {
+ printf("%s.%s > %s.%s",
+ ipsrc, udpport_string(sport),
+ ipdst, udpport_string(dport));
+ } else {
+ printf("udp %s > %s",
+ udpport_string(sport),
+ udpport_string(dport));
+ }
+
+ if (vflag && ipv && TTEST2(cp[0], length)) {
+ uint16_t sum, usum = EXTRACT_16BITS(&up->uh_sum);
+
+ if (usum == 0) {
+ if (ipv == 4)
+ printf(" [no udp cksum]");
+ else
+ printf(" [invalid udp cksum 0]");
+ } else {
+ cksum = in_cksum_word(sport, cksum);
+ cksum = in_cksum_word(dport, cksum);
+ cksum = in_cksum_word(ulen, cksum);
+
+ sum = in_cksum(cp, length, cksum);
+
+ if (sum == usum)
+ printf(" [udp sum ok]");
+ else {
+ printf(" [bad udp cksum %x! -> %x]",
+ usum, sum);
+ }
+ }
+ }
+
+ printf(": ");
+
if (packettype) {
struct rpc_msg *rp;
enum msg_type direction;
switch (packettype) {
-
case PT_VAT:
- (void)printf("%s.%s > %s.%s:",
- ipaddr_string(&ip->ip_src),
- udpport_string(sport),
- ipaddr_string(&ip->ip_dst),
- udpport_string(dport));
- vat_print((void *)(up + 1), length, up);
+ vat_print(cp, length, up);
break;
case PT_WB:
- (void)printf("%s.%s > %s.%s:",
- ipaddr_string(&ip->ip_src),
- udpport_string(sport),
- ipaddr_string(&ip->ip_dst),
- udpport_string(dport));
wb_print((void *)(up + 1), length);
break;
case PT_RPC:
- (void)printf("%s.%s > %s.%s: ",
- ipaddr_string(&ip->ip_src),
- udpport_string(sport),
- ipaddr_string(&ip->ip_dst),
- udpport_string(dport));
rp = (struct rpc_msg *)(up + 1);
direction = (enum msg_type)ntohl(rp->rm_direction);
if (direction == CALL)
- sunrpcrequest_print((u_char *)rp, length,
- (u_char *)ip);
+ sunrpcrequest_print((u_char *)rp, length, iph);
else
- nfsreply_print((u_char *)rp, length,
- (u_char *)ip); /*XXX*/
+ nfsreply_print((u_char *)rp, length, iph);
break;
case PT_RTP:
- (void)printf("%s.%s > %s.%s:",
- ipaddr_string(&ip->ip_src),
- udpport_string(sport),
- ipaddr_string(&ip->ip_dst),
- udpport_string(dport));
rtp_print((void *)(up + 1), length, up);
break;
case PT_RTCP:
- (void)printf("%s.%s > %s.%s:",
- ipaddr_string(&ip->ip_src),
- udpport_string(sport),
- ipaddr_string(&ip->ip_dst),
- udpport_string(dport));
while (cp < ep)
cp = rtcp_print(cp, ep);
break;
case PT_CNFP:
- cnfp_print(cp, length, (u_char *)ip);
+ cnfp_print(cp, length);
break;
}
return;
@@ -491,33 +476,16 @@ udp_print(const u_char *bp, u_int length
if (TTEST(rp->rm_direction)) {
direction = (enum msg_type)ntohl(rp->rm_direction);
if (dport == NFS_PORT && direction == CALL) {
- (void)printf("%s.%s > %s.%s: ",
- ipaddr_string(&ip->ip_src),
- udpport_string(sport),
- ipaddr_string(&ip->ip_dst),
- udpport_string(dport));
- nfsreq_print((u_char *)rp, length,
- (u_char *)ip);
+ nfsreq_print((u_char *)rp, length, iph);
return;
}
if (sport == NFS_PORT && direction == REPLY) {
- (void)printf("%s.%s > %s.%s: ",
- ipaddr_string(&ip->ip_src),
- udpport_string(sport),
- ipaddr_string(&ip->ip_dst),
- udpport_string(dport));
- nfsreply_print((u_char *)rp, length,
- (u_char *)ip);
+ nfsreply_print((u_char *)rp, length, iph);
return;
}
#ifdef notdef
if (dport == SUNRPC_PORT && direction == CALL) {
- (void)printf("%s.%s > %s.%s: ",
- ipaddr_string(&ip->ip_src),
- udpport_string(sport),
- ipaddr_string(&ip->ip_dst),
- udpport_string(dport));
- sunrpcrequest_print((u_char *)rp, length,
(u_char *)ip);
+ sunrpcrequest_print((u_char *)rp, length, iph);
return;
}
#endif
@@ -531,68 +499,6 @@ udp_print(const u_char *bp, u_int length
return;
}
}
-#if 0
- (void)printf("%s.%s > %s.%s:",
- ipaddr_string(&ip->ip_src), udpport_string(sport),
- ipaddr_string(&ip->ip_dst), udpport_string(dport));
-#else
-#ifdef INET6
- if (ip6) {
- if (ip6->ip6_nxt == IPPROTO_UDP) {
- (void)printf("%s.%s > %s.%s:",
- ip6addr_string(&ip6->ip6_src),
- udpport_string(sport),
- ip6addr_string(&ip6->ip6_dst),
- udpport_string(dport));
- } else {
- (void)printf("%s > %s: ",
- udpport_string(sport), udpport_string(dport));
- }
- } else
-#endif /*INET6*/
- {
- if (ip->ip_p == IPPROTO_UDP) {
- (void)printf("%s.%s > %s.%s:",
- ipaddr_string(&ip->ip_src),
- udpport_string(sport),
- ipaddr_string(&ip->ip_dst),
- udpport_string(dport));
- } else {
- (void)printf("%s > %s:",
- udpport_string(sport), udpport_string(dport));
- }
- }
-#endif
-
- if (ip->ip_v == 4 && vflag) {
- u_int16_t sum, udp_sum = EXTRACT_16BITS(&up->uh_sum);
- if (udp_sum == 0) {
- (void)printf(" [no udp cksum]");
- } else if (TTEST2(cp[0], length)) {
- sum = udp_cksum(ip, up, length + sizeof(struct udphdr));
- if (sum != 0)
- (void)printf(" [bad udp cksum %x! -> %x]",
udp_sum,
- in_cksum_shouldbe(udp_sum, sum));
- else
- (void)printf(" [udp sum ok]");
- }
- }
-#ifdef INET6
- if (ip->ip_v == 6 && ip6->ip6_plen && vflag) {
- u_int16_t sum, udp_sum = EXTRACT_16BITS(&up->uh_sum);
- /* for IPv6, UDP checksum is mandatory */
- if (udp_sum == 0) {
- (void)printf(" [invalid udp cksum 0]");
- } else if (TTEST2(cp[0], length)) {
- sum = udp6_cksum(ip6, up, length + sizeof(struct
udphdr));
- if (sum != 0)
- (void)printf(" [bad udp cksum %x! -> %x]",
udp_sum,
- in_cksum_shouldbe(udp_sum, sum));
- else
- (void)printf(" [udp sum ok]");
- }
- }
-#endif
if (!qflag) {
#define ISPORT(p) (dport == (p) || sport == (p))
@@ -620,7 +526,7 @@ udp_print(const u_char *bp, u_int length
else if (ISPORT(L2TP_PORT))
l2tp_print((const u_char *)(up + 1), length);
else if (ISPORT(UDPENCAP_PORT))
- udpencap_print((const u_char *)(up + 1), length, bp2);
+ udpencap_print((const u_char *)(up + 1), length, iph);
else if (ISPORT(ISAKMP_PORT))
ike_print((const u_char *)(up + 1), length);
#if 0
@@ -640,10 +546,8 @@ udp_print(const u_char *bp, u_int length
iapp_print((const u_char *)(up + 1), length);
else if (ISPORT(VQP_PORT))
vqp_print((const u_char *)(up + 1), length);
- else if (ISPORT(GRE_PORT)) {
- printf(" ");
+ else if (ISPORT(GRE_PORT))
gre_print((const u_char *)(up + 1), length);
- }
#ifdef INET6
else if (ISPORT(RIPNG_PORT))
ripng_print((const u_char *)(up + 1), length);
@@ -664,9 +568,8 @@ udp_print(const u_char *bp, u_int length
else if (dport == HSRP_PORT)
hsrp_print((const u_char *)(up + 1), length);
else
- (void)printf(" udp %u",
- (u_int32_t)(ulen - sizeof(*up)));
+ printf("udp %u", length);
#undef ISPORT
} else
- (void)printf(" udp %u", (u_int32_t)(ulen - sizeof(*up)));
+ printf("udp %u", length);
}
Index: print-udpencap.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-udpencap.c,v
retrieving revision 1.5
diff -u -p -r1.5 print-udpencap.c
--- print-udpencap.c 27 Oct 2009 23:59:57 -0000 1.5
+++ print-udpencap.c 4 Jul 2018 03:29:21 -0000
@@ -36,24 +36,18 @@ udpencap_print(const u_char *bp, u_int l
/* Recognize NAT-T Keepalive msgs. (draft-ietf-ipsec-udp-encaps-nn) */
if (len == 1 && *bp == 0xFF) {
- if (vflag)
- fputs(" ", stdout);
fputs("NAT-T Keepalive", stdout);
return;
}
if (len < sizeof(u_int32_t)) {
- fputs(" [|udpencap]", stdout);
+ fputs("[|udpencap]", stdout);
return;
}
- if (vflag)
- fputs(" ", stdout);
- fputs("udpencap:", stdout);
+ fputs("udpencap: ", stdout);
spi = (u_int32_t *)(bp);
if (*spi == 0)
ike_print(bp + sizeof(u_int32_t), len - sizeof(u_int32_t));
- else {
- fputs(" ", stdout);
+ else
esp_print(bp, len, bp2);
- }
}
Index: print-vqp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-vqp.c,v
retrieving revision 1.7
diff -u -p -r1.7 print-vqp.c
--- print-vqp.c 24 Aug 2006 05:11:43 -0000 1.7
+++ print-vqp.c 4 Jul 2018 03:29:21 -0000
@@ -217,7 +217,7 @@ vqp_print(const u_char *bp, u_int len)
u_int dcount;
TCHECK(p->version);
- printf(" VQPv%u", p->version);
+ printf("VQPv%u", p->version);
if (p->version != 1)
return;
TCHECK(p->opcode);
Index: print-wb.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-wb.c,v
retrieving revision 1.10
diff -u -p -r1.10 print-wb.c
--- print-wb.c 30 Aug 2017 09:23:00 -0000 1.10
+++ print-wb.c 4 Jul 2018 03:29:21 -0000
@@ -178,7 +178,7 @@ wb_id(const struct pkt_id *id, u_int len
char c;
int nid;
- printf(" wb-id:");
+ printf("wb-id:");
len -= sizeof(*id);
if ((u_char *)(id + 1) > snapend)
return (-1);
@@ -217,7 +217,7 @@ wb_id(const struct pkt_id *id, u_int len
static int
wb_rreq(const struct pkt_rreq *rreq, u_int len)
{
- printf(" wb-rreq:");
+ printf("wb-rreq:");
if (len < sizeof(*rreq) || (u_char *)(rreq + 1) > snapend)
return (-1);
@@ -233,7 +233,7 @@ wb_rreq(const struct pkt_rreq *rreq, u_i
static int
wb_preq(const struct pkt_preq *preq, u_int len)
{
- printf(" wb-preq:");
+ printf("wb-preq:");
if (len < sizeof(*preq) || (u_char *)(preq + 1) > snapend)
return (-1);
@@ -251,7 +251,7 @@ wb_prep(const struct pkt_prep *prep, u_i
const struct pgstate *ps;
const u_char *ep = snapend;
- printf(" wb-prep:");
+ printf("wb-prep:");
if (len < sizeof(*prep)) {
return (-1);
}
@@ -334,7 +334,7 @@ wb_rrep(const struct pkt_rrep *rrep, u_i
{
const struct pkt_dop *dop = &rrep->pr_dop;
- printf(" wb-rrep:");
+ printf("wb-rrep:");
len -= sizeof(*rrep);
if ((u_char *)(rrep + 1) > snapend)
return (-1);
@@ -355,7 +355,7 @@ wb_rrep(const struct pkt_rrep *rrep, u_i
static int
wb_drawop(const struct pkt_dop *dop, u_int len)
{
- printf(" wb-dop:");
+ printf("wb-dop:");
len -= sizeof(*dop);
if ((u_char *)(dop + 1) > snapend)
return (-1);
@@ -388,7 +388,7 @@ wb_print(const void *hdr, u_int len)
switch (ph->ph_type) {
case PT_KILL:
- printf(" wb-kill");
+ printf("wb-kill");
return;
case PT_ID:
@@ -422,7 +422,7 @@ wb_print(const void *hdr, u_int len)
break;
default:
- printf(" wb-%d!", ph->ph_type);
+ printf("wb-%d!", ph->ph_type);
return;
}
}