|
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