Verify that outbound connections have expected services
This commit is contained in:
parent
3764dec36c
commit
fc83f18153
3 changed files with 15 additions and 0 deletions
|
@ -4616,6 +4616,15 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||||
{
|
{
|
||||||
addrman.SetServices(pfrom->addr, pfrom->nServices);
|
addrman.SetServices(pfrom->addr, pfrom->nServices);
|
||||||
}
|
}
|
||||||
|
if (pfrom->nServicesExpected & ~pfrom->nServices)
|
||||||
|
{
|
||||||
|
LogPrint("net", "peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting\n", pfrom->id, pfrom->nServices, pfrom->nServicesExpected);
|
||||||
|
pfrom->PushMessage(NetMsgType::REJECT, strCommand, REJECT_NONSTANDARD,
|
||||||
|
strprintf("Expected to offer services %08x", pfrom->nServicesExpected));
|
||||||
|
pfrom->fDisconnect = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (pfrom->nVersion < MIN_PEER_PROTO_VERSION)
|
if (pfrom->nVersion < MIN_PEER_PROTO_VERSION)
|
||||||
{
|
{
|
||||||
// disconnect from peers older than this proto version
|
// disconnect from peers older than this proto version
|
||||||
|
|
|
@ -71,6 +71,9 @@ 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 */
|
||||||
|
static const uint64_t nRelevantServices = NODE_NETWORK;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global state variables
|
// Global state variables
|
||||||
//
|
//
|
||||||
|
@ -409,6 +412,7 @@ CNode* ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure
|
||||||
vNodes.push_back(pnode);
|
vNodes.push_back(pnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pnode->nServicesExpected = addrConnect.nServices & nRelevantServices;
|
||||||
pnode->nTimeConnected = GetTime();
|
pnode->nTimeConnected = GetTime();
|
||||||
|
|
||||||
return pnode;
|
return pnode;
|
||||||
|
@ -2325,6 +2329,7 @@ CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNa
|
||||||
filterInventoryKnown(50000, 0.000001)
|
filterInventoryKnown(50000, 0.000001)
|
||||||
{
|
{
|
||||||
nServices = 0;
|
nServices = 0;
|
||||||
|
nServicesExpected = 0;
|
||||||
hSocket = hSocketIn;
|
hSocket = hSocketIn;
|
||||||
nRecvVersion = INIT_PROTO_VERSION;
|
nRecvVersion = INIT_PROTO_VERSION;
|
||||||
nLastSend = 0;
|
nLastSend = 0;
|
||||||
|
|
|
@ -317,6 +317,7 @@ class CNode
|
||||||
public:
|
public:
|
||||||
// socket
|
// socket
|
||||||
uint64_t nServices;
|
uint64_t nServices;
|
||||||
|
uint64_t nServicesExpected;
|
||||||
SOCKET hSocket;
|
SOCKET hSocket;
|
||||||
CDataStream ssSend;
|
CDataStream ssSend;
|
||||||
size_t nSendSize; // total size of all vSendMsg entries
|
size_t nSendSize; // total size of all vSendMsg entries
|
||||||
|
|
Loading…
Reference in a new issue