X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fgre%2Finterface.c;h=553c89aeb514fc34375b72506a26e3a5ed7fecf2;hb=e5b94dded;hp=59bf21d6dc27811fc67d355a709af432cc9d89c9;hpb=59ff918ea5b86112ffc89054aa38107703354585;p=vpp.git diff --git a/src/vnet/gre/interface.c b/src/vnet/gre/interface.c index 59bf21d6dc2..553c89aeb51 100644 --- a/src/vnet/gre/interface.c +++ b/src/vnet/gre/interface.c @@ -203,10 +203,14 @@ gre_nhrp_mk_key (const gre_tunnel_t * t, t->type, TUNNEL_MODE_P2P, 0, &key->gtk_v6); } +/** + * An NHRP entry has been added + */ static void gre_nhrp_entry_added (const nhrp_entry_t * ne) { gre_main_t *gm = &gre_main; + const ip46_address_t *nh; gre_tunnel_key_t key; gre_tunnel_t *t; u32 sw_if_index; @@ -221,16 +225,35 @@ gre_nhrp_entry_added (const nhrp_entry_t * ne) if (INDEX_INVALID == t_idx) return; + /* entry has been added on an interface for which there is a GRE tunnel */ t = pool_elt_at_index (gm->tunnels, t_idx); + if (t->mode != TUNNEL_MODE_MP) + return; + + /* the next-hop (underlay) of the NHRP entry will form part of the key for + * ingress lookup to match packets to this interface */ gre_nhrp_mk_key (t, ne, &key); gre_tunnel_db_add (t, &key); + + /* update the rewrites for each of the adjacencies for this peer (overlay) + * using the next-hop (underlay) */ + mgre_walk_ctx_t ctx = { + .t = t, + .ne = ne + }; + nh = nhrp_entry_get_peer (ne); + adj_nbr_walk_nh (nhrp_entry_get_sw_if_index (ne), + (ip46_address_is_ip4 (nh) ? + FIB_PROTOCOL_IP4 : + FIB_PROTOCOL_IP6), nh, mgre_mk_complete_walk, &ctx); } static void gre_nhrp_entry_deleted (const nhrp_entry_t * ne) { gre_main_t *gm = &gre_main; + const ip46_address_t *nh; gre_tunnel_key_t key; gre_tunnel_t *t; u32 sw_if_index; @@ -247,8 +270,17 @@ gre_nhrp_entry_deleted (const nhrp_entry_t * ne) t = pool_elt_at_index (gm->tunnels, t_idx); + /* remove the next-hop as an ingress lookup key */ gre_nhrp_mk_key (t, ne, &key); gre_tunnel_db_remove (t, &key); + + nh = nhrp_entry_get_peer (ne); + + /* make all the adjacencies incomplete */ + adj_nbr_walk_nh (nhrp_entry_get_sw_if_index (ne), + (ip46_address_is_ip4 (nh) ? + FIB_PROTOCOL_IP4 : + FIB_PROTOCOL_IP6), nh, mgre_mk_incomplete_walk, t); } static walk_rc_t @@ -314,6 +346,7 @@ vnet_gre_tunnel_add (vnet_gre_tunnel_add_del_args_t * a, t->type = a->type; t->mode = a->mode; + t->flags = a->flags; if (t->type == GRE_TUNNEL_TYPE_ERSPAN) t->session_id = a->session_id;