diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index ea54c14222cf..ca23716416c2 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -2496,8 +2496,11 @@ static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf, pi = bgp_create_evpn_bgp_path_info(parent_pi, dest, &attr); new_pi = true; } else { - if (attrhash_cmp(pi->attr, &attr) - && !CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) { + if (attrhash_cmp(pi->attr, &attr) && + ((pi->extra && parent_pi->extra && + pi->extra->igpmetric == parent_pi->extra->igpmetric) || + (!pi->extra && !parent_pi->extra)) && + !CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) { bgp_dest_unlock_node(dest); return 0; } diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index 19ae1372084f..a8488d77ed7d 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -1079,31 +1079,33 @@ void evaluate_paths(struct bgp_nexthop_cache *bnc) path_valid = CHECK_FLAG(path->flags, BGP_PATH_VALID); if (path_valid != bnc_is_valid_nexthop) { if (path_valid) { - /* No longer valid, clear flag; also for EVPN - * routes, unimport from VRFs if needed. - */ + /* No longer valid, clear flag */ bgp_aggregate_decrement(bgp_path, p, path, afi, safi); bgp_path_info_unset_flag(dest, path, BGP_PATH_VALID); - if (safi == SAFI_EVPN && - bgp_evpn_is_prefix_nht_supported(bgp_dest_get_prefix(dest))) - bgp_evpn_unimport_route(bgp_path, - afi, safi, bgp_dest_get_prefix(dest), path); } else { - /* Path becomes valid, set flag; also for EVPN - * routes, import from VRFs if needed. - */ + /* Path becomes valid, set flag */ bgp_path_info_set_flag(dest, path, BGP_PATH_VALID); bgp_aggregate_increment(bgp_path, p, path, afi, safi); - if (safi == SAFI_EVPN && - bgp_evpn_is_prefix_nht_supported(bgp_dest_get_prefix(dest))) - bgp_evpn_import_route(bgp_path, - afi, safi, bgp_dest_get_prefix(dest), path); } } + if ((path_valid != bnc_is_valid_nexthop || + CHECK_FLAG(path->flags, BGP_PATH_IGP_CHANGED)) && + safi == SAFI_EVPN && + bgp_evpn_is_prefix_nht_supported( + bgp_dest_get_prefix(dest))) { + if (bnc_is_valid_nexthop) + bgp_evpn_import_route(bgp_path, afi, safi, + bgp_dest_get_prefix(dest), + path); + else + bgp_evpn_unimport_route( + bgp_path, afi, safi, + bgp_dest_get_prefix(dest), path); + } bgp_process(bgp_path, dest, afi, safi); }