Skip to content

Commit 15bf863

Browse files
committed
Don't require services in -addnode
1 parent 5e7ab16 commit 15bf863

File tree

6 files changed

+64
-63
lines changed

6 files changed

+64
-63
lines changed

src/net.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ static std::vector<CAddress> convertSeed6(const std::vector<SeedSpec6> &vSeedsIn
162162
{
163163
struct in6_addr ip;
164164
memcpy(&ip, i->addr, sizeof(ip));
165-
CAddress addr(CService(ip, i->port));
165+
CAddress addr(CService(ip, i->port), NODE_NETWORK);
166166
addr.nTime = GetTime() - GetRand(nOneWeek) - nOneWeek;
167167
vSeedsOut.push_back(addr);
168168
}
@@ -179,9 +179,8 @@ CAddress GetLocalAddress(const CNetAddr *paddrPeer)
179179
CService addr;
180180
if (GetLocal(addr, paddrPeer))
181181
{
182-
ret = CAddress(addr);
182+
ret = CAddress(addr, nLocalServices);
183183
}
184-
ret.nServices = nLocalServices;
185184
ret.nTime = GetAdjustedTime();
186185
return ret;
187186
}
@@ -465,7 +464,7 @@ void CNode::PushVersion()
465464
int nBestHeight = GetNodeSignals().GetHeight().get_value_or(0);
466465

