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 <dschweizer@opensourcerouting.org>
This commit is contained in:
David Schweizer 2020-08-14 10:23:34 +02:00
parent 9cf5943257
commit cb9196e77a
No known key found for this signature in database
GPG Key ID: A07D97BEEE79EF7F
6 changed files with 20 additions and 8 deletions

View File

@ -1548,6 +1548,8 @@ int bgp_start(struct peer *peer)
peer->host); peer->host);
if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)) if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN))
peer->last_reset = PEER_DOWN_USER_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)) else if (CHECK_FLAG(peer->sflags, PEER_STATUS_PREFIX_OVERFLOW))
peer->last_reset = PEER_DOWN_PFX_COUNT; peer->last_reset = PEER_DOWN_PFX_COUNT;
return -1; return -1;

View File

@ -459,7 +459,8 @@ static int bgp_accept(struct thread *thread)
return -1; 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)) if (bgp_debug_neighbor_events(peer1))
zlog_debug( zlog_debug(
"[Event] connection from %s rejected(%s:%u:%s) due to admin shutdown", "[Event] connection from %s rejected(%s:%u:%s) due to admin shutdown",

View File

@ -198,6 +198,8 @@ void bgp_check_update_delay(struct bgp *bgp)
PEER_FLAG_CONFIG_NODE) PEER_FLAG_CONFIG_NODE)
&& !CHECK_FLAG(peer->flags, && !CHECK_FLAG(peer->flags,
PEER_FLAG_SHUTDOWN) PEER_FLAG_SHUTDOWN)
&& !CHECK_FLAG(peer->bgp->flags,
BGP_FLAG_SHUTDOWN)
&& !peer->update_delay_over) { && !peer->update_delay_over) {
if (bgp_debug_neighbor_events(peer)) if (bgp_debug_neighbor_events(peer))
zlog_debug( zlog_debug(

View File

@ -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, json_object_int_add(json_peer,
"pfxSnt", "pfxSnt",
(PAF_SUBGRP(paf))->scount); (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", json_object_string_add(json_peer, "state",
"Idle (Admin)"); "Idle (Admin)");
else if (peer->afc_recv[afi][safi]) 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); ->scount);
} }
} else { } 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)"); vty_out(vty, " Idle (Admin)");
else if (CHECK_FLAG( else if (CHECK_FLAG(
peer->sflags, peer->sflags,
@ -10971,7 +10973,8 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
if (use_json) { if (use_json) {
/* Administrative shutdown. */ /* 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, json_object_boolean_true_add(json_neigh,
"adminShutDown"); "adminShutDown");
@ -11077,7 +11080,8 @@ static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
} }
} else { } else {
/* Administrative shutdown. */ /* 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"); vty_out(vty, " Administratively shut down\n");
/* BGP Version. */ /* BGP Version. */
@ -13651,7 +13655,8 @@ static int bgp_show_one_peer_group(struct vty *vty, struct peer_group *group)
if (listcount(group->peer)) { if (listcount(group->peer)) {
vty_out(vty, " Peer-group members:\n"); vty_out(vty, " Peer-group members:\n");
for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) { 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)"; peer_status = "Idle (Admin)";
else if (CHECK_FLAG(peer->sflags, else if (CHECK_FLAG(peer->sflags,
PEER_STATUS_PREFIX_OVERFLOW)) PEER_STATUS_PREFIX_OVERFLOW))

View File

@ -6834,7 +6834,8 @@ int peer_ttl_security_hops_unset(struct peer *peer)
*/ */
int peer_clear(struct peer *peer, struct listnode **nnode) 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)) { if (CHECK_FLAG(peer->sflags, PEER_STATUS_PREFIX_OVERFLOW)) {
UNSET_FLAG(peer->sflags, PEER_STATUS_PREFIX_OVERFLOW); UNSET_FLAG(peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
if (peer->t_pmax_restart) { if (peer->t_pmax_restart) {

View File

@ -1463,7 +1463,8 @@ DECLARE_QOBJ_TYPE(peer)
/* Check if suppress start/restart of sessions to peer. */ /* Check if suppress start/restart of sessions to peer. */
#define BGP_PEER_START_SUPPRESSED(P) \ #define BGP_PEER_START_SUPPRESSED(P) \
(CHECK_FLAG((P)->flags, PEER_FLAG_SHUTDOWN) \ (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_MINLEN (1)
#define PEER_PASSWORD_MAXLEN (80) #define PEER_PASSWORD_MAXLEN (80)