From 079e2b069cb479abff4e2985eef214fbca39bb88 Mon Sep 17 00:00:00 2001 From: Martin Zumsande Date: Mon, 11 Dec 2023 14:37:56 -0500 Subject: [PATCH] net: attempt v2 transport for manual connections if we support it This affects manual connections made either with -connect, or with -addnode provided as a bitcoind config arg (the addnode RPC has an extra option for v2). We don't necessarily know if our peer supports v2, but will reconnect with v1 if they don't. In order to do that, improve the reconnection behavior such that we will reconnect after a sleep of 500ms (which usually should be enough for our peer to send us their version message). --- src/net.cpp | 10 +++++++--- src/net.h | 7 ++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index 60530fd926..4c320123b2 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2426,12 +2426,15 @@ void CConnman::ThreadOpenConnections(const std::vector connect) // Connect to specific addresses if (!connect.empty()) { + // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our + // peer doesn't support it or immediately disconnects us for another reason. + const bool use_v2transport(GetLocalServices() & NODE_P2P_V2); for (int64_t nLoop = 0;; nLoop++) { for (const std::string& strAddr : connect) { CAddress addr(CService(), NODE_NONE); - OpenNetworkConnection(addr, false, {}, strAddr.c_str(), ConnectionType::MANUAL, /*use_v2transport=*/false); + OpenNetworkConnection(addr, false, {}, strAddr.c_str(), ConnectionType::MANUAL, /*use_v2transport=*/use_v2transport); for (int i = 0; i < 10 && i < nLoop; i++) { if (!interruptNet.sleep_for(std::chrono::milliseconds(500))) @@ -2440,6 +2443,7 @@ void CConnman::ThreadOpenConnections(const std::vector connect) } if (!interruptNet.sleep_for(std::chrono::milliseconds(500))) return; + PerformReconnections(); } } @@ -2845,11 +2849,11 @@ void CConnman::ThreadOpenAddedConnections() grant = CSemaphoreGrant(*semAddnode, /*fTry=*/true); } } + // See if any reconnections are desired. + PerformReconnections(); // Retry every 60 seconds if a connection was attempted, otherwise two seconds if (!interruptNet.sleep_for(std::chrono::seconds(tried ? 60 : 2))) return; - // See if any reconnections are desired. - PerformReconnections(); } } diff --git a/src/net.h b/src/net.h index 8a4df1a149..7b5d85d888 100644 --- a/src/net.h +++ b/src/net.h @@ -1096,10 +1096,11 @@ class CConnman vWhitelistedRange = connOptions.vWhitelistedRange; { LOCK(m_added_nodes_mutex); - + // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our + // peer doesn't support it or immediately disconnects us for another reason. + const bool use_v2transport(GetLocalServices() & NODE_P2P_V2); for (const std::string& added_node : connOptions.m_added_nodes) { - // -addnode cli arg does not currently have a way to signal BIP324 support - m_added_node_params.push_back({added_node, false}); + m_added_node_params.push_back({added_node, use_v2transport}); } } m_onion_binds = connOptions.onion_binds;