diff --git a/libi2pd/Profiling.h b/libi2pd/Profiling.h index 2bae61d4..3245d9f0 100644 --- a/libi2pd/Profiling.h +++ b/libi2pd/Profiling.h @@ -66,6 +66,7 @@ namespace data bool IsUpdated () const { return m_IsUpdated; }; bool IsUseful() const; + bool IsDuplicated () const { return m_IsDuplicated; }; private: diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index ada2078e..bce78044 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -1132,10 +1132,14 @@ namespace transport LogPrint (eLogError, "SSU2: Couldn't update RouterInfo from SessionConfirmed in netdb"); return false; } - bool isOlder = false; + std::shared_ptr profile; // not null if older if (ri->GetTimestamp () + i2p::data::NETDB_EXPIRATION_TIMEOUT_THRESHOLD*1000LL < ri1->GetTimestamp ()) + { // received RouterInfo is older than one in netdb - isOlder = true; + profile = i2p::data::GetRouterProfile (ri->GetIdentHash ()); // retrieve profile + if (profile && profile->IsDuplicated ()) + return false; + } ri = ri1; m_Address = m_RemoteEndpoint.address ().is_v6 () ? ri->GetSSU2V6Address () : ri->GetSSU2V4Address (); @@ -1148,11 +1152,8 @@ namespace transport (!m_RemoteEndpoint.address ().is_v6 () || memcmp (m_RemoteEndpoint.address ().to_v6 ().to_bytes ().data (), m_Address->host.to_v6 ().to_bytes ().data (), 8))) // temporary address { - if (isOlder) - { - auto profile = i2p::data::GetRouterProfile (ri->GetIdentHash ()); - if (profile) profile->Duplicated (); // mark router as duplicated in profile - } + if (profile) // older router? + profile->Duplicated (); // mark router as duplicated in profile else LogPrint (eLogError, "SSU2: Host mismatch between published address ", m_Address->host, " and actual endpoint ", m_RemoteEndpoint.address (), " from ", i2p::data::GetIdentHashAbbreviation (ri->GetIdentHash ()));