mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-20 14:05:23 +01:00
Merge #19724: [net] Cleanup connection types- followups
eb1c5d090f
[doc] Follow developer notes, add comment about missing default. (Amiti Uttarwar)d5a57cef62
[doc] Describe connection types in more depth. (Amiti Uttarwar)4829b6fcc6
[refactor] Simplify connection type logic in ThreadOpenConnections (Amiti Uttarwar)1e563aed78
[refactor] Simplify check for block-relay-only connection. (Amiti Uttarwar)da3a0be61b
[test] Add explicit tests that connection types get set correctly (Amiti Uttarwar)1d74fc7df6
[trivial] Small style updates (Amiti Uttarwar)ff6b9081ad
[doc] Explain address handling logic in process messages (Amiti Uttarwar)dff16b184b
[refactor] Restructure logic to check for addr relay. (Amiti Uttarwar)a6ab1e81f9
[net] Remove unnecessary default args on OpenNetworkConnection (Amiti Uttarwar)8d6ff46f55
scripted-diff: Rename `OUTBOUND` ConnectionType to `OUTBOUND_FULL_RELAY` (Amiti Uttarwar) Pull request description: This PR addresses outstanding review comments from #19316. It further simplifies `net.cpp` complexity and adds documentation about design goals about different connection types. ACKs for top commit: naumenkogs: ACKeb1c5d090f
laanwj: Code review ACKeb1c5d090f
Tree-SHA512: 2fe14e428404c95661e5518c8c90db07ab5b9ebb1bac921b3bdf82b181f444fae379f8fc0a2b619e6b4693f01c55bd246fbd8c8eedadd96849a30de3161afee5
This commit is contained in:
commit
620ac8c475
8 changed files with 139 additions and 75 deletions
70
src/net.cpp
70
src/net.cpp
|
@ -1843,41 +1843,45 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
|
|||
// but inbound and manual peers do not use our outbound slots. Inbound peers
|
||||
// also have the added issue that they could be attacker controlled and used
|
||||
// to prevent us from connecting to particular hosts if we used them here.
|
||||
switch(pnode->m_conn_type){
|
||||
switch (pnode->m_conn_type) {
|
||||
case ConnectionType::INBOUND:
|
||||
case ConnectionType::MANUAL:
|
||||
break;
|
||||
case ConnectionType::OUTBOUND:
|
||||
case ConnectionType::OUTBOUND_FULL_RELAY:
|
||||
case ConnectionType::BLOCK_RELAY:
|
||||
case ConnectionType::ADDR_FETCH:
|
||||
case ConnectionType::FEELER:
|
||||
setConnected.insert(pnode->addr.GetGroup(addrman.m_asmap));
|
||||
}
|
||||
} // no default case, so the compiler can warn about missing cases
|
||||
}
|
||||
}
|
||||
|
||||
// Feeler Connections
|
||||
//
|
||||
// Design goals:
|
||||
// * Increase the number of connectable addresses in the tried table.
|
||||
//
|
||||
// Method:
|
||||
// * Choose a random address from new and attempt to connect to it if we can connect
|
||||
// successfully it is added to tried.
|
||||
// * Start attempting feeler connections only after node finishes making outbound
|
||||
// connections.
|
||||
// * Only make a feeler connection once every few minutes.
|
||||
//
|
||||
ConnectionType conn_type = ConnectionType::OUTBOUND_FULL_RELAY;
|
||||
int64_t nTime = GetTimeMicros();
|
||||
bool fFeeler = false;
|
||||
|
||||
if (nOutboundFullRelay >= m_max_outbound_full_relay && nOutboundBlockRelay >= m_max_outbound_block_relay && !GetTryNewOutboundPeer()) {
|
||||
int64_t nTime = GetTimeMicros(); // The current time right now (in microseconds).
|
||||
if (nTime > nNextFeeler) {
|
||||
nNextFeeler = PoissonNextSend(nTime, FEELER_INTERVAL);
|
||||
fFeeler = true;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
// Determine what type of connection to open. Opening
|
||||
// OUTBOUND_FULL_RELAY connections gets the highest priority until we
|
||||
// meet our full-relay capacity. Then we open BLOCK_RELAY connection
|
||||
// until we hit our block-relay-only peer limit.
|
||||
// GetTryNewOutboundPeer() gets set when a stale tip is detected, so we
|
||||
// try opening an additional OUTBOUND_FULL_RELAY connection. If none of
|
||||
// these conditions are met, check the nNextFeeler timer to decide if
|
||||
// we should open a FEELER.
|
||||
|
||||
if (nOutboundFullRelay < m_max_outbound_full_relay) {
|
||||
// OUTBOUND_FULL_RELAY
|
||||
} else if (nOutboundBlockRelay < m_max_outbound_block_relay) {
|
||||
conn_type = ConnectionType::BLOCK_RELAY;
|
||||
} else if (GetTryNewOutboundPeer()) {
|
||||
// OUTBOUND_FULL_RELAY
|
||||
} else if (nTime > nNextFeeler) {
|
||||
nNextFeeler = PoissonNextSend(nTime, FEELER_INTERVAL);
|
||||
conn_type = ConnectionType::FEELER;
|
||||
fFeeler = true;
|
||||
} else {
|
||||
// skip to next iteration of while loop
|
||||
continue;
|
||||
}
|
||||
|
||||
addrman.ResolveCollisions();
|
||||
|
@ -1944,23 +1948,6 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
|
|||
LogPrint(BCLog::NET, "Making feeler connection to %s\n", addrConnect.ToString());
|
||||
}
|
||||
|
||||
ConnectionType conn_type;
|
||||
// Determine what type of connection to open. If fFeeler is not
|
||||
// set, open OUTBOUND connections until we meet our full-relay
|
||||
// capacity. Then open BLOCK_RELAY connections until we hit our
|
||||
// block-relay peer limit. Otherwise, default to opening an
|
||||
// OUTBOUND connection.
|
||||
if (fFeeler) {
|
||||
conn_type = ConnectionType::FEELER;
|
||||
} else if (nOutboundFullRelay < m_max_outbound_full_relay) {
|
||||
conn_type = ConnectionType::OUTBOUND;
|
||||
} else if (nOutboundBlockRelay < m_max_outbound_block_relay) {
|
||||
conn_type = ConnectionType::BLOCK_RELAY;
|
||||
} else {
|
||||
// GetTryNewOutboundPeer() is true
|
||||
conn_type = ConnectionType::OUTBOUND;
|
||||
}
|
||||
|
||||
OpenNetworkConnection(addrConnect, (int)setConnected.size() >= std::min(nMaxConnections - 1, 2), &grant, nullptr, conn_type);
|
||||
}
|
||||
}
|
||||
|
@ -2784,6 +2771,9 @@ CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, int nMyStartingHeightIn
|
|||
hashContinue = uint256();
|
||||
if (conn_type_in != ConnectionType::BLOCK_RELAY) {
|
||||
m_tx_relay = MakeUnique<TxRelay>();
|
||||
}
|
||||
|
||||
if (RelayAddrsWithConn()) {
|
||||
m_addr_known = MakeUnique<CRollingBloomFilter>(5000, 0.001);
|
||||
}
|
||||
|
||||
|
|
80
src/net.h
80
src/net.h
|
@ -118,12 +118,54 @@ struct CSerializedNetMsg
|
|||
* information we have available at the time of opening or accepting the
|
||||
* connection. Aside from INBOUND, all types are initiated by us. */
|
||||
enum class ConnectionType {
|
||||
INBOUND, /**< peer initiated connections */
|
||||
OUTBOUND, /**< full relay connections (blocks, addrs, txns) made automatically. Addresses selected from AddrMan. */
|
||||
MANUAL, /**< connections to addresses added via addnode or the connect command line argument */
|
||||
FEELER, /**< short lived connections used to test address validity */
|
||||
BLOCK_RELAY, /**< only relay blocks to these automatic outbound connections. Addresses selected from AddrMan. */
|
||||
ADDR_FETCH, /**< short lived connections used to solicit addrs when starting the node without a populated AddrMan */
|
||||
/**
|
||||
* Inbound connections are those initiated by a peer. This is the only
|
||||
* property we know at the time of connection, until P2P messages are
|
||||
* exchanged.
|
||||
*/
|
||||
INBOUND,
|
||||
|
||||
/**
|
||||
* These are the default connections that we use to connect with the
|
||||
* network. There is no restriction on what is relayed- by default we relay
|
||||
* blocks, addresses & transactions. We automatically attempt to open
|
||||
* MAX_OUTBOUND_FULL_RELAY_CONNECTIONS using addresses from our AddrMan.
|
||||
*/
|
||||
OUTBOUND_FULL_RELAY,
|
||||
|
||||
|
||||
/**
|
||||
* We open manual connections to addresses that users explicitly inputted
|
||||
* via the addnode RPC, or the -connect command line argument. Even if a
|
||||
* manual connection is misbehaving, we do not automatically disconnect or
|
||||
* add it to our discouragement filter.
|
||||
*/
|
||||
MANUAL,
|
||||
|
||||
/**
|
||||
* Feeler connections are short lived connections used to increase the
|
||||
* number of connectable addresses in our AddrMan. Approximately every
|
||||
* FEELER_INTERVAL, we attempt to connect to a random address from the new
|
||||
* table. If successful, we add it to the tried table.
|
||||
*/
|
||||
FEELER,
|
||||
|
||||
/**
|
||||
* We use block-relay-only connections to help prevent against partition
|
||||
* attacks. By not relaying transactions or addresses, these connections
|
||||
* are harder to detect by a third party, thus helping obfuscate the
|
||||
* network topology. We automatically attempt to open
|
||||
* MAX_BLOCK_RELAY_ONLY_CONNECTIONS using addresses from our AddrMan.
|
||||
*/
|
||||
BLOCK_RELAY,
|
||||
|
||||
/**
|
||||
* AddrFetch connections are short lived connections used to solicit
|
||||
* addresses from peers. These are initiated to addresses submitted via the
|
||||
* -seednode command line argument, or under certain conditions when the
|
||||
* AddrMan is empty.
|
||||
*/
|
||||
ADDR_FETCH,
|
||||
};
|
||||
|
||||
class NetEventsInterface;
|
||||
|
@ -209,7 +251,7 @@ public:
|
|||
bool GetNetworkActive() const { return fNetworkActive; };
|
||||
bool GetUseAddrmanOutgoing() const { return m_use_addrman_outgoing; };
|
||||
void SetNetworkActive(bool active);
|
||||
void OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound = nullptr, const char *strDest = nullptr, ConnectionType conn_type = ConnectionType::OUTBOUND);
|
||||
void OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant* grantOutbound, const char* strDest, ConnectionType conn_type);
|
||||
bool CheckIncomingNonce(uint64_t nonce);
|
||||
|
||||
bool ForNode(NodeId id, std::function<bool(CNode* pnode)> func);
|
||||
|
@ -823,8 +865,8 @@ public:
|
|||
std::atomic_bool fPauseSend{false};
|
||||
|
||||
bool IsOutboundOrBlockRelayConn() const {
|
||||
switch(m_conn_type) {
|
||||
case ConnectionType::OUTBOUND:
|
||||
switch (m_conn_type) {
|
||||
case ConnectionType::OUTBOUND_FULL_RELAY:
|
||||
case ConnectionType::BLOCK_RELAY:
|
||||
return true;
|
||||
case ConnectionType::INBOUND:
|
||||
|
@ -832,13 +874,13 @@ public:
|
|||
case ConnectionType::ADDR_FETCH:
|
||||
case ConnectionType::FEELER:
|
||||
return false;
|
||||
}
|
||||
} // no default case, so the compiler can warn about missing cases
|
||||
|
||||
assert(false);
|
||||
}
|
||||
|
||||
bool IsFullOutboundConn() const {
|
||||
return m_conn_type == ConnectionType::OUTBOUND;
|
||||
return m_conn_type == ConnectionType::OUTBOUND_FULL_RELAY;
|
||||
}
|
||||
|
||||
bool IsManualConn() const {
|
||||
|
@ -861,17 +903,23 @@ public:
|
|||
return m_conn_type == ConnectionType::INBOUND;
|
||||
}
|
||||
|
||||
/* Whether we send addr messages over this connection */
|
||||
bool RelayAddrsWithConn() const
|
||||
{
|
||||
return m_conn_type != ConnectionType::BLOCK_RELAY;
|
||||
}
|
||||
|
||||
bool ExpectServicesFromConn() const {
|
||||
switch(m_conn_type) {
|
||||
switch (m_conn_type) {
|
||||
case ConnectionType::INBOUND:
|
||||
case ConnectionType::MANUAL:
|
||||
case ConnectionType::FEELER:
|
||||
return false;
|
||||
case ConnectionType::OUTBOUND:
|
||||
case ConnectionType::OUTBOUND_FULL_RELAY:
|
||||
case ConnectionType::BLOCK_RELAY:
|
||||
case ConnectionType::ADDR_FETCH:
|
||||
return true;
|
||||
}
|
||||
} // no default case, so the compiler can warn about missing cases
|
||||
|
||||
assert(false);
|
||||
}
|
||||
|
@ -886,13 +934,11 @@ public:
|
|||
|
||||
// flood relay
|
||||
std::vector<CAddress> vAddrToSend;
|
||||
std::unique_ptr<CRollingBloomFilter> m_addr_known = nullptr;
|
||||
std::unique_ptr<CRollingBloomFilter> m_addr_known{nullptr};
|
||||
bool fGetAddr{false};
|
||||
std::chrono::microseconds m_next_addr_send GUARDED_BY(cs_sendProcessing){0};
|
||||
std::chrono::microseconds m_next_local_addr_send GUARDED_BY(cs_sendProcessing){0};
|
||||
|
||||
bool IsAddrRelayPeer() const { return m_addr_known != nullptr; }
|
||||
|
||||
// List of block ids we still have announce.
|
||||
// There is no final sorting before sending, as they are always sent immediately
|
||||
// and in the order requested.
|
||||
|
|
|
@ -882,8 +882,9 @@ void PeerLogicValidation::InitializeNode(CNode *pnode) {
|
|||
LOCK(g_peer_mutex);
|
||||
g_peer_map.emplace_hint(g_peer_map.end(), nodeid, std::move(peer));
|
||||
}
|
||||
if(!pnode->IsInboundConn())
|
||||
if (!pnode->IsInboundConn()) {
|
||||
PushNodeVersion(*pnode, m_connman, GetTime());
|
||||
}
|
||||
}
|
||||
|
||||
void PeerLogicValidation::ReattemptInitialBroadcast(CScheduler& scheduler) const
|
||||
|
@ -1531,7 +1532,7 @@ static void RelayAddress(const CAddress& addr, bool fReachable, const CConnman&
|
|||
assert(nRelayNodes <= best.size());
|
||||
|
||||
auto sortfunc = [&best, &hasher, nRelayNodes](CNode* pnode) {
|
||||
if (pnode->IsAddrRelayPeer()) {
|
||||
if (pnode->RelayAddrsWithConn()) {
|
||||
uint64_t hashKey = CSipHasher(hasher).Write(pnode->GetId()).Finalize();
|
||||
for (unsigned int i = 0; i < nRelayNodes; i++) {
|
||||
if (hashKey > best[i].first) {
|
||||
|
@ -2017,7 +2018,7 @@ static void ProcessHeadersMessage(CNode& pfrom, CConnman& connman, ChainstateMan
|
|||
}
|
||||
}
|
||||
|
||||
if (!pfrom.fDisconnect && pfrom.IsOutboundOrBlockRelayConn() && nodestate->pindexBestKnownBlock != nullptr && pfrom.m_tx_relay != nullptr) {
|
||||
if (!pfrom.fDisconnect && pfrom.IsFullOutboundConn() && nodestate->pindexBestKnownBlock != nullptr) {
|
||||
// If this is an outbound full-relay peer, check to see if we should protect
|
||||
// it from the bad/lagging chain logic.
|
||||
// Note that block-relay-only peers are already implicitly protected, so we
|
||||
|
@ -2458,9 +2459,23 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
|
|||
UpdatePreferredDownload(pfrom, State(pfrom.GetId()));
|
||||
}
|
||||
|
||||
if (!pfrom.IsInboundConn() && pfrom.IsAddrRelayPeer())
|
||||
{
|
||||
// Advertise our address
|
||||
if (!pfrom.IsInboundConn() && !pfrom.IsBlockOnlyConn()) {
|
||||
// For outbound peers, we try to relay our address (so that other
|
||||
// nodes can try to find us more quickly, as we have no guarantee
|
||||
// that an outbound peer is even aware of how to reach us) and do a
|
||||
// one-time address fetch (to help populate/update our addrman). If
|
||||
// we're starting up for the first time, our addrman may be pretty
|
||||
// empty and no one will know who we are, so these mechanisms are
|
||||
// important to help us connect to the network.
|
||||
//
|
||||
// We also update the addrman to record connection success for
|
||||
// these peers (which include OUTBOUND_FULL_RELAY and FEELER
|
||||
// connections) so that addrman will have an up-to-date notion of
|
||||
// which peers are online and available.
|
||||
//
|
||||
// We skip these operations for BLOCK_RELAY peers to avoid
|
||||
// potentially leaking information about our BLOCK_RELAY
|
||||
// connections via the addrman or address relay.
|
||||
if (fListen && !::ChainstateActive().IsInitialBlockDownload())
|
||||
{
|
||||
CAddress addr = GetLocalAddress(&pfrom.addr, pfrom.GetLocalServices());
|
||||
|
@ -2479,6 +2494,9 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
|
|||
// Get recent addresses
|
||||
m_connman.PushMessage(&pfrom, CNetMsgMaker(nSendVersion).Make(NetMsgType::GETADDR));
|
||||
pfrom.fGetAddr = true;
|
||||
|
||||
// Moves address from New to Tried table in Addrman, resolves
|
||||
// tried-table collisions, etc.
|
||||
m_connman.MarkAddressGood(pfrom.addr);
|
||||
}
|
||||
|
||||
|
@ -2584,7 +2602,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
|
|||
std::vector<CAddress> vAddr;
|
||||
vRecv >> vAddr;
|
||||
|
||||
if (!pfrom.IsAddrRelayPeer()) {
|
||||
if (!pfrom.RelayAddrsWithConn()) {
|
||||
return;
|
||||
}
|
||||
if (vAddr.size() > MAX_ADDR_TO_SEND)
|
||||
|
@ -3522,7 +3540,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
|
|||
LogPrint(BCLog::NET, "Ignoring \"getaddr\" from outbound connection. peer=%d\n", pfrom.GetId());
|
||||
return;
|
||||
}
|
||||
if (!pfrom.IsAddrRelayPeer()) {
|
||||
if (!pfrom.RelayAddrsWithConn()) {
|
||||
LogPrint(BCLog::NET, "Ignoring \"getaddr\" from block-relay-only connection. peer=%d\n", pfrom.GetId());
|
||||
return;
|
||||
}
|
||||
|
@ -4122,7 +4140,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
|
|||
int64_t nNow = GetTimeMicros();
|
||||
auto current_time = GetTime<std::chrono::microseconds>();
|
||||
|
||||
if (pto->IsAddrRelayPeer() && !::ChainstateActive().IsInitialBlockDownload() && pto->m_next_local_addr_send < current_time) {
|
||||
if (pto->RelayAddrsWithConn() && !::ChainstateActive().IsInitialBlockDownload() && pto->m_next_local_addr_send < current_time) {
|
||||
AdvertiseLocal(pto);
|
||||
pto->m_next_local_addr_send = PoissonNextSend(current_time, AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL);
|
||||
}
|
||||
|
@ -4130,7 +4148,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
|
|||
//
|
||||
// Message: addr
|
||||
//
|
||||
if (pto->IsAddrRelayPeer() && pto->m_next_addr_send < current_time) {
|
||||
if (pto->RelayAddrsWithConn() && pto->m_next_addr_send < current_time) {
|
||||
pto->m_next_addr_send = PoissonNextSend(current_time, AVG_ADDRESS_BROADCAST_INTERVAL);
|
||||
std::vector<CAddress> vAddr;
|
||||
vAddr.reserve(pto->vAddrToSend.size());
|
||||
|
|
|
@ -84,7 +84,7 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
|
|||
|
||||
// Mock an outbound peer
|
||||
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
|
||||
CNode dummyNode1(id++, ServiceFlags(NODE_NETWORK|NODE_WITNESS), 0, INVALID_SOCKET, addr1, 0, 0, CAddress(), "", ConnectionType::OUTBOUND);
|
||||
CNode dummyNode1(id++, ServiceFlags(NODE_NETWORK | NODE_WITNESS), 0, INVALID_SOCKET, addr1, 0, 0, CAddress(), "", ConnectionType::OUTBOUND_FULL_RELAY);
|
||||
dummyNode1.SetSendVersion(PROTOCOL_VERSION);
|
||||
|
||||
peerLogic->InitializeNode(&dummyNode1);
|
||||
|
@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
|
|||
static void AddRandomOutboundPeer(std::vector<CNode *> &vNodes, PeerLogicValidation &peerLogic, CConnmanTest* connman)
|
||||
{
|
||||
CAddress addr(ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE);
|
||||
vNodes.emplace_back(new CNode(id++, ServiceFlags(NODE_NETWORK|NODE_WITNESS), 0, INVALID_SOCKET, addr, 0, 0, CAddress(), "", ConnectionType::OUTBOUND));
|
||||
vNodes.emplace_back(new CNode(id++, ServiceFlags(NODE_NETWORK | NODE_WITNESS), 0, INVALID_SOCKET, addr, 0, 0, CAddress(), "", ConnectionType::OUTBOUND_FULL_RELAY));
|
||||
CNode &node = *vNodes.back();
|
||||
node.SetSendVersion(PROTOCOL_VERSION);
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
|
|||
fuzzed_data_provider.ConsumeIntegral<uint64_t>(),
|
||||
*address_bind,
|
||||
fuzzed_data_provider.ConsumeRandomLengthString(32),
|
||||
fuzzed_data_provider.PickValueInArray({ConnectionType::INBOUND, ConnectionType::OUTBOUND, ConnectionType::MANUAL, ConnectionType::FEELER, ConnectionType::BLOCK_RELAY, ConnectionType::ADDR_FETCH})};
|
||||
fuzzed_data_provider.PickValueInArray({ConnectionType::INBOUND, ConnectionType::OUTBOUND_FULL_RELAY, ConnectionType::MANUAL, ConnectionType::FEELER, ConnectionType::BLOCK_RELAY, ConnectionType::ADDR_FETCH})};
|
||||
while (fuzzed_data_provider.ConsumeBool()) {
|
||||
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 12)) {
|
||||
case 0: {
|
||||
|
@ -147,7 +147,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
|
|||
const int ref_count = node.GetRefCount();
|
||||
assert(ref_count >= 0);
|
||||
(void)node.GetSendVersion();
|
||||
(void)node.IsAddrRelayPeer();
|
||||
(void)node.RelayAddrsWithConn();
|
||||
|
||||
const NetPermissionFlags net_permission_flags = fuzzed_data_provider.ConsumeBool() ?
|
||||
fuzzed_data_provider.PickValueInArray<NetPermissionFlags>({NetPermissionFlags::PF_NONE, NetPermissionFlags::PF_BLOOMFILTER, NetPermissionFlags::PF_RELAY, NetPermissionFlags::PF_FORCERELAY, NetPermissionFlags::PF_NOBAN, NetPermissionFlags::PF_MEMPOOL, NetPermissionFlags::PF_ISIMPLICIT, NetPermissionFlags::PF_ALL}) :
|
||||
|
|
|
@ -68,7 +68,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
|
|||
return;
|
||||
}
|
||||
CDataStream random_bytes_data_stream{fuzzed_data_provider.ConsumeRemainingBytes<unsigned char>(), SER_NETWORK, PROTOCOL_VERSION};
|
||||
CNode& p2p_node = *MakeUnique<CNode>(0, ServiceFlags(NODE_NETWORK | NODE_WITNESS | NODE_BLOOM), 0, INVALID_SOCKET, CAddress{CService{in_addr{0x0100007f}, 7777}, NODE_NETWORK}, 0, 0, CAddress{}, std::string{}, ConnectionType::OUTBOUND).release();
|
||||
CNode& p2p_node = *MakeUnique<CNode>(0, ServiceFlags(NODE_NETWORK | NODE_WITNESS | NODE_BLOOM), 0, INVALID_SOCKET, CAddress{CService{in_addr{0x0100007f}, 7777}, NODE_NETWORK}, 0, 0, CAddress{}, std::string{}, ConnectionType::OUTBOUND_FULL_RELAY).release();
|
||||
p2p_node.fSuccessfullyConnected = true;
|
||||
p2p_node.nVersion = PROTOCOL_VERSION;
|
||||
p2p_node.SetSendVersion(PROTOCOL_VERSION);
|
||||
|
|
|
@ -44,7 +44,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
|
|||
const auto num_peers_to_add = fuzzed_data_provider.ConsumeIntegralInRange(1, 3);
|
||||
for (int i = 0; i < num_peers_to_add; ++i) {
|
||||
const ServiceFlags service_flags = ServiceFlags(fuzzed_data_provider.ConsumeIntegral<uint64_t>());
|
||||
const ConnectionType conn_type = fuzzed_data_provider.PickValueInArray({ConnectionType::INBOUND, ConnectionType::OUTBOUND, ConnectionType::MANUAL, ConnectionType::FEELER, ConnectionType::BLOCK_RELAY, ConnectionType::ADDR_FETCH});
|
||||
const ConnectionType conn_type = fuzzed_data_provider.PickValueInArray({ConnectionType::INBOUND, ConnectionType::OUTBOUND_FULL_RELAY, ConnectionType::MANUAL, ConnectionType::FEELER, ConnectionType::BLOCK_RELAY, ConnectionType::ADDR_FETCH});
|
||||
peers.push_back(MakeUnique<CNode>(i, service_flags, 0, INVALID_SOCKET, CAddress{CService{in_addr{0x0100007f}, 7777}, NODE_NETWORK}, 0, 0, CAddress{}, std::string{}, conn_type).release());
|
||||
CNode& p2p_node = *peers.back();
|
||||
|
||||
|
|
|
@ -183,10 +183,20 @@ BOOST_AUTO_TEST_CASE(cnode_simple_test)
|
|||
CAddress addr = CAddress(CService(ipv4Addr, 7777), NODE_NETWORK);
|
||||
std::string pszDest;
|
||||
|
||||
std::unique_ptr<CNode> pnode1 = MakeUnique<CNode>(id++, NODE_NETWORK, height, hSocket, addr, 0, 0, CAddress(), pszDest, ConnectionType::OUTBOUND);
|
||||
std::unique_ptr<CNode> pnode1 = MakeUnique<CNode>(id++, NODE_NETWORK, height, hSocket, addr, 0, 0, CAddress(), pszDest, ConnectionType::OUTBOUND_FULL_RELAY);
|
||||
BOOST_CHECK(pnode1->IsFullOutboundConn() == true);
|
||||
BOOST_CHECK(pnode1->IsManualConn() == false);
|
||||
BOOST_CHECK(pnode1->IsBlockOnlyConn() == false);
|
||||
BOOST_CHECK(pnode1->IsFeelerConn() == false);
|
||||
BOOST_CHECK(pnode1->IsAddrFetchConn() == false);
|
||||
BOOST_CHECK(pnode1->IsInboundConn() == false);
|
||||
|
||||
std::unique_ptr<CNode> pnode2 = MakeUnique<CNode>(id++, NODE_NETWORK, height, hSocket, addr, 1, 1, CAddress(), pszDest, ConnectionType::INBOUND);
|
||||
BOOST_CHECK(pnode2->IsFullOutboundConn() == false);
|
||||
BOOST_CHECK(pnode2->IsManualConn() == false);
|
||||
BOOST_CHECK(pnode2->IsBlockOnlyConn() == false);
|
||||
BOOST_CHECK(pnode2->IsFeelerConn() == false);
|
||||
BOOST_CHECK(pnode2->IsAddrFetchConn() == false);
|
||||
BOOST_CHECK(pnode2->IsInboundConn() == true);
|
||||
}
|
||||
|
||||
|
@ -283,7 +293,7 @@ BOOST_AUTO_TEST_CASE(ipv4_peer_with_ipv6_addrMe_test)
|
|||
in_addr ipv4AddrPeer;
|
||||
ipv4AddrPeer.s_addr = 0xa0b0c001;
|
||||
CAddress addr = CAddress(CService(ipv4AddrPeer, 7777), NODE_NETWORK);
|
||||
std::unique_ptr<CNode> pnode = MakeUnique<CNode>(0, NODE_NETWORK, 0, INVALID_SOCKET, addr, 0, 0, CAddress{}, std::string{}, ConnectionType::OUTBOUND);
|
||||
std::unique_ptr<CNode> pnode = MakeUnique<CNode>(0, NODE_NETWORK, 0, INVALID_SOCKET, addr, 0, 0, CAddress{}, std::string{}, ConnectionType::OUTBOUND_FULL_RELAY);
|
||||
pnode->fSuccessfullyConnected.store(true);
|
||||
|
||||
// the peer claims to be reaching us via IPv6
|
||||
|
|
Loading…
Add table
Reference in a new issue