|
|
|
@ -67,6 +67,15 @@ namespace {
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//immutable thread safe array of allowed commands for logging inbound traffic
|
|
|
|
|
const static std::string logAllowIncomingMsgCmds[] = {
|
|
|
|
|
"version", "addr", "inv", "getdata", "merkleblock",
|
|
|
|
|
"getblocks", "getheaders", "tx", "headers", "block",
|
|
|
|
|
"getaddr", "mempool", "ping", "pong", "alert", "notfound",
|
|
|
|
|
"filterload", "filteradd", "filterclear", "reject"};
|
|
|
|
|
|
|
|
|
|
const static std::string NET_MESSAGE_COMMAND_OTHER = "*other*";
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Global state variables
|
|
|
|
|
//
|
|
|
|
@ -627,7 +636,9 @@ void CNode::copyStats(CNodeStats &stats)
|
|
|
|
|
X(fInbound);
|
|
|
|
|
X(nStartingHeight);
|
|
|
|
|
X(nSendBytes);
|
|
|
|
|
X(mapSendBytesPerMsgCmd);
|
|
|
|
|
X(nRecvBytes);
|
|
|
|
|
X(mapRecvBytesPerMsgCmd);
|
|
|
|
|
X(fWhitelisted);
|
|
|
|
|
|
|
|
|
|
// It is common for nodes with good ping times to suddenly become lagged,
|
|
|
|
@ -682,6 +693,15 @@ bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes)
|
|
|
|
|
nBytes -= handled;
|
|
|
|
|
|
|
|
|
|
if (msg.complete()) {
|
|
|
|
|
|
|
|
|
|
//store received bytes per message command
|
|
|
|
|
//to prevent a memory DOS, only allow valid commands
|
|
|
|
|
mapMsgCmdSize::iterator i = mapRecvBytesPerMsgCmd.find(msg.hdr.pchCommand);
|
|
|
|
|
if (i == mapRecvBytesPerMsgCmd.end())
|
|
|
|
|
i = mapRecvBytesPerMsgCmd.find(NET_MESSAGE_COMMAND_OTHER);
|
|
|
|
|
assert(i != mapRecvBytesPerMsgCmd.end());
|
|
|
|
|
i->second += msg.hdr.nMessageSize + CMessageHeader::HEADER_SIZE;
|
|
|
|
|
|
|
|
|
|
msg.nTime = GetTimeMicros();
|
|
|
|
|
messageHandlerCondition.notify_one();
|
|
|
|
|
}
|
|
|
|
@ -2378,6 +2398,9 @@ CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNa
|
|
|
|
|
nPingUsecTime = 0;
|
|
|
|
|
fPingQueued = false;
|
|
|
|
|
nMinPingUsecTime = std::numeric_limits<int64_t>::max();
|
|
|
|
|
for (unsigned int i = 0; i < sizeof(logAllowIncomingMsgCmds)/sizeof(logAllowIncomingMsgCmds[0]); i++)
|
|
|
|
|
mapRecvBytesPerMsgCmd[logAllowIncomingMsgCmds[i]] = 0;
|
|
|
|
|
mapRecvBytesPerMsgCmd[NET_MESSAGE_COMMAND_OTHER] = 0;
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
LOCK(cs_nLastNodeId);
|
|
|
|
@ -2457,7 +2480,7 @@ void CNode::AbortMessage() UNLOCK_FUNCTION(cs_vSend)
|
|
|
|
|
LogPrint("net", "(aborted)\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CNode::EndMessage() UNLOCK_FUNCTION(cs_vSend)
|
|
|
|
|
void CNode::EndMessage(const char* pszCommand) UNLOCK_FUNCTION(cs_vSend)
|
|
|
|
|
{
|
|
|
|
|
// The -*messagestest options are intentionally not documented in the help message,
|
|
|
|
|
// since they are only used during development to debug the networking code and are
|
|
|
|
@ -2480,6 +2503,9 @@ void CNode::EndMessage() UNLOCK_FUNCTION(cs_vSend)
|
|
|
|
|
unsigned int nSize = ssSend.size() - CMessageHeader::HEADER_SIZE;
|
|
|
|
|
WriteLE32((uint8_t*)&ssSend[CMessageHeader::MESSAGE_SIZE_OFFSET], nSize);
|
|
|
|
|
|
|
|
|
|
//log total amount of bytes per command
|
|
|
|
|
mapSendBytesPerMsgCmd[std::string(pszCommand)] += nSize + CMessageHeader::HEADER_SIZE;
|
|
|
|
|
|
|
|
|
|
// Set the checksum
|
|
|
|
|
uint256 hash = Hash(ssSend.begin() + CMessageHeader::HEADER_SIZE, ssSend.end());
|
|
|
|
|
unsigned int nChecksum = 0;
|
|
|
|
|