ip: Protocol Independent IP Neighbors
[vpp.git] / test / test_ip6.py
index 205bea6..f5904d9 100644 (file)
@@ -137,6 +137,7 @@ class TestIPv6ND(VppTestCase):
 
     def send_and_expect_ns(self, tx_intf, rx_intf, pkts, tgt_ip,
                            filter_out_fn=is_ipv6_misc):
+        self.vapi.cli("clear trace")
         tx_intf.add_stream(pkts)
         self.pg_enable_capture(self.pg_interfaces)
         self.pg_start()
@@ -221,7 +222,6 @@ class TestIPv6(TestIPv6ND):
         """Run standard test teardown and log ``show ip6 neighbors``."""
         for i in self.interfaces:
             i.unconfig_ip6()
-            i.ip6_disable()
             i.admin_down()
         for i in self.sub_interfaces:
             i.remove_vpp_config()
@@ -577,9 +577,12 @@ class TestIPv6(TestIPv6ND):
                        self.pg0.remote_ip6,
                        self.pg1.remote_hosts[1].ip6)
 
-    def validate_ra(self, intf, rx, dst_ip=None, mtu=9000, pi_opt=None):
+    def validate_ra(self, intf, rx, dst_ip=None, src_ip=None,
+                    mtu=9000, pi_opt=None):
         if not dst_ip:
             dst_ip = intf.remote_ip6
+        if not src_ip:
+            src_ip = mk_ll_addr(intf.local_mac)
 
         # unicasted packets must come to the unicast mac
         self.assertEqual(rx[Ether].dst, intf.remote_mac)
@@ -594,8 +597,7 @@ class TestIPv6(TestIPv6ND):
 
         # and come from the router's link local
         self.assertTrue(in6_islladdr(rx[IPv6].src))
-        self.assertEqual(in6_ptop(rx[IPv6].src),
-                         in6_ptop(mk_ll_addr(intf.local_mac)))
+        self.assertEqual(in6_ptop(rx[IPv6].src), in6_ptop(src_ip))
 
         # it should contain the links MTU
         ra = rx[ICMPv6ND_RA]
@@ -634,7 +636,9 @@ class TestIPv6(TestIPv6ND):
 
     def send_and_expect_ra(self, intf, pkts, remark, dst_ip=None,
                            filter_out_fn=is_ipv6_misc,
-                           opt=None):
+                           opt=None,
+                           src_ip=None):
+        self.vapi.cli("clear trace")
         intf.add_stream(pkts)
         self.pg_enable_capture(self.pg_interfaces)
         self.pg_start()
@@ -642,7 +646,7 @@ class TestIPv6(TestIPv6ND):
 
         self.assertEqual(len(rx), 1)
         rx = rx[0]
