Fixes for 'make UNATTENDED=yes CC=clang CXX=clang verify'
[vpp.git] / test / test_dvr.py
index e7b68db..c0ce32c 100644 (file)
@@ -13,6 +13,7 @@ from scapy.packet import Raw
 from scapy.layers.l2 import Ether, Dot1Q, ARP
 from scapy.layers.inet import IP, UDP
 from util import ppp
 from scapy.layers.l2 import Ether, Dot1Q, ARP
 from scapy.layers.inet import IP, UDP
 from util import ppp
+from socket import AF_INET, inet_pton
 
 
 class TestDVR(VppTestCase):
 
 
 class TestDVR(VppTestCase):
@@ -107,22 +108,16 @@ class TestDVR(VppTestCase):
             self, ip_non_tag_bridged, 32,
             [VppRoutePath("0.0.0.0",
                           self.pg1.sw_if_index,
             self, ip_non_tag_bridged, 32,
             [VppRoutePath("0.0.0.0",
                           self.pg1.sw_if_index,
-                          proto=DpoProto.DPO_PROTO_ETHERNET)])
+                          is_dvr=1)])
         route_no_tag.add_vpp_config()
 
         #
         # Inject the packet that arrives and leaves on a non-tagged interface
         # Since it's 'bridged' expect that the MAC headed is unchanged.
         #
         route_no_tag.add_vpp_config()
 
         #
         # Inject the packet that arrives and leaves on a non-tagged interface
         # Since it's 'bridged' expect that the MAC headed is unchanged.
         #
-        self.pg0.add_stream(pkt_no_tag)
-
-        self.pg_enable_capture(self.pg_interfaces)
-        self.pg_start()
-
-        rx = self.pg1.get_capture(1)
-
-        self.assertEqual(rx[0][Ether].dst, pkt_no_tag[Ether].dst)
-        self.assertEqual(rx[0][Ether].src, pkt_no_tag[Ether].src)
+        rx = self.send_and_expect(self.pg0, pkt_no_tag * 65, self.pg1)
+        self.assert_same_mac_addr(pkt_no_tag, rx)
+        self.assert_has_no_tag(rx)
 
         #
         # Add routes to bridge the traffic via a tagged interface
 
         #
         # Add routes to bridge the traffic via a tagged interface
@@ -131,12 +126,12 @@ class TestDVR(VppTestCase):
             self, ip_tag_bridged, 32,
             [VppRoutePath("0.0.0.0",
                           sub_if_on_pg3.sw_if_index,
             self, ip_tag_bridged, 32,
             [VppRoutePath("0.0.0.0",
                           sub_if_on_pg3.sw_if_index,
-                          proto=DpoProto.DPO_PROTO_ETHERNET)])
+                          is_dvr=1)])
         route_with_tag.add_vpp_config()
 
         #
         route_with_tag.add_vpp_config()
 
         #
-        # Inject the packet that arrives and leaves on a non-tagged interface
-        # Since it's 'bridged' expect that the MAC headed is unchanged.
+        # Inject the packet that arrives non-tag and leaves on a tagged
+        # interface
         #
         rx = self.send_and_expect(self.pg0, pkt_tag * 65, self.pg3)
         self.assert_same_mac_addr(pkt_tag, rx)
         #
         rx = self.send_and_expect(self.pg0, pkt_tag * 65, self.pg3)
         self.assert_same_mac_addr(pkt_tag, rx)
@@ -172,9 +167,42 @@ class TestDVR(VppTestCase):
         self.assert_same_mac_addr(pkt_tag_to_tag, rx)
         self.assert_has_no_tag(rx)
 
         self.assert_same_mac_addr(pkt_tag_to_tag, rx)
         self.assert_has_no_tag(rx)
 
