Skip to content

Commit 1a7dec7

Browse files
author
MarcoFalke
committed
Merge #21571: test: make sure non-IP peers get discouraged and disconnected (vasild)
81747b2 test: make sure non-IP peers get discouraged and disconnected (Vasil Dimov) 637bb6d test: also check disconnect in denialofservice_tests/peer_discouragement (Vasil Dimov) 4d6e246 test: use pointers in denialofservice_tests/peer_discouragement (Vasil Dimov) Pull request description: Split up from #20966, so that it can be backported easier. Merging this ahead of #20966 will also reduce the number of conflicts for that pull. ACKs for top commit: jonatack: ACK 81747b2 Tree-SHA512: 8f0e30b95baba7f056920d7fc3b37bd49ee13e69392fe80e2d333c6bb09fd25f4603249301b8795cca26a2f2d15b9f8904798a55cd9c04fd28afb316e95c551c
2 parents 02fb5bd + 81747b2 commit 1a7dec7

File tree

1 file changed

+79
-30
lines changed

1 file changed

+79
-30
lines changed

src/test/denialofservice_tests.cpp

Lines changed: 79 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include <test/util/setup_common.h>
2424

25+
#include <array>
2526
#include <stdint.h>
2627

2728
#include <boost/test/unit_test.hpp>
@@ -209,46 +210,94 @@ BOOST_AUTO_TEST_CASE(peer_discouragement)
209210
{
210211
const CChainParams& chainparams = Params();
211212
auto banman = std::make_unique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);
212-
auto connman = std::make_unique<CConnman>(0x1337, 0x1337, *m_node.addrman);
213+
auto connman = std::make_unique<CConnmanTest>(0x1337, 0x1337, *m_node.addrman);
213214
auto peerLogic = PeerManager::make(chainparams, *connman, *m_node.addrman, banman.get(),
214215
*m_node.scheduler, *m_node.chainman, *m_node.mempool, false);
215216

