diff --git a/Garlic.cpp b/Garlic.cpp index 2ebcfdea..dc5c3841 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -429,7 +429,7 @@ namespace garlic { case eGarlicDeliveryTypeLocal: LogPrint ("Garlic type local"); - i2p::HandleI2NPMessage (CreateI2NPMessage (buf, GetI2NPMessageLength (buf))); + i2p::HandleI2NPMessage (CreateI2NPMessage (buf, GetI2NPMessageLength (buf), from)); break; case eGarlicDeliveryTypeDestination: { @@ -458,7 +458,7 @@ namespace garlic tunnel = from->GetTunnelPool ()->GetNextOutboundTunnel (); if (tunnel) // we have send it through an outbound tunnel { - I2NPMessage * msg = CreateI2NPMessage (buf, GetI2NPMessageLength (buf)); + I2NPMessage * msg = CreateI2NPMessage (buf, GetI2NPMessageLength (buf), from); tunnel->SendTunnelDataMsg (gwHash, gwTunnel, msg); } else diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index d5bb0265..5a6fc678 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -76,11 +76,12 @@ namespace i2p return msg; } - I2NPMessage * CreateI2NPMessage (const uint8_t * buf, int len) + I2NPMessage * CreateI2NPMessage (const uint8_t * buf, int len, i2p::tunnel::InboundTunnel * from) { I2NPMessage * msg = NewI2NPMessage (); memcpy (msg->GetBuffer (), buf, len); msg->len = msg->offset + len; + msg->from = from; return msg; } diff --git a/I2NPProtocol.h b/I2NPProtocol.h index faddd92f..7f62bc5d 100644 --- a/I2NPProtocol.h +++ b/I2NPProtocol.h @@ -163,7 +163,7 @@ namespace tunnel void FillI2NPMessageHeader (I2NPMessage * msg, I2NPMessageType msgType, uint32_t replyMsgID = 0); void RenewI2NPMessageHeader (I2NPMessage * msg); I2NPMessage * CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID = 0); - I2NPMessage * CreateI2NPMessage (const uint8_t * buf, int len); + I2NPMessage * CreateI2NPMessage (const uint8_t * buf, int len, i2p::tunnel::InboundTunnel * from = nullptr); I2NPMessage * CreateDeliveryStatusMsg (uint32_t msgID); I2NPMessage * CreateDatabaseLookupMsg (const uint8_t * key, const uint8_t * from, diff --git a/NetDb.cpp b/NetDb.cpp index 53598411..f50c98cd 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -111,8 +111,7 @@ namespace data { case eI2NPDatabaseStore: LogPrint ("DatabaseStore"); - HandleDatabaseStoreMsg (msg->GetPayload (), be16toh (msg->GetHeader ()->size)); // TODO - i2p::DeleteI2NPMessage (msg); + HandleDatabaseStoreMsg (msg); break; case eI2NPDatabaseSearchReply: LogPrint ("DatabaseSearchReply"); @@ -166,7 +165,7 @@ namespace data } } - void NetDb::AddRouterInfo (const IdentHash& ident, uint8_t * buf, int len) + void NetDb::AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len) { DeleteRequestedDestination (ident); auto it = m_RouterInfos.find(ident); @@ -187,7 +186,7 @@ namespace data } } - void NetDb::AddLeaseSet (const IdentHash& ident, uint8_t * buf, int len) + void NetDb::AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len) { bool unsolicited = !DeleteRequestedDestination (ident); auto it = m_LeaseSets.find(ident); @@ -408,8 +407,10 @@ namespace data } } - void NetDb::HandleDatabaseStoreMsg (uint8_t * buf, size_t len) - { + void NetDb::HandleDatabaseStoreMsg (I2NPMessage * m) + { + const uint8_t * buf = m->GetPayload (); + size_t len = be16toh (m->GetHeader ()->size); I2NPDatabaseStoreMsg * msg = (I2NPDatabaseStoreMsg *)buf; size_t offset = sizeof (I2NPDatabaseStoreMsg); if (msg->replyToken) @@ -437,6 +438,7 @@ namespace data decompressor.Get (uncompressed, uncomressedSize); AddRouterInfo (msg->key, uncompressed, uncomressedSize); } + i2p::DeleteI2NPMessage (m); } void NetDb::HandleDatabaseSearchReplyMsg (I2NPMessage * msg) diff --git a/NetDb.h b/NetDb.h index 68e9e4ba..35447a70 100644 --- a/NetDb.h +++ b/NetDb.h @@ -62,8 +62,8 @@ namespace data void Start (); void Stop (); - void AddRouterInfo (const IdentHash& ident, uint8_t * buf, int len); - void AddLeaseSet (const IdentHash& ident, uint8_t * buf, int len); + void AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len); + void AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len); RouterInfo * FindRouter (const IdentHash& ident) const; LeaseSet * FindLeaseSet (const IdentHash& destination) const; const IdentHash * FindAddress (const std::string& address) { return m_AddressBook.FindAddress (address); }; // TODO: move AddressBook away from NetDb @@ -75,7 +75,7 @@ namespace data void RequestDestination (const IdentHash& destination, bool isLeaseSet = false, i2p::tunnel::TunnelPool * pool = nullptr); - void HandleDatabaseStoreMsg (uint8_t * buf, size_t len); + void HandleDatabaseStoreMsg (I2NPMessage * msg); void HandleDatabaseSearchReplyMsg (I2NPMessage * msg); void HandleDatabaseLookupMsg (I2NPMessage * msg);