|
|
@ -135,11 +135,10 @@ static std::vector<CAddress> convertSeed6(const std::vector<SeedSpec6> &vSeedsIn |
|
|
|
const int64_t nOneWeek = 7*24*60*60; |
|
|
|
const int64_t nOneWeek = 7*24*60*60; |
|
|
|
std::vector<CAddress> vSeedsOut; |
|
|
|
std::vector<CAddress> vSeedsOut; |
|
|
|
vSeedsOut.reserve(vSeedsIn.size()); |
|
|
|
vSeedsOut.reserve(vSeedsIn.size()); |
|
|
|
for (std::vector<SeedSpec6>::const_iterator i(vSeedsIn.begin()); i != vSeedsIn.end(); ++i) |
|
|
|
for (const auto& seed_in : vSeedsIn) { |
|
|
|
{ |
|
|
|
|
|
|
|
struct in6_addr ip; |
|
|
|
struct in6_addr ip; |
|
|
|
memcpy(&ip, i->addr, sizeof(ip)); |
|
|
|
memcpy(&ip, seed_in.addr, sizeof(ip)); |
|
|
|
CAddress addr(CService(ip, i->port), NODE_NETWORK); |
|
|
|
CAddress addr(CService(ip, seed_in.port), NODE_NETWORK); |
|
|
|
addr.nTime = GetTime() - GetRand(nOneWeek) - nOneWeek; |
|
|
|
addr.nTime = GetTime() - GetRand(nOneWeek) - nOneWeek; |
|
|
|
vSeedsOut.push_back(addr); |
|
|
|
vSeedsOut.push_back(addr); |
|
|
|
} |
|
|
|
} |
|
|
@ -299,18 +298,22 @@ bool IsReachable(const CNetAddr& addr) |
|
|
|
CNode* CConnman::FindNode(const CNetAddr& ip) |
|
|
|
CNode* CConnman::FindNode(const CNetAddr& ip) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_vNodes); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
for (CNode* pnode : vNodes) |
|
|
|
for (CNode* pnode : vNodes) { |
|
|
|
if ((CNetAddr)pnode->addr == ip) |
|
|
|
if ((CNetAddr)pnode->addr == ip) { |
|
|
|
return (pnode); |
|
|
|
return pnode; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CNode* CConnman::FindNode(const CSubNet& subNet) |
|
|
|
CNode* CConnman::FindNode(const CSubNet& subNet) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_vNodes); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
for (CNode* pnode : vNodes) |
|
|
|
for (CNode* pnode : vNodes) { |
|
|
|
if (subNet.Match((CNetAddr)pnode->addr)) |
|
|
|
if (subNet.Match((CNetAddr)pnode->addr)) { |
|
|
|
return (pnode); |
|
|
|
return pnode; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -319,7 +322,7 @@ CNode* CConnman::FindNode(const std::string& addrName) |
|
|
|
LOCK(cs_vNodes); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
for (CNode* pnode : vNodes) { |
|
|
|
for (CNode* pnode : vNodes) { |
|
|
|
if (pnode->GetAddrName() == addrName) { |
|
|
|
if (pnode->GetAddrName() == addrName) { |
|
|
|
return (pnode); |
|
|
|
return pnode; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
@ -328,9 +331,11 @@ CNode* CConnman::FindNode(const std::string& addrName) |
|
|
|
CNode* CConnman::FindNode(const CService& addr) |
|
|
|
CNode* CConnman::FindNode(const CService& addr) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_vNodes); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
for (CNode* pnode : vNodes) |
|
|
|
for (CNode* pnode : vNodes) { |
|
|
|
if ((CService)pnode->addr == addr) |
|
|
|
if ((CService)pnode->addr == addr) { |
|
|
|
return (pnode); |
|
|
|
return pnode; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
return nullptr; |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -474,10 +479,9 @@ void CConnman::ClearBanned() |
|
|
|
bool CConnman::IsBanned(CNetAddr ip) |
|
|
|
bool CConnman::IsBanned(CNetAddr ip) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_setBanned); |
|
|
|
LOCK(cs_setBanned); |
|
|
|
for (banmap_t::iterator it = setBanned.begin(); it != setBanned.end(); it++) |
|
|
|
for (const auto& it : setBanned) { |
|
|
|
{ |
|
|
|
CSubNet subNet = it.first; |
|
|
|
CSubNet subNet = (*it).first; |
|
|
|
CBanEntry banEntry = it.second; |
|
|
|
CBanEntry banEntry = (*it).second; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (subNet.Match(ip) && GetTime() < banEntry.nBanUntil) { |
|
|
|
if (subNet.Match(ip) && GetTime() < banEntry.nBanUntil) { |
|
|
|
return true; |
|
|
|
return true; |
|
|
@ -952,7 +956,7 @@ bool CConnman::AttemptToEvictConnection() |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_vNodes); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
|
|
|
|
|
|
|
for (CNode *node : vNodes) { |
|
|
|
for (const CNode* node : vNodes) { |
|
|
|
if (node->fWhitelisted) |
|
|
|
if (node->fWhitelisted) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
if (!node->fInbound) |
|
|
|
if (!node->fInbound) |
|
|
@ -1030,9 +1034,9 @@ bool CConnman::AttemptToEvictConnection() |
|
|
|
// Disconnect from the network group with the most connections
|
|
|
|
// Disconnect from the network group with the most connections
|
|
|
|
NodeId evicted = vEvictionCandidates.front().id; |
|
|
|
NodeId evicted = vEvictionCandidates.front().id; |
|
|
|
LOCK(cs_vNodes); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
for(std::vector<CNode*>::const_iterator it(vNodes.begin()); it != vNodes.end(); ++it) { |
|
|
|
for (CNode* pnode : vNodes) { |
|
|
|
if ((*it)->GetId() == evicted) { |
|
|
|
if (pnode->GetId() == evicted) { |
|
|
|
(*it)->fDisconnect = true; |
|
|
|
pnode->fDisconnect = true; |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -1056,9 +1060,9 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) { |
|
|
|
bool whitelisted = hListenSocket.whitelisted || IsWhitelistedRange(addr); |
|
|
|
bool whitelisted = hListenSocket.whitelisted || IsWhitelistedRange(addr); |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_vNodes); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
for (CNode* pnode : vNodes) |
|
|
|
for (const CNode* pnode : vNodes) { |
|
|
|
if (pnode->fInbound) |
|
|
|
if (pnode->fInbound) nInbound++; |
|
|
|
nInbound++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (hSocket == INVALID_SOCKET) |
|
|
|
if (hSocket == INVALID_SOCKET) |
|
|
@ -1850,8 +1854,7 @@ std::vector<AddedNodeInfo> CConnman::GetAddedNodeInfo() |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_vAddedNodes); |
|
|
|
LOCK(cs_vAddedNodes); |
|
|
|
ret.reserve(vAddedNodes.size()); |
|
|
|
ret.reserve(vAddedNodes.size()); |
|
|
|
for (const std::string& strAddNode : vAddedNodes) |
|
|
|
std::copy(vAddedNodes.cbegin(), vAddedNodes.cend(), std::back_inserter(lAddresses)); |
|
|
|
lAddresses.push_back(strAddNode); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -2488,9 +2491,8 @@ std::vector<CAddress> CConnman::GetAddresses() |
|
|
|
bool CConnman::AddNode(const std::string& strNode) |
|
|
|
bool CConnman::AddNode(const std::string& strNode) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_vAddedNodes); |
|
|
|
LOCK(cs_vAddedNodes); |
|
|
|
for(std::vector<std::string>::const_iterator it = vAddedNodes.begin(); it != vAddedNodes.end(); ++it) { |
|
|
|
for (const std::string& it : vAddedNodes) { |
|
|
|
if (strNode == *it) |
|
|
|
if (strNode == it) return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
vAddedNodes.push_back(strNode); |
|
|
|
vAddedNodes.push_back(strNode); |
|
|
@ -2516,9 +2518,11 @@ size_t CConnman::GetNodeCount(NumConnections flags) |
|
|
|
return vNodes.size(); |
|
|
|
return vNodes.size(); |
|
|
|
|
|
|
|
|
|
|
|
int nNum = 0; |
|
|
|
int nNum = 0; |
|
|
|
for(std::vector<CNode*>::const_iterator it = vNodes.begin(); it != vNodes.end(); ++it) |
|
|
|
for (const auto& pnode : vNodes) { |
|
|
|
if (flags & ((*it)->fInbound ? CONNECTIONS_IN : CONNECTIONS_OUT)) |
|
|
|
if (flags & (pnode->fInbound ? CONNECTIONS_IN : CONNECTIONS_OUT)) { |
|
|
|
nNum++; |
|
|
|
nNum++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return nNum; |
|
|
|
return nNum; |
|
|
|
} |
|
|
|
} |
|
|
@ -2528,8 +2532,7 @@ void CConnman::GetNodeStats(std::vector<CNodeStats>& vstats) |
|
|
|
vstats.clear(); |
|
|
|
vstats.clear(); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
LOCK(cs_vNodes); |
|
|
|
vstats.reserve(vNodes.size()); |
|
|
|
vstats.reserve(vNodes.size()); |
|
|
|
for(std::vector<CNode*>::iterator it = vNodes.begin(); it != vNodes.end(); ++it) { |
|
|
|
for (CNode* pnode : vNodes) { |
|
|
|
CNode* pnode = *it; |
|
|
|
|
|
|
|
vstats.emplace_back(); |
|
|
|
vstats.emplace_back(); |
|
|
|
pnode->copyStats(vstats.back()); |
|
|
|
pnode->copyStats(vstats.back()); |
|
|
|
} |
|
|
|
} |
|
|
|