diff --git a/HTTPServer.cpp b/HTTPServer.cpp index ddfa6478..9ffa0599 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -427,18 +427,18 @@ namespace util s << " (" << i2p::transport::transports.GetOutBandwidth () <<" Bps)
\r\n"; s << "Data path: " << i2p::fs::GetDataDir() << "
\r\n
\r\n"; s << "Our external address:" << "
\r\n" ; - for (auto& address : i2p::context.GetRouterInfo().GetAddresses()) + for (auto address : i2p::context.GetRouterInfo().GetAddresses()) { - switch (address.transportStyle) + switch (address->transportStyle) { case i2p::data::RouterInfo::eTransportNTCP: - if (address.host.is_v6 ()) + if (address->host.is_v6 ()) s << "NTCP6  "; else s << "NTCP  "; break; case i2p::data::RouterInfo::eTransportSSU: - if (address.host.is_v6 ()) + if (address->host.is_v6 ()) s << "SSU6     "; else s << "SSU     "; @@ -446,7 +446,7 @@ namespace util default: s << "Unknown  "; } - s << address.host.to_string() << ":" << address.port << "
\r\n"; + s << address->host.to_string() << ":" << address->port << "
\r\n"; } s << "
\r\nRouters: " << i2p::data::netdb.GetNumRouters () << " "; s << "Floodfills: " << i2p::data::netdb.GetNumFloodfills () << " "; diff --git a/NTCPSession.cpp b/NTCPSession.cpp index b0ea2e74..a7832335 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -759,15 +759,15 @@ namespace transport m_IsRunning = true; m_Thread = new std::thread (std::bind (&NTCPServer::Run, this)); // create acceptors - auto addresses = context.GetRouterInfo ().GetAddresses (); - for (auto& address : addresses) + auto& addresses = context.GetRouterInfo ().GetAddresses (); + for (auto address: addresses) { - if (address.transportStyle == i2p::data::RouterInfo::eTransportNTCP && address.host.is_v4 ()) + if (address->transportStyle == i2p::data::RouterInfo::eTransportNTCP && address->host.is_v4 ()) { m_NTCPAcceptor = new boost::asio::ip::tcp::acceptor (m_Service, - boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), address.port)); + boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), address->port)); - LogPrint (eLogInfo, "NTCP: Start listening TCP port ", address.port); + LogPrint (eLogInfo, "NTCP: Start listening TCP port ", address->port); auto conn = std::make_shared(*this); m_NTCPAcceptor->async_accept(conn->GetSocket (), std::bind (&NTCPServer::HandleAccept, this, conn, std::placeholders::_1)); @@ -777,10 +777,10 @@ namespace transport m_NTCPV6Acceptor = new boost::asio::ip::tcp::acceptor (m_Service); m_NTCPV6Acceptor->open (boost::asio::ip::tcp::v6()); m_NTCPV6Acceptor->set_option (boost::asio::ip::v6_only (true)); - m_NTCPV6Acceptor->bind (boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), address.port)); + m_NTCPV6Acceptor->bind (boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), address->port)); m_NTCPV6Acceptor->listen (); - LogPrint (eLogInfo, "NTCP: Start listening V6 TCP port ", address.port); + LogPrint (eLogInfo, "NTCP: Start listening V6 TCP port ", address->port); auto conn = std::make_shared (*this); m_NTCPV6Acceptor->async_accept(conn->GetSocket (), std::bind (&NTCPServer::HandleAcceptV6, this, conn, std::placeholders::_1)); diff --git a/RouterContext.cpp b/RouterContext.cpp index b3774d89..dc08ede3 100644 --- a/RouterContext.cpp +++ b/RouterContext.cpp @@ -92,11 +92,11 @@ namespace i2p void RouterContext::UpdatePort (int port) { bool updated = false; - for (auto& address : m_RouterInfo.GetAddresses ()) + for (auto address : m_RouterInfo.GetAddresses ()) { - if (address.port != port) + if (address->port != port) { - address.port = port; + address->port = port; updated = true; } } @@ -107,11 +107,11 @@ namespace i2p void RouterContext::UpdateAddress (const boost::asio::ip::address& host) { bool updated = false; - for (auto& address : m_RouterInfo.GetAddresses ()) + for (auto address : m_RouterInfo.GetAddresses ()) { - if (address.host != host && address.IsCompatible (host)) + if (address->host != host && address->IsCompatible (host)) { - address.host = host; + address->host = host; updated = true; } } @@ -206,15 +206,15 @@ namespace i2p auto& addresses = m_RouterInfo.GetAddresses (); for (size_t i = 0; i < addresses.size (); i++) { - if (addresses[i].transportStyle == i2p::data::RouterInfo::eTransportNTCP) + if (addresses[i]->transportStyle == i2p::data::RouterInfo::eTransportNTCP) { addresses.erase (addresses.begin () + i); break; } } // delete previous introducers - for (auto& addr : addresses) - addr.introducers.clear (); + for (auto addr : addresses) + addr->introducers.clear (); // update UpdateRouterInfo (); @@ -235,16 +235,16 @@ namespace i2p auto& addresses = m_RouterInfo.GetAddresses (); for (size_t i = 0; i < addresses.size (); i++) { - if (addresses[i].transportStyle == i2p::data::RouterInfo::eTransportSSU) + if (addresses[i]->transportStyle == i2p::data::RouterInfo::eTransportSSU) { // insert NTCP address with host/port from SSU - m_RouterInfo.AddNTCPAddress (addresses[i].host.to_string ().c_str (), addresses[i].port); + m_RouterInfo.AddNTCPAddress (addresses[i]->host.to_string ().c_str (), addresses[i]->port); break; } } // delete previous introducers - for (auto& addr : addresses) - addr.introducers.clear (); + for (auto addr : addresses) + addr->introducers.clear (); // update UpdateRouterInfo (); @@ -264,19 +264,19 @@ namespace i2p bool updated = false, found = false; int port = 0; auto& addresses = m_RouterInfo.GetAddresses (); - for (auto& addr : addresses) + for (auto addr: addresses) { - if (addr.host.is_v6 () && addr.transportStyle == i2p::data::RouterInfo::eTransportNTCP) + if (addr->host.is_v6 () && addr->transportStyle == i2p::data::RouterInfo::eTransportNTCP) { - if (addr.host != host) + if (addr->host != host) { - addr.host = host; + addr->host = host; updated = true; } found = true; } else - port = addr.port; + port = addr->port; } if (!found) { diff --git a/RouterInfo.cpp b/RouterInfo.cpp index 84768201..f1e1e0f4 100644 --- a/RouterInfo.cpp +++ b/RouterInfo.cpp @@ -232,7 +232,7 @@ namespace data } if (isValidAddress) { - m_Addresses.push_back(address); + m_Addresses.push_back(std::make_shared
(address)); m_SupportedTransports |= supportedTransports; } } @@ -359,8 +359,9 @@ namespace data // addresses uint8_t numAddresses = m_Addresses.size (); s.write ((char *)&numAddresses, sizeof (numAddresses)); - for (auto& address : m_Addresses) + for (auto addr : m_Addresses) { + Address& address = *addr; s.write ((char *)&address.cost, sizeof (address.cost)); s.write ((char *)&address.date, sizeof (address.date)); std::stringstream properties; @@ -543,46 +544,46 @@ namespace data void RouterInfo::AddNTCPAddress (const char * host, int port) { - Address addr; - addr.host = boost::asio::ip::address::from_string (host); - addr.port = port; - addr.transportStyle = eTransportNTCP; - addr.cost = 2; - addr.date = 0; - addr.mtu = 0; + auto addr = std::make_shared
(); + addr->host = boost::asio::ip::address::from_string (host); + addr->port = port; + addr->transportStyle = eTransportNTCP; + addr->cost = 2; + addr->date = 0; + addr->mtu = 0; for (auto it: m_Addresses) // don't insert same address twice if (it == addr) return; m_Addresses.push_back(addr); - m_SupportedTransports |= addr.host.is_v6 () ? eNTCPV6 : eNTCPV4; + m_SupportedTransports |= addr->host.is_v6 () ? eNTCPV6 : eNTCPV4; } void RouterInfo::AddSSUAddress (const char * host, int port, const uint8_t * key, int mtu) { - Address addr; - addr.host = boost::asio::ip::address::from_string (host); - addr.port = port; - addr.transportStyle = eTransportSSU; - addr.cost = 10; // NTCP should have priority over SSU - addr.date = 0; - addr.mtu = mtu; - memcpy (addr.key, key, 32); + auto addr = std::make_shared
(); + addr->host = boost::asio::ip::address::from_string (host); + addr->port = port; + addr->transportStyle = eTransportSSU; + addr->cost = 10; // NTCP should have priority over SSU + addr->date = 0; + addr->mtu = mtu; + memcpy (addr->key, key, 32); for (auto it: m_Addresses) // don't insert same address twice if (it == addr) return; m_Addresses.push_back(addr); - m_SupportedTransports |= addr.host.is_v6 () ? eSSUV6 : eSSUV4; + m_SupportedTransports |= addr->host.is_v6 () ? eSSUV6 : eSSUV4; m_Caps |= eSSUTesting; m_Caps |= eSSUIntroducer; } bool RouterInfo::AddIntroducer (const Introducer& introducer) { - for (auto& addr : m_Addresses) + for (auto addr : m_Addresses) { - if (addr.transportStyle == eTransportSSU && addr.host.is_v4 ()) + if (addr->transportStyle == eTransportSSU && addr->host.is_v4 ()) { - for (auto intro: addr.introducers) + for (auto intro: addr->introducers) if (intro.iTag == introducer.iTag) return false; // already presented - addr.introducers.push_back (introducer); + addr->introducers.push_back (introducer); return true; } } @@ -591,14 +592,14 @@ namespace data bool RouterInfo::RemoveIntroducer (const boost::asio::ip::udp::endpoint& e) { - for (auto& addr : m_Addresses) + for (auto addr: m_Addresses) { - if (addr.transportStyle == eTransportSSU && addr.host.is_v4 ()) + if (addr->transportStyle == eTransportSSU && addr->host.is_v4 ()) { - for (std::vector::iterator it = addr.introducers.begin (); it != addr.introducers.end (); it++) + for (std::vector::iterator it = addr->introducers.begin (); it != addr->introducers.end (); it++) if ( boost::asio::ip::udp::endpoint (it->iHost, it->iPort) == e) { - addr.introducers.erase (it); + addr->introducers.erase (it); return true; } } @@ -664,8 +665,8 @@ namespace data m_SupportedTransports &= ~eNTCPV6; for (size_t i = 0; i < m_Addresses.size (); i++) { - if (m_Addresses[i].transportStyle == i2p::data::RouterInfo::eTransportNTCP && - m_Addresses[i].host.is_v6 ()) + if (m_Addresses[i]->transportStyle == i2p::data::RouterInfo::eTransportNTCP && + m_Addresses[i]->host.is_v6 ()) { m_Addresses.erase (m_Addresses.begin () + i); break; @@ -676,8 +677,8 @@ namespace data m_SupportedTransports &= ~eSSUV6; for (size_t i = 0; i < m_Addresses.size (); i++) { - if (m_Addresses[i].transportStyle == i2p::data::RouterInfo::eTransportSSU && - m_Addresses[i].host.is_v6 ()) + if (m_Addresses[i]->transportStyle == i2p::data::RouterInfo::eTransportSSU && + m_Addresses[i]->host.is_v6 ()) { m_Addresses.erase (m_Addresses.begin () + i); break; @@ -691,29 +692,29 @@ namespace data return m_Caps & Caps::eUnreachable; // non-reachable } - const RouterInfo::Address * RouterInfo::GetNTCPAddress (bool v4only) const + std::shared_ptr RouterInfo::GetNTCPAddress (bool v4only) const { return GetAddress (eTransportNTCP, v4only); } - const RouterInfo::Address * RouterInfo::GetSSUAddress (bool v4only) const + std::shared_ptr RouterInfo::GetSSUAddress (bool v4only) const { return GetAddress (eTransportSSU, v4only); } - const RouterInfo::Address * RouterInfo::GetSSUV6Address () const + std::shared_ptr RouterInfo::GetSSUV6Address () const { return GetAddress (eTransportSSU, false, true); } - const RouterInfo::Address * RouterInfo::GetAddress (TransportStyle s, bool v4only, bool v6only) const + std::shared_ptr RouterInfo::GetAddress (TransportStyle s, bool v4only, bool v6only) const { - for (auto& address : m_Addresses) + for (auto address : m_Addresses) { - if (address.transportStyle == s) + if (address->transportStyle == s) { - if ((!v4only || address.host.is_v4 ()) && (!v6only || address.host.is_v6 ())) - return &address; + if ((!v4only || address->host.is_v4 ()) && (!v6only || address->host.is_v6 ())) + return address; } } return nullptr; diff --git a/RouterInfo.h b/RouterInfo.h index c0ef2131..69607d4b 100644 --- a/RouterInfo.h +++ b/RouterInfo.h @@ -116,10 +116,10 @@ namespace data void SetRouterIdentity (std::shared_ptr identity); std::string GetIdentHashBase64 () const { return GetIdentHash ().ToBase64 (); }; uint64_t GetTimestamp () const { return m_Timestamp; }; - std::vector
& GetAddresses () { return m_Addresses; }; - const Address * GetNTCPAddress (bool v4only = true) const; - const Address * GetSSUAddress (bool v4only = true) const; - const Address * GetSSUV6Address () const; + std::vector >& GetAddresses () { return m_Addresses; }; + std::shared_ptr GetNTCPAddress (bool v4only = true) const; + std::shared_ptr GetSSUAddress (bool v4only = true) const; + std::shared_ptr GetSSUV6Address () const; void AddNTCPAddress (const char * host, int port); void AddSSUAddress (const char * host, int port, const uint8_t * key, int mtu = 0); @@ -182,7 +182,7 @@ namespace data size_t ReadString (char * str, std::istream& s); void WriteString (const std::string& str, std::ostream& s); void ExtractCaps (const char * value); - const Address * GetAddress (TransportStyle s, bool v4only, bool v6only = false) const; + std::shared_ptr GetAddress (TransportStyle s, bool v4only, bool v6only = false) const; void UpdateCapsProperty (); private: @@ -192,7 +192,7 @@ namespace data uint8_t * m_Buffer; size_t m_BufferLen; uint64_t m_Timestamp; - std::vector
m_Addresses; + std::vector > m_Addresses; std::map m_Properties; bool m_IsUpdated, m_IsUnreachable; uint8_t m_SupportedTransports, m_Caps; diff --git a/Transports.cpp b/Transports.cpp index 9b327133..c5d6c3cb 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -112,8 +112,8 @@ namespace transport m_IsRunning = true; m_Thread = new std::thread (std::bind (&Transports::Run, this)); // create acceptors - auto addresses = context.GetRouterInfo ().GetAddresses (); - for (auto& address : addresses) + auto& addresses = context.GetRouterInfo ().GetAddresses (); + for (auto address : addresses) { if (!m_NTCPServer) { @@ -121,12 +121,12 @@ namespace transport m_NTCPServer->Start (); } - if (address.transportStyle == RouterInfo::eTransportSSU && address.host.is_v4 ()) + if (address->transportStyle == RouterInfo::eTransportSSU && address->host.is_v4 ()) { if (!m_SSUServer) { - m_SSUServer = new SSUServer (address.port); - LogPrint (eLogInfo, "Transports: Start listening UDP port ", address.port); + m_SSUServer = new SSUServer (address->port); + LogPrint (eLogInfo, "Transports: Start listening UDP port ", address->port); m_SSUServer->Start (); DetectExternalIP (); }