1 from scapy.layers.inet import IP, ICMP
3 from framework import VppTestCase
4 from vpp_ip_route import VppIpInterfaceAddress, VppIpRoute, VppRoutePath
5 from vpp_neighbor import VppNeighbor
7 """ TestPing is a subclass of VPPTestCase classes.
9 Basic test for sanity check of the ping.
14 class TestPing(VppTestCase):
19 super(TestPing, cls).setUpClass()
21 cls.create_pg_interfaces(range(2))
22 cls.interfaces = list(cls.pg_interfaces)
24 for i in cls.interfaces:
32 super(TestPing, cls).tearDownClass()
36 def tearDownClass(cls):
37 super(TestPing, cls).tearDownClass()
40 super(TestPing, self).tearDown()
42 def show_commands_at_teardown(self):
43 self.logger.info(self.vapi.cli("show hardware"))
45 def verify_ping_request(self, p, src, dst, seq):
47 self.assertEqual(ip.version, 4)
48 self.assertEqual(ip.flags, 0)
49 self.assertEqual(ip.src, src)
50 self.assertEqual(ip.dst, dst)
51 self.assertEqual(ip.proto, 1)
52 self.assertEqual(len(ip.options), 0)
53 self.assertGreaterEqual(ip.ttl, 254)
55 self.assertEqual(icmp.type, 8)
56 self.assertEqual(icmp.code, 0)
57 self.assertEqual(icmp.seq, seq)
60 def test_ping_basic(self):
63 self.pg_enable_capture(self.pg_interfaces)
65 self.logger.info(self.vapi.cli("show ip4 neighbors"))
66 self.logger.info(self.vapi.cli("show ip6 neighbors"))
68 remote_ip4 = self.pg1.remote_ip4
69 ping_cmd = "ping " + remote_ip4 + " interval 0.01 repeat 10"
70 ret = self.vapi.cli(ping_cmd)
72 out = self.pg1.get_capture(10)
76 icmp = self.verify_ping_request(
77 p, self.pg1.local_ip4, self.pg1.remote_ip4, icmp_seq
79 icmp_seq = icmp_seq + 1
83 self.assertEqual(icmp.id, icmp_id)
85 self.vapi.cli("show error")
87 def test_ping_burst(self):
90 self.pg_enable_capture(self.pg_interfaces)
92 self.logger.info(self.vapi.cli("show ip neighbors"))
94 remote_ip4 = self.pg1.remote_ip4
95 ping_cmd = "ping " + remote_ip4 + " interval 0.01 burst 3"
96 ret = self.vapi.cli(ping_cmd)
98 out = self.pg1.get_capture(3 * 5)
103 icmp = self.verify_ping_request(
104 p, self.pg1.local_ip4, self.pg1.remote_ip4, icmp_seq
108 icmp_seq = icmp_seq + 1
113 self.assertEqual(icmp.id, icmp_id)
115 self.vapi.cli("show error")
117 def test_ping_src(self):
118 """ping with source address set"""
120 self.pg_enable_capture(self.pg_interfaces)
122 self.logger.info(self.vapi.cli("show ip4 neighbors"))
123 self.logger.info(self.vapi.cli("show ip6 neighbors"))
125 nbr_addr = "10.0.0.2"
126 VppIpInterfaceAddress(self, self.pg1, "10.0.0.1", 24).add_vpp_config()
128 self, self.pg1.sw_if_index, "00:11:22:33:44:55", nbr_addr
131 ping_cmd = "ping %s interval 0.01 repeat 3" % self.pg1.remote_ip4
132 ret = self.vapi.cli(ping_cmd)
133 out = self.pg1.get_capture(3)
136 icmp = self.verify_ping_request(
137 p, self.pg1.local_ip4, self.pg1.remote_ip4, icmp_seq
139 icmp_seq = icmp_seq + 1
141 self.pg_enable_capture(self.pg_interfaces)
143 ping_cmd = "ping %s interval 0.01 repeat 3" % nbr_addr
144 ret = self.vapi.cli(ping_cmd)
145 out = self.pg1.get_capture(3)
148 icmp = self.verify_ping_request(p, "10.0.0.1", nbr_addr, icmp_seq)
149 icmp_seq = icmp_seq + 1
151 def test_ping_fib_routed_dst(self):
152 """ping destination routed according to FIB table"""
155 self.pg1.generate_remote_hosts(1)
156 self.pg_enable_capture(self.pg_interfaces)
158 routed_dst = "10.0.2.0"
159 self.logger.info(self.vapi.cli("show ip4 neighbors"))
164 [VppRoutePath(self.pg1.remote_hosts[0].ip4, self.pg1.sw_if_index)],
166 ping_cmd = "ping %s interval 0.01 repeat 3" % routed_dst
167 ret = self.vapi.cli(ping_cmd)
168 self.logger.info(ret)
169 out = self.pg1.get_capture(3)
172 self.verify_ping_request(p, self.pg1.local_ip4, routed_dst, icmp_seq)
173 icmp_seq = icmp_seq + 1
175 self.vapi.cli("show error")
177 def test_ping_api(self):
181 self.pg_enable_capture(self.pg_interfaces)
184 ret = self.vapi.want_ping_finished_events(
185 address=self.pg1.remote_ip4,
189 self.logger.info(ret)
192 ev = self.vapi.wait_for_event(timeout, "ping_finished_event")
194 self.assertEqual(ev.request_count, 4)
196 out = self.pg1.get_capture(4)
200 icmp = self.verify_ping_request(
201 p, self.pg1.local_ip4, self.pg1.remote_ip4, icmp_seq
203 icmp_seq = icmp_seq + 1
207 self.assertEqual(icmp.id, icmp_id)
209 self.vapi.cli("show error")