X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_dvr.py;h=cf411bb0cb1694a3bb597ae5b601ced236d19bbd;hb=8feeaff56fa9a4fbdfc06131f28a1060ffd9645d;hp=e2e960584a6c42c8b80d0561b2ebdaf53c1ab085;hpb=f068c3ed296c49dfbfe17677fc1ad2428fb4e3e4;p=vpp.git diff --git a/test/test_dvr.py b/test/test_dvr.py index e2e960584a6..cf411bb0cb1 100644 --- a/test/test_dvr.py +++ b/test/test_dvr.py @@ -1,18 +1,14 @@ #!/usr/bin/env python -import random -import socket import unittest from framework import VppTestCase, VppTestRunner -from vpp_sub_interface import VppSubInterface, VppDot1QSubint -from vpp_ip_route import VppIpRoute, VppRoutePath, DpoProto, VppIpMRoute, \ - VppMRoutePath, MRouteEntryFlags, MRouteItfFlags -from vpp_papi_provider import L2_VTR_OP +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 scapy.packet import Raw -from scapy.layers.l2 import Ether, Dot1Q, ARP +from scapy.layers.l2 import Ether, Dot1Q from scapy.layers.inet import IP, UDP -from util import ppp from socket import AF_INET, inet_pton @@ -23,7 +19,7 @@ class TestDVR(VppTestCase): super(TestDVR, self).setUp() self.create_pg_interfaces(range(4)) - self.create_loopback_interfaces(range(1)) + self.create_loopback_interfaces(1) for i in self.pg_interfaces: i.admin_up() @@ -88,18 +84,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, bvi=1) - - self.vapi.sw_interface_set_l2_tag_rewrite(sub_if_on_pg2.sw_if_index, - L2_VTR_OP.L2_POP_1, - 92) - self.vapi.sw_interface_set_l2_tag_rewrite(sub_if_on_pg3.sw_if_index, - L2_VTR_OP.L2_POP_1, - 93) + 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( + 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( + 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 @@ -203,16 +205,32 @@ 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, bvi=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) + 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() + + 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 @@ -274,22 +292,27 @@ 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_tag_rewrite(sub_if_on_pg2.sw_if_index, - L2_VTR_OP.L2_POP_1, - 92) - self.vapi.sw_interface_set_l2_tag_rewrite(sub_if_on_pg3.sw_if_index, - L2_VTR_OP.L2_POP_1, - 93) - - # - # Disable UU flooding, learning and ARP terminaation. makes this test + 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( + 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( + 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 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 @@ -306,17 +329,17 @@ class TestDVR(VppTestCase): route_2.add_vpp_config() # - # packets are dropped because bridge does not flood unkown unicast + # packets are dropped because bridge does not flood unknown unicast # self.send_and_assert_no_replies(self.pg0, pkt_no_tag) # # Enable L3 extraction on pgs # - self.vapi.sw_interface_set_l2_emulation(self.pg0.sw_if_index) - self.vapi.sw_interface_set_l2_emulation(self.pg1.sw_if_index) - self.vapi.sw_interface_set_l2_emulation(sub_if_on_pg2.sw_if_index) - self.vapi.sw_interface_set_l2_emulation(sub_if_on_pg3.sw_if_index) + self.vapi.l2_emulation(self.pg0.sw_if_index) + self.vapi.l2_emulation(self.pg1.sw_if_index) + self.vapi.l2_emulation(sub_if_on_pg2.sw_if_index) + self.vapi.l2_emulation(sub_if_on_pg3.sw_if_index) # # now we expect the packet forward according to the DVR route @@ -345,23 +368,23 @@ class TestDVR(VppTestCase): # # cleanup # - self.vapi.sw_interface_set_l2_emulation(self.pg0.sw_if_index, - enable=0) - self.vapi.sw_interface_set_l2_emulation(self.pg1.sw_if_index, - enable=0) - self.vapi.sw_interface_set_l2_emulation(sub_if_on_pg2.sw_if_index, - enable=0) - self.vapi.sw_interface_set_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.l2_emulation(self.pg0.sw_if_index, + enable=0) + self.vapi.l2_emulation(self.pg1.sw_if_index, + enable=0) + self.vapi.l2_emulation(sub_if_on_pg2.sw_if_index, + enable=0) + self.vapi.l2_emulation(sub_if_on_pg3.sw_if_index, + 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()