From 014e4b0e1d36f90569704ca462bed4e240964527 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 14 Jul 2022 13:48:28 -0400 Subject: [PATCH] detect MTU for some known ipv6 tunnel brokers --- libi2pd/RouterContext.cpp | 4 ++-- libi2pd/util.cpp | 20 ++++++++++++++++++++ libi2pd/util.h | 3 ++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/libi2pd/RouterContext.cpp b/libi2pd/RouterContext.cpp index 404e14de..a3048f4d 100644 --- a/libi2pd/RouterContext.cpp +++ b/libi2pd/RouterContext.cpp @@ -428,13 +428,13 @@ namespace i2p if (mtu) { LogPrint (eLogDebug, "Router: Our v6 MTU=", mtu); - int maxMTU = address->IsSSU2 () ? 1500 : 1488; // must be multiple of 16 for SSU1 + int maxMTU = i2p::util::net::GetMaxMTU (host.to_v6 ()); if (mtu > maxMTU) { mtu = maxMTU; LogPrint(eLogWarning, "Router: MTU dropped to upper limit of ", maxMTU, " bytes"); } - else if (mtu && !address->IsSSU2 ()) // SSU1 + if (mtu && !address->IsSSU2 ()) // SSU1 mtu = (mtu >> 4) << 4; // round to multiple of 16 if (address->ssu) address->ssu->mtu = mtu; } diff --git a/libi2pd/util.cpp b/libi2pd/util.cpp index 07681dbd..a3eefffe 100644 --- a/libi2pd/util.cpp +++ b/libi2pd/util.cpp @@ -12,6 +12,7 @@ #include "util.h" #include "Log.h" +#include "I2PEndian.h" #if not defined (__FreeBSD__) #include @@ -423,6 +424,25 @@ namespace net #endif } + int GetMaxMTU (const boost::asio::ip::address_v6& localAddress) + { + uint32_t prefix = bufbe32toh (localAddress.to_bytes ().data ()); + switch (prefix) + { + case 0x20010470: + case 0x260070ff: + // Hurricane Electric + return 1480; + break; + case 0x2a06a004: + // route48 + return 1420; + break; + default: ; + } + return 1500; + } + static bool IsYggdrasilAddress (const uint8_t addr[16]) { return addr[0] == 0x02 || addr[0] == 0x03; diff --git a/libi2pd/util.h b/libi2pd/util.h index 2c74d4dd..9420060b 100644 --- a/libi2pd/util.h +++ b/libi2pd/util.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2013-2021, The PurpleI2P Project +* Copyright (c) 2013-2022, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * @@ -218,6 +218,7 @@ namespace util namespace net { int GetMTU (const boost::asio::ip::address& localAddress); + int GetMaxMTU (const boost::asio::ip::address_v6& localAddress); // check tunnel broker for ipv6 address const boost::asio::ip::address GetInterfaceAddress (const std::string & ifname, bool ipv6=false); boost::asio::ip::address_v6 GetYggdrasilAddress (); bool IsLocalAddress (const boost::asio::ip::address& addr);