]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Reset message statistics with clear command
authorDavid Schweizer <dschweizer@opensourcerouting.org>
Wed, 19 Jan 2022 13:24:18 +0000 (14:24 +0100)
committerDavid Schweizer <dschweizer@opensourcerouting.org>
Wed, 19 Jan 2022 13:24:18 +0000 (14:24 +0100)
Signed-off-by: David Schweizer <dschweizer@opensourcerouting.org>
bgpd/bgp_vty.c
bgpd/bgpd.c
bgpd/bgpd.h

index e07883865a55ea0d9913072ecdae92c78d2872bf..48e5ae7b29ea3646a6fbf533eb664253c549d053 100644 (file)
@@ -9430,7 +9430,7 @@ static int bgp_clear_prefix(struct vty *vty, const char *view_name,
 /* one clear bgp command to rule them all */
 DEFUN (clear_ip_bgp_all,
        clear_ip_bgp_all_cmd,
-       "clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D$neighbor|X:X::X:X$neighbor|WORD$neighbor|(1-4294967295)|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out>]",
+       "clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D$neighbor|X:X::X:X$neighbor|WORD$neighbor|(1-4294967295)|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out|message-stats>]",
        CLEAR_STR
        IP_STR
        BGP_STR
@@ -9452,7 +9452,8 @@ DEFUN (clear_ip_bgp_all,
        BGP_SOFT_OUT_STR
        BGP_SOFT_IN_STR
        "Push out prefix-list ORF and do inbound soft reconfig\n"
-       BGP_SOFT_OUT_STR)
+       BGP_SOFT_OUT_STR
+       "Reset message statistics\n")
 {
        char *vrf = NULL;
 
@@ -9509,7 +9510,7 @@ DEFUN (clear_ip_bgp_all,
                clr_sort = clear_external;
        }
 
-       /* [<soft [<in|out>]|in [prefix-filter]|out>] */
+       /* [<soft [<in|out>]|in [prefix-filter]|out|message-stats>] */
        if (argv_find(argv, argc, "soft", &idx)) {
                if (argv_find(argv, argc, "in", &idx)
                    || argv_find(argv, argc, "out", &idx))
@@ -9524,6 +9525,8 @@ DEFUN (clear_ip_bgp_all,
                                   : BGP_CLEAR_SOFT_IN;
        } else if (argv_find(argv, argc, "out", &idx)) {
                clr_type = BGP_CLEAR_SOFT_OUT;
+       } else if (argv_find(argv, argc, "message-stats", &idx)) {
+               clr_type = BGP_CLEAR_MESSAGE_STATS;
        } else
                clr_type = BGP_CLEAR_SOFT_NONE;
 
index b592724d2775036d17afb0ae6a52f3676bc30b73..72e7a936c622c7567d4c8645388dce1578e5f5ef 100644 (file)
@@ -7509,6 +7509,34 @@ int peer_ttl_security_hops_unset(struct peer *peer)
        return ret;
 }
 
+static void peer_reset_message_stats(struct peer *peer)
+{
+       if (peer) {
+               atomic_store_explicit(&peer->open_in, 0, memory_order_relaxed);
+               atomic_store_explicit(&peer->open_out, 0, memory_order_relaxed);
+               atomic_store_explicit(&peer->update_in, 0,
+                                     memory_order_relaxed);
+               atomic_store_explicit(&peer->update_out, 0,
+                                     memory_order_relaxed);
+               atomic_store_explicit(&peer->keepalive_in, 0,
+                                     memory_order_relaxed);
+               atomic_store_explicit(&peer->keepalive_out, 0,
+                                     memory_order_relaxed);
+               atomic_store_explicit(&peer->notify_in, 0,
+                                     memory_order_relaxed);
+               atomic_store_explicit(&peer->notify_out, 0,
+                                     memory_order_relaxed);
+               atomic_store_explicit(&peer->refresh_in, 0,
+                                     memory_order_relaxed);
+               atomic_store_explicit(&peer->refresh_out, 0,
+                                     memory_order_relaxed);
+               atomic_store_explicit(&peer->dynamic_cap_in, 0,
+                                     memory_order_relaxed);
+               atomic_store_explicit(&peer->dynamic_cap_out, 0,
+                                     memory_order_relaxed);
+       }
+}
+
 /*
  * If peer clear is invoked in a loop for all peers on the BGP instance,
  * it may end up freeing the doppelganger, and if this was the next node
@@ -7621,6 +7649,10 @@ int peer_clear_soft(struct peer *peer, afi_t afi, safi_t safi,
                                return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED;
                }
        }
+
+       if (stype == BGP_CLEAR_MESSAGE_STATS)
+               peer_reset_message_stats(peer);
+
        return 0;
 }
 
index 747c185e391f3d5f5a1d253ea742fa3b21c806f9..02560849c1d87bc9f1c357c855656c58c0ba72a6 100644 (file)
@@ -1905,7 +1905,8 @@ enum bgp_clear_type {
        BGP_CLEAR_SOFT_OUT,
        BGP_CLEAR_SOFT_IN,
        BGP_CLEAR_SOFT_BOTH,
-       BGP_CLEAR_SOFT_IN_ORF_PREFIX
+       BGP_CLEAR_SOFT_IN_ORF_PREFIX,
+       BGP_CLEAR_MESSAGE_STATS
 };
 
 /* Macros. */