forked from premiere/premiere-libtorrent
limit the number of DHT nodes to run
This commit is contained in:
parent
2c8cf4834b
commit
bc0274ed6a
|
@ -139,9 +139,17 @@ namespace aux {
|
||||||
|
|
||||||
struct TORRENT_EXTRA_EXPORT listen_socket_t : utp_socket_interface
|
struct TORRENT_EXTRA_EXPORT listen_socket_t : utp_socket_interface
|
||||||
{
|
{
|
||||||
|
// we accept incoming connections on this interface
|
||||||
static constexpr listen_socket_flags_t accept_incoming = 0_bit;
|
static constexpr listen_socket_flags_t accept_incoming = 0_bit;
|
||||||
|
|
||||||
|
// this interface has a gateway associated with it, and can
|
||||||
|
// route to the internet (of the same address family)
|
||||||
static constexpr listen_socket_flags_t has_gateway = 1_bit;
|
static constexpr listen_socket_flags_t has_gateway = 1_bit;
|
||||||
|
|
||||||
|
// this interface was expanded from the user requesting to
|
||||||
|
// listen on an unspecified address (either IPv4 or IPv6)
|
||||||
|
static constexpr listen_socket_flags_t was_expanded = 2_bit;
|
||||||
|
|
||||||
listen_socket_t() = default;
|
listen_socket_t() = default;
|
||||||
|
|
||||||
// listen_socket_t should not be copied or moved because
|
// listen_socket_t should not be copied or moved because
|
||||||
|
|
|
@ -116,14 +116,7 @@ namespace libtorrent { namespace dht {
|
||||||
|
|
||||||
void dht_tracker::new_socket(aux::listen_socket_handle const& s)
|
void dht_tracker::new_socket(aux::listen_socket_handle const& s)
|
||||||
{
|
{
|
||||||
if (s.is_ssl()) return;
|
|
||||||
|
|
||||||
address const local_address = s.get_local_endpoint().address();
|
address const local_address = s.get_local_endpoint().address();
|
||||||
// don't try to start dht nodes on non-global IPv6 addresses
|
|
||||||
// with IPv4 the interface might be behind NAT so we can't skip them based on the scope of the local address
|
|
||||||
// and we might not have the external address yet
|
|
||||||
if (local_address.is_v6() && is_local(local_address))
|
|
||||||
return;
|
|
||||||
auto stored_nid = std::find_if(m_state.nids.begin(), m_state.nids.end()
|
auto stored_nid = std::find_if(m_state.nids.begin(), m_state.nids.end()
|
||||||
, [&](node_ids_t::value_type const& nid) { return nid.first == local_address; });
|
, [&](node_ids_t::value_type const& nid) { return nid.first == local_address; });
|
||||||
node_id const nid = stored_nid != m_state.nids.end() ? stored_nid->second : node_id();
|
node_id const nid = stored_nid != m_state.nids.end() ? stored_nid->second : node_id();
|
||||||
|
@ -157,13 +150,6 @@ namespace libtorrent { namespace dht {
|
||||||
|
|
||||||
void dht_tracker::delete_socket(aux::listen_socket_handle const& s)
|
void dht_tracker::delete_socket(aux::listen_socket_handle const& s)
|
||||||
{
|
{
|
||||||
if (s.is_ssl()) return;
|
|
||||||
|
|
||||||
address local_address = s.get_local_endpoint().address();
|
|
||||||
// since we don't start nodes on local IPv6 interfaces we don't need to remove them either
|
|
||||||
if (local_address.is_v6() && is_local(local_address))
|
|
||||||
return;
|
|
||||||
TORRENT_ASSERT(m_nodes.count(s) == 1);
|
|
||||||
m_nodes.erase(s);
|
m_nodes.erase(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -200,6 +200,7 @@ namespace aux {
|
||||||
|
|
||||||
constexpr listen_socket_flags_t listen_socket_t::accept_incoming;
|
constexpr listen_socket_flags_t listen_socket_t::accept_incoming;
|
||||||
constexpr listen_socket_flags_t listen_socket_t::has_gateway;
|
constexpr listen_socket_flags_t listen_socket_t::has_gateway;
|
||||||
|
constexpr listen_socket_flags_t listen_socket_t::was_expanded;
|
||||||
|
|
||||||
constexpr ip_source_t session_interface::source_dht;
|
constexpr ip_source_t session_interface::source_dht;
|
||||||
constexpr ip_source_t session_interface::source_peer;
|
constexpr ip_source_t session_interface::source_peer;
|
||||||
|
@ -273,7 +274,7 @@ namespace aux {
|
||||||
}
|
}
|
||||||
|
|
||||||
eps.emplace_back(ipface.interface_address, uep.port, uep.device
|
eps.emplace_back(ipface.interface_address, uep.port, uep.device
|
||||||
, uep.ssl, uep.flags);
|
, uep.ssl, uep.flags | listen_socket_t::was_expanded);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1897,8 +1898,18 @@ namespace aux {
|
||||||
m_listen_sockets.emplace_back(s);
|
m_listen_sockets.emplace_back(s);
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_DHT
|
#ifndef TORRENT_DISABLE_DHT
|
||||||
if (m_dht)
|
// addresses that we expanded from an
|
||||||
|
// unspecified address don't get a DHT running
|
||||||
|
// on them, unless they have a gateway (in
|
||||||
|
// which case we believe they can reach the
|
||||||
|
// internet)
|
||||||
|
if (m_dht
|
||||||
|
&& s->ssl != transport::ssl
|
||||||
|
&& ((s->flags & listen_socket_t::has_gateway)
|
||||||
|
|| !(s->flags & listen_socket_t::was_expanded)))
|
||||||
|
{
|
||||||
m_dht->new_socket(m_listen_sockets.back());
|
m_dht->new_socket(m_listen_sockets.back());
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TORRENT_ASSERT(bool(s->flags & listen_socket_t::accept_incoming) == bool(s->sock));
|
TORRENT_ASSERT(bool(s->flags & listen_socket_t::accept_incoming) == bool(s->sock));
|
||||||
|
@ -5745,7 +5756,14 @@ namespace aux {
|
||||||
, std::move(m_dht_state));
|
, std::move(m_dht_state));
|
||||||
|
|
||||||
for (auto& s : m_listen_sockets)
|
for (auto& s : m_listen_sockets)
|
||||||
|
{
|
||||||
|
if (s->ssl != transport::ssl
|
||||||
|
&& ((s->flags & listen_socket_t::has_gateway)
|
||||||
|
|| !(s->flags & listen_socket_t::was_expanded)))
|
||||||
|
{
|
||||||
m_dht->new_socket(s);
|
m_dht->new_socket(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (auto const& n : m_dht_router_nodes)
|
for (auto const& n : m_dht_router_nodes)
|
||||||
{
|
{
|
||||||
|
|
|
@ -121,6 +121,8 @@ TORRENT_TEST(dht_state)
|
||||||
params.dht_settings = sett;
|
params.dht_settings = sett;
|
||||||
params.dht_state = s;
|
params.dht_state = s;
|
||||||
|
|
||||||
|
params.settings.set_str(settings_pack::listen_interfaces, "127.0.0.1:6881");
|
||||||
|
|
||||||
lt::session ses1(params);
|
lt::session ses1(params);
|
||||||
TEST_CHECK(ses1.is_dht_running() == true);
|
TEST_CHECK(ses1.is_dht_running() == true);
|
||||||
entry e;
|
entry e;
|
||||||
|
@ -138,11 +140,10 @@ TORRENT_TEST(dht_state)
|
||||||
TEST_EQUAL(params1.dht_settings.max_dht_items, 10000);
|
TEST_EQUAL(params1.dht_settings.max_dht_items, 10000);
|
||||||
TEST_EQUAL(params1.dht_settings.max_peers, 20000);
|
TEST_EQUAL(params1.dht_settings.max_peers, 20000);
|
||||||
|
|
||||||
|
TEST_EQUAL(params1.dht_state.nids.size(), 1);
|
||||||
|
|
||||||
// not a chance the nid will be the fake initial ones
|
// not a chance the nid will be the fake initial ones
|
||||||
TEST_CHECK(params1.dht_state.nids[0].second != s.nids[0].second);
|
TEST_CHECK(params1.dht_state.nids[0].second != s.nids[0].second);
|
||||||
// the host machine may not have IPv6 support in which case there will only be one entry
|
|
||||||
if (params1.dht_state.nids.size() > 1)
|
|
||||||
TEST_CHECK(params1.dht_state.nids[1].second != s.nids[1].second);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue