tests: test vnet_calc_checksums_inline(...) 92/26692/3
authorDave Barach <dave@barachs.net>
Fri, 24 Apr 2020 13:43:14 +0000 (09:43 -0400)
committerDave Wallace <dwallacelf@gmail.com>
Fri, 24 Apr 2020 15:01:29 +0000 (15:01 +0000)
Use a hand-crafted packet generator script to inject packets with
deliberately broken ip4 and udp checksums - and the appropriate
checksum offload flags - into src/vnet/interface_output.c
vnet_interface_output_node_inline(...), and make sure that the
resulting checksums are correct.

Use the packet tracer to catch one of the packets. Parse through the
packet trace, and make sure that the checksums have been correctly
computed.

Type: test

Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: Ic08b4b64d7ef27061558a3abf0b79917ead254b5

test/test_offload.py [new file with mode: 0644]

diff --git a/test/test_offload.py b/test/test_offload.py
new file mode 100644 (file)
index 0000000..8b045bf
--- /dev/null
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3
+
+import unittest
+
+from framework import VppTestCase, VppTestRunner, running_gcov_tests
+from vpp_ip_route import VppIpTable, VppIpRoute, VppRoutePath
+
+
+class TestOffload(VppTestCase):
+    """ Offload Unit Test Cases """
+
+    @classmethod
+    def setUpClass(cls):
+        super(TestOffload, cls).setUpClass()
+
+    @classmethod
+    def tearDownClass(cls):
+        super(TestOffload, cls).tearDownClass()
+
+    def setUp(self):
+        super(TestOffload, self).setUp()
+
+    def tearDown(self):
+        super(TestOffload, self).tearDown()
+
+    def test_offload_unittest(self):
+        """ Checksum Offload Test """
+        cmds = ["loop create",
+                "set int ip address loop0 11.22.33.1/24",
+                "set int state loop0 up",
+                "loop create",
+                "set int ip address loop1 11.22.34.1/24",
+                "set int state loop1 up",
+                "set ip neighbor loop1 11.22.34.44 03:00:11:22:34:44",
+                "packet-generator new {\n"
+                "  name s0\n"
+                "  limit 100\n"
+                "  size 128-128\n"
+                "  interface loop0\n"
+                "  tx-interface loop1\n"
+                "  node loop1-output\n"
+                "  buffer-flags ip4 offload-ip-cksum offload-udp-cksum\n"
+                "  data {\n"
+                "    IP4: 1.2.3 -> dead.0000.0001\n"
+                "    UDP: 11.22.33.44 -> 11.22.34.44\n"
+                "      ttl 2 checksum 13\n"
+                "    UDP: 1234 -> 2345\n"
+                "      checksum 11\n"
+                "    incrementing 114\n"
+                "  }\n"
+                "}",
+                "trace add pg-input 1",
+                "pa en",
+                "show error"]
+
+        for cmd in cmds:
+            r = self.vapi.cli_return_response(cmd)
+            if r.retval != 0:
+                if hasattr(r, 'reply'):
+                    self.logger.info(cmd + " FAIL reply " + r.reply)
+                else:
+                    self.logger.info(cmd + " FAIL retval " + str(r.retval))
+
+        r = self.vapi.cli_return_response("show trace")
+        self.assertTrue(r.retval == 0)
+        self.assertTrue(hasattr(r, 'reply'))
+        rv = r.reply
+        look_here = rv.find('ethernet-input')
+        self.assertFalse(look_here == -1)
+        bad_checksum_index = rv[look_here:].find('should be')
+        self.assertTrue(bad_checksum_index == -1)
+
+if __name__ == '__main__':
+    unittest.main(testRunner=VppTestRunner)