eliminate extra parsing of RouterInfo coming as RouterInfo block

This commit is contained in:
orignal 2024-09-06 09:49:24 -04:00
parent e0af7b077f
commit 855fd4d471
2 changed files with 25 additions and 20 deletions

View File

@ -955,9 +955,8 @@ namespace transport
break; break;
case eNTCP2BlkRouterInfo: case eNTCP2BlkRouterInfo:
{ {
LogPrint (eLogDebug, "NTCP2: RouterInfo flag=", (int)frame[offset]); LogPrint (eLogDebug, "NTCP2: RouterInfo flag=", (int)frame[offset]);
i2p::data::RouterInfo ri (frame + offset + 1, size - 1); auto newRi = i2p::data::netdb.AddRouterInfo (frame + offset + 1, size - 1);
auto newRi = i2p::data::netdb.AddRouterInfo (ri.GetBuffer (), ri.GetBufferLen ());
if (newRi) if (newRi)
{ {
auto remoteIdentity = GetRemoteIdentity (); auto remoteIdentity = GetRemoteIdentity ();

View File

@ -1750,28 +1750,34 @@ namespace transport
void SSU2Session::HandleRouterInfo (const uint8_t * buf, size_t len) void SSU2Session::HandleRouterInfo (const uint8_t * buf, size_t len)
{ {
auto ri = ExtractRouterInfo (buf, len); if (len < 2) return;
if (ri) // not from SessionConfirmed, we must add it instantly to use in next block
std::shared_ptr<const i2p::data::RouterInfo> newRi;
if (buf[0] & SSU2_ROUTER_INFO_FLAG_GZIP) // compressed?
{ {
// not from SessionConfirmed, we must add it instantly to use in next block auto ri = ExtractRouterInfo (buf, len);
auto newRi = i2p::data::netdb.AddRouterInfo (ri->GetBuffer (), ri->GetBufferLen ()); // TODO: add ri if (ri)
if (newRi) newRi = i2p::data::netdb.AddRouterInfo (ri->GetBuffer (), ri->GetBufferLen ());
}
else // use buffer directly. TODO: handle frag
newRi = i2p::data::netdb.AddRouterInfo (buf + 2, len - 2);
if (newRi)
{
auto remoteIdentity = GetRemoteIdentity ();
if (remoteIdentity && remoteIdentity->GetIdentHash () == newRi->GetIdentHash ())
{ {
auto remoteIdentity = GetRemoteIdentity (); // peer's RouterInfo update
if (remoteIdentity && remoteIdentity->GetIdentHash () == newRi->GetIdentHash ()) SetRemoteIdentity (newRi->GetIdentity ());
auto address = m_RemoteEndpoint.address ().is_v6 () ? newRi->GetSSU2V6Address () : newRi->GetSSU2V4Address ();
if (address)
{ {
// peer's RouterInfo update m_Address = address;
SetRemoteIdentity (newRi->GetIdentity ()); if (IsOutgoing () && m_RelayTag && !address->IsIntroducer ())
auto address = m_RemoteEndpoint.address ().is_v6 () ? newRi->GetSSU2V6Address () : newRi->GetSSU2V4Address (); m_RelayTag = 0; // not longer introducer
if (address)
{
m_Address = address;
if (IsOutgoing () && m_RelayTag && !address->IsIntroducer ())
m_RelayTag = 0; // not longer introducer
}
} }
} }
} }
} }
void SSU2Session::HandleAck (const uint8_t * buf, size_t len) void SSU2Session::HandleAck (const uint8_t * buf, size_t len)