*: Add FOREACH_AFI_SAFI_NSF(afi, safi) macro to reduce nesting

Used for graceful-restart mostly.

Especially for bgp_show_neighbor_graceful_restart_capability_per_afi_safi()

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
This commit is contained in:
Donatas Abraitis 2022-01-12 22:43:52 +02:00
parent 379effbf70
commit df8d723c5f
6 changed files with 201 additions and 225 deletions

View File

@ -69,6 +69,7 @@ ForEachMacros:
- SUBGRP_FOREACH_ADJ_SAFE - SUBGRP_FOREACH_ADJ_SAFE
- AF_FOREACH - AF_FOREACH
- FOREACH_AFI_SAFI - FOREACH_AFI_SAFI
- FOREACH_AFI_SAFI_NSF
- FOREACH_SAFI - FOREACH_SAFI
# ospfd # ospfd
- LSDB_LOOP - LSDB_LOOP

View File

@ -848,10 +848,9 @@ static int bgp_graceful_stale_timer_expire(struct thread *thread)
peer->host); peer->host);
/* NSF delete stale route */ /* NSF delete stale route */
for (afi = AFI_IP; afi < AFI_MAX; afi++) FOREACH_AFI_SAFI_NSF (afi, safi)
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++) if (peer->nsf[afi][safi])
if (peer->nsf[afi][safi]) bgp_clear_stale_route(peer, afi, safi);
bgp_clear_stale_route(peer, afi, safi);
return 0; return 0;
} }
@ -1441,10 +1440,8 @@ int bgp_stop(struct peer *peer)
} else { } else {
UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_MODE); UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_MODE);
for (afi = AFI_IP; afi < AFI_MAX; afi++) FOREACH_AFI_SAFI_NSF (afi, safi)
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; peer->nsf[afi][safi] = 0;
safi++)
peer->nsf[afi][safi] = 0;
} }
/* Stop route-refresh stalepath timer */ /* Stop route-refresh stalepath timer */
@ -2125,48 +2122,43 @@ static int bgp_establish(struct peer *peer)
else if (BGP_PEER_HELPER_MODE(peer)) else if (BGP_PEER_HELPER_MODE(peer))
zlog_debug("peer %s BGP_HELPER_MODE", peer->host); zlog_debug("peer %s BGP_HELPER_MODE", peer->host);
} }
for (afi = AFI_IP; afi < AFI_MAX; afi++)
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++) {
if (peer->afc_nego[afi][safi]
&& CHECK_FLAG(peer->cap, PEER_CAP_RESTART_ADV)
&& CHECK_FLAG(peer->af_cap[afi][safi],
PEER_CAP_RESTART_AF_RCV)) {
if (peer->nsf[afi][safi]
&& !CHECK_FLAG(
peer->af_cap[afi][safi],
PEER_CAP_RESTART_AF_PRESERVE_RCV))
bgp_clear_stale_route(peer, afi, safi);
peer->nsf[afi][safi] = 1; FOREACH_AFI_SAFI_NSF (afi, safi) {
nsf_af_count++; if (peer->afc_nego[afi][safi] &&
CHECK_FLAG(peer->cap, PEER_CAP_RESTART_ADV) &&
CHECK_FLAG(peer->af_cap[afi][safi],
PEER_CAP_RESTART_AF_RCV)) {
if (peer->nsf[afi][safi] &&
!CHECK_FLAG(peer->af_cap[afi][safi],
PEER_CAP_RESTART_AF_PRESERVE_RCV))
bgp_clear_stale_route(peer, afi, safi);
peer->nsf[afi][safi] = 1;
nsf_af_count++;
} else {
if (peer->nsf[afi][safi])
bgp_clear_stale_route(peer, afi, safi);
peer->nsf[afi][safi] = 0;
}
/* Update the graceful restart information */
if (peer->afc_nego[afi][safi]) {
if (!BGP_SELECT_DEFER_DISABLE(peer->bgp)) {
status = bgp_update_gr_info(peer, afi, safi);
if (status < 0)
zlog_err(
"Error in updating graceful restart for %s",
get_afi_safi_str(afi, safi,
false));
} else { } else {
if (peer->nsf[afi][safi]) if (BGP_PEER_GRACEFUL_RESTART_CAPABLE(peer) &&
bgp_clear_stale_route(peer, afi, safi); BGP_PEER_RESTARTING_MODE(peer) &&
peer->nsf[afi][safi] = 0; CHECK_FLAG(peer->bgp->flags,
} BGP_FLAG_GR_PRESERVE_FWD))
/* Update the graceful restart information */ peer->bgp->gr_info[afi][safi]
if (peer->afc_nego[afi][safi]) { .eor_required++;
if (!BGP_SELECT_DEFER_DISABLE(peer->bgp)) {
status = bgp_update_gr_info(peer, afi,
safi);
if (status < 0)
zlog_err(
"Error in updating graceful restart for %s",
get_afi_safi_str(
afi, safi,
false));
} else {
if (BGP_PEER_GRACEFUL_RESTART_CAPABLE(
peer)
&& BGP_PEER_RESTARTING_MODE(peer)
&& CHECK_FLAG(
peer->bgp->flags,
BGP_FLAG_GR_PRESERVE_FWD))
peer->bgp->gr_info[afi][safi]
.eor_required++;
}
} }
} }
}
if (!CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) { if (!CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) {
if ((bgp_peer_gr_mode_get(peer) == PEER_GR) if ((bgp_peer_gr_mode_get(peer) == PEER_GR)

View File

@ -11322,186 +11322,168 @@ static void bgp_show_neighbor_graceful_restart_capability_per_afi_safi(
json_object *json_endofrib_status = NULL; json_object *json_endofrib_status = NULL;
bool eor_flag = false; bool eor_flag = false;
for (afi = AFI_IP; afi < AFI_MAX; afi++) { FOREACH_AFI_SAFI_NSF (afi, safi) {
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++) { if (!peer->afc[afi][safi])
if (!peer->afc[afi][safi]) continue;
continue;
if (!CHECK_FLAG(peer->cap, PEER_CAP_RESTART_ADV) if (!CHECK_FLAG(peer->cap, PEER_CAP_RESTART_ADV) ||
|| !CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) !CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV))
continue; continue;
if (use_json) {
json_afi_safi = json_object_new_object();
json_endofrib_status = json_object_new_object();
json_timer = json_object_new_object();
}
if (peer->eor_stime[afi][safi] >= peer->pkt_stime[afi][safi])
eor_flag = true;
else
eor_flag = false;
if (!use_json) {
vty_out(vty, " %s:\n",
get_afi_safi_str(afi, safi, false));
vty_out(vty, " F bit: ");
}
if (peer->nsf[afi][safi] &&
CHECK_FLAG(peer->af_cap[afi][safi],
PEER_CAP_RESTART_AF_PRESERVE_RCV)) {
if (use_json) { if (use_json) {
json_afi_safi = json_object_new_object(); json_object_boolean_true_add(json_afi_safi,
json_endofrib_status = json_object_new_object(); "fBit");
json_timer = json_object_new_object(); } else
} vty_out(vty, "True\n");
} else {
if (peer->eor_stime[afi][safi] if (use_json)
>= peer->pkt_stime[afi][safi]) json_object_boolean_false_add(json_afi_safi,
eor_flag = true; "fBit");
else else
eor_flag = false; vty_out(vty, "False\n");
}
if (!use_json) { if (!use_json)
vty_out(vty, " %s:\n", vty_out(vty, " End-of-RIB sent: ");
get_afi_safi_str(afi, safi, false));
vty_out(vty, " F bit: ");
}
if (peer->nsf[afi][safi]
&& CHECK_FLAG(peer->af_cap[afi][safi],
PEER_CAP_RESTART_AF_PRESERVE_RCV)) {
if (use_json) {
json_object_boolean_true_add(
json_afi_safi, "fBit");
} else
vty_out(vty, "True\n");
} else {
if (use_json)
json_object_boolean_false_add(
json_afi_safi, "fBit");
else
vty_out(vty, "False\n");
}
if (!use_json)
vty_out(vty, " End-of-RIB sent: ");
if (CHECK_FLAG(peer->af_sflags[afi][safi],
PEER_STATUS_EOR_SEND)) {
if (use_json) {
json_object_boolean_true_add(
json_endofrib_status,
"endOfRibSend");
PRINT_EOR_JSON(eor_flag);
} else {
vty_out(vty, "Yes\n");
vty_out(vty,
" End-of-RIB sent after update: ");
PRINT_EOR(eor_flag);
}
} else {
if (use_json) {
json_object_boolean_false_add(
json_endofrib_status,
"endOfRibSend");
json_object_boolean_false_add(
json_endofrib_status,
"endOfRibSentAfterUpdate");
} else {
vty_out(vty, "No\n");
vty_out(vty,
" End-of-RIB sent after update: ");
vty_out(vty, "No\n");
}
}
if (!use_json)
vty_out(vty, " End-of-RIB received: ");
if (CHECK_FLAG(peer->af_sflags[afi][safi],
PEER_STATUS_EOR_RECEIVED)) {
if (use_json)
json_object_boolean_true_add(
json_endofrib_status,
"endOfRibRecv");
else
vty_out(vty, "Yes\n");
} else {
if (use_json)
json_object_boolean_false_add(
json_endofrib_status,
"endOfRibRecv");
else
vty_out(vty, "No\n");
}
if (CHECK_FLAG(peer->af_sflags[afi][safi],
PEER_STATUS_EOR_SEND)) {
if (use_json) { if (use_json) {
json_object_int_add(json_timer, json_object_boolean_true_add(
"stalePathTimer", json_endofrib_status, "endOfRibSend");
peer->bgp->stalepath_time);
if (peer->t_gr_stale != NULL) { PRINT_EOR_JSON(eor_flag);
json_object_int_add(
json_timer,
"stalePathTimerRemaining",
thread_timer_remain_second(
peer->t_gr_stale));
}
/* Display Configured Selection
* Deferral only when when
* Gr mode is enabled.
*/
if (CHECK_FLAG(peer->flags,
PEER_FLAG_GRACEFUL_RESTART)) {
json_object_int_add(
json_timer,
"selectionDeferralTimer",
peer->bgp->stalepath_time);
}
if (peer->bgp->gr_info[afi][safi]
.t_select_deferral
!= NULL) {
json_object_int_add(
json_timer,
"selectionDeferralTimerRemaining",
thread_timer_remain_second(
peer->bgp
->gr_info[afi]
[safi]
.t_select_deferral));
}
} else { } else {
vty_out(vty, " Timers:\n"); vty_out(vty, "Yes\n");
vty_out(vty, vty_out(vty,
" Configured Stale Path Time(sec): %u\n", " End-of-RIB sent after update: ");
peer->bgp->stalepath_time);
if (peer->t_gr_stale != NULL) PRINT_EOR(eor_flag);
vty_out(vty,
" Stale Path Remaining(sec): %ld\n",
thread_timer_remain_second(
peer->t_gr_stale));
/* Display Configured Selection
* Deferral only when when
* Gr mode is enabled.
*/
if (CHECK_FLAG(peer->flags,
PEER_FLAG_GRACEFUL_RESTART))
vty_out(vty,
" Configured Selection Deferral Time(sec): %u\n",
peer->bgp->select_defer_time);
if (peer->bgp->gr_info[afi][safi]
.t_select_deferral
!= NULL)
vty_out(vty,
" Selection Deferral Time Remaining(sec): %ld\n",
thread_timer_remain_second(
peer->bgp
->gr_info[afi]
[safi]
.t_select_deferral));
} }
} else {
if (use_json) { if (use_json) {
json_object_object_add(json_afi_safi, json_object_boolean_false_add(
"endOfRibStatus", json_endofrib_status, "endOfRibSend");
json_endofrib_status); json_object_boolean_false_add(
json_object_object_add(json_afi_safi, "timers", json_endofrib_status,
json_timer); "endOfRibSentAfterUpdate");
json_object_object_add( } else {
json, get_afi_safi_str(afi, safi, true), vty_out(vty, "No\n");
json_afi_safi); vty_out(vty,
" End-of-RIB sent after update: ");
vty_out(vty, "No\n");
} }
} }
if (!use_json)
vty_out(vty, " End-of-RIB received: ");
if (CHECK_FLAG(peer->af_sflags[afi][safi],
PEER_STATUS_EOR_RECEIVED)) {
if (use_json)
json_object_boolean_true_add(
json_endofrib_status, "endOfRibRecv");
else
vty_out(vty, "Yes\n");
} else {
if (use_json)
json_object_boolean_false_add(
json_endofrib_status, "endOfRibRecv");
else
vty_out(vty, "No\n");
}
if (use_json) {
json_object_int_add(json_timer, "stalePathTimer",
peer->bgp->stalepath_time);
if (peer->t_gr_stale != NULL) {
json_object_int_add(json_timer,
"stalePathTimerRemaining",
thread_timer_remain_second(
peer->t_gr_stale));
}
/* Display Configured Selection
* Deferral only when when
* Gr mode is enabled.
*/
if (CHECK_FLAG(peer->flags,
PEER_FLAG_GRACEFUL_RESTART)) {
json_object_int_add(json_timer,
"selectionDeferralTimer",
peer->bgp->stalepath_time);
}
if (peer->bgp->gr_info[afi][safi].t_select_deferral !=
NULL) {
json_object_int_add(
json_timer,
"selectionDeferralTimerRemaining",
thread_timer_remain_second(
peer->bgp->gr_info[afi][safi]
.t_select_deferral));
}
} else {
vty_out(vty, " Timers:\n");
vty_out(vty,
" Configured Stale Path Time(sec): %u\n",
peer->bgp->stalepath_time);
if (peer->t_gr_stale != NULL)
vty_out(vty,
" Stale Path Remaining(sec): %ld\n",
thread_timer_remain_second(
peer->t_gr_stale));
/* Display Configured Selection
* Deferral only when when
* Gr mode is enabled.
*/
if (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART))
vty_out(vty,
" Configured Selection Deferral Time(sec): %u\n",
peer->bgp->select_defer_time);
if (peer->bgp->gr_info[afi][safi].t_select_deferral !=
NULL)
vty_out(vty,
" Selection Deferral Time Remaining(sec): %ld\n",
thread_timer_remain_second(
peer->bgp->gr_info[afi][safi]
.t_select_deferral));
}
if (use_json) {
json_object_object_add(json_afi_safi, "endOfRibStatus",
json_endofrib_status);
json_object_object_add(json_afi_safi, "timers",
json_timer);
json_object_object_add(
json, get_afi_safi_str(afi, safi, true),
json_afi_safi);
}
} }
} }

