diff --git a/libi2pd/NTCP2.cpp b/libi2pd/NTCP2.cpp index 0976720e..5b5073f9 100644 --- a/libi2pd/NTCP2.cpp +++ b/libi2pd/NTCP2.cpp @@ -1304,8 +1304,6 @@ namespace transport else { LogPrint (eLogDebug, "NTCP2: Connected to ", conn->GetSocket ().remote_endpoint ()); - if (conn->GetSocket ().local_endpoint ().protocol () == boost::asio::ip::tcp::v6()) // ipv6 - context.UpdateNTCP2V6Address (conn->GetSocket ().local_endpoint ().address ()); conn->ClientLogin (); } } diff --git a/libi2pd/NTCPSession.cpp b/libi2pd/NTCPSession.cpp index 68a4133f..7e8ecd15 100644 --- a/libi2pd/NTCPSession.cpp +++ b/libi2pd/NTCPSession.cpp @@ -1079,8 +1079,6 @@ namespace transport else { LogPrint (eLogDebug, "NTCP: Connected to ", conn->GetSocket ().remote_endpoint ()); - if (conn->GetSocket ().local_endpoint ().protocol () == boost::asio::ip::tcp::v6()) // ipv6 - context.UpdateNTCPV6Address (conn->GetSocket ().local_endpoint ().address ()); conn->ClientLogin (); } } diff --git a/libi2pd/RouterContext.cpp b/libi2pd/RouterContext.cpp index 8293f1fd..213adf72 100644 --- a/libi2pd/RouterContext.cpp +++ b/libi2pd/RouterContext.cpp @@ -238,6 +238,20 @@ namespace i2p if (address->host != host && address->IsCompatible (host)) { address->host = host; + if (host.is_v6 () && address->transportStyle == i2p::data::RouterInfo::eTransportSSU) + { + // update MTU + auto mtu = i2p::util::net::GetMTU (host); + if (mtu) + { + LogPrint (eLogDebug, "Router: Our v6 MTU=", mtu); + if (mtu > 1472) { // TODO: magic constant + mtu = 1472; + LogPrint(eLogWarning, "Router: MTU dropped to upper limit of 1472 bytes"); + } + if (address->ssu) address->ssu->mtu = mtu; + } + } updated = true; } } @@ -444,7 +458,66 @@ namespace i2p void RouterContext::SetSupportsV6 (bool supportsV6) { if (supportsV6) + { m_RouterInfo.EnableV6 (); + // insert v6 addresses if necessary + bool foundSSU = false, foundNTCP = false, foundNTCP2 = false; + uint16_t port = 0; + auto& addresses = m_RouterInfo.GetAddresses (); + for (auto& addr: addresses) + { + if (addr->host.is_v6 ()) + { + if (addr->transportStyle == i2p::data::RouterInfo::eTransportSSU) + foundSSU = true; + else if (addr->IsNTCP2 ()) + { + if (addr->IsPublishedNTCP2 ()) foundNTCP2 = true; + } + else + foundNTCP = true; + } + port = addr->port; + } + if (!port) i2p::config::GetOption("port", port); + // SSU + if (!foundSSU) + { + bool ssu; i2p::config::GetOption("ssu", ssu); + if (ssu) + { + std::string host = "::1"; // TODO: read host + m_RouterInfo.AddSSUAddress (host.c_str (), port, GetIdentHash ()); + } + } + // NTCP2 + if (!foundNTCP2) + { + bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2); + bool ntcp2Published; i2p::config::GetOption("ntcp2.published", ntcp2Published); + if (ntcp2 && ntcp2Published) + { + std::string ntcp2Host; + if (!i2p::config::IsDefault ("ntcp2.addressv6")) + i2p::config::GetOption ("ntcp2.addressv6", ntcp2Host); + else + ntcp2Host = "::1"; + uint16_t ntcp2Port; i2p::config::GetOption ("ntcp2.port", ntcp2Port); + if (!ntcp2Port) ntcp2Port = port; + m_RouterInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, boost::asio::ip::address::from_string (ntcp2Host), ntcp2Port); + } + } + // NTCP + if (!foundNTCP) + { + bool ntcp; i2p::config::GetOption("ntcp", ntcp); + if (ntcp) + { + std::string host = "::1"; + m_RouterInfo.AddNTCPAddress (host.c_str (), port); + } + } + } else m_RouterInfo.DisableV6 (); UpdateRouterInfo (); @@ -459,50 +532,9 @@ namespace i2p UpdateRouterInfo (); } - - void RouterContext::UpdateNTCPV6Address (const boost::asio::ip::address& host) - { - bool updated = false, found = false; - int port = 0; - auto& addresses = m_RouterInfo.GetAddresses (); - for (auto& addr: addresses) - { - if (addr->host.is_v6 () && addr->transportStyle == i2p::data::RouterInfo::eTransportNTCP) - { - if (addr->host != host) - { - addr->host = host; - updated = true; - } - found = true; - } - else - port = addr->port; - } - if (!found) - { - // create new address - m_RouterInfo.AddNTCPAddress (host.to_string ().c_str (), port); - auto mtu = i2p::util::net::GetMTU (host); - if (mtu) - { - LogPrint (eLogDebug, "Router: Our v6 MTU=", mtu); - if (mtu > 1472) { // TODO: magic constant - mtu = 1472; - LogPrint(eLogWarning, "Router: MTU dropped to upper limit of 1472 bytes"); - } - } - m_RouterInfo.AddSSUAddress (host.to_string ().c_str (), port, GetIdentHash (), mtu ? mtu : 1472); // TODO - updated = true; - } - if (updated) - UpdateRouterInfo (); - } - void RouterContext::UpdateNTCP2V6Address (const boost::asio::ip::address& host) { - bool updated = false, found = false; - int port = 0; + bool updated = false; auto& addresses = m_RouterInfo.GetAddresses (); for (auto& addr: addresses) { @@ -515,38 +547,11 @@ namespace i2p addr->host = host; updated = true; } - found = true; break; } - else - port = addr->port; // NTCP2 v4 } } - if (!found && port) // we have found NTCP2 v4 but not v6 - { - m_RouterInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, host, port); - bool ntcp; i2p::config::GetOption("ntcp", ntcp); - bool ssu; i2p::config::GetOption("ssu", ssu); - if (!ntcp && ssu) - { - // we must publish SSU address - auto mtu = i2p::util::net::GetMTU (host); - if (mtu) - { - LogPrint (eLogDebug, "Router: Our v6 MTU=", mtu); - if (mtu > 1472) // TODO: magic constant - { - mtu = 1472; - LogPrint(eLogWarning, "Router: MTU dropped to upper limit of 1472 bytes"); - } - } - else - mtu = 1472; - m_RouterInfo.AddSSUAddress (host.to_string ().c_str (), port, GetIdentHash (), mtu); - } - updated = true; - } if (updated) UpdateRouterInfo (); } diff --git a/libi2pd/RouterContext.h b/libi2pd/RouterContext.h index 19fe08b2..ed9c41b0 100644 --- a/libi2pd/RouterContext.h +++ b/libi2pd/RouterContext.h @@ -101,8 +101,7 @@ namespace i2p void SetSupportsV6 (bool supportsV6); void SetSupportsV4 (bool supportsV4); - void UpdateNTCPV6Address (const boost::asio::ip::address& host); // called from NTCP session - void UpdateNTCP2V6Address (const boost::asio::ip::address& host); // called from NTCP2 session + void UpdateNTCP2V6Address (const boost::asio::ip::address& host); // called from Daemon. TODO: remove void UpdateStats (); void UpdateTimestamp (uint64_t ts); // in seconds, called from NetDb before publishing void CleanupDestination (); // garlic destination diff --git a/libi2pd/RouterInfo.cpp b/libi2pd/RouterInfo.cpp index b58678a8..37c2af7e 100644 --- a/libi2pd/RouterInfo.cpp +++ b/libi2pd/RouterInfo.cpp @@ -824,7 +824,7 @@ namespace data bool RouterInfo::IsV6 () const { - return m_SupportedTransports & (eNTCPV6 | eSSUV6); + return m_SupportedTransports & (eNTCPV6 | eSSUV6 | eNTCP2V6); } bool RouterInfo::IsV4 () const