bgpd: More bgp_node -> bgp_dest cleanup

Some more of the bgp_node usage snuck in from big commits in
the past month or so from feature work.  Do some work
to put it back to bgp_dest for incoming future work.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
Donald Sharp 2020-10-14 11:19:45 -04:00
parent 8228a9a7a5
commit 09319b4e0f
4 changed files with 161 additions and 149 deletions

View File

@ -156,7 +156,7 @@ struct bmp {
* table entry, the sync* fields note down what we sent last
*/
struct prefix syncpos;
struct bgp_node *syncrdpos;
struct bgp_dest *syncrdpos;
uint64_t syncpeerid;
afi_t syncafi;
safi_t syncsafi;

View File

@ -64,9 +64,10 @@ DEFINE_QOBJ_TYPE(bgp_evpn_es)
*/
static int delete_all_vni_routes(struct bgp *bgp, struct bgpevpn *vpn);
static void bgp_evpn_update_type2_route_entry(struct bgp *bgp,
struct bgpevpn *vpn,
struct bgp_node *rn, struct bgp_path_info *local_pi,
const char *caller);
struct bgpevpn *vpn,
struct bgp_dest *dest,
struct bgp_path_info *local_pi,
const char *caller);
static struct in_addr zero_vtep_ip;
/*
@ -545,10 +546,10 @@ static void evpn_convert_nexthop_to_ipv6(struct attr *attr)
attr->mp_nexthop_len = IPV6_MAX_BYTELEN;
}
struct bgp_node *bgp_global_evpn_node_get(
struct bgp_table *table, afi_t afi,
safi_t safi, const struct prefix_evpn *evp,
struct prefix_rd *prd)
struct bgp_dest *bgp_global_evpn_node_get(struct bgp_table *table, afi_t afi,
safi_t safi,
const struct prefix_evpn *evp,
struct prefix_rd *prd)
{
struct prefix_evpn global_p;
@ -562,10 +563,10 @@ struct bgp_node *bgp_global_evpn_node_get(
return bgp_afi_node_get(table, afi, safi, (struct prefix *)evp, prd);
}
struct bgp_node *bgp_global_evpn_node_lookup(
struct bgp_table *table, afi_t afi,
safi_t safi, const struct prefix_evpn *evp,
struct prefix_rd *prd)
struct bgp_dest *bgp_global_evpn_node_lookup(struct bgp_table *table, afi_t afi,
safi_t safi,
const struct prefix_evpn *evp,
struct prefix_rd *prd)
{
struct prefix_evpn global_p;
@ -1359,9 +1360,9 @@ static int update_evpn_type5_route(struct bgp *bgp_vrf, struct prefix_evpn *evp,
}
static void bgp_evpn_get_sync_info(struct bgp *bgp, esi_t *esi,
struct bgp_node *rn, uint32_t loc_seq, uint32_t *max_sync_seq,
bool *active_on_peer, bool *peer_router,
bool *proxy_from_peer)
struct bgp_dest *dest, uint32_t loc_seq,
uint32_t *max_sync_seq, bool *active_on_peer,
bool *peer_router, bool *proxy_from_peer)
{
struct bgp_path_info *tmp_pi;
struct bgp_path_info *second_best_path = NULL;
@ -1372,8 +1373,8 @@ static void bgp_evpn_get_sync_info(struct bgp *bgp, esi_t *esi,
/* find the best non-local path. a local path can only be present
* as best path
*/
for (tmp_pi = bgp_dest_get_bgp_path_info(rn); tmp_pi;
tmp_pi = tmp_pi->next) {
for (tmp_pi = bgp_dest_get_bgp_path_info(dest); tmp_pi;
tmp_pi = tmp_pi->next) {
if (tmp_pi->sub_type != BGP_ROUTE_IMPORTED ||
!CHECK_FLAG(tmp_pi->flags, BGP_PATH_VALID))
continue;
@ -1420,11 +1421,12 @@ static void bgp_evpn_get_sync_info(struct bgp *bgp, esi_t *esi,
* VPN route table. It will take precedence over all sync paths.
*/
static void update_evpn_route_entry_sync_info(struct bgp *bgp,
struct bgp_node *rn, struct attr *attr, uint32_t loc_seq,
bool setup_sync)
struct bgp_dest *dest,
struct attr *attr,
uint32_t loc_seq, bool setup_sync)
{
esi_t *esi;
struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
struct prefix_evpn *evp = (struct prefix_evpn *)&dest->p;
if (evp->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
return;
@ -1437,9 +1439,9 @@ static void update_evpn_route_entry_sync_info(struct bgp *bgp,
bool peer_router = false;
bool proxy_from_peer = false;
bgp_evpn_get_sync_info(bgp, esi, rn, loc_seq,
&max_sync_seq, &active_on_peer,
&peer_router, &proxy_from_peer);
bgp_evpn_get_sync_info(bgp, esi, dest, loc_seq,
&max_sync_seq, &active_on_peer,
&peer_router, &proxy_from_peer);
attr->mm_sync_seqnum = max_sync_seq;
if (active_on_peer)
attr->es_flags |= ATTR_ES_PEER_ACTIVE;
@ -1937,8 +1939,10 @@ static int delete_evpn_route(struct bgp *bgp, struct bgpevpn *vpn,
}
static void bgp_evpn_update_type2_route_entry(struct bgp *bgp,
struct bgpevpn *vpn, struct bgp_node *rn,
struct bgp_path_info *local_pi, const char *caller)
struct bgpevpn *vpn,
struct bgp_dest *dest,
struct bgp_path_info *local_pi,
const char *caller)
{
afi_t afi = AFI_L2VPN;
safi_t safi = SAFI_EVPN;
@ -1947,9 +1951,9 @@ static void bgp_evpn_update_type2_route_entry(struct bgp *bgp,
struct attr *attr_new;
uint32_t seq;
int add_l3_ecomm = 0;
struct bgp_node *global_rn;
struct bgp_dest *global_dest;
struct bgp_path_info *global_pi;
struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
struct prefix_evpn *evp = (struct prefix_evpn *)&dest->p;
int route_change;
bool old_is_sync = false;
@ -2008,9 +2012,9 @@ static void bgp_evpn_update_type2_route_entry(struct bgp *bgp,
}
/* Update the route entry. */
route_change = update_evpn_route_entry(bgp, vpn, afi, safi,
rn, &attr, 0, &pi, 0, seq,
true /* setup_sync */, &old_is_sync);
route_change = update_evpn_route_entry(
bgp, vpn, afi, safi, dest, &attr, 0, &pi, 0, seq,
true /* setup_sync */, &old_is_sync);
assert(pi);
attr_new = pi->attr;
@ -2026,14 +2030,14 @@ static void bgp_evpn_update_type2_route_entry(struct bgp *bgp,
* advertised to peers; otherwise, ensure it is evicted and
* (re)install the remote route into zebra.
*/
evpn_route_select_install(bgp, vpn, rn);
evpn_route_select_install(bgp, vpn, dest);
if (CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) {
route_change = 0;
} else {
if (!CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) {
route_change = 0;
evpn_cleanup_local_non_best_route(bgp, vpn, rn, pi);
evpn_cleanup_local_non_best_route(bgp, vpn, dest, pi);
} else {
bool new_is_sync;
@ -2056,17 +2060,17 @@ static void bgp_evpn_update_type2_route_entry(struct bgp *bgp,
if (route_change) {
/* Update route in global routing table. */
global_rn = bgp_global_evpn_node_get(bgp->rib[afi][safi],
afi, safi, evp, &vpn->prd);
assert(global_rn);
update_evpn_route_entry(bgp, vpn, afi, safi, global_rn,
attr_new, 0, &global_pi, 0,
mac_mobility_seqnum(attr_new),
false /* setup_sync */, NULL /* old_is_sync */);
global_dest = bgp_global_evpn_node_get(bgp->rib[afi][safi], afi,
safi, evp, &vpn->prd);
assert(global_dest);
update_evpn_route_entry(
bgp, vpn, afi, safi, global_dest, attr_new, 0,
&global_pi, 0, mac_mobility_seqnum(attr_new),
false /* setup_sync */, NULL /* old_is_sync */);
/* Schedule for processing and unlock node. */
bgp_process(bgp, global_rn, afi, safi);
bgp_dest_unlock_node(global_rn);
bgp_process(bgp, global_dest, afi, safi);
bgp_dest_unlock_node(global_dest);
}
/* Unintern temporary. */

View File

@ -82,8 +82,8 @@ esi_t zero_esi_buf, *zero_esi = &zero_esi_buf;
* installed in the ES's routing table.
*/
static int bgp_evpn_es_route_select_install(struct bgp *bgp,
struct bgp_evpn_es *es,
struct bgp_node *rn)
struct bgp_evpn_es *es,
struct bgp_dest *dest)
{
int ret = 0;
afi_t afi = AFI_L2VPN;
@ -93,8 +93,8 @@ static int bgp_evpn_es_route_select_install(struct bgp *bgp,
struct bgp_path_info_pair old_and_new;
/* Compute the best path. */
bgp_best_selection(bgp, rn, &bgp->maxpaths[afi][safi],
&old_and_new, afi, safi);
bgp_best_selection(bgp, dest, &bgp->maxpaths[afi][safi], &old_and_new,
afi, safi);
old_select = old_and_new.old;
new_select = old_and_new.new;
@ -103,35 +103,36 @@ static int bgp_evpn_es_route_select_install(struct bgp *bgp,
* updated
*/
if (old_select && old_select == new_select
&& old_select->type == ZEBRA_ROUTE_BGP
&& old_select->sub_type == BGP_ROUTE_IMPORTED
&& !CHECK_FLAG(rn->flags, BGP_NODE_USER_CLEAR)
&& !CHECK_FLAG(old_select->flags, BGP_PATH_ATTR_CHANGED)
&& !bgp_addpath_is_addpath_used(&bgp->tx_addpath, afi, safi)) {
&& old_select->type == ZEBRA_ROUTE_BGP
&& old_select->sub_type == BGP_ROUTE_IMPORTED
&& !CHECK_FLAG(dest->flags, BGP_NODE_USER_CLEAR)
&& !CHECK_FLAG(old_select->flags, BGP_PATH_ATTR_CHANGED)
&& !bgp_addpath_is_addpath_used(&bgp->tx_addpath, afi, safi)) {
if (bgp_zebra_has_route_changed(old_select)) {
bgp_evpn_es_vtep_add(bgp, es,
old_select->attr->nexthop,
true /*esr*/);
}
UNSET_FLAG(old_select->flags, BGP_PATH_MULTIPATH_CHG);
bgp_zebra_clear_route_change_flags(rn);
bgp_zebra_clear_route_change_flags(dest);
return ret;
}
/* If the user did a "clear" this flag will be set */
UNSET_FLAG(rn->flags, BGP_NODE_USER_CLEAR);
UNSET_FLAG(dest->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);
bgp_bump_version(dest);
if (old_select)
bgp_path_info_unset_flag(rn, old_select, BGP_PATH_SELECTED);
bgp_path_info_unset_flag(dest, old_select, BGP_PATH_SELECTED);
if (new_select) {
bgp_path_info_set_flag(rn, new_select, BGP_PATH_SELECTED);
bgp_path_info_unset_flag(rn, new_select, BGP_PATH_ATTR_CHANGED);
bgp_path_info_set_flag(dest, new_select, BGP_PATH_SELECTED);
bgp_path_info_unset_flag(dest, new_select,
BGP_PATH_ATTR_CHANGED);
UNSET_FLAG(new_select->flags, BGP_PATH_MULTIPATH_CHG);
}
@ -148,11 +149,11 @@ static int bgp_evpn_es_route_select_install(struct bgp *bgp,
}
/* Clear any route change flags. */
bgp_zebra_clear_route_change_flags(rn);
bgp_zebra_clear_route_change_flags(dest);
/* Reap old select bgp_path_info, if it has been removed */
if (old_select && CHECK_FLAG(old_select->flags, BGP_PATH_REMOVED))
bgp_path_info_reap(rn, old_select);
bgp_path_info_reap(dest, old_select);
return ret;
}
@ -163,17 +164,17 @@ static int bgp_evpn_es_route_install(struct bgp *bgp,
struct bgp_path_info *parent_pi)
{
int ret = 0;
struct bgp_node *rn = NULL;
struct bgp_dest *dest = NULL;
struct bgp_path_info *pi = NULL;
struct attr *attr_new = NULL;
/* Create (or fetch) route within the VNI.
* NOTE: There is no RD here.
*/
rn = bgp_node_get(es->route_table, (struct prefix *)p);
dest = bgp_node_get(es->route_table, (struct prefix *)p);
/* Check if route entry is already present. */
for (pi = bgp_dest_get_bgp_path_info(rn); pi; pi = pi->next)
for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next)
if (pi->extra
&& (struct bgp_path_info *)pi->extra->parent ==
parent_pi)
@ -185,16 +186,16 @@ static int bgp_evpn_es_route_install(struct bgp *bgp,
/* Create new route with its attribute. */
pi = info_make(parent_pi->type, BGP_ROUTE_IMPORTED, 0,
parent_pi->peer, attr_new, rn);
parent_pi->peer, attr_new, dest);
SET_FLAG(pi->flags, BGP_PATH_VALID);
bgp_path_info_extra_get(pi);
pi->extra->parent = bgp_path_info_lock(parent_pi);
bgp_dest_lock_node((struct bgp_node *)parent_pi->net);
bgp_path_info_add(rn, pi);
bgp_dest_lock_node((struct bgp_dest *)parent_pi->net);
bgp_path_info_add(dest, pi);
} else {
if (attrhash_cmp(pi->attr, parent_pi->attr)
&& !CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) {
bgp_dest_unlock_node(rn);
bgp_dest_unlock_node(dest);
return 0;
}
/* The attribute has changed. */
@ -203,7 +204,7 @@ static int bgp_evpn_es_route_install(struct bgp *bgp,
/* Restore route, if needed. */
if (CHECK_FLAG(pi->flags, BGP_PATH_REMOVED))
bgp_path_info_restore(rn, pi);
bgp_path_info_restore(dest, pi);
/* Mark if nexthop has changed. */
if (!IPV4_ADDR_SAME(&pi->attr->nexthop, &attr_new->nexthop))
@ -216,9 +217,9 @@ static int bgp_evpn_es_route_install(struct bgp *bgp,
}
/* Perform route selection and update zebra, if required. */
ret = bgp_evpn_es_route_select_install(bgp, es, rn);
ret = bgp_evpn_es_route_select_install(bgp, es, dest);
bgp_dest_unlock_node(rn);
bgp_dest_unlock_node(dest);
return ret;
}
@ -228,7 +229,7 @@ static int bgp_evpn_es_route_uninstall(struct bgp *bgp, struct bgp_evpn_es *es,
struct prefix_evpn *p, struct bgp_path_info *parent_pi)
{
int ret;
struct bgp_node *rn;
struct bgp_dest *dest;
struct bgp_path_info *pi;
if (!es->route_table)
@ -237,12 +238,12 @@ static int bgp_evpn_es_route_uninstall(struct bgp *bgp, struct bgp_evpn_es *es,
/* Locate route within the ESI.
* NOTE: There is no RD here.
*/
rn = bgp_node_lookup(es->route_table, (struct prefix *)p);
if (!rn)
dest = bgp_node_lookup(es->route_table, (struct prefix *)p);
if (!dest)
return 0;
/* Find matching route entry. */
for (pi = bgp_dest_get_bgp_path_info(rn); pi; pi = pi->next)
for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next)
if (pi->extra
&& (struct bgp_path_info *)pi->extra->parent ==
parent_pi)
@ -252,13 +253,13 @@ static int bgp_evpn_es_route_uninstall(struct bgp *bgp, struct bgp_evpn_es *es,
return 0;
/* Mark entry for deletion */
bgp_path_info_delete(rn, pi);
bgp_path_info_delete(dest, pi);
/* Perform route selection and update zebra, if required. */
ret = bgp_evpn_es_route_select_install(bgp, es, rn);
ret = bgp_evpn_es_route_select_install(bgp, es, dest);
/* Unlock route node. */
bgp_dest_unlock_node(rn);
bgp_dest_unlock_node(dest);
return ret;
}
@ -293,7 +294,7 @@ int bgp_evpn_es_route_install_uninstall(struct bgp *bgp, struct bgp_evpn_es *es,
*/
static void bgp_evpn_es_route_del_all(struct bgp *bgp, struct bgp_evpn_es *es)
{
struct bgp_node *rn;
struct bgp_dest *dest;
struct bgp_path_info *pi, *nextpi;
/* de-activate the ES */
@ -301,13 +302,12 @@ static void bgp_evpn_es_route_del_all(struct bgp *bgp, struct bgp_evpn_es *es)
bgp_evpn_local_type1_evi_route_del(bgp, es);
/* Walk this ES's routing table and delete all routes. */
for (rn = bgp_table_top(es->route_table); rn;
rn = bgp_route_next(rn)) {
for (pi = bgp_dest_get_bgp_path_info(rn);
(pi != NULL) && (nextpi = pi->next, 1);
pi = nextpi) {
bgp_path_info_delete(rn, pi);
bgp_path_info_reap(rn, pi);
for (dest = bgp_table_top(es->route_table); dest;
dest = bgp_route_next(dest)) {
for (pi = bgp_dest_get_bgp_path_info(dest);
(pi != NULL) && (nextpi = pi->next, 1); pi = nextpi) {
bgp_path_info_delete(dest, pi);
bgp_path_info_reap(dest, pi);
}
}
}
@ -327,10 +327,11 @@ static void bgp_evpn_es_route_del_all(struct bgp *bgp, struct bgp_evpn_es *es)
* Note: vpn is applicable only to EAD-EVI routes (NULL for EAD-ES and
* ESR).
*/
static int bgp_evpn_mh_route_update(struct bgp *bgp,
struct bgp_evpn_es *es, struct bgpevpn *vpn, afi_t afi,
safi_t safi, struct bgp_node *rn, struct attr *attr,
int add, struct bgp_path_info **ri, int *route_changed)
static int bgp_evpn_mh_route_update(struct bgp *bgp, struct bgp_evpn_es *es,
struct bgpevpn *vpn, afi_t afi, safi_t safi,
struct bgp_dest *dest, struct attr *attr,
int add, struct bgp_path_info **ri,
int *route_changed)
{
struct bgp_path_info *tmp_pi = NULL;
struct bgp_path_info *local_pi = NULL; /* local route entry if any */
@ -339,11 +340,11 @@ static int bgp_evpn_mh_route_update(struct bgp *bgp,
struct prefix_evpn *evp;
*ri = NULL;
evp = (struct prefix_evpn *)&rn->p;
evp = (struct prefix_evpn *)&dest->p;
*route_changed = 1;
/* locate the local and remote entries if any */
for (tmp_pi = bgp_dest_get_bgp_path_info(rn); tmp_pi;
for (tmp_pi = bgp_dest_get_bgp_path_info(dest); tmp_pi;
tmp_pi = tmp_pi->next) {
if (tmp_pi->peer == bgp->peer_self
&& tmp_pi->type == ZEBRA_ROUTE_BGP
@ -379,7 +380,7 @@ static int bgp_evpn_mh_route_update(struct bgp *bgp,
/* Create new route with its attribute. */
tmp_pi = info_make(ZEBRA_ROUTE_BGP, BGP_ROUTE_STATIC, 0,
bgp->peer_self, attr_new, rn);
bgp->peer_self, attr_new, dest);
SET_FLAG(tmp_pi->flags, BGP_PATH_VALID);
if (evp->prefix.route_type == BGP_EVPN_AD_ROUTE) {
@ -392,7 +393,7 @@ static int bgp_evpn_mh_route_update(struct bgp *bgp,
}
/* add the newly created path to the route-node */
bgp_path_info_add(rn, tmp_pi);
bgp_path_info_add(dest, tmp_pi);
} else {
tmp_pi = local_pi;
if (attrhash_cmp(tmp_pi->attr, attr)
@ -403,12 +404,12 @@ static int bgp_evpn_mh_route_update(struct bgp *bgp,
* Add (or update) attribute to hash.
*/
attr_new = bgp_attr_intern(attr);
bgp_path_info_set_flag(rn, tmp_pi,
BGP_PATH_ATTR_CHANGED);
bgp_path_info_set_flag(dest, tmp_pi,
BGP_PATH_ATTR_CHANGED);
/* Restore route, if needed. */
if (CHECK_FLAG(tmp_pi->flags, BGP_PATH_REMOVED))
bgp_path_info_restore(rn, tmp_pi);
bgp_path_info_restore(dest, tmp_pi);
/* Unintern existing, set to new. */
bgp_attr_unintern(&tmp_pi->attr);
@ -444,8 +445,8 @@ static int bgp_evpn_mh_route_delete(struct bgp *bgp, struct bgp_evpn_es *es,
afi_t afi = AFI_L2VPN;
safi_t safi = SAFI_EVPN;
struct bgp_path_info *pi;
struct bgp_node *rn = NULL; /* rn in esi table */
struct bgp_node *global_rn = NULL; /* rn in global table */
struct bgp_dest *dest = NULL; /* dest in esi table */
struct bgp_dest *global_dest = NULL; /* dest in global table */
struct bgp_table *rt_table;
struct prefix_rd *prd;
@ -461,8 +462,8 @@ static int bgp_evpn_mh_route_delete(struct bgp *bgp, struct bgp_evpn_es *es,
* If it doesn't exist, ther is nothing to do.
* Note: there is no RD here.
*/
rn = bgp_node_lookup(rt_table, (struct prefix *)p);
if (!rn)
dest = bgp_node_lookup(rt_table, (struct prefix *)p);
if (!dest)
return 0;
if (BGP_DEBUG(evpn_mh, EVPN_MH_RT))
@ -476,29 +477,30 @@ static int bgp_evpn_mh_route_delete(struct bgp *bgp, struct bgp_evpn_es *es,
/* Next, locate route node in the global EVPN routing table.
* Note that this table is a 2-level tree (RD-level + Prefix-level)
*/
global_rn = bgp_global_evpn_node_lookup(bgp->rib[afi][safi], afi, safi,
(const struct prefix_evpn *)p, prd);
if (global_rn) {
global_dest =
bgp_global_evpn_node_lookup(bgp->rib[afi][safi], afi, safi,
(const struct prefix_evpn *)p, prd);
if (global_dest) {
/* Delete route entry in the global EVPN table. */
delete_evpn_route_entry(bgp, afi, safi, global_rn, &pi);
delete_evpn_route_entry(bgp, afi, safi, global_dest, &pi);
/* Schedule for processing - withdraws to peers happen from
* this table.
*/
if (pi)
bgp_process(bgp, global_rn, afi, safi);
bgp_dest_unlock_node(global_rn);
bgp_process(bgp, global_dest, afi, safi);
bgp_dest_unlock_node(global_dest);
}
/*
* Delete route entry in the ESI or VNI routing table.
* This can just be removed.
*/
delete_evpn_route_entry(bgp, afi, safi, rn, &pi);
delete_evpn_route_entry(bgp, afi, safi, dest, &pi);
if (pi)
bgp_path_info_reap(rn, pi);
bgp_dest_unlock_node(rn);
bgp_path_info_reap(dest, pi);
bgp_dest_unlock_node(dest);
return 0;
}
@ -551,7 +553,7 @@ static int bgp_evpn_type4_route_update(struct bgp *bgp,
safi_t safi = SAFI_EVPN;
struct attr attr;
struct attr *attr_new = NULL;
struct bgp_node *rn = NULL;
struct bgp_dest *dest = NULL;
struct bgp_path_info *pi = NULL;
memset(&attr, 0, sizeof(struct attr));
@ -567,11 +569,11 @@ static int bgp_evpn_type4_route_update(struct bgp *bgp,
/* First, create (or fetch) route node within the ESI. */
/* NOTE: There is no RD here. */
rn = bgp_node_get(es->route_table, (struct prefix *)p);
dest = bgp_node_get(es->route_table, (struct prefix *)p);
/* Create or update route entry. */
ret = bgp_evpn_mh_route_update(bgp, es, NULL, afi, safi,
rn, &attr, 1, &pi, &route_changed);
ret = bgp_evpn_mh_route_update(bgp, es, NULL, afi, safi, dest, &attr, 1,
&pi, &route_changed);
if (ret != 0) {
flog_err(EC_BGP_ES_INVALID,
"%u ERROR: Failed to updated ES route ESI: %s VTEP %s",
@ -586,8 +588,8 @@ static int bgp_evpn_type4_route_update(struct bgp *bgp,
* this is just to set the flags correctly
* as local route in the ES always wins.
*/
bgp_evpn_es_route_select_install(bgp, es, rn);
bgp_dest_unlock_node(rn);
bgp_evpn_es_route_select_install(bgp, es, dest);
bgp_dest_unlock_node(dest);
/* If this is a new route or some attribute has changed, export the
* route to the global table. The route will be advertised to peers
@ -597,14 +599,15 @@ static int bgp_evpn_type4_route_update(struct bgp *bgp,
if (route_changed) {
struct bgp_path_info *global_pi;
rn = bgp_global_evpn_node_get(bgp->rib[afi][safi], afi, safi,
p, &es->prd);
bgp_evpn_mh_route_update(bgp, es, NULL, afi, safi,
rn, attr_new, 1, &global_pi, &route_changed);
dest = bgp_global_evpn_node_get(bgp->rib[afi][safi], afi, safi,
p, &es->prd);
bgp_evpn_mh_route_update(bgp, es, NULL, afi, safi, dest,
attr_new, 1, &global_pi,
&route_changed);
/* Schedule for processing and unlock node. */
bgp_process(bgp, rn, afi, safi);
bgp_dest_unlock_node(rn);
bgp_process(bgp, dest, afi, safi);
bgp_dest_unlock_node(dest);
}
/* Unintern temporary. */
@ -695,7 +698,7 @@ static int bgp_evpn_type4_remote_routes_import(struct bgp *bgp,
afi_t afi;
safi_t safi;
char buf[PREFIX_STRLEN];
struct bgp_node *rd_rn, *rn;
struct bgp_dest *rd_dest, *dest;
struct bgp_table *table;
struct bgp_path_info *pi;
@ -705,17 +708,19 @@ static int bgp_evpn_type4_remote_routes_import(struct bgp *bgp,
/* Walk entire global routing table and evaluate routes which could be
* imported into this Ethernet Segment.
*/
for (rd_rn = bgp_table_top(bgp->rib[afi][safi]); rd_rn;
rd_rn = bgp_route_next(rd_rn)) {
table = bgp_dest_get_bgp_table_info(rd_rn);
for (rd_dest = bgp_table_top(bgp->rib[afi][safi]); rd_dest;
rd_dest = bgp_route_next(rd_dest)) {
table = bgp_dest_get_bgp_table_info(rd_dest);
if (!table)
continue;
for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) {
struct prefix_evpn *evp = (struct prefix_evpn *)&rn->p;
for (dest = bgp_table_top(table); dest;
dest = bgp_route_next(dest)) {
struct prefix_evpn *evp =
(struct prefix_evpn *)&dest->p;
for (pi = bgp_dest_get_bgp_path_info(rn); pi;
pi = pi->next) {
for (pi = bgp_dest_get_bgp_path_info(dest); pi;
pi = pi->next) {
/*
* Consider "valid" remote routes applicable for
* this ES.
@ -845,7 +850,7 @@ static int bgp_evpn_type1_route_update(struct bgp *bgp,
safi_t safi = SAFI_EVPN;
struct attr attr;
struct attr *attr_new = NULL;
struct bgp_node *rn = NULL;
struct bgp_dest *dest = NULL;
struct bgp_path_info *pi = NULL;
int route_changed = 0;
struct prefix_rd *global_rd;
@ -867,11 +872,11 @@ static int bgp_evpn_type1_route_update(struct bgp *bgp,
bgp_evpn_type1_evi_route_extcomm_build(es, vpn, &attr);
/* First, create (or fetch) route node within the VNI. */
rn = bgp_node_get(vpn->route_table, (struct prefix *)p);
dest = bgp_node_get(vpn->route_table, (struct prefix *)p);
/* Create or update route entry. */
ret = bgp_evpn_mh_route_update(bgp, es, vpn, afi, safi,
rn, &attr, 1, &pi, &route_changed);
ret = bgp_evpn_mh_route_update(bgp, es, vpn, afi, safi, dest,
&attr, 1, &pi, &route_changed);
if (ret != 0) {
flog_err(EC_BGP_ES_INVALID,
"%u Failed to update EAD-EVI route ESI: %s VNI %u VTEP %s",
@ -889,11 +894,11 @@ static int bgp_evpn_type1_route_update(struct bgp *bgp,
/* First, create (or fetch) route node within the ES. */
/* NOTE: There is no RD here. */
/* XXX: fragment ID must be included as a part of the prefix. */
rn = bgp_node_get(es->route_table, (struct prefix *)p);
dest = bgp_node_get(es->route_table, (struct prefix *)p);
/* Create or update route entry. */
ret = bgp_evpn_mh_route_update(bgp, es, vpn, afi, safi,
rn, &attr, 1, &pi, &route_changed);
ret = bgp_evpn_mh_route_update(bgp, es, vpn, afi, safi, dest,
&attr, 1, &pi, &route_changed);
if (ret != 0) {
flog_err(EC_BGP_ES_INVALID,
"%u ERROR: Failed to updated EAD-EVI route ESI: %s VTEP %s",
@ -911,8 +916,8 @@ static int bgp_evpn_type1_route_update(struct bgp *bgp,
* this is just to set the flags correctly as local route in
* the ES always wins.
*/
evpn_route_select_install(bgp, vpn, rn);
bgp_dest_unlock_node(rn);
evpn_route_select_install(bgp, vpn, dest);
bgp_dest_unlock_node(dest);
/* If this is a new route or some attribute has changed, export the
* route to the global table. The route will be advertised to peers
@ -922,14 +927,15 @@ static int bgp_evpn_type1_route_update(struct bgp *bgp,
if (route_changed) {
struct bgp_path_info *global_pi;
rn = bgp_global_evpn_node_get(bgp->rib[afi][safi], afi, safi,
p, global_rd);
bgp_evpn_mh_route_update(bgp, es, vpn, afi, safi,
rn, attr_new, 1, &global_pi, &route_changed);
dest = bgp_global_evpn_node_get(bgp->rib[afi][safi], afi, safi,
p, global_rd);
bgp_evpn_mh_route_update(bgp, es, vpn, afi, safi, dest,
attr_new, 1, &global_pi,
&route_changed);
/* Schedule for processing and unlock node. */
bgp_process(bgp, rn, afi, safi);
bgp_dest_unlock_node(rn);
bgp_process(bgp, dest, afi, safi);
bgp_dest_unlock_node(dest);
}
/* Unintern temporary. */

View File

@ -603,11 +603,13 @@ extern void delete_evpn_route_entry(struct bgp *bgp, afi_t afi, safi_t safi,
struct bgp_path_info **pi);
int vni_list_cmp(void *p1, void *p2);
extern int evpn_route_select_install(struct bgp *bgp, struct bgpevpn *vpn,
struct bgp_node *rn);
extern struct bgp_node *bgp_global_evpn_node_get(
struct bgp_table *table, afi_t afi, safi_t safi,
const struct prefix_evpn *evp, struct prefix_rd *prd);
extern struct bgp_node *bgp_global_evpn_node_lookup(
struct bgp_table *table, afi_t afi, safi_t safi,
const struct prefix_evpn *evp, struct prefix_rd *prd);
struct bgp_dest *dest);
extern struct bgp_dest *bgp_global_evpn_node_get(struct bgp_table *table,
afi_t afi, safi_t safi,
const struct prefix_evpn *evp,
struct prefix_rd *prd);
extern struct bgp_dest *
bgp_global_evpn_node_lookup(struct bgp_table *table, afi_t afi, safi_t safi,
const struct prefix_evpn *evp,
struct prefix_rd *prd);
#endif /* _BGP_EVPN_PRIVATE_H */