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