diff --git a/libi2pd/RouterContext.cpp b/libi2pd/RouterContext.cpp index 6183f2be..1cfc71db 100644 --- a/libi2pd/RouterContext.cpp +++ b/libi2pd/RouterContext.cpp @@ -77,6 +77,12 @@ namespace i2p std::string ifname; i2p::config::GetOption("ifname", ifname); std::string ifname4; i2p::config::GetOption("ifname4", ifname4); std::string ifname6; i2p::config::GetOption("ifname6", ifname6); + + if ((ntcp2 || ygg) && !m_NTCP2Keys) + NewNTCP2Keys (); + bool ntcp2Published = false; + if (ntcp2) + i2p::config::GetOption("ntcp2.published", ntcp2Published); uint8_t caps = 0; if (ipv4) { @@ -86,10 +92,16 @@ namespace i2p else if (!nat && !ifname.empty()) /* bind to interface, we have no NAT so set external address too */ host = i2p::util::net::GetInterfaceAddress(ifname, false).to_string(); // v4 - if(ifname4.size()) host = i2p::util::net::GetInterfaceAddress(ifname4, false).to_string(); + if (ntcp2) + { + if (ntcp2Published) + m_RouterInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, boost::asio::ip::address_v4::from_string (host), port); + else // add non-published NTCP2 address + routerInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv); + } if (ssu) { routerInfo.AddSSUAddress (host.c_str(), port, nullptr); @@ -103,16 +115,35 @@ namespace i2p i2p::config::GetOption("host", host); else if (!ifname.empty()) host = i2p::util::net::GetInterfaceAddress(ifname, true).to_string(); // v6 - if(ifname6.size()) host = i2p::util::net::GetInterfaceAddress(ifname6, true).to_string(); - + + if (ntcp2) + { + if (ntcp2Published) + { + std::string ntcp2Host; + if (!i2p::config::IsDefault ("ntcp2.addressv6")) + i2p::config::GetOption ("ntcp2.addressv6", ntcp2Host); + else + ntcp2Host = host; + routerInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, boost::asio::ip::address_v6::from_string (ntcp2Host), port); + } + else if (!ipv4) // no other ntcp2 addresses yet + routerInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv); + } if (ssu) { routerInfo.AddSSUAddress (host.c_str(), port, nullptr); caps |= i2p::data::RouterInfo::eReachable; // R } } + if (ygg) + { + auto yggaddr = i2p::util::net::GetYggdrasilAddress (); + if (!yggaddr.is_unspecified ()) + routerInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, yggaddr, port); + } routerInfo.SetCaps (caps); // caps + L routerInfo.SetProperty ("netId", std::to_string (m_NetID)); @@ -120,40 +151,6 @@ namespace i2p routerInfo.CreateBuffer (m_Keys); m_RouterInfo.SetRouterIdentity (GetIdentity ()); m_RouterInfo.Update (routerInfo.GetBuffer (), routerInfo.GetBufferLen ()); - - if (ntcp2) // we don't store iv in the address if non published so we must update it from keys - { - if (!m_NTCP2Keys) NewNTCP2Keys (); - bool published; i2p::config::GetOption("ntcp2.published", published); - if (ipv4 || !published) UpdateNTCP2Address (true); // create not published NTCP2 address - if (published) - { - if (ipv4) - PublishNTCP2Address (port, true); - if (ipv6) - { - // add NTCP2 ipv6 address - std::string host = "::1"; - if (!i2p::config::IsDefault ("ntcp2.addressv6")) - i2p::config::GetOption ("ntcp2.addressv6", host); - m_RouterInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, boost::asio::ip::address_v6::from_string (host), port); - } - } - // enable added NTCP2 addresses - if (ipv4) m_RouterInfo.EnableV4 (); - if (ipv6) m_RouterInfo.EnableV6 (); - } - if (ygg) - { - auto yggaddr = i2p::util::net::GetYggdrasilAddress (); - if (!yggaddr.is_unspecified ()) - { - if (!m_NTCP2Keys) NewNTCP2Keys (); - m_RouterInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, yggaddr, port); - m_RouterInfo.EnableMesh (); - UpdateRouterInfo (); - } - } } void RouterContext::UpdateRouterInfo ()