@@ -3547,6 +3547,17 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect, CDe
35473547 continue ;
35483548 }
35493549
3550+ // Do not make automatic outbound connections to addnode peers, to
3551+ // not use our limited outbound slots for them and to ensure
3552+ // addnode connections benefit from their intended protections.
3553+ if (AddedNodesContain (addr)) {
3554+ LogPrint (BCLog::NET, " Not making automatic %s%s connection to %s peer selected for manual (addnode) connection%s\n " ,
3555+ preferred_net.has_value () ? " network-specific " : " " ,
3556+ ConnectionTypeAsString (conn_type), GetNetworkName (addr.GetNetwork ()),
3557+ fLogIPs ? strprintf (" : %s" , addr.ToStringAddrPort ()) : " " );
3558+ continue ;
3559+ }
3560+
35503561 addrConnect = addr;
35513562 break ;
35523563 }
@@ -4581,6 +4592,17 @@ bool CConnman::RemoveAddedNode(const std::string& strNode)
45814592 return false ;
45824593}
45834594
4595+ bool CConnman::AddedNodesContain (const CAddress& addr) const
4596+ {
4597+ AssertLockNotHeld (m_added_nodes_mutex);
4598+ const std::string addr_str{addr.ToStringAddr ()};
4599+ const std::string addr_port_str{addr.ToStringAddrPort ()};
4600+ LOCK (m_added_nodes_mutex);
4601+ return (m_added_node_params.size () < 24 // bound the query to a reasonable limit
4602+ && std::any_of (m_added_node_params.cbegin (), m_added_node_params.cend (),
4603+ [&](const auto & p) { return p.m_added_node == addr_str || p.m_added_node == addr_port_str; }));
4604+ }
4605+
45844606bool CConnman::AddPendingMasternode (const uint256& proTxHash)
45854607{
45864608 LOCK (cs_vPendingMasternodes);
0 commit comments