linux-cp: FIB lookup for P2MP tunnel interfaces 14/36814/2
authorMatthew Smith <mgsmith@netgate.com>
Fri, 22 Apr 2022 18:02:32 +0000 (18:02 +0000)
committerNeale Ranns <neale@graphiant.com>
Thu, 11 Aug 2022 00:32:46 +0000 (00:32 +0000)
Type: improvement

If a tun/L3 interface is paired with a multipoint tunnel interface,
pass packets arriving from the host to ip[46]-lookup instead of
cross-connecting them to the tunnel interface. Adjacencies are used
to drive the rewrite for Multipoint tunnel interfaces, so the generic
adjacency used with a P2P tunnel will not work correctly.

Change-Id: I2d8be56dc5029760978c05bc4953f84c8924a412
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
src/plugins/linux-cp/lcp_node.c

index 3a88c3b..b000498 100644 (file)
@@ -439,6 +439,7 @@ VNET_FEATURE_INIT (lcp_xc_ip6_mcast_node, static) = {
 typedef enum
 {
   LCP_XC_L3_NEXT_XC,
+  LCP_XC_L3_NEXT_LOOKUP,
   LCP_XC_L3_N_NEXT,
 } lcp_xc_l3_next_t;
 
@@ -453,6 +454,7 @@ lcp_xc_l3_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
 {
   u32 n_left_from, *from, *to_next, n_left_to_next;
   lcp_xc_next_t next_index;
+  vnet_main_t *vnm = vnet_get_main ();
 
   next_index = 0;
   n_left_from = frame->n_vectors;
@@ -488,10 +490,24 @@ lcp_xc_l3_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
            lcp_itf_pair_find_by_host (vnet_buffer (b0)->sw_if_index[VLIB_RX]);
          lip = lcp_itf_pair_get (lipi);
 
-         vnet_buffer (b0)->sw_if_index[VLIB_TX] = lip->lip_phy_sw_if_index;
-         next0 = LCP_XC_L3_NEXT_XC;
-         vnet_buffer (b0)->ip.adj_index[VLIB_TX] =
-           lip->lip_phy_adjs.adj_index[af];
+         /* P2P tunnels can use generic adjacency */
+         if (PREDICT_TRUE (
+               vnet_sw_interface_is_p2p (vnm, lip->lip_phy_sw_if_index)))
+           {
+             vnet_buffer (b0)->sw_if_index[VLIB_TX] =
+               lip->lip_phy_sw_if_index;
+             vnet_buffer (b0)->ip.adj_index[VLIB_TX] =
+               lip->lip_phy_adjs.adj_index[af];
+             next0 = LCP_XC_L3_NEXT_XC;
+           }
+         /* P2MP tunnels require a fib lookup to find the right adjacency */
+         else
+           {
+             /* lookup should use FIB table associated with phy interface */
+             vnet_buffer (b0)->sw_if_index[VLIB_RX] =
+               lip->lip_phy_sw_if_index;
+             next0 = LCP_XC_L3_NEXT_LOOKUP;
+           }
 
          if (PREDICT_FALSE ((b0->flags & VLIB_BUFFER_IS_TRACED)))
            {
@@ -534,6 +550,7 @@ VLIB_REGISTER_NODE (lcp_xc_l3_ip4_node) = {
   .n_next_nodes = LCP_XC_L3_N_NEXT,
   .next_nodes = {
     [LCP_XC_L3_NEXT_XC] = "ip4-midchain",
+    [LCP_XC_L3_NEXT_LOOKUP] = "ip4-lookup",
   },
 };
 
@@ -556,6 +573,7 @@ VLIB_REGISTER_NODE (lcp_xc_l3_ip6_node) = {
   .n_next_nodes = LCP_XC_L3_N_NEXT,
   .next_nodes = {
     [LCP_XC_L3_NEXT_XC] = "ip6-midchain",
+    [LCP_XC_L3_NEXT_LOOKUP] = "ip6-lookup",
   },
 };