View File

@ -2340,9 +2340,8 @@ void peer_nsf_stop(struct peer *peer)
UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT); UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT);
UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_MODE); UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_MODE);
for (afi = AFI_IP; afi < AFI_MAX; afi++) FOREACH_AFI_SAFI_NSF (afi, safi)
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++) peer->nsf[afi][safi] = 0;
peer->nsf[afi][safi] = 0;
if (peer->t_gr_restart) { if (peer->t_gr_restart) {
BGP_TIMER_OFF(peer->t_gr_restart); BGP_TIMER_OFF(peer->t_gr_restart);

View File

@ -346,6 +346,10 @@ typedef enum {
for (afi = AFI_IP; afi < AFI_MAX; afi++) \ for (afi = AFI_IP; afi < AFI_MAX; afi++) \
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
#define FOREACH_AFI_SAFI_NSF(afi, safi) \
for (afi = AFI_IP; afi < AFI_MAX; afi++) \
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++)
/* Default Administrative Distance of each protocol. */ /* Default Administrative Distance of each protocol. */
#define ZEBRA_KERNEL_DISTANCE_DEFAULT 0 #define ZEBRA_KERNEL_DISTANCE_DEFAULT 0
#define ZEBRA_CONNECT_DISTANCE_DEFAULT 0 #define ZEBRA_CONNECT_DISTANCE_DEFAULT 0

View File

@ -649,19 +649,17 @@ static void zebra_gr_process_client_stale_routes(struct zserv *client,
return; return;
/* Check if route update completed for all AFI, SAFI */ /* Check if route update completed for all AFI, SAFI */
for (afi = AFI_IP; afi < AFI_MAX; afi++) FOREACH_AFI_SAFI_NSF (afi, safi) {
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++) { if (info->af_enabled[afi][safi]) {
if (info->af_enabled[afi][safi]) { if (!info->route_sync[afi][safi]) {
if (!info->route_sync[afi][safi]) { LOG_GR("%s: Client %s route update not completed for AFI %d, SAFI %d",
LOG_GR( __func__,
"%s: Client %s route update not completed for AFI %d, SAFI %d", zebra_route_string(client->proto), afi,
__func__, zebra_route_string( safi);
client->proto), return;
afi, safi);
return;
}
} }
} }
}
/* /*
* Route update completed for all AFI, SAFI * Route update completed for all AFI, SAFI