aboutsummaryrefslogtreecommitdiffstats
path: root/test/test_ip4.py
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2017-10-21 09:37:55 -0700
committerDamjan Marion <dmarion.lists@gmail.com>2017-10-31 08:06:03 +0000
commit4c7c8e55b03e21787cafb11cd49b9488c5ffef70 (patch)
tree7e853bdaf7c4e1cc9cb6c15e121b93944892be5e /test/test_ip4.py
parentb3d1b203579226ca5136b9d6a2744577d07cfcc6 (diff)
Refactor IP input checks for re-use at MPLS disposition
Change-Id: I7aafdecd6f370411138e6ab67b2ff72cda6e0666 Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'test/test_ip4.py')
-rw-r--r--test/test_ip4.py135
1 files changed, 135 insertions, 0 deletions
diff --git a/test/test_ip4.py b/test/test_ip4.py
index 42fd1164a5f..b05635f95ee 100644
--- a/test/test_ip4.py
+++ b/test/test_ip4.py
@@ -1227,5 +1227,140 @@ class TestIPDeag(VppTestCase):
self.send_and_expect(self.pg0, pkts_src, self.pg2)
+class TestIPInput(VppTestCase):
+ """ IPv4 Input Exceptions """
+
+ def setUp(self):
+ super(TestIPInput, self).setUp()
+
+ self.create_pg_interfaces(range(2))
+
+ for i in self.pg_interfaces:
+ i.admin_up()
+ i.config_ip4()
+ i.resolve_arp()
+
+ def tearDown(self):
+ super(TestIPInput, self).tearDown()
+ for i in self.pg_interfaces:
+ i.unconfig_ip4()
+ i.admin_down()
+
+ def send_and_expect(self, input, pkts, output):
+ self.vapi.cli("clear trace")
+ input.add_stream(pkts)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+ rx = output.get_capture(len(pkts))
+ return rx
+
+ def send_and_assert_no_replies(self, intf, pkts, remark):
+ self.vapi.cli("clear trace")
+ intf.add_stream(pkts)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+ for i in self.pg_interfaces:
+ i.get_capture(0)
+ i.assert_nothing_captured(remark=remark)
+
+ def test_ip_input(self):
+ """ IP Input Exceptions """
+
+ # i can't find a way in scapy to construct an IP packet
+ # with a length less than the IP header length
+
+ #
+ # Packet too short - this is forwarded
+ #
+ p_short = (Ether(src=self.pg0.remote_mac,
+ dst=self.pg0.local_mac) /
+ IP(src=self.pg0.remote_ip4,
+ dst=self.pg1.remote_ip4,
+ len=40) /
+ UDP(sport=1234, dport=1234) /
+ Raw('\xa5' * 100))
+
+ rx = self.send_and_expect(self.pg0, p_short * 65, self.pg1)
+
+ #
+ # Packet too long - this is dropped
+ #
+ p_long = (Ether(src=self.pg0.remote_mac,
+ dst=self.pg0.local_mac) /
+ IP(src=self.pg0.remote_ip4,
+ dst=self.pg1.remote_ip4,
+ len=400) /
+ UDP(sport=1234, dport=1234) /
+ Raw('\xa5' * 100))
+
+ rx = self.send_and_assert_no_replies(self.pg0, p_long * 65,
+ "too long")
+
+ #
+ # bad chksum - this is dropped
+ #
+ p_chksum = (Ether(src=self.pg0.remote_mac,
+ dst=self.pg0.local_mac) /
+ IP(src=self.pg0.remote_ip4,
+ dst=self.pg1.remote_ip4,
+ chksum=400) /
+ UDP(sport=1234, dport=1234) /
+ Raw('\xa5' * 100))
+
+ rx = self.send_and_assert_no_replies(self.pg0, p_chksum * 65,
+ "bad checksum")
+
+ #
+ # bad version - this is dropped
+ #
+ p_ver = (Ether(src=self.pg0.remote_mac,
+ dst=self.pg0.local_mac) /
+ IP(src=self.pg0.remote_ip4,
+ dst=self.pg1.remote_ip4,
+ version=3) /
+ UDP(sport=1234, dport=1234) /
+ Raw('\xa5' * 100))
+
+ rx = self.send_and_assert_no_replies(self.pg0, p_ver * 65,
+ "funky version")
+
+ #
+ # fragment offset 1 - this is dropped
+ #
+ p_frag = (Ether(src=self.pg0.remote_mac,
+ dst=self.pg0.local_mac) /
+ IP(src=self.pg0.remote_ip4,
+ dst=self.pg1.remote_ip4,
+ frag=1) /
+ UDP(sport=1234, dport=1234) /
+ Raw('\xa5' * 100))
+
+ rx = self.send_and_assert_no_replies(self.pg0, p_frag * 65,
+ "frag offset")
+
+ #
+ # TTL expired packet
+ #
+ p_ttl = (Ether(src=self.pg0.remote_mac,
+ dst=self.pg0.local_mac) /
+ IP(src=self.pg0.remote_ip4,
+ dst=self.pg1.remote_ip4,
+ ttl=1) /
+ UDP(sport=1234, dport=1234) /
+ Raw('\xa5' * 100))
+
+ rx = self.send_and_expect(self.pg0, p_ttl * 65, self.pg0)
+
+ rx = rx[0]
+ icmp = rx[ICMP]
+
+ self.assertEqual(icmptypes[icmp.type], "time-exceeded")
+ self.assertEqual(icmpcodes[icmp.type][icmp.code],
+ "ttl-zero-during-transit")
+ self.assertEqual(icmp.src, self.pg0.remote_ip4)
+ self.assertEqual(icmp.dst, self.pg1.remote_ip4)
+
+ self.logger.error(self.vapi.cli("sh error"))
+
if __name__ == '__main__':
unittest.main(testRunner=VppTestRunner)