217+
CNetAddr tor_netaddr;
218+
BOOST_REQUIRE(
219+
tor_netaddr.SetSpecial("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"));
220+
const CService tor_service{tor_netaddr, Params().GetDefaultPort()};
221+
222+
const std::array<CAddress, 3> addr{CAddress{ip(0xa0b0c001), NODE_NONE},
223+
CAddress{ip(0xa0b0c002), NODE_NONE},
224+
CAddress{tor_service, NODE_NONE}};
225+
226+
const CNetAddr other_addr{ip(0xa0b0ff01)}; // Not any of addr[].
227+
228+
std::array<CNode*, 3> nodes;
229+
216230
banman->ClearBanned();
217-
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
218-
CNode dummyNode1(id++, NODE_NETWORK, INVALID_SOCKET, addr1, /* nKeyedNetGroupIn */ 0, /* nLocalHostNonceIn */ 0, CAddress(), /* pszDest */ "", ConnectionType::INBOUND, /* inbound_onion */ false);
219-
dummyNode1.SetCommonVersion(PROTOCOL_VERSION);
220-
peerLogic->InitializeNode(&dummyNode1);
221-
dummyNode1.fSuccessfullyConnected = true;
222-
peerLogic->Misbehaving(dummyNode1.GetId(), DISCOURAGEMENT_THRESHOLD, /* message */ ""); // Should be discouraged
231+
nodes[0] = new CNode{id++, NODE_NETWORK, INVALID_SOCKET, addr[0], /* nKeyedNetGroupIn */ 0,
232+
/* nLocalHostNonceIn */ 0, CAddress(), /* pszDest */ "",
233+
ConnectionType::INBOUND, /* inbound_onion */ false};
234+
nodes[0]->SetCommonVersion(PROTOCOL_VERSION);
235+
peerLogic->InitializeNode(nodes[0]);
236+
nodes[0]->fSuccessfullyConnected = true;
237+
connman->AddNode(*nodes[0]);
238+
peerLogic->Misbehaving(nodes[0]->GetId(), DISCOURAGEMENT_THRESHOLD, /* message */ ""); // Should be discouraged
223239
{
224-
LOCK(dummyNode1.cs_sendProcessing);
225-
BOOST_CHECK(peerLogic->SendMessages(&dummyNode1));
240+
LOCK(nodes[0]->cs_sendProcessing);
241+
BOOST_CHECK(peerLogic->SendMessages(nodes[0]));
226242
}
227-
BOOST_CHECK(banman->IsDiscouraged(addr1));
228-
BOOST_CHECK(!banman->IsDiscouraged(ip(0xa0b0c001|0x0000ff00))); // Different IP, not discouraged
229-
230-
CAddress addr2(ip(0xa0b0c002), NODE_NONE);
231-
CNode dummyNode2(id++, NODE_NETWORK, INVALID_SOCKET, addr2, /* nKeyedNetGroupIn */ 1, /* nLocalHostNonceIn */ 1, CAddress(), /* pszDest */ "", ConnectionType::INBOUND, /* inbound_onion */ false);
232-
dummyNode2.SetCommonVersion(PROTOCOL_VERSION);
233-
peerLogic->InitializeNode(&dummyNode2);
234-
dummyNode2.fSuccessfullyConnected = true;
235-
peerLogic->Misbehaving(dummyNode2.GetId(), DISCOURAGEMENT_THRESHOLD - 1, /* message */ "");
243+
BOOST_CHECK(banman->IsDiscouraged(addr[0]));
244+
BOOST_CHECK(nodes[0]->fDisconnect);
245+
BOOST_CHECK(!banman->IsDiscouraged(other_addr)); // Different address, not discouraged
246+
247+
nodes[1] = new CNode{id++, NODE_NETWORK, INVALID_SOCKET, addr[1], /* nKeyedNetGroupIn */ 1,
248+
/* nLocalHostNonceIn */ 1, CAddress(), /* pszDest */ "",
249+
ConnectionType::INBOUND, /* inbound_onion */ false};
250+
nodes[1]->SetCommonVersion(PROTOCOL_VERSION);
251+
peerLogic->InitializeNode(nodes[1]);
252+
nodes[1]->fSuccessfullyConnected = true;
253+
connman->AddNode(*nodes[1]);
254+
peerLogic->Misbehaving(nodes[1]->GetId(), DISCOURAGEMENT_THRESHOLD - 1, /* message */ "");
236255
{
237-
LOCK(dummyNode2.cs_sendProcessing);
238-
BOOST_CHECK(peerLogic->SendMessages(&dummyNode2));
256+
LOCK(nodes[1]->cs_sendProcessing);
257+
BOOST_CHECK(peerLogic->SendMessages(nodes[1]));
239258
}
240-
BOOST_CHECK(!banman->IsDiscouraged(addr2)); // 2 not discouraged yet...
241-
BOOST_CHECK(banman->IsDiscouraged(addr1)); // ... but 1 still should be
242-
peerLogic->Misbehaving(dummyNode2.GetId(), 1, /* message */ ""); // 2 reaches discouragement threshold
259+
// [0] is still discouraged/disconnected.
260+
BOOST_CHECK(banman->IsDiscouraged(addr[0]));
261+
BOOST_CHECK(nodes[0]->fDisconnect);
262+
// [1] is not discouraged/disconnected yet.
263+
BOOST_CHECK(!banman->IsDiscouraged(addr[1]));
264+
BOOST_CHECK(!nodes[1]->fDisconnect);
265+
peerLogic->Misbehaving(nodes[1]->GetId(), 1, /* message */ ""); // [1] reaches discouragement threshold
243266
{
244-
LOCK(dummyNode2.cs_sendProcessing);
245-
BOOST_CHECK(peerLogic->SendMessages(&dummyNode2));
267+
LOCK(nodes[1]->cs_sendProcessing);
268+
BOOST_CHECK(peerLogic->SendMessages(nodes[1]));
246269
}
247-
BOOST_CHECK(banman->IsDiscouraged(addr1)); // Expect both 1 and 2
248-
BOOST_CHECK(banman->IsDiscouraged(addr2)); // to be discouraged now
249-
250-
peerLogic->FinalizeNode(dummyNode1);
251-
peerLogic->FinalizeNode(dummyNode2);
270+
// Expect both [0] and [1] to be discouraged/disconnected now.
271+
BOOST_CHECK(banman->IsDiscouraged(addr[0]));
272+
BOOST_CHECK(nodes[0]->fDisconnect);
273+
BOOST_CHECK(banman->IsDiscouraged(addr[1]));
274+
BOOST_CHECK(nodes[1]->fDisconnect);
275+
276+
// Make sure non-IP peers are discouraged and disconnected properly.
277+
278+
nodes[2] = new CNode{id++, NODE_NETWORK, INVALID_SOCKET, addr[2], /* nKeyedNetGroupIn */ 1,
279+
/* nLocalHostNonceIn */ 1, CAddress(), /* pszDest */ "",
280+
ConnectionType::OUTBOUND_FULL_RELAY, /* inbound_onion */ false};
281+
nodes[2]->SetCommonVersion(PROTOCOL_VERSION);
282+
peerLogic->InitializeNode(nodes[2]);
283+
nodes[2]->fSuccessfullyConnected = true;
284+
connman->AddNode(*nodes[2]);
285+
peerLogic->Misbehaving(nodes[2]->GetId(), DISCOURAGEMENT_THRESHOLD, /* message */ "");
286+
{
287+
LOCK(nodes[2]->cs_sendProcessing);
288+
BOOST_CHECK(peerLogic->SendMessages(nodes[2]));
289+
}
290+
BOOST_CHECK(banman->IsDiscouraged(addr[0]));
291+
BOOST_CHECK(banman->IsDiscouraged(addr[1]));
292+
BOOST_CHECK(banman->IsDiscouraged(addr[2]));
293+
BOOST_CHECK(nodes[0]->fDisconnect);
294+
BOOST_CHECK(nodes[1]->fDisconnect);
295+
BOOST_CHECK(nodes[2]->fDisconnect);
296+
297+
for (CNode* node : nodes) {
298+
peerLogic->FinalizeNode(*node);
299+
}
300+
connman->ClearNodes();
252301
}
253302

254303
BOOST_AUTO_TEST_CASE(DoS_bantime)

0 commit comments

Comments
 (0)