5 #ifndef BITCOIN_TEST_UTIL_NET_H 6 #define BITCOIN_TEST_UTIL_NET_H 31 m_nodes.push_back(&
node);
33 if (
node.IsManualOrFullOutboundConn()) ++m_network_conn_counts[
node.addr.GetNetwork()];
46 bool successfully_connected,
121 assert(
false &&
"Move of Sock into MockSock not allowed.");
125 ssize_t
Send(
const void*,
size_t len,
int)
const override {
return len; }
127 ssize_t
Recv(
void* buf,
size_t len,
int flags)
const override 131 if ((
flags & MSG_PEEK) == 0) {
134 return consume_bytes;
137 int Connect(
const sockaddr*, socklen_t)
const override {
return 0; }
139 int Bind(
const sockaddr*, socklen_t)
const override {
return 0; }
141 int Listen(
int)
const override {
return 0; }
143 std::unique_ptr<Sock>
Accept(sockaddr* addr, socklen_t* addr_len)
const override 145 if (addr !=
nullptr) {
147 memset(addr, 0x00, *addr_len);
148 const socklen_t write_len =
static_cast<socklen_t
>(
sizeof(sockaddr_in));
149 if (*addr_len >= write_len) {
150 *addr_len = write_len;
151 sockaddr_in* addr_in =
reinterpret_cast<sockaddr_in*
>(addr);
152 addr_in->sin_family = AF_INET;
153 memset(&addr_in->sin_addr, 0x05,
sizeof(addr_in->sin_addr));
154 addr_in->sin_port = htons(6789);
157 return std::make_unique<StaticContentsSock>(
"");
160 int GetSockOpt(
int level,
int opt_name,
void* opt_val, socklen_t* opt_len)
const override 162 std::memset(opt_val, 0x0, *opt_len);
166 int SetSockOpt(
int,
int,
const void*, socklen_t)
const override {
return 0; }
170 std::memset(
name, 0x0, *name_len);
178 bool Wait(std::chrono::milliseconds timeout,
180 Event* occurred =
nullptr)
const override 182 if (occurred !=
nullptr) {
183 *occurred = requested;
190 for (
auto& [sock, events] : events_per_sock) {
192 events.occurred = events.requested;
209 #endif // BITCOIN_TEST_UTIL_NET_H static Mutex g_msgproc_mutex
Mutex for anything that is only accessed via the msg processing thread.
std::atomic< bool > flagInterruptMsgProc
void SetPeerConnectTimeout(std::chrono::seconds timeout)
int GetSockName(sockaddr *name, socklen_t *name_len) const override
getsockname(2) wrapper.
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...
ServiceFlags
nServices flags
Inbound connections are those initiated by a peer.
A set of addresses that represent the hash of a string or FQDN.
Feeler connections are short-lived connections made to check that a node is alive.
~StaticContentsSock() override
ssize_t Send(const void *, size_t len, int) const override
send(2) wrapper.
constexpr NetPermissionFlags ALL_NET_PERMISSION_FLAGS[]
void FlushSendBuffer(CNode &node) const
std::vector< NodeEvictionCandidate > GetRandomNodeEvictionCandidates(int n_candidates, FastRandomContext &random_context)
SOCKET m_socket
Contained socket.
void Handshake(CNode &node, bool successfully_connected, ServiceFlags remote_services, ServiceFlags local_services, int32_t version, bool relay_txs) EXCLUSIVE_LOCKS_REQUIRED(NetEventsInterface void ProcessMessagesOnce(CNode &node) EXCLUSIVE_LOCKS_REQUIRED(NetEventsInterface
These are the default connections that we use to connect with the network.
int Listen(int) const override
listen(2) wrapper.
constexpr ServiceFlags ALL_SERVICE_FLAGS[]
bool WaitMany(std::chrono::milliseconds timeout, EventsPerSock &events_per_sock) const override
Same as Wait(), but wait on many sockets within the same timeout.
int GetSockOpt(int level, int opt_name, void *opt_val, socklen_t *opt_len) const override
getsockopt(2) wrapper.
constexpr ConnectionType ALL_CONNECTION_TYPES[]
std::unordered_map< std::shared_ptr< const Sock >, Events, HashSharedPtrSock, EqualSharedPtrSock > EventsPerSock
On which socket to wait for what events in WaitMany().
We open manual connections to addresses that users explicitly requested via the addnode RPC or the -a...
int SetSockOpt(int, int, const void *, socklen_t) const override
setsockopt(2) wrapper.
void NodeReceiveMsgBytes(CNode &node, Span< const uint8_t > msg_bytes, bool &complete) const
int Bind(const sockaddr *, socklen_t) const override
bind(2) wrapper.
std::unique_ptr< Sock > Accept(sockaddr *addr, socklen_t *addr_len) const override
accept(2) wrapper.
bool IsConnected(std::string &) const override
Check if still connected.
bool ReceiveMsgFrom(CNode &node, CSerializedNetMsg &&ser_msg) const
StaticContentsSock(const std::string &contents)
RecursiveMutex m_nodes_mutex
const std::string m_contents
StaticContentsSock & operator=(Sock &&other) override
Move assignment operator, grab the socket from another object and close ours (if set).
int Connect(const sockaddr *, socklen_t) const override
connect(2) wrapper.
#define EXCLUSIVE_LOCKS_REQUIRED(...)
bool SetNonBlocking() const override
Set the non-blocking option on the socket.
ssize_t Recv(void *buf, size_t len, int flags) const override
recv(2) wrapper.
constexpr auto ALL_NETWORKS
ConnectionType
Different types of connections to a peer.
CConnman(uint64_t seed0, uint64_t seed1, AddrMan &addrman, const NetGroupManager &netgroupman, const CChainParams ¶ms, bool network_active=true)
RAII helper class that manages a socket and closes it automatically when it goes out of scope...
bool IsSelectable() const override
Check if the underlying socket can be used for select(2) (or the Wait() method).
A Span is an object that can refer to a contiguous sequence of objects.
Information about a peer.
void AddTestNode(CNode &node)
bool Wait(std::chrono::milliseconds timeout, Event requested, Event *occurred=nullptr) const override
Wait for readiness for input (recv) or output (send).
We use block-relay-only connections to help prevent against partition attacks.
Addresses from these networks are not publicly routable on the global Internet.