diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 72ee195594..66cde7b3a2 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -576,7 +576,9 @@ const char *const peer_down_str[] = {"", "Waiting for NHT", "Waiting for Peer IPv6 LLA", "Waiting for VRF to be initialized", - "No AFI/SAFI activated for peer"}; + "No AFI/SAFI activated for peer", + "AS Set config change", + "Waiting for peer OPEN"}; static int bgp_graceful_restart_timer_expire(struct thread *thread) { diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index f2c3ab19b8..3060fe482c 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -789,13 +789,22 @@ static void evaluate_paths(struct bgp_nexthop_cache *bnc) bgp_process(bgp_path, rn, afi, safi); } - if (peer && !CHECK_FLAG(bnc->flags, BGP_NEXTHOP_PEER_NOTIFIED)) { - if (BGP_DEBUG(nht, NHT)) - zlog_debug("%s: Updating peer (%s(%s)) status with NHT", - __FUNCTION__, peer->host, - peer->bgp->name_pretty); - bgp_fsm_event_update(peer, bgp_isvalid_nexthop(bnc)); - SET_FLAG(bnc->flags, BGP_NEXTHOP_PEER_NOTIFIED); + if (peer) { + int valid_nexthops = bgp_isvalid_nexthop(bnc); + + if (valid_nexthops) + peer->last_reset = PEER_DOWN_WAITING_OPEN; + else + peer->last_reset = PEER_DOWN_WAITING_NHT; + + if (!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_PEER_NOTIFIED)) { + if (BGP_DEBUG(nht, NHT)) + zlog_debug("%s: Updating peer (%s(%s)) status with NHT", + __FUNCTION__, peer->host, + peer->bgp->name_pretty); + bgp_fsm_event_update(peer, valid_nexthops); + SET_FLAG(bnc->flags, BGP_NEXTHOP_PEER_NOTIFIED); + } } RESET_FLAG(bnc->change_flags); diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 752cb071cd..e6a7c4b7f9 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1321,10 +1321,10 @@ struct peer { #define PEER_DOWN_REMOTE_AS_CHANGE 2 /* neighbor remote-as command */ #define PEER_DOWN_LOCAL_AS_CHANGE 3 /* neighbor local-as command */ #define PEER_DOWN_CLID_CHANGE 4 /* bgp cluster-id command */ -#define PEER_DOWN_CONFED_ID_CHANGE 5 /* bgp confederation identifier command */ +#define PEER_DOWN_CONFED_ID_CHANGE 5 /* bgp confederation id command */ #define PEER_DOWN_CONFED_PEER_CHANGE 6 /* bgp confederation peer command */ -#define PEER_DOWN_RR_CLIENT_CHANGE 7 /* neighbor route-reflector-client command */ -#define PEER_DOWN_RS_CLIENT_CHANGE 8 /* neighbor route-server-client command */ +#define PEER_DOWN_RR_CLIENT_CHANGE 7 /* neighbor rr-client command */ +#define PEER_DOWN_RS_CLIENT_CHANGE 8 /* neighbor rs-client command */ #define PEER_DOWN_UPDATE_SOURCE_CHANGE 9 /* neighbor update-source command */ #define PEER_DOWN_AF_ACTIVATE 10 /* neighbor activate command */ #define PEER_DOWN_USER_SHUTDOWN 11 /* neighbor shutdown command */ @@ -1348,6 +1348,12 @@ struct peer { #define PEER_DOWN_VRF_UNINIT 29 /* Associated VRF is not init yet */ #define PEER_DOWN_NOAFI_ACTIVATED 30 /* No AFI/SAFI activated for peer */ #define PEER_DOWN_AS_SETS_REJECT 31 /* Reject routes with AS_SET */ +#define PEER_DOWN_WAITING_OPEN 32 /* Waiting for open to succeed */ + /* + * Remember to update peer_down_str in bgp_fsm.c when you add + * a new value to the last_reset reason + */ + size_t last_reset_cause_size; uint8_t last_reset_cause[BGP_MAX_PACKET_SIZE];