]> git.puffer.fish Git - mirror/frr.git/commitdiff
*: Add FOREACH_AFI_SAFI_NSF(afi, safi) macro to reduce nesting 10327/head
authorDonatas Abraitis <donatas.abraitis@gmail.com>
Wed, 12 Jan 2022 20:43:52 +0000 (22:43 +0200)
committerDonatas Abraitis <donatas.abraitis@gmail.com>
Thu, 13 Jan 2022 12:29:54 +0000 (14:29 +0200)
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>
.clang-format
bgpd/bgp_fsm.c
bgpd/bgp_vty.c
bgpd/bgpd.c
lib/zebra.h
zebra/zebra_gr.c

index c84a29f8611445173e2ad8714d671ca9702ac3c0..a620b5c2c03a47a02db7e27f6ef4cbc3a4dede60 100644 (file)
@@ -69,6 +69,7 @@ ForEachMacros:
   - SUBGRP_FOREACH_ADJ_SAFE
   - AF_FOREACH
   - FOREACH_AFI_SAFI
+  - FOREACH_AFI_SAFI_NSF
   - FOREACH_SAFI
   # ospfd
   - LSDB_LOOP
index 1e9dd21fd1e47eaeaa5ac4a947e637ce1e03fb52..45e9aad1bac1a84a9c62677deac7a19f4bda82ff 100644 (file)
@@ -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)
index d6fdbfd0d08b003176c095cca12fe3ccf9da9476..39a35ac558c0e4ebf66ac87881f768c47f02b59a 100644 (file)
@@ -11322,185 +11322,167 @@ 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 (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 (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));
+               if (!use_json) {
+                       vty_out(vty, "    %s:\n",
+                               get_afi_safi_str(afi, safi, false));
 
-                               vty_out(vty, "      F bit: ");
-                       }
+                       vty_out(vty, "      F bit: ");
+               }
 
-                       if (peer->nsf[afi][safi]
-                           && CHECK_FLAG(peer->af_cap[afi][safi],
-                                         PEER_CAP_RESTART_AF_PRESERVE_RCV)) {
+               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) {
+                               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 (!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");
+               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_JSON(eor_flag);
+                       } else {
+                               vty_out(vty, "Yes\n");
+                               vty_out(vty,
+                                       "      End-of-RIB sent after update: ");
 
-                                       PRINT_EOR(eor_flag);
-                               }
+                               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 {
-                               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");
-                               }
+                               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 (!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_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));
                        }
 
-                       if (use_json) {
+                       /* 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,
-                                                   "stalePathTimer",
+                                                   "selectionDeferralTimer",
                                                    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) {
 
-                               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);
 
-                                       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");
+                       if (peer->t_gr_stale != NULL)
                                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);
+                                       "      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);
-                       }
+                       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);
                }
        }
 }
index 56e299e4cca30fb1802caed73f69ee066597364d..8dc6a09cbd8b5e95ae0167dbb1920bce0b47832d 100644 (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_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);
index c9794352c784a34bff0b4aea1080931647457c83..139e47e8d72abd1439872af0c8d5ec1d354fc074 100644 (file)
@@ -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
index 5373f27882956353dd4253b157212c8666772c0d..b153ac1d81ca62aed7d63cf5a6c377f012c9d005 100644 (file)
@@ -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