X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_neighbor.py;h=69b00ea6ff2783d42d070584ef09565afcd43bea;hb=097fa66b9;hp=47f002cd91a9195220f05fb3a70fbc880180b389;hpb=7425f9289bdc17d330044b0df0fc31cdeeca626b;p=vpp.git diff --git a/test/test_neighbor.py b/test/test_neighbor.py index 47f002cd91a..69b00ea6ff2 100644 --- a/test/test_neighbor.py +++ b/test/test_neighbor.py @@ -6,8 +6,10 @@ from socket import AF_INET, AF_INET6, inet_pton from framework import VppTestCase, VppTestRunner from vpp_neighbor import VppNeighbor, find_nbr from vpp_ip_route import VppIpRoute, VppRoutePath, find_route, \ - VppIpTable, DpoProto + VppIpTable, DpoProto, FibPathType +from vpp_papi import VppEnum +import scapy.compat from scapy.packet import Raw from scapy.layers.l2 import Ether, ARP, Dot1Q from scapy.layers.inet import IP, UDP @@ -15,6 +17,9 @@ from scapy.layers.inet6 import IPv6 from scapy.contrib.mpls import MPLS from scapy.layers.inet6 import IPv6 + +NUM_PKTS = 67 + # not exported by scapy, so redefined here arp_opts = {"who-has": 1, "is-at": 2} @@ -22,6 +27,14 @@ arp_opts = {"who-has": 1, "is-at": 2} class ARPTestCase(VppTestCase): """ ARP Test Case """ + @classmethod + def setUpClass(cls): + super(ARPTestCase, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + super(ARPTestCase, cls).tearDownClass() + def setUp(self): super(ARPTestCase, self).setUp() @@ -498,7 +511,7 @@ class ARPTestCase(VppTestCase): self.pg1._remote_hosts[9].ip4) # - # Add a hierachy of routes for a host in the sub-net. + # Add a hierarchy of routes for a host in the sub-net. # Should still get an ARP resp since the cover is attached # p = (Ether(dst="ff:ff:ff:ff:ff:ff", src=self.pg1.remote_mac) / @@ -597,8 +610,8 @@ class ARPTestCase(VppTestCase): # # 2 - don't respond to ARP request from an address not within the # interface's sub-net - # 2b - to a prxied address - # 2c - not within a differents interface's sub-net + # 2b - to a proxied address + # 2c - not within a different interface's sub-net p = (Ether(dst="ff:ff:ff:ff:ff:ff", src=self.pg0.remote_mac) / ARP(op="who-has", hwsrc=self.pg0.remote_mac, @@ -693,8 +706,8 @@ class ARPTestCase(VppTestCase): # # Configure Proxy ARP for the subnet on PG0addresses on pg0 # - self.vapi.proxy_arp_add_del(self.pg0._local_ip4n_subnet, - self.pg0._local_ip4n_bcast) + self.vapi.proxy_arp_add_del(self.pg0._local_ip4_subnet, + self.pg0._local_ip4_bcast) # Make pg2 un-numbered to pg0 # @@ -731,8 +744,8 @@ class ARPTestCase(VppTestCase): # cleanup # self.pg2.set_proxy_arp(0) - self.vapi.proxy_arp_add_del(self.pg0._local_ip4n_subnet, - self.pg0._local_ip4n_bcast, + self.vapi.proxy_arp_add_del(self.pg0._local_ip4_subnet, + self.pg0._local_ip4_bcast, is_add=0) def test_proxy_arp(self): @@ -741,7 +754,7 @@ class ARPTestCase(VppTestCase): self.pg1.generate_remote_hosts(2) # - # Proxy ARP rewquest packets for each interface + # Proxy ARP request packets for each interface # arp_req_pg0 = (Ether(src=self.pg0.remote_mac, dst="ff:ff:ff:ff:ff:ff") / @@ -909,7 +922,7 @@ class ARPTestCase(VppTestCase): self.pg2.generate_remote_hosts(2) # - # Add a reoute with out going label via an ARP unresolved next-hop + # Add a route with out going label via an ARP unresolved next-hop # ip_10_0_0_1 = VppIpRoute(self, "10.0.0.1", 32, [VppRoutePath(self.pg2.remote_hosts[1].ip4, @@ -971,11 +984,7 @@ class ARPTestCase(VppTestCase): UDP(sport=1234, dport=1234) / Raw()) - self.pg0.add_stream(p0) - self.pg_enable_capture(self.pg_interfaces) - self.pg_start() - - rx1 = self.pg1.get_capture(1) + rx1 = self.send_and_expect(self.pg0, [p0], self.pg1) self.verify_arp_req(rx1[0], self.pg1.local_mac, @@ -992,20 +1001,14 @@ class ARPTestCase(VppTestCase): hwsrc="00:00:5e:00:01:09", pdst=self.pg1.local_ip4, psrc=self.pg1.remote_ip4)) - self.pg1.add_stream(p1) - self.pg_enable_capture(self.pg_interfaces) - self.pg_start() + self.send_and_assert_no_replies(self.pg1, p1, "ARP reply") # # IP packet destined for pg1 remote host arrives on pg0 again. # VPP should have an ARP entry for that address now and the packet # should be sent out pg1. # - self.pg0.add_stream(p0) - self.pg_enable_capture(self.pg_interfaces) - self.pg_start() - - rx1 = self.pg1.get_capture(1) + rx1 = self.send_and_expect(self.pg0, [p0], self.pg1) self.verify_ip(rx1[0], self.pg1.local_mac, @@ -1062,7 +1065,7 @@ class ARPTestCase(VppTestCase): # # remove the duplicate on pg1 - # packet stream shoud generate ARPs out of pg1 + # packet stream should generate ARPs out of pg1 # arp_pg1.remove_vpp_config() @@ -1187,8 +1190,9 @@ class ARPTestCase(VppTestCase): # # change the interface's MAC # - mac = [chr(0x00), chr(0x00), chr(0x00), - chr(0x33), chr(0x33), chr(0x33)] + mac = [scapy.compat.chb(0x00), scapy.compat.chb(0x00), + scapy.compat.chb(0x00), scapy.compat.chb(0x33), + scapy.compat.chb(0x33), scapy.compat.chb(0x33)] mac_string = ''.join(mac) self.vapi.sw_interface_set_mac_address(self.pg1.sw_if_index, @@ -1214,7 +1218,7 @@ class ARPTestCase(VppTestCase): self.pg1.remote_hosts[1].ip4) # - # set the mac address on the inteface that does not have a + # set the mac address on the interface that does not have a # configured subnet and thus no glean # self.vapi.sw_interface_set_mac_address(self.pg2.sw_if_index, @@ -1283,7 +1287,7 @@ class ARPTestCase(VppTestCase): mac=self.pg1.remote_hosts[3].mac)) # - # GARPs (requets nor replies) for host we don't know yet + # GARPs (request nor replies) for host we don't know yet # don't result in new neighbour entries # p1 = (Ether(dst="ff:ff:ff:ff:ff:ff", @@ -1358,8 +1362,7 @@ class ARPTestCase(VppTestCase): ip_10_1 = VppIpRoute(self, "10::1", 128, [VppRoutePath(self.pg0.remote_hosts[1].ip6, self.pg0.sw_if_index, - proto=DpoProto.DPO_PROTO_IP6)], - is_ip6=1) + proto=DpoProto.DPO_PROTO_IP6)]) ip_10_1.add_vpp_config() p1 = (Ether(dst=self.pg1.local_mac, @@ -1387,15 +1390,16 @@ class ARPTestCase(VppTestCase): # Test that VPP responds with ARP requests to addresses that # are connected and local routes. # Use one of the 'remote' addresses in the subnet as a local address - # The intention of this route is that it then acts like a secondardy + # The intention of this route is that it then acts like a secondary # address added to an interface # self.pg0.generate_remote_hosts(2) - forus = VppIpRoute(self, self.pg0.remote_hosts[1].ip4, 32, - [VppRoutePath(self.pg0.remote_hosts[1].ip4, - self.pg0.sw_if_index)], - is_local=1) + forus = VppIpRoute( + self, self.pg0.remote_hosts[1].ip4, 32, + [VppRoutePath("0.0.0.0", + self.pg0.sw_if_index, + type=FibPathType.FIB_PATH_TYPE_LOCAL)]) forus.add_vpp_config() p = (Ether(dst="ff:ff:ff:ff:ff:ff", @@ -1416,7 +1420,15 @@ class ARPTestCase(VppTestCase): class NeighborStatsTestCase(VppTestCase): - """ ARP Test Case """ + """ ARP/ND Counters """ + + @classmethod + def setUpClass(cls): + super(NeighborStatsTestCase, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + super(NeighborStatsTestCase, cls).tearDownClass() def setUp(self): super(NeighborStatsTestCase, self).setUp() @@ -1471,14 +1483,14 @@ class NeighborStatsTestCase(VppTestCase): UDP(sport=1234, dport=1234) / Raw()) - rx = self.send_and_expect(self.pg0, p1 * 65, self.pg1) - rx = self.send_and_expect(self.pg0, p2 * 65, self.pg1) + rx = self.send_and_expect(self.pg0, p1 * NUM_PKTS, self.pg1) + rx = self.send_and_expect(self.pg0, p2 * NUM_PKTS, self.pg1) - self.assertEqual(65, arp1.get_stats()['packets']) - self.assertEqual(65, arp2.get_stats()['packets']) + self.assertEqual(NUM_PKTS, arp1.get_stats()['packets']) + self.assertEqual(NUM_PKTS, arp2.get_stats()['packets']) - rx = self.send_and_expect(self.pg0, p1 * 65, self.pg1) - self.assertEqual(130, arp1.get_stats()['packets']) + rx = self.send_and_expect(self.pg0, p1 * NUM_PKTS, self.pg1) + self.assertEqual(NUM_PKTS*2, arp1.get_stats()['packets']) def test_nd_stats(self): """ ND Counters """ @@ -1489,14 +1501,12 @@ class NeighborStatsTestCase(VppTestCase): nd1 = VppNeighbor(self, self.pg0.sw_if_index, self.pg0.remote_hosts[1].mac, - self.pg0.remote_hosts[1].ip6, - af=AF_INET6) + self.pg0.remote_hosts[1].ip6) nd1.add_vpp_config() nd2 = VppNeighbor(self, self.pg0.sw_if_index, self.pg0.remote_hosts[2].mac, - self.pg0.remote_hosts[2].ip6, - af=AF_INET6) + self.pg0.remote_hosts[2].ip6) nd2.add_vpp_config() p1 = (Ether(dst=self.pg1.local_mac, @@ -1518,8 +1528,8 @@ class NeighborStatsTestCase(VppTestCase): self.assertEqual(16, nd1.get_stats()['packets']) self.assertEqual(16, nd2.get_stats()['packets']) - rx = self.send_and_expect(self.pg1, p1 * 65, self.pg0) - self.assertEqual(81, nd1.get_stats()['packets']) + rx = self.send_and_expect(self.pg1, p1 * NUM_PKTS, self.pg0) + self.assertEqual(NUM_PKTS+16, nd1.get_stats()['packets']) if __name__ == '__main__':