X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=bgpd%2Fbgp_route.c;h=2c361bef4d5b2693f85bd1289914d44da0a86176;hb=2569910bb6e5c00ececc60ed15b182e14a88cb9d;hp=8cefb3ff3988886a1c7f6f632c53b36b87e2914d;hpb=6c9e36f8e23be7b101f3f9952f5d6d44e8a424b1;p=mirror_frr.git diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 8cefb3ff3..2c361bef4 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -120,11 +120,12 @@ struct bgp_node *bgp_afi_node_get(struct bgp_table *table, afi_t afi, || (safi == SAFI_EVPN)) { prn = bgp_node_get(table, (struct prefix *)prd); - if (prn->info == NULL) - prn->info = bgp_table_init(table->bgp, afi, safi); + if (!bgp_node_has_bgp_path_info_data(prn)) + bgp_node_set_bgp_table_info( + prn, bgp_table_init(table->bgp, afi, safi)); else bgp_unlock_node(prn); - table = prn->info; + table = bgp_node_get_bgp_table_info(prn); } rn = bgp_node_get(table, p); @@ -152,12 +153,12 @@ struct bgp_node *bgp_afi_node_lookup(struct bgp_table *table, afi_t afi, if (!prn) return NULL; - if (prn->info == NULL) { + if (!bgp_node_has_bgp_path_info_data(prn)) { bgp_unlock_node(prn); return NULL; } - table = prn->info; + table = bgp_node_get_bgp_table_info(prn); } rn = bgp_node_lookup(table, p); @@ -291,13 +292,13 @@ void bgp_path_info_add(struct bgp_node *rn, struct bgp_path_info *pi) { struct bgp_path_info *top; - top = rn->info; + top = bgp_node_get_bgp_path_info(rn); - pi->next = rn->info; + pi->next = top; pi->prev = NULL; if (top) top->prev = pi; - rn->info = pi; + bgp_node_set_bgp_path_info(rn, pi); bgp_path_info_lock(pi); bgp_lock_node(rn); @@ -313,7 +314,7 @@ void bgp_path_info_reap(struct bgp_node *rn, struct bgp_path_info *pi) if (pi->prev) pi->prev->next = pi->next; else - rn->info = pi->next; + bgp_node_set_bgp_path_info(rn, pi->next); bgp_path_info_mpath_dequeue(pi); bgp_path_info_unlock(pi); @@ -1895,11 +1896,13 @@ void bgp_best_selection(struct bgp *bgp, struct bgp_node *rn, if (bgp_flag_check(bgp, BGP_FLAG_DETERMINISTIC_MED)) { /* Clear BGP_PATH_DMED_SELECTED for all paths */ - for (pi1 = rn->info; pi1; pi1 = pi1->next) + for (pi1 = bgp_node_get_bgp_path_info(rn); pi1; + pi1 = pi1->next) bgp_path_info_unset_flag(rn, pi1, BGP_PATH_DMED_SELECTED); - for (pi1 = rn->info; pi1; pi1 = pi1->next) { + for (pi1 = bgp_node_get_bgp_path_info(rn); pi1; + pi1 = pi1->next) { if (CHECK_FLAG(pi1->flags, BGP_PATH_DMED_CHECK)) continue; if (BGP_PATH_HOLDDOWN(pi1)) @@ -1965,8 +1968,8 @@ void bgp_best_selection(struct bgp *bgp, struct bgp_node *rn, /* Check old selected route and new selected route. */ old_select = NULL; new_select = NULL; - for (pi = rn->info; (pi != NULL) && (nextpi = pi->next, 1); - pi = nextpi) { + for (pi = bgp_node_get_bgp_path_info(rn); + (pi != NULL) && (nextpi = pi->next, 1); pi = nextpi) { if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) old_select = pi; @@ -2030,8 +2033,8 @@ void bgp_best_selection(struct bgp *bgp, struct bgp_node *rn, } if (do_mpath && new_select) { - for (pi = rn->info; (pi != NULL) && (nextpi = pi->next, 1); - pi = nextpi) { + for (pi = bgp_node_get_bgp_path_info(rn); + (pi != NULL) && (nextpi = pi->next, 1); pi = nextpi) { if (debug) bgp_path_info_path_with_addpath_rx_str( @@ -2151,7 +2154,7 @@ void bgp_zebra_clear_route_change_flags(struct bgp_node *rn) { struct bgp_path_info *pi; - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) { if (BGP_PATH_HOLDDOWN(pi)) continue; UNSET_FLAG(pi->flags, BGP_PATH_IGP_CHANGED); @@ -2262,20 +2265,26 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_node *rn, /* Do we need to allocate or free labels? * Right now, since we only deal with per-prefix labels, it is not - * necessary to do this upon changes to best path except if the label - * index changes + * necessary to do this upon changes to best path. Exceptions: + * - label index has changed -> recalculate resulting label + * - path_info sub_type changed -> switch to/from implicit-null + * - no valid label (due to removed static label binding) -> get new one */ if (bgp->allocate_mpls_labels[afi][safi]) { if (new_select) { if (!old_select || bgp_label_index_differs(new_select, old_select) - || new_select->sub_type != old_select->sub_type) { + || new_select->sub_type != old_select->sub_type + || !bgp_is_valid_label(&rn->local_label)) { + /* Enforced penultimate hop popping: + * implicit-null for local routes, aggregate + * and redistributed routes + */ if (new_select->sub_type == BGP_ROUTE_STATIC - && new_select->attr->flag - & ATTR_FLAG_BIT( - BGP_ATTR_PREFIX_SID) - && new_select->attr->label_index - != BGP_INVALID_LABEL_INDEX) { + || new_select->sub_type + == BGP_ROUTE_AGGREGATE + || new_select->sub_type + == BGP_ROUTE_REDISTRIBUTE) { if (CHECK_FLAG( rn->flags, BGP_NODE_REGISTERED_FOR_LABEL)) @@ -2741,8 +2750,8 @@ static void bgp_rib_withdraw(struct bgp_node *rn, struct bgp_path_info *pi, prn = bgp_node_get(peer->bgp->rib[afi][safi], (struct prefix *)prd); - if (prn->info) { - table = (struct bgp_table *)(prn->info); + if (bgp_node_has_bgp_path_info_data(prn)) { + table = bgp_node_get_bgp_table_info(prn); vnc_import_bgp_del_vnc_host_route_mode_resolve_nve( peer->bgp, prd, table, &rn->p, pi); @@ -2948,7 +2957,7 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id, bgp_adj_in_set(rn, peer, attr, addpath_id); /* Check previously received route. */ - for (pi = rn->info; pi; pi = pi->next) + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) if (pi->peer == peer && pi->type == type && pi->sub_type == sub_type && pi->addpath_rx_id == addpath_id) @@ -3172,8 +3181,8 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id, prn = bgp_node_get(bgp->rib[afi][safi], (struct prefix *)prd); - if (prn->info) { - table = (struct bgp_table *)(prn->info); + if (bgp_node_has_bgp_path_info_data(prn)) { + table = bgp_node_get_bgp_table_info(prn); vnc_import_bgp_del_vnc_host_route_mode_resolve_nve( bgp, prd, table, p, pi); @@ -3322,8 +3331,8 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id, prn = bgp_node_get(bgp->rib[afi][safi], (struct prefix *)prd); - if (prn->info) { - table = (struct bgp_table *)(prn->info); + if (bgp_node_has_bgp_path_info_data(prn)) { + table = bgp_node_get_bgp_table_info(prn); vnc_import_bgp_add_vnc_host_route_mode_resolve_nve( bgp, prd, table, p, pi); @@ -3459,8 +3468,8 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id, struct bgp_table *table = NULL; prn = bgp_node_get(bgp->rib[afi][safi], (struct prefix *)prd); - if (prn->info) { - table = (struct bgp_table *)(prn->info); + if (bgp_node_has_bgp_path_info_data(prn)) { + table = bgp_node_get_bgp_table_info(prn); vnc_import_bgp_add_vnc_host_route_mode_resolve_nve( bgp, prd, table, p, new); @@ -3611,7 +3620,7 @@ int bgp_withdraw(struct peer *peer, struct prefix *p, uint32_t addpath_id, } /* Lookup withdrawn route. */ - for (pi = rn->info; pi; pi = pi->next) + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) if (pi->peer == peer && pi->type == type && pi->sub_type == sub_type && pi->addpath_rx_id == addpath_id) @@ -3765,7 +3774,8 @@ static void bgp_soft_reconfig_table(struct peer *peer, afi_t afi, safi_t safi, if (ain->peer != peer) continue; - struct bgp_path_info *pi = rn->info; + struct bgp_path_info *pi = + bgp_node_get_bgp_path_info(rn); uint32_t num_labels = 0; mpls_label_t *label_pnt = NULL; @@ -3799,9 +3809,11 @@ void bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi) bgp_soft_reconfig_table(peer, afi, safi, NULL, NULL); else for (rn = bgp_table_top(peer->bgp->rib[afi][safi]); rn; - rn = bgp_route_next(rn)) - if ((table = rn->info) != NULL) { + rn = bgp_route_next(rn)) { + table = bgp_node_get_bgp_table_info(rn); + if (table != NULL) { struct prefix_rd prd; + prd.family = AF_UNSPEC; prd.prefixlen = 64; memcpy(&prd.val, rn->p.u.val, 8); @@ -3809,6 +3821,7 @@ void bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi) bgp_soft_reconfig_table(peer, afi, safi, table, &prd); } + } } @@ -3832,7 +3845,7 @@ static wq_item_status bgp_clear_route_node(struct work_queue *wq, void *data) /* It is possible that we have multiple paths for a prefix from a peer * if that peer is using AddPath. */ - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) { if (pi->peer != peer) continue; @@ -3971,7 +3984,7 @@ static void bgp_clear_route_table(struct peer *peer, afi_t afi, safi_t safi, ain = ain_next; } - for (pi = rn->info; pi; pi = next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = next) { next = pi->next; if (pi->peer != peer) continue; @@ -4028,9 +4041,13 @@ void bgp_clear_route(struct peer *peer, afi_t afi, safi_t safi) bgp_clear_route_table(peer, afi, safi, NULL); else for (rn = bgp_table_top(peer->bgp->rib[afi][safi]); rn; - rn = bgp_route_next(rn)) - if ((table = rn->info) != NULL) - bgp_clear_route_table(peer, afi, safi, table); + rn = bgp_route_next(rn)) { + table = bgp_node_get_bgp_table_info(rn); + if (!table) + continue; + + bgp_clear_route_table(peer, afi, safi, table); + } /* unlock if no nodes got added to the clear-node-queue. */ if (!peer->clear_node_queue->thread) @@ -4090,12 +4107,14 @@ void bgp_clear_stale_route(struct peer *peer, afi_t afi, safi_t safi) struct bgp_node *rm; /* look for neighbor in tables */ - if ((table = rn->info) == NULL) + table = bgp_node_get_bgp_table_info(rn); + if (!table) continue; for (rm = bgp_table_top(table); rm; rm = bgp_route_next(rm)) - for (pi = rm->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rm); pi; + pi = pi->next) { if (pi->peer != peer) continue; if (!CHECK_FLAG(pi->flags, @@ -4109,7 +4128,8 @@ void bgp_clear_stale_route(struct peer *peer, afi_t afi, safi_t safi) } else { for (rn = bgp_table_top(peer->bgp->rib[afi][safi]); rn; rn = bgp_route_next(rn)) - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; + pi = pi->next) { if (pi->peer != peer) continue; if (!CHECK_FLAG(pi->flags, BGP_PATH_STALE)) @@ -4128,7 +4148,7 @@ static void bgp_cleanup_table(struct bgp *bgp, struct bgp_table *table, struct bgp_path_info *next; for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) - for (pi = rn->info; pi; pi = next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = next) { next = pi->next; if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED) && pi->type == ZEBRA_ROUTE_BGP @@ -4149,6 +4169,7 @@ void bgp_cleanup_routes(struct bgp *bgp) { afi_t afi; struct bgp_node *rn; + struct bgp_table *table; for (afi = AFI_IP; afi < AFI_MAX; ++afi) { if (afi == AFI_L2VPN) @@ -4163,26 +4184,22 @@ void bgp_cleanup_routes(struct bgp *bgp) safi = SAFI_MPLS_VPN; for (rn = bgp_table_top(bgp->rib[afi][safi]); rn; rn = bgp_route_next(rn)) { - if (rn->info) { - bgp_cleanup_table(bgp, - (struct bgp_table *)(rn->info), - safi); - bgp_table_finish((struct bgp_table **)&( - rn->info)); - rn->info = NULL; + table = bgp_node_get_bgp_table_info(rn); + if (table != NULL) { + bgp_cleanup_table(bgp, table, safi); + bgp_table_finish(&table); + bgp_node_set_bgp_table_info(rn, NULL); bgp_unlock_node(rn); } } safi = SAFI_ENCAP; for (rn = bgp_table_top(bgp->rib[afi][safi]); rn; rn = bgp_route_next(rn)) { - if (rn->info) { - bgp_cleanup_table(bgp, - (struct bgp_table *)(rn->info), - safi); - bgp_table_finish((struct bgp_table **)&( - rn->info)); - rn->info = NULL; + table = bgp_node_get_bgp_table_info(rn); + if (table != NULL) { + bgp_cleanup_table(bgp, table, safi); + bgp_table_finish(&table); + bgp_node_set_bgp_table_info(rn, NULL); bgp_unlock_node(rn); } } @@ -4190,12 +4207,11 @@ void bgp_cleanup_routes(struct bgp *bgp) } for (rn = bgp_table_top(bgp->rib[AFI_L2VPN][SAFI_EVPN]); rn; rn = bgp_route_next(rn)) { - if (rn->info) { - bgp_cleanup_table(bgp, - (struct bgp_table *)(rn->info), - SAFI_EVPN); - bgp_table_finish((struct bgp_table **)&(rn->info)); - rn->info = NULL; + table = bgp_node_get_bgp_table_info(rn); + if (table != NULL) { + bgp_cleanup_table(bgp, table, SAFI_EVPN); + bgp_table_finish(&table); + bgp_node_set_bgp_table_info(rn, NULL); bgp_unlock_node(rn); } } @@ -4458,7 +4474,7 @@ void bgp_static_update(struct bgp *bgp, struct prefix *p, attr_new = bgp_attr_intern(&attr); } - for (pi = rn->info; pi; pi = pi->next) + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) if (pi->peer == bgp->peer_self && pi->type == ZEBRA_ROUTE_BGP && pi->sub_type == BGP_ROUTE_STATIC) break; @@ -4626,7 +4642,7 @@ void bgp_static_withdraw(struct bgp *bgp, struct prefix *p, afi_t afi, rn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi, p, NULL); /* Check selected route and self inserted route. */ - for (pi = rn->info; pi; pi = pi->next) + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) if (pi->peer == bgp->peer_self && pi->type == ZEBRA_ROUTE_BGP && pi->sub_type == BGP_ROUTE_STATIC) break; @@ -4661,7 +4677,7 @@ static void bgp_static_withdraw_safi(struct bgp *bgp, struct prefix *p, rn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi, p, prd); /* Check selected route and self inserted route. */ - for (pi = rn->info; pi; pi = pi->next) + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) if (pi->peer == bgp->peer_self && pi->type == ZEBRA_ROUTE_BGP && pi->sub_type == BGP_ROUTE_STATIC) break; @@ -4771,7 +4787,7 @@ static void bgp_static_update_safi(struct bgp *bgp, struct prefix *p, attr_new = bgp_attr_intern(&attr); } - for (pi = rn->info; pi; pi = pi->next) + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) if (pi->peer == bgp->peer_self && pi->type == ZEBRA_ROUTE_BGP && pi->sub_type == BGP_ROUTE_STATIC) break; @@ -4895,7 +4911,7 @@ static int bgp_static_set(struct vty *vty, const char *negate, return CMD_WARNING_CONFIG_FAILED; } - bgp_static = bgp_static_get_node_info(rn); + bgp_static = bgp_node_get_bgp_static_info(rn); if ((label_index != BGP_INVALID_LABEL_INDEX) && (label_index != bgp_static->label_index)) { @@ -4917,7 +4933,7 @@ static int bgp_static_set(struct vty *vty, const char *negate, /* Clear configuration. */ bgp_static_free(bgp_static); - bgp_static_set_node_info(rn, NULL); + bgp_node_set_bgp_static_info(rn, NULL); bgp_unlock_node(rn); bgp_unlock_node(rn); } else { @@ -4925,7 +4941,7 @@ static int bgp_static_set(struct vty *vty, const char *negate, /* Set BGP static route configuration. */ rn = bgp_node_get(bgp->route[afi][safi], &p); - bgp_static = bgp_static_get_node_info(rn); + bgp_static = bgp_node_get_bgp_static_info(rn); if (bgp_static) { /* Configuration change. */ /* Label index cannot be changed. */ @@ -4976,7 +4992,7 @@ static int bgp_static_set(struct vty *vty, const char *negate, bgp_static->rmap.map = route_map_lookup_by_name(rmap); } - bgp_static_set_node_info(rn, bgp_static); + bgp_node_set_bgp_static_info(rn, bgp_static); } bgp_static->valid = 1; @@ -5002,25 +5018,27 @@ void bgp_static_add(struct bgp *bgp) FOREACH_AFI_SAFI (afi, safi) for (rn = bgp_table_top(bgp->route[afi][safi]); rn; rn = bgp_route_next(rn)) { - if (rn->info == NULL) + if (!bgp_node_has_bgp_path_info_data(rn)) continue; if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP) || (safi == SAFI_EVPN)) { - table = rn->info; + table = bgp_node_get_bgp_table_info(rn); for (rm = bgp_table_top(table); rm; rm = bgp_route_next(rm)) { bgp_static = - bgp_static_get_node_info(rm); + bgp_node_get_bgp_static_info( + rm); bgp_static_update_safi(bgp, &rm->p, bgp_static, afi, safi); } } else { - bgp_static_update(bgp, &rn->p, - bgp_static_get_node_info(rn), - afi, safi); + bgp_static_update( + bgp, &rn->p, + bgp_node_get_bgp_static_info(rn), afi, + safi); } } } @@ -5039,29 +5057,30 @@ void bgp_static_delete(struct bgp *bgp) FOREACH_AFI_SAFI (afi, safi) for (rn = bgp_table_top(bgp->route[afi][safi]); rn; rn = bgp_route_next(rn)) { - if (rn->info == NULL) + if (!bgp_node_has_bgp_path_info_data(rn)) continue; if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP) || (safi == SAFI_EVPN)) { - table = rn->info; + table = bgp_node_get_bgp_table_info(rn); for (rm = bgp_table_top(table); rm; rm = bgp_route_next(rm)) { bgp_static = - bgp_static_get_node_info(rm); + bgp_node_get_bgp_static_info( + rm); bgp_static_withdraw_safi( bgp, &rm->p, AFI_IP, safi, (struct prefix_rd *)&rn->p); bgp_static_free(bgp_static); - bgp_static_set_node_info(rn, NULL); + bgp_node_set_bgp_static_info(rn, NULL); bgp_unlock_node(rn); } } else { - bgp_static = bgp_static_get_node_info(rn); + bgp_static = bgp_node_get_bgp_static_info(rn); bgp_static_withdraw(bgp, &rn->p, afi, safi); bgp_static_free(bgp_static); - bgp_static_set_node_info(rn, NULL); + bgp_node_set_bgp_static_info(rn, NULL); bgp_unlock_node(rn); } } @@ -5081,23 +5100,24 @@ void bgp_static_redo_import_check(struct bgp *bgp) FOREACH_AFI_SAFI (afi, safi) { for (rn = bgp_table_top(bgp->route[afi][safi]); rn; rn = bgp_route_next(rn)) { - if (rn->info == NULL) + if (!bgp_node_has_bgp_path_info_data(rn)) continue; if ((safi == SAFI_MPLS_VPN) || (safi == SAFI_ENCAP) || (safi == SAFI_EVPN)) { - table = rn->info; + table = bgp_node_get_bgp_table_info(rn); for (rm = bgp_table_top(table); rm; rm = bgp_route_next(rm)) { bgp_static = - bgp_static_get_node_info(rm); + bgp_node_get_bgp_static_info( + rm); bgp_static_update_safi(bgp, &rm->p, bgp_static, afi, safi); } } else { - bgp_static = bgp_static_get_node_info(rn); + bgp_static = bgp_node_get_bgp_static_info(rn); bgp_static_update(bgp, &rn->p, bgp_static, afi, safi); } @@ -5115,7 +5135,7 @@ static void bgp_purge_af_static_redist_routes(struct bgp *bgp, afi_t afi, table = bgp->rib[afi][safi]; for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) { if (pi->peer == bgp->peer_self && ((pi->type == ZEBRA_ROUTE_BGP && pi->sub_type == BGP_ROUTE_STATIC) @@ -5222,15 +5242,16 @@ int bgp_static_set_safi(afi_t afi, safi_t safi, struct vty *vty, } } prn = bgp_node_get(bgp->route[afi][safi], (struct prefix *)&prd); - if (prn->info == NULL) - prn->info = bgp_table_init(bgp, afi, safi); + if (!bgp_node_has_bgp_path_info_data(prn)) + bgp_node_set_bgp_table_info(prn, + bgp_table_init(bgp, afi, safi)); else bgp_unlock_node(prn); - table = prn->info; + table = bgp_node_get_bgp_table_info(prn); rn = bgp_node_get(table, &p); - if (rn->info) { + if (bgp_node_has_bgp_path_info_data(rn)) { vty_out(vty, "%% Same network configuration exists\n"); bgp_unlock_node(rn); } else { @@ -5269,7 +5290,7 @@ int bgp_static_set_safi(afi_t afi, safi_t safi, struct vty *vty, if (gwip) prefix_copy(&bgp_static->gatewayIp, &gw_ip); } - bgp_static_set_node_info(rn, bgp_static); + bgp_node_set_bgp_static_info(rn, bgp_static); bgp_static->valid = 1; bgp_static_update_safi(bgp, &p, bgp_static, afi, safi); @@ -5320,20 +5341,21 @@ int bgp_static_unset_safi(afi_t afi, safi_t safi, struct vty *vty, } prn = bgp_node_get(bgp->route[afi][safi], (struct prefix *)&prd); - if (prn->info == NULL) - prn->info = bgp_table_init(bgp, afi, safi); + if (!bgp_node_has_bgp_path_info_data(prn)) + bgp_node_set_bgp_table_info(prn, + bgp_table_init(bgp, afi, safi)); else bgp_unlock_node(prn); - table = prn->info; + table = bgp_node_get_bgp_table_info(prn); rn = bgp_node_lookup(table, &p); if (rn) { bgp_static_withdraw_safi(bgp, &p, afi, safi, &prd); - bgp_static = bgp_static_get_node_info(rn); + bgp_static = bgp_node_get_bgp_static_info(rn); bgp_static_free(bgp_static); - bgp_static_set_node_info(rn, NULL); + bgp_node_set_bgp_static_info(rn, NULL); bgp_unlock_node(rn); bgp_unlock_node(rn); } else @@ -5553,13 +5575,13 @@ static void bgp_aggregate_install(struct bgp *bgp, afi_t afi, safi_t safi, { struct bgp_node *rn; struct bgp_table *table; - struct bgp_path_info *pi, *new; + struct bgp_path_info *pi, *orig, *new; table = bgp->rib[afi][safi]; rn = bgp_node_get(table, p); - for (pi = rn->info; pi; pi = pi->next) + for (orig = pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) if (pi->peer == bgp->peer_self && pi->type == ZEBRA_ROUTE_BGP && pi->sub_type == BGP_ROUTE_AGGREGATE) break; @@ -5569,7 +5591,7 @@ static void bgp_aggregate_install(struct bgp *bgp, afi_t afi, safi_t safi, * If the aggregate information has not changed * no need to re-install it again. */ - if (bgp_aggregate_info_same(rn->info, origin, aspath, community, + if (bgp_aggregate_info_same(orig, origin, aspath, community, ecommunity, lcommunity)) { bgp_unlock_node(rn); @@ -5604,7 +5626,7 @@ static void bgp_aggregate_install(struct bgp *bgp, afi_t afi, safi_t safi, bgp_path_info_add(rn, new); bgp_process(bgp, rn, afi, safi); } else { - for (pi = rn->info; pi; pi = pi->next) + for (pi = orig; pi; pi = pi->next) if (pi->peer == bgp->peer_self && pi->type == ZEBRA_ROUTE_BGP && pi->sub_type == BGP_ROUTE_AGGREGATE) @@ -5662,7 +5684,7 @@ static void bgp_aggregate_route(struct bgp *bgp, struct prefix *p, match = 0; - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) { if (BGP_PATH_HOLDDOWN(pi)) continue; @@ -5854,7 +5876,7 @@ static void bgp_aggregate_delete(struct bgp *bgp, struct prefix *p, afi_t afi, continue; match = 0; - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) { if (BGP_PATH_HOLDDOWN(pi)) continue; @@ -5904,7 +5926,7 @@ void bgp_aggregate_increment(struct bgp *bgp, struct prefix *p, /* Aggregate address configuration check. */ for (rn = child; rn; rn = bgp_node_parent_nolock(rn)) { - aggregate = bgp_aggregate_get_node_info(rn); + aggregate = bgp_node_get_bgp_aggregate_info(rn); if (aggregate != NULL && rn->p.prefixlen < p->prefixlen) { bgp_aggregate_delete(bgp, &rn->p, afi, safi, aggregate); bgp_aggregate_route(bgp, &rn->p, pi, afi, safi, NULL, @@ -5935,7 +5957,7 @@ void bgp_aggregate_decrement(struct bgp *bgp, struct prefix *p, /* Aggregate address configuration check. */ for (rn = child; rn; rn = bgp_node_parent_nolock(rn)) { - aggregate = bgp_aggregate_get_node_info(rn); + aggregate = bgp_node_get_bgp_aggregate_info(rn); if (aggregate != NULL && rn->p.prefixlen < p->prefixlen) { bgp_aggregate_delete(bgp, &rn->p, afi, safi, aggregate); bgp_aggregate_route(bgp, &rn->p, NULL, afi, safi, del, @@ -5974,13 +5996,13 @@ static int bgp_aggregate_unset(struct vty *vty, const char *prefix_str, return CMD_WARNING_CONFIG_FAILED; } - aggregate = bgp_aggregate_get_node_info(rn); + aggregate = bgp_node_get_bgp_aggregate_info(rn); bgp_aggregate_delete(bgp, &p, afi, safi, aggregate); bgp_aggregate_install(bgp, afi, safi, &p, 0, NULL, NULL, NULL, NULL, 0, aggregate); /* Unlock aggregate address configuration. */ - bgp_aggregate_set_node_info(rn, NULL); + bgp_node_set_bgp_aggregate_info(rn, NULL); bgp_aggregate_free(aggregate); bgp_unlock_node(rn); bgp_unlock_node(rn); @@ -6015,7 +6037,7 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, /* Old configuration check. */ rn = bgp_node_get(bgp->aggregate[afi][safi], &p); - if (rn->info) { + if (bgp_node_has_bgp_path_info_data(rn)) { vty_out(vty, "There is already same aggregate network.\n"); /* try to remove the old entry */ ret = bgp_aggregate_unset(vty, prefix_str, afi, safi); @@ -6031,7 +6053,7 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, aggregate->summary_only = summary_only; aggregate->as_set = as_set; aggregate->safi = safi; - bgp_aggregate_set_node_info(rn, aggregate); + bgp_node_set_bgp_aggregate_info(rn, aggregate); /* Aggregate address insert into BGP routing table. */ bgp_aggregate_route(bgp, &p, NULL, afi, safi, NULL, aggregate); @@ -6269,7 +6291,8 @@ void bgp_redistribute_add(struct bgp *bgp, struct prefix *p, new_attr = bgp_attr_intern(&attr_new); - for (bpi = bn->info; bpi; bpi = bpi->next) + for (bpi = bgp_node_get_bgp_path_info(bn); bpi; + bpi = bpi->next) if (bpi->peer == bgp->peer_self && bpi->sub_type == BGP_ROUTE_REDISTRIBUTE) break; @@ -6351,7 +6374,7 @@ void bgp_redistribute_delete(struct bgp *bgp, struct prefix *p, uint8_t type, rn = bgp_afi_node_get(bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL); - for (pi = rn->info; pi; pi = pi->next) + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) if (pi->peer == bgp->peer_self && pi->type == type) break; @@ -6381,7 +6404,7 @@ void bgp_redistribute_withdraw(struct bgp *bgp, afi_t afi, int type, table = bgp->rib[afi][SAFI_UNICAST]; for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { - for (pi = rn->info; pi; pi = pi->next) + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) if (pi->peer == bgp->peer_self && pi->type == type && pi->instance == instance) break; @@ -6564,7 +6587,7 @@ void route_vty_out(struct vty *vty, struct prefix *p, CHECK_FLAG(path->flags, BGP_PATH_ANNC_NH_SELF) ? true : false; bool nexthop_othervrf = false; vrf_id_t nexthop_vrfid = VRF_DEFAULT; - const char *nexthop_vrfname = "Default"; + const char *nexthop_vrfname = VRF_DEFAULT_NAME; if (json_paths) json_path = json_object_new_object(); @@ -7846,7 +7869,7 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct prefix *p, if (path->extra->bgp_orig->inst_type == BGP_INSTANCE_TYPE_DEFAULT) - vn = "Default"; + vn = VRF_DEFAULT_NAME; else vn = path->extra->bgp_orig->name; @@ -8427,12 +8450,14 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi, if (use_json && !*json_header_depth) { vty_out(vty, "{\n \"vrfId\": %d,\n \"vrfName\": \"%s\",\n \"tableVersion\": %" PRId64 - ",\n \"routerId\": \"%s\",\n \"routes\": { ", + ",\n \"routerId\": \"%s\",\n \"defaultLocPrf\": %u,\n" + " \"localAS\": %u,\n \"routes\": { ", bgp->vrf_id == VRF_UNKNOWN ? -1 : (int)bgp->vrf_id, bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT ? VRF_DEFAULT_NAME : bgp->name, - table->version, inet_ntoa(bgp->router_id)); + table->version, inet_ntoa(bgp->router_id), + bgp->default_local_pref, bgp->as); *json_header_depth = 2; if (rd) { vty_out(vty, " \"routeDistinguishers\" : {"); @@ -8446,7 +8471,8 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi, /* Start processing of routes. */ for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { - if (rn->info == NULL) + pi = bgp_node_get_bgp_path_info(rn); + if (pi == NULL) continue; display = 0; @@ -8455,7 +8481,7 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi, else json_paths = NULL; - for (pi = rn->info; pi; pi = pi->next) { + for (; pi; pi = pi->next) { total_count++; if (type == bgp_show_type_flap_statistics || type == bgp_show_type_flap_neighbor @@ -8599,6 +8625,9 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi, else vty_out(vty, "%u", bgp->vrf_id); vty_out(vty, "\n"); + vty_out(vty, "Default local pref %u, ", + bgp->default_local_pref); + vty_out(vty, "local AS %u\n", bgp->as); vty_out(vty, BGP_SHOW_SCODE_HEADER); vty_out(vty, BGP_SHOW_NCODE_HEADER); vty_out(vty, BGP_SHOW_OCODE_HEADER); @@ -8715,6 +8744,7 @@ int bgp_show_table_rd(struct vty *vty, struct bgp *bgp, safi_t safi, unsigned long output_cum = 0; unsigned long total_cum = 0; unsigned long json_header_depth = 0; + struct bgp_table *itable; bool show_msg; show_msg = (!use_json && type == bgp_show_type_normal); @@ -8723,16 +8753,17 @@ int bgp_show_table_rd(struct vty *vty, struct bgp *bgp, safi_t safi, next = bgp_route_next(rn); if (prd_match && memcmp(rn->p.u.val, prd_match->val, 8) != 0) continue; - if (rn->info != NULL) { + + itable = bgp_node_get_bgp_table_info(rn); + if (itable != NULL) { struct prefix_rd prd; char rd[RD_ADDRSTRLEN]; memcpy(&prd, &(rn->p), sizeof(struct prefix_rd)); prefix_rd2str(&prd, rd, sizeof(rd)); - bgp_show_table(vty, bgp, safi, rn->info, type, - output_arg, use_json, rd, next == NULL, - &output_cum, &total_cum, - &json_header_depth); + bgp_show_table(vty, bgp, safi, itable, type, output_arg, + use_json, rd, next == NULL, &output_cum, + &total_cum, &json_header_depth); if (next == NULL) show_msg = false; } @@ -8897,7 +8928,7 @@ void route_vty_out_detail_header(struct vty *vty, struct bgp *bgp, vty_out(vty, "not allocated\n"); } - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) { count++; if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) { best = count; @@ -9061,8 +9092,8 @@ static int bgp_show_route_in_table(struct vty *vty, struct bgp *bgp, for (rn = bgp_table_top(rib); rn; rn = bgp_route_next(rn)) { if (prd && memcmp(rn->p.u.val, prd->val, 8) != 0) continue; - - if ((table = rn->info) == NULL) + table = bgp_node_get_bgp_table_info(rn); + if (!table) continue; header = 1; @@ -9076,7 +9107,8 @@ static int bgp_show_route_in_table(struct vty *vty, struct bgp *bgp, continue; } - for (pi = rm->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rm); pi; + pi = pi->next) { if (header) { route_vty_out_detail_header( vty, bgp, rm, @@ -9114,7 +9146,8 @@ static int bgp_show_route_in_table(struct vty *vty, struct bgp *bgp, if ((rn = bgp_node_match(rib, &match)) != NULL) { if (!prefix_check || rn->p.prefixlen == match.prefixlen) { - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; + pi = pi->next) { if (header) { route_vty_out_detail_header( vty, bgp, rn, NULL, afi, @@ -9923,7 +9956,7 @@ static int bgp_table_stats_walker(struct thread *t) if (rn == top) continue; - if (!rn->info) + if (!bgp_node_has_bgp_path_info_data(rn)) continue; ts->counts[BGP_STATS_PREFIXES]++; @@ -9937,7 +9970,7 @@ static int bgp_table_stats_walker(struct thread *t) #endif /* check if the prefix is included by any other announcements */ - while (prn && !prn->info) + while (prn && !bgp_node_has_bgp_path_info_data(prn)) prn = bgp_node_parent_nolock(prn); if (prn == NULL || prn == top) { @@ -9946,10 +9979,10 @@ static int bgp_table_stats_walker(struct thread *t) if (space) ts->total_space += pow(2.0, space - rn->p.prefixlen); - } else if (prn->info) + } else if (bgp_node_has_bgp_path_info_data(prn)) ts->counts[BGP_STATS_MAX_AGGREGATEABLE]++; - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) { pinum++; ts->counts[BGP_STATS_RIB]++; @@ -10132,7 +10165,8 @@ static int bgp_peer_count_walker(struct thread *t) if (ain->peer == peer) pc->count[PCOUNT_ADJ_IN]++; - for (pi = rn->info; pi; pi = pi->next) { + for (pi = bgp_node_get_bgp_path_info(rn); pi; pi = pi->next) { + if (pi->peer != peer) continue; @@ -10454,6 +10488,9 @@ static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi, table->version); json_object_string_add(json, "bgpLocalRouterId", inet_ntoa(bgp->router_id)); + json_object_int_add(json, "defaultLocPrf", + bgp->default_local_pref); + json_object_int_add(json, "localAS", bgp->as); json_object_object_add(json, "bgpStatusCodes", json_scode); json_object_object_add(json, "bgpOriginCodes", @@ -10470,6 +10507,9 @@ static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi, else vty_out(vty, "%u", bgp->vrf_id); vty_out(vty, "\n"); + vty_out(vty, "Default local pref %u, ", + bgp->default_local_pref); + vty_out(vty, "local AS %u\n", bgp->as); vty_out(vty, BGP_SHOW_SCODE_HEADER); vty_out(vty, BGP_SHOW_NCODE_HEADER); vty_out(vty, BGP_SHOW_OCODE_HEADER); @@ -10497,6 +10537,11 @@ static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi, "bgpLocalRouterId", inet_ntoa( bgp->router_id)); + json_object_int_add(json, + "defaultLocPrf", + bgp->default_local_pref); + json_object_int_add(json, + "localAS", bgp->as); json_object_object_add( json, "bgpStatusCodes", json_scode); @@ -10515,6 +10560,11 @@ static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi, vty_out(vty, "%u", bgp->vrf_id); vty_out(vty, "\n"); + vty_out(vty, + "Default local pref %u, ", + bgp->default_local_pref); + vty_out(vty, "local AS %u\n", + bgp->as); vty_out(vty, BGP_SHOW_SCODE_HEADER); vty_out(vty, @@ -10576,6 +10626,13 @@ static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi, "bgpLocalRouterId", inet_ntoa( bgp->router_id)); + json_object_int_add( + json, "defaultLocPrf", + bgp->default_local_pref + ); + json_object_int_add( + json, "localAS", + bgp->as); json_object_object_add( json, "bgpStatusCodes", @@ -10601,6 +10658,13 @@ static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi, "%u", bgp->vrf_id); vty_out(vty, "\n"); + vty_out(vty, + "Default local pref %u, ", + bgp->default_local_pref + ); + vty_out(vty, + "local AS %u\n", + bgp->as); vty_out(vty, BGP_SHOW_SCODE_HEADER); vty_out(vty, @@ -11033,12 +11097,12 @@ static int bgp_distance_set(struct vty *vty, const char *distance_str, /* Get BGP distance node. */ rn = bgp_node_get(bgp_distance_table[afi][safi], (struct prefix *)&p); - bdistance = bgp_distance_get_node(rn); + bdistance = bgp_node_get_bgp_distance_info(rn); if (bdistance) bgp_unlock_node(rn); else { bdistance = bgp_distance_new(); - bgp_distance_set_node_info(rn, bdistance); + bgp_node_set_bgp_distance_info(rn, bdistance); } /* Set distance value. */ @@ -11083,7 +11147,7 @@ static int bgp_distance_unset(struct vty *vty, const char *distance_str, return CMD_WARNING_CONFIG_FAILED; } - bdistance = bgp_distance_get_node(rn); + bdistance = bgp_node_get_bgp_distance_info(rn); distance = atoi(distance_str); if (bdistance->distance != distance) { @@ -11095,7 +11159,7 @@ static int bgp_distance_unset(struct vty *vty, const char *distance_str, XFREE(MTYPE_AS_LIST, bdistance->access_list); bgp_distance_free(bdistance); - rn->info = NULL; + bgp_node_set_bgp_path_info(rn, NULL); bgp_unlock_node(rn); bgp_unlock_node(rn); @@ -11122,7 +11186,7 @@ uint8_t bgp_distance_apply(struct prefix *p, struct bgp_path_info *pinfo, sockunion2hostprefix(&peer->su, &q); rn = bgp_node_match(bgp_distance_table[afi][safi], &q); if (rn) { - bdistance = bgp_distance_get_node(rn); + bdistance = bgp_node_get_bgp_distance_info(rn); bgp_unlock_node(rn); if (bdistance->access_list) { @@ -11137,7 +11201,7 @@ uint8_t bgp_distance_apply(struct prefix *p, struct bgp_path_info *pinfo, /* Backdoor check. */ rn = bgp_node_lookup(bgp->route[afi][safi], p); if (rn) { - bgp_static = bgp_static_get_node_info(rn); + bgp_static = bgp_node_get_bgp_static_info(rn); bgp_unlock_node(rn); if (bgp_static->backdoor) { @@ -11418,14 +11482,15 @@ static int bgp_clear_damp_route(struct vty *vty, const char *view_name, rn = bgp_route_next(rn)) { if (prd && memcmp(rn->p.u.val, prd->val, 8) != 0) continue; - if ((table = rn->info) == NULL) + table = bgp_node_get_bgp_table_info(rn); + if (!table) continue; if ((rm = bgp_node_match(table, &match)) == NULL) continue; if (!prefix_check || rm->p.prefixlen == match.prefixlen) { - pi = rm->info; + pi = bgp_node_get_bgp_path_info(rm); while (pi) { if (pi->extra && pi->extra->damp_info) { pi_temp = pi->next; @@ -11445,7 +11510,7 @@ static int bgp_clear_damp_route(struct vty *vty, const char *view_name, != NULL) { if (!prefix_check || rn->p.prefixlen == match.prefixlen) { - pi = rn->info; + pi = bgp_node_get_bgp_path_info(rn); while (pi) { if (pi->extra && pi->extra->damp_info) { pi_temp = pi->next; @@ -11578,11 +11643,12 @@ static void bgp_config_write_network_vpn(struct vty *vty, struct bgp *bgp, /* Network configuration. */ for (prn = bgp_table_top(bgp->route[afi][safi]); prn; prn = bgp_route_next(prn)) { - if ((table = prn->info) == NULL) + table = bgp_node_get_bgp_table_info(prn); + if (!table) continue; for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { - bgp_static = bgp_static_get_node_info(rn); + bgp_static = bgp_node_get_bgp_static_info(rn); if (bgp_static == NULL) continue; @@ -11628,11 +11694,12 @@ static void bgp_config_write_network_evpn(struct vty *vty, struct bgp *bgp, /* Network configuration. */ for (prn = bgp_table_top(bgp->route[afi][safi]); prn; prn = bgp_route_next(prn)) { - if ((table = prn->info) == NULL) + table = bgp_node_get_bgp_table_info(prn); + if (!table) continue; for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) { - bgp_static = bgp_static_get_node_info(rn); + bgp_static = bgp_node_get_bgp_static_info(rn); if (bgp_static == NULL) continue; @@ -11708,7 +11775,7 @@ void bgp_config_write_network(struct vty *vty, struct bgp *bgp, afi_t afi, /* Network configuration. */ for (rn = bgp_table_top(bgp->route[afi][safi]); rn; rn = bgp_route_next(rn)) { - bgp_static = bgp_static_get_node_info(rn); + bgp_static = bgp_node_get_bgp_static_info(rn); if (bgp_static == NULL) continue; @@ -11755,7 +11822,7 @@ void bgp_config_write_network(struct vty *vty, struct bgp *bgp, afi_t afi, /* Aggregate-address configuration. */ for (rn = bgp_table_top(bgp->aggregate[afi][safi]); rn; rn = bgp_route_next(rn)) { - bgp_aggregate = bgp_aggregate_get_node_info(rn); + bgp_aggregate = bgp_node_get_bgp_aggregate_info(rn); if (bgp_aggregate == NULL) continue; @@ -11807,7 +11874,7 @@ void bgp_config_write_distance(struct vty *vty, struct bgp *bgp, afi_t afi, for (rn = bgp_table_top(bgp_distance_table[afi][safi]); rn; rn = bgp_route_next(rn)) { - bdistance = bgp_distance_get_node(rn); + bdistance = bgp_node_get_bgp_distance_info(rn); if (bdistance != NULL) { char buf[PREFIX_STRLEN];