diff options
| author | Russ White <russ@riw.us> | 2024-11-12 10:02:33 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-12 10:02:33 -0500 |
| commit | c36a1c27c604fbddd8e97a52e6b5d489a07bb3f9 (patch) | |
| tree | efed379a9b9c6734c9d1e08687ec79c239e74dc6 | |
| parent | a1270992b492bf467e1cf51870ae971ef86f0c07 (diff) | |
| parent | 4c3cc73958989eb1a73c37b60780bf0a170ff9d9 (diff) | |
Merge pull request #17406 from FRRouting/mergify/bp/stable/9.1/pr-15686
BGP TCP non established : get port and ip (backport #15686)
| -rw-r--r-- | bgpd/bgp_fsm.c | 18 | ||||
| -rw-r--r-- | bgpd/bgp_network.c | 4 |
2 files changed, 18 insertions, 4 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 69cc78e0f8..33e5c3a743 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -1800,6 +1800,22 @@ bgp_connect_fail(struct peer_connection *connection) return bgp_stop(connection); } +/* after connect is called(), getpeername is able to return + * port and address on non established streams + */ +static void bgp_connect_in_progress_update_connection(struct peer *peer) +{ + bgp_getsockname(peer); + if (!peer->su_remote && !BGP_CONNECTION_SU_UNSPEC(peer->connection)) { + /* if connect initiated, then dest port and dest addresses are well known */ + peer->su_remote = sockunion_dup(&peer->connection->su); + if (sockunion_family(peer->su_remote) == AF_INET) + peer->su_remote->sin.sin_port = htons(peer->port); + else if (sockunion_family(peer->su_remote) == AF_INET6) + peer->su_remote->sin6.sin6_port = htons(peer->port); + } +} + /* This function is the first starting point of all BGP connection. It * try to connect to remote peer with non-blocking IO. */ @@ -1896,6 +1912,8 @@ static enum bgp_fsm_state_progress bgp_start(struct peer_connection *connection) __func__, peer->connection->fd); return BGP_FSM_FAILURE; } + bgp_connect_in_progress_update_connection(peer); + /* * - when the socket becomes ready, poll() will signify POLLOUT * - if it fails to connect, poll() will signify POLLHUP diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c index b874e7211f..f08881512a 100644 --- a/bgpd/bgp_network.c +++ b/bgpd/bgp_network.c @@ -876,11 +876,7 @@ int bgp_getsockname(struct peer *peer) } peer->su_local = sockunion_getsockname(peer->connection->fd); - if (!peer->su_local) - return -1; peer->su_remote = sockunion_getpeername(peer->connection->fd); - if (!peer->su_remote) - return -1; if (!bgp_zebra_nexthop_set(peer->su_local, peer->su_remote, &peer->nexthop, peer)) { |
