fib: supporting inner flow hash on tunnels 15/30215/14
authorMohammed Hawari <mohammed@hawari.fr>
Mon, 30 Nov 2020 12:50:24 +0000 (13:50 +0100)
committerNeale Ranns <nranns@cisco.com>
Wed, 9 Dec 2020 08:40:50 +0000 (08:40 +0000)
Change-Id: I53011e089bfecb08483792029b534b09b9e33a10
Type: improvement
Signed-off-by: Mohammed Hawari <mohammed@hawari.fr>
src/vnet/gre/gre.api
src/vnet/gre/gre.c
src/vnet/ipip/ipip.api
src/vnet/ipip/ipip.c
src/vnet/tunnel/tunnel.h
src/vnet/tunnel/tunnel_types.api

index f4e0253..9c69ba4 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-option version = "2.1.0";
+option version = "2.1.1";
 
 import "vnet/interface_types.api";
 import "vnet/tunnel/tunnel_types.api";
index 5b102ae..d842d68 100644 (file)
@@ -410,7 +410,11 @@ gre_update_adj (vnet_main_t * vnm, u32 sw_if_index, adj_index_t ai)
 
   ti = gm->tunnel_index_by_sw_if_index[sw_if_index];
   t = pool_elt_at_index (gm->tunnels, ti);
-  af = ADJ_FLAG_MIDCHAIN_IP_STACK;
+
+  if (t->flags & TUNNEL_ENCAP_DECAP_FLAG_ENCAP_INNER_HASH)
+    af = ADJ_FLAG_MIDCHAIN_FIXUP_FLOW_HASH;
+  else
+    af = ADJ_FLAG_MIDCHAIN_IP_STACK;
 
   if (VNET_LINK_ETHERNET == adj_get_link_type (ai))
     af |= ADJ_FLAG_MIDCHAIN_NO_COUNT;
@@ -429,12 +433,18 @@ adj_walk_rc_t
 mgre_mk_complete_walk (adj_index_t ai, void *data)
 {
   mgre_walk_ctx_t *ctx = data;
+  adj_flags_t af;
+
+  if (ctx->t->flags & TUNNEL_ENCAP_DECAP_FLAG_ENCAP_INNER_HASH)
+    af = ADJ_FLAG_MIDCHAIN_FIXUP_FLOW_HASH;
+  else
+    af = ADJ_FLAG_MIDCHAIN_IP_STACK;
 
   adj_nbr_midchain_update_rewrite
     (ai, gre_get_fixup (ctx->t->tunnel_dst.fp_proto,
                        adj_get_link_type (ai)),
      uword_to_pointer (ctx->t->flags, void *),
-     ADJ_FLAG_MIDCHAIN_IP_STACK,
+     af,
      gre_build_rewrite (vnet_get_main (),
                        ctx->t->sw_if_index,
                        adj_get_link_type (ai),
index 4fbfa1d..2740a51 100644 (file)
@@ -49,7 +49,7 @@
  *
  */
 
-option version = "2.0.1";
+option version = "2.0.2";
 
 import "vnet/interface_types.api";
 import "vnet/ip/ip_types.api";
index 87aba12..357eb58 100644 (file)
@@ -288,7 +288,11 @@ ipip_update_adj (vnet_main_t * vnm, u32 sw_if_index, adj_index_t ai)
   if (!t)
     return;
 
-  af = ADJ_FLAG_MIDCHAIN_IP_STACK;
+  if (t->flags & TUNNEL_ENCAP_DECAP_FLAG_ENCAP_INNER_HASH)
+    af = ADJ_FLAG_MIDCHAIN_FIXUP_FLOW_HASH;
+  else
+    af = ADJ_FLAG_MIDCHAIN_IP_STACK;
+
   if (VNET_LINK_ETHERNET == adj_get_link_type (ai))
     af |= ADJ_FLAG_MIDCHAIN_NO_COUNT;
 
@@ -317,14 +321,18 @@ mipip_mk_complete_walk (adj_index_t ai, void *data)
   af = ADJ_FLAG_NONE;
   fixup = ipip_get_fixup (ctx->t, adj_get_link_type (ai), &af);
 
+  if (ctx->t->flags & TUNNEL_ENCAP_DECAP_FLAG_ENCAP_INNER_HASH)
+    af = ADJ_FLAG_MIDCHAIN_FIXUP_FLOW_HASH;
+  else
+    af = ADJ_FLAG_MIDCHAIN_IP_STACK;
+
   adj_nbr_midchain_update_rewrite
     (ai, fixup,
      uword_to_pointer (ctx->t->flags, void *),
-     ADJ_FLAG_MIDCHAIN_IP_STACK, ipip_build_rewrite (vnet_get_main (),
-                                                    ctx->t->sw_if_index,
-                                                    adj_get_link_type (ai),
-                                                    &teib_entry_get_nh
-                                                    (ctx->ne)->fp_addr));
+     af, ipip_build_rewrite (vnet_get_main (),
+                            ctx->t->sw_if_index,
+                            adj_get_link_type (ai),
+                            &teib_entry_get_nh (ctx->ne)->fp_addr));
 
   teib_entry_adj_stack (ctx->ne, ai);
 
index 6c97fc1..de06b60 100644 (file)
@@ -43,7 +43,8 @@ extern uword unformat_tunnel_mode (unformat_input_t * input, va_list * args);
   _(ENCAP_SET_DF, "encap-set-df", 0x2)              \
   _(ENCAP_COPY_DSCP, "encap-copy-dscp", 0x4)        \
   _(ENCAP_COPY_ECN, "encap-copy-ecn", 0x8)          \
-  _(DECAP_COPY_ECN, "decap-copy-ecn", 0x10)
+  _(DECAP_COPY_ECN, "decap-copy-ecn", 0x10)         \
+  _(ENCAP_INNER_HASH, "encap-inner-hash", 0x20)
 
 typedef enum tunnel_encap_decap_flags_t_
 {
index 9835489..d193405 100644 (file)
@@ -30,6 +30,8 @@ enum tunnel_encap_decap_flags : u8
   TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_COPY_ECN = 0x8,
   /** at decap, copy the ECN bit of the tunnel header into the payload */
   TUNNEL_API_ENCAP_DECAP_FLAG_DECAP_COPY_ECN = 0x10,
+  /** at encap, compute flow hash on the inner packet for more entropy */
+  TUNNEL_API_ENCAP_DECAP_FLAG_ENCAP_INNER_HASH = 0x20 [backwards_compatible],
 };
 
 /**