]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Keep the last reset reason before we reset the peer
authorDonatas Abraitis <donatas@opensourcerouting.org>
Thu, 25 Jul 2024 10:22:27 +0000 (13:22 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Thu, 25 Jul 2024 10:22:27 +0000 (13:22 +0300)
If we send a notification, there is no point setting the last_reset, because
bgp_notify_send() sets last_reset to PEER_DOWN_NOTIFY_SEND (almost everywhere).

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_fsm.c
bgpd/bgp_vty.c
bgpd/bgpd.c

index e911c2d18ecbb663aebc8185a6be7684264a3e6a..1eeb14115519ac7d1567b2916e14334765b1f6d7 100644 (file)
@@ -2740,14 +2740,15 @@ static void bgp_gr_update_mode_of_all_peers(struct bgp *bgp,
                                   peer, peer->peer_gr_new_status_flag,
                                   peer->flags);
 
+               peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
+
                /* Reset session to match with behavior for other peer
                 * configs that require the session to be re-setup.
                 */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(peer);
        }
 }
@@ -2968,14 +2969,15 @@ unsigned int bgp_peer_gr_action(struct peer *peer, enum peer_mode old_state,
        bgp_peer_move_to_gr_mode(peer, new_state);
 
        if (session_reset) {
+               peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
+
                /* Reset session to match with behavior for other peer
                 * configs that require the session to be re-setup.
                 */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(peer);
        }
 
index bce820237792d5e95361af47b66b82b8560ef0bc..1ecbba0ab5c5971bb75f3a0176cfa76d3c961d98 100644 (file)
@@ -2928,11 +2928,10 @@ DEFUN(bgp_reject_as_sets, bgp_reject_as_sets_cmd,
         * with aspath containing AS_SET or AS_CONFED_SET.
         */
        for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
+               peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               }
        }
 
        return CMD_SUCCESS;
@@ -2954,11 +2953,10 @@ DEFUN(no_bgp_reject_as_sets, no_bgp_reject_as_sets_cmd,
         * with aspath containing AS_SET or AS_CONFED_SET.
         */
        for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
+               peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               }
        }
 
        return CMD_SUCCESS;
@@ -5107,12 +5105,13 @@ static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
                else
                        peer_flag_unset(peer, PEER_FLAG_IFPEER_V6ONLY);
 
+               peer->last_reset = PEER_DOWN_V6ONLY_CHANGE;
+
                /* v6only flag changed. Reset bgp seesion */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_V6ONLY_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(peer);
        }
 
index a59a9b6b0f0b621aa1378f456103b0ba347675a8..b32a4640f02b03b26cd7eff016af879bbde0ad6f 100644 (file)
@@ -306,11 +306,11 @@ static int bgp_router_id_set(struct bgp *bgp, const struct in_addr *id,
        for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
                IPV4_ADDR_COPY(&peer->local_id, id);
 
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_RID_CHANGE;
+               peer->last_reset = PEER_DOWN_RID_CHANGE;
+
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               }
        }
 
        /* EVPN uses router id in RD, update them */
@@ -440,11 +440,12 @@ void bm_wait_for_fib_set(bool set)
         */
        for (ALL_LIST_ELEMENTS_RO(bm->bgp, next, bgp)) {
                for (ALL_LIST_ELEMENTS_RO(bgp->peer, node, peer)) {
+                       peer->last_reset = PEER_DOWN_SUPPRESS_FIB_PENDING;
+
                        if (!BGP_IS_VALID_STATE_FOR_NOTIF(
                                    peer->connection->status))
                                continue;
 
-                       peer->last_reset = PEER_DOWN_SUPPRESS_FIB_PENDING;
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
                }
@@ -496,10 +497,11 @@ void bgp_suppress_fib_pending_set(struct bgp *bgp, bool set)
         * let's just start over
         */
        for (ALL_LIST_ELEMENTS_RO(bgp->peer, node, peer)) {
+               peer->last_reset = PEER_DOWN_SUPPRESS_FIB_PENDING;
+
                if (!BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        continue;
 
-               peer->last_reset = PEER_DOWN_SUPPRESS_FIB_PENDING;
                bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                BGP_NOTIFY_CEASE_CONFIG_CHANGE);
        }
@@ -523,11 +525,11 @@ void bgp_cluster_id_set(struct bgp *bgp, struct in_addr *cluster_id)
                if (peer->sort != BGP_PEER_IBGP)
                        continue;
 
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_CLID_CHANGE;
+               peer->last_reset = PEER_DOWN_CLID_CHANGE;
+
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               }
        }
 }
 
