5#ifndef BITCOIN_TEST_FUZZ_UTIL_NET_H
6#define BITCOIN_TEST_FUZZ_UTIL_NET_H
46 :
AddrMan(netgroupman, true, check_ratio)
62 if (m_impl->mapInfo.size() != other.
m_impl->mapInfo.size() || m_impl->nNew != other.
m_impl->nNew ||
63 m_impl->nTried != other.
m_impl->nTried) {
70 auto addrinfo_hasher = [](
const AddrInfo& a) {
72 auto addr_key = a.GetKey();
73 auto source_key = a.source.GetAddrBytes();
74 hasher.
Write(TicksSinceEpoch<std::chrono::seconds>(a.m_last_success));
75 hasher.
Write(a.nAttempts);
76 hasher.
Write(a.nRefCount);
77 hasher.
Write(a.fInTried);
78 hasher.
Write(a.GetNetwork());
79 hasher.
Write(a.source.GetNetwork());
80 hasher.
Write(addr_key.size());
81 hasher.
Write(source_key.size());
82 hasher.
Write(addr_key);
83 hasher.
Write(source_key);
89 std::tie(
static_cast<const CService&
>(rhs), rhs.source, rhs.m_last_success, rhs.nAttempts, rhs.nRefCount, rhs.fInTried);
92 using Addresses = std::unordered_set<
AddrInfo,
decltype(addrinfo_hasher),
decltype(addrinfo_eq)>;
94 const size_t num_addresses{m_impl->mapInfo.size()};
96 Addresses addresses{num_addresses, addrinfo_hasher, addrinfo_eq};
97 for (
const auto& [
id, addr] : m_impl->mapInfo) {
98 addresses.insert(addr);
101 Addresses other_addresses{num_addresses, addrinfo_hasher, addrinfo_eq};
102 for (
const auto& [
id, addr] : other.
m_impl->mapInfo) {
103 other_addresses.insert(addr);
106 if (addresses != other_addresses) {
111 if (
id == -1 && other_id == -1) {
114 if ((
id == -1 && other_id != -1) || (
id != -1 && other_id == -1)) {
117 return m_impl->mapInfo.at(
id) == other.
m_impl->mapInfo.at(other_id);
125 if (!IdsReferToSameAddress(m_impl->vvNew[i][j], other.
m_impl->vvNew[i][j])) {
134 if (!IdsReferToSameAddress(m_impl->vvTried[i][j], other.
m_impl->vvTried[i][j])) {
197 ssize_t
Send(
const void*
data,
size_t len,
int flags)
const override;
199 ssize_t
Recv(
void* buf,
size_t len,
int flags)
const override;
201 int Connect(
const sockaddr*, socklen_t)
const override;
203 int Bind(
const sockaddr*, socklen_t)
const override;
205 int Listen(
int backlog)
const override;
207 std::unique_ptr<Sock>
Accept(sockaddr* addr, socklen_t* addr_len)
const override;
209 int GetSockOpt(
int level,
int opt_name,
void* opt_val, socklen_t* opt_len)
const override;
211 int SetSockOpt(
int level,
int opt_name,
const void* opt_val, socklen_t opt_len)
const override;
219 bool Wait(std::chrono::milliseconds timeout,
Event requested,
Event* occurred =
nullptr)
const override;
223 bool IsConnected(std::string& errmsg)
const override;
256 size_t max_vector_size = 5) noexcept
258 std::vector<CService>
ret;
261 for (
size_t i = 0; i < size; ++i) {
269template <
bool ReturnUniquePtr = false>
284 if constexpr (ReturnUniquePtr) {
285 return std::make_unique<CNode>(node_id,
297 return CNode{node_id,
static constexpr int ADDRMAN_TRIED_BUCKET_COUNT
static constexpr int ADDRMAN_BUCKET_SIZE
int64_t nid_type
User-defined type for the internally used nIds This used to be int, making it feasible for attackers ...
static constexpr int ADDRMAN_NEW_BUCKET_COUNT
Extended statistics about a CAddress.
CNetAddr source
where knowledge about this address first came from
bool fInTried
in tried set? (memory only)
NodeSeconds m_last_success
last successful connection by us
int nRefCount
reference count in new sets (memory only)
int nAttempts
connection attempts since last successful attempt
AddrManDeterministic(const NetGroupManager &netgroupman, FuzzedDataProvider &fuzzed_data_provider, int32_t check_ratio)
bool operator==(const AddrManDeterministic &other) const
Compare with another AddrMan.
Stochastic address manager.
const std::unique_ptr< AddrManImpl > m_impl
A CService with information about it as peer.
Information about a peer.
A combination of a network address (CNetAddr) and a (TCP) port.
General SipHash-2-4 implementation.
uint64_t Finalize() const
Compute the 64-bit SipHash-2-4 of the data written so far.
CSipHasher & Write(uint64_t data)
Hash a 64-bit integer worth of data.
Helper to initialize the global MockableSteadyClock, let a duration elapse, and reset it after use in...
std::string ConsumeRandomLengthString(size_t max_length)
T ConsumeIntegralInRange(T min, T max)
T PickValueInArray(const T(&array)[size])
virtual bool ProcessMessages(CNode &, std::atomic< bool > &) override
Process protocol messages received from a given node.
virtual void InitializeNode(const CNode &, ServiceFlags) override
Initialize a peer (setup state)
virtual bool SendMessages(CNode &) override
Send queued protocol messages to a given node.
FuzzedDataProvider & m_fdp
FuzzedNetEvents(FuzzedDataProvider &fdp)
virtual bool HasAllDesirableServiceFlags(ServiceFlags) const override
Callback to determine whether the given set of service flags are sufficient for a peer to be "relevan...
virtual void FinalizeNode(const CNode &) override
Handle removal of a peer (clear state)
std::unique_ptr< Sock > Accept(sockaddr *addr, socklen_t *addr_len) const override
accept(2) wrapper.
int GetSockOpt(int level, int opt_name, void *opt_val, socklen_t *opt_len) const override
getsockopt(2) wrapper.
bool Wait(std::chrono::milliseconds timeout, Event requested, Event *occurred=nullptr) const override
Wait for readiness for input (recv) or output (send).
FakeSteadyClock & m_clock
Externally-provided context used to mock the steady clock in methods waiting for a given duration.
int Listen(int backlog) const override
listen(2) wrapper.
const bool m_selectable
Whether to pretend that the socket is select(2)-able.
bool WaitMany(std::chrono::milliseconds timeout, EventsPerSock &events_per_sock) const override
Same as Wait(), but wait on many sockets within the same timeout.
bool IsConnected(std::string &errmsg) const override
Check if still connected.
int Connect(const sockaddr *, socklen_t) const override
connect(2) wrapper.
ssize_t Send(const void *data, size_t len, int flags) const override
send(2) wrapper.
std::vector< uint8_t > m_peek_data
Data to return when MSG_PEEK is used as a Recv() flag.
FuzzedSock & operator=(Sock &&other) override
Move assignment operator, grab the socket from another object and close ours (if set).
FuzzedDataProvider & m_fuzzed_data_provider
bool IsSelectable() const override
Check if the underlying socket can be used for select(2) (or the Wait() method).
bool SetNonBlocking() const override
Set the non-blocking option on the socket.
int SetSockOpt(int level, int opt_name, const void *opt_val, socklen_t opt_len) const override
setsockopt(2) wrapper.
ssize_t Recv(void *buf, size_t len, int flags) const override
recv(2) wrapper.
FuzzedSock(FuzzedDataProvider &fuzzed_data_provider, FakeSteadyClock &clock)
int GetSockName(sockaddr *name, socklen_t *name_len) const override
getsockname(2) wrapper.
int Bind(const sockaddr *, socklen_t) const override
bind(2) wrapper.
Interface for message handling.
static Mutex g_msgproc_mutex
Mutex for anything that is only accessed via the msg processing thread.
static NetGroupManager NoAsmap()
static NetGroupManager WithLoadedAsmap(std::vector< std::byte > &&asmap)
RAII helper class that manages a socket and closes it automatically when it goes out of scope.
std::unordered_map< std::shared_ptr< const Sock >, Events, HashSharedPtrSock, EqualSharedPtrSock > EventsPerSock
On which socket to wait for what events in WaitMany().
ConnectionType
Different types of connections to a peer.
@ INBOUND
Inbound connections are those initiated by a peer.
ServiceFlags
nServices flags
NetPermissionFlags permission_flags
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
void FillNode(FuzzedDataProvider &fuzzed_data_provider, ConnmanTestMsg &connman, CNode &node) noexcept
CService ConsumeService(FuzzedDataProvider &fuzzed_data_provider) noexcept
FuzzedSock ConsumeSock(FuzzedDataProvider &fuzzed_data_provider, FakeSteadyClock &clock)
CSubNet ConsumeSubNet(FuzzedDataProvider &fuzzed_data_provider) noexcept
NetGroupManager ConsumeNetGroupManager(FuzzedDataProvider &fuzzed_data_provider) noexcept
auto ConsumeNode(FuzzedDataProvider &fuzzed_data_provider, FakeSteadyClock &clock, const std::optional< NodeId > &node_id_in=std::nullopt) noexcept
std::unique_ptr< CNode > ConsumeNodeAsUniquePtr(FuzzedDataProvider &fdp, FakeSteadyClock &clock, const std::optional< NodeId > &node_id_in=std::nullopt)
CNetAddr ConsumeNetAddr(FuzzedDataProvider &fuzzed_data_provider, FastRandomContext *rand=nullptr) noexcept
Create a CNetAddr.
std::vector< CService > ConsumeServiceVector(FuzzedDataProvider &fuzzed_data_provider, size_t max_vector_size=5) noexcept
CAddress ConsumeAddress(FuzzedDataProvider &fuzzed_data_provider) noexcept
FuzzedNetEvents ConsumeNetEvents(FuzzedDataProvider &fdp) noexcept
WeakEnumType ConsumeWeakEnum(FuzzedDataProvider &fuzzed_data_provider, const WeakEnumType(&all_types)[size]) noexcept
uint256 ConsumeUInt256(FuzzedDataProvider &fuzzed_data_provider) noexcept
constexpr ConnectionType ALL_CONNECTION_TYPES[]
constexpr NetPermissionFlags ALL_NET_PERMISSION_FLAGS[]
#define EXCLUSIVE_LOCKS_REQUIRED(...)
bool CheckStandardAsmap(const std::span< const std::byte > data)
Provides a safe interface for validating ASMap data before use.
FuzzedDataProvider & fuzzed_data_provider