Bitcoin Core  28.1.0
P2P Digital Currency
net.h
Go to the documentation of this file.
1 // Copyright (c) 2020-2022 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_TEST_UTIL_NET_H
6 #define BITCOIN_TEST_UTIL_NET_H
7 
8 #include <compat/compat.h>
9 #include <net.h>
10 #include <net_permissions.h>
11 #include <net_processing.h>
12 #include <netaddress.h>
13 #include <node/connection_types.h>
14 #include <node/eviction.h>
15 #include <sync.h>
16 #include <util/sock.h>
17 
18 #include <algorithm>
19 #include <array>
20 #include <cassert>
21 #include <chrono>
22 #include <cstdint>
23 #include <cstring>
24 #include <memory>
25 #include <string>
26 #include <unordered_map>
27 #include <vector>
28 
29 class FastRandomContext;
30 
31 template <typename C>
32 class Span;
33 
34 struct ConnmanTestMsg : public CConnman {
35  using CConnman::CConnman;
36 
38  {
39  m_msgproc = msgproc;
40  }
41 
42  void SetPeerConnectTimeout(std::chrono::seconds timeout)
43  {
44  m_peer_connect_timeout = timeout;
45  }
46 
47  std::vector<CNode*> TestNodes()
48  {
50  return m_nodes;
51  }
52 
54  {
56  m_nodes.push_back(&node);
57 
58  if (node.IsManualOrFullOutboundConn()) ++m_network_conn_counts[node.addr.GetNetwork()];
59  }
60 
62  {
64  for (CNode* node : m_nodes) {
65  delete node;
66  }
67  m_nodes.clear();
68  }
69 
70  void Handshake(CNode& node,
71  bool successfully_connected,
72  ServiceFlags remote_services,
73  ServiceFlags local_services,
74  int32_t version,
75  bool relay_txs)
77 
79  {
80  return m_msgproc->ProcessMessages(&node, flagInterruptMsgProc);
81  }
82 
83  void NodeReceiveMsgBytes(CNode& node, Span<const uint8_t> msg_bytes, bool& complete) const;
84 
85  bool ReceiveMsgFrom(CNode& node, CSerializedNetMsg&& ser_msg) const;
86  void FlushSendBuffer(CNode& node) const;
87 
88  bool AlreadyConnectedPublic(const CAddress& addr) { return AlreadyConnectedToAddress(addr); };
89 
90  CNode* ConnectNodePublic(PeerManager& peerman, const char* pszDest, ConnectionType conn_type)
92 };
93 
95  NODE_NONE,
97  NODE_BLOOM,
101  NODE_P2P_V2,
102 };
103 
115 };
116 
124 };
125 
126 constexpr auto ALL_NETWORKS = std::array{
134 };
135 
141 class StaticContentsSock : public Sock
142 {
143 public:
144  explicit StaticContentsSock(const std::string& contents)
145  : Sock{INVALID_SOCKET},
146  m_contents{contents}
147  {
148  }
149 
151 
152  StaticContentsSock& operator=(Sock&& other) override
153  {
154  assert(false && "Move of Sock into MockSock not allowed.");
155  return *this;
156  }
157 
158  ssize_t Send(const void*, size_t len, int) const override { return len; }
159 
160  ssize_t Recv(void* buf, size_t len, int flags) const override
161  {
162  const size_t consume_bytes{std::min(len, m_contents.size() - m_consumed)};
163  std::memcpy(buf, m_contents.data() + m_consumed, consume_bytes);
164  if ((flags & MSG_PEEK) == 0) {
165  m_consumed += consume_bytes;
166  }
167  return consume_bytes;
168  }
169 
170  int Connect(const sockaddr*, socklen_t) const override { return 0; }
171 
172  int Bind(const sockaddr*, socklen_t) const override { return 0; }
173 
174  int Listen(int) const override { return 0; }
175 
176  std::unique_ptr<Sock> Accept(sockaddr* addr, socklen_t* addr_len) const override
177  {
178  if (addr != nullptr) {
179  // Pretend all connections come from 5.5.5.5:6789
180  memset(addr, 0x00, *addr_len);
181  const socklen_t write_len = static_cast<socklen_t>(sizeof(sockaddr_in));
182  if (*addr_len >= write_len) {
183  *addr_len = write_len;
184  sockaddr_in* addr_in = reinterpret_cast<sockaddr_in*>(addr);
185  addr_in->sin_family = AF_INET;
186  memset(&addr_in->sin_addr, 0x05, sizeof(addr_in->sin_addr));
187  addr_in->sin_port = htons(6789);
188  }
189  }
190  return std::make_unique<StaticContentsSock>("");
191  };
192 
193  int GetSockOpt(int level, int opt_name, void* opt_val, socklen_t* opt_len) const override
194  {
195  std::memset(opt_val, 0x0, *opt_len);
196  return 0;
197  }
198 
199  int SetSockOpt(int, int, const void*, socklen_t) const override { return 0; }
200 
201  int GetSockName(sockaddr* name, socklen_t* name_len) const override
202  {
203  std::memset(name, 0x0, *name_len);
204  return 0;
205  }
206 
207  bool SetNonBlocking() const override { return true; }
208 
209  bool IsSelectable() const override { return true; }
210 
211  bool Wait(std::chrono::milliseconds timeout,
212  Event requested,
213  Event* occurred = nullptr) const override
214  {
215  if (occurred != nullptr) {
216  *occurred = requested;
217  }
218  return true;
219  }
220 
221  bool WaitMany(std::chrono::milliseconds timeout, EventsPerSock& events_per_sock) const override
222  {
223  for (auto& [sock, events] : events_per_sock) {
224  (void)sock;
225  events.occurred = events.requested;
226  }
227  return true;
228  }
229 
230  bool IsConnected(std::string&) const override
231  {
232  return true;
233  }
234 
235 private:
236  const std::string m_contents;
237  mutable size_t m_consumed{0};
238 };
239 
240 std::vector<NodeEvictionCandidate> GetRandomNodeEvictionCandidates(int n_candidates, FastRandomContext& random_context);
241 
242 #endif // BITCOIN_TEST_UTIL_NET_H
static Mutex g_msgproc_mutex
Mutex for anything that is only accessed via the msg processing thread.
Definition: net.h:992
std::atomic< bool > flagInterruptMsgProc
Definition: net.h:1522
void SetPeerConnectTimeout(std::chrono::seconds timeout)
Definition: net.h:42
int GetSockName(sockaddr *name, socklen_t *name_len) const override
getsockname(2) wrapper.
Definition: net.h:201
AddrFetch connections are short lived connections used to solicit addresses from peers.
A mocked Sock alternative that returns a statically contained data upon read and succeeds and ignores...
Definition: net.h:141
ServiceFlags
nServices flags
Definition: protocol.h:309
Inbound connections are those initiated by a peer.
assert(!tx.IsCoinBase())
A set of addresses that represent the hash of a string or FQDN.
Definition: netaddress.h:53
Feeler connections are short-lived connections made to check that a node is alive.
~StaticContentsSock() override
Definition: net.h:150
ssize_t Send(const void *, size_t len, int) const override
send(2) wrapper.
Definition: net.h:158
IPv4.
Definition: netaddress.h:37
constexpr NetPermissionFlags ALL_NET_PERMISSION_FLAGS[]
Definition: net.h:104
m_peer_connect_timeout
Definition: net.h:1080
void ClearTestNodes()
Definition: net.h:61
void FlushSendBuffer(CNode &node) const
Definition: net.cpp:79
bool AlreadyConnectedToAddress(const CAddress &addr)
Determine whether we&#39;re already connected to a given address, in order to avoid initiating duplicate ...
Definition: net.cpp:357
std::vector< NodeEvictionCandidate > GetRandomNodeEvictionCandidates(int n_candidates, FastRandomContext &random_context)
Definition: net.cpp:116
SOCKET m_socket
Contained socket.
Definition: sock.h:275
Interface for message handling.
Definition: net.h:988
#define INVALID_SOCKET
Definition: compat.h:56
std::vector< CNode * > TestNodes()
Definition: net.h:47
NetPermissionFlags
These are the default connections that we use to connect with the network.
int Listen(int) const override
listen(2) wrapper.
Definition: net.h:174
I2P.
Definition: netaddress.h:46
Mutex m_unused_i2p_sessions_mutex
Mutex protecting m_i2p_sam_sessions.
Definition: net.h:1578
constexpr ServiceFlags ALL_SERVICE_FLAGS[]
Definition: net.h:94
bool WaitMany(std::chrono::milliseconds timeout, EventsPerSock &events_per_sock) const override
Same as Wait(), but wait on many sockets within the same timeout.
Definition: net.h:221
int GetSockOpt(int level, int opt_name, void *opt_val, socklen_t *opt_len) const override
getsockopt(2) wrapper.
Definition: net.h:193
constexpr ConnectionType ALL_CONNECTION_TYPES[]
Definition: net.h:117
std::unordered_map< std::shared_ptr< const Sock >, Events, HashSharedPtrSock, EqualSharedPtrSock > EventsPerSock
On which socket to wait for what events in WaitMany().
Definition: sock.h:208
We open manual connections to addresses that users explicitly requested via the addnode RPC or the -a...
#define LOCK(cs)
Definition: sync.h:257
const char * name
Definition: rest.cpp:49
Fast randomness source.
Definition: random.h:376
int SetSockOpt(int, int, const void *, socklen_t) const override
setsockopt(2) wrapper.
Definition: net.h:199
void NodeReceiveMsgBytes(CNode &node, Span< const uint8_t > msg_bytes, bool &complete) const
Definition: net.cpp:71
A CService with information about it as peer.
Definition: protocol.h:366
int Bind(const sockaddr *, socklen_t) const override
bind(2) wrapper.
Definition: net.h:172
Definition: net.h:1032
std::unique_ptr< Sock > Accept(sockaddr *addr, socklen_t *addr_len) const override
accept(2) wrapper.
Definition: net.h:176
uint8_t Event
Definition: sock.h:138
bool AlreadyConnectedPublic(const CAddress &addr)
Definition: net.h:88
bool IsConnected(std::string &) const override
Check if still connected.
Definition: net.h:230
bool ReceiveMsgFrom(CNode &node, CSerializedNetMsg &&ser_msg) const
Definition: net.cpp:91
StaticContentsSock(const std::string &contents)
Definition: net.h:144
RecursiveMutex m_nodes_mutex
Definition: net.h:1428
const std::string m_contents
Definition: net.h:236
m_msgproc
Definition: net.h:1077
StaticContentsSock & operator=(Sock &&other) override
Move assignment operator, grab the socket from another object and close ours (if set).
Definition: net.h:152
Definition: messages.h:20
int flags
Definition: bitcoin-tx.cpp:533
int Connect(const sockaddr *, socklen_t) const override
connect(2) wrapper.
Definition: net.h:170
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
bool SetNonBlocking() const override
Set the non-blocking option on the socket.
Definition: net.h:207
IPv6.
Definition: netaddress.h:40
TOR (v2 or v3)
Definition: netaddress.h:43
ssize_t Recv(void *buf, size_t len, int flags) const override
recv(2) wrapper.
Definition: net.h:160
constexpr auto ALL_NETWORKS
Definition: net.h:126
ConnectionType
Different types of connections to a peer.
CConnman(uint64_t seed0, uint64_t seed1, AddrMan &addrman, const NetGroupManager &netgroupman, const CChainParams &params, bool network_active=true)
Definition: net.cpp:3150
void SetMsgProc(NetEventsInterface *msgproc)
Definition: net.h:37
RAII helper class that manages a socket and closes it automatically when it goes out of scope...
Definition: sock.h:26
bool IsSelectable() const override
Check if the underlying socket can be used for select(2) (or the Wait() method).
Definition: net.h:209
A Span is an object that can refer to a contiguous sequence of objects.
Definition: solver.h:20
Information about a peer.
Definition: net.h:669
void Handshake(CNode &node, bool successfully_connected, ServiceFlags remote_services, ServiceFlags local_services, int32_t version, bool relay_txs) EXCLUSIVE_LOCKS_REQUIRED(NetEventsInterface bool ProcessMessagesOnce(CNode &node) EXCLUSIVE_LOCKS_REQUIRED(NetEventsInterface
Definition: net.h:78
size_t m_consumed
Definition: net.h:237
CNode * ConnectNodePublic(PeerManager &peerman, const char *pszDest, ConnectionType conn_type) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex)
Definition: net.cpp:105
CJDNS.
Definition: netaddress.h:49
void AddTestNode(CNode &node)
Definition: net.h:53
bool Wait(std::chrono::milliseconds timeout, Event requested, Event *occurred=nullptr) const override
Wait for readiness for input (recv) or output (send).
Definition: net.h:211
We use block-relay-only connections to help prevent against partition attacks.
Addresses from these networks are not publicly routable on the global Internet.
Definition: netaddress.h:34