bgpd: Check NHT change for triggering EVPN import or unimport

Ensure that only if there is a change to the path's validity based
on the NHT update, EVPN import or unimport is invoked.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
This commit is contained in:
vivek 2020-05-25 14:15:37 -07:00
parent 9e15d76adf
commit 34ea39b65a

View File

@ -736,7 +736,8 @@ static void evaluate_paths(struct bgp_nexthop_cache *bnc)
* nexthops with labels * nexthops with labels
*/ */
int bnc_is_valid_nexthop = 0; bool bnc_is_valid_nexthop = false;
bool path_valid = false;
if (safi == SAFI_UNICAST && if (safi == SAFI_UNICAST &&
path->sub_type == BGP_ROUTE_IMPORTED && path->sub_type == BGP_ROUTE_IMPORTED &&
@ -744,7 +745,7 @@ static void evaluate_paths(struct bgp_nexthop_cache *bnc)
path->extra->num_labels) { path->extra->num_labels) {
bnc_is_valid_nexthop = bnc_is_valid_nexthop =
bgp_isvalid_labeled_nexthop(bnc) ? 1 : 0; bgp_isvalid_labeled_nexthop(bnc) ? true : false;
} else { } else {
if (bgp_update_martian_nexthop( if (bgp_update_martian_nexthop(
bnc->bgp, afi, safi, path->type, bnc->bgp, afi, safi, path->type,
@ -755,7 +756,7 @@ static void evaluate_paths(struct bgp_nexthop_cache *bnc)
__func__, rn, bgp_path->name); __func__, rn, bgp_path->name);
} else } else
bnc_is_valid_nexthop = bnc_is_valid_nexthop =
bgp_isvalid_nexthop(bnc) ? 1 : 0; bgp_isvalid_nexthop(bnc) ? true : false;
} }
if (BGP_DEBUG(nht, NHT)) { if (BGP_DEBUG(nht, NHT)) {
@ -774,20 +775,6 @@ static void evaluate_paths(struct bgp_nexthop_cache *bnc)
afi, safi, rn, bgp_path->name_pretty, afi, safi, rn, bgp_path->name_pretty,
path->flags); path->flags);
} }
if ((CHECK_FLAG(path->flags, BGP_PATH_VALID) ? 1 : 0)
!= bnc_is_valid_nexthop) {
if (CHECK_FLAG(path->flags, BGP_PATH_VALID)) {
bgp_aggregate_decrement(bgp_path, p, path, afi,
safi);
bgp_path_info_unset_flag(rn, path,
BGP_PATH_VALID);
} else {
bgp_path_info_set_flag(rn, path,
BGP_PATH_VALID);
bgp_aggregate_increment(bgp_path, p, path, afi,
safi);
}
}
/* Copy the metric to the path. Will be used for bestpath /* Copy the metric to the path. Will be used for bestpath
* computation */ * computation */
@ -801,13 +788,33 @@ static void evaluate_paths(struct bgp_nexthop_cache *bnc)
|| CHECK_FLAG(bnc->change_flags, BGP_NEXTHOP_CHANGED)) || CHECK_FLAG(bnc->change_flags, BGP_NEXTHOP_CHANGED))
SET_FLAG(path->flags, BGP_PATH_IGP_CHANGED); SET_FLAG(path->flags, BGP_PATH_IGP_CHANGED);
if (safi == SAFI_EVPN && bgp_evpn_is_prefix_nht_supported(p)) { path_valid = !!CHECK_FLAG(path->flags, BGP_PATH_VALID);
if (CHECK_FLAG(path->flags, BGP_PATH_VALID)) if (path_valid != bnc_is_valid_nexthop) {
bgp_evpn_import_route(bgp_path, afi, safi, p, if (path_valid) {
path); /* No longer valid, clear flag; also for EVPN
else * routes, unimport from VRFs if needed.
bgp_evpn_unimport_route(bgp_path, afi, safi, p, */
path); bgp_aggregate_decrement(bgp_path, p, path, afi,
safi);
bgp_path_info_unset_flag(rn, path,
BGP_PATH_VALID);
if (safi == SAFI_EVPN &&
bgp_evpn_is_prefix_nht_supported(&rn->p))
bgp_evpn_unimport_route(bgp_path,
afi, safi, &rn->p, path);
} else {
/* Path becomes valid, set flag; also for EVPN
* routes, import from VRFs if needed.
*/
bgp_path_info_set_flag(rn, path,
BGP_PATH_VALID);
bgp_aggregate_increment(bgp_path, p, path, afi,
safi);
if (safi == SAFI_EVPN &&
bgp_evpn_is_prefix_nht_supported(&rn->p))
bgp_evpn_import_route(bgp_path,
afi, safi, &rn->p, path);
}
} }
bgp_process(bgp_path, rn, afi, safi); bgp_process(bgp_path, rn, afi, safi);