+class TestICMPEcho(VppTestCase):
+ """ ICMP Echo Test Case """
+
+ def setUp(self):
+ super(TestICMPEcho, self).setUp()
+
+ # create 1 pg interface
+ self.create_pg_interfaces(range(1))
+
+ for i in self.pg_interfaces:
+ i.admin_up()
+ i.config_ip4()
+ i.resolve_arp()
+
+ def tearDown(self):
+ super(TestICMPEcho, self).tearDown()
+ for i in self.pg_interfaces:
+ i.unconfig_ip4()
+ i.admin_down()
+
+ def test_icmp_echo(self):
+ """ VPP replies to ICMP Echo Request
+
+ Test scenario:
+
+ - Receive ICMP Echo Request message on pg0 interface.
+ - Check outgoing ICMP Echo Reply message on pg0 interface.
+ """
+
+ icmp_id = 0xb
+ icmp_seq = 5
+ icmp_load = '\x0a' * 18
+ p_echo_request = (Ether(src=self.pg0.remote_mac,
+ dst=self.pg0.local_mac) /
+ IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4) /
+ ICMP(id=icmp_id, seq=icmp_seq) /
+ Raw(load=icmp_load))
+
+ self.pg0.add_stream(p_echo_request)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+
+ rx = self.pg0.get_capture(1)
+ rx = rx[0]
+ ether = rx[Ether]
+ ipv4 = rx[IP]
+ icmp = rx[ICMP]
+
+ self.assertEqual(ether.src, self.pg0.local_mac)
+ self.assertEqual(ether.dst, self.pg0.remote_mac)
+
+ self.assertEqual(ipv4.src, self.pg0.local_ip4)
+ self.assertEqual(ipv4.dst, self.pg0.remote_ip4)
+
+ self.assertEqual(icmptypes[icmp.type], "echo-reply")
+ self.assertEqual(icmp.id, icmp_id)
+ self.assertEqual(icmp.seq, icmp_seq)
+ self.assertEqual(icmp[Raw].load, icmp_load)
+
+