From 533bf08cf491a9b74cf761abf05709248a80b274 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Thu, 8 Oct 2020 08:10:34 +0000 Subject: gre: MPLS over GRE does not select correct fixup function Type: fix Signed-off-by: Neale Ranns Change-Id: I9eff41407b0f172f2b567e6a4ea1c48be8df883a --- src/scripts/vnet/mpls-to-dot1ad | 53 ++++++++++++++++++++++++++++++++++++++ src/vnet/gre/gre.c | 4 +-- test/test_gre.py | 56 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/scripts/vnet/mpls-to-dot1ad diff --git a/src/scripts/vnet/mpls-to-dot1ad b/src/scripts/vnet/mpls-to-dot1ad new file mode 100644 index 00000000000..93d3a701595 --- /dev/null +++ b/src/scripts/vnet/mpls-to-dot1ad @@ -0,0 +1,53 @@ + +create packet-generator interface pg0 +create packet-generator interface pg1 + +set int ip address pg0 192.168.0.1/24 + +set int state pg0 up +set int state pg1 up +set int mac address pg1 00:00:00:00:00:11 +create sub-interface pg1 12 dot1ad 32 inner-dot1q 33 +set int state pg1.12 up +set int l2 tag-rewrite pg1.12 pop 2 + +set ip neighbor pg0 192.168.0.2 1:2:3:4:5:6 static + +create gre tunnel dst 192.168.0.2 src 192.168.0.1 +set int state gre0 up +set int ip addr gre0 1.1.1.1/30 + +mpls table 0 +mpls tunnel add l2-only via 1.1.1.2 gre0 out-labels 33 +set int state mpls-tunnel0 up +set int mpls gre0 enable + +set int l2 xconnect pg1.12 mpls-tunnel0 +set int l2 xconnect mpls-tunnel0 pg1.12 + +mpls local-label add eos 33 via l2-input-on mpls-tunnel0 + +trace add pg-input 100 + +packet-generator new { + name g2v + limit 1 + node ip4-input + interface pg0 + data { + hex 0x4500002000000000fe2f3b5bc0a80002c0a800010000884700021140000000000011005056b77c83010203040506 + } +} + +packet-generator new { + name v2g + limit 1 + node ethernet-input + interface pg1.12 + data { + hex 0x000000000011005056b77c8388a80020810000210102030405060708 + } +} + +pack en g2v +sh trace diff --git a/src/vnet/gre/gre.c b/src/vnet/gre/gre.c index 439c542b291..5b102ae3992 100644 --- a/src/vnet/gre/gre.c +++ b/src/vnet/gre/gre.c @@ -391,9 +391,9 @@ gre_get_fixup (fib_protocol_t fproto, vnet_link_t lt) return (gre64_fixup); if (fproto == FIB_PROTOCOL_IP4 && lt == VNET_LINK_IP4) return (gre44_fixup); - if (fproto == FIB_PROTOCOL_IP6 && lt == VNET_LINK_ETHERNET) + if (fproto == FIB_PROTOCOL_IP6) return (grex6_fixup); - if (fproto == FIB_PROTOCOL_IP4 && lt == VNET_LINK_ETHERNET) + if (fproto == FIB_PROTOCOL_IP4) return (grex4_fixup); ASSERT (0); diff --git a/test/test_gre.py b/test/test_gre.py index 858d9436384..7a249998829 100644 --- a/test/test_gre.py +++ b/test/test_gre.py @@ -14,7 +14,9 @@ from vpp_sub_interface import L2_VTR_OP, VppDot1QSubint from vpp_gre_interface import VppGreInterface from vpp_teib import VppTeib from vpp_ip import DpoProto -from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpTable, FibPathProto +from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpTable, FibPathProto, \ + VppMplsLabel +from vpp_mpls_tunnel_interface import VppMPLSTunnelInterface from util import ppp, ppc from vpp_papi import VppEnum @@ -629,12 +631,64 @@ class TestGRE(VppTestCase): self.verify_tunneled_6o4(self.pg0, rx, tx, self.pg0.local_ip4, "1.1.1.2") + # + # add a labelled route through the tunnel + # + label_via_tun = VppIpRoute(self, "5.4.3.2", 32, + [VppRoutePath("0.0.0.0", + gre_if.sw_if_index, + labels=[VppMplsLabel(33)])]) + label_via_tun.add_vpp_config() + + tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "5.4.3.2") + rx = self.send_and_expect(self.pg0, tx, self.pg0) + self.verify_tunneled_4o4(self.pg0, rx, tx, + self.pg0.local_ip4, "1.1.1.2") + + # + # an MPLS tunnel over the GRE tunnel add a route through + # the mpls tunnel + # + mpls_tun = VppMPLSTunnelInterface( + self, + [VppRoutePath("0.0.0.0", + gre_if.sw_if_index, + labels=[VppMplsLabel(44), + VppMplsLabel(46)])]) + mpls_tun.add_vpp_config() + mpls_tun.admin_up() + + label_via_mpls = VppIpRoute(self, "5.4.3.1", 32, + [VppRoutePath("0.0.0.0", + mpls_tun.sw_if_index, + labels=[VppMplsLabel(33)])]) + label_via_mpls.add_vpp_config() + + tx = self.create_stream_ip4(self.pg0, "5.5.5.5", "5.4.3.1") + rx = self.send_and_expect(self.pg0, tx, self.pg0) + self.verify_tunneled_4o4(self.pg0, rx, tx, + self.pg0.local_ip4, "1.1.1.2") + + mpls_tun_l2 = VppMPLSTunnelInterface( + self, + [VppRoutePath("0.0.0.0", + gre_if.sw_if_index, + labels=[VppMplsLabel(44), + VppMplsLabel(46)])], + is_l2=1) + mpls_tun_l2.add_vpp_config() + mpls_tun_l2.admin_up() + # # test case cleanup # route_tun_dst.remove_vpp_config() route_via_tun.remove_vpp_config() route6_via_tun.remove_vpp_config() + label_via_mpls.remove_vpp_config() + label_via_tun.remove_vpp_config() + mpls_tun.remove_vpp_config() + mpls_tun_l2.remove_vpp_config() gre_if.remove_vpp_config() self.pg0.unconfig_ip6() -- cgit 1.2.3-korg