+        #
+        # Add an output L3 ACL that will block the traffic
+        #
+        rule_1 = ({'is_permit': 0,
+                   'is_ipv6': 0,
+                   'proto': 17,
+                   'srcport_or_icmptype_first': 1234,
+                   'srcport_or_icmptype_last': 1234,
+                   'src_ip_prefix_len': 32,
+                   'src_ip_addr': inet_pton(AF_INET, any_src_addr),
+                   'dstport_or_icmpcode_first': 1234,
+                   'dstport_or_icmpcode_last': 1234,
+                   'dst_ip_prefix_len': 32,
+                   'dst_ip_addr': inet_pton(AF_INET, ip_non_tag_bridged)})
+        acl = self.vapi.acl_add_replace(acl_index=4294967295,
+                                        r=[rule_1])
+
+        #
+        # Apply the ACL on the output interface
+        #
+        self.vapi.acl_interface_set_acl_list(self.pg1.sw_if_index,
+                                             0,
+                                             [acl.acl_index])
+
+        #
+        # Send packet's that should match the ACL and be dropped
+        #
+        rx = self.send_and_assert_no_replies(self.pg2, pkt_tag_to_non_tag * 65)
+
         #
         # cleanup
         #
         #
         # cleanup
         #
+        self.vapi.acl_interface_set_acl_list(self.pg1.sw_if_index,
+                                             0, [])
+        self.vapi.acl_del(acl.acl_index)
+
         self.vapi.sw_interface_set_l2_bridge(self.pg0.sw_if_index, 1,
                                              enable=0)
         self.vapi.sw_interface_set_l2_bridge(self.pg1.sw_if_index, 1,
         self.vapi.sw_interface_set_l2_bridge(self.pg0.sw_if_index, 1,
                                              enable=0)
         self.vapi.sw_interface_set_l2_bridge(self.pg1.sw_if_index, 1,
@@ -186,6 +214,21 @@ class TestDVR(VppTestCase):
         self.vapi.sw_interface_set_l2_bridge(self.loop0.sw_if_index,
                                              1, bvi=1, enable=0)
 
         self.vapi.sw_interface_set_l2_bridge(self.loop0.sw_if_index,
                                              1, bvi=1, enable=0)
 
+        #
+        # Do a FIB dump to make sure the paths are correctly reported as DVR
+        #
+        routes = self.vapi.ip_fib_dump()
+
+        for r in routes:
+            if (inet_pton(AF_INET, ip_tag_bridged) == r.address):
+                self.assertEqual(r.path[0].sw_if_index,
+                                 sub_if_on_pg3.sw_if_index)
+                self.assertEqual(r.path[0].is_dvr, 1)
+            if (inet_pton(AF_INET, ip_non_tag_bridged) == r.address):
+                self.assertEqual(r.path[0].sw_if_index,
+                                 self.pg1.sw_if_index)
+                self.assertEqual(r.path[0].is_dvr, 1)
+
         #
         # the explicit route delete is require so it happens before
         # the sbu-interface delete. subinterface delete is required
         #
         # the explicit route delete is require so it happens before
         # the sbu-interface delete. subinterface delete is required
@@ -258,7 +301,7 @@ class TestDVR(VppTestCase):
                                                   93)
 
         #
                                                   93)
 
         #
-        # Disable UU flooding, learning and ARM terminaation. makes this test
+        # Disable UU flooding, learning and ARP terminaation. makes this test
         # easier as unicast packets are dropped if not extracted.
         #
         self.vapi.bridge_flags(1, 0, (1 << 0) | (1 << 3) | (1 << 4))
         # easier as unicast packets are dropped if not extracted.
         #
         self.vapi.bridge_flags(1, 0, (1 << 0) | (1 << 3) | (1 << 4))
@@ -269,11 +312,11 @@ class TestDVR(VppTestCase):
         route_1 = VppIpRoute(self, "1.1.1.1", 32,
                              [VppRoutePath("0.0.0.0",
                                            self.pg1.sw_if_index,
         route_1 = VppIpRoute(self, "1.1.1.1", 32,
                              [VppRoutePath("0.0.0.0",
                                            self.pg1.sw_if_index,
-                                           proto=DpoProto.DPO_PROTO_ETHERNET)])
+                                           is_dvr=1)])
         route_2 = VppIpRoute(self, "1.1.1.2", 32,
                              [VppRoutePath("0.0.0.0",
                                            sub_if_on_pg2.sw_if_index,
         route_2 = VppIpRoute(self, "1.1.1.2", 32,
                              [VppRoutePath("0.0.0.0",
                                            sub_if_on_pg2.sw_if_index,
-                                           proto=DpoProto.DPO_PROTO_ETHERNET)])
+                                           is_dvr=1)])
         route_1.add_vpp_config()
         route_2.add_vpp_config()
 
         route_1.add_vpp_config()
         route_2.add_vpp_config()