mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-29 17:13:46 +00:00
Merge pull request #7423 from donaldsharp/route_list
bgpd: Remove pointer structure from `struct bgp_dest`
This commit is contained in:
commit
40ef77c702
@ -371,14 +371,12 @@ static int bgp_dest_set_defer_flag(struct bgp_dest *dest, bool delete)
|
|||||||
*/
|
*/
|
||||||
if (set_flag && table) {
|
if (set_flag && table) {
|
||||||
if (bgp && (bgp->gr_info[afi][safi].t_select_deferral)) {
|
if (bgp && (bgp->gr_info[afi][safi].t_select_deferral)) {
|
||||||
|
if (!CHECK_FLAG(dest->flags, BGP_NODE_SELECT_DEFER))
|
||||||
|
bgp->gr_info[afi][safi].gr_deferred++;
|
||||||
SET_FLAG(dest->flags, BGP_NODE_SELECT_DEFER);
|
SET_FLAG(dest->flags, BGP_NODE_SELECT_DEFER);
|
||||||
if (dest->rt_node == NULL)
|
|
||||||
dest->rt_node = listnode_add(
|
|
||||||
bgp->gr_info[afi][safi].route_list,
|
|
||||||
dest);
|
|
||||||
if (BGP_DEBUG(update, UPDATE_OUT))
|
if (BGP_DEBUG(update, UPDATE_OUT))
|
||||||
zlog_debug("DEFER route %pBD, dest %p, node %p",
|
zlog_debug("DEFER route %pBD, dest %p", dest,
|
||||||
dest, dest, dest->rt_node);
|
dest);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2920,37 +2918,39 @@ int bgp_best_path_select_defer(struct bgp *bgp, afi_t afi, safi_t safi)
|
|||||||
struct bgp_dest *dest;
|
struct bgp_dest *dest;
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
struct afi_safi_info *thread_info;
|
struct afi_safi_info *thread_info;
|
||||||
struct listnode *node = NULL, *nnode = NULL;
|
|
||||||
|
|
||||||
if (bgp->gr_info[afi][safi].t_route_select)
|
if (bgp->gr_info[afi][safi].t_route_select) {
|
||||||
|
struct thread *t = bgp->gr_info[afi][safi].t_route_select;
|
||||||
|
|
||||||
|
thread_info = THREAD_ARG(t);
|
||||||
|
XFREE(MTYPE_TMP, thread_info);
|
||||||
BGP_TIMER_OFF(bgp->gr_info[afi][safi].t_route_select);
|
BGP_TIMER_OFF(bgp->gr_info[afi][safi].t_route_select);
|
||||||
|
}
|
||||||
|
|
||||||
if (BGP_DEBUG(update, UPDATE_OUT)) {
|
if (BGP_DEBUG(update, UPDATE_OUT)) {
|
||||||
zlog_debug("%s: processing route for %s : cnt %d", __func__,
|
zlog_debug("%s: processing route for %s : cnt %d", __func__,
|
||||||
get_afi_safi_str(afi, safi, false),
|
get_afi_safi_str(afi, safi, false),
|
||||||
listcount(bgp->gr_info[afi][safi].route_list));
|
bgp->gr_info[afi][safi].gr_deferred);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Process the route list */
|
/* Process the route list */
|
||||||
node = listhead(bgp->gr_info[afi][safi].route_list);
|
for (dest = bgp_table_top(bgp->rib[afi][safi]); dest;
|
||||||
while (node) {
|
dest = bgp_route_next(dest)) {
|
||||||
dest = listgetdata(node);
|
if (!CHECK_FLAG(dest->flags, BGP_NODE_SELECT_DEFER))
|
||||||
nnode = node->next;
|
continue;
|
||||||
list_delete_node(bgp->gr_info[afi][safi].route_list, node);
|
|
||||||
dest->rt_node = NULL;
|
|
||||||
|
|
||||||
if (CHECK_FLAG(dest->flags, BGP_NODE_SELECT_DEFER)) {
|
UNSET_FLAG(dest->flags, BGP_NODE_SELECT_DEFER);
|
||||||
UNSET_FLAG(dest->flags, BGP_NODE_SELECT_DEFER);
|
bgp->gr_info[afi][safi].gr_deferred--;
|
||||||
bgp_process_main_one(bgp, dest, afi, safi);
|
bgp_process_main_one(bgp, dest, afi, safi);
|
||||||
cnt++;
|
cnt++;
|
||||||
if (cnt >= BGP_MAX_BEST_ROUTE_SELECT)
|
if (cnt >= BGP_MAX_BEST_ROUTE_SELECT) {
|
||||||
break;
|
bgp_dest_unlock_node(dest);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
node = nnode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send EOR message when all routes are processed */
|
/* Send EOR message when all routes are processed */
|
||||||
if (list_isempty(bgp->gr_info[afi][safi].route_list)) {
|
if (bgp->gr_info[afi][safi].gr_deferred) {
|
||||||
bgp_send_delayed_eor(bgp);
|
bgp_send_delayed_eor(bgp);
|
||||||
/* Send route processing complete message to RIB */
|
/* Send route processing complete message to RIB */
|
||||||
bgp_zebra_update(afi, safi, bgp->vrf_id,
|
bgp_zebra_update(afi, safi, bgp->vrf_id,
|
||||||
@ -3287,13 +3287,7 @@ void bgp_rib_remove(struct bgp_dest *dest, struct bgp_path_info *pi,
|
|||||||
if (CHECK_FLAG(dest->flags, BGP_NODE_SELECT_DEFER)) {
|
if (CHECK_FLAG(dest->flags, BGP_NODE_SELECT_DEFER)) {
|
||||||
UNSET_FLAG(dest->flags, BGP_NODE_SELECT_DEFER);
|
UNSET_FLAG(dest->flags, BGP_NODE_SELECT_DEFER);
|
||||||
bgp = pi->peer->bgp;
|
bgp = pi->peer->bgp;
|
||||||
if ((dest->rt_node)
|
bgp->gr_info[afi][safi].gr_deferred--;
|
||||||
&& (bgp->gr_info[afi][safi].route_list)) {
|
|
||||||
list_delete_node(bgp->gr_info[afi][safi]
|
|
||||||
.route_list,
|
|
||||||
dest->rt_node);
|
|
||||||
dest->rt_node = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -154,13 +154,8 @@ void bgp_delete_listnode(struct bgp_node *node)
|
|||||||
|
|
||||||
if (bgp && rn && rn->lock == 1) {
|
if (bgp && rn && rn->lock == 1) {
|
||||||
/* Delete the route from the selection pending list */
|
/* Delete the route from the selection pending list */
|
||||||
if ((node->rt_node)
|
bgp->gr_info[afi][safi].gr_deferred--;
|
||||||
&& (bgp->gr_info[afi][safi].route_list)) {
|
UNSET_FLAG(node->flags, BGP_NODE_SELECT_DEFER);
|
||||||
list_delete_node(
|
|
||||||
bgp->gr_info[afi][safi].route_list,
|
|
||||||
node->rt_node);
|
|
||||||
node->rt_node = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,8 +102,7 @@ struct bgp_node {
|
|||||||
#define BGP_NODE_LABEL_CHANGED (1 << 2)
|
#define BGP_NODE_LABEL_CHANGED (1 << 2)
|
||||||
#define BGP_NODE_REGISTERED_FOR_LABEL (1 << 3)
|
#define BGP_NODE_REGISTERED_FOR_LABEL (1 << 3)
|
||||||
#define BGP_NODE_SELECT_DEFER (1 << 4)
|
#define BGP_NODE_SELECT_DEFER (1 << 4)
|
||||||
/* list node pointer */
|
|
||||||
struct listnode *rt_node;
|
|
||||||
struct bgp_addpath_node_data tx_addpath;
|
struct bgp_addpath_node_data tx_addpath;
|
||||||
|
|
||||||
enum bgp_path_selection_reason reason;
|
enum bgp_path_selection_reason reason;
|
||||||
|
13
bgpd/bgpd.c
13
bgpd/bgpd.c
@ -3022,7 +3022,7 @@ static struct bgp *bgp_create(as_t *as, const char *name,
|
|||||||
bgp->gr_info[afi][safi].eor_received = 0;
|
bgp->gr_info[afi][safi].eor_received = 0;
|
||||||
bgp->gr_info[afi][safi].t_select_deferral = NULL;
|
bgp->gr_info[afi][safi].t_select_deferral = NULL;
|
||||||
bgp->gr_info[afi][safi].t_route_select = NULL;
|
bgp->gr_info[afi][safi].t_route_select = NULL;
|
||||||
bgp->gr_info[afi][safi].route_list = list_new();
|
bgp->gr_info[afi][safi].gr_deferred = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bgp->v_update_delay = bm->v_update_delay;
|
bgp->v_update_delay = bm->v_update_delay;
|
||||||
@ -3394,14 +3394,21 @@ int bgp_delete(struct bgp *bgp)
|
|||||||
|
|
||||||
/* Delete the graceful restart info */
|
/* Delete the graceful restart info */
|
||||||
FOREACH_AFI_SAFI (afi, safi) {
|
FOREACH_AFI_SAFI (afi, safi) {
|
||||||
|
struct thread *t;
|
||||||
|
|
||||||
gr_info = &bgp->gr_info[afi][safi];
|
gr_info = &bgp->gr_info[afi][safi];
|
||||||
if (!gr_info)
|
if (!gr_info)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
BGP_TIMER_OFF(gr_info->t_select_deferral);
|
BGP_TIMER_OFF(gr_info->t_select_deferral);
|
||||||
|
|
||||||
|
t = gr_info->t_route_select;
|
||||||
|
if (t) {
|
||||||
|
void *info = THREAD_ARG(t);
|
||||||
|
|
||||||
|
XFREE(MTYPE_TMP, info);
|
||||||
|
}
|
||||||
BGP_TIMER_OFF(gr_info->t_route_select);
|
BGP_TIMER_OFF(gr_info->t_route_select);
|
||||||
if (gr_info->route_list)
|
|
||||||
list_delete(&gr_info->route_list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BGP_DEBUG(zebra, ZEBRA)) {
|
if (BGP_DEBUG(zebra, ZEBRA)) {
|
||||||
|
@ -265,8 +265,8 @@ struct graceful_restart_info {
|
|||||||
uint32_t eor_received;
|
uint32_t eor_received;
|
||||||
/* Deferral Timer */
|
/* Deferral Timer */
|
||||||
struct thread *t_select_deferral;
|
struct thread *t_select_deferral;
|
||||||
/* Route list */
|
/* Routes Deferred */
|
||||||
struct list *route_list;
|
uint32_t gr_deferred;
|
||||||
/* Best route select */
|
/* Best route select */
|
||||||
struct thread *t_route_select;
|
struct thread *t_route_select;
|
||||||
/* AFI, SAFI enabled */
|
/* AFI, SAFI enabled */
|
||||||
|
Loading…
Reference in New Issue
Block a user