Monero
net_peerlist.h
Go to the documentation of this file.
1 // Copyright (c) 2014-2020, The Monero Project
2 //
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without modification, are
6 // permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice, this list of
9 // conditions and the following disclaimer.
10 //
11 // 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 // of conditions and the following disclaimer in the documentation and/or other
13 // materials provided with the distribution.
14 //
15 // 3. Neither the name of the copyright holder nor the names of its contributors may be
16 // used to endorse or promote products derived from this software without specific
17 // prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
27 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 //
29 // Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
30 
31 #pragma once
32 
33 #include <iosfwd>
34 #include <list>
35 #include <string>
36 #include <vector>
37 
38 #include <boost/multi_index_container.hpp>
39 #include <boost/multi_index/ordered_index.hpp>
40 #include <boost/multi_index/identity.hpp>
41 #include <boost/multi_index/member.hpp>
42 #include <boost/optional/optional.hpp>
43 #include <boost/range/adaptor/reversed.hpp>
44 
45 
46 #include "crypto/crypto.h"
47 #include "cryptonote_config.h"
48 #include "net/enums.h"
49 #include "net/local_ip.h"
50 #include "p2p_protocol_defs.h"
51 #include "syncobj.h"
52 
53 namespace nodetool
54 {
56  {
57  std::vector<peerlist_entry> white;
58  std::vector<peerlist_entry> gray;
59  std::vector<anchor_peerlist_entry> anchor;
60  };
61 
63  {
64  public:
66  : m_types{}
67  {}
68 
70  static boost::optional<peerlist_storage> open(std::istream& src, const bool new_format);
71 
73  static boost::optional<peerlist_storage> open(const std::string& path);
74 
77 
78  ~peerlist_storage() noexcept;
79 
81  peerlist_storage& operator=(const peerlist_storage&) = delete;
82 
84  bool store(std::ostream& dest, const peerlist_types& other) const;
85 
87  bool store(const std::string& path, const peerlist_types& other) const;
88 
90  peerlist_types take_zone(epee::net_utils::zone zone);
91 
92  private:
94  };
95 
96  /************************************************************************/
97  /* */
98  /************************************************************************/
100  {
101  public:
102  bool init(peerlist_types&& peers, bool allow_local_ip);
103  size_t get_white_peers_count(){CRITICAL_REGION_LOCAL(m_peerlist_lock); return m_peers_white.size();}
104  size_t get_gray_peers_count(){CRITICAL_REGION_LOCAL(m_peerlist_lock); return m_peers_gray.size();}
105  bool merge_peerlist(const std::vector<peerlist_entry>& outer_bs, const std::function<bool(const peerlist_entry&)> &f = NULL);
106  bool get_peerlist_head(std::vector<peerlist_entry>& bs_head, bool anonymize, uint32_t depth = P2P_DEFAULT_PEERS_IN_HANDSHAKE);
107  void get_peerlist(std::vector<peerlist_entry>& pl_gray, std::vector<peerlist_entry>& pl_white);
108  void get_peerlist(peerlist_types& peers);
109  bool get_white_peer_by_index(peerlist_entry& p, size_t i);
110  bool get_gray_peer_by_index(peerlist_entry& p, size_t i);
111  template<typename F> bool foreach(bool white, const F &f);
112  bool append_with_peer_white(const peerlist_entry& pr);
113  bool append_with_peer_gray(const peerlist_entry& pr);
114  bool append_with_peer_anchor(const anchor_peerlist_entry& ple);
115  bool set_peer_just_seen(peerid_type peer, const epee::net_utils::network_address& addr, uint32_t pruning_seed, uint16_t rpc_port, uint32_t rpc_credits_per_hash);
116  bool is_host_allowed(const epee::net_utils::network_address &address);
117  bool get_random_gray_peer(peerlist_entry& pe);
118  bool remove_from_peer_gray(const peerlist_entry& pe);
119  bool get_and_empty_anchor_peerlist(std::vector<anchor_peerlist_entry>& apl);
120  bool remove_from_peer_anchor(const epee::net_utils::network_address& addr);
121  bool remove_from_peer_white(const peerlist_entry& pe);
122 
123  private:
124  struct by_time{};
125  struct by_id{};
126  struct by_addr{};
127 
129  {
130  modify_all_but_id(const peerlist_entry& ple):m_ple(ple){}
132  {
133  e.id = m_ple.id;
134  }
135  private:
137  };
138 
139  struct modify_all
140  {
141  modify_all(const peerlist_entry& ple):m_ple(ple){}
143  {
144  e = m_ple;
145  }
146  private:
148  };
149 
151  {
152  modify_last_seen(time_t last_seen):m_last_seen(last_seen){}
154  {
155  e.last_seen = m_last_seen;
156  }
157  private:
158  time_t m_last_seen;
159  };
160 
161 
162  typedef boost::multi_index_container<
164  boost::multi_index::indexed_by<
165  // access by peerlist_entry::net_adress
166  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> >,
167  // sort by peerlist_entry::last_seen<
168  boost::multi_index::ordered_non_unique<boost::multi_index::tag<by_time>, boost::multi_index::member<peerlist_entry,int64_t,&peerlist_entry::last_seen> >
169  >
171 
172  typedef boost::multi_index_container<
174  boost::multi_index::indexed_by<
175  // access by anchor_peerlist_entry::net_adress
176  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> >,
177  // sort by anchor_peerlist_entry::first_seen
178  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> >
179  >
181 
182  private:
183  void trim_white_peerlist();
184  void trim_gray_peerlist();
185 
186  friend class boost::serialization::access;
187  epee::critical_section m_peerlist_lock;
188  std::string m_config_folder;
190 
191 
195  };
196  //--------------------------------------------------------------------------------------------------
198  {
199  while(m_peers_gray.size() > P2P_LOCAL_GRAY_PEERLIST_LIMIT)
200  {
201  peers_indexed::index<by_time>::type& sorted_index=m_peers_gray.get<by_time>();
202  sorted_index.erase(sorted_index.begin());
203  }
204  }
205  //--------------------------------------------------------------------------------------------------
207  {
208  while(m_peers_white.size() > P2P_LOCAL_WHITE_PEERLIST_LIMIT)
209  {
210  peers_indexed::index<by_time>::type& sorted_index=m_peers_white.get<by_time>();
211  sorted_index.erase(sorted_index.begin());
212  }
213  }
214  //--------------------------------------------------------------------------------------------------
215  inline
216  bool peerlist_manager::merge_peerlist(const std::vector<peerlist_entry>& outer_bs, const std::function<bool(const peerlist_entry&)> &f)
217  {
218  CRITICAL_REGION_LOCAL(m_peerlist_lock);
219  for(const peerlist_entry& be: outer_bs)
220  {
221  if (!f || f(be))
222  append_with_peer_gray(be);
223  }
224  // delete extra elements
225  trim_gray_peerlist();
226  return true;
227  }
228  //--------------------------------------------------------------------------------------------------
229  inline
231  {
232  CRITICAL_REGION_LOCAL(m_peerlist_lock);
233  if(i >= m_peers_white.size())
234  return false;
235 
236  peers_indexed::index<by_time>::type& by_time_index = m_peers_white.get<by_time>();
237  p = *epee::misc_utils::move_it_backward(--by_time_index.end(), i);
238  return true;
239  }
240  //--------------------------------------------------------------------------------------------------
241  inline
243  {
244  CRITICAL_REGION_LOCAL(m_peerlist_lock);
245  if(i >= m_peers_gray.size())
246  return false;
247 
248  peers_indexed::index<by_time>::type& by_time_index = m_peers_gray.get<by_time>();
249  p = *epee::misc_utils::move_it_backward(--by_time_index.end(), i);
250  return true;
251  }
252  //--------------------------------------------------------------------------------------------------
253  inline
254  bool peerlist_manager::is_host_allowed(const epee::net_utils::network_address &address)
255  {
256  //never allow loopback ip
257  if(address.is_loopback())
258  return false;
259 
260  if(!m_allow_local_ip && address.is_local())
261  return false;
262 
263  return true;
264  }
265  //--------------------------------------------------------------------------------------------------
266  inline
267  bool peerlist_manager::get_peerlist_head(std::vector<peerlist_entry>& bs_head, bool anonymize, uint32_t depth)
268  {
269  CRITICAL_REGION_LOCAL(m_peerlist_lock);
270  peers_indexed::index<by_time>::type& by_time_index=m_peers_white.get<by_time>();
271  uint32_t cnt = 0;
272 
273  // picks a random set of peers within the whole set, rather pick the first depth elements.
274  // The intent is that if someone asks twice, they can't easily tell:
275  // - this address was not in the first list, but is in the second, so the only way this can be
276  // is if its last_seen was recently reset, so this means the target node recently had a new
277  // connection to that address
278  // - this address was in the first list, and not in the second, which means either the address
279  // was moved to the gray list (if it's not accessible, which the attacker can check if
280  // the address accepts incoming connections) or it was the oldest to still fit in the 250 items,
281  // so its last_seen is old.
282  //
283  // See Cao, Tong et al. "Exploring the Monero Peer-to-Peer Network". https://eprint.iacr.org/2019/411
284  //
285  const uint32_t pick_depth = anonymize ? m_peers_white.size() : depth;
286  bs_head.reserve(pick_depth);
287  for(const peers_indexed::value_type& vl: boost::adaptors::reverse(by_time_index))
288  {
289  if(cnt++ >= pick_depth)
290  break;
291 
292  bs_head.push_back(vl);
293  }
294 
295  if (anonymize)
296  {
297  std::shuffle(bs_head.begin(), bs_head.end(), crypto::random_device{});
298  if (bs_head.size() > depth)
299  bs_head.resize(depth);
300  for (auto &e: bs_head)
301  e.last_seen = 0;
302  }
303 
304  return true;
305  }
306  //--------------------------------------------------------------------------------------------------
307  template<typename F> inline
308  bool peerlist_manager::foreach(bool white, const F &f)
309  {
310  CRITICAL_REGION_LOCAL(m_peerlist_lock);
311  peers_indexed::index<by_time>::type& by_time_index = white ? m_peers_white.get<by_time>() : m_peers_gray.get<by_time>();
312  for(const peers_indexed::value_type& vl: boost::adaptors::reverse(by_time_index))
313  if (!f(vl))
314  return false;
315  return true;
316  }
317  //--------------------------------------------------------------------------------------------------
318  inline
319  bool peerlist_manager::set_peer_just_seen(peerid_type peer, const epee::net_utils::network_address& addr, uint32_t pruning_seed, uint16_t rpc_port, uint32_t rpc_credits_per_hash)
320  {
321  TRY_ENTRY();
322  CRITICAL_REGION_LOCAL(m_peerlist_lock);
323  //find in white list
324  peerlist_entry ple;
325  ple.adr = addr;
326  ple.id = peer;
327  ple.last_seen = time(NULL);
328  ple.pruning_seed = pruning_seed;
329  ple.rpc_port = rpc_port;
330  ple.rpc_credits_per_hash = rpc_credits_per_hash;
331  return append_with_peer_white(ple);
332  CATCH_ENTRY_L0("peerlist_manager::set_peer_just_seen()", false);
333  }
334  //--------------------------------------------------------------------------------------------------
335  inline
337  {
338  TRY_ENTRY();
339  if(!is_host_allowed(ple.adr))
340  return true;
341 
342  CRITICAL_REGION_LOCAL(m_peerlist_lock);
343  //find in white list
344  auto by_addr_it_wt = m_peers_white.get<by_addr>().find(ple.adr);
345  if(by_addr_it_wt == m_peers_white.get<by_addr>().end())
346  {
347  //put new record into white list
348  m_peers_white.insert(ple);
349  trim_white_peerlist();
350  }else
351  {
352  //update record in white list
353  peerlist_entry new_ple = ple;
354  if (by_addr_it_wt->pruning_seed && ple.pruning_seed == 0) // guard against older nodes not passing pruning info around
355  new_ple.pruning_seed = by_addr_it_wt->pruning_seed;
356  if (by_addr_it_wt->rpc_port && ple.rpc_port == 0) // guard against older nodes not passing RPC port around
357  new_ple.rpc_port = by_addr_it_wt->rpc_port;
358  new_ple.last_seen = by_addr_it_wt->last_seen; // do not overwrite the last seen timestamp, incoming peer list are untrusted
359  m_peers_white.replace(by_addr_it_wt, new_ple);
360  }
361  //remove from gray list, if need
362  auto by_addr_it_gr = m_peers_gray.get<by_addr>().find(ple.adr);
363  if(by_addr_it_gr != m_peers_gray.get<by_addr>().end())
364  {
365  m_peers_gray.erase(by_addr_it_gr);
366  }
367  return true;
368  CATCH_ENTRY_L0("peerlist_manager::append_with_peer_white()", false);
369  }
370  //--------------------------------------------------------------------------------------------------
371  inline
373  {
374  TRY_ENTRY();
375  if(!is_host_allowed(ple.adr))
376  return true;
377 
378  CRITICAL_REGION_LOCAL(m_peerlist_lock);
379  //find in white list
380  auto by_addr_it_wt = m_peers_white.get<by_addr>().find(ple.adr);
381  if(by_addr_it_wt != m_peers_white.get<by_addr>().end())
382  return true;
383 
384  //update gray list
385  auto by_addr_it_gr = m_peers_gray.get<by_addr>().find(ple.adr);
386  if(by_addr_it_gr == m_peers_gray.get<by_addr>().end())
387  {
388  //put new record into white list
389  m_peers_gray.insert(ple);
390  trim_gray_peerlist();
391  }else
392  {
393  //update record in gray list
394  peerlist_entry new_ple = ple;
395  if (by_addr_it_gr->pruning_seed && ple.pruning_seed == 0) // guard against older nodes not passing pruning info around
396  new_ple.pruning_seed = by_addr_it_gr->pruning_seed;
397  if (by_addr_it_gr->rpc_port && ple.rpc_port == 0) // guard against older nodes not passing RPC port around
398  new_ple.rpc_port = by_addr_it_gr->rpc_port;
399  new_ple.last_seen = by_addr_it_gr->last_seen; // do not overwrite the last seen timestamp, incoming peer list are untrusted
400  m_peers_gray.replace(by_addr_it_gr, new_ple);
401  }
402  return true;
403  CATCH_ENTRY_L0("peerlist_manager::append_with_peer_gray()", false);
404  }
405  //--------------------------------------------------------------------------------------------------
406  inline
408  {
409  TRY_ENTRY();
410 
411  CRITICAL_REGION_LOCAL(m_peerlist_lock);
412 
413  auto by_addr_it_anchor = m_peers_anchor.get<by_addr>().find(ple.adr);
414 
415  if(by_addr_it_anchor == m_peers_anchor.get<by_addr>().end()) {
416  m_peers_anchor.insert(ple);
417  }
418 
419  return true;
420 
421  CATCH_ENTRY_L0("peerlist_manager::append_with_peer_anchor()", false);
422  }
423  //--------------------------------------------------------------------------------------------------
424  inline
426  {
427  TRY_ENTRY();
428 
429  CRITICAL_REGION_LOCAL(m_peerlist_lock);
430 
431  if (m_peers_gray.empty()) {
432  return false;
433  }
434 
435  size_t random_index = crypto::rand_idx(m_peers_gray.size());
436 
437  peers_indexed::index<by_time>::type& by_time_index = m_peers_gray.get<by_time>();
438  pe = *epee::misc_utils::move_it_backward(--by_time_index.end(), random_index);
439 
440  return true;
441 
442  CATCH_ENTRY_L0("peerlist_manager::get_random_gray_peer()", false);
443  }
444  //--------------------------------------------------------------------------------------------------
445  inline
447  {
448  TRY_ENTRY();
449 
450  CRITICAL_REGION_LOCAL(m_peerlist_lock);
451 
452  peers_indexed::index_iterator<by_addr>::type iterator = m_peers_white.get<by_addr>().find(pe.adr);
453 
454  if (iterator != m_peers_white.get<by_addr>().end()) {
455  m_peers_white.erase(iterator);
456  }
457 
458  return true;
459 
460  CATCH_ENTRY_L0("peerlist_manager::remove_from_peer_white()", false);
461  }
462  //--------------------------------------------------------------------------------------------------
463  inline
465  {
466  TRY_ENTRY();
467 
468  CRITICAL_REGION_LOCAL(m_peerlist_lock);
469 
470  peers_indexed::index_iterator<by_addr>::type iterator = m_peers_gray.get<by_addr>().find(pe.adr);
471 
472  if (iterator != m_peers_gray.get<by_addr>().end()) {
473  m_peers_gray.erase(iterator);
474  }
475 
476  return true;
477 
478  CATCH_ENTRY_L0("peerlist_manager::remove_from_peer_gray()", false);
479  }
480  //--------------------------------------------------------------------------------------------------
481  inline
482  bool peerlist_manager::get_and_empty_anchor_peerlist(std::vector<anchor_peerlist_entry>& apl)
483  {
484  TRY_ENTRY();
485 
486  CRITICAL_REGION_LOCAL(m_peerlist_lock);
487 
488  auto begin = m_peers_anchor.get<by_time>().begin();
489  auto end = m_peers_anchor.get<by_time>().end();
490 
491  std::for_each(begin, end, [&apl](const anchor_peerlist_entry &a) {
492  apl.push_back(a);
493  });
494 
495  m_peers_anchor.get<by_time>().clear();
496 
497  return true;
498 
499  CATCH_ENTRY_L0("peerlist_manager::get_and_empty_anchor_peerlist()", false);
500  }
501  //--------------------------------------------------------------------------------------------------
502  inline
503  bool peerlist_manager::remove_from_peer_anchor(const epee::net_utils::network_address& addr)
504  {
505  TRY_ENTRY();
506 
507  CRITICAL_REGION_LOCAL(m_peerlist_lock);
508 
509  anchor_peers_indexed::index_iterator<by_addr>::type iterator = m_peers_anchor.get<by_addr>().find(addr);
510 
511  if (iterator != m_peers_anchor.get<by_addr>().end()) {
512  m_peers_anchor.erase(iterator);
513  }
514 
515  return true;
516 
517  CATCH_ENTRY_L0("peerlist_manager::remove_from_peer_anchor()", false);
518  }
519  //--------------------------------------------------------------------------------------------------
520 }
521 
nodetool::peerlist_storage::m_types
peerlist_types m_types
Definition: net_peerlist.h:93
nodetool::peerlist_storage::store
bool store(std::ostream &dest, const peerlist_types &other) const
Save peers from this and other in stream dest.
Definition: net_peerlist.cpp:225
nodetool::anchor_peerlist_entry_base
Definition: p2p_protocol_defs.h:102
nodetool::peerlist_manager::modify_last_seen::operator()
void operator()(peerlist_entry &e)
Definition: net_peerlist.h:153
nodetool::peerlist_manager::get_random_gray_peer
bool get_random_gray_peer(peerlist_entry &pe)
Definition: net_peerlist.h:425
nodetool::peerlist_manager::get_gray_peer_by_index
bool get_gray_peer_by_index(peerlist_entry &p, size_t i)
Definition: net_peerlist.h:242
nodetool::peerlist_storage::open
static boost::optional< peerlist_storage > open(std::istream &src, const bool new_format)
Definition: net_peerlist.cpp:161
nodetool::peerlist_manager::append_with_peer_white
bool append_with_peer_white(const peerlist_entry &pr)
Definition: net_peerlist.h:336
nodetool::peerlist_storage::peerlist_storage
peerlist_storage(const peerlist_storage &)=delete
nodetool::peerlist_manager::modify_last_seen::modify_last_seen
modify_last_seen(time_t last_seen)
Definition: net_peerlist.h:152
F
#define F(w, k)
Definition: sha512-blocks.c:61
nodetool::peerlist_manager::m_peers_anchor
anchor_peers_indexed m_peers_anchor
Definition: net_peerlist.h:194
P2P_DEFAULT_PEERS_IN_HANDSHAKE
#define P2P_DEFAULT_PEERS_IN_HANDSHAKE
Definition: cryptonote_config.h:134
nodetool::peerlist_types::gray
std::vector< peerlist_entry > gray
Definition: net_peerlist.h:58
nodetool::peerlist_entry_base::adr
AddressType adr
Definition: p2p_protocol_defs.h:73
nodetool::peerlist_manager::modify_all::m_ple
const peerlist_entry & m_ple
Definition: net_peerlist.h:147
nodetool::peerlist_storage::peerlist_storage
peerlist_storage(peerlist_storage &&)=default
nodetool::peerlist_storage
Definition: net_peerlist.h:63
nodetool::peerlist_manager::m_peers_gray
peers_indexed m_peers_gray
Definition: net_peerlist.h:192
nodetool::peerlist_types::white
std::vector< peerlist_entry > white
Definition: net_peerlist.h:57
nodetool::peerlist_manager::remove_from_peer_gray
bool remove_from_peer_gray(const peerlist_entry &pe)
Definition: net_peerlist.h:464
nodetool::peerlist_manager::is_host_allowed
bool is_host_allowed(const epee::net_utils::network_address &address)
Definition: net_peerlist.h:254
crypto::rand_idx
std::enable_if< std::is_unsigned< T >::value, T >::type rand_idx(T sz)
Definition: crypto.h:191
cryptonote_config.h
nodetool::peerlist_storage::~peerlist_storage
~peerlist_storage() noexcept
Definition: net_peerlist.cpp:222
init
static void init(std::string cache_filename)
Definition: blockchain_blackball.cpp:221
build_protob.const
const
Definition: build_protob.py:9
dest
CXA_THROW_INFO_T void(* dest)(void *))
Definition: stack_trace.cpp:90
nodetool::peerlist_entry_base::pruning_seed
uint32_t pruning_seed
Definition: p2p_protocol_defs.h:76
nodetool::peerlist_manager::modify_all_but_id::operator()
void operator()(peerlist_entry &e)
Definition: net_peerlist.h:131
nodetool::peerlist_manager::m_peers_white
peers_indexed m_peers_white
Definition: net_peerlist.h:193
nodetool::peerlist_manager::by_id
Definition: net_peerlist.h:125
build_protob.default
default
Definition: build_protob.py:9
nodetool::peerlist_types::anchor
std::vector< anchor_peerlist_entry > anchor
Definition: net_peerlist.h:59
nodetool::peerlist_manager::foreach
bool foreach(bool white, const F &f)
Definition: net_peerlist.h:308
crypto::random_device
Definition: crypto.h:172
nodetool::peerlist_manager::get_white_peers_count
size_t get_white_peers_count()
Definition: net_peerlist.h:103
nodetool::peerlist_manager::remove_from_peer_anchor
bool remove_from_peer_anchor(const epee::net_utils::network_address &addr)
Definition: net_peerlist.h:503
nodetool::peerlist_manager::modify_all::operator()
void operator()(peerlist_entry &e)
Definition: net_peerlist.h:142
nodetool::peerlist_entry_base::id
peerid_type id
Definition: p2p_protocol_defs.h:74
nodetool::peerlist_manager::by_time
Definition: net_peerlist.h:124
nodetool::peerlist_entry
peerlist_entry_base< epee::net_utils::network_address > peerlist_entry
Definition: p2p_protocol_defs.h:98
nodetool::peerlist_manager::set_peer_just_seen
bool set_peer_just_seen(peerid_type peer, const epee::net_utils::network_address &addr, uint32_t pruning_seed, uint16_t rpc_port, uint32_t rpc_credits_per_hash)
Definition: net_peerlist.h:319
nodetool::peerlist_manager::modify_all_but_id
Definition: net_peerlist.h:129
nodetool::peerlist_manager::get_gray_peers_count
size_t get_gray_peers_count()
Definition: net_peerlist.h:104
nodetool::peerlist_manager::get_peerlist_head
bool get_peerlist_head(std::vector< peerlist_entry > &bs_head, bool anonymize, uint32_t depth=P2P_DEFAULT_PEERS_IN_HANDSHAKE)
Definition: net_peerlist.h:267
nodetool::peerlist_manager::modify_all::modify_all
modify_all(const peerlist_entry &ple)
Definition: net_peerlist.h:141
nodetool::peerlist_manager::modify_all_but_id::modify_all_but_id
modify_all_but_id(const peerlist_entry &ple)
Definition: net_peerlist.h:130
nodetool::peerlist_manager::trim_white_peerlist
void trim_white_peerlist()
Definition: net_peerlist.h:206
nodetool::peerlist_types
Definition: net_peerlist.h:56
nodetool::peerlist_manager::remove_from_peer_white
bool remove_from_peer_white(const peerlist_entry &pe)
Definition: net_peerlist.h:446
nodetool::peerlist_manager::by_addr
Definition: net_peerlist.h:126
nodetool::peerlist_storage::take_zone
peerlist_types take_zone(epee::net_utils::zone zone)
Definition: net_peerlist.cpp:250
nodetool::peerid_type
uint64_t peerid_type
Definition: p2p_protocol_defs.h:48
nodetool::peerlist_manager::modify_all_but_id::m_ple
const peerlist_entry & m_ple
Definition: net_peerlist.h:136
nodetool::peerlist_manager::modify_last_seen
Definition: net_peerlist.h:151
nodetool::peerlist_manager::m_peerlist_lock
epee::critical_section m_peerlist_lock
Definition: net_peerlist.h:187
nodetool::peerlist_entry_base::last_seen
int64_t last_seen
Definition: p2p_protocol_defs.h:75
nodetool::peerlist_entry_base::rpc_port
uint16_t rpc_port
Definition: p2p_protocol_defs.h:77
std
Definition: blockchain_ancestry.cpp:72
P2P_LOCAL_WHITE_PEERLIST_LIMIT
#define P2P_LOCAL_WHITE_PEERLIST_LIMIT
Definition: cryptonote_config.h:128
nodetool::peerlist_manager::append_with_peer_anchor
bool append_with_peer_anchor(const anchor_peerlist_entry &ple)
Definition: net_peerlist.h:407
MakeCryptoOps.a
string a
Definition: MakeCryptoOps.py:15
nodetool::peerlist_manager::peers_indexed
boost::multi_index_container< peerlist_entry, boost::multi_index::indexed_by< 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 > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< by_time >, boost::multi_index::member< peerlist_entry, int64_t,&peerlist_entry::last_seen > > > > peers_indexed
Definition: net_peerlist.h:170
nodetool::peerlist_manager::m_allow_local_ip
bool m_allow_local_ip
Definition: net_peerlist.h:189
p2p_protocol_defs.h
nodetool::peerlist_entry_base
Definition: p2p_protocol_defs.h:72
nodetool::peerlist_manager::modify_all
Definition: net_peerlist.h:140
nodetool::peerlist_manager::m_config_folder
std::string m_config_folder
Definition: net_peerlist.h:188
nodetool::peerlist_manager::trim_gray_peerlist
void trim_gray_peerlist()
Definition: net_peerlist.h:197
nodetool::anchor_peerlist_entry_base::adr
AddressType adr
Definition: p2p_protocol_defs.h:103
nodetool::peerlist_storage::peerlist_storage
peerlist_storage()
Definition: net_peerlist.h:65
nodetool::peerlist_manager::anchor_peers_indexed
boost::multi_index_container< anchor_peerlist_entry, boost::multi_index::indexed_by< 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 > >, 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 > > > > anchor_peers_indexed
Definition: net_peerlist.h:180
nodetool::peerlist_manager::modify_last_seen::m_last_seen
time_t m_last_seen
Definition: net_peerlist.h:158
nodetool::peerlist_entry_base::rpc_credits_per_hash
uint32_t rpc_credits_per_hash
Definition: p2p_protocol_defs.h:78
crypto.h
nodetool::peerlist_manager::merge_peerlist
bool merge_peerlist(const std::vector< peerlist_entry > &outer_bs, const std::function< bool(const peerlist_entry &)> &f=NULL)
Definition: net_peerlist.h:216
nodetool
Definition: levin_notify.h:52
epee
Definition: cryptonote_format_utils.h:44
nodetool::peerlist_manager::append_with_peer_gray
bool append_with_peer_gray(const peerlist_entry &pr)
Definition: net_peerlist.h:372
depth
static __thread int depth
Definition: threadpool.cpp:34
nodetool::anchor_peerlist_entry
anchor_peerlist_entry_base< epee::net_utils::network_address > anchor_peerlist_entry
Definition: p2p_protocol_defs.h:119
nodetool::peerlist_manager
Definition: net_peerlist.h:100
P2P_LOCAL_GRAY_PEERLIST_LIMIT
#define P2P_LOCAL_GRAY_PEERLIST_LIMIT
Definition: cryptonote_config.h:129
nodetool::peerlist_manager::get_and_empty_anchor_peerlist
bool get_and_empty_anchor_peerlist(std::vector< anchor_peerlist_entry > &apl)
Definition: net_peerlist.h:482
nodetool::peerlist_manager::get_white_peer_by_index
bool get_white_peer_by_index(peerlist_entry &p, size_t i)
Definition: net_peerlist.h:230