mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 00:18:53 +00:00
bgpd: use bgp_process while processing evpn routes in vrf
Signed-off-by: Mitesh Kanjariya <mitesh@cumulusnetworks.com>
This commit is contained in:
parent
19a847a9cd
commit
1eb8800250
124
bgpd/bgp_evpn.c
124
bgpd/bgp_evpn.c
@ -782,95 +782,6 @@ static void evpn_delete_old_local_route(struct bgp *bgp, struct bgpevpn *vpn,
|
||||
bgp_info_delete(rn, old_local);
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the best path for an EVPN route. Install/update best path in zebra,
|
||||
* if appropriate.
|
||||
*/
|
||||
static int evpn_vrf_route_select_install(struct bgp *bgp_vrf,
|
||||
struct bgp_node *rn,
|
||||
struct prefix *p,
|
||||
afi_t afi,
|
||||
safi_t safi)
|
||||
{
|
||||
struct bgp_info *old_select, *new_select;
|
||||
struct bgp_info_pair old_and_new;
|
||||
int ret = 0;
|
||||
|
||||
/* Compute the best path. */
|
||||
bgp_best_selection(bgp_vrf, rn, &bgp_vrf->maxpaths[afi][safi],
|
||||
&old_and_new, afi, safi);
|
||||
old_select = old_and_new.old;
|
||||
new_select = old_and_new.new;
|
||||
|
||||
/* If the best path hasn't changed - see if there is still something to
|
||||
* update
|
||||
* to zebra RIB.
|
||||
*/
|
||||
if (old_select && old_select == new_select
|
||||
&& old_select->type == ZEBRA_ROUTE_BGP
|
||||
&& old_select->sub_type == BGP_ROUTE_NORMAL
|
||||
&& !CHECK_FLAG(rn->flags, BGP_NODE_USER_CLEAR)
|
||||
&& !CHECK_FLAG(old_select->flags, BGP_INFO_ATTR_CHANGED)
|
||||
&& !bgp_vrf->addpath_tx_used[afi][safi]) {
|
||||
if (bgp_zebra_has_route_changed(rn, old_select))
|
||||
bgp_zebra_announce(rn, p, old_select, bgp_vrf,
|
||||
afi, safi);
|
||||
UNSET_FLAG(old_select->flags, BGP_INFO_MULTIPATH_CHG);
|
||||
bgp_zebra_clear_route_change_flags(rn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* If the user did a "clear" this flag will be set */
|
||||
UNSET_FLAG(rn->flags, BGP_NODE_USER_CLEAR);
|
||||
|
||||
/* bestpath has changed; update relevant fields and install or uninstall
|
||||
* into the zebra RIB.
|
||||
*/
|
||||
if (old_select || new_select)
|
||||
bgp_bump_version(rn);
|
||||
|
||||
if (old_select)
|
||||
bgp_info_unset_flag(rn, old_select, BGP_INFO_SELECTED);
|
||||
if (new_select) {
|
||||
bgp_info_set_flag(rn, new_select, BGP_INFO_SELECTED);
|
||||
bgp_info_unset_flag(rn, new_select, BGP_INFO_ATTR_CHANGED);
|
||||
UNSET_FLAG(new_select->flags, BGP_INFO_MULTIPATH_CHG);
|
||||
}
|
||||
|
||||
if (new_select && new_select->type == ZEBRA_ROUTE_BGP
|
||||
&& new_select->sub_type == BGP_ROUTE_NORMAL) {
|
||||
bgp_zebra_announce(rn, p, new_select, bgp_vrf,
|
||||
afi, safi);
|
||||
|
||||
/* If an old best existed and it was a "local" route, the only
|
||||
* reason
|
||||
* it would be supplanted is due to MAC mobility procedures. So,
|
||||
* we
|
||||
* need to do an implicit delete and withdraw that route from
|
||||
* peers.
|
||||
*/
|
||||
/*if (old_select && old_select->peer == bgp_vrf->peer_self
|
||||
&& old_select->type == ZEBRA_ROUTE_BGP
|
||||
&& old_select->sub_type == BGP_ROUTE_STATIC) {
|
||||
//evpn_delete_old_local_route(bgp, vpn, rn, old_select);
|
||||
}*/ //TODO_MITESH: probably not needed for vrf routes, think!!
|
||||
} else {
|
||||
if (old_select && old_select->type == ZEBRA_ROUTE_BGP
|
||||
&& old_select->sub_type == BGP_ROUTE_NORMAL) {
|
||||
bgp_zebra_withdraw(p, old_select, safi);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear any route change flags. */
|
||||
bgp_zebra_clear_route_change_flags(rn);
|
||||
|
||||
/* Reap old select bgp_info, if it has been removed */
|
||||
if (old_select && CHECK_FLAG(old_select->flags, BGP_INFO_REMOVED))
|
||||
bgp_info_reap(rn, old_select);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the best path for an EVPN route. Install/update best path in zebra,
|
||||
* if appropriate.
|
||||
@ -1522,10 +1433,19 @@ static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
|
||||
struct prefix *pp = &p;
|
||||
afi_t afi = 0;
|
||||
safi_t safi = 0;
|
||||
char buf[PREFIX_STRLEN];
|
||||
char buf1[PREFIX_STRLEN];
|
||||
|
||||
memset(pp, 0, sizeof(struct prefix));
|
||||
ip_prefix_from_type2_prefix(evp, pp);
|
||||
|
||||
if (bgp_debug_zebra(NULL)) {
|
||||
zlog_debug("installing evpn prefix %s as ip prefix %s in vrf %s",
|
||||
prefix2str(evp, buf, sizeof(buf)),
|
||||
prefix2str(pp, buf1, sizeof(buf)),
|
||||
vrf_id_to_name(bgp_vrf->vrf_id));
|
||||
}
|
||||
|
||||
/* Create (or fetch) route within the VRF. */
|
||||
/* NOTE: There is no RD here. */
|
||||
if (IS_EVPN_PREFIX_IPADDR_V4(evp)) {
|
||||
@ -1584,8 +1504,7 @@ static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
|
||||
}
|
||||
|
||||
/* Perform route selection and update zebra, if required. */
|
||||
//TODO_MITESH: callbgp process instead
|
||||
ret = evpn_vrf_route_select_install(bgp_vrf, rn, pp, afi, safi);
|
||||
bgp_process(bgp_vrf, rn, afi, safi);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1671,10 +1590,19 @@ static int uninstall_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
|
||||
struct prefix *pp = &p;
|
||||
afi_t afi = 0;
|
||||
safi_t safi = 0;
|
||||
char buf[PREFIX_STRLEN];
|
||||
char buf1[PREFIX_STRLEN];
|
||||
|
||||
memset(pp, 0, sizeof(struct prefix));
|
||||
ip_prefix_from_type2_prefix(evp, pp);
|
||||
|
||||
if (bgp_debug_zebra(NULL)) {
|
||||
zlog_debug("Uninstalling evpn prefix %s as ip prefix %s in vrf %s",
|
||||
prefix2str(evp, buf, sizeof(buf)),
|
||||
prefix2str(pp, buf1, sizeof(buf)),
|
||||
vrf_id_to_name(bgp_vrf->vrf_id));
|
||||
}
|
||||
|
||||
/* Locate route within the VRF. */
|
||||
/* NOTE: There is no RD here. */
|
||||
if (IS_EVPN_PREFIX_IPADDR_V4(evp)) {
|
||||
@ -1703,7 +1631,7 @@ static int uninstall_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
|
||||
bgp_info_delete(rn, ri);
|
||||
|
||||
/* Perform route selection and update zebra, if required. */
|
||||
ret = evpn_vrf_route_select_install(bgp_vrf, rn, pp, afi, safi);
|
||||
bgp_process(bgp_vrf, rn, afi, safi);
|
||||
|
||||
/* Unlock route node. */
|
||||
bgp_unlock_node(rn);
|
||||
@ -1919,9 +1847,15 @@ static int install_uninstall_routes_for_vrf(struct bgp *bgp_vrf,
|
||||
for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) {
|
||||
struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
|
||||
|
||||
/* if not mac-ip route skip this route */
|
||||
if (evp->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
|
||||
continue;
|
||||
|
||||
/* if not a mac+ip route skip this route */
|
||||
if (!(IS_EVPN_PREFIX_IPADDR_V4(evp) ||
|
||||
IS_EVPN_PREFIX_IPADDR_V6(evp)))
|
||||
continue;
|
||||
|
||||
for (ri = rn->info; ri; ri = ri->next) {
|
||||
/* Consider "valid" remote routes applicable for
|
||||
* this VRF. */
|
||||
@ -3761,8 +3695,10 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni,
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* unimport remote routes from VRF */
|
||||
uninstall_routes_for_vrf(bgp_vrf);
|
||||
/* unimport remote routes from VRF, if it is AUTO vrf bgp_delete will
|
||||
* take care of uninstalling the routes from zebra */
|
||||
if (!CHECK_FLAG(bgp_vrf->vrf_flags, BGP_VRF_AUTO))
|
||||
uninstall_routes_for_vrf(bgp_vrf);
|
||||
|
||||
/* remove the l3vni from vrf instance */
|
||||
bgp_vrf->l3vni = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user