@@ -547,11 +549,11 @@ void bgp_cluster_id_unset(struct bgp *bgp)
                if (peer->sort != BGP_PEER_IBGP)
                        continue;
 
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_CLID_CHANGE;
+               peer->last_reset = PEER_DOWN_CLID_CHANGE;
+
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               }
        }
 }
 
@@ -676,14 +678,12 @@ void bgp_confederation_id_unset(struct bgp *bgp)
                /* We're looking for peers who's AS is not local */
                if (peer_sort(peer) != BGP_PEER_IBGP) {
                        peer->local_as = bgp->as;
+                       peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
                        if (BGP_IS_VALID_STATE_FOR_NOTIF(
-                                   peer->connection->status)) {
-                               peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
+                                   peer->connection->status))
                                bgp_notify_send(peer->connection,
                                                BGP_NOTIFY_CEASE,
                                                BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-                       }
-
                        else
                                bgp_session_reset_safe(peer, &nnode);
                }
@@ -2091,11 +2091,11 @@ void peer_as_change(struct peer *peer, as_t as, enum peer_asn_type as_type,
 
        /* Stop peer. */
        if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_REMOTE_AS_CHANGE;
+               peer->last_reset = PEER_DOWN_REMOTE_AS_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(peer);
        }
        origtype = peer_sort_lookup(peer);
@@ -2446,6 +2446,8 @@ static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
        if (!active && peer_active(peer)) {
                bgp_timer_set(peer->connection);
        } else {
+               peer->last_reset = PEER_DOWN_AF_ACTIVATE;
+
                if (peer_established(peer->connection)) {
                        if (CHECK_FLAG(peer->cap, PEER_CAP_DYNAMIC_RCV)) {
                                peer->afc_adv[afi][safi] = 1;
@@ -2458,18 +2460,15 @@ static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
                                                           false);
                                }
                        } else {
-                               peer->last_reset = PEER_DOWN_AF_ACTIVATE;
                                bgp_notify_send(peer->connection,
                                                BGP_NOTIFY_CEASE,
                                                BGP_NOTIFY_CEASE_CONFIG_CHANGE);
                        }
                }
                if (peer->connection->status == OpenSent ||
-                   peer->connection->status == OpenConfirm) {
-                       peer->last_reset = PEER_DOWN_AF_ACTIVATE;
+                   peer->connection->status == OpenConfirm)
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               }
                /*
                 * If we are turning on a AFI/SAFI locally and we've
                 * started bringing a peer up, we need to tell
@@ -2481,11 +2480,9 @@ static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
                 */
                other = peer->doppelganger;
                if (other && (other->connection->status == OpenSent ||
-                             other->connection->status == OpenConfirm)) {
-                       other->last_reset = PEER_DOWN_AF_ACTIVATE;
+                             other->connection->status == OpenConfirm))
                        bgp_notify_send(other->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               }
        }
 
        return 0;
@@ -2579,6 +2576,8 @@ static bool non_peergroup_deactivate_af(struct peer *peer, afi_t afi,
        }
 
        if (peer_established(peer->connection)) {
+               peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE;
+
                if (CHECK_FLAG(peer->cap, PEER_CAP_DYNAMIC_RCV)) {
                        peer->afc_adv[afi][safi] = 0;
                        peer->afc_nego[afi][safi] = 0;
@@ -2590,13 +2589,11 @@ static bool non_peergroup_deactivate_af(struct peer *peer, afi_t afi,
                                bgp_clear_route(peer, afi, safi);
                                peer->pcount[afi][safi] = 0;
                        } else {
-                               peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE;
                                bgp_notify_send(peer->connection,
                                                BGP_NOTIFY_CEASE,
                                                BGP_NOTIFY_CEASE_CONFIG_CHANGE);
                        }
                } else {
-                       peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE;
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
                }
@@ -3346,13 +3343,13 @@ int peer_group_bind(struct bgp *bgp, union sockunion *su, struct peer *peer,
 
                SET_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE);
 
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_RMAP_BIND;
+               peer->last_reset = PEER_DOWN_RMAP_BIND;
+
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               } else {
+               else
                        bgp_session_reset(peer);
-               }
        }
 
        /* Create a new peer. */
