mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 11:57:28 -03:00
net: move nLocalServices/nRelevantServices to CConnman
These are in-turn passed to CNode at connection time. This allows us to offer different services to different peers (or test the effects of doing so).
This commit is contained in:
parent
be9c796dc5
commit
bd72937dc4
7 changed files with 54 additions and 34 deletions
|
@ -982,6 +982,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
// Option to startup with mocktime set (used for regression testing):
|
// Option to startup with mocktime set (used for regression testing):
|
||||||
SetMockTime(GetArg("-mocktime", 0)); // SetMockTime(0) is a no-op
|
SetMockTime(GetArg("-mocktime", 0)); // SetMockTime(0) is a no-op
|
||||||
|
|
||||||
|
ServiceFlags nLocalServices = NODE_NETWORK;
|
||||||
|
ServiceFlags nRelevantServices = NODE_NETWORK;
|
||||||
|
|
||||||
if (GetBoolArg("-peerbloomfilters", DEFAULT_PEERBLOOMFILTERS))
|
if (GetBoolArg("-peerbloomfilters", DEFAULT_PEERBLOOMFILTERS))
|
||||||
nLocalServices = ServiceFlags(nLocalServices | NODE_BLOOM);
|
nLocalServices = ServiceFlags(nLocalServices | NODE_BLOOM);
|
||||||
|
|
||||||
|
@ -1506,7 +1509,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
StartTorControl(threadGroup, scheduler);
|
StartTorControl(threadGroup, scheduler);
|
||||||
|
|
||||||
std::string strNodeError;
|
std::string strNodeError;
|
||||||
if(!StartNode(connman, threadGroup, scheduler, strNodeError))
|
if(!StartNode(connman, threadGroup, scheduler, nLocalServices, nRelevantServices, strNodeError))
|
||||||
return InitError(strNodeError);
|
return InitError(strNodeError);
|
||||||
|
|
||||||
// ********************************************************* Step 12: finished
|
// ********************************************************* Step 12: finished
|
||||||
|
|
12
src/main.cpp
12
src/main.cpp
|
@ -471,7 +471,7 @@ void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaybeSetPeerAsAnnouncingHeaderAndIDs(const CNodeState* nodestate, CNode* pfrom, CConnman& connman) {
|
void MaybeSetPeerAsAnnouncingHeaderAndIDs(const CNodeState* nodestate, CNode* pfrom, CConnman& connman) {
|
||||||
if (nLocalServices & NODE_WITNESS) {
|
if (pfrom->GetLocalServices() & NODE_WITNESS) {
|
||||||
// Don't ever request compact blocks when segwit is enabled.
|
// Don't ever request compact blocks when segwit is enabled.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -4945,7 +4945,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!(nLocalServices & NODE_BLOOM) &&
|
if (!(pfrom->GetLocalServices() & NODE_BLOOM) &&
|
||||||
(strCommand == NetMsgType::FILTERLOAD ||
|
(strCommand == NetMsgType::FILTERLOAD ||
|
||||||
strCommand == NetMsgType::FILTERADD ||
|
strCommand == NetMsgType::FILTERADD ||
|
||||||
strCommand == NetMsgType::FILTERCLEAR))
|
strCommand == NetMsgType::FILTERCLEAR))
|
||||||
|
@ -5068,7 +5068,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
// Advertise our address
|
// Advertise our address
|
||||||
if (fListen && !IsInitialBlockDownload())
|
if (fListen && !IsInitialBlockDownload())
|
||||||
{
|
{
|
||||||
CAddress addr = GetLocalAddress(&pfrom->addr);
|
CAddress addr = GetLocalAddress(&pfrom->addr, pfrom->GetLocalServices());
|
||||||
if (addr.IsRoutable())
|
if (addr.IsRoutable())
|
||||||
{
|
{
|
||||||
LogPrint("net", "ProcessMessages: advertising address %s\n", addr.ToString());
|
LogPrint("net", "ProcessMessages: advertising address %s\n", addr.ToString());
|
||||||
|
@ -5263,7 +5263,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER &&
|
nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER &&
|
||||||
(!IsWitnessEnabled(chainActive.Tip(), chainparams.GetConsensus()) || State(pfrom->GetId())->fHaveWitness)) {
|
(!IsWitnessEnabled(chainActive.Tip(), chainparams.GetConsensus()) || State(pfrom->GetId())->fHaveWitness)) {
|
||||||
inv.type |= nFetchFlags;
|
inv.type |= nFetchFlags;
|
||||||
if (nodestate->fProvidesHeaderAndIDs && !(nLocalServices & NODE_WITNESS))
|
if (nodestate->fProvidesHeaderAndIDs && !(pfrom->GetLocalServices() & NODE_WITNESS))
|
||||||
vToFetch.push_back(CInv(MSG_CMPCT_BLOCK, inv.hash));
|
vToFetch.push_back(CInv(MSG_CMPCT_BLOCK, inv.hash));
|
||||||
else
|
else
|
||||||
vToFetch.push_back(inv);
|
vToFetch.push_back(inv);
|
||||||
|
@ -5907,7 +5907,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
pindexLast->GetBlockHash().ToString(), pindexLast->nHeight);
|
pindexLast->GetBlockHash().ToString(), pindexLast->nHeight);
|
||||||
}
|
}
|
||||||
if (vGetData.size() > 0) {
|
if (vGetData.size() > 0) {
|
||||||
if (nodestate->fProvidesHeaderAndIDs && vGetData.size() == 1 && mapBlocksInFlight.size() == 1 && pindexLast->pprev->IsValid(BLOCK_VALID_CHAIN) && !(nLocalServices & NODE_WITNESS)) {
|
if (nodestate->fProvidesHeaderAndIDs && vGetData.size() == 1 && mapBlocksInFlight.size() == 1 && pindexLast->pprev->IsValid(BLOCK_VALID_CHAIN) && !(pfrom->GetLocalServices() & NODE_WITNESS)) {
|
||||||
// We seem to be rather well-synced, so it appears pfrom was the first to provide us
|
// We seem to be rather well-synced, so it appears pfrom was the first to provide us
|
||||||
// with this block! Let's get them to announce using compact blocks in the future.
|
// with this block! Let's get them to announce using compact blocks in the future.
|
||||||
MaybeSetPeerAsAnnouncingHeaderAndIDs(nodestate, pfrom, connman);
|
MaybeSetPeerAsAnnouncingHeaderAndIDs(nodestate, pfrom, connman);
|
||||||
|
@ -5982,7 +5982,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
|
|
||||||
else if (strCommand == NetMsgType::MEMPOOL)
|
else if (strCommand == NetMsgType::MEMPOOL)
|
||||||
{
|
{
|
||||||
if (!(nLocalServices & NODE_BLOOM) && !pfrom->fWhitelisted)
|
if (!(pfrom->GetLocalServices() & NODE_BLOOM) && !pfrom->fWhitelisted)
|
||||||
{
|
{
|
||||||
LogPrint("net", "mempool request with bloom filters disabled, disconnect peer=%d\n", pfrom->GetId());
|
LogPrint("net", "mempool request with bloom filters disabled, disconnect peer=%d\n", pfrom->GetId());
|
||||||
pfrom->fDisconnect = true;
|
pfrom->fDisconnect = true;
|
||||||
|
|
32
src/net.cpp
32
src/net.cpp
|
@ -69,15 +69,11 @@ namespace {
|
||||||
|
|
||||||
const static std::string NET_MESSAGE_COMMAND_OTHER = "*other*";
|
const static std::string NET_MESSAGE_COMMAND_OTHER = "*other*";
|
||||||
|
|
||||||
/** Services this node implementation cares about */
|
|
||||||
ServiceFlags nRelevantServices = NODE_NETWORK;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global state variables
|
// Global state variables
|
||||||
//
|
//
|
||||||
bool fDiscover = true;
|
bool fDiscover = true;
|
||||||
bool fListen = true;
|
bool fListen = true;
|
||||||
ServiceFlags nLocalServices = NODE_NETWORK;
|
|
||||||
bool fRelayTxes = true;
|
bool fRelayTxes = true;
|
||||||
CCriticalSection cs_mapLocalHost;
|
CCriticalSection cs_mapLocalHost;
|
||||||
std::map<CNetAddr, LocalServiceInfo> mapLocalHost;
|
std::map<CNetAddr, LocalServiceInfo> mapLocalHost;
|
||||||
|
@ -155,7 +151,7 @@ static std::vector<CAddress> convertSeed6(const std::vector<SeedSpec6> &vSeedsIn
|
||||||
// Otherwise, return the unroutable 0.0.0.0 but filled in with
|
// Otherwise, return the unroutable 0.0.0.0 but filled in with
|
||||||
// the normal parameters, since the IP may be changed to a useful
|
// the normal parameters, since the IP may be changed to a useful
|
||||||
// one by discovery.
|
// one by discovery.
|
||||||
CAddress GetLocalAddress(const CNetAddr *paddrPeer)
|
CAddress GetLocalAddress(const CNetAddr *paddrPeer, ServiceFlags nLocalServices)
|
||||||
{
|
{
|
||||||
CAddress ret(CService(CNetAddr(),GetListenPort()), NODE_NONE);
|
CAddress ret(CService(CNetAddr(),GetListenPort()), NODE_NONE);
|
||||||
CService addr;
|
CService addr;
|
||||||
|
@ -187,7 +183,7 @@ void AdvertiseLocal(CNode *pnode)
|
||||||
{
|
{
|
||||||
if (fListen && pnode->fSuccessfullyConnected)
|
if (fListen && pnode->fSuccessfullyConnected)
|
||||||
{
|
{
|
||||||
CAddress addrLocal = GetLocalAddress(&pnode->addr);
|
CAddress addrLocal = GetLocalAddress(&pnode->addr, pnode->GetLocalServices());
|
||||||
// If discovery is enabled, sometimes give our peer the address it
|
// If discovery is enabled, sometimes give our peer the address it
|
||||||
// tells us that it sees us as in case it has a better idea of our
|
// tells us that it sees us as in case it has a better idea of our
|
||||||
// address than we do.
|
// address than we do.
|
||||||
|
@ -400,7 +396,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
|
||||||
addrman.Attempt(addrConnect, fCountFailure);
|
addrman.Attempt(addrConnect, fCountFailure);
|
||||||
|
|
||||||
// Add node
|
// Add node
|
||||||
CNode* pnode = new CNode(GetNewNodeId(), hSocket, addrConnect, pszDest ? pszDest : "", false);
|
CNode* pnode = new CNode(GetNewNodeId(), nLocalServices, hSocket, addrConnect, pszDest ? pszDest : "", false);
|
||||||
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
|
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
|
||||||
pnode->AddRef();
|
pnode->AddRef();
|
||||||
|
|
||||||
|
@ -463,7 +459,7 @@ void CNode::PushVersion()
|
||||||
|
|
||||||
int64_t nTime = (fInbound ? GetAdjustedTime() : GetTime());
|
int64_t nTime = (fInbound ? GetAdjustedTime() : GetTime());
|
||||||
CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService(), addr.nServices));
|
CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService(), addr.nServices));
|
||||||
CAddress addrMe = GetLocalAddress(&addr);
|
CAddress addrMe = GetLocalAddress(&addr, nLocalServices);
|
||||||
if (fLogIPs)
|
if (fLogIPs)
|
||||||
LogPrint("net", "send version message: version %d, blocks=%d, us=%s, them=%s, peer=%d\n", PROTOCOL_VERSION, nBestHeight, addrMe.ToString(), addrYou.ToString(), id);
|
LogPrint("net", "send version message: version %d, blocks=%d, us=%s, them=%s, peer=%d\n", PROTOCOL_VERSION, nBestHeight, addrMe.ToString(), addrYou.ToString(), id);
|
||||||
else
|
else
|
||||||
|
@ -1036,7 +1032,7 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CNode* pnode = new CNode(GetNewNodeId(), hSocket, addr, "", true);
|
CNode* pnode = new CNode(GetNewNodeId(), nLocalServices, hSocket, addr, "", true);
|
||||||
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
|
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
|
||||||
pnode->AddRef();
|
pnode->AddRef();
|
||||||
pnode->fWhitelisted = whitelisted;
|
pnode->fWhitelisted = whitelisted;
|
||||||
|
@ -2045,11 +2041,11 @@ CConnman::CConnman()
|
||||||
nReceiveFloodSize = 0;
|
nReceiveFloodSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StartNode(CConnman& connman, boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError)
|
bool StartNode(CConnman& connman, boost::thread_group& threadGroup, CScheduler& scheduler, ServiceFlags nLocalServices, ServiceFlags nRelevantServices, std::string& strNodeError)
|
||||||
{
|
{
|
||||||
Discover(threadGroup);
|
Discover(threadGroup);
|
||||||
|
|
||||||
bool ret = connman.Start(threadGroup, scheduler, strNodeError);
|
bool ret = connman.Start(threadGroup, scheduler, nLocalServices, nRelevantServices, strNodeError);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -2059,13 +2055,15 @@ NodeId CConnman::GetNewNodeId()
|
||||||
return nLastNodeId.fetch_add(1, std::memory_order_relaxed);
|
return nLastNodeId.fetch_add(1, std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CConnman::Start(boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError)
|
bool CConnman::Start(boost::thread_group& threadGroup, CScheduler& scheduler, ServiceFlags nLocalServicesIn, ServiceFlags nRelevantServicesIn, std::string& strNodeError)
|
||||||
{
|
{
|
||||||
nTotalBytesRecv = 0;
|
nTotalBytesRecv = 0;
|
||||||
nTotalBytesSent = 0;
|
nTotalBytesSent = 0;
|
||||||
nMaxOutboundLimit = 0;
|
nMaxOutboundLimit = 0;
|
||||||
nMaxOutboundTotalBytesSentInCycle = 0;
|
nMaxOutboundTotalBytesSentInCycle = 0;
|
||||||
nMaxOutboundTimeframe = 60*60*24; //1 day
|
nMaxOutboundTimeframe = 60*60*24; //1 day
|
||||||
|
nLocalServices = nLocalServicesIn;
|
||||||
|
nRelevantServices = nRelevantServicesIn;
|
||||||
nMaxOutboundCycleStartTime = 0;
|
nMaxOutboundCycleStartTime = 0;
|
||||||
|
|
||||||
nSendBufferMaxSize = 1000*GetArg("-maxsendbuffer", DEFAULT_MAXSENDBUFFER);
|
nSendBufferMaxSize = 1000*GetArg("-maxsendbuffer", DEFAULT_MAXSENDBUFFER);
|
||||||
|
@ -2116,7 +2114,7 @@ bool CConnman::Start(boost::thread_group& threadGroup, CScheduler& scheduler, st
|
||||||
if (pnodeLocalHost == NULL) {
|
if (pnodeLocalHost == NULL) {
|
||||||
CNetAddr local;
|
CNetAddr local;
|
||||||
LookupHost("127.0.0.1", local, false);
|
LookupHost("127.0.0.1", local, false);
|
||||||
pnodeLocalHost = new CNode(GetNewNodeId(), INVALID_SOCKET, CAddress(CService(local, 0), nLocalServices));
|
pnodeLocalHost = new CNode(GetNewNodeId(), nLocalServices, INVALID_SOCKET, CAddress(CService(local, 0), nLocalServices));
|
||||||
GetNodeSignals().InitializeNode(pnodeLocalHost->GetId(), pnodeLocalHost);
|
GetNodeSignals().InitializeNode(pnodeLocalHost->GetId(), pnodeLocalHost);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2467,6 +2465,11 @@ uint64_t CConnman::GetTotalBytesSent()
|
||||||
return nTotalBytesSent;
|
return nTotalBytesSent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ServiceFlags CConnman::GetLocalServices() const
|
||||||
|
{
|
||||||
|
return nLocalServices;
|
||||||
|
}
|
||||||
|
|
||||||
void CNode::Fuzz(int nChance)
|
void CNode::Fuzz(int nChance)
|
||||||
{
|
{
|
||||||
if (!fSuccessfullyConnected) return; // Don't fuzz initial handshake
|
if (!fSuccessfullyConnected) return; // Don't fuzz initial handshake
|
||||||
|
@ -2505,7 +2508,7 @@ void CNode::Fuzz(int nChance)
|
||||||
unsigned int CConnman::GetReceiveFloodSize() const { return nReceiveFloodSize; }
|
unsigned int CConnman::GetReceiveFloodSize() const { return nReceiveFloodSize; }
|
||||||
unsigned int CConnman::GetSendBufferSize() const{ return nSendBufferMaxSize; }
|
unsigned int CConnman::GetSendBufferSize() const{ return nSendBufferMaxSize; }
|
||||||
|
|
||||||
CNode::CNode(NodeId idIn, SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNameIn, bool fInboundIn) :
|
CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNameIn, bool fInboundIn) :
|
||||||
ssSend(SER_NETWORK, INIT_PROTO_VERSION),
|
ssSend(SER_NETWORK, INIT_PROTO_VERSION),
|
||||||
addr(addrIn),
|
addr(addrIn),
|
||||||
nKeyedNetGroup(CalculateKeyedNetGroup(addrIn)),
|
nKeyedNetGroup(CalculateKeyedNetGroup(addrIn)),
|
||||||
|
@ -2560,6 +2563,7 @@ CNode::CNode(NodeId idIn, SOCKET hSocketIn, const CAddress& addrIn, const std::s
|
||||||
nextSendTimeFeeFilter = 0;
|
nextSendTimeFeeFilter = 0;
|
||||||
id = idIn;
|
id = idIn;
|
||||||
nOptimisticBytesWritten = 0;
|
nOptimisticBytesWritten = 0;
|
||||||
|
nLocalServices = nLocalServicesIn;
|
||||||
|
|
||||||
GetRandBytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce));
|
GetRandBytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce));
|
||||||
|
|
||||||
|
|
24
src/net.h
24
src/net.h
|
@ -107,7 +107,7 @@ public:
|
||||||
|
|
||||||
CConnman();
|
CConnman();
|
||||||
~CConnman();
|
~CConnman();
|
||||||
bool Start(boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError);
|
bool Start(boost::thread_group& threadGroup, CScheduler& scheduler, ServiceFlags nLocalServicesIn, ServiceFlags nRelevantServicesIn, std::string& strNodeError);
|
||||||
void Stop();
|
void Stop();
|
||||||
bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);
|
bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);
|
||||||
bool OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false, bool fFeeler = false);
|
bool OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false, bool fFeeler = false);
|
||||||
|
@ -171,6 +171,8 @@ public:
|
||||||
|
|
||||||
void AddWhitelistedRange(const CSubNet &subnet);
|
void AddWhitelistedRange(const CSubNet &subnet);
|
||||||
|
|
||||||
|
ServiceFlags GetLocalServices() const;
|
||||||
|
|
||||||
//!set the max outbound target in bytes
|
//!set the max outbound target in bytes
|
||||||
void SetMaxOutboundTarget(uint64_t limit);
|
void SetMaxOutboundTarget(uint64_t limit);
|
||||||
uint64_t GetMaxOutboundTarget();
|
uint64_t GetMaxOutboundTarget();
|
||||||
|
@ -274,12 +276,18 @@ private:
|
||||||
mutable CCriticalSection cs_vNodes;
|
mutable CCriticalSection cs_vNodes;
|
||||||
std::atomic<NodeId> nLastNodeId;
|
std::atomic<NodeId> nLastNodeId;
|
||||||
boost::condition_variable messageHandlerCondition;
|
boost::condition_variable messageHandlerCondition;
|
||||||
|
|
||||||
|
/** Services this instance offers */
|
||||||
|
ServiceFlags nLocalServices;
|
||||||
|
|
||||||
|
/** Services this instance cares about */
|
||||||
|
ServiceFlags nRelevantServices;
|
||||||
};
|
};
|
||||||
extern std::unique_ptr<CConnman> g_connman;
|
extern std::unique_ptr<CConnman> g_connman;
|
||||||
void MapPort(bool fUseUPnP);
|
void MapPort(bool fUseUPnP);
|
||||||
unsigned short GetListenPort();
|
unsigned short GetListenPort();
|
||||||
bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);
|
bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);
|
||||||
bool StartNode(CConnman& connman, boost::thread_group& threadGroup, CScheduler& scheduler, std::string& strNodeError);
|
bool StartNode(CConnman& connman, boost::thread_group& threadGroup, CScheduler& scheduler, ServiceFlags nLocalServices, ServiceFlags nRelevantServices, std::string& strNodeError);
|
||||||
bool StopNode(CConnman& connman);
|
bool StopNode(CConnman& connman);
|
||||||
size_t SocketSendData(CNode *pnode);
|
size_t SocketSendData(CNode *pnode);
|
||||||
|
|
||||||
|
@ -336,13 +344,11 @@ bool IsLocal(const CService& addr);
|
||||||
bool GetLocal(CService &addr, const CNetAddr *paddrPeer = NULL);
|
bool GetLocal(CService &addr, const CNetAddr *paddrPeer = NULL);
|
||||||
bool IsReachable(enum Network net);
|
bool IsReachable(enum Network net);
|
||||||
bool IsReachable(const CNetAddr &addr);
|
bool IsReachable(const CNetAddr &addr);
|
||||||
CAddress GetLocalAddress(const CNetAddr *paddrPeer = NULL);
|
CAddress GetLocalAddress(const CNetAddr *paddrPeer, ServiceFlags nLocalServices);
|
||||||
|
|
||||||
|
|
||||||
extern bool fDiscover;
|
extern bool fDiscover;
|
||||||
extern bool fListen;
|
extern bool fListen;
|
||||||
extern ServiceFlags nLocalServices;
|
|
||||||
extern ServiceFlags nRelevantServices;
|
|
||||||
extern bool fRelayTxes;
|
extern bool fRelayTxes;
|
||||||
|
|
||||||
/** Maximum number of connections to simultaneously allow (aka connection slots) */
|
/** Maximum number of connections to simultaneously allow (aka connection slots) */
|
||||||
|
@ -549,7 +555,7 @@ public:
|
||||||
CAmount lastSentFeeFilter;
|
CAmount lastSentFeeFilter;
|
||||||
int64_t nextSendTimeFeeFilter;
|
int64_t nextSendTimeFeeFilter;
|
||||||
|
|
||||||
CNode(NodeId id, SOCKET hSocketIn, const CAddress &addrIn, const std::string &addrNameIn = "", bool fInboundIn = false);
|
CNode(NodeId id, ServiceFlags nLocalServicesIn, SOCKET hSocketIn, const CAddress &addrIn, const std::string &addrNameIn = "", bool fInboundIn = false);
|
||||||
~CNode();
|
~CNode();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -559,6 +565,7 @@ private:
|
||||||
static uint64_t CalculateKeyedNetGroup(const CAddress& ad);
|
static uint64_t CalculateKeyedNetGroup(const CAddress& ad);
|
||||||
|
|
||||||
uint64_t nLocalHostNonce;
|
uint64_t nLocalHostNonce;
|
||||||
|
ServiceFlags nLocalServices;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
NodeId GetId() const {
|
NodeId GetId() const {
|
||||||
|
@ -846,6 +853,11 @@ public:
|
||||||
void CloseSocketDisconnect();
|
void CloseSocketDisconnect();
|
||||||
|
|
||||||
void copyStats(CNodeStats &stats);
|
void copyStats(CNodeStats &stats);
|
||||||
|
|
||||||
|
ServiceFlags GetLocalServices() const
|
||||||
|
{
|
||||||
|
return nLocalServices;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -432,7 +432,8 @@ UniValue getnetworkinfo(const UniValue& params, bool fHelp)
|
||||||
obj.push_back(Pair("version", CLIENT_VERSION));
|
obj.push_back(Pair("version", CLIENT_VERSION));
|
||||||
obj.push_back(Pair("subversion", strSubVersion));
|
obj.push_back(Pair("subversion", strSubVersion));
|
||||||
obj.push_back(Pair("protocolversion",PROTOCOL_VERSION));
|
obj.push_back(Pair("protocolversion",PROTOCOL_VERSION));
|
||||||
obj.push_back(Pair("localservices", strprintf("%016x", nLocalServices)));
|
if(g_connman)
|
||||||
|
obj.push_back(Pair("localservices", strprintf("%016x", g_connman->GetLocalServices())));
|
||||||
obj.push_back(Pair("localrelay", fRelayTxes));
|
obj.push_back(Pair("localrelay", fRelayTxes));
|
||||||
obj.push_back(Pair("timeoffset", GetTimeOffset()));
|
obj.push_back(Pair("timeoffset", GetTimeOffset()));
|
||||||
if(g_connman)
|
if(g_connman)
|
||||||
|
|
|
@ -48,7 +48,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
|
||||||
{
|
{
|
||||||
connman->ClearBanned();
|
connman->ClearBanned();
|
||||||
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
|
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
|
||||||
CNode dummyNode1(id++, INVALID_SOCKET, addr1, "", true);
|
CNode dummyNode1(id++, NODE_NETWORK, INVALID_SOCKET, addr1, "", true);
|
||||||
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
|
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
|
||||||
dummyNode1.nVersion = 1;
|
dummyNode1.nVersion = 1;
|
||||||
Misbehaving(dummyNode1.GetId(), 100); // Should get banned
|
Misbehaving(dummyNode1.GetId(), 100); // Should get banned
|
||||||
|
@ -57,7 +57,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
|
||||||
BOOST_CHECK(!connman->IsBanned(ip(0xa0b0c001|0x0000ff00))); // Different IP, not banned
|
BOOST_CHECK(!connman->IsBanned(ip(0xa0b0c001|0x0000ff00))); // Different IP, not banned
|
||||||
|
|
||||||
CAddress addr2(ip(0xa0b0c002), NODE_NONE);
|
CAddress addr2(ip(0xa0b0c002), NODE_NONE);
|
||||||
CNode dummyNode2(id++, INVALID_SOCKET, addr2, "", true);
|
CNode dummyNode2(id++, NODE_NETWORK, INVALID_SOCKET, addr2, "", true);
|
||||||
GetNodeSignals().InitializeNode(dummyNode2.GetId(), &dummyNode2);
|
GetNodeSignals().InitializeNode(dummyNode2.GetId(), &dummyNode2);
|
||||||
dummyNode2.nVersion = 1;
|
dummyNode2.nVersion = 1;
|
||||||
Misbehaving(dummyNode2.GetId(), 50);
|
Misbehaving(dummyNode2.GetId(), 50);
|
||||||
|
@ -74,7 +74,7 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
|
||||||
connman->ClearBanned();
|
connman->ClearBanned();
|
||||||
mapArgs["-banscore"] = "111"; // because 11 is my favorite number
|
mapArgs["-banscore"] = "111"; // because 11 is my favorite number
|
||||||
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
|
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
|
||||||
CNode dummyNode1(id++, INVALID_SOCKET, addr1, "", true);
|
CNode dummyNode1(id++, NODE_NETWORK, INVALID_SOCKET, addr1, "", true);
|
||||||
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
|
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
|
||||||
dummyNode1.nVersion = 1;
|
dummyNode1.nVersion = 1;
|
||||||
Misbehaving(dummyNode1.GetId(), 100);
|
Misbehaving(dummyNode1.GetId(), 100);
|
||||||
|
@ -96,7 +96,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
|
||||||
SetMockTime(nStartTime); // Overrides future calls to GetTime()
|
SetMockTime(nStartTime); // Overrides future calls to GetTime()
|
||||||
|
|
||||||
CAddress addr(ip(0xa0b0c001), NODE_NONE);
|
CAddress addr(ip(0xa0b0c001), NODE_NONE);
|
||||||
CNode dummyNode(id++, INVALID_SOCKET, addr, "", true);
|
CNode dummyNode(id++, NODE_NETWORK, INVALID_SOCKET, addr, "", true);
|
||||||
GetNodeSignals().InitializeNode(dummyNode.GetId(), &dummyNode);
|
GetNodeSignals().InitializeNode(dummyNode.GetId(), &dummyNode);
|
||||||
dummyNode.nVersion = 1;
|
dummyNode.nVersion = 1;
|
||||||
|
|
||||||
|
|
|
@ -163,12 +163,12 @@ BOOST_AUTO_TEST_CASE(cnode_simple_test)
|
||||||
bool fInboundIn = false;
|
bool fInboundIn = false;
|
||||||
|
|
||||||
// Test that fFeeler is false by default.
|
// Test that fFeeler is false by default.
|
||||||
CNode* pnode1 = new CNode(id++, hSocket, addr, pszDest, fInboundIn);
|
CNode* pnode1 = new CNode(id++, NODE_NETWORK, hSocket, addr, pszDest, fInboundIn);
|
||||||
BOOST_CHECK(pnode1->fInbound == false);
|
BOOST_CHECK(pnode1->fInbound == false);
|
||||||
BOOST_CHECK(pnode1->fFeeler == false);
|
BOOST_CHECK(pnode1->fFeeler == false);
|
||||||
|
|
||||||
fInboundIn = true;
|
fInboundIn = true;
|
||||||
CNode* pnode2 = new CNode(id++, hSocket, addr, pszDest, fInboundIn);
|
CNode* pnode2 = new CNode(id++, NODE_NETWORK, hSocket, addr, pszDest, fInboundIn);
|
||||||
BOOST_CHECK(pnode2->fInbound == true);
|
BOOST_CHECK(pnode2->fInbound == true);
|
||||||
BOOST_CHECK(pnode2->fFeeler == false);
|
BOOST_CHECK(pnode2->fFeeler == false);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue