diff --git a/src/net.cpp b/src/net.cpp index f8149ef309d..7edb8eacf49 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -539,6 +539,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, network_id, CNodeOptions{ .permission_flags = permission_flags, + .proxy_override = proxy_override, .i2p_sam_session = std::move(i2p_transient_session), .recv_flood_size = nReceiveFloodSize, .use_v2transport = use_v2transport, @@ -1956,6 +1957,7 @@ void CConnman::DisconnectNodes() // and we don't want to hold up the socket handler thread for that long. if (network_active && pnode->m_transport->ShouldReconnectV1()) { reconnections_to_add.push_back({ + .proxy_override = pnode->m_proxy_override, .addr_connect = pnode->addr, .grant = std::move(pnode->grantOutbound), .destination = pnode->m_dest, @@ -4028,6 +4030,7 @@ CNode::CNode(NodeId idIn, m_permission_flags{node_opts.permission_flags}, m_sock{sock}, m_connected{NodeClock::now()}, + m_proxy_override{std::move(node_opts.proxy_override)}, addr{addrIn}, addrBind{addrBindIn}, m_addr_name{addrNameIn.empty() ? addr.ToStringAddrPort() : addrNameIn}, @@ -4214,7 +4217,8 @@ void CConnman::PerformReconnections() std::move(item.grant), item.destination.empty() ? nullptr : item.destination.c_str(), item.conn_type, - item.use_v2transport); + item.use_v2transport, + item.proxy_override); } } diff --git a/src/net.h b/src/net.h index d0171c5345f..fe8322d1f34 100644 --- a/src/net.h +++ b/src/net.h @@ -669,6 +669,7 @@ public: struct CNodeOptions { NetPermissionFlags permission_flags = NetPermissionFlags::None; + std::optional proxy_override = {}; std::unique_ptr i2p_sam_session = nullptr; bool prefer_evict = false; size_t recv_flood_size{DEFAULT_MAXRECEIVEBUFFER * 1000}; @@ -711,6 +712,10 @@ public: std::atomic m_last_recv{NodeClock::epoch}; //! Unix epoch time at peer connection const NodeClock::time_point m_connected; + + //! Proxy to use regardless of global proxy settings if reconnecting to this node. + const std::optional m_proxy_override; + // Address of this peer const CAddress addr; // Bind address of our side of the connection @@ -1796,6 +1801,7 @@ private: /** Struct for entries in m_reconnections. */ struct ReconnectionInfo { + std::optional proxy_override; CAddress addr_connect; CountingSemaphoreGrant<> grant; std::string destination;