Bitcoin Core  24.1.0
P2P Digital Currency
net.h
Go to the documentation of this file.
1 // Copyright (c) 2020-2021 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 <node/eviction.h>
10 #include <netaddress.h>
11 #include <net.h>
12 #include <util/sock.h>
13 
14 #include <array>
15 #include <cassert>
16 #include <cstring>
17 #include <memory>
18 #include <string>
19 
20 struct ConnmanTestMsg : public CConnman {
21  using CConnman::CConnman;
22 
23  void SetPeerConnectTimeout(std::chrono::seconds timeout)
24  {
25  m_peer_connect_timeout = timeout;
26  }
27 
29  {
31  m_nodes.push_back(&node);
32  }
34  {
36  for (CNode* node : m_nodes) {
37  delete node;
38  }
39  m_nodes.clear();
40  }
41 
42  void Handshake(CNode& node,
43  bool successfully_connected,
44  ServiceFlags remote_services,
45  ServiceFlags local_services,
46  int32_t version,
47  bool relay_txs);
48 
50 
51  void NodeReceiveMsgBytes(CNode& node, Span<const uint8_t> msg_bytes, bool& complete) const;
52 
53  bool ReceiveMsgFrom(CNode& node, CSerializedNetMsg& ser_msg) const;
54 };
55 
57  NODE_NONE,
59  NODE_BLOOM,
63 };
64 
76 };
77 
85 };
86 
87 constexpr auto ALL_NETWORKS = std::array{
95 };
96 
102 class StaticContentsSock : public Sock
103 {
104 public:
105  explicit StaticContentsSock(const std::string& contents) : m_contents{contents}, m_consumed{0}
106  {
107  // Just a dummy number that is not INVALID_SOCKET.
108  m_socket = INVALID_SOCKET - 1;
109  }
110 
112 
113  StaticContentsSock& operator=(Sock&& other) override
114  {
115  assert(false && "Move of Sock into MockSock not allowed.");
116  return *this;
117  }
118 
119  ssize_t Send(const void*, size_t len, int) const override { return len; }
120 
121  ssize_t Recv(void* buf, size_t len, int flags) const override
122  {
123  const size_t consume_bytes{std::min(len, m_contents.size() - m_consumed)};
124  std::memcpy(buf, m_contents.data() + m_consumed, consume_bytes);
125  if ((flags & MSG_PEEK) == 0) {
126  m_consumed += consume_bytes;
127  }
128  return consume_bytes;
129  }
130 
131  int Connect(const sockaddr*, socklen_t) const override { return 0; }
132 
133  int Bind(const sockaddr*, socklen_t) const override { return 0; }
134 
135  int Listen(int) const override { return 0; }
136 
137  std::unique_ptr<Sock> Accept(sockaddr* addr, socklen_t* addr_len) const override
138  {
139  if (addr != nullptr) {
140  // Pretend all connections come from 5.5.5.5:6789
141  memset(addr, 0x00, *addr_len);
142  const socklen_t write_len = static_cast<socklen_t>(sizeof(sockaddr_in));
143  if (*addr_len >= write_len) {
144  *addr_len = write_len;
145  sockaddr_in* addr_in = reinterpret_cast<sockaddr_in*>(addr);
146  addr_in->sin_family = AF_INET;
147  memset(&addr_in->sin_addr, 0x05, sizeof(addr_in->sin_addr));
148  addr_in->sin_port = htons(6789);
149  }
150  }
151  return std::make_unique<StaticContentsSock>("");
152  };
153 
154  int GetSockOpt(int level, int opt_name, void* opt_val, socklen_t* opt_len) const override
155  {
156  std::memset(opt_val, 0x0, *opt_len);
157  return 0;
158  }
159 
160  int SetSockOpt(int, int, const void*, socklen_t) const override { return 0; }
161 
162  int GetSockName(sockaddr* name, socklen_t* name_len) const override
163  {
164  std::memset(name, 0x0, *name_len);
165  return 0;
166  }
167 
168  bool Wait(std::chrono::milliseconds timeout,
169  Event requested,
170  Event* occurred = nullptr) const override
171  {
172  if (occurred != nullptr) {
173  *occurred = requested;
174  }
175  return true;
176  }
177 
178  bool WaitMany(std::chrono::milliseconds timeout, EventsPerSock& events_per_sock) const override
179  {
180  for (auto& [sock, events] : events_per_sock) {
181  (void)sock;
182  events.occurred = events.requested;
183  }
184  return true;
185  }
186 
187 private:
188  const std::string m_contents;
189  mutable size_t m_consumed;
190 };
191 
192 std::vector<NodeEvictionCandidate> GetRandomNodeEvictionCandidates(int n_candidates, FastRandomContext& random_context);
193 
194 #endif // BITCOIN_TEST_UTIL_NET_H
std::atomic< bool > flagInterruptMsgProc
Definition: net.h:1090
void SetPeerConnectTimeout(std::chrono::seconds timeout)
Definition: net.h:23
int GetSockName(sockaddr *name, socklen_t *name_len) const override
getsockname(2) wrapper.
Definition: net.h:162
AddrFetch connections are short lived connections used to solicit addresses from peers.
bool ReceiveMsgFrom(CNode &node, CSerializedNetMsg &ser_msg) const
Definition: net.cpp:91
A mocked Sock alternative that returns a statically contained data upon read and succeeds and ignores...
Definition: net.h:102
ServiceFlags
nServices flags
Definition: protocol.h:267
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:65
Feeler connections are short-lived connections made to check that a node is alive.
~StaticContentsSock() override
Definition: net.h:111
ssize_t Send(const void *, size_t len, int) const override
send(2) wrapper.
Definition: net.h:119
IPv4.
Definition: netaddress.h:49
constexpr NetPermissionFlags ALL_NET_PERMISSION_FLAGS[]
Definition: net.h:65
m_peer_connect_timeout
Definition: net.h:716
void ClearTestNodes()
Definition: net.h:33
std::vector< NodeEvictionCandidate > GetRandomNodeEvictionCandidates(int n_candidates, FastRandomContext &random_context)
Definition: net.cpp:102
SOCKET m_socket
Contained socket.
Definition: sock.h:261
void ProcessMessagesOnce(CNode &node)
Definition: net.h:49
#define INVALID_SOCKET
Definition: compat.h:54
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:135
I2P.
Definition: netaddress.h:58
constexpr ServiceFlags ALL_SERVICE_FLAGS[]
Definition: net.h:56
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:178
int GetSockOpt(int level, int opt_name, void *opt_val, socklen_t *opt_len) const override
getsockopt(2) wrapper.
Definition: net.h:154
constexpr ConnectionType ALL_CONNECTION_TYPES[]
Definition: net.h:78
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:206
We open manual connections to addresses that users explicitly requested via the addnode RPC or the -a...
#define LOCK(cs)
Definition: sync.h:261
const char * name
Definition: rest.cpp:46
Fast randomness source.
Definition: random.h:142
int SetSockOpt(int, int, const void *, socklen_t) const override
setsockopt(2) wrapper.
Definition: net.h:160
void NodeReceiveMsgBytes(CNode &node, Span< const uint8_t > msg_bytes, bool &complete) const
Definition: net.cpp:71
int Bind(const sockaddr *, socklen_t) const override
bind(2) wrapper.
Definition: net.h:133
Definition: net.h:666
std::unique_ptr< Sock > Accept(sockaddr *addr, socklen_t *addr_len) const override
accept(2) wrapper.
Definition: net.h:137
uint8_t Event
Definition: sock.h:136
StaticContentsSock(const std::string &contents)
Definition: net.h:105
RecursiveMutex m_nodes_mutex
Definition: net.h:1013
const std::string m_contents
Definition: net.h:188
m_msgproc
Definition: net.h:713
StaticContentsSock & operator=(Sock &&other) override
Move assignment operator, grab the socket from another object and close ours (if set).
Definition: net.h:113
Definition: init.h:25
int flags
Definition: bitcoin-tx.cpp:525
int Connect(const sockaddr *, socklen_t) const override
connect(2) wrapper.
Definition: net.h:131
void Handshake(CNode &node, bool successfully_connected, ServiceFlags remote_services, ServiceFlags local_services, int32_t version, bool relay_txs)
Definition: net.cpp:16
CConnman(uint64_t seed0, uint64_t seed1, AddrMan &addrman, const NetGroupManager &netgroupman, bool network_active=true)
Definition: net.cpp:2230
IPv6.
Definition: netaddress.h:52
TOR (v2 or v3)
Definition: netaddress.h:55
ssize_t Recv(void *buf, size_t len, int flags) const override
recv(2) wrapper.
Definition: net.h:121
constexpr auto ALL_NETWORKS
Definition: net.h:87
ConnectionType
Different types of connections to a peer.
RAII helper class that manages a socket.
Definition: sock.h:27
A Span is an object that can refer to a contiguous sequence of objects.
Definition: span.h:96
Information about a peer.
Definition: net.h:347
size_t m_consumed
Definition: net.h:189
CJDNS.
Definition: netaddress.h:61
void AddTestNode(CNode &node)
Definition: net.h:28
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:168
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:46