Skip to content
This repository was archived by the owner on Feb 15, 2024. It is now read-only.

Commit 78edf5c

Browse files
author
Jeff Garzik
committed
Split up P2P message processing into MessageEngine methods
1 parent 451e44a commit 78edf5c

File tree

2 files changed

+134
-47
lines changed

2 files changed

+134
-47
lines changed

src/procmsg.cpp

Lines changed: 114 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -262,14 +262,87 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
262262
State(pfrom->GetId())->nLastBlockProcess = GetTimeMicros();
263263
}
264264

265+
if (strCommand == "version") {
266+
if (!MsgVersion(pfrom, vRecv, nTimeReceived))
267+
return false;
265268

269+
} else if (pfrom->nVersion == 0) {
270+
// Must have a version message before anything else
271+
Misbehaving(pfrom->GetId(), 1);
272+
return false;
266273

267-
if (strCommand == "version")
274+
} else if (strCommand == "verack") {
275+
if (!MsgVerack(pfrom, vRecv, nTimeReceived))
276+
return false;
277+
} else if (strCommand == "addr") {
278+
if (!MsgAddr(pfrom, vRecv, nTimeReceived))
279+
return false;
280+
} else if (strCommand == "inv") {
281+
if (!MsgInv(pfrom, vRecv, nTimeReceived))
282+
return false;
283+
} else if (strCommand == "getdata") {
284+
if (!MsgGetData(pfrom, vRecv, nTimeReceived))
285+
return false;
286+
} else if (strCommand == "getblocks") {
287+
if (!MsgGetBlocks(pfrom, vRecv, nTimeReceived))
288+
return false;
289+
} else if (strCommand == "getheaders") {
290+
if (!MsgGetHeaders(pfrom, vRecv, nTimeReceived))
291+
return false;
292+
} else if (strCommand == "tx") {
293+
if (!MsgTx(pfrom, vRecv, nTimeReceived))
294+
return false;
295+
} else if (strCommand == "block" && !fImporting && !fReindex) { // Ignore blocks received while importing
296+
if (!MsgBlock(pfrom, vRecv, nTimeReceived))
297+
return false;
298+
} else if (strCommand == "getaddr") {
299+
if (!MsgGetAddr(pfrom, vRecv, nTimeReceived))
300+
return false;
301+
} else if (strCommand == "mempool") {
302+
if (!MsgMempool(pfrom, vRecv, nTimeReceived))
303+
return false;
304+
} else if (strCommand == "ping") {
305+
if (!MsgPing(pfrom, vRecv, nTimeReceived))
306+
return false;
307+
} else if (strCommand == "pong") {
308+
if (!MsgPong(pfrom, vRecv, nTimeReceived))
309+
return false;
310+
} else if (strCommand == "alert") {
311+
if (!MsgAlert(pfrom, vRecv, nTimeReceived))
312+
return false;
313+
} else if (strCommand == "filterload") {
314+
if (!MsgFilterLoad(pfrom, vRecv, nTimeReceived))
315+
return false;
316+
} else if (strCommand == "filteradd") {
317+
if (!MsgFilterAdd(pfrom, vRecv, nTimeReceived))
318+
return false;
319+
} else if (strCommand == "filterclear") {
320+
if (!MsgFilterClear(pfrom, vRecv, nTimeReceived))
321+
return false;
322+
} else if (strCommand == "reject") {
323+
if (!MsgReject(pfrom, vRecv, nTimeReceived))
324+
return false;
325+
} else {
326+
// Ignore unknown commands for extensibility
327+
LogPrint("net", "Unknown command \"%s\" from peer=%d\n", SanitizeString(strCommand), pfrom->id);
328+
}
329+
330+
// Update the last seen time for this node's address
331+
if (pfrom->fNetworkNode)
332+
if (strCommand == "version" || strCommand == "addr" || strCommand == "inv" || strCommand == "getdata" || strCommand == "ping")
333+
AddressCurrentlyConnected(pfrom->addr);
334+
335+
return true;
336+
}
337+
338+
339+
340+
bool MessageEngine::MsgVersion(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
268341
{
269342
// Each connection can only send one version message
270343
if (pfrom->nVersion != 0)
271344
{
272-
pfrom->PushMessage("reject", strCommand, REJECT_DUPLICATE, string("Duplicate version message"));
345+
pfrom->PushMessage("reject", (string)"version", REJECT_DUPLICATE, string("Duplicate version message"));
273346
Misbehaving(pfrom->GetId(), 1);
274347
return false;
275348
}
@@ -283,7 +356,7 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
283356
{
284357
// disconnect from peers older than this proto version
285358
LogPrintf("peer=%d using obsolete version %i; disconnecting\n", pfrom->id, pfrom->nVersion);
286-
pfrom->PushMessage("reject", strCommand, REJECT_OBSOLETE,
359+
pfrom->PushMessage("reject", (string)"version", REJECT_OBSOLETE,
287360
strprintf("Version must be %d or greater", MIN_PEER_PROTO_VERSION));
288361
pfrom->fDisconnect = true;
289362
return false;
@@ -373,24 +446,17 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
373446
remoteAddr);
374447

375448
AddTimeData(pfrom->addr, nTime);
449+
return true;
376450
}
377451

378-
379-
else if (pfrom->nVersion == 0)
380-
{
381-
// Must have a version message before anything else
382-
Misbehaving(pfrom->GetId(), 1);
383-
return false;
384-
}
385-
386-
387-
else if (strCommand == "verack")
452+
bool MessageEngine::MsgVerack(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
388453
{
389454
pfrom->SetRecvVersion(min(pfrom->nVersion, PROTOCOL_VERSION));
455+
return true;
390456
}
391457

392458

393-
else if (strCommand == "addr")
459+
bool MessageEngine::MsgAddr(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
394460
{
395461
vector<CAddress> vAddr;
396462
vRecv >> vAddr;
@@ -454,10 +520,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
454520
pfrom->fGetAddr = false;
455521
if (pfrom->fOneShot)
456522
pfrom->fDisconnect = true;
523+
return true;
457524
}
458525

459526

460-
else if (strCommand == "inv")
527+
bool MessageEngine::MsgInv(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
461528
{
462529
vector<CInv> vInv;
463530
vRecv >> vInv;
@@ -496,10 +563,12 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
496563
// Track requests for our stuff
497564
g_signals.Inventory(inv.hash);
498565
}
566+
567+
return true;
499568
}
500569

501570

502-
else if (strCommand == "getdata")
571+
bool MessageEngine::MsgGetData(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
503572
{
504573
vector<CInv> vInv;
505574
vRecv >> vInv;
@@ -517,10 +586,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
517586

518587
pfrom->vRecvGetData.insert(pfrom->vRecvGetData.end(), vInv.begin(), vInv.end());
519588
ProcessGetData(pfrom);
589+
return true;
520590
}
521591

522592

523-
else if (strCommand == "getblocks")
593+
bool MessageEngine::MsgGetBlocks(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
524594
{
525595
CBlockLocator locator;
526596
uint256 hashStop;
@@ -553,10 +623,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
553623
break;
554624
}
555625
}
626+
return true;
556627
}
557628

558629

559-
else if (strCommand == "getheaders")
630+
bool MessageEngine::MsgGetHeaders(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
560631
{
561632
CBlockLocator locator;
562633
uint256 hashStop;
@@ -592,10 +663,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
592663
break;
593664
}
594665
pfrom->PushMessage("headers", vHeaders);
666+
return true;
595667
}
596668

597669

598-
else if (strCommand == "tx")
670+
bool MessageEngine::MsgTx(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
599671
{
600672
vector<uint256> vWorkQueue;
601673
vector<uint256> vEraseQueue;
@@ -680,15 +752,16 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
680752
LogPrint("mempool", "%s from peer=%d %s was not accepted into the memory pool: %s\n", tx.GetHash().ToString(),
681753
pfrom->id, pfrom->cleanSubVer,
682754
state.GetRejectReason());
683-
pfrom->PushMessage("reject", strCommand, state.GetRejectCode(),
755+
pfrom->PushMessage("reject", (string)"tx", state.GetRejectCode(),
684756
state.GetRejectReason(), inv.hash);
685757
if (nDoS > 0)
686758
Misbehaving(pfrom->GetId(), nDoS);
687759
}
760+
return true;
688761
}
689762

690763

691-
else if (strCommand == "block" && !fImporting && !fReindex) // Ignore blocks received while importing
764+
bool MessageEngine::MsgBlock(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
692765
{
693766
CBlock block;
694767
vRecv >> block;
@@ -710,27 +783,29 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
710783
ProcessBlock(state, pfrom, &block);
711784
int nDoS;
712785
if (state.IsInvalid(nDoS)) {
713-
pfrom->PushMessage("reject", strCommand, state.GetRejectCode(),
786+
pfrom->PushMessage("reject", (string)"block", state.GetRejectCode(),
714787
state.GetRejectReason(), inv.hash);
715788
if (nDoS > 0) {
716789
LOCK(cs_main);
717790
Misbehaving(pfrom->GetId(), nDoS);
718791
}
719792
}
720793

794+
return true;
721795
}
722796

723797

724-
else if (strCommand == "getaddr")
798+
bool MessageEngine::MsgGetAddr(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
725799
{
726800
pfrom->vAddrToSend.clear();
727801
vector<CAddress> vAddr = addrman.GetAddr();
728802
BOOST_FOREACH(const CAddress &addr, vAddr)
729803
pfrom->PushAddress(addr);
804+
return true;
730805
}
731806

732807

733-
else if (strCommand == "mempool")
808+
bool MessageEngine::MsgMempool(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
734809
{
735810
LOCK2(cs_main, pfrom->cs_filter);
736811

@@ -752,10 +827,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
752827
}
753828
if (vInv.size() > 0)
754829
pfrom->PushMessage("inv", vInv);
830+
return true;
755831
}
756832

757833

758-
else if (strCommand == "ping")
834+
bool MessageEngine::MsgPing(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
759835
{
760836
if (pfrom->nVersion > BIP0031_VERSION)
761837
{
@@ -774,10 +850,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
774850
// return very quickly.
775851
pfrom->PushMessage("pong", nonce);
776852
}
853+
return true;
777854
}
778855

779856

780-
else if (strCommand == "pong")
857+
bool MessageEngine::MsgPong(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
781858
{
782859
int64_t pingUsecEnd = nTimeReceived;
783860
uint64_t nonce = 0;
@@ -831,10 +908,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
831908
if (bPingFinished) {
832909
pfrom->nPingNonceSent = 0;
833910
}
911+
return true;
834912
}
835913

836914

837-
else if (strCommand == "alert")
915+
bool MessageEngine::MsgAlert(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
838916
{
839917
CAlert alert;
840918
vRecv >> alert;
@@ -862,10 +940,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
862940
Misbehaving(pfrom->GetId(), 10);
863941
}
864942
}
943+
return true;
865944
}
866945

867946

868-
else if (strCommand == "filterload")
947+
bool MessageEngine::MsgFilterLoad(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
869948
{
870949
CBloomFilter filter;
871950
vRecv >> filter;
@@ -881,10 +960,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
881960
pfrom->pfilter->UpdateEmptyFull();
882961
}
883962
pfrom->fRelayTxes = true;
963+
return true;
884964
}
885965

886966

887-
else if (strCommand == "filteradd")
967+
bool MessageEngine::MsgFilterAdd(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
888968
{
889969
vector<unsigned char> vData;
890970
vRecv >> vData;
@@ -901,19 +981,21 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
901981
else
902982
Misbehaving(pfrom->GetId(), 100);
903983
}
984+
return true;
904985
}
905986

906987

907-
else if (strCommand == "filterclear")
988+
bool MessageEngine::MsgFilterClear(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
908989
{
909990
LOCK(pfrom->cs_filter);
910991
delete pfrom->pfilter;
911992
pfrom->pfilter = new CBloomFilter();
912993
pfrom->fRelayTxes = true;
994+
return true;
913995
}
914996

915997

916-
else if (strCommand == "reject")
998+
bool MessageEngine::MsgReject(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
917999
{
9181000
if (fDebug)
9191001
{
@@ -934,24 +1016,9 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
9341016
if (s.size() > 111) s.erase(111, string::npos);
9351017
LogPrint("net", "Reject %s\n", SanitizeString(s));
9361018
}
1019+
return true;
9371020
}
9381021

939-
else
940-
{
941-
// Ignore unknown commands for extensibility
942-
LogPrint("net", "Unknown command \"%s\" from peer=%d\n", SanitizeString(strCommand), pfrom->id);
943-
}
944-
945-
946-
// Update the last seen time for this node's address
947-
if (pfrom->fNetworkNode)
948-
if (strCommand == "version" || strCommand == "addr" || strCommand == "inv" || strCommand == "getdata" || strCommand == "ping")
949-
AddressCurrentlyConnected(pfrom->addr);
950-
951-
952-
return true;
953-
}
954-
9551022
// requires LOCK(cs_vRecvMsg)
9561023
bool MessageEngine::ProcessMessages(CNode* pfrom)
9571024
{

src/procmsg.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,26 @@ class MessageEngine {
1414

1515
private:
1616
bool ProcessMessage(CNode* pfrom, std::string strCommand, CDataStream& vRecv, int64_t nTimeReceived);
17+
18+
bool MsgVersion(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
19+
bool MsgVerack(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
20+
bool MsgAddr(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
21+
bool MsgInv(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
22+
bool MsgGetData(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
23+
bool MsgGetBlocks(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
24+
bool MsgGetHeaders(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
25+
bool MsgTx(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
26+
bool MsgBlock(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
27+
bool MsgGetAddr(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
28+
bool MsgMempool(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
29+
bool MsgPing(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
30+
bool MsgPong(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
31+
bool MsgAlert(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
32+
bool MsgFilterLoad(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
33+
bool MsgFilterAdd(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
34+
bool MsgFilterClear(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
35+
bool MsgFilterReject(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
36+
bool MsgReject(CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived);
1737
};
1838

1939
extern class MessageEngine msgeng;

0 commit comments

Comments
 (0)