From 27ba3118c1b7fb2efddac3ce2ec8ce5a3e26f554 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Tue, 10 Apr 2012 11:37:08 -0500 Subject: [PATCH] Change ICMPv6 checksum calculation to use IP_Hdr wrapper. So that src/dst addresses used in pseudo-header are correct when there's certain extension headers (routing/destination). Add ICMP/ICMPv6 checksum unit tests. --- src/ICMP.cc | 2 +- src/net_util.cc | 6 +++--- src/net_util.h | 5 ++--- testing/btest/Baseline/core.checksums/bad.out | 4 ++++ testing/btest/Baseline/core.checksums/good.out | 1 + .../btest/Traces/chksums/ip4-icmp-bad-chksum.pcap | Bin 0 -> 82 bytes .../Traces/chksums/ip4-icmp-good-chksum.pcap | Bin 0 -> 82 bytes .../Traces/chksums/ip6-icmp6-bad-chksum.pcap | Bin 0 -> 109 bytes .../Traces/chksums/ip6-icmp6-good-chksum.pcap | Bin 0 -> 109 bytes .../chksums/ip6-route0-icmp6-bad-chksum.pcap | Bin 0 -> 133 bytes .../chksums/ip6-route0-icmp6-good-chksum.pcap | Bin 0 -> 133 bytes testing/btest/core/checksums.test | 8 ++++++++ 12 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 testing/btest/Traces/chksums/ip4-icmp-bad-chksum.pcap create mode 100644 testing/btest/Traces/chksums/ip4-icmp-good-chksum.pcap create mode 100644 testing/btest/Traces/chksums/ip6-icmp6-bad-chksum.pcap create mode 100644 testing/btest/Traces/chksums/ip6-icmp6-good-chksum.pcap create mode 100644 testing/btest/Traces/chksums/ip6-route0-icmp6-bad-chksum.pcap create mode 100644 testing/btest/Traces/chksums/ip6-route0-icmp6-good-chksum.pcap diff --git a/src/ICMP.cc b/src/ICMP.cc index a5cfdbcb64..9bd004e7f8 100644 --- a/src/ICMP.cc +++ b/src/ICMP.cc @@ -62,7 +62,7 @@ void ICMP_Analyzer::DeliverPacket(int len, const u_char* data, break; case IPPROTO_ICMPV6: - chksum = icmp6_checksum(icmpp, ip->IP6_Hdr(), len); + chksum = icmp6_checksum(icmpp, ip, len); break; default: diff --git a/src/net_util.cc b/src/net_util.cc index 362a33b201..d91cf02de9 100644 --- a/src/net_util.cc +++ b/src/net_util.cc @@ -80,7 +80,7 @@ int mobility_header_checksum(const IP_Hdr* ip) } #endif -int icmp6_checksum(const struct icmp* icmpp, const struct ip6_hdr* ip6, int len) +int icmp6_checksum(const struct icmp* icmpp, const IP_Hdr* ip, int len) { // ICMP6 uses the same checksum function as ICMP4 but a different // pseudo-header over which it is computed. @@ -93,8 +93,8 @@ int icmp6_checksum(const struct icmp* icmpp, const struct ip6_hdr* ip6, int len) sum = 0; // Pseudo-header as for UDP over IPv6 above. - sum = ones_complement_checksum((void*) ip6->ip6_src.s6_addr, 16, sum); - sum = ones_complement_checksum((void*) ip6->ip6_dst.s6_addr, 16, sum); + sum = ones_complement_checksum(ip->SrcAddr(), sum); + sum = ones_complement_checksum(ip->DstAddr(), sum); uint32 l = htonl(len); sum = ones_complement_checksum((void*) &l, 4, sum); diff --git a/src/net_util.h b/src/net_util.h index 92f0880014..fb410503f4 100644 --- a/src/net_util.h +++ b/src/net_util.h @@ -65,18 +65,17 @@ inline int seq_delta(uint32 a, uint32 b) } class IPAddr; +class IP_Hdr; // Returns the ones-complement checksum of a chunk of b short-aligned bytes. extern int ones_complement_checksum(const void* p, int b, uint32 sum); extern int ones_complement_checksum(const IPAddr& a, uint32 sum); -extern int icmp6_checksum(const struct icmp* icmpp, const struct ip6_hdr* ip6, - int len); +extern int icmp6_checksum(const struct icmp* icmpp, const IP_Hdr* ip, int len); extern int icmp_checksum(const struct icmp* icmpp, int len); #ifdef ENABLE_MOBILE_IPV6 -class IP_Hdr; extern int mobility_header_checksum(const IP_Hdr* ip); #endif diff --git a/testing/btest/Baseline/core.checksums/bad.out b/testing/btest/Baseline/core.checksums/bad.out index cd3c799277..57089a72a6 100644 --- a/testing/btest/Baseline/core.checksums/bad.out +++ b/testing/btest/Baseline/core.checksums/bad.out @@ -1,9 +1,13 @@ 1332784981.078396 weird: bad_IP_checksum 1332784885.686428 weird: bad_TCP_checksum 1332784933.501023 weird: bad_UDP_checksum +1334075363.536871 weird: bad_ICMP_checksum 1332785210.013051 weird: routing0_hdr 1332785210.013051 weird: bad_TCP_checksum 1332782580.798420 weird: routing0_hdr 1332782580.798420 weird: bad_UDP_checksum +1334075111.800086 weird: routing0_hdr +1334075111.800086 weird: bad_ICMP_checksum 1332785250.469132 weird: bad_TCP_checksum 1332781342.923813 weird: bad_UDP_checksum +1334074939.467194 weird: bad_ICMP_checksum diff --git a/testing/btest/Baseline/core.checksums/good.out b/testing/btest/Baseline/core.checksums/good.out index 627a330928..4330967d8d 100644 --- a/testing/btest/Baseline/core.checksums/good.out +++ b/testing/btest/Baseline/core.checksums/good.out @@ -1,2 +1,3 @@ 1332785125.596793 weird: routing0_hdr 1332782508.592037 weird: routing0_hdr +1334075027.053380 weird: routing0_hdr diff --git a/testing/btest/Traces/chksums/ip4-icmp-bad-chksum.pcap b/testing/btest/Traces/chksums/ip4-icmp-bad-chksum.pcap new file mode 100644 index 0000000000000000000000000000000000000000..cc60d879c4a7895581a609caa47aebe32d7cfa5e GIT binary patch literal 82 zcmca|c+)~A1{MYwaA0F#U<7g=$G7;a8*(sc0ofqTAaJ|m()$y8PE5PBfP=x6fk6hO W%z^RSu>&g@Q-C;?gMon;q!0iERTH29 literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/chksums/ip4-icmp-good-chksum.pcap b/testing/btest/Traces/chksums/ip4-icmp-good-chksum.pcap new file mode 100644 index 0000000000000000000000000000000000000000..2b07326eabd4a1ba68f6b00bbefe7c072b372a08 GIT binary patch literal 82 zcmca|c+)~A1{MYwaA0F#U<7iO$G7;4=rS>A0ofqTAaJ|m()$y8PE5PBfP=x6fk6hO W%z^RSu>&g@Q-C;?gW>yskU{|aBo#0K literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/chksums/ip6-icmp6-bad-chksum.pcap b/testing/btest/Traces/chksums/ip6-icmp6-bad-chksum.pcap new file mode 100644 index 0000000000000000000000000000000000000000..ce1dfa547a3b787632159f67c65b6603c1284e5b GIT binary patch literal 109 zcmca|c+)~A1{MYwaA0F#U<7ik<68WGDX=rR0@)z^9}FO>+U_QR82nZa3XCj2fSTEv d9yI>{7xe!>Dt}gX0|NsuNU5c7LB3I;GXUYo9wYz& literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/chksums/ip6-icmp6-good-chksum.pcap b/testing/btest/Traces/chksums/ip6-icmp6-good-chksum.pcap new file mode 100644 index 0000000000000000000000000000000000000000..4051fa5bc550def32285d6d93fde68342216354e GIT binary patch literal 109 zcmca|c+)~A1{MYwaA0F#U<7jR$F}$j=x{K&0@)z^9}FO>+U_QR82nZa3XCj2fSTEv d9yI>{7xe!>Dt}gX14GDpkkax37dO9fGXUUU9{~UW literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/chksums/ip6-route0-icmp6-bad-chksum.pcap b/testing/btest/Traces/chksums/ip6-route0-icmp6-bad-chksum.pcap new file mode 100644 index 0000000000000000000000000000000000000000..15e11ed3261c33a8319dd27d48a80d65eedc942b GIT binary patch literal 133 zcmca|c+)~A1{MYwaA0F#U<7iW$F=x}nes5i0@)z^9}FO>+U_QR80y*%3XCj2fSTEv t9yI>{7xe!>Dt}hC6%*Jn1_efj3Lwh}qMw1Wfq{V+#LjbZOb;$~1pv0KAEf{Q literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/chksums/ip6-route0-icmp6-good-chksum.pcap b/testing/btest/Traces/chksums/ip6-route0-icmp6-good-chksum.pcap new file mode 100644 index 0000000000000000000000000000000000000000..b7924cab6fd6a5188614cdefb6d9db64e6a41ab8 GIT binary patch literal 133 zcmca|c+)~A1{MYwaA0F#U<7g|$F=ykTwq{`1+qc-KNvt%wcSksG1Rpk6c|~405!8S tJ!t&@FX;b&RQ{}ND<-gE3<``46+o5|L_YH*#jAhtzTu%%nN3jptnAs_$% literal 0 HcmV?d00001 diff --git a/testing/btest/core/checksums.test b/testing/btest/core/checksums.test index c01ab710af..f5b3230686 100644 --- a/testing/btest/core/checksums.test +++ b/testing/btest/core/checksums.test @@ -1,15 +1,23 @@ # @TEST-EXEC: bro -b -r $TRACES/chksums/ip4-bad-chksum.pcap >>bad.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip4-tcp-bad-chksum.pcap >>bad.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip4-udp-bad-chksum.pcap >>bad.out 2>&1 +# @TEST-EXEC: bro -b -r $TRACES/chksums/ip4-icmp-bad-chksum.pcap >>bad.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-route0-tcp-bad-chksum.pcap >>bad.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-route0-udp-bad-chksum.pcap >>bad.out 2>&1 +# @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-route0-icmp6-bad-chksum.pcap >>bad.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-tcp-bad-chksum.pcap >>bad.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-udp-bad-chksum.pcap >>bad.out 2>&1 +# @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-icmp6-bad-chksum.pcap >>bad.out 2>&1 + + # @TEST-EXEC: bro -b -r $TRACES/chksums/ip4-tcp-good-chksum.pcap >>good.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip4-udp-good-chksum.pcap >>good.out 2>&1 +# @TEST-EXEC: bro -b -r $TRACES/chksums/ip4-icmp-good-chksum.pcap >>good.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-route0-tcp-good-chksum.pcap >>good.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-route0-udp-good-chksum.pcap >>good.out 2>&1 +# @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-route0-icmp6-good-chksum.pcap >>good.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-tcp-good-chksum.pcap >>good.out 2>&1 # @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-udp-good-chksum.pcap >>good.out 2>&1 +# @TEST-EXEC: bro -b -r $TRACES/chksums/ip6-icmp6-good-chksum.pcap >>good.out 2>&1 # @TEST-EXEC: btest-diff bad.out # @TEST-EXEC: btest-diff good.out