-        self.validate_ra(intf, rx, dst_ip, pi_opt=opt)
+        self.validate_ra(intf, rx, dst_ip, src_ip=src_ip, pi_opt=opt)
 
     def test_rs(self):
         """ IPv6 Router Solicitation Exceptions
@@ -665,8 +669,7 @@ class TestIPv6(TestIPv6ND):
         #  - expect an RA in return
         #
         p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
-             IPv6(
-                 dst=self.pg0.local_ip6, src=self.pg0.remote_ip6) /
+             IPv6(dst=self.pg0.local_ip6, src=self.pg0.remote_ip6) /
              ICMPv6ND_RS())
         pkts = [p]
         self.send_and_expect_ra(self.pg0, pkts, "Genuine RS")
@@ -924,10 +927,18 @@ class TestIPv6(TestIPv6ND):
                                self.pg1.local_ip6_prefix_len),
                                is_no=1)
 
+        #
+        # change the link's link local, so we know that works too.
+        #
+        self.vapi.sw_interface_ip6_set_link_local_address(
+            sw_if_index=self.pg0.sw_if_index,
+            ip="fe80::88")
+
         self.pg0.ip6_ra_config(send_unicast=1)
         self.send_and_expect_ra(self.pg0, p,
                                 "RA with Prefix reverted to defaults",
-                                dst_ip=ll)
+                                dst_ip=ll,
+                                src_ip="fe80::88")
 
         #
         # Reset the periodic advertisements back to default values
@@ -1034,7 +1045,6 @@ class TestICMPv6Echo(VppTestCase):
         super(TestICMPv6Echo, self).tearDown()
         for i in self.pg_interfaces:
             i.unconfig_ip6()
-            i.ip6_disable()
             i.admin_down()
 
     def test_icmpv6_echo(self):
@@ -1158,7 +1168,7 @@ class TestIPv6RD(TestIPv6ND):
     def test_rd_receive_router_advertisement(self):
         """ Verify events triggered by received RA packets """
 
-        self.vapi.want_ip6_ra_events()
+        self.vapi.want_ip6_ra_events(enable=1)
 
         prefix_info_1 = ICMPv6NDOptPrefixInfo(
             prefix="1::2",
@@ -1264,6 +1274,17 @@ class TestIPv6RDControlPlane(TestIPv6ND):
                     list.append(str(entry.route.prefix.network_address))
         return list
 
+    def wait_for_no_default_route(self, n_tries=50, s_time=1):
+        while (n_tries):
+            fib = self.vapi.ip_route_dump(0, True)
+            default_routes = self.get_default_routes(fib)
+            if 0 is len(default_routes):
+                return True
+            n_tries = n_tries - 1
+            self.sleep(s_time)
+
+        return False
+
     def test_all(self):
         """ Test handling of SLAAC addresses and default routes """
 
@@ -1363,9 +1384,7 @@ class TestIPv6RDControlPlane(TestIPv6ND):
         self.sleep_on_vpp_time(1)
 
         # check that default route is deleted
-        fib = self.vapi.ip_route_dump(0, True)
-        default_routes = self.get_default_routes(fib)
-        self.assertEqual(len(default_routes), 0)
+        self.assertTrue(self.wait_for_no_default_route())
 
         # check FIB still contains the SLAAC address
         addresses = set(self.get_interface_addresses(fib, self.pg0))
@@ -1442,7 +1461,7 @@ class IPv6NDProxyTest(TestIPv6ND):
         # Add proxy support for the host
         #
         self.vapi.ip6nd_proxy_add_del(
-            ip=inet_pton(AF_INET6, self.pg0._remote_hosts[2].ip6),
+            is_add=1, ip=inet_pton(AF_INET6, self.pg0._remote_hosts[2].ip6),
             sw_if_index=self.pg1.sw_if_index)
 
         #
@@ -1509,7 +1528,7 @@ class IPv6NDProxyTest(TestIPv6ND):
                       lladdr=self.pg0._remote_hosts[2].mac))
 
         self.vapi.ip6nd_proxy_add_del(
-            ip=inet_pton(AF_INET6, self.pg0._remote_hosts[3].ip6),
+            is_add=1, ip=inet_pton(AF_INET6, self.pg0._remote_hosts[3].ip6),
             sw_if_index=self.pg2.sw_if_index)
 
         self.send_and_expect_na(self.pg2, ns_pg2,
@@ -1550,10 +1569,10 @@ class IPv6NDProxyTest(TestIPv6ND):
         #
         self.vapi.ip6nd_proxy_add_del(
             ip=inet_pton(AF_INET6, self.pg0._remote_hosts[2].ip6),
-            sw_if_index=self.pg1.sw_if_index, is_del=1)
+            sw_if_index=self.pg1.sw_if_index, is_add=0)
         self.vapi.ip6nd_proxy_add_del(
             ip=inet_pton(AF_INET6, self.pg0._remote_hosts[3].ip6),
-            sw_if_index=self.pg2.sw_if_index, is_del=1)
+            sw_if_index=self.pg2.sw_if_index, is_add=0)
 
         self.assertFalse(find_nbr(self,
                                   self.pg2.sw_if_index,