Fix checksum comparison in traffic scripts 33/433/3
authorJuraj Sloboda <jsloboda@cisco.com>
Thu, 25 Feb 2016 15:03:51 +0000 (16:03 +0100)
committerGerrit Code Review <gerrit@fd.io>
Sat, 27 Feb 2016 09:07:56 +0000 (09:07 +0000)
Change-Id: Ibeff7c790ed4aba8b3a0534681912d0d5b826dbb
Signed-off-by: Juraj Sloboda <jsloboda@cisco.com>
resources/libraries/python/PacketVerifier.py
resources/traffic_scripts/icmpv6_echo.py
resources/traffic_scripts/icmpv6_echo_req_resp.py
resources/traffic_scripts/ipv4_sweep_ping.py
resources/traffic_scripts/ipv6_ns.py
resources/traffic_scripts/ipv6_sweep_ping.py

index 9af14e3..45fab6a 100644 (file)
@@ -73,7 +73,7 @@ from scapy.all import Ether, ARP, Packet
 from scapy.layers.inet6 import IPv6
 
 __all__ = ['RxQueue', 'TxQueue', 'Interface', 'create_gratuitous_arp_request',
 from scapy.layers.inet6 import IPv6
 
 __all__ = ['RxQueue', 'TxQueue', 'Interface', 'create_gratuitous_arp_request',
-           'auto_pad']
+           'auto_pad', 'checksum_equal']
 
 # TODO: http://stackoverflow.com/questions/320232/ensuring-subprocesses-are-dead-on-exiting-python-program
 
 
 # TODO: http://stackoverflow.com/questions/320232/ensuring-subprocesses-are-dead-on-exiting-python-program
 
@@ -305,3 +305,25 @@ def auto_pad(packet):
         padded += ('\0' * (60 - len(padded)))
     return padded
 
         padded += ('\0' * (60 - len(padded)))
     return padded
 
+
+def checksum_equal(chksum1, chksum2):
+    """Compares two checksums in one's complement notation.
+
+    Checksums to be compared are calculated as 16 bit one's complement of the
+    one's complement sum of 16 bit words of some buffer.
+    In one's complement notation 0x0000 (positive zero) and 0xFFFF
+    (negative zero) are equivalent.
+
+    :param chksum1: First checksum.
+    :param chksum2: Second checksum.
+    :type chksum1: uint16
+    :type chksum2: uint16
+
+    :return: True if checksums are equivalent, False otherwise.
+    :rtype: boolean
+    """
+    if chksum1 == 0xFFFF:
+        chksum1 = 0
+    if chksum2 == 0xFFFF:
+        chksum2 = 0
+    return chksum1 == chksum2
index 09198ab..4bf573a 100755 (executable)
@@ -18,7 +18,8 @@
 import sys
 import logging
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 import sys
 import logging
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
-from resources.libraries.python.PacketVerifier import RxQueue, TxQueue
+from resources.libraries.python.PacketVerifier import RxQueue, TxQueue,\
+    checksum_equal
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6NDOptDstLLAddr
 from scapy.layers.inet6 import ICMPv6EchoRequest, ICMPv6EchoReply
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6NDOptDstLLAddr
 from scapy.layers.inet6 import ICMPv6EchoRequest, ICMPv6EchoReply
@@ -83,7 +84,7 @@ def main():
     cksum = icmpv6.cksum
     del icmpv6.cksum
     tmp = ICMPv6EchoReply(str(icmpv6))
     cksum = icmpv6.cksum
     del icmpv6.cksum
     tmp = ICMPv6EchoReply(str(icmpv6))
