summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss White <russ@riw.us>2024-11-12 10:02:33 -0500
committerGitHub <noreply@github.com>2024-11-12 10:02:33 -0500
commitc36a1c27c604fbddd8e97a52e6b5d489a07bb3f9 (patch)
treeefed379a9b9c6734c9d1e08687ec79c239e74dc6
parenta1270992b492bf467e1cf51870ae971ef86f0c07 (diff)
parent4c3cc73958989eb1a73c37b60780bf0a170ff9d9 (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.c18
-rw-r--r--bgpd/bgp_network.c4
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)) {