From 7a75470fe179f3d95b218f3aaf0a703237d71b3c Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 30 Apr 2021 19:24:40 -0400 Subject: [PATCH] bgpd: Delay setting peer data until after decision to allow open Delay setting local data about a remote peer until after BGP has decided to allow an open connection to proceed. Modifying local peer data structures based upon what is received from a peer should not be done until after BGP has decided that the open is allowed to proceed. Signed-off-by: Donald Sharp --- bgpd/bgp_packet.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index eb079d9387..d79621a749 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -1261,9 +1261,6 @@ static int bgp_open_receive(struct peer *peer, bgp_size_t size) return BGP_Stop; } - /* Set remote router-id */ - peer->remote_id = remote_id; - /* Peer BGP version check. */ if (version != BGP_VERSION_4) { uint16_t maxver = htons(BGP_VERSION_4); @@ -1323,6 +1320,25 @@ static int bgp_open_receive(struct peer *peer, bgp_size_t size) return BGP_Stop; } + /* + * When collision is detected and this peer is closed. + * Return immediately. + */ + ret = bgp_collision_detect(peer, remote_id); + if (ret < 0) + return BGP_Stop; + + /* Get sockname. */ + if (bgp_getsockname(peer) < 0) { + flog_err_sys(EC_LIB_SOCKET, + "%s: bgp_getsockname() failed for peer: %s", + __func__, peer->host); + return BGP_Stop; + } + + /* Set remote router-id */ + peer->remote_id = remote_id; + /* From the rfc: Upon receipt of an OPEN message, a BGP speaker MUST calculate the value of the Hold Timer by using the smaller of its configured Hold Time and the Hold Time received in the OPEN message. @@ -1403,21 +1419,6 @@ static int bgp_open_receive(struct peer *peer, bgp_size_t size) peer->afc[AFI_IP6][SAFI_FLOWSPEC]; } - /* When collision is detected and this peer is closed. - * Return immediately. - */ - ret = bgp_collision_detect(peer, remote_id); - if (ret < 0) - return BGP_Stop; - - /* Get sockname. */ - if (bgp_getsockname(peer) < 0) { - flog_err_sys(EC_LIB_SOCKET, - "%s: bgp_getsockname() failed for peer: %s", - __func__, peer->host); - return BGP_Stop; - } - /* Verify valid local address present based on negotiated * address-families. */ if (peer->afc_nego[AFI_IP][SAFI_UNICAST] -- 2.39.5