From 5492deff214c251a826eecce72d5c8f66116f111 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 23 Jul 2014 11:10:03 -0400 Subject: [PATCH] moved handling of DatabaseLookup to netDb's thread --- I2NPProtocol.cpp | 26 ++++---------------------- I2NPProtocol.h | 1 - NetDb.cpp | 44 ++++++++++++++++++++++++++++++++++---------- NetDb.h | 3 ++- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index dbc095dd..1d00fea6 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -160,24 +160,6 @@ namespace i2p return m; } - void HandleDatabaseLookupMsg (uint8_t * buf, size_t len) - { - char key[48]; - int l = i2p::data::ByteStreamToBase64 (buf, 32, key, 48); - key[l] = 0; - LogPrint ("DatabaseLookup for ", key, " recieved"); - uint8_t flag = buf[64]; - uint32_t replyTunnelID = 0; - if (flag & 0x01) //reply to yunnel - replyTunnelID = be32toh (*(uint32_t *)(buf + 64)); - // TODO: implement search. We send non-found for now - I2NPMessage * replyMsg = CreateDatabaseSearchReply (buf); - if (replyTunnelID) - i2p::tunnel::tunnels.GetNextOutboundTunnel ()->SendTunnelDataMsg (buf+32, replyTunnelID, replyMsg); - else - i2p::transports.SendMessage (buf, replyMsg); - } - I2NPMessage * CreateDatabaseSearchReply (const i2p::data::IdentHash& ident) { I2NPMessage * m = NewI2NPMessage (); @@ -498,10 +480,6 @@ namespace i2p LogPrint ("TunnelBuildReply"); // TODO: break; - case eI2NPDatabaseLookup: - LogPrint ("DatabaseLookup"); - HandleDatabaseLookupMsg (buf, size); - break; default: LogPrint ("Unexpected message ", (int)header->typeID); } @@ -533,6 +511,10 @@ namespace i2p LogPrint ("DatabaseSearchReply"); i2p::data::netdb.PostI2NPMsg (msg); break; + case eI2NPDatabaseLookup: + LogPrint ("DatabaseLookup"); + i2p::data::netdb.PostI2NPMsg (msg); + break; case eI2NPDeliveryStatus: LogPrint ("DeliveryStatus"); if (msg->from && msg->from->GetTunnelPool ()) diff --git a/I2NPProtocol.h b/I2NPProtocol.h index 7fa09d0f..38925343 100644 --- a/I2NPProtocol.h +++ b/I2NPProtocol.h @@ -154,7 +154,6 @@ namespace tunnel I2NPMessage * CreateDatabaseLookupMsg (const uint8_t * key, const uint8_t * from, uint32_t replyTunnelID, bool exploratory = false, std::set * excludedPeers = nullptr, bool encryption = false); - void HandleDatabaseLookupMsg (uint8_t * buf, size_t len); I2NPMessage * CreateDatabaseSearchReply (const i2p::data::IdentHash& ident); I2NPMessage * CreateDatabaseStoreMsg (); diff --git a/NetDb.cpp b/NetDb.cpp index b87fcebb..a36e7b37 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -106,17 +106,21 @@ namespace data { while (msg) { - if (msg->GetHeader ()->typeID == eI2NPDatabaseStore) - { - HandleDatabaseStoreMsg (msg->GetPayload (), msg->GetLength ()); // TODO - i2p::DeleteI2NPMessage (msg); - } - else if (msg->GetHeader ()->typeID == eI2NPDatabaseSearchReply) - HandleDatabaseSearchReplyMsg (msg); - else // WTF? + switch (msg->GetHeader ()->typeID) { - LogPrint ("NetDb: unexpected message type ", msg->GetHeader ()->typeID); - i2p::HandleI2NPMessage (msg); + case eI2NPDatabaseStore: + HandleDatabaseStoreMsg (msg->GetPayload (), msg->GetLength ()); // TODO + i2p::DeleteI2NPMessage (msg); + break; + case eI2NPDatabaseSearchReply: + HandleDatabaseSearchReplyMsg (msg); + break; + case eI2NPDatabaseLookup: + HandleDatabaseLookupMsg (msg); + break; + default: // WTF? + LogPrint ("NetDb: unexpected message type ", msg->GetHeader ()->typeID); + i2p::HandleI2NPMessage (msg); } msg = m_Queue.Get (); } @@ -545,6 +549,26 @@ namespace data i2p::DeleteI2NPMessage (msg); } + void NetDb::HandleDatabaseLookupMsg (I2NPMessage * msg) + { + uint8_t * buf = msg->GetPayload (); + char key[48]; + int l = i2p::data::ByteStreamToBase64 (buf, 32, key, 48); + key[l] = 0; + LogPrint ("DatabaseLookup for ", key, " recieved"); + uint8_t flag = buf[64]; + uint32_t replyTunnelID = 0; + if (flag & 0x01) //reply to tunnel + replyTunnelID = be32toh (*(uint32_t *)(buf + 64)); + // TODO: implement search. We send non-found for now + I2NPMessage * replyMsg = CreateDatabaseSearchReply (buf); + if (replyTunnelID) + i2p::tunnel::tunnels.GetNextOutboundTunnel ()->SendTunnelDataMsg (buf+32, replyTunnelID, replyMsg); + else + i2p::transports.SendMessage (buf, replyMsg); + i2p::DeleteI2NPMessage (msg); + } + void NetDb::Explore (int numDestinations) { // clean up previous exploratories diff --git a/NetDb.h b/NetDb.h index fa6cb01f..8ab97359 100644 --- a/NetDb.h +++ b/NetDb.h @@ -70,7 +70,8 @@ namespace data void HandleDatabaseStoreMsg (uint8_t * buf, size_t len); void HandleDatabaseSearchReplyMsg (I2NPMessage * msg); - + void HandleDatabaseLookupMsg (I2NPMessage * msg); + const RouterInfo * GetRandomRouter (const RouterInfo * compatibleWith = nullptr) const; void PostI2NPMsg (I2NPMessage * msg);