diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Transports.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Transports.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Transports.cpp 2026-03-27 01:09:41.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Transports.cpp 2026-03-26 00:50:57.000000000 +0000 @@ -975,11 +975,6 @@ if (IsCheckReserved ()) { - auto addr = GetNetworkAddress (session); - if (!addr.is_unspecified ()) - { - std::lock_guard l( m_ConnectedNetworksMutex); - auto [it1, inserted] = m_ConnectedNetworks.try_emplace (addr, 0); - it1->second++; - } + auto [it1, inserted] = m_ConnectedNetworks.try_emplace (GetNetworkAddress (session), 0); + it1->second++; } }); @@ -1023,15 +1018,10 @@ if (IsCheckReserved ()) { - auto addr = GetNetworkAddress (session); - if (!addr.is_unspecified ()) + auto it1 = m_ConnectedNetworks.find (GetNetworkAddress (session)); + if (it1 != m_ConnectedNetworks.end ()) { - std::lock_guard l( m_ConnectedNetworksMutex); - auto it1 = m_ConnectedNetworks.find (addr); - if (it1 != m_ConnectedNetworks.end ()) - { - it1->second--; - if (it1->second <= 0) - m_ConnectedNetworks.erase (it1); - } + it1->second--; + if (it1->second <= 0) + m_ConnectedNetworks.erase (it1); } } @@ -1257,11 +1247,6 @@ { // check if max num connections from subnet is not exceeded - auto addr = GetNetworkAddress (session); - if (!addr.is_unspecified ()) - { - std::lock_guard l( m_ConnectedNetworksMutex); - auto it = m_ConnectedNetworks.find (addr); - if (it != m_ConnectedNetworks.end () && it->second > MAX_NUM_CONNECTIONS_FROM_SUBNET_FOR_PEER) return false; - } + auto it = m_ConnectedNetworks.find (GetNetworkAddress (session)); + if (it != m_ConnectedNetworks.end () && it->second > MAX_NUM_CONNECTIONS_FROM_SUBNET_FOR_PEER) return false; } return true; @@ -1406,20 +1391,24 @@ } - boost::asio::ip::address Transports::GetNetworkAddress (const boost::asio::ip::address& addr) const + boost::asio::ip::address Transports::GetNetworkAddress (std::shared_ptr session) const { - if (!addr.is_unspecified ()) + if (session) { - if (addr.is_v4 ()) - return boost::asio::ip::network_v4 (addr.to_v4 (), 24).network (); // /24 - else + auto networkAddr = session->GetRemoteAddress (); + if (!networkAddr.is_unspecified ()) { - if (i2p::util::net::IsYggdrasilAddress (addr)) + if (networkAddr.is_v4 ()) + return boost::asio::ip::network_v4 (networkAddr.to_v4 (), 24).network (); // /24 + else { - // change to 2xx range - auto bytes = addr.to_v6 ().to_bytes (); - bytes[0] = 0x02; - return boost::asio::ip::network_v6 (boost::asio::ip::address_v6 (bytes), 64).network (); // /64 + if (i2p::util::net::IsYggdrasilAddress (networkAddr)) + { + // change to 2xx range + auto bytes = networkAddr.to_v6 ().to_bytes (); + bytes[0] = 0x02; + return boost::asio::ip::network_v6 (boost::asio::ip::address_v6 (bytes), 64).network (); // /64 + } + return boost::asio::ip::network_v6 (networkAddr.to_v6 (), 56).network (); // /56 } - return boost::asio::ip::network_v6 (addr.to_v6 (), 56).network (); // /56 } } @@ -1427,30 +1416,4 @@ } - boost::asio::ip::address Transports::GetNetworkAddress (std::shared_ptr session) const - { - if (session) - return GetNetworkAddress (session->GetRemoteAddress ()); - return boost::asio::ip::address (); - } - - bool Transports::IsTooManyConnectionsFromSubnet (std::shared_ptr r) const - { - if (!r && !IsCheckReserved ()) return false; - auto addresses = r->GetAddresses (); - if (!addresses) return false; - for (auto& address : *addresses) - if (address && !address->host.is_unspecified ()) - { - auto networkAddr = GetNetworkAddress (address->host); - if (!networkAddr.is_unspecified ()) - { - std::lock_guard l( m_ConnectedNetworksMutex); - auto it = m_ConnectedNetworks.find (networkAddr); - if (it != m_ConnectedNetworks.end () && it->second > MAX_NUM_CONNECTIONS_FROM_SUBNET_FOR_PEER) return true; - } - } - return false; - } - void InitAddressFromIface () { diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Transports.h /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Transports.h --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/Transports.h 2026-03-27 01:09:41.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/Transports.h 2026-03-26 00:50:57.000000000 +0000 @@ -200,6 +200,4 @@ bool AddBan (const boost::asio::ip::address& addr); - bool IsTooManyConnectionsFromSubnet (std::shared_ptr r) const; - private: @@ -221,5 +219,4 @@ std::shared_ptr GetRandomPeer (Filter filter) const; boost::asio::ip::address GetNetworkAddress (std::shared_ptr session) const; - boost::asio::ip::address GetNetworkAddress (const boost::asio::ip::address& addr) const; private: @@ -236,5 +233,4 @@ mutable std::mutex m_PeersMutex; std::unordered_map > m_Peers; - mutable std::mutex m_ConnectedNetworksMutex; std::map m_ConnectedNetworks; // /24 or /56 adresss -> count diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/TunnelPool.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/TunnelPool.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd/TunnelPool.cpp 2026-03-27 01:09:41.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd/TunnelPool.cpp 2026-03-26 00:50:57.000000000 +0000 @@ -579,6 +579,5 @@ if (hop) { - if ((!hop->HasProfile () || !hop->GetProfile ()->IsBad ()) && - (prevHop != i2p::context.GetSharedRouterInfo () || !i2p::transport::transports.IsTooManyConnectionsFromSubnet (hop))) + if (!hop->HasProfile () || !hop->GetProfile ()->IsBad ()) break; }