|
22 | 22 |
|
23 | 23 | #include <test/util/setup_common.h>
|
24 | 24 |
|
| 25 | +#include <array> |
25 | 26 | #include <stdint.h>
|
26 | 27 |
|
27 | 28 | #include <boost/test/unit_test.hpp>
|
@@ -209,46 +210,94 @@ BOOST_AUTO_TEST_CASE(peer_discouragement)
|
209 | 210 | {
|
210 | 211 | const CChainParams& chainparams = Params();
|
211 | 212 | 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); |
213 | 214 | auto peerLogic = PeerManager::make(chainparams, *connman, *m_node.addrman, banman.get(),
|
214 | 215 | *m_node.scheduler, *m_node.chainman, *m_node.mempool, false);
|
215 | 216 |
|
| 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 | + |
216 | 230 | 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 |
223 | 239 | {
|
224 |
| - LOCK(dummyNode1.cs_sendProcessing); |
225 |
| - BOOST_CHECK(peerLogic->SendMessages(&dummyNode1)); |
| 240 | + LOCK(nodes[0]->cs_sendProcessing); |
| 241 | + BOOST_CHECK(peerLogic->SendMessages(nodes[0])); |
226 | 242 | }
|
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 */ ""); |
236 | 255 | {
|
237 |
| - LOCK(dummyNode2.cs_sendProcessing); |
238 |
| - BOOST_CHECK(peerLogic->SendMessages(&dummyNode2)); |
| 256 | + LOCK(nodes[1]->cs_sendProcessing); |
| 257 | + BOOST_CHECK(peerLogic->SendMessages(nodes[1])); |
239 | 258 | }
|
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 |
243 | 266 | {
|
244 |
| - LOCK(dummyNode2.cs_sendProcessing); |
245 |
| - BOOST_CHECK(peerLogic->SendMessages(&dummyNode2)); |
| 267 | + LOCK(nodes[1]->cs_sendProcessing); |
| 268 | + BOOST_CHECK(peerLogic->SendMessages(nodes[1])); |
246 | 269 | }
|
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(); |
252 | 301 | }
|
253 | 302 |
|
254 | 303 | BOOST_AUTO_TEST_CASE(DoS_bantime)
|
|
0 commit comments