diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index 4d789d33..939c087d 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -160,14 +160,24 @@ namespace i2p return m; } - I2NPMessage * CreateDatabaseSearchReply (const i2p::data::IdentHash& ident) + I2NPMessage * CreateDatabaseSearchReply (const i2p::data::IdentHash& ident, + const i2p::data::RouterInfo * floodfill) { I2NPMessage * m = NewI2NPMessage (); uint8_t * buf = m->GetPayload (); + size_t len = 0; memcpy (buf, ident, 32); - buf[32] = 0; // TODO: - memcpy (buf + 33, i2p::context.GetRouterInfo ().GetIdentHash (), 32); - m->len += 65; + len += 32; + buf[len] = floodfill ? 1 : 0; // 1 router for now + len++; + if (floodfill) + { + memcpy (buf + len, floodfill->GetIdentHash (), 32); + len += 32; + } + memcpy (buf + len, i2p::context.GetRouterInfo ().GetIdentHash (), 32); + len += 32; + m->len += len; FillI2NPMessageHeader (m, eI2NPDatabaseSearchReply); return m; } diff --git a/I2NPProtocol.h b/I2NPProtocol.h index 6d8dfc04..e3f8316e 100644 --- a/I2NPProtocol.h +++ b/I2NPProtocol.h @@ -154,7 +154,7 @@ 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); - I2NPMessage * CreateDatabaseSearchReply (const i2p::data::IdentHash& ident); + I2NPMessage * CreateDatabaseSearchReply (const i2p::data::IdentHash& ident, const i2p::data::RouterInfo * floodfill); I2NPMessage * CreateDatabaseStoreMsg (const i2p::data::RouterInfo * router = nullptr); diff --git a/NetDb.cpp b/NetDb.cpp index 85df86f0..6418d06a 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -582,7 +582,10 @@ namespace data replyMsg = CreateDatabaseStoreMsg (router); } else - replyMsg = CreateDatabaseSearchReply (buf); + { + std::set excluded; // empty for now + replyMsg = CreateDatabaseSearchReply (buf, GetClosestFloodfill (buf, excluded)); + } if (replyMsg) { if (replyTunnelID)