0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-03-06 14:19:59 -05:00

[net] Add connection type to NodeEvictionCandidate

This commit is contained in:
dergoegge 2022-05-26 15:49:10 +02:00
parent 42aa5d5b62
commit a3c2707039
4 changed files with 15 additions and 2 deletions

View file

@ -957,6 +957,15 @@ void ProtectNoBanConnections(std::vector<NodeEvictionCandidate>& eviction_candid
eviction_candidates.end()); eviction_candidates.end());
} }
void ProtectOutboundConnections(std::vector<NodeEvictionCandidate>& eviction_candidates)
{
eviction_candidates.erase(std::remove_if(eviction_candidates.begin(), eviction_candidates.end(),
[](NodeEvictionCandidate const& n) {
return n.m_conn_type != ConnectionType::INBOUND;
}),
eviction_candidates.end());
}
void ProtectEvictionCandidatesByRatio(std::vector<NodeEvictionCandidate>& eviction_candidates) void ProtectEvictionCandidatesByRatio(std::vector<NodeEvictionCandidate>& eviction_candidates)
{ {
// Protect the half of the remaining nodes which have been connected the longest. // Protect the half of the remaining nodes which have been connected the longest.
@ -1036,6 +1045,8 @@ void ProtectEvictionCandidatesByRatio(std::vector<NodeEvictionCandidate>& evicti
ProtectNoBanConnections(vEvictionCandidates); ProtectNoBanConnections(vEvictionCandidates);
ProtectOutboundConnections(vEvictionCandidates);
// Deterministically select 4 peers to protect by netgroup. // Deterministically select 4 peers to protect by netgroup.
// An attacker cannot predict which netgroups will be protected // An attacker cannot predict which netgroups will be protected
EraseLastKElements(vEvictionCandidates, CompareNetGroupKeyed, 4); EraseLastKElements(vEvictionCandidates, CompareNetGroupKeyed, 4);
@ -1107,8 +1118,6 @@ bool CConnman::AttemptToEvictConnection()
LOCK(m_nodes_mutex); LOCK(m_nodes_mutex);
for (const CNode* node : m_nodes) { for (const CNode* node : m_nodes) {
if (!node->IsInboundConn())
continue;
if (node->fDisconnect) if (node->fDisconnect)
continue; continue;
NodeEvictionCandidate candidate{ NodeEvictionCandidate candidate{
@ -1125,6 +1134,7 @@ bool CConnman::AttemptToEvictConnection()
Desig(m_is_local) node->addr.IsLocal(), Desig(m_is_local) node->addr.IsLocal(),
Desig(m_network) node->ConnectedThroughNetwork(), Desig(m_network) node->ConnectedThroughNetwork(),
Desig(m_noban) node->HasPermission(NetPermissionFlags::NoBan), Desig(m_noban) node->HasPermission(NetPermissionFlags::NoBan),
Desig(m_conn_type) node->m_conn_type,
}; };
vEvictionCandidates.push_back(candidate); vEvictionCandidates.push_back(candidate);
} }

View file

@ -1262,6 +1262,7 @@ struct NodeEvictionCandidate
bool m_is_local; bool m_is_local;
Network m_network; Network m_network;
bool m_noban; bool m_noban;
ConnectionType m_conn_type;
}; };
/** /**

View file

@ -33,6 +33,7 @@ FUZZ_TARGET(node_eviction)
/*m_is_local=*/fuzzed_data_provider.ConsumeBool(), /*m_is_local=*/fuzzed_data_provider.ConsumeBool(),
/*m_network=*/fuzzed_data_provider.PickValueInArray(ALL_NETWORKS), /*m_network=*/fuzzed_data_provider.PickValueInArray(ALL_NETWORKS),
/*m_noban=*/fuzzed_data_provider.ConsumeBool(), /*m_noban=*/fuzzed_data_provider.ConsumeBool(),
/*m_conn_type=*/fuzzed_data_provider.PickValueInArray(ALL_CONNECTION_TYPES),
}); });
} }
// Make a copy since eviction_candidates may be in some valid but otherwise // Make a copy since eviction_candidates may be in some valid but otherwise

View file

@ -59,6 +59,7 @@ std::vector<NodeEvictionCandidate> GetRandomNodeEvictionCandidates(int n_candida
/*m_is_local=*/random_context.randbool(), /*m_is_local=*/random_context.randbool(),
/*m_network=*/ALL_NETWORKS[random_context.randrange(ALL_NETWORKS.size())], /*m_network=*/ALL_NETWORKS[random_context.randrange(ALL_NETWORKS.size())],
/*m_noban=*/false, /*m_noban=*/false,
/*m_conn_type=*/ConnectionType::INBOUND,
}); });
} }
return candidates; return candidates;