The copy in PeerLogicValidation can be used instead.
Github-Pull: #10756
Rebased-From: 80e2e9d0ce
tags/v0.15.1
@@ -1110,7 +1110,7 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) { | |||
CNode* pnode = new CNode(id, nLocalServices, GetBestHeight(), hSocket, addr, CalculateKeyedNetGroup(addr), nonce, addr_bind, "", true); | |||
pnode->AddRef(); | |||
pnode->fWhitelisted = whitelisted; | |||
m_msgproc->InitializeNode(pnode, this); | |||
m_msgproc->InitializeNode(pnode); | |||
LogPrint(BCLog::NET, "connection from %s accepted\n", addr.ToString()); | |||
@@ -1962,7 +1962,7 @@ bool CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFai | |||
if (manual_connection) | |||
pnode->m_manual_connection = true; | |||
m_msgproc->InitializeNode(pnode, this); | |||
m_msgproc->InitializeNode(pnode); | |||
{ | |||
LOCK(cs_vNodes); | |||
vNodes.push_back(pnode); | |||
@@ -1992,14 +1992,14 @@ void CConnman::ThreadMessageHandler() | |||
continue; | |||
// Receive messages | |||
bool fMoreNodeWork = m_msgproc->ProcessMessages(pnode, this, flagInterruptMsgProc); | |||
bool fMoreNodeWork = m_msgproc->ProcessMessages(pnode, flagInterruptMsgProc); | |||
fMoreWork |= (fMoreNodeWork && !pnode->fPauseSend); | |||
if (flagInterruptMsgProc) | |||
return; | |||
// Send messages | |||
{ | |||
LOCK(pnode->cs_sendProcessing); | |||
m_msgproc->SendMessages(pnode, this, flagInterruptMsgProc); | |||
m_msgproc->SendMessages(pnode, flagInterruptMsgProc); | |||
} | |||
if (flagInterruptMsgProc) |
@@ -444,9 +444,9 @@ struct CombinerAll | |||
class NetEventsInterface | |||
{ | |||
public: | |||
virtual bool ProcessMessages(CNode* pnode, CConnman* connman, std::atomic<bool>& interrupt) = 0; | |||
virtual bool SendMessages(CNode* pnode, CConnman* connman, std::atomic<bool>& interrupt) = 0; | |||
virtual void InitializeNode(CNode* pnode, CConnman* connman) = 0; | |||
virtual bool ProcessMessages(CNode* pnode, std::atomic<bool>& interrupt) = 0; | |||
virtual bool SendMessages(CNode* pnode, std::atomic<bool>& interrupt) = 0; | |||
virtual void InitializeNode(CNode* pnode) = 0; | |||
virtual void FinalizeNode(NodeId id, bool& update_connection_time) = 0; | |||
}; | |||
@@ -495,7 +495,7 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<con | |||
} // namespace | |||
void PeerLogicValidation::InitializeNode(CNode *pnode, CConnman* connman) { | |||
void PeerLogicValidation::InitializeNode(CNode *pnode) { | |||
CAddress addr = pnode->addr; | |||
std::string addrName = pnode->GetAddrName(); | |||
NodeId nodeid = pnode->GetId(); | |||
@@ -2652,7 +2652,7 @@ static bool SendRejectsAndCheckIfBanned(CNode* pnode, CConnman* connman) | |||
return false; | |||
} | |||
bool PeerLogicValidation::ProcessMessages(CNode* pfrom, CConnman* connman, std::atomic<bool>& interruptMsgProc) | |||
bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& interruptMsgProc) | |||
{ | |||
const CChainParams& chainparams = Params(); | |||
// | |||
@@ -2789,7 +2789,7 @@ public: | |||
} | |||
}; | |||
bool PeerLogicValidation::SendMessages(CNode* pto, CConnman* connman, std::atomic<bool>& interruptMsgProc) | |||
bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptMsgProc) | |||
{ | |||
const Consensus::Params& consensusParams = Params().GetConsensus(); | |||
{ |
@@ -35,19 +35,18 @@ public: | |||
void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock) override; | |||
void InitializeNode(CNode* pnode, CConnman* connman) override; | |||
void InitializeNode(CNode* pnode) override; | |||
void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) override; | |||
/** Process protocol messages received from a given node */ | |||
bool ProcessMessages(CNode* pfrom, CConnman* connman, std::atomic<bool>& interrupt) override; | |||
bool ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt) override; | |||
/** | |||
* Send queued protocol messages to be sent to a give node. | |||
* | |||
* @param[in] pto The node which we are sending messages to. | |||
* @param[in] connman The connection manager for that node. | |||
* @param[in] interrupt Interrupt condition for processing threads | |||
* @return True if there is more work to be done | |||
*/ | |||
bool SendMessages(CNode* pto, CConnman* connman, std::atomic<bool>& interrupt) override; | |||
bool SendMessages(CNode* pto, std::atomic<bool>& interrupt) override; | |||
}; | |||
struct CNodeStateStats { |
@@ -50,26 +50,26 @@ BOOST_AUTO_TEST_CASE(DoS_banning) | |||
CAddress addr1(ip(0xa0b0c001), NODE_NONE); | |||
CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 0, 0, CAddress(), "", true); | |||
dummyNode1.SetSendVersion(PROTOCOL_VERSION); | |||
peerLogic->InitializeNode(&dummyNode1, connman); | |||
peerLogic->InitializeNode(&dummyNode1); | |||
dummyNode1.nVersion = 1; | |||
dummyNode1.fSuccessfullyConnected = true; | |||
Misbehaving(dummyNode1.GetId(), 100); // Should get banned | |||
peerLogic->SendMessages(&dummyNode1, connman, interruptDummy); | |||
peerLogic->SendMessages(&dummyNode1, interruptDummy); | |||
BOOST_CHECK(connman->IsBanned(addr1)); | |||
BOOST_CHECK(!connman->IsBanned(ip(0xa0b0c001|0x0000ff00))); // Different IP, not banned | |||
CAddress addr2(ip(0xa0b0c002), NODE_NONE); | |||
CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, 1, CAddress(), "", true); | |||
dummyNode2.SetSendVersion(PROTOCOL_VERSION); | |||
peerLogic->InitializeNode(&dummyNode2, connman); | |||
peerLogic->InitializeNode(&dummyNode2); | |||
dummyNode2.nVersion = 1; | |||
dummyNode2.fSuccessfullyConnected = true; | |||
Misbehaving(dummyNode2.GetId(), 50); | |||
peerLogic->SendMessages(&dummyNode2, connman, interruptDummy); | |||
peerLogic->SendMessages(&dummyNode2, interruptDummy); | |||
BOOST_CHECK(!connman->IsBanned(addr2)); // 2 not banned yet... | |||
BOOST_CHECK(connman->IsBanned(addr1)); // ... but 1 still should be | |||
Misbehaving(dummyNode2.GetId(), 50); | |||
peerLogic->SendMessages(&dummyNode2, connman, interruptDummy); | |||
peerLogic->SendMessages(&dummyNode2, interruptDummy); | |||
BOOST_CHECK(connman->IsBanned(addr2)); | |||
} | |||
@@ -82,17 +82,17 @@ BOOST_AUTO_TEST_CASE(DoS_banscore) | |||
CAddress addr1(ip(0xa0b0c001), NODE_NONE); | |||
CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 3, 1, CAddress(), "", true); | |||
dummyNode1.SetSendVersion(PROTOCOL_VERSION); | |||
peerLogic->InitializeNode(&dummyNode1, connman); | |||
peerLogic->InitializeNode(&dummyNode1); | |||
dummyNode1.nVersion = 1; | |||
dummyNode1.fSuccessfullyConnected = true; | |||
Misbehaving(dummyNode1.GetId(), 100); | |||
peerLogic->SendMessages(&dummyNode1, connman, interruptDummy); | |||
peerLogic->SendMessages(&dummyNode1, interruptDummy); | |||
BOOST_CHECK(!connman->IsBanned(addr1)); | |||
Misbehaving(dummyNode1.GetId(), 10); | |||
peerLogic->SendMessages(&dummyNode1, connman, interruptDummy); | |||
peerLogic->SendMessages(&dummyNode1, interruptDummy); | |||
BOOST_CHECK(!connman->IsBanned(addr1)); | |||
Misbehaving(dummyNode1.GetId(), 1); | |||
peerLogic->SendMessages(&dummyNode1, connman, interruptDummy); | |||
peerLogic->SendMessages(&dummyNode1, interruptDummy); | |||
BOOST_CHECK(connman->IsBanned(addr1)); | |||
gArgs.ForceSetArg("-banscore", std::to_string(DEFAULT_BANSCORE_THRESHOLD)); | |||
} | |||
@@ -108,12 +108,12 @@ BOOST_AUTO_TEST_CASE(DoS_bantime) | |||
CAddress addr(ip(0xa0b0c001), NODE_NONE); | |||
CNode dummyNode(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr, 4, 4, CAddress(), "", true); | |||
dummyNode.SetSendVersion(PROTOCOL_VERSION); | |||
peerLogic->InitializeNode(&dummyNode, connman); | |||
peerLogic->InitializeNode(&dummyNode); | |||
dummyNode.nVersion = 1; | |||
dummyNode.fSuccessfullyConnected = true; | |||
Misbehaving(dummyNode.GetId(), 100); | |||
peerLogic->SendMessages(&dummyNode, connman, interruptDummy); | |||
peerLogic->SendMessages(&dummyNode, interruptDummy); | |||
BOOST_CHECK(connman->IsBanned(addr)); | |||
SetMockTime(nStartTime+60*60); |