From e5b94dded0dfd7258d5fd0f4ef897d9ccb48715b Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Tue, 31 Dec 2019 05:13:14 +0000 Subject: gre: Tunnel encap/decap flags Type: feature common funcitons across IP-in-IP and GRE tunnels for encap/decap functions Signed-off-by: Neale Ranns Change-Id: I325b66824878d843af167adfe5a7a96b0ab90566 --- test/test_gre.py | 62 ++++++++++++++++++++++++++++++++--------------- test/vpp_gre_interface.py | 37 +++++++++++++++++----------- test/vpp_papi_provider.py | 37 ---------------------------- 3 files changed, 66 insertions(+), 70 deletions(-) (limited to 'test') diff --git a/test/test_gre.py b/test/test_gre.py index e3e21c0ad99..e73ba2f99a6 100644 --- a/test/test_gre.py +++ b/test/test_gre.py @@ -108,26 +108,28 @@ class TestGRE(VppTestCase): self.pg1.set_table_ip4(0) super(TestGRE, self).tearDown() - def create_stream_ip4(self, src_if, src_ip, dst_ip): + def create_stream_ip4(self, src_if, src_ip, dst_ip, dscp=0, ecn=0): pkts = [] + tos = (dscp << 2) | ecn for i in range(0, 257): info = self.create_packet_info(src_if, src_if) payload = self.info_to_payload(info) p = (Ether(dst=src_if.local_mac, src=src_if.remote_mac) / - IP(src=src_ip, dst=dst_ip) / + IP(src=src_ip, dst=dst_ip, tos=tos) / UDP(sport=1234, dport=1234) / Raw(payload)) info.data = p.copy() pkts.append(p) return pkts - def create_stream_ip6(self, src_if, src_ip, dst_ip): + def create_stream_ip6(self, src_if, src_ip, dst_ip, dscp=0, ecn=0): pkts = [] + tc = (dscp << 2) | ecn for i in range(0, 257): info = self.create_packet_info(src_if, src_if) payload = self.info_to_payload(info) p = (Ether(dst=src_if.local_mac, src=src_if.remote_mac) / - IPv6(src=src_ip, dst=dst_ip) / + IPv6(src=src_ip, dst=dst_ip, tc=tc) / UDP(sport=1234, dport=1234) / Raw(payload)) info.data = p.copy() @@ -225,9 +227,11 @@ class TestGRE(VppTestCase): return pkts def verify_tunneled_4o4(self, src_if, capture, sent, - tunnel_src, tunnel_dst): + tunnel_src, tunnel_dst, + dscp=0, ecn=0): self.assertEqual(len(capture), len(sent)) + tos = (dscp << 2) | ecn for i in range(len(capture)): try: @@ -239,6 +243,7 @@ class TestGRE(VppTestCase): self.assertEqual(rx_ip.src, tunnel_src) self.assertEqual(rx_ip.dst, tunnel_dst) + self.assertEqual(rx_ip.tos, tos) rx_gre = rx[GRE] rx_ip = rx_gre[IP] @@ -254,9 +259,11 @@ class TestGRE(VppTestCase): raise def verify_tunneled_6o6(self, src_if, capture, sent, - tunnel_src, tunnel_dst): + tunnel_src, tunnel_dst, + dscp=0, ecn=0): self.assertEqual(len(capture), len(sent)) + tc = (dscp << 2) | ecn for i in range(len(capture)): try: @@ -268,6 +275,7 @@ class TestGRE(VppTestCase): self.assertEqual(rx_ip.src, tunnel_src) self.assertEqual(rx_ip.dst, tunnel_dst) + self.assertEqual(rx_ip.tc, tc) rx_gre = GRE(scapy.compat.raw(rx_ip[IPv6].payload)) rx_ip = rx_gre[IPv6] @@ -719,6 +727,8 @@ class TestGRE(VppTestCase): def test_gre_vrf(self): """ GRE tunnel VRF Tests """ + e = VppEnum.vl_api_tunnel_encap_decap_flags_t + # # Create an L3 GRE tunnel whose destination is in the non-default # table. The underlay is thus non-default - the overlay is still @@ -726,9 +736,13 @@ class TestGRE(VppTestCase): # - set it admin up # - assign an IP Addres # - gre_if = VppGreInterface(self, self.pg1.local_ip4, - "2.2.2.2", - outer_table_id=1) + gre_if = VppGreInterface( + self, self.pg1.local_ip4, + "2.2.2.2", + outer_table_id=1, + flags=(e.TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_DSCP | + e.TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_ECN)) + gre_if.add_vpp_config() gre_if.admin_up() gre_if.config_ip4() @@ -756,10 +770,12 @@ class TestGRE(VppTestCase): # - packets are GRE encapped # self.vapi.cli("clear trace") - tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "9.9.9.9") + tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "9.9.9.9", + dscp=5, ecn=3) rx = self.send_and_expect(self.pg0, tx, self.pg1) self.verify_tunneled_4o4(self.pg1, rx, tx, - self.pg1.local_ip4, "2.2.2.2") + self.pg1.local_ip4, "2.2.2.2", + dscp=5, ecn=3) # # Send tunneled packets that match the created tunnel and @@ -1100,6 +1116,8 @@ class TestGRE(VppTestCase): self.pg0.config_ip6() self.pg0.resolve_ndp() + e = VppEnum.vl_api_tunnel_encap_decap_flags_t + for itf in self.pg_interfaces[3:]: # # one underlay nh for each overlay/tunnel peer @@ -1114,11 +1132,14 @@ class TestGRE(VppTestCase): # - assign an IP Addres # - Add a route via the tunnel # - gre_if = VppGreInterface(self, - itf.local_ip6, - "::", - mode=(VppEnum.vl_api_tunnel_mode_t. - TUNNEL_API_MODE_MP)) + gre_if = VppGreInterface( + self, + itf.local_ip6, + "::", + mode=(VppEnum.vl_api_tunnel_mode_t. + TUNNEL_API_MODE_MP), + flags=e.TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_DSCP) + gre_if.add_vpp_config() gre_if.admin_up() gre_if.config_ip6() @@ -1151,11 +1172,13 @@ class TestGRE(VppTestCase): # Send a packet stream that is routed into the tunnel # - packets are GRE encapped # - tx_e = self.create_stream_ip6(self.pg0, "5::5", route_addr) + tx_e = self.create_stream_ip6(self.pg0, "5::5", route_addr, + dscp=2, ecn=1) rx = self.send_and_expect(self.pg0, tx_e, itf) self.verify_tunneled_6o6(self.pg0, rx, tx_e, itf.local_ip6, - itf._remote_hosts[ii].ip6) + itf._remote_hosts[ii].ip6, + dscp=2) tx_i = self.create_tunnel_stream_6o6(self.pg0, itf._remote_hosts[ii].ip6, itf.local_ip6, @@ -1174,7 +1197,8 @@ class TestGRE(VppTestCase): rx = self.send_and_expect(self.pg0, tx_e, itf) self.verify_tunneled_6o6(self.pg0, rx, tx_e, itf.local_ip6, - itf._remote_hosts[ii].ip6) + itf._remote_hosts[ii].ip6, + dscp=2) rx = self.send_and_expect(self.pg0, tx_i, self.pg0) self.verify_decapped_6o6(self.pg0, rx, tx_i) diff --git a/test/vpp_gre_interface.py b/test/vpp_gre_interface.py index 9a9069ac9ab..770292e80b8 100644 --- a/test/vpp_gre_interface.py +++ b/test/vpp_gre_interface.py @@ -10,7 +10,7 @@ class VppGreInterface(VppInterface): """ def __init__(self, test, src_ip, dst_ip, outer_table_id=0, - type=None, mode=None, + type=None, mode=None, flags=0, session=0): """ Create VPP GRE interface """ super(VppGreInterface, self).__init__(test) @@ -18,6 +18,7 @@ class VppGreInterface(VppInterface): self.t_dst = dst_ip self.t_outer_table = outer_table_id self.t_session = session + self.t_flags = flags self.t_type = type if not self.t_type: self.t_type = (VppEnum.vl_api_gre_tunnel_type_t. @@ -29,12 +30,16 @@ class VppGreInterface(VppInterface): def add_vpp_config(self): r = self.test.vapi.gre_tunnel_add_del( - self.t_src, - self.t_dst, - outer_table_id=self.t_outer_table, - type=self.t_type, - mode=self.t_mode, - session_id=self.t_session) + is_add=1, + tunnel={ + 'src': self.t_src, + 'dst': self.t_dst, + 'outer_table_id': self.t_outer_table, + 'instance': 0xffffffff, + 'type': self.t_type, + 'mode': self.t_mode, + 'flags': self.t_flags, + 'session_id': self.t_session}) self.set_sw_if_index(r.sw_if_index) self.generate_remote_hosts() self.test.registry.register(self, self.test.logger) @@ -42,13 +47,17 @@ class VppGreInterface(VppInterface): def remove_vpp_config(self): self.unconfig() - self.test.vapi.gre_tunnel_add_del(self.t_src, - self.t_dst, - outer_table_id=self.t_outer_table, - type=self.t_type, - mode=self.t_mode, - session_id=self.t_session, - is_add=0) + self.test.vapi.gre_tunnel_add_del( + is_add=0, + tunnel={ + 'src': self.t_src, + 'dst': self.t_dst, + 'outer_table_id': self.t_outer_table, + 'instance': 0xffffffff, + 'type': self.t_type, + 'mode': self.t_mode, + 'flags': self.t_flags, + 'session_id': self.t_session}) def object_id(self): return "gre-%d" % self.sw_if_index diff --git a/test/vpp_papi_provider.py b/test/vpp_papi_provider.py index 964b68c1761..789e3c083d5 100644 --- a/test/vpp_papi_provider.py +++ b/test/vpp_papi_provider.py @@ -45,7 +45,6 @@ defaultmapping = { 'gbp_subnet_add_del': {'sw_if_index': 4294967295, 'epg_id': 65535, }, 'geneve_add_del_tunnel': {'mcast_sw_if_index': 4294967295, 'is_add': 1, 'decap_next_index': 4294967295, }, - 'gre_tunnel_add_del': {'instance': 4294967295, 'is_add': 1, }, 'input_acl_set_interface': {'ip4_table_index': 4294967295, 'ip6_table_index': 4294967295, 'l2_table_index': 4294967295, }, @@ -505,42 +504,6 @@ class VppPapiProvider(object): } ) - def gre_tunnel_add_del(self, - src, - dst, - outer_table_id=0, - type=0, - mode=0, - instance=0xFFFFFFFF, - session_id=0, - is_add=1): - """ Add a GRE tunnel - - :param src_address: - :param dst_address: - :param outer_fib_id: (Default value = 0) - :param tunnel_type: (Default value = 0) - :param instance: (Default value = 0xFFFFFFFF) - :param session_id: (Default value = 0) - :param is_add: (Default value = 1) - :param is_ipv6: (Default value = 0) - """ - - return self.api( - self.papi.gre_tunnel_add_del, - {'is_add': is_add, - 'tunnel': - { - 'type': type, - 'mode': mode, - 'instance': instance, - 'src': src, - 'dst': dst, - 'outer_table_id': outer_table_id, - 'session_id': session_id} - } - ) - def udp_encap_add(self, src_ip, dst_ip, -- cgit 1.2.3-korg