From bf47df46c952622c80783befab532d3a768d5321 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 3 Dec 2015 15:45:01 -0500 Subject: [PATCH] allow DNS names for SSU --- RouterInfo.cpp | 5 ++--- Transports.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- Transports.h | 3 +++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/RouterInfo.cpp b/RouterInfo.cpp index 037297e0..82b44f23 100644 --- a/RouterInfo.cpp +++ b/RouterInfo.cpp @@ -171,9 +171,8 @@ namespace data } else { - // TODO: resolve address for SSU - LogPrint (eLogWarning, "Unexpected SSU address ", value); - isValidAddress = false; + m_SupportedTransports |= eSSUV4; // TODO: + address.addressString = value; } } else diff --git a/Transports.cpp b/Transports.cpp index 702be15d..cdd35a42 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -278,7 +278,7 @@ namespace transport { if (address->addressString.length () > 0) // trying to resolve { - LogPrint (eLogInfo, "Resolving ", address->addressString); + LogPrint (eLogInfo, "Resolving NTCP ", address->addressString); NTCPResolve (address->addressString, ident); return true; } @@ -304,6 +304,15 @@ namespace transport m_SSUServer->CreateSession (peer.router, address->host, address->port); return true; } + else // we don't have address + { + if (address->addressString.length () > 0) // trying to resolve + { + LogPrint (eLogInfo, "Resolving SSU ", address->addressString); + SSUResolve (address->addressString, ident); + return true; + } + } } } LogPrint (eLogError, "No NTCP and SSU addresses available"); @@ -376,6 +385,37 @@ namespace transport } } + void Transports::SSUResolve (const std::string& addr, const i2p::data::IdentHash& ident) + { + auto resolver = std::make_shared(m_Service); + resolver->async_resolve (boost::asio::ip::tcp::resolver::query (addr, ""), + std::bind (&Transports::HandleSSUResolve, this, + std::placeholders::_1, std::placeholders::_2, ident, resolver)); + } + + void Transports::HandleSSUResolve (const boost::system::error_code& ecode, boost::asio::ip::tcp::resolver::iterator it, + i2p::data::IdentHash ident, std::shared_ptr resolver) + { + auto it1 = m_Peers.find (ident); + if (it1 != m_Peers.end ()) + { + auto& peer = it1->second; + if (!ecode && peer.router) + { + auto address = (*it).endpoint ().address (); + LogPrint (eLogInfo, (*it).host_name (), " has been resolved to ", address); + auto addr = peer.router->GetSSUAddress (!context.SupportsV6 ());; + if (addr) + { + m_SSUServer->CreateSession (peer.router, address, addr->port); + return; + } + } + LogPrint (eLogError, "Unable to resolve SSU address: ", ecode.message ()); + m_Peers.erase (it1); + } + } + void Transports::CloseSession (std::shared_ptr router) { if (!router) return; diff --git a/Transports.h b/Transports.h index 63506c13..c94ae650 100644 --- a/Transports.h +++ b/Transports.h @@ -114,6 +114,9 @@ namespace transport void NTCPResolve (const std::string& addr, const i2p::data::IdentHash& ident); void HandleNTCPResolve (const boost::system::error_code& ecode, boost::asio::ip::tcp::resolver::iterator it, i2p::data::IdentHash ident, std::shared_ptr resolver); + void SSUResolve (const std::string& addr, const i2p::data::IdentHash& ident); + void HandleSSUResolve (const boost::system::error_code& ecode, boost::asio::ip::tcp::resolver::iterator it, + i2p::data::IdentHash ident, std::shared_ptr resolver); void UpdateBandwidth (); void DetectExternalIP ();