@ -1829,21 +1829,27 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
int nOutboundFullRelay = 0 ;
int nOutboundBlockRelay = 0 ;
std : : set < std : : vector < unsigned char > > setConnected ;
{
LOCK ( cs_vNodes ) ;
for ( const CNode * pnode : vNodes ) {
if ( ! pnode - > IsInboundConn ( ) & & ( pnode - > m_conn_type ! = ConnectionType : : MANUAL ) ) {
// Netgroups for inbound and addnode peers are not excluded because our goal here
// is to not use multiple of our limited outbound slots on a single netgroup
// but inbound and addnode peers do not use our outbound slots. Inbound peers
// also have the added issue that they're attacker controlled and could be used
// to prevent us from connecting to particular hosts if we used them here.
setConnected . insert ( pnode - > addr . GetGroup ( addrman . m_asmap ) ) ;
if ( pnode - > m_tx_relay = = nullptr ) {
nOutboundBlockRelay + + ;
} else if ( pnode - > m_conn_type = = ConnectionType : : OUTBOUND ) {
nOutboundFullRelay + + ;
}
if ( pnode - > IsFullOutboundConn ( ) ) nOutboundFullRelay + + ;
if ( pnode - > IsBlockOnlyConn ( ) ) nOutboundBlockRelay + + ;
// Netgroups for inbound and manual peers are not excluded because our goal here
// is to not use multiple of our limited outbound slots on a single netgroup
// but inbound and manual peers do not use our outbound slots. Inbound peers
// also have the added issue that they could be attacker controlled and used
// to prevent us from connecting to particular hosts if we used them here.
switch ( pnode - > m_conn_type ) {
case ConnectionType : : INBOUND :
case ConnectionType : : MANUAL :
break ;
case ConnectionType : : OUTBOUND :
case ConnectionType : : BLOCK_RELAY :
case ConnectionType : : ADDR_FETCH :
case ConnectionType : : FEELER :
setConnected . insert ( pnode - > addr . GetGroup ( addrman . m_asmap ) ) ;
}
}
}