mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00
*: 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:
parent
379effbf70
commit
df8d723c5f
|
@ -69,6 +69,7 @@ ForEachMacros:
|
|||
- SUBGRP_FOREACH_ADJ_SAFE
|
||||
- AF_FOREACH
|
||||
- FOREACH_AFI_SAFI
|
||||
- FOREACH_AFI_SAFI_NSF
|
||||
- FOREACH_SAFI
|
||||
# ospfd
|
||||
- LSDB_LOOP
|
||||
|
|
|
@ -848,10 +848,9 @@ static int bgp_graceful_stale_timer_expire(struct thread *thread)
|
|||
peer->host);
|
||||
|
||||
/* NSF delete stale route */
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
||||
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++)
|
||||
if (peer->nsf[afi][safi])
|
||||
bgp_clear_stale_route(peer, afi, safi);
|
||||
FOREACH_AFI_SAFI_NSF (afi, safi)
|
||||
if (peer->nsf[afi][safi])
|
||||
bgp_clear_stale_route(peer, afi, safi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1441,10 +1440,8 @@ int bgp_stop(struct peer *peer)
|
|||
} else {
|
||||
UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_MODE);
|
||||
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
||||
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN;
|
||||
safi++)
|
||||
peer->nsf[afi][safi] = 0;
|
||||
FOREACH_AFI_SAFI_NSF (afi, safi)
|
||||
peer->nsf[afi][safi] = 0;
|
||||
}
|
||||
|
||||
/* Stop route-refresh stalepath timer */
|
||||
|
@ -2125,48 +2122,43 @@ static int bgp_establish(struct peer *peer)
|
|||
else if (BGP_PEER_HELPER_MODE(peer))
|
||||
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;
|
||||
nsf_af_count++;
|
||||
FOREACH_AFI_SAFI_NSF (afi, 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;
|
||||
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 {
|
||||
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 {
|
||||
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 (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 ((bgp_peer_gr_mode_get(peer) == PEER_GR)
|
||||
|
|
312
bgpd/bgp_vty.c
312
bgpd/bgp_vty.c
|
@ -11322,186 +11322,168 @@ static void bgp_show_neighbor_graceful_restart_capability_per_afi_safi(
|
|||
json_object *json_endofrib_status = NULL;
|
||||
bool eor_flag = false;
|
||||
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
||||
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++) {
|
||||
if (!peer->afc[afi][safi])
|
||||
continue;
|
||||
FOREACH_AFI_SAFI_NSF (afi, safi) {
|
||||
if (!peer->afc[afi][safi])
|
||||
continue;
|
||||
|
||||
if (!CHECK_FLAG(peer->cap, PEER_CAP_RESTART_ADV)
|
||||
|| !CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV))
|
||||
continue;
|
||||
if (!CHECK_FLAG(peer->cap, PEER_CAP_RESTART_ADV) ||
|
||||
!CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV))
|
||||
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) {
|
||||
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;
|
||||
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
|
||||
eor_flag = false;
|
||||
vty_out(vty, "False\n");
|
||||
}
|
||||
|
||||
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) {
|
||||
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 (!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_int_add(json_timer,
|
||||
"stalePathTimer",
|
||||
peer->bgp->stalepath_time);
|
||||
json_object_boolean_true_add(
|
||||
json_endofrib_status, "endOfRibSend");
|
||||
|
||||
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));
|
||||
}
|
||||
PRINT_EOR_JSON(eor_flag);
|
||||
} else {
|
||||
vty_out(vty, " Timers:\n");
|
||||
vty_out(vty, "Yes\n");
|
||||
vty_out(vty,
|
||||
" Configured Stale Path Time(sec): %u\n",
|
||||
peer->bgp->stalepath_time);
|
||||
" End-of-RIB sent after update: ");
|
||||
|
||||
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));
|
||||
PRINT_EOR(eor_flag);
|
||||
}
|
||||
} else {
|
||||
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);
|
||||
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 (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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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_MODE);
|
||||
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
||||
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++)
|
||||
peer->nsf[afi][safi] = 0;
|
||||
FOREACH_AFI_SAFI_NSF (afi, safi)
|
||||
peer->nsf[afi][safi] = 0;
|
||||
|
||||
if (peer->t_gr_restart) {
|
||||
BGP_TIMER_OFF(peer->t_gr_restart);
|
||||
|
|
|
@ -346,6 +346,10 @@ typedef enum {
|
|||
for (afi = AFI_IP; afi < AFI_MAX; afi++) \
|
||||
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. */
|
||||
#define ZEBRA_KERNEL_DISTANCE_DEFAULT 0
|
||||
#define ZEBRA_CONNECT_DISTANCE_DEFAULT 0
|
||||
|
|
|
@ -649,19 +649,17 @@ static void zebra_gr_process_client_stale_routes(struct zserv *client,
|
|||
return;
|
||||
|
||||
/* Check if route update completed for all AFI, SAFI */
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
||||
for (safi = SAFI_UNICAST; safi <= SAFI_MPLS_VPN; safi++) {
|
||||
if (info->af_enabled[afi][safi]) {
|
||||
if (!info->route_sync[afi][safi]) {
|
||||
LOG_GR(
|
||||
"%s: Client %s route update not completed for AFI %d, SAFI %d",
|
||||
__func__, zebra_route_string(
|
||||
client->proto),
|
||||
afi, safi);
|
||||
return;
|
||||
}
|
||||
FOREACH_AFI_SAFI_NSF (afi, safi) {
|
||||
if (info->af_enabled[afi][safi]) {
|
||||
if (!info->route_sync[afi][safi]) {
|
||||
LOG_GR("%s: Client %s route update not completed for AFI %d, SAFI %d",
|
||||
__func__,
|
||||
zebra_route_string(client->proto), afi,
|
||||
safi);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Route update completed for all AFI, SAFI
|
||||
|
|
Loading…
Reference in a new issue