mirror of
				https://git.wownero.com/wownero/wownero.git
				synced 2024-08-15 01:03:23 +00:00 
			
		
		
		
	Merge pull request #5738
4ee095c p2p: don't connect to more than one IP per class B if we can (moneromooo-monero)
			
			
This commit is contained in:
		
						commit
						309f2def9e
					
				
					 1 changed files with 45 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -1226,19 +1226,53 @@ namespace nodetool
 | 
			
		|||
      size_t random_index;
 | 
			
		||||
      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;
 | 
			
		||||
      const size_t limit = use_white_list ? 20 : std::numeric_limits<size_t>::max();
 | 
			
		||||
      size_t idx = 0;
 | 
			
		||||
      zone.m_peerlist.foreach (use_white_list, [&filtered, &idx, limit, next_needed_pruning_stripe](const peerlist_entry &pe){
 | 
			
		||||
        if (filtered.size() >= limit)
 | 
			
		||||
          return false;
 | 
			
		||||
        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;
 | 
			
		||||
      });
 | 
			
		||||
      size_t idx = 0, skipped = 0;
 | 
			
		||||
      for (int step = 0; step < 2; ++step)
 | 
			
		||||
      {
 | 
			
		||||
        bool skip_duplicate_class_B = step == 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){
 | 
			
		||||
          if (filtered.size() >= limit)
 | 
			
		||||
            return false;
 | 
			
		||||
          bool skip = false;
 | 
			
		||||
          if (skip_duplicate_class_B && pe.adr.get_type_id() == epee::net_utils::ipv4_network_address::get_type_id())
 | 
			
		||||
          {
 | 
			
		||||
            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())
 | 
			
		||||
      {
 | 
			
		||||
        MDEBUG("No available peer in " << (use_white_list ? "white" : "gray") << " list filtered by " << next_needed_pruning_stripe);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue