summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlteo <lteo@openbsd.org>2014-06-20 04:04:52 +0000
committerlteo <lteo@openbsd.org>2014-06-20 04:04:52 +0000
commit127a37bf870689c2230ce51997a3e305721e5502 (patch)
treeec2f032ec8e01e91b2bc4f06374c504b2912cc43
parentImport in_cksum_shouldbe() from mainline tcpdump; this is needed by my (diff)
downloadwireguard-openbsd-127a37bf870689c2230ce51997a3e305721e5502.tar.xz
wireguard-openbsd-127a37bf870689c2230ce51997a3e305721e5502.zip
Instead of showing the difference between a bad checksum and a good
checksum, make tcpdump (with the -v flag) show the actual bad checksum within the IP/protocol header itself and what the good checksum should be, e.g. "[bad tcp cksum abcd! -> d1e6]" This change applies to IP, TCP (over IPv4 and IPv6), UDP (over IPv4 and IPv6), ICMP, and ICMPv6. This commit also fixes several inconsistencies in the way bad checksums were displayed for these protocols. Tested on amd64, i386, and macppc. ok henning@
-rw-r--r--usr.sbin/tcpdump/print-icmp.c13
-rw-r--r--usr.sbin/tcpdump/print-icmp6.c13
-rw-r--r--usr.sbin/tcpdump/print-ip.c11
-rw-r--r--usr.sbin/tcpdump/print-tcp.c22
-rw-r--r--usr.sbin/tcpdump/print-udp.c21
5 files changed, 46 insertions, 34 deletions
diff --git a/usr.sbin/tcpdump/print-icmp.c b/usr.sbin/tcpdump/print-icmp.c
index fcb51f4478a..14849ba2a61 100644
--- a/usr.sbin/tcpdump/print-icmp.c
+++ b/usr.sbin/tcpdump/print-icmp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-icmp.c,v 1.22 2014/01/11 04:40:45 lteo Exp $ */
+/* $OpenBSD: print-icmp.c,v 1.23 2014/06/20 04:04:52 lteo Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994, 1995, 1996
@@ -375,15 +375,18 @@ icmp_print(const u_char *bp, u_int length, const u_char *bp2)
}
(void)printf("icmp: %s", str);
if (vflag) {
- u_int16_t sum;
if (TTEST2(dp->icmp_type, length)) {
+ u_int16_t sum, icmp_sum;
sum = in_cksum((const u_short *)dp, length, 0);
- if (sum != 0)
- (void)printf(" [bad icmp cksum %x!]", sum);
+ if (sum != 0) {
+ icmp_sum = EXTRACT_16BITS(&dp->icmp_cksum);
+ (void)printf(" [bad icmp cksum %x! -> %x]", icmp_sum,
+ in_cksum_shouldbe(icmp_sum, sum));
+ }
else
(void)printf(" [icmp cksum ok]");
}
- }
+ }
if (vflag > 1 && !ICMP_INFOTYPE(dp->icmp_type) &&
TTEST(dp->icmp_ip)) {
(void)printf(" for ");
diff --git a/usr.sbin/tcpdump/print-icmp6.c b/usr.sbin/tcpdump/print-icmp6.c
index 0249039d27e..56a9559d87d 100644
--- a/usr.sbin/tcpdump/print-icmp6.c
+++ b/usr.sbin/tcpdump/print-icmp6.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-icmp6.c,v 1.12 2014/01/11 04:41:08 lteo Exp $ */
+/* $OpenBSD: print-icmp6.c,v 1.13 2014/06/20 04:04:52 lteo Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994
@@ -53,6 +53,7 @@
#include "interface.h"
#include "addrtoname.h"
+#include "extract.h"
void icmp6_opt_print(const u_char *, int);
void mld6_print(const u_char *);
@@ -485,12 +486,14 @@ icmp6_print(const u_char *bp, u_int length, const u_char *bp2)
break;
}
if (vflag) {
- u_int16_t sum;
if (TTEST2(dp->icmp6_type, length)) {
+ u_int16_t sum, icmp6_sum;
sum = icmp6_cksum(ip, dp, length);
- if (sum != 0)
- printf(" [bad icmp6 cksum %x!]", sum);
- else
+ if (sum != 0) {
+ icmp6_sum = EXTRACT_16BITS(&dp->icmp6_cksum);
+ printf(" [bad icmp6 cksum %x! -> %x]", icmp6_sum,
+ in_cksum_shouldbe(icmp6_sum, sum));
+ } else
printf(" [icmp6 cksum ok]");
}
}
diff --git a/usr.sbin/tcpdump/print-ip.c b/usr.sbin/tcpdump/print-ip.c
index c3324980fef..4fd1e8d1394 100644
--- a/usr.sbin/tcpdump/print-ip.c
+++ b/usr.sbin/tcpdump/print-ip.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-ip.c,v 1.37 2014/01/11 04:35:52 lteo Exp $ */
+/* $OpenBSD: print-ip.c,v 1.38 2014/06/20 04:04:52 lteo Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
@@ -627,7 +627,6 @@ ip_print(register const u_char *bp, register u_int length)
(void)printf(" [ttl %d]", (int)ip->ip_ttl);
if (vflag) {
- int sum;
char *sep = "";
printf(" (");
@@ -642,12 +641,12 @@ ip_print(register const u_char *bp, register u_int length)
(void)printf("%slen %u", sep, ntohs(ip->ip_len));
sep = ", ";
if ((u_char *)ip + hlen <= snapend) {
+ u_int16_t sum, ip_sum;
sum = in_cksum((const u_short *)ip, hlen, 0);
if (sum != 0) {
- (void)printf("%sbad cksum %x!", sep,
- ntohs(ip->ip_sum));
- if (vflag > 1)
- (void)printf(" differs by %x", htons(sum));
+ ip_sum = EXTRACT_16BITS(&ip->ip_sum);
+ (void)printf("%sbad ip cksum %x! -> %x", sep, ip_sum,
+ in_cksum_shouldbe(ip_sum, sum));
sep = ", ";
}
}
diff --git a/usr.sbin/tcpdump/print-tcp.c b/usr.sbin/tcpdump/print-tcp.c
index a0c46b3bec3..43ee76f2c58 100644
--- a/usr.sbin/tcpdump/print-tcp.c
+++ b/usr.sbin/tcpdump/print-tcp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-tcp.c,v 1.29 2014/02/05 21:12:19 florian Exp $ */
+/* $OpenBSD: print-tcp.c,v 1.30 2014/06/20 04:04:52 lteo Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
@@ -419,23 +419,27 @@ tcp_print(register const u_char *bp, register u_int length,
}
if (ip && ip->ip_v == 4 && vflag) {
- int sum;
if (TTEST2(tp->th_sport, length)) {
+ u_int16_t sum, tcp_sum;
sum = tcp_cksum(ip, tp, length);
- if (sum != 0)
- (void)printf(" [bad tcp cksum %x!]", sum);
- else
+ if (sum != 0) {
+ tcp_sum = EXTRACT_16BITS(&tp->th_sum);
+ (void)printf(" [bad tcp cksum %x! -> %x]", tcp_sum,
+ in_cksum_shouldbe(tcp_sum, sum));
+ } else
(void)printf(" [tcp sum ok]");
}
}
#ifdef INET6
if (ip6 && ip6->ip6_plen && vflag) {
- int sum;
if (TTEST2(tp->th_sport, length)) {
+ u_int16_t sum, tcp_sum;
sum = tcp6_cksum(ip6, tp, length);
- if (sum != 0)
- (void)printf(" [bad tcp cksum %x!]", sum);
- else
+ if (sum != 0) {
+ tcp_sum = EXTRACT_16BITS(&tp->th_sum);
+ (void)printf(" [bad tcp cksum %x! -> %x]", tcp_sum,
+ in_cksum_shouldbe(tcp_sum, sum));
+ } else
(void)printf(" [tcp sum ok]");
}
}
diff --git a/usr.sbin/tcpdump/print-udp.c b/usr.sbin/tcpdump/print-udp.c
index f1ecd7a83ef..dca0c68e93c 100644
--- a/usr.sbin/tcpdump/print-udp.c
+++ b/usr.sbin/tcpdump/print-udp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-udp.c,v 1.35 2014/01/26 18:03:27 naddy Exp $ */
+/* $OpenBSD: print-udp.c,v 1.36 2014/06/20 04:04:52 lteo Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
@@ -57,6 +57,7 @@
#include "interface.h"
#include "addrtoname.h"
+#include "extract.h"
#include "appletalk.h"
#include "nfsv2.h"
@@ -566,27 +567,29 @@ udp_print(register const u_char *bp, u_int length, register const u_char *bp2)
#endif
if (ip->ip_v == 4 && vflag) {
- int sum = up->uh_sum;
- if (sum == 0) {
- (void)printf(" [no cksum]");
+ 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!]", sum);
+ (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) {
- int sum = up->uh_sum;
+ u_int16_t sum, udp_sum = EXTRACT_16BITS(&up->uh_sum);
/* for IPv6, UDP checksum is mandatory */
- if (sum == 0) {
- (void)printf(" [invalid cksum 0]");
+ 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!]", sum);
+ (void)printf(" [bad udp cksum %x! -> %x]", udp_sum,
+ in_cksum_shouldbe(udp_sum, sum));
else
(void)printf(" [udp sum ok]");
}