gre: MPLS over GRE does not select correct fixup function 03/29303/2
authorNeale Ranns <nranns@cisco.com>
Thu, 8 Oct 2020 08:10:34 +0000 (08:10 +0000)
committerDamjan Marion <dmarion@me.com>
Thu, 8 Oct 2020 13:06:01 +0000 (13:06 +0000)
Type: fix

Signed-off-by: Neale Ranns <nranns@cisco.com>
Change-Id: I9eff41407b0f172f2b567e6a4ea1c48be8df883a

src/scripts/vnet/mpls-to-dot1ad [new file with mode: 0644]
src/vnet/gre/gre.c
test/test_gre.py

diff --git a/src/scripts/vnet/mpls-to-dot1ad b/src/scripts/vnet/mpls-to-dot1ad
new file mode 100644 (file)
index 0000000..93d3a70
--- /dev/null
@@ -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
index 439c542..5b102ae 100644 (file)
@@ -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);
index 858d943..7a24999 100644 (file)
@@ -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()