39 #include <boost/multi_index_container.hpp> 40 #include <boost/multi_index/ordered_index.hpp> 41 #include <boost/multi_index/identity.hpp> 42 #include <boost/multi_index/member.hpp> 43 #include <boost/optional/optional.hpp> 44 #include <boost/range/adaptor/reversed.hpp> 57 std::vector<peerlist_entry>
white;
58 std::vector<peerlist_entry>
gray;
59 std::vector<anchor_peerlist_entry>
anchor;
70 static boost::optional<peerlist_storage>
open(std::istream& src,
const bool new_format);
105 bool merge_peerlist(
const std::vector<peerlist_entry>& outer_bs,
const std::function<
bool(
const peerlist_entry&)> &f = NULL);
107 void get_peerlist(std::vector<peerlist_entry>& pl_gray, std::vector<peerlist_entry>& pl_white);
111 template<
typename F>
bool foreach(
bool white,
const F &f);
112 void evict_host_from_peerlist(
bool white,
const peerlist_entry& pr);
113 bool append_with_peer_white(
const peerlist_entry& pr,
bool trust_last_seen =
false);
120 bool get_and_empty_anchor_peerlist(std::vector<anchor_peerlist_entry>& apl);
123 template<
typename F>
size_t filter(
bool white,
const F &f);
157 e.last_seen = m_last_seen;
164 typedef boost::multi_index_container<
166 boost::multi_index::indexed_by<
168 boost::multi_index::ordered_unique<boost::multi_index::tag<by_addr>, boost::multi_index::member<peerlist_entry,epee::net_utils::network_address,&peerlist_entry::adr> >,
170 boost::multi_index::ordered_non_unique<boost::multi_index::tag<by_time>, boost::multi_index::member<peerlist_entry,int64_t,&peerlist_entry::last_seen> >
174 typedef boost::multi_index_container<
176 boost::multi_index::indexed_by<
178 boost::multi_index::ordered_unique<boost::multi_index::tag<by_addr>, boost::multi_index::member<anchor_peerlist_entry,epee::net_utils::network_address,&anchor_peerlist_entry::adr> >,
180 boost::multi_index::ordered_non_unique<boost::multi_index::tag<by_time>, boost::multi_index::member<anchor_peerlist_entry,int64_t,&anchor_peerlist_entry::first_seen> >
185 void trim_white_peerlist();
186 void trim_gray_peerlist();
189 friend class boost::serialization::access;
205 sorted_index.erase(sorted_index.begin());
214 sorted_index.erase(sorted_index.begin());
223 auto by_time_it = --by_time_index.end();
224 std::advance(by_time_it, -static_cast<long long>(n));
235 append_with_peer_gray(be);
238 trim_gray_peerlist();
246 if(
i >= m_peers_white.size())
257 if(
i >= m_peers_gray.size())
271 if(!m_allow_local_ip &&
address.is_local())
296 const uint32_t pick_depth = anonymize ? m_peers_white.size() :
depth;
297 bs_head.reserve(pick_depth);
298 for(
const peers_indexed::value_type& vl: boost::adaptors::reverse(by_time_index))
300 if(cnt++ >= pick_depth)
303 bs_head.push_back(vl);
309 if (bs_head.size() >
depth)
310 bs_head.resize(
depth);
311 for (
auto &
e: bs_head)
318 template<
typename F>
inline 323 for(
const peers_indexed::value_type& vl: boost::adaptors::reverse(by_time_index))
342 return append_with_peer_white(ple,
true);
343 CATCH_ENTRY_L0(
"peerlist_manager::set_peer_just_seen()",
false);
350 if(!is_host_allowed(ple.
adr))
355 auto by_addr_it_wt = m_peers_white.get<
by_addr>().find(ple.
adr);
356 if(by_addr_it_wt == m_peers_white.get<
by_addr>().end())
359 evict_host_from_peerlist(
true, ple);
360 m_peers_white.insert(ple);
361 trim_white_peerlist();
366 if (by_addr_it_wt->pruning_seed && ple.
pruning_seed == 0)
368 if (by_addr_it_wt->rpc_port && ple.
rpc_port == 0)
369 new_ple.
rpc_port = by_addr_it_wt->rpc_port;
370 if (!trust_last_seen)
371 new_ple.
last_seen = by_addr_it_wt->last_seen;
372 m_peers_white.replace(by_addr_it_wt, new_ple);
375 auto by_addr_it_gr = m_peers_gray.get<
by_addr>().find(ple.
adr);
376 if(by_addr_it_gr != m_peers_gray.get<
by_addr>().end())
378 m_peers_gray.erase(by_addr_it_gr);
381 CATCH_ENTRY_L0(
"peerlist_manager::append_with_peer_white()",
false);
388 if(!is_host_allowed(ple.
adr))
393 auto by_addr_it_wt = m_peers_white.get<
by_addr>().find(ple.
adr);
394 if(by_addr_it_wt != m_peers_white.get<
by_addr>().end())
398 auto by_addr_it_gr = m_peers_gray.get<
by_addr>().find(ple.
adr);
399 if(by_addr_it_gr == m_peers_gray.get<
by_addr>().end())
402 m_peers_gray.insert(ple);
403 trim_gray_peerlist();
408 if (by_addr_it_gr->pruning_seed && ple.
pruning_seed == 0)
410 if (by_addr_it_gr->rpc_port && ple.
rpc_port == 0)
411 new_ple.
rpc_port = by_addr_it_gr->rpc_port;
412 new_ple.
last_seen = by_addr_it_gr->last_seen;
413 m_peers_gray.replace(by_addr_it_gr, new_ple);
416 CATCH_ENTRY_L0(
"peerlist_manager::append_with_peer_gray()",
false);
426 auto by_addr_it_anchor = m_peers_anchor.get<
by_addr>().find(ple.
adr);
428 if(by_addr_it_anchor == m_peers_anchor.get<
by_addr>().end()) {
429 m_peers_anchor.insert(ple);
434 CATCH_ENTRY_L0(
"peerlist_manager::append_with_peer_anchor()",
false);
444 if (m_peers_gray.empty()) {
453 CATCH_ENTRY_L0(
"peerlist_manager::get_random_gray_peer()",
false);
465 if (iterator != m_peers_white.get<
by_addr>().end()) {
466 m_peers_white.erase(iterator);
471 CATCH_ENTRY_L0(
"peerlist_manager::remove_from_peer_white()",
false);
483 if (iterator != m_peers_gray.get<
by_addr>().end()) {
484 m_peers_gray.erase(iterator);
489 CATCH_ENTRY_L0(
"peerlist_manager::remove_from_peer_gray()",
false);
499 auto begin = m_peers_anchor.get<
by_time>().begin();
500 auto end = m_peers_anchor.get<
by_time>().end();
506 m_peers_anchor.get<
by_time>().clear();
510 CATCH_ENTRY_L0(
"peerlist_manager::get_and_empty_anchor_peerlist()",
false);
522 if (iterator != m_peers_anchor.get<
by_addr>().end()) {
523 m_peers_anchor.erase(iterator);
528 CATCH_ENTRY_L0(
"peerlist_manager::remove_from_peer_anchor()",
false);
537 auto i = sorted_index.begin();
538 while (
i != sorted_index.end())
542 i = sorted_index.erase(
i);
548 CATCH_ENTRY_L0(
"peerlist_manager::filter()", filtered);
int64_t last_seen
Definition: p2p_protocol_defs.h:76
static int init(int argc, char **argv, struct runtime_vars *v)
Definition: miniupnpd.c:1149
uint16_t rpc_port
Definition: p2p_protocol_defs.h:78
int i
Definition: pymoduletest.py:23
AddressType adr
Definition: p2p_protocol_defs.h:74
::std::string string
Definition: gtest-port.h:1097
Definition: net_utils_base.h:224
CXA_THROW_INFO_T void(* dest)(void *))
Definition: stack_trace.cpp:91
#define F(w, k)
Definition: sha512-blocks.c:61
AddressType adr
Definition: p2p_protocol_defs.h:104
int type
Definition: superscalar.cpp:50
uint32_t pruning_seed
Definition: p2p_protocol_defs.h:77
unsigned short uint16_t
Definition: stdint.h:125
std::enable_if< std::is_unsigned< T >::value, T >::type rand_idx(T sz)
Definition: crypto.h:204
e
Definition: pymoduletest.py:79
#define P2P_DEFAULT_PEERS_IN_HANDSHAKE
Definition: cryptonote_config.h:142
peerid_type id
Definition: p2p_protocol_defs.h:75
default
Definition: pymoduletest.py:17
unsigned int uint32_t
Definition: stdint.h:126
Definition: p2p_protocol_defs.h:102
#define CRITICAL_REGION_LOCAL(x)
Definition: syncobj.h:153
#define P2P_LOCAL_GRAY_PEERLIST_LIMIT
Definition: cryptonote_config.h:137
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition: pointer.h:1124
TODO: (mj-xmr) This will be reduced in an another PR.
Definition: byte_slice.h:39
uint32_t address
Definition: getifaddr.c:269
time
Definition: gen_wide_data.py:40
uint32_t rpc_credits_per_hash
Definition: p2p_protocol_defs.h:79
p
Definition: pymoduletest.py:75
zone
Definition: enums.h:49
static __thread int depth
Definition: threadpool.cpp:34
#define const
Definition: ipfrdr.c:80
#define P2P_LOCAL_WHITE_PEERLIST_LIMIT
Definition: cryptonote_config.h:136
Definition: p2p_protocol_defs.h:72