fib: fib api updates
[vpp.git] / test / test_neighbor.py
index 47f002c..69b00ea 100644 (file)
@@ -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, \
 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
 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
 
 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}
 
 # 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 """
 
 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()
 
     def setUp(self):
         super(ARPTestCase, self).setUp()
 
@@ -498,7 +511,7 @@ class ARPTestCase(VppTestCase):
                              self.pg1._remote_hosts[9].ip4)
 
         #
                              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) /
         # 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
         #
         #  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,
         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
         #
         #
         # 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
         #
 
         # Make pg2 un-numbered to pg0
         #
@@ -731,8 +744,8 @@ class ARPTestCase(VppTestCase):
         # cleanup
         #
         self.pg2.set_proxy_arp(0)
         # 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):
                                     is_add=0)
 
     def test_proxy_arp(self):
@@ -741,7 +754,7 @@ class ARPTestCase(VppTestCase):
         self.pg1.generate_remote_hosts(2)
 
         #
         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") /
         #
         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)
 
         #
         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,
         #
         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())
 
               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,
 
         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))
 
                   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.
         #
 
         #
         # 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,
 
         self.verify_ip(rx1[0],
                        self.pg1.local_mac,
@@ -1062,7 +1065,7 @@ class ARPTestCase(VppTestCase):
 
         #
         # remove the duplicate on pg1
 
         #
         # 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()
 
         #
         arp_pg1.remove_vpp_config()
 
@@ -1187,8 +1190,9 @@ class ARPTestCase(VppTestCase):
         #
         # change the interface's MAC
         #
         #
         # 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,
         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)
 
         #
                        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,
         # 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))
 
         #
                                  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",
         # 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,
         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,
         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
         # 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)
 
         # 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",
         forus.add_vpp_config()
 
         p = (Ether(dst="ff:ff:ff:ff:ff:ff",
@@ -1416,7 +1420,15 @@ class ARPTestCase(VppTestCase):
 
 
 class NeighborStatsTestCase(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()
 
     def setUp(self):
         super(NeighborStatsTestCase, self).setUp()
@@ -1471,14 +1483,14 @@ class NeighborStatsTestCase(VppTestCase):
               UDP(sport=1234, dport=1234) /
               Raw())
 
               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 """
 
     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,
         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,
         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,
         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'])
 
         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__':
 
 
 if __name__ == '__main__':