From cb9196e77adbfa52636ec6b578017186421fa0f7 Mon Sep 17 00:00:00 2001 From: David Schweizer Date: Fri, 14 Aug 2020 10:23:34 +0200 Subject: [PATCH] bgpd: bgp instance administrative shutdown. * Fixed integration in FSM and packet handling. * Added CLI "show" output, incl. JSON. * For review and testing only. Signed-off-by: David Schweizer --- bgpd/bgp_fsm.c | 2 ++ bgpd/bgp_network.c | 3 ++- bgpd/bgp_packet.c | 2 ++ bgpd/bgp_vty.c | 15 ++++++++++----- bgpd/bgpd.c | 3 ++- bgpd/bgpd.h | 3 ++- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index ab3b88da7a..7888ceef50 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -1548,6 +1548,8 @@ int bgp_start(struct peer *peer) peer->host); if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)) peer->last_reset = PEER_DOWN_USER_SHUTDOWN; + else if (CHECK_FLAG(peer->bgp->flags, BGP_FLAG_SHUTDOWN)) + peer->last_reset = PEER_DOWN_USER_SHUTDOWN; else if (CHECK_FLAG(peer->sflags, PEER_STATUS_PREFIX_OVERFLOW)) peer->last_reset = PEER_DOWN_PFX_COUNT; return -1; diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c index 06aec9412c..c324f259ba 100644 --- a/bgpd/bgp_network.c +++ b/bgpd/bgp_network.c @@ -459,7 +459,8 @@ static int bgp_accept(struct thread *thread) return -1; } - if (CHECK_FLAG(peer1->flags, PEER_FLAG_SHUTDOWN)) { + if (CHECK_FLAG(peer1->flags, PEER_FLAG_SHUTDOWN) + || CHECK_FLAG(peer1->bgp->flags, BGP_FLAG_SHUTDOWN)) { if (bgp_debug_neighbor_events(peer1)) zlog_debug( "[Event] connection from %s rejected(%s:%u:%s) due to admin shutdown", diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index 7692a200ee..66315aa84a 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -198,6 +198,8 @@ void bgp_check_update_delay(struct bgp *bgp) PEER_FLAG_CONFIG_NODE) && !CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN) + && !CHECK_FLAG(peer->bgp->flags, + BGP_FLAG_SHUTDOWN) && !peer->update_delay_over) { if (bgp_debug_neighbor_events(peer)) zlog_debug( diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 9244e5cc56..f9d030e08c 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -9355,7 +9355,8 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi, json_object_int_add(json_peer, "pfxSnt", (PAF_SUBGRP(paf))->scount); - if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)) + if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN) + || CHECK_FLAG(peer->bgp->flags, BGP_FLAG_SHUTDOWN)) json_object_string_add(json_peer, "state", "Idle (Admin)"); else if (peer->afc_recv[afi][safi]) @@ -9474,7 +9475,8 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi, ->scount); } } else { - if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)) + if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN) + || CHECK_FLAG(peer->bgp->flags, BGP_FLAG_SHUTDOWN)) vty_out(vty, " Idle (Admin)"); else if (CHECK_FLAG( peer->sflags, @@ -10971,7 +10973,8 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json, if (use_json) { /* Administrative shutdown. */ - if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN)) + if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN) + || CHECK_FLAG(p->bgp->flags, BGP_FLAG_SHUTDOWN)) json_object_boolean_true_add(json_neigh, "adminShutDown"); @@ -11077,7 +11080,8 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json, } } else { /* Administrative shutdown. */ - if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN)) + if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN) + || CHECK_FLAG(p->bgp->flags, BGP_FLAG_SHUTDOWN)) vty_out(vty, " Administratively shut down\n"); /* BGP Version. */ @@ -13651,7 +13655,8 @@ static int bgp_show_one_peer_group(struct vty *vty, struct peer_group *group) if (listcount(group->peer)) { vty_out(vty, " Peer-group members:\n"); for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) { - if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)) + if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN) + || CHECK_FLAG(peer->bgp->flags, BGP_FLAG_SHUTDOWN)) peer_status = "Idle (Admin)"; else if (CHECK_FLAG(peer->sflags, PEER_STATUS_PREFIX_OVERFLOW)) diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 5e5bb94591..85df7437a5 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -6834,7 +6834,8 @@ int peer_ttl_security_hops_unset(struct peer *peer) */ int peer_clear(struct peer *peer, struct listnode **nnode) { - if (!CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)) { + if (!CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN) + || !CHECK_FLAG(peer->bgp->flags, BGP_FLAG_SHUTDOWN)) { if (CHECK_FLAG(peer->sflags, PEER_STATUS_PREFIX_OVERFLOW)) { UNSET_FLAG(peer->sflags, PEER_STATUS_PREFIX_OVERFLOW); if (peer->t_pmax_restart) { diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 3bedeea389..43a800326d 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1463,7 +1463,8 @@ DECLARE_QOBJ_TYPE(peer) /* Check if suppress start/restart of sessions to peer. */ #define BGP_PEER_START_SUPPRESSED(P) \ (CHECK_FLAG((P)->flags, PEER_FLAG_SHUTDOWN) \ - || CHECK_FLAG((P)->sflags, PEER_STATUS_PREFIX_OVERFLOW)) + || CHECK_FLAG((P)->sflags, PEER_STATUS_PREFIX_OVERFLOW) \ + || CHECK_FLAG((P)->bgp->flags, BGP_FLAG_SHUTDOWN)) #define PEER_PASSWORD_MINLEN (1) #define PEER_PASSWORD_MAXLEN (80) -- 2.39.5