Changeset View
Changeset View
Standalone View
Standalone View
src/net_processing.cpp
Show First 20 Lines • Show All 2,703 Lines • ▼ Show 20 Lines | void PeerManager::ProcessMessage(const Config &config, CNode &pfrom, | ||||
LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", | LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", | ||||
SanitizeString(msg_type), vRecv.size(), pfrom.GetId()); | SanitizeString(msg_type), vRecv.size(), pfrom.GetId()); | ||||
if (gArgs.IsArgSet("-dropmessagestest") && | if (gArgs.IsArgSet("-dropmessagestest") && | ||||
GetRand(gArgs.GetArg("-dropmessagestest", 0)) == 0) { | GetRand(gArgs.GetArg("-dropmessagestest", 0)) == 0) { | ||||
LogPrintf("dropmessagestest DROPPING RECV MESSAGE\n"); | LogPrintf("dropmessagestest DROPPING RECV MESSAGE\n"); | ||||
return; | return; | ||||
} | } | ||||
if (!(pfrom.GetLocalServices() & NODE_BLOOM) && | |||||
(msg_type == NetMsgType::FILTERLOAD || | |||||
msg_type == NetMsgType::FILTERADD)) { | |||||
if (pfrom.nVersion >= NO_BLOOM_VERSION) { | |||||
Misbehaving(pfrom, 100, "no-bloom-version"); | |||||
} else { | |||||
pfrom.fDisconnect = true; | |||||
} | |||||
return; | |||||
} | |||||
if (IsAvalancheMessageType(msg_type)) { | if (IsAvalancheMessageType(msg_type)) { | ||||
if (!g_avalanche) { | if (!g_avalanche) { | ||||
LogPrint(BCLog::NET, | LogPrint(BCLog::NET, | ||||
"Avalanche is not initialized, ignoring %s message\n", | "Avalanche is not initialized, ignoring %s message\n", | ||||
msg_type); | msg_type); | ||||
return; | return; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,622 Lines • ▼ Show 20 Lines | if (msg_type == NetMsgType::PONG) { | ||||
} | } | ||||
if (bPingFinished) { | if (bPingFinished) { | ||||
pfrom.nPingNonceSent = 0; | pfrom.nPingNonceSent = 0; | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
if (msg_type == NetMsgType::FILTERLOAD) { | if (msg_type == NetMsgType::FILTERLOAD) { | ||||
if (!(pfrom.GetLocalServices() & NODE_BLOOM)) { | |||||
pfrom.fDisconnect = true; | |||||
return; | |||||
} | |||||
CBloomFilter filter; | CBloomFilter filter; | ||||
vRecv >> filter; | vRecv >> filter; | ||||
if (!filter.IsWithinSizeConstraints()) { | if (!filter.IsWithinSizeConstraints()) { | ||||
// There is no excuse for sending a too-large filter | // There is no excuse for sending a too-large filter | ||||
Misbehaving(pfrom, 100, "too-large bloom filter"); | Misbehaving(pfrom, 100, "too-large bloom filter"); | ||||
} else if (pfrom.m_tx_relay != nullptr) { | } else if (pfrom.m_tx_relay != nullptr) { | ||||
LOCK(pfrom.m_tx_relay->cs_filter); | LOCK(pfrom.m_tx_relay->cs_filter); | ||||
pfrom.m_tx_relay->pfilter.reset(new CBloomFilter(filter)); | pfrom.m_tx_relay->pfilter.reset(new CBloomFilter(filter)); | ||||
pfrom.m_tx_relay->fRelayTxes = true; | pfrom.m_tx_relay->fRelayTxes = true; | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
if (msg_type == NetMsgType::FILTERADD) { | if (msg_type == NetMsgType::FILTERADD) { | ||||
if (!(pfrom.GetLocalServices() & NODE_BLOOM)) { | |||||
pfrom.fDisconnect = true; | |||||
return; | |||||
} | |||||
std::vector<uint8_t> vData; | std::vector<uint8_t> vData; | ||||
vRecv >> vData; | vRecv >> vData; | ||||
// Nodes must NEVER send a data item > 520 bytes (the max size for a | // Nodes must NEVER send a data item > 520 bytes (the max size for a | ||||
// script data object, and thus, the maximum size any matched object can | // script data object, and thus, the maximum size any matched object can | ||||
// have) in a filteradd message. | // have) in a filteradd message. | ||||
bool bad = false; | bool bad = false; | ||||
if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) { | if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) { | ||||
Show All 10 Lines | if (msg_type == NetMsgType::FILTERADD) { | ||||
// The structure of this code doesn't really allow for a good error | // The structure of this code doesn't really allow for a good error | ||||
// code. We'll go generic. | // code. We'll go generic. | ||||
Misbehaving(pfrom, 100, "bad filteradd message"); | Misbehaving(pfrom, 100, "bad filteradd message"); | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
if (msg_type == NetMsgType::FILTERCLEAR) { | if (msg_type == NetMsgType::FILTERCLEAR) { | ||||
if (!(pfrom.GetLocalServices() & NODE_BLOOM)) { | |||||
pfrom.fDisconnect = true; | |||||
return; | |||||
} | |||||
if (pfrom.m_tx_relay == nullptr) { | if (pfrom.m_tx_relay == nullptr) { | ||||
return; | return; | ||||
} | } | ||||
LOCK(pfrom.m_tx_relay->cs_filter); | LOCK(pfrom.m_tx_relay->cs_filter); | ||||
if (pfrom.GetLocalServices() & NODE_BLOOM) { | |||||
pfrom.m_tx_relay->pfilter = nullptr; | pfrom.m_tx_relay->pfilter = nullptr; | ||||
} | |||||
pfrom.m_tx_relay->fRelayTxes = true; | pfrom.m_tx_relay->fRelayTxes = true; | ||||
return; | return; | ||||
} | } | ||||
if (msg_type == NetMsgType::FEEFILTER) { | if (msg_type == NetMsgType::FEEFILTER) { | ||||
Amount newFeeFilter = Amount::zero(); | Amount newFeeFilter = Amount::zero(); | ||||
vRecv >> newFeeFilter; | vRecv >> newFeeFilter; | ||||
if (MoneyRange(newFeeFilter)) { | if (MoneyRange(newFeeFilter)) { | ||||
▲ Show 20 Lines • Show All 1,207 Lines • Show Last 20 Lines |