From acd1d9bc43c29e94288af6d878bc3dab2939fdb1 Mon Sep 17 00:00:00 2001 From: Ameya Dharkar Date: Tue, 9 Mar 2021 16:37:52 -0800 Subject: [PATCH] bgpd: Reevaluate es_evi_vtep active state on disable-ead-evi-rx config flap Update es_evi_vtep active state and add/delete es_vtep accordingly to zebra for remote ES. Signed-off-by: Ameya Dharkar --- bgpd/bgp_evpn_mh.c | 36 ++++++++++++++++++++++++++++++++++++ bgpd/bgp_evpn_mh.h | 1 + bgpd/bgp_evpn_vty.c | 7 ++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c index 175514f639..123c46f12f 100644 --- a/bgpd/bgp_evpn_mh.c +++ b/bgpd/bgp_evpn_mh.c @@ -3847,3 +3847,39 @@ void bgp_evpn_mh_finish(void) XFREE(MTYPE_BGP_EVPN_MH_INFO, bgp_mh_info); } + +/* This function is called when disable-ead-evi-rx knob flaps */ +void bgp_evpn_switch_ead_evi_rx(void) +{ + struct bgp *bgp; + struct bgp_evpn_es *es; + struct bgp_evpn_es_evi *es_evi; + struct listnode *evi_node = NULL; + struct listnode *evi_next = NULL; + struct bgp_evpn_es_evi_vtep *vtep; + struct listnode *vtep_node = NULL; + struct listnode *vtep_next = NULL; + + bgp = bgp_get_evpn(); + if (!bgp) + return; + + /* + * Process all the remote es_evi_vteps and reevaluate if the es_evi_vtep + * is active. + */ + RB_FOREACH(es, bgp_es_rb_head, &bgp_mh_info->es_rb_tree) { + if (!CHECK_FLAG(es->flags, BGP_EVPNES_REMOTE)) + continue; + + for (ALL_LIST_ELEMENTS(es->es_evi_list, evi_node, evi_next, + es_evi)) { + if (!CHECK_FLAG(es_evi->flags, BGP_EVPNES_EVI_REMOTE)) + continue; + + for (ALL_LIST_ELEMENTS(es_evi->es_evi_vtep_list, + vtep_node, vtep_next, vtep)) + bgp_evpn_es_evi_vtep_re_eval_active(bgp, vtep); + } + } +} diff --git a/bgpd/bgp_evpn_mh.h b/bgpd/bgp_evpn_mh.h index 818fad2eb6..e5186619ff 100644 --- a/bgpd/bgp_evpn_mh.h +++ b/bgpd/bgp_evpn_mh.h @@ -376,5 +376,6 @@ extern bool bgp_evpn_path_es_use_nhg(struct bgp *bgp_vrf, extern void bgp_evpn_es_vrf_show(struct vty *vty, bool uj, struct bgp_evpn_es *es); extern void bgp_evpn_es_vrf_show_esi(struct vty *vty, esi_t *esi, bool uj); +extern void bgp_evpn_switch_ead_evi_rx(void); #endif /* _FRR_BGP_EVPN_MH_H */ diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c index 73bce5df9a..b101589a79 100644 --- a/bgpd/bgp_evpn_vty.c +++ b/bgpd/bgp_evpn_vty.c @@ -3767,7 +3767,12 @@ DEFPY (bgp_evpn_ead_evi_rx_disable, NO_STR "Activate PE on EAD-ES even if EAD-EVI is not received\n") { - bgp_mh_info->ead_evi_rx = no? true :false; + bool ead_evi_rx = no? true :false; + + if (ead_evi_rx != bgp_mh_info->ead_evi_rx) { + bgp_mh_info->ead_evi_rx = ead_evi_rx; + bgp_evpn_switch_ead_evi_rx(); + } return CMD_SUCCESS; }