@@ -4790,6 +4787,13 @@ static int peer_flag_action_set(const struct peer_flag_action *action_list,
 
 static void peer_flag_modify_action(struct peer *peer, uint64_t flag)
 {
+       if (flag == PEER_FLAG_DYNAMIC_CAPABILITY)
+               peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
+       else if (flag == PEER_FLAG_PASSIVE)
+               peer->last_reset = PEER_DOWN_PASSIVE_CHANGE;
+       else if (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)
+               peer->last_reset = PEER_DOWN_MULTIHOP_CHANGE;
+
        if (flag == PEER_FLAG_SHUTDOWN) {
                if (CHECK_FLAG(peer->flags, flag)) {
                        if (CHECK_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT))
@@ -4838,13 +4842,6 @@ static void peer_flag_modify_action(struct peer *peer, uint64_t flag)
                        BGP_EVENT_ADD(peer->connection, BGP_Stop);
                }
        } else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-               if (flag == PEER_FLAG_DYNAMIC_CAPABILITY)
-                       peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
-               else if (flag == PEER_FLAG_PASSIVE)
-                       peer->last_reset = PEER_DOWN_PASSIVE_CHANGE;
-               else if (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)
-                       peer->last_reset = PEER_DOWN_MULTIHOP_CHANGE;
-
                bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                BGP_NOTIFY_CEASE_CONFIG_CHANGE);
        } else
@@ -5564,12 +5561,12 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
 
        /* Check if handling a regular peer. */
        if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+               peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
                /* Send notification or reset peer depending on state. */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(peer);
 
                /* Apply new source configuration to BFD session. */
@@ -5601,13 +5598,13 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)
                member->update_if = XSTRDUP(MTYPE_PEER_UPDATE_SOURCE, ifname);
                sockunion_free(member->update_source);
                member->update_source = NULL;
+               member->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
 
                /* Send notification or reset peer depending on state. */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status)) {
-                       member->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
                        bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(member);
 
                /* Apply new source configuration to BFD session. */
@@ -5635,12 +5632,12 @@ void peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
 
        /* Check if handling a regular peer. */
        if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+               peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
                /* Send notification or reset peer depending on state. */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(peer);
 
                /* Apply new source configuration to BFD session. */
@@ -5671,13 +5668,13 @@ void peer_update_source_addr_set(struct peer *peer, const union sockunion *su)
                SET_FLAG(member->flags, PEER_FLAG_UPDATE_SOURCE);
                member->update_source = sockunion_dup(su);
                XFREE(MTYPE_PEER_UPDATE_SOURCE, member->update_if);
+               member->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
 
                /* Send notification or reset peer depending on state. */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status)) {
-                       member->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
                        bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(member);
 
                /* Apply new source configuration to BFD session. */
@@ -5723,12 +5720,12 @@ void peer_update_source_unset(struct peer *peer)
 
        /* Check if handling a regular peer. */
        if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+               peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
                /* Send notification or reset peer depending on state. */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(peer);
 
                /* Apply new source configuration to BFD session. */
@@ -5758,13 +5755,13 @@ void peer_update_source_unset(struct peer *peer)
                sockunion_free(member->update_source);
                member->update_source = NULL;
                XFREE(MTYPE_PEER_UPDATE_SOURCE, member->update_if);
+               member->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
 
                /* Send notification or reset peer depending on state. */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status)) {
-                       member->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
                        bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(member);
 
                /* Apply new source configuration to BFD session. */
@@ -6730,12 +6727,12 @@ int peer_local_as_unset(struct peer *peer)
 
        /* Check if handling a regular peer. */
        if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
+               peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
                /* Send notification or stop peer depending on state. */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
-                       peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status))
                        bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        BGP_EVENT_ADD(peer->connection, BGP_Stop);
 
                /* Skip peer-group mechanics for regular peers. */
@@ -6757,13 +6754,13 @@ int peer_local_as_unset(struct peer *peer)
                UNSET_FLAG(member->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
                member->change_local_as = 0;
                XFREE(MTYPE_BGP_NAME, member->change_local_as_pretty);
+               member->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
 
                /* Send notification or stop peer depending on state. */
-               if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status)) {
-                       member->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
+               if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection->status))
                        bgp_notify_send(member->connection, BGP_NOTIFY_CEASE,
                                        BGP_NOTIFY_CEASE_CONFIG_CHANGE);
-               else
+               else
                        bgp_session_reset(member);
        }