-    if tmp.cksum != cksum:
+    if not checksum_equal(tmp.cksum, cksum):
         raise RuntimeError(
             'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))
 
         raise RuntimeError(
             'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))
 
index 582114c..c2cc4d2 100755 (executable)
@@ -19,7 +19,8 @@
 import sys
 import logging
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 import sys
 import logging
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
-from resources.libraries.python.PacketVerifier import RxQueue, TxQueue
+from resources.libraries.python.PacketVerifier import RxQueue, TxQueue,\
+    checksum_equal
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6NDOptDstLLAddr
 from scapy.layers.inet6 import ICMPv6EchoRequest, ICMPv6EchoReply
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6NDOptDstLLAddr
 from scapy.layers.inet6 import ICMPv6EchoRequest, ICMPv6EchoReply
@@ -104,7 +105,7 @@ def main():
     cksum = icmpv6.cksum
     del icmpv6.cksum
     tmp = ICMPv6EchoRequest(str(icmpv6))
     cksum = icmpv6.cksum
     del icmpv6.cksum
     tmp = ICMPv6EchoRequest(str(icmpv6))
-    if tmp.cksum != cksum:
+    if not checksum_equal(tmp.cksum, cksum):
         raise RuntimeError(
             'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))
 
         raise RuntimeError(
             'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))
 
@@ -149,7 +150,7 @@ def main():
     cksum = icmpv6.cksum
     del icmpv6.cksum
     tmp = ICMPv6EchoReply(str(icmpv6))
     cksum = icmpv6.cksum
     del icmpv6.cksum
     tmp = ICMPv6EchoReply(str(icmpv6))
-    if tmp.cksum != cksum:
+    if not checksum_equal(tmp.cksum, cksum):
         raise RuntimeError(
             'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))
 
         raise RuntimeError(
             'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))
 
index f7ce5cd..cd332d0 100755 (executable)
@@ -20,7 +20,7 @@ import logging
 import os
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 from resources.libraries.python.PacketVerifier import RxQueue, TxQueue,\
 import os
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 from resources.libraries.python.PacketVerifier import RxQueue, TxQueue,\
-    auto_pad, create_gratuitous_arp_request
+    auto_pad, create_gratuitous_arp_request, checksum_equal
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet import IP, ICMP
 from scapy.all import Ether, Raw
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet import IP, ICMP
 from scapy.all import Ether, Raw
@@ -90,7 +90,7 @@ def main():
         chksum = icmpv4.chksum
         del icmpv4.chksum
         tmp = ICMP(str(icmpv4))
         chksum = icmpv4.chksum
         del icmpv4.chksum
         tmp = ICMP(str(icmpv4))
-        if tmp.chksum != chksum:
+        if not checksum_equal(tmp.chksum, chksum):
             raise RuntimeError(
                 'Invalid checksum {0} should be {1}'.format(chksum, tmp.chksum))
 
             raise RuntimeError(
                 'Invalid checksum {0} should be {1}'.format(chksum, tmp.chksum))
 
index cfdca41..70c6ab4 100755 (executable)
@@ -18,7 +18,8 @@
 import sys
 import logging
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 import sys
 import logging
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
-from resources.libraries.python.PacketVerifier import RxQueue, TxQueue
+from resources.libraries.python.PacketVerifier import RxQueue, TxQueue,\
+    checksum_equal
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6ND_NS
 from scapy.layers.inet6 import ICMPv6NDOptDstLLAddr, ICMPv6NDOptSrcLLAddr
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6ND_NS
 from scapy.layers.inet6 import ICMPv6NDOptDstLLAddr, ICMPv6NDOptSrcLLAddr
@@ -86,7 +87,7 @@ def main():
     cksum = icmpv6_na.cksum
     del icmpv6_na.cksum
     tmp = ICMPv6ND_NA(str(icmpv6_na))
     cksum = icmpv6_na.cksum
     del icmpv6_na.cksum
     tmp = ICMPv6ND_NA(str(icmpv6_na))
-    if tmp.cksum != cksum:
+    if not checksum_equal(tmp.cksum, cksum):
         raise RuntimeError(
             'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))
 
         raise RuntimeError(
             'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))
 
index cf7dc9e..da14c5d 100755 (executable)
@@ -19,7 +19,8 @@ import sys
 import logging
 import os
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
 import logging
 import os
 logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
-from resources.libraries.python.PacketVerifier import RxQueue, TxQueue
+from resources.libraries.python.PacketVerifier import RxQueue, TxQueue,\
+    checksum_equal
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6NDOptDstLLAddr
 from scapy.layers.inet6 import ICMPv6EchoRequest, ICMPv6EchoReply
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
 from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6NDOptDstLLAddr
 from scapy.layers.inet6 import ICMPv6EchoRequest, ICMPv6EchoReply
@@ -94,7 +95,7 @@ def main():
         cksum = icmpv6.cksum
         del icmpv6.cksum
         tmp = ICMPv6EchoReply(str(icmpv6))
         cksum = icmpv6.cksum
         del icmpv6.cksum
         tmp = ICMPv6EchoReply(str(icmpv6))
-        if tmp.cksum != cksum:
+        if not checksum_equal(tmp.cksum, cksum):
             raise RuntimeError(
                 'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))
 
             raise RuntimeError(
                 'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum))