VXLAN/TEST:validate vxlan del reply has valid sw_if_index
[vpp.git] / test / test_vxlan.py
index 9dccaf5..6bdcb25 100644 (file)
@@ -51,17 +51,23 @@ class TestVxlan(BridgeDomain, VppTestCase):
 
     # Method for checking VXLAN encapsulation.
     #
-    def check_encapsulation(self, pkt, vni, local_only=False):
+    def check_encapsulation(self, pkt, vni, local_only=False, mcast_pkt=False):
         # TODO: add error messages
         # Verify source MAC is VPP_MAC and destination MAC is MY_MAC resolved
         #  by VPP using ARP.
         self.assertEqual(pkt[Ether].src, self.pg0.local_mac)
         if not local_only:
-            self.assertEqual(pkt[Ether].dst, self.pg0.remote_mac)
+            if not mcast_pkt:
+                self.assertEqual(pkt[Ether].dst, self.pg0.remote_mac)
+            else:
+                self.assertEqual(pkt[Ether].dst, type(self).mcast_mac)
         # Verify VXLAN tunnel source IP is VPP_IP and destination IP is MY_IP.
         self.assertEqual(pkt[IP].src, self.pg0.local_ip4)
         if not local_only:
-            self.assertEqual(pkt[IP].dst, self.pg0.remote_ip4)
+            if not mcast_pkt:
+                self.assertEqual(pkt[IP].dst, self.pg0.remote_ip4)
+            else:
+                self.assertEqual(pkt[IP].dst, type(self).mcast_ip4)
         # Verify UDP destination port is VXLAN 4789, source UDP port could be
         #  arbitrary.
         self.assertEqual(pkt[UDP].dport, type(self).dport)
@@ -86,9 +92,40 @@ class TestVxlan(BridgeDomain, VppTestCase):
             cls.vapi.sw_interface_set_l2_bridge(r.sw_if_index, bd_id=vni)
 
     @classmethod
-    def add_del_mcast_load(cls, is_add):
+    def add_del_shared_mcast_dst_load(cls, is_add):
+        """
+        add or del tunnels sharing the same mcast dst
+        to test vxlan ref_count mechanism
+        """
+        n_shared_dst_tunnels = 2000
+        vni_start = 10000
+        vni_end = vni_start + n_shared_dst_tunnels
+        for vni in range(vni_start, vni_end):
+            r = cls.vapi.vxlan_add_del_tunnel(
+                src_addr=cls.pg0.local_ip4n,
+                dst_addr=cls.mcast_ip4n,
+                mcast_sw_if_index=1,
+                vni=vni,
+                is_add=is_add)
+            if r.sw_if_index == 0xffffffff:
+                raise "bad sw_if_index"
+
+    @classmethod
+    def add_shared_mcast_dst_load(cls):
+        cls.add_del_shared_mcast_dst_load(is_add=1)
+
+    @classmethod
+    def del_shared_mcast_dst_load(cls):
+        cls.add_del_shared_mcast_dst_load(is_add=0)
+
+    @classmethod
+    def add_del_mcast_tunnels_load(cls, is_add):
+        """
+        add or del tunnels to test vxlan stability
+        """
+        n_distinct_dst_tunnels = 200
         ip_range_start = 10
-        ip_range_end = 210
+        ip_range_end = ip_range_start + n_distinct_dst_tunnels
         for dest_ip4n in ip4n_range(cls.mcast_ip4n, ip_range_start,
                                     ip_range_end):
             vni = bytearray(dest_ip4n)[3]
@@ -100,12 +137,12 @@ class TestVxlan(BridgeDomain, VppTestCase):
                 is_add=is_add)
 
     @classmethod
-    def add_mcast_load(cls):
-        cls.add_del_mcast_load(is_add=1)
+    def add_mcast_tunnels_load(cls):
+        cls.add_del_mcast_tunnels_load(is_add=1)
 
     @classmethod
-    def del_mcast_load(cls):
-        cls.add_del_mcast_load(is_add=0)
+    def del_mcast_tunnels_load(cls):
+        cls.add_del_mcast_tunnels_load(is_add=0)
 
     # Class method to start the VXLAN test case.
     #  Overrides setUpClass method in VppTestCase class.
@@ -166,8 +203,10 @@ class TestVxlan(BridgeDomain, VppTestCase):
                                                 bd_id=cls.mcast_flood_bd)
 
             # Add and delete mcast tunnels to check stability
-            cls.add_mcast_load()
-            cls.del_mcast_load()
+            cls.add_shared_mcast_dst_load()
+            cls.add_mcast_tunnels_load()
+            cls.del_shared_mcast_dst_load()
+            cls.del_mcast_tunnels_load()
 
             # Setup vni 3 to test unicast flooding
             cls.ucast_flood_bd = 3