3 from scapy.layers.inet import IP, UDP, ICMP
4 from scapy.layers.inet6 import IPv6
5 from scapy.layers.l2 import Ether, GRE
6 from scapy.packet import Raw
8 from framework import VppTestCase
10 from vpp_ip_route import VppIpInterfaceAddress, VppIpRoute, VppRoutePath
11 from vpp_neighbor import VppNeighbor
13 """ TestPing is a subclass of VPPTestCase classes.
15 Basic test for sanity check of the ping.
20 class TestPing(VppTestCase):
25 super(TestPing, cls).setUpClass()
27 cls.create_pg_interfaces(range(2))
28 cls.interfaces = list(cls.pg_interfaces)
30 for i in cls.interfaces:
38 super(TestPing, cls).tearDownClass()
42 def tearDownClass(cls):
43 super(TestPing, cls).tearDownClass()
46 super(TestPing, self).tearDown()
48 def show_commands_at_teardown(self):
49 self.logger.info(self.vapi.cli("show hardware"))
51 def verify_ping_request(self, p, src, dst, seq):
53 self.assertEqual(ip.version, 4)
54 self.assertEqual(ip.flags, 0)
55 self.assertEqual(ip.src, src)
56 self.assertEqual(ip.dst, dst)
57 self.assertEqual(ip.proto, 1)
58 self.assertEqual(len(ip.options), 0)
59 self.assertGreaterEqual(ip.ttl, 254)
61 self.assertEqual(icmp.type, 8)
62 self.assertEqual(icmp.code, 0)
63 self.assertEqual(icmp.seq, seq)
66 def test_ping_basic(self):
69 self.pg_enable_capture(self.pg_interfaces)
71 self.logger.info(self.vapi.cli("show ip4 neighbors"))
72 self.logger.info(self.vapi.cli("show ip6 neighbors"))
74 remote_ip4 = self.pg1.remote_ip4
75 ping_cmd = "ping " + remote_ip4 + " interval 0.01 repeat 10"
76 ret = self.vapi.cli(ping_cmd)
78 out = self.pg1.get_capture(10)
82 icmp = self.verify_ping_request(
83 p, self.pg1.local_ip4, self.pg1.remote_ip4, icmp_seq
85 icmp_seq = icmp_seq + 1
89 self.assertEqual(icmp.id, icmp_id)
91 self.vapi.cli("show error")
93 def test_ping_burst(self):
96 self.pg_enable_capture(self.pg_interfaces)
98 self.logger.info(self.vapi.cli("show ip neighbors"))
100 remote_ip4 = self.pg1.remote_ip4
101 ping_cmd = "ping " + remote_ip4 + " interval 0.01 burst 3"
102 ret = self.vapi.cli(ping_cmd)
103 self.logger.info(ret)
104 out = self.pg1.get_capture(3 * 5)
109 icmp = self.verify_ping_request(
110 p, self.pg1.local_ip4, self.pg1.remote_ip4, icmp_seq
114 icmp_seq = icmp_seq + 1
119 self.assertEqual(icmp.id, icmp_id)
121 self.vapi.cli("show error")
123 def test_ping_src(self):
124 """ping with source address set"""
126 self.pg_enable_capture(self.pg_interfaces)
128 self.logger.info(self.vapi.cli("show ip4 neighbors"))
129 self.logger.info(self.vapi.cli("show ip6 neighbors"))
131 nbr_addr = "10.0.0.2"
132 VppIpInterfaceAddress(self, self.pg1, "10.0.0.1", 24).add_vpp_config()
134 self, self.pg1.sw_if_index, "00:11:22:33:44:55", nbr_addr
137 ping_cmd = "ping %s interval 0.01 repeat 3" % self.pg1.remote_ip4
138 ret = self.vapi.cli(ping_cmd)
139 out = self.pg1.get_capture(3)
142 icmp = self.verify_ping_request(
143 p, self.pg1.local_ip4, self.pg1.remote_ip4, icmp_seq
145 icmp_seq = icmp_seq + 1
147 self.pg_enable_capture(self.pg_interfaces)
149 ping_cmd = "ping %s interval 0.01 repeat 3" % nbr_addr
150 ret = self.vapi.cli(ping_cmd)
151 out = self.pg1.get_capture(3)
154 icmp = self.verify_ping_request(p, "10.0.0.1", nbr_addr, icmp_seq)
155 icmp_seq = icmp_seq + 1
157 def test_ping_fib_routed_dst(self):
158 """ping destination routed according to FIB table"""
161 self.pg1.generate_remote_hosts(1)
162 self.pg_enable_capture(self.pg_interfaces)
164 routed_dst = "10.0.2.0"
165 self.logger.info(self.vapi.cli("show ip4 neighbors"))
170 [VppRoutePath(self.pg1.remote_hosts[0].ip4, self.pg1.sw_if_index)],
172 ping_cmd = "ping %s interval 0.01 repeat 3" % routed_dst
173 ret = self.vapi.cli(ping_cmd)
174 self.logger.info(ret)
175 out = self.pg1.get_capture(3)
178 self.verify_ping_request(p, self.pg1.local_ip4, routed_dst, icmp_seq)
179 icmp_seq = icmp_seq + 1
181 self.vapi.cli("show error")
183 def test_ping_api(self):
187 self.pg_enable_capture(self.pg_interfaces)
190 ret = self.vapi.want_ping_finished_events(
191 address=self.pg1.remote_ip4,
195 self.logger.info(ret)
198 ev = self.vapi.wait_for_event(timeout, "ping_finished_event")
200 self.assertEqual(ev.request_count, 4)
202 out = self.pg1.get_capture(4)
206 icmp = self.verify_ping_request(
207 p, self.pg1.local_ip4, self.pg1.remote_ip4, icmp_seq
209 icmp_seq = icmp_seq + 1
213 self.assertEqual(icmp.id, icmp_id)
215 self.vapi.cli("show error")