misc: Fix python scripts shebang line
[vpp.git] / test / test_ip6.py
index f829551..f5ed09f 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 import socket
 import unittest
@@ -20,10 +20,11 @@ from six import moves
 
 from framework import VppTestCase, VppTestRunner
 from util import ppp, ip6_normalize, mk_ll_addr
-from vpp_ip import DpoProto
+from vpp_ip import DpoProto, VppIpAddress
 from vpp_ip_route import VppIpRoute, VppRoutePath, find_route, VppIpMRoute, \
     VppMRoutePath, MRouteItfFlags, MRouteEntryFlags, VppMplsIpBind, \
-    VppMplsRoute, VppMplsTable, VppIpTable, FibPathType
+    VppMplsRoute, VppMplsTable, VppIpTable, FibPathType, \
+    VppIpInterfaceAddress
 from vpp_neighbor import find_nbr, VppNeighbor
 from vpp_pg_interface import is_ipv6_misc
 from vpp_sub_interface import VppSubInterface, VppDot1QSubint
@@ -239,7 +240,7 @@ class TestIPv6(TestIPv6ND):
         :param int packet_size: Required packet size.
         :param Scapy pkt: Packet to be modified.
         """
-        dst_if_idx = packet_size / 10 % 2
+        dst_if_idx = int(packet_size / 10 % 2)
         dst_if = self.flows[src_if][dst_if_idx]
         info = self.create_packet_info(src_if, dst_if)
         payload = self.info_to_payload(info)
@@ -935,6 +936,80 @@ class TestIPv6(TestIPv6ND):
         self.pg0.ip6_ra_config(no=1, suppress=1, send_unicast=0)
 
 
+class TestIPv6IfAddrRoute(VppTestCase):
+    """ IPv6 Interface Addr Route Test Case """
+
+    @classmethod
+    def setUpClass(cls):
+        super(TestIPv6IfAddrRoute, cls).setUpClass()
+
+    @classmethod
+    def tearDownClass(cls):
+        super(TestIPv6IfAddrRoute, cls).tearDownClass()
+
+    def setUp(self):
+        super(TestIPv6IfAddrRoute, self).setUp()
+
+        # create 1 pg interface
+        self.create_pg_interfaces(range(1))
+
+        for i in self.pg_interfaces:
+            i.admin_up()
+            i.config_ip6()
+            i.resolve_ndp()
+
+    def tearDown(self):
+        super(TestIPv6IfAddrRoute, self).tearDown()
+        for i in self.pg_interfaces:
+            i.unconfig_ip6()
+            i.admin_down()
+
+    def test_ipv6_ifaddrs_same_prefix(self):
+        """ IPv6 Interface Addresses Same Prefix test
+
+        Test scenario:
+
+            - Verify no route in FIB for prefix 2001:10::/64
+            - Configure IPv4 address 2001:10::10/64  on an interface
+            - Verify route in FIB for prefix 2001:10::/64
+            - Configure IPv4 address 2001:10::20/64 on an interface
+            - Delete 2001:10::10/64 from interface
+            - Verify route in FIB for prefix 2001:10::/64
+            - Delete 2001:10::20/64 from interface
+            - Verify no route in FIB for prefix 2001:10::/64
+        """
+
+        addr1 = "2001:10::10"
+        addr2 = "2001:10::20"
+
+        if_addr1 = VppIpInterfaceAddress(self, self.pg0,
+                                         VppIpAddress(addr1), 64)
+        if_addr2 = VppIpInterfaceAddress(self, self.pg0,
+                                         VppIpAddress(addr2), 64)
+        self.assertFalse(if_addr1.query_vpp_config())  # 2001:10::/64
+        self.assertFalse(find_route(self, addr1, 128))
+        self.assertFalse(find_route(self, addr2, 128))
+
+        # configure first address, verify route present
+        if_addr1.add_vpp_config()
+        self.assertTrue(if_addr1.query_vpp_config())  # 2001:10::/64
+        self.assertTrue(find_route(self, addr1, 128))
+        self.assertFalse(find_route(self, addr2, 128))
+
+        # configure second address, delete first, verify route not removed
+        if_addr2.add_vpp_config()
+        if_addr1.remove_vpp_config()
+        self.assertTrue(if_addr1.query_vpp_config())  # 2001:10::/64
+        self.assertFalse(find_route(self, addr1, 128))
+        self.assertTrue(find_route(self, addr2, 128))
+
+        # delete second address, verify route removed
+        if_addr2.remove_vpp_config()
+        self.assertFalse(if_addr1.query_vpp_config())  # 2001:10::/64
+        self.assertFalse(find_route(self, addr1, 128))
+        self.assertFalse(find_route(self, addr2, 128))
+
+
 class TestICMPv6Echo(VppTestCase):
     """ ICMPv6 Echo Test Case """
 
@@ -1224,7 +1299,7 @@ class TestIPv6RDControlPlane(TestIPv6ND):
         self.pg0.add_stream([packet])
         self.pg_start()
 
-        self.sleep(0.1)
+        self.sleep_on_vpp_time(0.1)
 
         fib = self.vapi.ip_route_dump(0, True)
 
@@ -1248,21 +1323,21 @@ class TestIPv6RDControlPlane(TestIPv6ND):
         self.pg0.add_stream([packet])
         self.pg_start()
 
-        self.sleep(0.1)
+        self.sleep_on_vpp_time(0.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.sleep(0.1)
+        self.sleep_on_vpp_time(0.1)
 
         # send RA
         packet = self.create_ra_packet(self.pg0)
         self.pg0.add_stream([packet])
         self.pg_start()
 
-        self.sleep(0.1)
+        self.sleep_on_vpp_time(0.1)
 
         # check FIB for new default route
         fib = self.vapi.ip_route_dump(0, True)
@@ -1277,7 +1352,7 @@ class TestIPv6RDControlPlane(TestIPv6ND):
         self.pg0.add_stream([packet])
         self.pg_start()
 
-        self.sleep(0.1)
+        self.sleep_on_vpp_time(0.1)
 
         # check that default route still exists
         fib = self.vapi.ip_route_dump(0, True)
@@ -1287,7 +1362,7 @@ class TestIPv6RDControlPlane(TestIPv6ND):
         self.assertEqual(dr['sw_if_index'], self.pg0.sw_if_index)
         self.assertEqual(dr['next_hop'], router_address)
 
-        self.sleep(1)
+        self.sleep_on_vpp_time(1)
 
         # check that default route is deleted
         fib = self.vapi.ip_route_dump(0, True)
@@ -1303,7 +1378,7 @@ class TestIPv6RDControlPlane(TestIPv6ND):
                              strict=False)
         self.assertEqual(prefix, IPv6Network(text_type('1::/20')))
 
-        self.sleep(1)
+        self.sleep_on_vpp_time(1)
 
         # check that SLAAC address is deleted
         fib = self.vapi.ip_route_dump(0, True)