mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-02 11:04:00 +01:00
eliminate extra parsing of RouterInfo coming as RouterInfo block
This commit is contained in:
parent
e0af7b077f
commit
855fd4d471
|
@ -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 ();
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue