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):
21 """ Ping Test Case """
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):
67 """ basic ping test """
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(p, self.pg1.local_ip4,
83 self.pg1.remote_ip4, icmp_seq)
84 icmp_seq = icmp_seq + 1
88 self.assertEqual(icmp.id, icmp_id)
90 self.vapi.cli("show error")
92 def test_ping_burst(self):
93 """ burst ping test """
95 self.pg_enable_capture(self.pg_interfaces)
97 self.logger.info(self.vapi.cli("show ip neighbors"))
99 remote_ip4 = self.pg1.remote_ip4
100 ping_cmd = "ping " + remote_ip4 + " interval 0.01 burst 3"
101 ret = self.vapi.cli(ping_cmd)
102 self.logger.info(ret)
103 out = self.pg1.get_capture(3*5)
108 icmp = self.verify_ping_request(p, self.pg1.local_ip4,
109 self.pg1.remote_ip4, icmp_seq)
112 icmp_seq = icmp_seq + 1
117 self.assertEqual(icmp.id, icmp_id)
119 self.vapi.cli("show error")
121 def test_ping_src(self):
122 """ ping with source address set """
124 self.pg_enable_capture(self.pg_interfaces)
126 self.logger.info(self.vapi.cli("show ip4 neighbors"))
127 self.logger.info(self.vapi.cli("show ip6 neighbors"))
129 nbr_addr = "10.0.0.2"
130 VppIpInterfaceAddress(self, self.pg1, "10.0.0.1", 24).add_vpp_config()
131 VppNeighbor(self, self.pg1.sw_if_index,
133 nbr_addr).add_vpp_config()
135 ping_cmd = "ping %s interval 0.01 repeat 3" % self.pg1.remote_ip4
136 ret = self.vapi.cli(ping_cmd)
137 out = self.pg1.get_capture(3)
140 icmp = self.verify_ping_request(p, self.pg1.local_ip4,
141 self.pg1.remote_ip4, icmp_seq)
142 icmp_seq = icmp_seq + 1
144 self.pg_enable_capture(self.pg_interfaces)
146 ping_cmd = "ping %s interval 0.01 repeat 3" % nbr_addr
147 ret = self.vapi.cli(ping_cmd)
148 out = self.pg1.get_capture(3)
151 icmp = self.verify_ping_request(p, "10.0.0.1", nbr_addr, icmp_seq)
152 icmp_seq = icmp_seq + 1
154 def test_ping_fib_routed_dst(self):
155 """ ping destination routed according to FIB table """
158 self.pg1.generate_remote_hosts(1)
159 self.pg_enable_capture(self.pg_interfaces)
161 routed_dst = "10.0.2.0"
162 self.logger.info(self.vapi.cli("show ip4 neighbors"))
163 VppIpRoute(self, routed_dst, 24,
164 [VppRoutePath(self.pg1.remote_hosts[0].ip4,
165 self.pg1.sw_if_index)]).add_vpp_config()
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,
174 icmp_seq = icmp_seq + 1
176 self.vapi.cli("show error")