mirror of
https://codeberg.org/anoncontributorxmr/monero.git
synced 2024-11-27 05:13:25 +01:00
p2p: don't connect to more than one IP per class B if we can
This commit is contained in:
parent
9d7107c870
commit
4ee095c200
@ -1226,19 +1226,53 @@ namespace nodetool
|
|||||||
size_t random_index;
|
size_t random_index;
|
||||||
const uint32_t next_needed_pruning_stripe = m_payload_handler.get_next_needed_pruning_stripe().second;
|
const uint32_t next_needed_pruning_stripe = m_payload_handler.get_next_needed_pruning_stripe().second;
|
||||||
|
|
||||||
|
// build a set of all the /16 we're connected to, and prefer a peer that's not in that set
|
||||||
|
std::set<uint32_t> classB;
|
||||||
|
if (&zone == &m_network_zones.at(epee::net_utils::zone::public_)) // at returns reference, not copy
|
||||||
|
{
|
||||||
|
zone.m_net_server.get_config_object().foreach_connection([&](const p2p_connection_context& cntxt)
|
||||||
|
{
|
||||||
|
if (cntxt.m_remote_address.get_type_id() == epee::net_utils::ipv4_network_address::get_type_id())
|
||||||
|
{
|
||||||
|
|
||||||
|
const epee::net_utils::network_address na = cntxt.m_remote_address;
|
||||||
|
const uint32_t actual_ip = na.as<const epee::net_utils::ipv4_network_address>().ip();
|
||||||
|
classB.insert(actual_ip & 0x0000ffff);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
std::deque<size_t> filtered;
|
std::deque<size_t> filtered;
|
||||||
const size_t limit = use_white_list ? 20 : std::numeric_limits<size_t>::max();
|
const size_t limit = use_white_list ? 20 : std::numeric_limits<size_t>::max();
|
||||||
size_t idx = 0;
|
size_t idx = 0, skipped = 0;
|
||||||
zone.m_peerlist.foreach (use_white_list, [&filtered, &idx, limit, next_needed_pruning_stripe](const peerlist_entry &pe){
|
for (int step = 0; step < 2; ++step)
|
||||||
if (filtered.size() >= limit)
|
{
|
||||||
return false;
|
bool skip_duplicate_class_B = step == 0;
|
||||||
if (next_needed_pruning_stripe == 0 || pe.pruning_seed == 0)
|
zone.m_peerlist.foreach (use_white_list, [&classB, &filtered, &idx, &skipped, skip_duplicate_class_B, limit, next_needed_pruning_stripe](const peerlist_entry &pe){
|
||||||
filtered.push_back(idx);
|
if (filtered.size() >= limit)
|
||||||
else if (next_needed_pruning_stripe == tools::get_pruning_stripe(pe.pruning_seed))
|
return false;
|
||||||
filtered.push_front(idx);
|
bool skip = false;
|
||||||
++idx;
|
if (skip_duplicate_class_B && pe.adr.get_type_id() == epee::net_utils::ipv4_network_address::get_type_id())
|
||||||
return true;
|
{
|
||||||
});
|
const epee::net_utils::network_address na = pe.adr;
|
||||||
|
uint32_t actual_ip = na.as<const epee::net_utils::ipv4_network_address>().ip();
|
||||||
|
skip = classB.find(actual_ip & 0x0000ffff) != classB.end();
|
||||||
|
}
|
||||||
|
if (skip)
|
||||||
|
++skipped;
|
||||||
|
else if (next_needed_pruning_stripe == 0 || pe.pruning_seed == 0)
|
||||||
|
filtered.push_back(idx);
|
||||||
|
else if (next_needed_pruning_stripe == tools::get_pruning_stripe(pe.pruning_seed))
|
||||||
|
filtered.push_front(idx);
|
||||||
|
++idx;
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
if (skipped == 0 || !filtered.empty())
|
||||||
|
break;
|
||||||
|
if (skipped)
|
||||||
|
MGINFO("Skipping " << skipped << " possible peers as they share a class B with existing peers");
|
||||||
|
}
|
||||||
if (filtered.empty())
|
if (filtered.empty())
|
||||||
{
|
{
|
||||||
MDEBUG("No available peer in " << (use_white_list ? "white" : "gray") << " list filtered by " << next_needed_pruning_stripe);
|
MDEBUG("No available peer in " << (use_white_list ? "white" : "gray") << " list filtered by " << next_needed_pruning_stripe);
|
||||||
|
Loading…
Reference in New Issue
Block a user