diff options
Diffstat (limited to 'bgpd/bgp_zebra.c')
| -rw-r--r-- | bgpd/bgp_zebra.c | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 5f0b20e029..66fcbb3f3a 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -1632,8 +1632,7 @@ int bgp_redistribute_set(struct bgp *bgp, afi_t afi, int type, return CMD_WARNING; #if ENABLE_BGP_VNC - if (bgp->vrf_id == VRF_DEFAULT - && type == ZEBRA_ROUTE_VNC_DIRECT) { + if (EVPN_ENABLED(bgp) && type == ZEBRA_ROUTE_VNC_DIRECT) { vnc_export_bgp_enable( bgp, afi); /* only enables if mode bits cfg'd */ } @@ -1794,7 +1793,7 @@ int bgp_redistribute_unset(struct bgp *bgp, afi_t afi, int type, * status. red lookup fails if there is no zebra connection. */ #if ENABLE_BGP_VNC - if (bgp->vrf_id == VRF_DEFAULT && type == ZEBRA_ROUTE_VNC_DIRECT) { + if (EVPN_ENABLED(bgp) && type == ZEBRA_ROUTE_VNC_DIRECT) { vnc_export_bgp_disable(bgp, afi); } #endif @@ -1820,23 +1819,42 @@ int bgp_redistribute_unset(struct bgp *bgp, afi_t afi, int type, return CMD_SUCCESS; } -/* Update redistribute vrf bitmap during triggers like - restart networking or delete/add VRFs */ -void bgp_update_redist_vrf_bitmaps(struct bgp *bgp, vrf_id_t old_vrf_id) +void bgp_redistribute_redo(struct bgp *bgp) +{ + afi_t afi; + int i; + struct list *red_list; + struct listnode *node; + struct bgp_redist *red; + + for (afi = AFI_IP; afi < AFI_MAX; afi++) { + for (i = 0; i < ZEBRA_ROUTE_MAX; i++) { + + red_list = bgp->redist[afi][i]; + if (!red_list) + continue; + + for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) { + bgp_redistribute_resend(bgp, afi, i, + red->instance); + } + } + } +} + +/* Unset redistribute vrf bitmap during triggers like + restart networking or delete VRFs */ +void bgp_unset_redist_vrf_bitmaps(struct bgp *bgp, vrf_id_t old_vrf_id) { int i; afi_t afi; for (afi = AFI_IP; afi < AFI_MAX; afi++) for (i = 0; i < ZEBRA_ROUTE_MAX; i++) - if ((old_vrf_id == VRF_UNKNOWN) - || vrf_bitmap_check(zclient->redist[afi][i], - old_vrf_id)) { + if (vrf_bitmap_check(zclient->redist[afi][i], + old_vrf_id)) vrf_bitmap_unset(zclient->redist[afi][i], old_vrf_id); - vrf_bitmap_set(zclient->redist[afi][i], - bgp->vrf_id); - } return; } @@ -1861,9 +1879,8 @@ void bgp_zebra_instance_register(struct bgp *bgp) /* Register for router-id, interfaces, redistributed routes. */ zclient_send_reg_requests(zclient, bgp->vrf_id); - /* For default instance, register to learn about VNIs, if appropriate. - */ - if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT && is_evpn_enabled()) + /* For EVPN instance, register to learn about VNIs, if appropriate. */ + if (bgp->advertise_all_vni) bgp_zebra_advertise_all_vni(bgp, 1); bgp_nht_register_nexthops(bgp); @@ -1881,9 +1898,8 @@ void bgp_zebra_instance_deregister(struct bgp *bgp) if (BGP_DEBUG(zebra, ZEBRA)) zlog_debug("Deregistering VRF %u", bgp->vrf_id); - /* For default instance, unregister learning about VNIs, if appropriate. - */ - if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT && is_evpn_enabled()) + /* For EVPN instance, unregister learning about VNIs, if appropriate. */ + if (bgp->advertise_all_vni) bgp_zebra_advertise_all_vni(bgp, 0); /* Deregister for router-id, interfaces, redistributed routes. */ |