467466
int64_t nTime = (fInbound ? GetAdjustedTime() : GetTime());
468-
CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService("0.0.0.0",0)));
467+
CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService("0.0.0.0",0), addr.nServices));
469468
CAddress addrMe = GetLocalAddress(&addr);
470469
GetRandBytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce));
471470
if (fLogIPs)
@@ -1441,7 +1440,7 @@ void ThreadDNSAddressSeed()
14411440
} else {
14421441
std::vector<CNetAddr> vIPs;
14431442
std::vector<CAddress> vAdd;
1444-
uint64_t requiredServiceBits = NODE_NETWORK;
1443+
uint64_t requiredServiceBits = nRelevantServices;
14451444
if (LookupHost(seed.getHost(requiredServiceBits).c_str(), vIPs, 0, true))
14461445
{
14471446
BOOST_FOREACH(const CNetAddr& ip, vIPs)
@@ -1524,7 +1523,7 @@ void ThreadOpenConnections()
15241523
ProcessOneShot();
15251524
BOOST_FOREACH(const std::string& strAddr, mapMultiArgs["-connect"])
15261525
{
1527-
CAddress addr;
1526+
CAddress addr(CService(), 0);
15281527
OpenNetworkConnection(addr, false, NULL, strAddr.c_str());
15291528
for (int i = 0; i < 10 && i < nLoop; i++)
15301529
{
@@ -1674,7 +1673,9 @@ void ThreadOpenAddedConnections()
16741673
BOOST_FOREACH(std::vector<CService>& vserv, lservAddressesToAdd)
16751674
{
16761675
CSemaphoreGrant grant(*semOutbound);
1677-
OpenNetworkConnection(CAddress(vserv[i % vserv.size()]), false, &grant);
1676+
/* We want -addnode to work even for nodes that don't provide all
1677+
* wanted services, so pass in nServices=0 to CAddress. */
1678+
OpenNetworkConnection(CAddress(vserv[i % vserv.size()], 0), false, &grant);
16781679
MilliSleep(500);
16791680
}
16801681
MilliSleep(120000); // Retry every 2 minutes

src/protocol.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ CAddress::CAddress(CService ipIn, uint64_t nServicesIn) : CService(ipIn)
141141

142142
void CAddress::Init()
143143
{
144-
nServices = NODE_NETWORK;
144+
nServices = 0;
145145
nTime = 100000000;
146146
}
147147

src/protocol.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ class CAddress : public CService
251251
{
252252
public:
253253
CAddress();
254-
explicit CAddress(CService ipIn, uint64_t nServicesIn = NODE_NETWORK);
254+
explicit CAddress(CService ipIn, uint64_t nServicesIn);
255255

256256
void Init();
257257

src/test/DoS_tests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ BOOST_FIXTURE_TEST_SUITE(DoS_tests, TestingSetup)
4545
BOOST_AUTO_TEST_CASE(DoS_banning)
4646
{
4747
CNode::ClearBanned();
48-
CAddress addr1(ip(0xa0b0c001));
48+
CAddress addr1(ip(0xa0b0c001), 0);
4949
CNode dummyNode1(INVALID_SOCKET, addr1, "", true);
5050
dummyNode1.nVersion = 1;
5151
Misbehaving(dummyNode1.GetId(), 100); // Should get banned
5252
SendMessages(&dummyNode1);
5353
BOOST_CHECK(CNode::IsBanned(addr1));
5454
BOOST_CHECK(!CNode::IsBanned(ip(0xa0b0c001|0x0000ff00))); // Different IP, not banned
5555

56-
CAddress addr2(ip(0xa0b0c002));
56+
CAddress addr2(ip(0xa0b0c002), 0);
5757
CNode dummyNode2(INVALID_SOCKET, addr2, "", true);
5858
dummyNode2.nVersion = 1;
5959
Misbehaving(dummyNode2.GetId(), 50);
@@ -69,7 +69,7 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
6969
{
7070
CNode::ClearBanned();
7171
mapArgs["-banscore"] = "111"; // because 11 is my favorite number
72-
CAddress addr1(ip(0xa0b0c001));
72+
CAddress addr1(ip(0xa0b0c001), 0);
7373
CNode dummyNode1(INVALID_SOCKET, addr1, "", true);
7474
dummyNode1.nVersion = 1;
7575
Misbehaving(dummyNode1.GetId(), 100);
@@ -90,7 +90,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
9090
int64_t nStartTime = GetTime();
9191
SetMockTime(nStartTime); // Overrides future calls to GetTime()
9292

93-
CAddress addr(ip(0xa0b0c001));
93+
CAddress addr(ip(0xa0b0c001), 0);
9494
CNode dummyNode(INVALID_SOCKET, addr, "", true);
9595
dummyNode.nVersion = 1;
9696

src/test/addrman_tests.cpp

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,22 @@ BOOST_AUTO_TEST_CASE(addrman_simple)
6868

6969
// Test 2: Does Addrman::Add work as expected.
7070
CService addr1 = CService("250.1.1.1", 8333);
71-
addrman.Add(CAddress(addr1), source);
71+
addrman.Add(CAddress(addr1, 0), source);
7272
BOOST_CHECK(addrman.size() == 1);
7373
CAddrInfo addr_ret1 = addrman.Select();
7474
BOOST_CHECK(addr_ret1.ToString() == "250.1.1.1:8333");
7575

7676
// Test 3: Does IP address deduplication work correctly.
7777
// Expected dup IP should not be added.
7878
CService addr1_dup = CService("250.1.1.1", 8333);
79-
addrman.Add(CAddress(addr1_dup), source);
79+
addrman.Add(CAddress(addr1_dup, 0), source);
8080
BOOST_CHECK(addrman.size() == 1);
8181

8282

8383
// Test 5: New table has one addr and we add a diff addr we should
8484
// have two addrs.
8585
CService addr2 = CService("250.1.1.2", 8333);
86-
addrman.Add(CAddress(addr2), source);
86+
addrman.Add(CAddress(addr2, 0), source);
8787
BOOST_CHECK(addrman.size() == 2);
8888

8989
// Test 6: AddrMan::Clear() should empty the new table.
@@ -106,18 +106,18 @@ BOOST_AUTO_TEST_CASE(addrman_ports)
106106

107107
// Test 7; Addr with same IP but diff port does not replace existing addr.
108108
CService addr1 = CService("250.1.1.1", 8333);
109-
addrman.Add(CAddress(addr1), source);
109+
addrman.Add(CAddress(addr1, 0), source);
110110
BOOST_CHECK(addrman.size() == 1);
111111

112112
CService addr1_port = CService("250.1.1.1", 8334);
113-
addrman.Add(CAddress(addr1_port), source);
113+
addrman.Add(CAddress(addr1_port, 0), source);
114114
BOOST_CHECK(addrman.size() == 1);
115115
CAddrInfo addr_ret2 = addrman.Select();
116116
BOOST_CHECK(addr_ret2.ToString() == "250.1.1.1:8333");
117117

118118
// Test 8: Add same IP but diff port to tried table, it doesn't get added.
119119
// Perhaps this is not ideal behavior but it is the current behavior.
120-
addrman.Good(CAddress(addr1_port));
120+
addrman.Good(CAddress(addr1_port, 0));
121121
BOOST_CHECK(addrman.size() == 1);
122122
bool newOnly = true;
123123
CAddrInfo addr_ret3 = addrman.Select(newOnly);
@@ -136,15 +136,15 @@ BOOST_AUTO_TEST_CASE(addrman_select)
136136

137137
// Test 9: Select from new with 1 addr in new.
138138
CService addr1 = CService("250.1.1.1", 8333);
139-
addrman.Add(CAddress(addr1), source);
139+
addrman.Add(CAddress(addr1, 0), source);
140140
BOOST_CHECK(addrman.size() == 1);
141141

142142
bool newOnly = true;
143143
CAddrInfo addr_ret1 = addrman.Select(newOnly);
144144
BOOST_CHECK(addr_ret1.ToString() == "250.1.1.1:8333");
145145

146146
// Test 10: move addr to tried, select from new expected nothing returned.
147-
addrman.Good(CAddress(addr1));
147+
addrman.Good(CAddress(addr1, 0));
148148
BOOST_CHECK(addrman.size() == 1);
149149
CAddrInfo addr_ret2 = addrman.Select(newOnly);
150150
BOOST_CHECK(addr_ret2.ToString() == "[::]:0");
@@ -160,21 +160,21 @@ BOOST_AUTO_TEST_CASE(addrman_select)
160160
CService addr3 = CService("250.3.2.2", 9999);
161161
CService addr4 = CService("250.3.3.3", 9999);
162162

163-
addrman.Add(CAddress(addr2), CService("250.3.1.1", 8333));
164-
addrman.Add(CAddress(addr3), CService("250.3.1.1", 8333));
165-
addrman.Add(CAddress(addr4), CService("250.4.1.1", 8333));
163+
addrman.Add(CAddress(addr2, 0), CService("250.3.1.1", 8333));
164+
addrman.Add(CAddress(addr3, 0), CService("250.3.1.1", 8333));
165+
addrman.Add(CAddress(addr4, 0), CService("250.4.1.1", 8333));
166166

167167
// Add three addresses to tried table.
168168
CService addr5 = CService("250.4.4.4", 8333);
169169
CService addr6 = CService("250.4.5.5", 7777);
170170
CService addr7 = CService("250.4.6.6", 8333);
171171

172-
addrman.Add(CAddress(addr5), CService("250.3.1.1", 8333));
173-
addrman.Good(CAddress(addr5));
174-
addrman.Add(CAddress(addr6), CService("250.3.1.1", 8333));
175-
addrman.Good(CAddress(addr6));
176-
addrman.Add(CAddress(addr7), CService("250.1.1.3", 8333));
177-
addrman.Good(CAddress(addr7));
172+
addrman.Add(CAddress(addr5, 0), CService("250.3.1.1", 8333));
173+
addrman.Good(CAddress(addr5, 0));
174+
addrman.Add(CAddress(addr6, 0), CService("250.3.1.1", 8333));
175+
addrman.Good(CAddress(addr6, 0));
176+
addrman.Add(CAddress(addr7, 0), CService("250.1.1.3", 8333));
177+
addrman.Good(CAddress(addr7, 0));
178178

179179
// Test 11: 6 addrs + 1 addr from last test = 7.
180180
BOOST_CHECK(addrman.size() == 7);
@@ -199,19 +199,19 @@ BOOST_AUTO_TEST_CASE(addrman_new_collisions)
199199

200200
for (unsigned int i = 1; i < 18; i++) {
201201
CService addr = CService("250.1.1." + boost::to_string(i));
202-
addrman.Add(CAddress(addr), source);
202+
addrman.Add(CAddress(addr, 0), source);
203203

204204
//Test 13: No collision in new table yet.
205205
BOOST_CHECK(addrman.size() == i);
206206
}
207207

208208
//Test 14: new table collision!
209209
CService addr1 = CService("250.1.1.18");
210-
addrman.Add(CAddress(addr1), source);
210+
addrman.Add(CAddress(addr1, 0), source);
211211
BOOST_CHECK(addrman.size() == 17);
212212

213213
CService addr2 = CService("250.1.1.19");
214-
addrman.Add(CAddress(addr2), source);
214+
addrman.Add(CAddress(addr2, 0), source);
215215
BOOST_CHECK(addrman.size() == 18);
216216
}
217217

@@ -228,8 +228,8 @@ BOOST_AUTO_TEST_CASE(addrman_tried_collisions)
228228

229229
for (unsigned int i = 1; i < 80; i++) {
230230
CService addr = CService("250.1.1." + boost::to_string(i));
231-
addrman.Add(CAddress(addr), source);
232-
addrman.Good(CAddress(addr));
231+
addrman.Add(CAddress(addr, 0), source);
232+
addrman.Good(CAddress(addr, 0));
233233

234234
//Test 15: No collision in tried table yet.
235235
BOOST_TEST_MESSAGE(addrman.size());
@@ -238,11 +238,11 @@ BOOST_AUTO_TEST_CASE(addrman_tried_collisions)
238238

239239
//Test 16: tried table collision!
240240
CService addr1 = CService("250.1.1.80");
241-
addrman.Add(CAddress(addr1), source);
241+
addrman.Add(CAddress(addr1, 0), source);
242242
BOOST_CHECK(addrman.size() == 79);
243243

244244
CService addr2 = CService("250.1.1.81");
245-
addrman.Add(CAddress(addr2), source);
245+
addrman.Add(CAddress(addr2, 0), source);
246246
BOOST_CHECK(addrman.size() == 80);
247247
}
248248

@@ -255,9 +255,9 @@ BOOST_AUTO_TEST_CASE(addrman_find)
255255

256256
BOOST_CHECK(addrman.size() == 0);
257257

258-
CAddress addr1 = CAddress(CService("250.1.2.1", 8333));
259-
CAddress addr2 = CAddress(CService("250.1.2.1", 9999));
260-
CAddress addr3 = CAddress(CService("251.255.2.1", 8333));
258+
CAddress addr1 = CAddress(CService("250.1.2.1", 8333), 0);
259+
CAddress addr2 = CAddress(CService("250.1.2.1", 9999), 0);
260+
CAddress addr3 = CAddress(CService("251.255.2.1", 8333), 0);
261261

262262
CNetAddr source1 = CNetAddr("250.1.2.1");
263263
CNetAddr source2 = CNetAddr("250.1.2.2");
@@ -294,7 +294,7 @@ BOOST_AUTO_TEST_CASE(addrman_create)
294294

295295
BOOST_CHECK(addrman.size() == 0);
296296

297-
CAddress addr1 = CAddress(CService("250.1.2.1", 8333));
297+
CAddress addr1 = CAddress(CService("250.1.2.1", 8333), 0);
298298
CNetAddr source1 = CNetAddr("250.1.2.1");
299299

300300
int nId;
@@ -317,7 +317,7 @@ BOOST_AUTO_TEST_CASE(addrman_delete)
317317

318318
BOOST_CHECK(addrman.size() == 0);
319319

320-
CAddress addr1 = CAddress(CService("250.1.2.1", 8333));
320+
CAddress addr1 = CAddress(CService("250.1.2.1", 8333), 0);
321321
CNetAddr source1 = CNetAddr("250.1.2.1");
322322

323323
int nId;
@@ -344,15 +344,15 @@ BOOST_AUTO_TEST_CASE(addrman_getaddr)
344344
vector<CAddress> vAddr1 = addrman.GetAddr();
345345
BOOST_CHECK(vAddr1.size() == 0);
346346

347-
CAddress addr1 = CAddress(CService("250.250.2.1", 8333));
347+
CAddress addr1 = CAddress(CService("250.250.2.1", 8333), 0);
348348
addr1.nTime = GetAdjustedTime(); // Set time so isTerrible = false
349-
CAddress addr2 = CAddress(CService("250.251.2.2", 9999));
349+
CAddress addr2 = CAddress(CService("250.251.2.2", 9999), 0);
350350
addr2.nTime = GetAdjustedTime();
351-
CAddress addr3 = CAddress(CService("251.252.2.3", 8333));
351+
CAddress addr3 = CAddress(CService("251.252.2.3", 8333), 0);
352352
addr3.nTime = GetAdjustedTime();
353-
CAddress addr4 = CAddress(CService("252.253.3.4", 8333));
353+
CAddress addr4 = CAddress(CService("252.253.3.4", 8333), 0);
354354
addr4.nTime = GetAdjustedTime();
355-
CAddress addr5 = CAddress(CService("252.254.4.5", 8333));
355+
CAddress addr5 = CAddress(CService("252.254.4.5", 8333), 0);
356356
addr5.nTime = GetAdjustedTime();
357357
CNetAddr source1 = CNetAddr("250.1.2.1");
358358
CNetAddr source2 = CNetAddr("250.2.3.3");
@@ -368,8 +368,8 @@ BOOST_AUTO_TEST_CASE(addrman_getaddr)
368368
BOOST_CHECK(addrman.GetAddr().size() == 1);
369369

370370
// Test 24: Ensure GetAddr works with new and tried addresses.
371-
addrman.Good(CAddress(addr1));
372-
addrman.Good(CAddress(addr2));
371+
addrman.Good(CAddress(addr1, 0));
372+
addrman.Good(CAddress(addr2, 0));
373373
BOOST_CHECK(addrman.GetAddr().size() == 1);
374374

375375
// Test 25: Ensure GetAddr still returns 23% when addrman has many addrs.
@@ -378,7 +378,7 @@ BOOST_AUTO_TEST_CASE(addrman_getaddr)
378378
int octet2 = (i / 256) % 256;
379379
int octet3 = (i / (256 * 2)) % 256;
380380
string strAddr = boost::to_string(octet1) + "." + boost::to_string(octet2) + "." + boost::to_string(octet3) + ".23";
381-
CAddress addr = CAddress(CService(strAddr));
381+
CAddress addr = CAddress(CService(strAddr), 0);
382382

383383
// Ensure that for all addrs in addrman, isTerrible == false.
384384
addr.nTime = GetAdjustedTime();
@@ -403,8 +403,8 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
403403
// Set addrman addr placement to be deterministic.
404404
addrman.MakeDeterministic();
405405

406-
CAddress addr1 = CAddress(CService("250.1.1.1", 8333));
407-
CAddress addr2 = CAddress(CService("250.1.1.1", 9999));
406+
CAddress addr1 = CAddress(CService("250.1.1.1", 8333), 0);
407+
CAddress addr2 = CAddress(CService("250.1.1.1", 9999), 0);
408408

409409
CNetAddr source1 = CNetAddr("250.1.1.1");
410410

@@ -431,7 +431,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
431431
set<int> buckets;
432432
for (int i = 0; i < 255; i++) {
433433
CAddrInfo infoi = CAddrInfo(
434-
CAddress(CService("250.1.1." + boost::to_string(i))),
434+
CAddress(CService("250.1.1." + boost::to_string(i)), 0),
435435
CNetAddr("250.1.1." + boost::to_string(i)));
436436
int bucket = infoi.GetTriedBucket(nKey1);
437437
buckets.insert(bucket);
@@ -443,7 +443,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket)
443443
buckets.clear();
444444
for (int j = 0; j < 255; j++) {
445445
CAddrInfo infoj = CAddrInfo(
446-
CAddress(CService("250." + boost::to_string(j) + ".1.1")),
446+
CAddress(CService("250." + boost::to_string(j) + ".1.1"), 0),
447447
CNetAddr("250." + boost::to_string(j) + ".1.1"));
448448
int bucket = infoj.GetTriedBucket(nKey1);
449449
buckets.insert(bucket);
@@ -460,8 +460,8 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
460460
// Set addrman addr placement to be deterministic.
461461
addrman.MakeDeterministic();
462462

463-
CAddress addr1 = CAddress(CService("250.1.2.1", 8333));
464-
CAddress addr2 = CAddress(CService("250.1.2.1", 9999));
463+
CAddress addr1 = CAddress(CService("250.1.2.1", 8333), 0);
464+
CAddress addr2 = CAddress(CService("250.1.2.1", 9999), 0);
465465

466466
CNetAddr source1 = CNetAddr("250.1.2.1");
467467

@@ -484,7 +484,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
484484
set<int> buckets;
485485
for (int i = 0; i < 255; i++) {
486486
CAddrInfo infoi = CAddrInfo(
487-
CAddress(CService("250.1.1." + boost::to_string(i))),
487+
CAddress(CService("250.1.1." + boost::to_string(i)), 0),
488488
CNetAddr("250.1.1." + boost::to_string(i)));
489489
int bucket = infoi.GetNewBucket(nKey1);
490490
buckets.insert(bucket);
@@ -497,7 +497,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
497497
for (int j = 0; j < 4 * 255; j++) {
498498
CAddrInfo infoj = CAddrInfo(CAddress(
499499
CService(
500-
boost::to_string(250 + (j / 255)) + "." + boost::to_string(j % 256) + ".1.1")),
500+
boost::to_string(250 + (j / 255)) + "." + boost::to_string(j % 256) + ".1.1"), 0),
501501
CNetAddr("251.4.1.1"));
502502
int bucket = infoj.GetNewBucket(nKey1);
503503
buckets.insert(bucket);
@@ -509,7 +509,7 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket)
509509
buckets.clear();
510510
for (int p = 0; p < 255; p++) {
511511
CAddrInfo infoj = CAddrInfo(
512-
CAddress(CService("250.1.1.1")),
512+
CAddress(CService("250.1.1.1"), 0),
513513
CNetAddr("250." + boost::to_string(p) + ".1.1"));
514514
int bucket = infoj.GetNewBucket(nKey1);
515515
buckets.insert(bucket);

0 commit comments

Comments
 (0)