X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_dvr.py;h=62dcb611d552aeb83da7160a1dfcb630714abf43;hb=097fa66b986f06281f603767d321ab13ab6c88c3;hp=d2088ea2320ef2e1927a05e645a3672da8422e37;hpb=e1ade684eb5a7e5743abfda47488165452cc5b64;p=vpp.git diff --git a/test/test_dvr.py b/test/test_dvr.py index d2088ea2320..62dcb611d55 100644 --- a/test/test_dvr.py +++ b/test/test_dvr.py @@ -2,19 +2,29 @@ import unittest from framework import VppTestCase, VppTestRunner -from vpp_sub_interface import VppDot1QSubint -from vpp_ip_route import VppIpRoute, VppRoutePath -from vpp_papi_provider import L2_VTR_OP, L2_PORT_TYPE +from vpp_ip_route import VppIpRoute, VppRoutePath, FibPathType +from vpp_l2 import L2_PORT_TYPE +from vpp_sub_interface import L2_VTR_OP, VppDot1QSubint from scapy.packet import Raw from scapy.layers.l2 import Ether, Dot1Q from scapy.layers.inet import IP, UDP from socket import AF_INET, inet_pton +NUM_PKTS = 67 + class TestDVR(VppTestCase): """ Distributed Virtual Router """ + @classmethod + def setUpClass(cls): + super(TestDVR, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + super(TestDVR, cls).tearDownClass() + def setUp(self): super(TestDVR, self).setUp() @@ -84,21 +94,24 @@ class TestDVR(VppTestCase): # # Put all the interfaces into a new bridge domain # - self.vapi.sw_interface_set_l2_bridge(self.pg0.sw_if_index, 1) - self.vapi.sw_interface_set_l2_bridge(self.pg1.sw_if_index, 1) - self.vapi.sw_interface_set_l2_bridge(sub_if_on_pg2.sw_if_index, 1) - self.vapi.sw_interface_set_l2_bridge(sub_if_on_pg3.sw_if_index, 1) - self.vapi.sw_interface_set_l2_bridge(self.loop0.sw_if_index, 1, - port_type=L2_PORT_TYPE.BVI) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.pg0.sw_if_index, bd_id=1) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.pg1.sw_if_index, bd_id=1) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=sub_if_on_pg2.sw_if_index, bd_id=1) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=sub_if_on_pg3.sw_if_index, bd_id=1) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.loop0.sw_if_index, bd_id=1, + port_type=L2_PORT_TYPE.BVI) self.vapi.l2_interface_vlan_tag_rewrite( - sub_if_on_pg2.sw_if_index, - L2_VTR_OP.L2_POP_1, - 92) + sw_if_index=sub_if_on_pg2.sw_if_index, vtr_op=L2_VTR_OP.L2_POP_1, + push_dot1q=92) self.vapi.l2_interface_vlan_tag_rewrite( - sub_if_on_pg3.sw_if_index, - L2_VTR_OP.L2_POP_1, - 93) + sw_if_index=sub_if_on_pg3.sw_if_index, vtr_op=L2_VTR_OP.L2_POP_1, + push_dot1q=93) # # Add routes to bridge the traffic via a tagged an nontagged interface @@ -107,14 +120,14 @@ class TestDVR(VppTestCase): self, ip_non_tag_bridged, 32, [VppRoutePath("0.0.0.0", self.pg1.sw_if_index, - is_dvr=1)]) + type=FibPathType.FIB_PATH_TYPE_DVR)]) 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. # - rx = self.send_and_expect(self.pg0, pkt_no_tag * 65, self.pg1) + rx = self.send_and_expect(self.pg0, pkt_no_tag * NUM_PKTS, self.pg1) self.assert_same_mac_addr(pkt_no_tag, rx) self.assert_has_no_tag(rx) @@ -125,14 +138,14 @@ class TestDVR(VppTestCase): self, ip_tag_bridged, 32, [VppRoutePath("0.0.0.0", sub_if_on_pg3.sw_if_index, - is_dvr=1)]) + type=FibPathType.FIB_PATH_TYPE_DVR)]) route_with_tag.add_vpp_config() # # 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) + rx = self.send_and_expect(self.pg0, pkt_tag * NUM_PKTS, self.pg3) self.assert_same_mac_addr(pkt_tag, rx) self.assert_has_vlan_tag(93, rx) @@ -147,7 +160,9 @@ class TestDVR(VppTestCase): UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - rx = self.send_and_expect(self.pg2, pkt_tag_to_tag * 65, self.pg3) + rx = self.send_and_expect(self.pg2, + pkt_tag_to_tag * NUM_PKTS, + self.pg3) self.assert_same_mac_addr(pkt_tag_to_tag, rx) self.assert_has_vlan_tag(93, rx) @@ -162,7 +177,9 @@ class TestDVR(VppTestCase): UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - rx = self.send_and_expect(self.pg2, pkt_tag_to_non_tag * 65, self.pg1) + rx = self.send_and_expect(self.pg2, + pkt_tag_to_non_tag * NUM_PKTS, + self.pg1) self.assert_same_mac_addr(pkt_tag_to_tag, rx) self.assert_has_no_tag(rx) @@ -193,7 +210,8 @@ class TestDVR(VppTestCase): # # 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) + rx = self.send_and_assert_no_replies(self.pg2, + pkt_tag_to_non_tag * NUM_PKTS) # # cleanup @@ -202,32 +220,34 @@ class TestDVR(VppTestCase): 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, - enable=0) - self.vapi.sw_interface_set_l2_bridge(sub_if_on_pg2.sw_if_index, - 1, enable=0) - self.vapi.sw_interface_set_l2_bridge(sub_if_on_pg3.sw_if_index, - 1, enable=0) - self.vapi.sw_interface_set_l2_bridge(self.loop0.sw_if_index, - 1, port_type=L2_PORT_TYPE.BVI, - enable=0) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.pg0.sw_if_index, bd_id=1, enable=0) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.pg1.sw_if_index, bd_id=1, enable=0) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=sub_if_on_pg2.sw_if_index, bd_id=1, enable=0) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=sub_if_on_pg3.sw_if_index, bd_id=1, enable=0) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.loop0.sw_if_index, bd_id=1, + port_type=L2_PORT_TYPE.BVI, enable=0) # # Do a FIB dump to make sure the paths are correctly reported as DVR # - routes = self.vapi.ip_fib_dump() + routes = self.vapi.ip_route_dump(0) for r in routes: - if (inet_pton(AF_INET, ip_tag_bridged) == r.address): - self.assertEqual(r.path[0].sw_if_index, + if (ip_tag_bridged == str(r.route.prefix.network_address)): + self.assertEqual(r.route.paths[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.assertEqual(r.route.paths[0].type, + FibPathType.FIB_PATH_TYPE_DVR) + if (ip_non_tag_bridged == str(r.route.prefix.network_address)): + self.assertEqual(r.route.paths[0].sw_if_index, self.pg1.sw_if_index) - self.assertEqual(r.path[0].is_dvr, 1) + self.assertEqual(r.route.paths[0].type, + FibPathType.FIB_PATH_TYPE_DVR) # # the explicit route delete is require so it happens before @@ -289,36 +309,41 @@ class TestDVR(VppTestCase): # # Put all the interfaces into a new bridge domain # - self.vapi.sw_interface_set_l2_bridge(self.pg0.sw_if_index, 1) - self.vapi.sw_interface_set_l2_bridge(self.pg1.sw_if_index, 1) - self.vapi.sw_interface_set_l2_bridge(sub_if_on_pg2.sw_if_index, 1) - self.vapi.sw_interface_set_l2_bridge(sub_if_on_pg3.sw_if_index, 1) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.pg0.sw_if_index, bd_id=1) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.pg1.sw_if_index, bd_id=1) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=sub_if_on_pg2.sw_if_index, bd_id=1) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=sub_if_on_pg3.sw_if_index, bd_id=1) self.vapi.l2_interface_vlan_tag_rewrite( - sub_if_on_pg2.sw_if_index, - L2_VTR_OP.L2_POP_1, - 92) + sw_if_index=sub_if_on_pg2.sw_if_index, vtr_op=L2_VTR_OP.L2_POP_1, + push_dot1q=92) self.vapi.l2_interface_vlan_tag_rewrite( - sub_if_on_pg3.sw_if_index, - L2_VTR_OP.L2_POP_1, - 93) + sw_if_index=sub_if_on_pg3.sw_if_index, vtr_op=L2_VTR_OP.L2_POP_1, + push_dot1q=93) # - # Disable UU flooding, learning and ARP terminaation. makes this test + # Disable UU flooding, learning and ARP termination. makes this test # easier as unicast packets are dropped if not extracted. # - self.vapi.bridge_flags(1, 0, (1 << 0) | (1 << 3) | (1 << 4)) + self.vapi.bridge_flags(bd_id=1, is_set=0, + flags=(1 << 0) | (1 << 3) | (1 << 4)) # # Add a DVR route to steer traffic at L3 # - route_1 = VppIpRoute(self, "1.1.1.1", 32, - [VppRoutePath("0.0.0.0", - self.pg1.sw_if_index, - is_dvr=1)]) - route_2 = VppIpRoute(self, "1.1.1.2", 32, - [VppRoutePath("0.0.0.0", - sub_if_on_pg2.sw_if_index, - is_dvr=1)]) + route_1 = VppIpRoute( + self, "1.1.1.1", 32, + [VppRoutePath("0.0.0.0", + self.pg1.sw_if_index, + type=FibPathType.FIB_PATH_TYPE_DVR)]) + route_2 = VppIpRoute( + self, "1.1.1.2", 32, + [VppRoutePath("0.0.0.0", + sub_if_on_pg2.sw_if_index, + type=FibPathType.FIB_PATH_TYPE_DVR)]) route_1.add_vpp_config() route_2.add_vpp_config() @@ -338,19 +363,21 @@ class TestDVR(VppTestCase): # # now we expect the packet forward according to the DVR route # - rx = self.send_and_expect(self.pg0, pkt_no_tag * 65, self.pg1) + rx = self.send_and_expect(self.pg0, pkt_no_tag * NUM_PKTS, self.pg1) self.assert_same_mac_addr(pkt_no_tag, rx) self.assert_has_no_tag(rx) - rx = self.send_and_expect(self.pg0, pkt_to_tag * 65, self.pg2) + rx = self.send_and_expect(self.pg0, pkt_to_tag * NUM_PKTS, self.pg2) self.assert_same_mac_addr(pkt_to_tag, rx) self.assert_has_vlan_tag(92, rx) - rx = self.send_and_expect(self.pg3, pkt_from_tag * 65, self.pg1) + rx = self.send_and_expect(self.pg3, pkt_from_tag * NUM_PKTS, self.pg1) self.assert_same_mac_addr(pkt_from_tag, rx) self.assert_has_no_tag(rx) - rx = self.send_and_expect(self.pg3, pkt_from_to_tag * 65, self.pg2) + rx = self.send_and_expect(self.pg3, + pkt_from_to_tag * NUM_PKTS, + self.pg2) self.assert_same_mac_addr(pkt_from_tag, rx) self.assert_has_vlan_tag(92, rx) @@ -371,14 +398,14 @@ class TestDVR(VppTestCase): self.vapi.l2_emulation(sub_if_on_pg3.sw_if_index, enable=0) - 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, enable=0) - self.vapi.sw_interface_set_l2_bridge(sub_if_on_pg2.sw_if_index, - 1, enable=0) - self.vapi.sw_interface_set_l2_bridge(sub_if_on_pg3.sw_if_index, - 1, enable=0) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.pg0.sw_if_index, bd_id=1, enable=0) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=self.pg1.sw_if_index, bd_id=1, enable=0) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=sub_if_on_pg2.sw_if_index, bd_id=1, enable=0) + self.vapi.sw_interface_set_l2_bridge( + rx_sw_if_index=sub_if_on_pg3.sw_if_index, bd_id=1, enable=0) route_1.remove_vpp_config() route_2.remove_vpp_config()