X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fgre%2Fgre.c;h=d842d688603664cd516ab98b75972702f7a5c948;hb=33c45f56a;hp=83f128336116199ce12267ce398a0eb08a294a1c;hpb=cf86740a11650231bab4d14bc8d9288a91a22f16;p=vpp.git diff --git a/src/vnet/gre/gre.c b/src/vnet/gre/gre.c index 83f12833611..d842d688603 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); @@ -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), @@ -472,7 +482,8 @@ mgre_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); - ne = teib_entry_find (sw_if_index, &adj->sub_type.nbr.next_hop); + ne = teib_entry_find_46 (sw_if_index, + adj->ia_nh_proto, &adj->sub_type.nbr.next_hop); if (NULL == ne) // no NHRP entry to provide the next-hop