forked from Mirror/frr
Merge pull request #18496 from mjstapp/fix_bgp_clearing_sa
bgpd: fix SA warning in bgp clearing code
This commit is contained in:
commit
0a275ba161
|
@ -6533,24 +6533,24 @@ static void clearing_clear_one_pi(struct bgp_table *table, struct bgp_dest *dest
|
||||||
*/
|
*/
|
||||||
static void set_clearing_resume_info(struct bgp_clearing_info *cinfo,
|
static void set_clearing_resume_info(struct bgp_clearing_info *cinfo,
|
||||||
const struct bgp_table *table,
|
const struct bgp_table *table,
|
||||||
const struct bgp_dest *dest, bool inner_p)
|
const struct prefix *p, bool inner_p)
|
||||||
{
|
{
|
||||||
if (bgp_debug_neighbor_events(NULL))
|
if (bgp_debug_neighbor_events(NULL))
|
||||||
zlog_debug("%s: %sinfo for %s/%s %pFX", __func__,
|
zlog_debug("%s: %sinfo for %s/%s %pFX", __func__,
|
||||||
inner_p ? "inner " : "", afi2str(table->afi),
|
inner_p ? "inner " : "", afi2str(table->afi),
|
||||||
safi2str(table->safi), &dest->rn->p);
|
safi2str(table->safi), p);
|
||||||
|
|
||||||
SET_FLAG(cinfo->flags, BGP_CLEARING_INFO_FLAG_RESUME);
|
SET_FLAG(cinfo->flags, BGP_CLEARING_INFO_FLAG_RESUME);
|
||||||
|
|
||||||
if (inner_p) {
|
if (inner_p) {
|
||||||
cinfo->inner_afi = table->afi;
|
cinfo->inner_afi = table->afi;
|
||||||
cinfo->inner_safi = table->safi;
|
cinfo->inner_safi = table->safi;
|
||||||
cinfo->inner_pfx = dest->rn->p;
|
memcpy(&cinfo->inner_pfx, p, sizeof(struct prefix));
|
||||||
SET_FLAG(cinfo->flags, BGP_CLEARING_INFO_FLAG_INNER);
|
SET_FLAG(cinfo->flags, BGP_CLEARING_INFO_FLAG_INNER);
|
||||||
} else {
|
} else {
|
||||||
cinfo->last_afi = table->afi;
|
cinfo->last_afi = table->afi;
|
||||||
cinfo->last_safi = table->safi;
|
cinfo->last_safi = table->safi;
|
||||||
cinfo->last_pfx = dest->rn->p;
|
memcpy(&cinfo->last_pfx, p, sizeof(struct prefix));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6625,6 +6625,7 @@ static int walk_batch_table_helper(struct bgp_clearing_info *cinfo,
|
||||||
struct bgp_dest *dest;
|
struct bgp_dest *dest;
|
||||||
bool force = (cinfo->bgp->process_queue == NULL);
|
bool force = (cinfo->bgp->process_queue == NULL);
|
||||||
uint32_t examined = 0, processed = 0;
|
uint32_t examined = 0, processed = 0;
|
||||||
|
struct prefix pfx;
|
||||||
|
|
||||||
/* Locate starting dest, possibly using "resume" info */
|
/* Locate starting dest, possibly using "resume" info */
|
||||||
dest = clearing_dest_helper(table, cinfo, inner_p);
|
dest = clearing_dest_helper(table, cinfo, inner_p);
|
||||||
|
@ -6641,6 +6642,9 @@ static int walk_batch_table_helper(struct bgp_clearing_info *cinfo,
|
||||||
examined++;
|
examined++;
|
||||||
cinfo->curr_counter++;
|
cinfo->curr_counter++;
|
||||||
|
|
||||||
|
/* Save dest's prefix */
|
||||||
|
memcpy(&pfx, &dest->rn->p, sizeof(struct prefix));
|
||||||
|
|
||||||
ain = dest->adj_in;
|
ain = dest->adj_in;
|
||||||
while (ain) {
|
while (ain) {
|
||||||
ain_next = ain->next;
|
ain_next = ain->next;
|
||||||
|
@ -6671,14 +6675,13 @@ static int walk_batch_table_helper(struct bgp_clearing_info *cinfo,
|
||||||
if (cinfo->curr_counter >= bm->peer_clearing_batch_max_dests) {
|
if (cinfo->curr_counter >= bm->peer_clearing_batch_max_dests) {
|
||||||
/* Capture info about last dest seen and break */
|
/* Capture info about last dest seen and break */
|
||||||
if (bgp_debug_neighbor_events(NULL))
|
if (bgp_debug_neighbor_events(NULL))
|
||||||
zlog_debug("%s: %s/%s: pfx %pFX reached limit %u",
|
zlog_debug("%s: %s/%s: pfx %pFX reached limit %u", __func__,
|
||||||
__func__, afi2str(table->afi),
|
afi2str(table->afi), safi2str(table->safi), &pfx,
|
||||||
safi2str(table->safi), &dest->rn->p,
|
|
||||||
cinfo->curr_counter);
|
cinfo->curr_counter);
|
||||||
|
|
||||||
/* Reset the counter */
|
/* Reset the counter */
|
||||||
cinfo->curr_counter = 0;
|
cinfo->curr_counter = 0;
|
||||||
set_clearing_resume_info(cinfo, table, dest, inner_p);
|
set_clearing_resume_info(cinfo, table, &pfx, inner_p);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6706,6 +6709,7 @@ static int clear_batch_rib_helper(struct bgp_clearing_info *cinfo)
|
||||||
safi_t safi;
|
safi_t safi;
|
||||||
struct bgp_dest *dest;
|
struct bgp_dest *dest;
|
||||||
struct bgp_table *table, *outer_table;
|
struct bgp_table *table, *outer_table;
|
||||||
|
struct prefix pfx;
|
||||||
|
|
||||||
/* Maybe resume afi/safi iteration */
|
/* Maybe resume afi/safi iteration */
|
||||||
if (CHECK_FLAG(cinfo->flags, BGP_CLEARING_INFO_FLAG_RESUME)) {
|
if (CHECK_FLAG(cinfo->flags, BGP_CLEARING_INFO_FLAG_RESUME)) {
|
||||||
|
@ -6762,6 +6766,9 @@ static int clear_batch_rib_helper(struct bgp_clearing_info *cinfo)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Capture last prefix */
|
||||||
|
memcpy(&pfx, &dest->rn->p, sizeof(struct prefix));
|
||||||
|
|
||||||
/* This will resume the "inner" walk if necessary */
|
/* This will resume the "inner" walk if necessary */
|
||||||
ret = walk_batch_table_helper(cinfo, table, true /*inner*/);
|
ret = walk_batch_table_helper(cinfo, table, true /*inner*/);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
|
@ -6769,7 +6776,7 @@ static int clear_batch_rib_helper(struct bgp_clearing_info *cinfo)
|
||||||
* capture the resume info we need
|
* capture the resume info we need
|
||||||
* from the outer afi/safi and dest
|
* from the outer afi/safi and dest
|
||||||
*/
|
*/
|
||||||
set_clearing_resume_info(cinfo, outer_table, dest,
|
set_clearing_resume_info(cinfo, outer_table, &pfx,
|
||||||
false);
|
false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue