diff --git a/CMakeLists.txt b/CMakeLists.txt index 8182ec25d..874861bc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,6 +155,7 @@ set(kademlia_sources get_item ed25519 sample_infohashes + dht_settings ) # -- ed25519 -- diff --git a/Jamfile b/Jamfile index 8704fd582..daa5279f4 100644 --- a/Jamfile +++ b/Jamfile @@ -693,6 +693,7 @@ KADEMLIA_SOURCES = put_data ed25519 sample_infohashes + dht_settings ; ED25519_SOURCES = diff --git a/bindings/python/src/session_settings.cpp b/bindings/python/src/session_settings.cpp index 40cab5964..7e28b905f 100644 --- a/bindings/python/src/session_settings.cpp +++ b/bindings/python/src/session_settings.cpp @@ -98,27 +98,27 @@ void bind_session_settings() #endif #ifndef TORRENT_DISABLE_DHT - class_("dht_settings") - .def_readwrite("max_peers_reply", &dht_settings::max_peers_reply) - .def_readwrite("search_branching", &dht_settings::search_branching) + class_("dht_settings") + .def_readwrite("max_peers_reply", &dht::dht_settings::max_peers_reply) + .def_readwrite("search_branching", &dht::dht_settings::search_branching) #ifndef TORRENT_NO_DEPRECATE - .def_readwrite("service_port", &dht_settings::service_port) + .def_readwrite("service_port", &dht::dht_settings::service_port) #endif - .def_readwrite("max_fail_count", &dht_settings::max_fail_count) - .def_readwrite("max_torrents", &dht_settings::max_torrents) - .def_readwrite("max_dht_items", &dht_settings::max_dht_items) - .def_readwrite("restrict_routing_ips", &dht_settings::restrict_routing_ips) - .def_readwrite("restrict_search_ips", &dht_settings::restrict_search_ips) - .def_readwrite("max_torrent_search_reply", &dht_settings::max_torrent_search_reply) - .def_readwrite("extended_routing_table", &dht_settings::extended_routing_table) - .def_readwrite("aggressive_lookups", &dht_settings::aggressive_lookups) - .def_readwrite("privacy_lookups", &dht_settings::privacy_lookups) - .def_readwrite("enforce_node_id", &dht_settings::enforce_node_id) - .def_readwrite("ignore_dark_internet", &dht_settings::ignore_dark_internet) - .def_readwrite("block_timeout", &dht_settings::block_timeout) - .def_readwrite("block_ratelimit", &dht_settings::block_ratelimit) - .def_readwrite("read_only", &dht_settings::read_only) - .def_readwrite("item_lifetime", &dht_settings::item_lifetime) + .def_readwrite("max_fail_count", &dht::dht_settings::max_fail_count) + .def_readwrite("max_torrents", &dht::dht_settings::max_torrents) + .def_readwrite("max_dht_items", &dht::dht_settings::max_dht_items) + .def_readwrite("restrict_routing_ips", &dht::dht_settings::restrict_routing_ips) + .def_readwrite("restrict_search_ips", &dht::dht_settings::restrict_search_ips) + .def_readwrite("max_torrent_search_reply", &dht::dht_settings::max_torrent_search_reply) + .def_readwrite("extended_routing_table", &dht::dht_settings::extended_routing_table) + .def_readwrite("aggressive_lookups", &dht::dht_settings::aggressive_lookups) + .def_readwrite("privacy_lookups", &dht::dht_settings::privacy_lookups) + .def_readwrite("enforce_node_id", &dht::dht_settings::enforce_node_id) + .def_readwrite("ignore_dark_internet", &dht::dht_settings::ignore_dark_internet) + .def_readwrite("block_timeout", &dht::dht_settings::block_timeout) + .def_readwrite("block_ratelimit", &dht::dht_settings::block_ratelimit) + .def_readwrite("read_only", &dht::dht_settings::read_only) + .def_readwrite("item_lifetime", &dht::dht_settings::item_lifetime) ; #endif diff --git a/bindings/python/src/torrent_info.cpp b/bindings/python/src/torrent_info.cpp index 18dc72cce..bb4b49dbe 100644 --- a/bindings/python/src/torrent_info.cpp +++ b/bindings/python/src/torrent_info.cpp @@ -6,7 +6,6 @@ #include #include "libtorrent/torrent_info.hpp" -#include "libtorrent/session_settings.hpp" #include "libtorrent/time.hpp" #include "libtorrent/socket_io.hpp" #include "libtorrent/announce_entry.hpp" diff --git a/include/libtorrent/aux_/session_impl.hpp b/include/libtorrent/aux_/session_impl.hpp index 978cb5195..5f52f794e 100644 --- a/include/libtorrent/aux_/session_impl.hpp +++ b/include/libtorrent/aux_/session_impl.hpp @@ -128,11 +128,6 @@ namespace aux { struct tracker_logger; #endif -#ifndef TORRENT_DISABLE_DHT - TORRENT_EXTRA_EXPORT dht_settings read_dht_settings(bdecode_node const& e); - TORRENT_EXTRA_EXPORT entry save_dht_settings(dht_settings const& settings); -#endif - struct listen_socket_t { listen_socket_t() @@ -371,8 +366,8 @@ namespace aux { void add_dht_node_name(std::pair const& node); void add_dht_node(udp::endpoint const& n) override; void add_dht_router(std::pair const& node); - void set_dht_settings(dht_settings const& s); - dht_settings const& get_dht_settings() const { return m_dht_settings; } + void set_dht_settings(dht::dht_settings const& s); + dht::dht_settings const& get_dht_settings() const { return m_dht_settings; } void set_dht_state(dht::dht_state state); void set_dht_storage(dht::dht_storage_constructor_type sc); void start_dht(); @@ -1039,7 +1034,7 @@ namespace aux { #ifndef TORRENT_DISABLE_DHT std::unique_ptr m_dht_storage; std::shared_ptr m_dht; - dht_settings m_dht_settings; + dht::dht_settings m_dht_settings; dht::dht_storage_constructor_type m_dht_storage_constructor = dht::dht_default_storage_constructor; @@ -1156,9 +1151,6 @@ namespace aux { #endif // mask is a bitmask of which protocols to remap on: - // 1: NAT-PMP - // 2: UPnP - // TODO: 3 perhaps this function should move into listen_socket_t enum remap_port_mask_t { remap_natpmp = 1, diff --git a/include/libtorrent/fwd.hpp b/include/libtorrent/fwd.hpp index 6a443fd36..9b745a61d 100644 --- a/include/libtorrent/fwd.hpp +++ b/include/libtorrent/fwd.hpp @@ -204,7 +204,6 @@ class session; struct session_handle; // include/libtorrent/session_settings.hpp -struct dht_settings; struct pe_settings; // include/libtorrent/session_stats.hpp @@ -239,6 +238,9 @@ struct torrent_status; namespace dht { +// include/libtorrent/kademlia/dht_settings.hpp +struct dht_settings; + // include/libtorrent/kademlia/dht_state.hpp struct dht_state; diff --git a/include/libtorrent/http_connection.hpp b/include/libtorrent/http_connection.hpp index 1cd8454cb..87ac15819 100644 --- a/include/libtorrent/http_connection.hpp +++ b/include/libtorrent/http_connection.hpp @@ -54,7 +54,6 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/deadline_timer.hpp" #include "libtorrent/assert.hpp" #include "libtorrent/socket_type.hpp" -#include "libtorrent/session_settings.hpp" #include "libtorrent/i2p_stream.hpp" #include "libtorrent/aux_/vector.hpp" #include "libtorrent/resolver_interface.hpp" diff --git a/include/libtorrent/i2p_stream.hpp b/include/libtorrent/i2p_stream.hpp index 868d790cf..24557c859 100644 --- a/include/libtorrent/i2p_stream.hpp +++ b/include/libtorrent/i2p_stream.hpp @@ -43,9 +43,9 @@ POSSIBILITY OF SUCH DAMAGE. #include #include "libtorrent/proxy_base.hpp" -#include "libtorrent/session_settings.hpp" #include "libtorrent/string_util.hpp" #include "libtorrent/aux_/vector.hpp" +#include "libtorrent/aux_/proxy_settings.hpp" namespace libtorrent { diff --git a/include/libtorrent/kademlia/dht_observer.hpp b/include/libtorrent/kademlia/dht_observer.hpp index 41b5d9d74..d4d096b51 100644 --- a/include/libtorrent/kademlia/dht_observer.hpp +++ b/include/libtorrent/kademlia/dht_observer.hpp @@ -35,10 +35,13 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/config.hpp" #include "libtorrent/address.hpp" +#include "libtorrent/string_view.hpp" #include "libtorrent/kademlia/msg.hpp" namespace libtorrent { +class entry; + namespace aux { struct listen_socket_handle; } namespace dht { diff --git a/include/libtorrent/kademlia/dht_settings.hpp b/include/libtorrent/kademlia/dht_settings.hpp new file mode 100644 index 000000000..691c94a83 --- /dev/null +++ b/include/libtorrent/kademlia/dht_settings.hpp @@ -0,0 +1,176 @@ +/* + +Copyright (c) 2006, Arvid Norberg +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef TORRENT_DHT_SETTINGS_HPP_INCLUDED +#define TORRENT_DHT_SETTINGS_HPP_INCLUDED + +#include "libtorrent/config.hpp" +#include "libtorrent/bdecode.hpp" +#include "libtorrent/entry.hpp" + +namespace libtorrent { +namespace dht { + + // structure used to hold configuration options for the DHT + // + // The ``dht_settings`` struct used to contain a ``service_port`` member to + // control which port the DHT would listen on and send messages from. This + // field is deprecated and ignored. libtorrent always tries to open the UDP + // socket on the same port as the TCP socket. + struct TORRENT_EXPORT dht_settings + { + // the maximum number of peers to send in a reply to ``get_peers`` + int max_peers_reply = 100; + + // the number of concurrent search request the node will send when + // announcing and refreshing the routing table. This parameter is called + // alpha in the kademlia paper + int search_branching = 5; + + // the maximum number of failed tries to contact a node before it is + // removed from the routing table. If there are known working nodes that + // are ready to replace a failing node, it will be replaced immediately, + // this limit is only used to clear out nodes that don't have any node + // that can replace them. + int max_fail_count = 20; + + // the total number of torrents to track from the DHT. This is simply an + // upper limit to make sure malicious DHT nodes cannot make us allocate + // an unbounded amount of memory. + int max_torrents = 2000; + + // max number of items the DHT will store + int max_dht_items = 700; + + // the max number of peers to store per torrent (for the DHT) + int max_peers = 500; + + // the max number of torrents to return in a torrent search query to the + // DHT + int max_torrent_search_reply = 20; + + // determines if the routing table entries should restrict entries to one + // per IP. This defaults to true, which helps mitigate some attacks on + // the DHT. It prevents adding multiple nodes with IPs with a very close + // CIDR distance. + // + // when set, nodes whose IP address that's in the same /24 (or /64 for + // IPv6) range in the same routing table bucket. This is an attempt to + // mitigate node ID spoofing attacks also restrict any IP to only have a + // single entry in the whole routing table + bool restrict_routing_ips = true; + + // determines if DHT searches should prevent adding nodes with IPs with + // very close CIDR distance. This also defaults to true and helps + // mitigate certain attacks on the DHT. + bool restrict_search_ips = true; + + // makes the first buckets in the DHT routing table fit 128, 64, 32 and + // 16 nodes respectively, as opposed to the standard size of 8. All other + // buckets have size 8 still. + bool extended_routing_table = true; + + // slightly changes the lookup behavior in terms of how many outstanding + // requests we keep. Instead of having branch factor be a hard limit, we + // always keep *branch factor* outstanding requests to the closest nodes. + // i.e. every time we get results back with closer nodes, we query them + // right away. It lowers the lookup times at the cost of more outstanding + // queries. + bool aggressive_lookups = true; + + // when set, perform lookups in a way that is slightly more expensive, + // but which minimizes the amount of information leaked about you. + bool privacy_lookups = false; + + // when set, node's whose IDs that are not correctly generated based on + // its external IP are ignored. When a query arrives from such node, an + // error message is returned with a message saying "invalid node ID". + bool enforce_node_id = false; + + // ignore DHT messages from parts of the internet we wouldn't expect to + // see any traffic from + bool ignore_dark_internet = true; + + // the number of seconds a DHT node is banned if it exceeds the rate + // limit. The rate limit is averaged over 10 seconds to allow for bursts + // above the limit. + int block_timeout = 5 * 60; + + // the max number of packets per second a DHT node is allowed to send + // without getting banned. + int block_ratelimit = 5; + + // when set, the other nodes won't keep this node in their routing + // tables, it's meant for low-power and/or ephemeral devices that + // cannot support the DHT, it is also useful for mobile devices which + // are sensitive to network traffic and battery life. + // this node no longer responds to 'query' messages, and will place a + // 'ro' key (value = 1) in the top-level message dictionary of outgoing + // query messages. + bool read_only = false; + + // the number of seconds a immutable/mutable item will be expired. + // default is 0, means never expires. + int item_lifetime = 0; + + // the number of bytes per second (on average) the DHT is allowed to send. + // If the incoming requests causes to many bytes to be sent in responses, + // incoming requests will be dropped until the quota has been replenished. + int upload_rate_limit = 8000; + + // the info-hashes sample recomputation interval (in seconds). + // The node will precompute a subset of the tracked info-hashes and return + // that instead of calculating it upon each request. The permissible range + // is between 0 and 21600 seconds (inclusive). + int sample_infohashes_interval = 21600; + + // the maximum number of elements in the sampled subset of info-hashes. + // If this number is too big, expect the DHT storage implementations + // to clamp it in order to allow UDP packets go through + int max_infohashes_sample_count = 20; + +#ifndef TORRENT_NO_DEPRECATE + // the listen port for the dht. This is a UDP port. zero means use the + // same as the tcp interface + int service_port = 0; +#endif + + }; + + +TORRENT_EXTRA_EXPORT dht_settings read_dht_settings(bdecode_node const& e); +TORRENT_EXTRA_EXPORT entry save_dht_settings(dht_settings const& settings); + +} +} + +#endif diff --git a/include/libtorrent/kademlia/dht_storage.hpp b/include/libtorrent/kademlia/dht_storage.hpp index 9914138b0..e2f1f6156 100644 --- a/include/libtorrent/kademlia/dht_storage.hpp +++ b/include/libtorrent/kademlia/dht_storage.hpp @@ -45,11 +45,12 @@ POSSIBILITY OF SUCH DAMAGE. namespace libtorrent { - struct dht_settings; class entry; } namespace libtorrent { namespace dht { + struct dht_settings; + // This structure hold the relevant counters for the storage struct TORRENT_EXPORT dht_storage_counters { diff --git a/include/libtorrent/kademlia/dht_tracker.hpp b/include/libtorrent/kademlia/dht_tracker.hpp index 44cb15021..16c32dd9c 100644 --- a/include/libtorrent/kademlia/dht_tracker.hpp +++ b/include/libtorrent/kademlia/dht_tracker.hpp @@ -45,17 +45,18 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include namespace libtorrent { struct counters; - struct dht_settings; #ifndef TORRENT_NO_DEPRECATE struct session_status; #endif } namespace libtorrent { namespace dht { + struct dht_settings; struct TORRENT_EXTRA_EXPORT dht_tracker final : socket_manager @@ -149,7 +150,7 @@ namespace libtorrent { namespace dht { { tracker_node(io_service& ios , aux::listen_socket_handle const& s, socket_manager* sock - , libtorrent::dht_settings const& settings + , dht_settings const& settings , node_id const& nid , dht_observer* observer, counters& cnt , get_foreign_node_t get_foreign_node diff --git a/include/libtorrent/kademlia/node.hpp b/include/libtorrent/kademlia/node.hpp index efae62c29..58806892a 100644 --- a/include/libtorrent/kademlia/node.hpp +++ b/include/libtorrent/kademlia/node.hpp @@ -40,6 +40,7 @@ POSSIBILITY OF SUCH DAMAGE. #include #include +#include #include #include #include @@ -54,7 +55,6 @@ namespace libtorrent { struct counters; struct dht_routing_bucket; - struct dht_settings; } namespace libtorrent { namespace dht { @@ -91,7 +91,7 @@ class TORRENT_EXTRA_EXPORT node : boost::noncopyable { public: node(aux::listen_socket_handle const& sock, socket_manager* sock_man - , libtorrent::dht_settings const& settings + , dht_settings const& settings , node_id const& nid , dht_observer* observer, counters& cnt , get_foreign_node_t get_foreign_node @@ -194,7 +194,7 @@ public: void status(libtorrent::session_status& s); #endif - libtorrent::dht_settings const& settings() const { return m_settings; } + dht_settings const& settings() const { return m_settings; } counters& stats_counters() const { return m_counters; } dht_observer* observer() const { return m_observer; } @@ -220,7 +220,7 @@ private: bool lookup_peers(sha1_hash const& info_hash, entry& reply , bool noseed, bool scrape, address const& requester) const; - libtorrent::dht_settings const& m_settings; + dht_settings const& m_settings; std::mutex m_mutex; diff --git a/include/libtorrent/kademlia/routing_table.hpp b/include/libtorrent/kademlia/routing_table.hpp index 4eb2fceca..fd06946be 100644 --- a/include/libtorrent/kademlia/routing_table.hpp +++ b/include/libtorrent/kademlia/routing_table.hpp @@ -42,7 +42,6 @@ POSSIBILITY OF SUCH DAMAGE. #include #include -#include #include #include #include @@ -57,6 +56,7 @@ namespace libtorrent { namespace libtorrent { namespace dht { +struct dht_settings; struct dht_logger; typedef aux::vector bucket_t; diff --git a/include/libtorrent/kademlia/rpc_manager.hpp b/include/libtorrent/kademlia/rpc_manager.hpp index 39a1f88a3..b09577fd7 100644 --- a/include/libtorrent/kademlia/rpc_manager.hpp +++ b/include/libtorrent/kademlia/rpc_manager.hpp @@ -46,10 +46,12 @@ POSSIBILITY OF SUCH DAMAGE. #include #include -namespace libtorrent { struct dht_settings; class entry; } +namespace libtorrent { class entry; } -namespace libtorrent { namespace dht { +namespace libtorrent { +namespace dht { +struct dht_settings; struct dht_logger; struct socket_manager; diff --git a/include/libtorrent/kademlia/traversal_algorithm.hpp b/include/libtorrent/kademlia/traversal_algorithm.hpp index c19ba52ca..73ee5df78 100644 --- a/include/libtorrent/kademlia/traversal_algorithm.hpp +++ b/include/libtorrent/kademlia/traversal_algorithm.hpp @@ -42,6 +42,7 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include namespace libtorrent { diff --git a/include/libtorrent/session.hpp b/include/libtorrent/session.hpp index 4d31244cc..940731253 100644 --- a/include/libtorrent/session.hpp +++ b/include/libtorrent/session.hpp @@ -40,7 +40,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/io_service.hpp" #include "libtorrent/settings_pack.hpp" #include "libtorrent/session_handle.hpp" -#include "libtorrent/session_settings.hpp" // for dht_settings +#include "libtorrent/kademlia/dht_settings.hpp" #include "libtorrent/kademlia/dht_state.hpp" #include "libtorrent/kademlia/dht_storage.hpp" @@ -153,7 +153,7 @@ namespace aux { std::vector> extensions; - libtorrent::dht_settings dht_settings; + dht::dht_settings dht_settings; dht::dht_state dht_state; diff --git a/include/libtorrent/session_handle.hpp b/include/libtorrent/session_handle.hpp index f0db1c766..05416c538 100644 --- a/include/libtorrent/session_handle.hpp +++ b/include/libtorrent/session_handle.hpp @@ -47,6 +47,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/portmap.hpp" // for portmap_protocol #include "libtorrent/kademlia/dht_storage.hpp" +#include "libtorrent/kademlia/dht_settings.hpp" #ifndef TORRENT_NO_DEPRECATE #include "libtorrent/session_settings.hpp" @@ -332,9 +333,9 @@ namespace libtorrent { // otherwise. // // ``get_dht_settings()`` returns the current settings - void set_dht_settings(dht_settings const& settings); + void set_dht_settings(dht::dht_settings const& settings); bool is_dht_running() const; - dht_settings get_dht_settings() const; + dht::dht_settings get_dht_settings() const; // ``set_dht_storage`` set a dht custom storage constructor function // to be used internally when the dht is created. diff --git a/include/libtorrent/session_settings.hpp b/include/libtorrent/session_settings.hpp index c648223c5..fa14c5309 100644 --- a/include/libtorrent/session_settings.hpp +++ b/include/libtorrent/session_settings.hpp @@ -33,179 +33,24 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef TORRENT_SESSION_SETTINGS_HPP_INCLUDED #define TORRENT_SESSION_SETTINGS_HPP_INCLUDED +#ifndef TORRENT_NO_DEPRECATE + #include "libtorrent/config.hpp" #include "libtorrent/settings_pack.hpp" #include "libtorrent/aux_/proxy_settings.hpp" -#ifndef TORRENT_NO_DEPRECATE -#include "libtorrent/version.hpp" -#endif +#include "libtorrent/kademlia/dht_settings.hpp" #include namespace libtorrent { -#ifndef TORRENT_NO_DEPRECATE + using dht_settings = dht::dht_settings; using aux::proxy_settings; -#endif - - // structure used to hold configuration options for the DHT - // - // The ``dht_settings`` struct used to contain a ``service_port`` member to - // control which port the DHT would listen on and send messages from. This - // field is deprecated and ignored. libtorrent always tries to open the UDP - // socket on the same port as the TCP socket. - struct TORRENT_EXPORT dht_settings - { - // initialized dht_settings to the default values - dht_settings() - : max_peers_reply(100) - , search_branching(5) -#ifndef TORRENT_NO_DEPRECATE - , service_port(0) -#endif - , max_fail_count(20) - , max_torrents(2000) - , max_dht_items(700) - , max_peers(5000) - , max_torrent_search_reply(20) - , restrict_routing_ips(true) - , restrict_search_ips(true) - , extended_routing_table(true) - , aggressive_lookups(true) - , privacy_lookups(false) - , enforce_node_id(false) - , ignore_dark_internet(true) - , block_timeout(5 * 60) - , block_ratelimit(5) - , read_only(false) - , item_lifetime(0) - , upload_rate_limit(8000) - {} - - // the maximum number of peers to send in a reply to ``get_peers`` - int max_peers_reply; - - // the number of concurrent search request the node will send when - // announcing and refreshing the routing table. This parameter is called - // alpha in the kademlia paper - int search_branching; - -#ifndef TORRENT_NO_DEPRECATE - // the listen port for the dht. This is a UDP port. zero means use the - // same as the tcp interface - int service_port; -#endif - - // the maximum number of failed tries to contact a node before it is - // removed from the routing table. If there are known working nodes that - // are ready to replace a failing node, it will be replaced immediately, - // this limit is only used to clear out nodes that don't have any node - // that can replace them. - int max_fail_count; - - // the total number of torrents to track from the DHT. This is simply an - // upper limit to make sure malicious DHT nodes cannot make us allocate - // an unbounded amount of memory. - int max_torrents; - - // max number of items the DHT will store - int max_dht_items; - - // the max number of peers to store per torrent (for the DHT) - int max_peers; - - // the max number of torrents to return in a torrent search query to the - // DHT - int max_torrent_search_reply; - - // determines if the routing table entries should restrict entries to one - // per IP. This defaults to true, which helps mitigate some attacks on - // the DHT. It prevents adding multiple nodes with IPs with a very close - // CIDR distance. - // - // when set, nodes whose IP address that's in the same /24 (or /64 for - // IPv6) range in the same routing table bucket. This is an attempt to - // mitigate node ID spoofing attacks also restrict any IP to only have a - // single entry in the whole routing table - bool restrict_routing_ips; - - // determines if DHT searches should prevent adding nodes with IPs with - // very close CIDR distance. This also defaults to true and helps - // mitigate certain attacks on the DHT. - bool restrict_search_ips; - - // makes the first buckets in the DHT routing table fit 128, 64, 32 and - // 16 nodes respectively, as opposed to the standard size of 8. All other - // buckets have size 8 still. - bool extended_routing_table; - - // slightly changes the lookup behavior in terms of how many outstanding - // requests we keep. Instead of having branch factor be a hard limit, we - // always keep *branch factor* outstanding requests to the closest nodes. - // i.e. every time we get results back with closer nodes, we query them - // right away. It lowers the lookup times at the cost of more outstanding - // queries. - bool aggressive_lookups; - - // when set, perform lookups in a way that is slightly more expensive, - // but which minimizes the amount of information leaked about you. - bool privacy_lookups; - - // when set, node's whose IDs that are not correctly generated based on - // its external IP are ignored. When a query arrives from such node, an - // error message is returned with a message saying "invalid node ID". - bool enforce_node_id; - - // ignore DHT messages from parts of the internet we wouldn't expect to - // see any traffic from - bool ignore_dark_internet; - - // the number of seconds a DHT node is banned if it exceeds the rate - // limit. The rate limit is averaged over 10 seconds to allow for bursts - // above the limit. - int block_timeout; - - // the max number of packets per second a DHT node is allowed to send - // without getting banned. - int block_ratelimit; - - // when set, the other nodes won't keep this node in their routing - // tables, it's meant for low-power and/or ephemeral devices that - // cannot support the DHT, it is also useful for mobile devices which - // are sensitive to network traffic and battery life. - // this node no longer responds to 'query' messages, and will place a - // 'ro' key (value = 1) in the top-level message dictionary of outgoing - // query messages. - bool read_only; - - // the number of seconds a immutable/mutable item will be expired. - // default is 0, means never expires. - int item_lifetime; - - // the number of bytes per second (on average) the DHT is allowed to send. - // If the incoming requests causes to many bytes to be sent in responses, - // incoming requests will be dropped until the quota has been replenished. - int upload_rate_limit; - - // the info-hashes sample recomputation interval (in seconds). - // The node will precompute a subset of the tracked info-hashes and return - // that instead of calculating it upon each request. The permissible range - // is between 0 and 21600 seconds (inclusive). - int sample_infohashes_interval = 21600; - - // the maximum number of elements in the sampled subset of info-hashes. - // If this number is too big, expect the DHT storage implementations - // to clamp it in order to allow UDP packets go through - int max_infohashes_sample_count = 20; - }; - - -#ifndef TORRENT_NO_DEPRECATE // The ``pe_settings`` structure is used to control the settings related // to peer protocol encryption. - struct TORRENT_EXPORT pe_settings + struct TORRENT_DEPRECATED_EXPORT pe_settings { // initializes the encryption settings with the default values pe_settings() @@ -262,8 +107,7 @@ namespace libtorrent { // otherwise bool prefer_rc4; }; -#endif // TORRENT_NO_DEPRECATE - } +#endif // TORRENT_NO_DEPRECATE #endif diff --git a/simulation/setup_dht.cpp b/simulation/setup_dht.cpp index c9f26105b..259c4a297 100644 --- a/simulation/setup_dht.cpp +++ b/simulation/setup_dht.cpp @@ -30,7 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. */ -#include "libtorrent/session_settings.hpp" +#include "libtorrent/kademlia/dht_settings.hpp" #include "libtorrent/io_service.hpp" #include "libtorrent/deadline_timer.hpp" #include "libtorrent/address.hpp" @@ -89,7 +89,7 @@ namespace { struct dht_node final : lt::dht::socket_manager { - dht_node(sim::simulation& sim, lt::dht_settings const& sett, lt::counters& cnt + dht_node(sim::simulation& sim, lt::dht::dht_settings const& sett, lt::counters& cnt , int const idx, std::uint32_t const flags) : m_io_service(sim, (flags & dht_network::bind_ipv6) ? addr6_from_int(idx) : addr_from_int(idx)) , m_dht_storage(lt::dht::dht_default_storage_constructor(sett)) diff --git a/simulation/setup_dht.hpp b/simulation/setup_dht.hpp index acb92b8ec..edbfaed9e 100644 --- a/simulation/setup_dht.hpp +++ b/simulation/setup_dht.hpp @@ -35,7 +35,7 @@ POSSIBILITY OF SUCH DAMAGE. #define TORRENT_SETUP_DHT_HPP_INCLUDED #include -#include "libtorrent/session_settings.hpp" // for dht_settings +#include "libtorrent/kademlia/dht_settings.hpp" // for dht_settings #include "libtorrent/performance_counters.hpp" // for counters @@ -71,7 +71,7 @@ private: // used for all the nodes in the network lt::counters m_cnt; - lt::dht_settings m_sett; + lt::dht::dht_settings m_sett; std::list m_nodes; }; diff --git a/simulation/setup_swarm.cpp b/simulation/setup_swarm.cpp index 9f1b07138..9f490cc9e 100644 --- a/simulation/setup_swarm.cpp +++ b/simulation/setup_swarm.cpp @@ -31,7 +31,6 @@ POSSIBILITY OF SUCH DAMAGE. */ #include "libtorrent/session.hpp" -#include "libtorrent/session_settings.hpp" #include "libtorrent/io_service.hpp" #include "libtorrent/deadline_timer.hpp" #include "libtorrent/address.hpp" diff --git a/simulation/test_dht.cpp b/simulation/test_dht.cpp index adf2fc69b..b368e8fdc 100644 --- a/simulation/test_dht.cpp +++ b/simulation/test_dht.cpp @@ -37,7 +37,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/alert.hpp" #include "libtorrent/time.hpp" #include "libtorrent/settings_pack.hpp" -#include "libtorrent/session_settings.hpp" +#include "libtorrent/kademlia/dht_settings.hpp" #include "libtorrent/session.hpp" #include "libtorrent/session_stats.hpp" #include "libtorrent/alert_types.hpp" @@ -53,7 +53,7 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef TORRENT_DISABLE_DHT void bootstrap_session(std::vector networks, lt::session& ses) { - lt::dht_settings sett; + lt::dht::dht_settings sett; sett.ignore_dark_internet = false; ses.set_dht_settings(sett); diff --git a/simulation/test_dht_rate_limit.cpp b/simulation/test_dht_rate_limit.cpp index 599ebce8e..ca17f7550 100644 --- a/simulation/test_dht_rate_limit.cpp +++ b/simulation/test_dht_rate_limit.cpp @@ -41,7 +41,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/kademlia/dht_state.hpp" #include "libtorrent/performance_counters.hpp" #include "libtorrent/entry.hpp" -#include "libtorrent/session_settings.hpp" +#include "libtorrent/kademlia/dht_settings.hpp" #include "libtorrent/span.hpp" #include "libtorrent/kademlia/dht_observer.hpp" @@ -109,7 +109,7 @@ TORRENT_TEST(dht_rate_limit) ls->local_endpoint = tcp::endpoint(address_v4::from_string("40.30.20.10"), 8888); error_code ec; sock.bind(udp::endpoint(address_v4::from_string("40.30.20.10"), 8888), ec); - dht_settings dhtsett; + dht::dht_settings dhtsett; dhtsett.block_ratelimit = 100000; // disable the DOS blocker dhtsett.ignore_dark_internet = false; dhtsett.upload_rate_limit = 400; @@ -235,7 +235,7 @@ TORRENT_TEST(dht_delete_socket) auto ls = std::make_shared(); ls->external_address.cast_vote(address_v4::from_string("40.30.20.10"), 1, lt::address()); ls->local_endpoint = tcp::endpoint(address_v4::from_string("40.30.20.10"), 8888); - dht_settings dhtsett; + dht::dht_settings dhtsett; counters cnt; dht::dht_state state; std::unique_ptr dht_storage(dht::dht_default_storage_constructor(dhtsett)); diff --git a/simulation/test_dht_storage.cpp b/simulation/test_dht_storage.cpp index bb3e203da..6f720377a 100644 --- a/simulation/test_dht_storage.cpp +++ b/simulation/test_dht_storage.cpp @@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "setup_transfer.hpp" // for ep() #include "libtorrent/config.hpp" #include "libtorrent/kademlia/dht_storage.hpp" +#include "libtorrent/kademlia/dht_settings.hpp" #include "libtorrent/io_service.hpp" #include "libtorrent/address.hpp" @@ -59,8 +60,8 @@ using namespace std::placeholders; namespace { - dht_settings test_settings() { - dht_settings sett; + dht::dht_settings test_settings() { + dht::dht_settings sett; sett.max_torrents = 2; sett.max_dht_items = 2; sett.item_lifetime = int(seconds(120 * 60).count()); @@ -68,7 +69,7 @@ namespace } std::unique_ptr create_default_dht_storage( - dht_settings const& sett) + dht::dht_settings const& sett) { std::unique_ptr s(dht_default_storage_constructor(sett)); TEST_CHECK(s.get() != nullptr); @@ -110,7 +111,7 @@ void test_expiration(high_resolution_clock::duration const& expiry_time TORRENT_TEST(dht_storage_counters) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); std::unique_ptr s(create_default_dht_storage(sett)); TEST_CHECK(s.get() != nullptr); @@ -164,7 +165,7 @@ TORRENT_TEST(dht_storage_counters) TORRENT_TEST(dht_storage_infohashes_sample) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.max_torrents = 5; sett.sample_infohashes_interval = 30; sett.max_infohashes_sample_count = 2; diff --git a/src/Makefile.am b/src/Makefile.am index 3d5fc3636..dd20cbc32 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,6 +23,7 @@ KADEMLIA_SOURCES = \ kademlia/item.cpp \ kademlia/ed25519.cpp \ kademlia/sample_infohashes.cpp \ + kademlia/dht_settings.cpp \ ../ed25519/src/add_scalar.cpp \ ../ed25519/src/fe.cpp \ ../ed25519/src/ge.cpp \ diff --git a/src/i2p_stream.cpp b/src/i2p_stream.cpp index 99d50a2ba..45e6fb756 100644 --- a/src/i2p_stream.cpp +++ b/src/i2p_stream.cpp @@ -35,6 +35,7 @@ POSSIBILITY OF SUCH DAMAGE. #if TORRENT_USE_I2P #include "libtorrent/i2p_stream.hpp" +#include "libtorrent/aux_/proxy_settings.hpp" #include "libtorrent/assert.hpp" #include "libtorrent/error_code.hpp" #include "libtorrent/string_util.hpp" diff --git a/src/instantiate_connection.cpp b/src/instantiate_connection.cpp index 751a0b47e..dc4ee69bd 100644 --- a/src/instantiate_connection.cpp +++ b/src/instantiate_connection.cpp @@ -31,7 +31,6 @@ POSSIBILITY OF SUCH DAMAGE. */ #include "libtorrent/socket.hpp" -#include "libtorrent/session_settings.hpp" #include "libtorrent/socket_type.hpp" #include "libtorrent/utp_socket_manager.hpp" #include "libtorrent/instantiate_connection.hpp" diff --git a/src/kademlia/dht_settings.cpp b/src/kademlia/dht_settings.cpp new file mode 100644 index 000000000..df457ec30 --- /dev/null +++ b/src/kademlia/dht_settings.cpp @@ -0,0 +1,114 @@ +/* + +Copyright (c) 2003-2016, Arvid Norberg +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "libtorrent/config.hpp" +#include "libtorrent/kademlia/dht_settings.hpp" +#include "libtorrent/bdecode.hpp" + +namespace libtorrent { +namespace dht { + + dht_settings read_dht_settings(bdecode_node const& e) + { + dht_settings sett; + + if (e.type() != bdecode_node::dict_t) return sett; + + bdecode_node val; + val = e.dict_find_int("max_peers_reply"); + if (val) sett.max_peers_reply = int(val.int_value()); + val = e.dict_find_int("search_branching"); + if (val) sett.search_branching = int(val.int_value()); + val = e.dict_find_int("max_fail_count"); + if (val) sett.max_fail_count = int(val.int_value()); + val = e.dict_find_int("max_torrents"); + if (val) sett.max_torrents = int(val.int_value()); + val = e.dict_find_int("max_dht_items"); + if (val) sett.max_dht_items = int(val.int_value()); + val = e.dict_find_int("max_peers"); + if (val) sett.max_peers = int(val.int_value()); + val = e.dict_find_int("max_torrent_search_reply"); + if (val) sett.max_torrent_search_reply = int(val.int_value()); + val = e.dict_find_int("restrict_routing_ips"); + if (val) sett.restrict_routing_ips = (val.int_value() != 0); + val = e.dict_find_int("restrict_search_ips"); + if (val) sett.restrict_search_ips = (val.int_value() != 0); + val = e.dict_find_int("extended_routing_table"); + if (val) sett.extended_routing_table = (val.int_value() != 0); + val = e.dict_find_int("aggressive_lookups"); + if (val) sett.aggressive_lookups = (val.int_value() != 0); + val = e.dict_find_int("privacy_lookups"); + if (val) sett.privacy_lookups = (val.int_value() != 0); + val = e.dict_find_int("enforce_node_id"); + if (val) sett.enforce_node_id = (val.int_value() != 0); + val = e.dict_find_int("ignore_dark_internet"); + if (val) sett.ignore_dark_internet = (val.int_value() != 0); + val = e.dict_find_int("block_timeout"); + if (val) sett.block_timeout = int(val.int_value()); + val = e.dict_find_int("block_ratelimit"); + if (val) sett.block_ratelimit = int(val.int_value()); + val = e.dict_find_int("read_only"); + if (val) sett.read_only = (val.int_value() != 0); + val = e.dict_find_int("item_lifetime"); + if (val) sett.item_lifetime = int(val.int_value()); + + return sett; + } + + entry save_dht_settings(dht_settings const& settings) + { + entry e; + entry::dictionary_type& dht_sett = e.dict(); + + dht_sett["max_peers_reply"] = settings.max_peers_reply; + dht_sett["search_branching"] = settings.search_branching; + dht_sett["max_fail_count"] = settings.max_fail_count; + dht_sett["max_torrents"] = settings.max_torrents; + dht_sett["max_dht_items"] = settings.max_dht_items; + dht_sett["max_peers"] = settings.max_peers; + dht_sett["max_torrent_search_reply"] = settings.max_torrent_search_reply; + dht_sett["restrict_routing_ips"] = settings.restrict_routing_ips; + dht_sett["restrict_search_ips"] = settings.restrict_search_ips; + dht_sett["extended_routing_table"] = settings.extended_routing_table; + dht_sett["aggressive_lookups"] = settings.aggressive_lookups; + dht_sett["privacy_lookups"] = settings.privacy_lookups; + dht_sett["enforce_node_id"] = settings.enforce_node_id; + dht_sett["ignore_dark_internet"] = settings.ignore_dark_internet; + dht_sett["block_timeout"] = settings.block_timeout; + dht_sett["block_ratelimit"] = settings.block_ratelimit; + dht_sett["read_only"] = settings.read_only; + dht_sett["item_lifetime"] = settings.item_lifetime; + + return e; + } +} +} diff --git a/src/kademlia/dht_storage.cpp b/src/kademlia/dht_storage.cpp index 700590360..2355b6ad3 100644 --- a/src/kademlia/dht_storage.cpp +++ b/src/kademlia/dht_storage.cpp @@ -31,6 +31,7 @@ POSSIBILITY OF SUCH DAMAGE. */ #include "libtorrent/kademlia/dht_storage.hpp" +#include "libtorrent/kademlia/dht_settings.hpp" #include #include @@ -43,7 +44,6 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include #include #include #include diff --git a/src/kademlia/dht_tracker.cpp b/src/kademlia/dht_tracker.cpp index 568906e75..cf4a219ca 100644 --- a/src/kademlia/dht_tracker.cpp +++ b/src/kademlia/dht_tracker.cpp @@ -36,6 +36,7 @@ POSSIBILITY OF SUCH DAMAGE. #include #include +#include #include #include @@ -43,7 +44,6 @@ POSSIBILITY OF SUCH DAMAGE. #include // for counters #include #include -#include #include // for is_local #ifndef TORRENT_DISABLE_LOGGING @@ -570,7 +570,7 @@ namespace libtorrent { namespace dht { dht_tracker::tracker_node::tracker_node(io_service& ios , aux::listen_socket_handle const& s, socket_manager* sock - , libtorrent::dht_settings const& settings + , dht_settings const& settings , node_id const& nid , dht_observer* observer, counters& cnt , get_foreign_node_t get_foreign_node diff --git a/src/kademlia/routing_table.cpp b/src/kademlia/routing_table.cpp index c733dfdd2..7d66d80e0 100644 --- a/src/kademlia/routing_table.cpp +++ b/src/kademlia/routing_table.cpp @@ -46,6 +46,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/session_status.hpp" #include "libtorrent/kademlia/node_id.hpp" #include "libtorrent/kademlia/dht_observer.hpp" +#include "libtorrent/kademlia/dht_settings.hpp" #include "libtorrent/aux_/time.hpp" #include "libtorrent/alert_types.hpp" // for dht_routing_bucket #include "libtorrent/socket_io.hpp" // for print_endpoint diff --git a/src/kademlia/rpc_manager.cpp b/src/kademlia/rpc_manager.cpp index 4774780da..90ca119b9 100644 --- a/src/kademlia/rpc_manager.cpp +++ b/src/kademlia/rpc_manager.cpp @@ -44,10 +44,10 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include // for print_endpoint #include -#include // for dht_settings #include // for aux::time_now #include diff --git a/src/session.cpp b/src/session.cpp index 93c2ca12b..adf3b45bd 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -273,7 +273,7 @@ namespace libtorrent { settings = e.dict_find_dict("dht"); if (settings) { - params.dht_settings = aux::read_dht_settings(settings); + params.dht_settings = dht::read_dht_settings(settings); } } diff --git a/src/session_handle.cpp b/src/session_handle.cpp index ed4278a27..ca293e71e 100644 --- a/src/session_handle.cpp +++ b/src/session_handle.cpp @@ -517,7 +517,7 @@ namespace { } #endif // TORRENT_NO_DEPRECATE - void session_handle::set_dht_settings(dht_settings const& settings) + void session_handle::set_dht_settings(dht::dht_settings const& settings) { #ifndef TORRENT_DISABLE_DHT async_call(&session_impl::set_dht_settings, settings); @@ -526,12 +526,12 @@ namespace { #endif } - dht_settings session_handle::get_dht_settings() const + dht::dht_settings session_handle::get_dht_settings() const { #ifndef TORRENT_DISABLE_DHT - return sync_call_ret(&session_impl::get_dht_settings); + return sync_call_ret(&session_impl::get_dht_settings); #else - return dht_settings(); + return dht::dht_settings(); #endif } diff --git a/src/session_impl.cpp b/src/session_impl.cpp index 7bde8537a..b1b73a9e6 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -183,83 +183,6 @@ namespace libtorrent { namespace aux { - // TODO: 3 move this out of this file -#ifndef TORRENT_DISABLE_DHT - dht_settings read_dht_settings(bdecode_node const& e) - { - dht_settings sett; - - if (e.type() != bdecode_node::dict_t) return sett; - - bdecode_node val; - val = e.dict_find_int("max_peers_reply"); - if (val) sett.max_peers_reply = int(val.int_value()); - val = e.dict_find_int("search_branching"); - if (val) sett.search_branching = int(val.int_value()); - val = e.dict_find_int("max_fail_count"); - if (val) sett.max_fail_count = int(val.int_value()); - val = e.dict_find_int("max_torrents"); - if (val) sett.max_torrents = int(val.int_value()); - val = e.dict_find_int("max_dht_items"); - if (val) sett.max_dht_items = int(val.int_value()); - val = e.dict_find_int("max_peers"); - if (val) sett.max_peers = int(val.int_value()); - val = e.dict_find_int("max_torrent_search_reply"); - if (val) sett.max_torrent_search_reply = int(val.int_value()); - val = e.dict_find_int("restrict_routing_ips"); - if (val) sett.restrict_routing_ips = (val.int_value() != 0); - val = e.dict_find_int("restrict_search_ips"); - if (val) sett.restrict_search_ips = (val.int_value() != 0); - val = e.dict_find_int("extended_routing_table"); - if (val) sett.extended_routing_table = (val.int_value() != 0); - val = e.dict_find_int("aggressive_lookups"); - if (val) sett.aggressive_lookups = (val.int_value() != 0); - val = e.dict_find_int("privacy_lookups"); - if (val) sett.privacy_lookups = (val.int_value() != 0); - val = e.dict_find_int("enforce_node_id"); - if (val) sett.enforce_node_id = (val.int_value() != 0); - val = e.dict_find_int("ignore_dark_internet"); - if (val) sett.ignore_dark_internet = (val.int_value() != 0); - val = e.dict_find_int("block_timeout"); - if (val) sett.block_timeout = int(val.int_value()); - val = e.dict_find_int("block_ratelimit"); - if (val) sett.block_ratelimit = int(val.int_value()); - val = e.dict_find_int("read_only"); - if (val) sett.read_only = (val.int_value() != 0); - val = e.dict_find_int("item_lifetime"); - if (val) sett.item_lifetime = int(val.int_value()); - - return sett; - } - - entry save_dht_settings(dht_settings const& settings) - { - entry e; - entry::dictionary_type& dht_sett = e.dict(); - - dht_sett["max_peers_reply"] = settings.max_peers_reply; - dht_sett["search_branching"] = settings.search_branching; - dht_sett["max_fail_count"] = settings.max_fail_count; - dht_sett["max_torrents"] = settings.max_torrents; - dht_sett["max_dht_items"] = settings.max_dht_items; - dht_sett["max_peers"] = settings.max_peers; - dht_sett["max_torrent_search_reply"] = settings.max_torrent_search_reply; - dht_sett["restrict_routing_ips"] = settings.restrict_routing_ips; - dht_sett["restrict_search_ips"] = settings.restrict_search_ips; - dht_sett["extended_routing_table"] = settings.extended_routing_table; - dht_sett["aggressive_lookups"] = settings.aggressive_lookups; - dht_sett["privacy_lookups"] = settings.privacy_lookups; - dht_sett["enforce_node_id"] = settings.enforce_node_id; - dht_sett["ignore_dark_internet"] = settings.ignore_dark_internet; - dht_sett["block_timeout"] = settings.block_timeout; - dht_sett["block_ratelimit"] = settings.block_ratelimit; - dht_sett["read_only"] = settings.read_only; - dht_sett["item_lifetime"] = settings.item_lifetime; - - return e; - } -#endif // TORRENT_DISABLE_DHT - std::vector>::iterator partition_listen_sockets( std::vector& eps , std::vector>& sockets) @@ -733,7 +656,7 @@ namespace aux { #ifndef TORRENT_DISABLE_DHT if (flags & session::save_dht_settings) { - e["dht"] = save_dht_settings(m_dht_settings); + e["dht"] = dht::save_dht_settings(m_dht_settings); } if (m_dht && (flags & session::save_dht_state)) @@ -770,7 +693,7 @@ namespace aux { settings = e->dict_find_dict("dht"); if (settings) { - m_dht_settings = read_dht_settings(settings); + m_dht_settings = dht::read_dht_settings(settings); } } @@ -5722,7 +5645,7 @@ namespace { m_dht_storage.reset(); } - void session_impl::set_dht_settings(dht_settings const& settings) + void session_impl::set_dht_settings(dht::dht_settings const& settings) { m_dht_settings = settings; } diff --git a/src/settings_pack.cpp b/src/settings_pack.cpp index b9d0477a5..70e1a1b67 100644 --- a/src/settings_pack.cpp +++ b/src/settings_pack.cpp @@ -31,7 +31,6 @@ POSSIBILITY OF SUCH DAMAGE. */ #include "libtorrent/config.hpp" -#include "libtorrent/session_settings.hpp" #include "libtorrent/assert.hpp" #include "libtorrent/settings_pack.hpp" #include "libtorrent/aux_/session_impl.hpp" diff --git a/test/test_dht.cpp b/test/test_dht.cpp index a34b0b179..2ed25a202 100644 --- a/test/test_dht.cpp +++ b/test/test_dht.cpp @@ -549,9 +549,9 @@ struct obs : dht::dht_observer #endif }; -dht_settings test_settings() +dht::dht_settings test_settings() { - dht_settings sett; + dht::dht_settings sett; sett.max_torrents = 4; sett.max_dht_items = 4; sett.enforce_node_id = false; @@ -571,7 +571,7 @@ struct dht_test_setup dht_storage->update_node_ids({node_id::min()}); } - dht_settings sett; + dht::dht_settings sett; mock_socket s; std::shared_ptr ls; obs observer; @@ -1562,7 +1562,7 @@ void test_routing_table(address(&rand_addr)()) bdecode_node response; // test kademlia routing table - dht_settings s; + dht::dht_settings s; s.extended_routing_table = false; // s.restrict_routing_ips = false; node_id id = to_hash("3123456789abcdef01232456789abcdef0123456"); @@ -2628,7 +2628,7 @@ TORRENT_TEST(traversal_done) TORRENT_TEST(dht_dual_stack) { // TODO: 3 use dht_test_setup class to simplify the node setup - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); mock_socket s; auto sock4 = dummy_listen_socket4(); auto sock6 = dummy_listen_socket6(); @@ -2927,7 +2927,7 @@ TORRENT_TEST(verify_message) TORRENT_TEST(routing_table_uniform) { // test routing table - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); obs observer; sett.extended_routing_table = false; @@ -2969,7 +2969,7 @@ TORRENT_TEST(routing_table_uniform) TORRENT_TEST(routing_table_balance) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); obs observer; sett.extended_routing_table = false; @@ -2992,7 +2992,7 @@ TORRENT_TEST(routing_table_balance) TORRENT_TEST(routing_table_extended) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); obs observer; sett.extended_routing_table = true; node_id id = to_hash("1234876923549721020394873245098347598635"); @@ -3024,7 +3024,7 @@ void inserter(std::set* nodes, node_entry const& ne) TORRENT_TEST(routing_table_set_id) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.enforce_node_id = false; sett.extended_routing_table = false; obs observer; @@ -3070,7 +3070,7 @@ TORRENT_TEST(routing_table_set_id) TORRENT_TEST(routing_table_for_each) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); obs observer; sett.extended_routing_table = false; @@ -3141,7 +3141,7 @@ TORRENT_TEST(node_set_id) TORRENT_TEST(read_only_node) { // TODO: 3 use dht_test_setup class to simplify the node setup - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.read_only = true; mock_socket s; auto ls = dummy_listen_socket4(); @@ -3231,7 +3231,7 @@ TORRENT_TEST(read_only_node) TORRENT_TEST(invalid_error_msg) { // TODO: 3 use dht_test_setup class to simplify the node setup - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); mock_socket s; auto ls = dummy_listen_socket4(); obs observer; @@ -3319,7 +3319,7 @@ TORRENT_TEST(unsorted_traversal_results) TORRENT_TEST(rpc_invalid_error_msg) { // TODO: 3 use dht_test_setup class to simplify the node setup - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); mock_socket s; auto ls = dummy_listen_socket4(); obs observer; @@ -3443,7 +3443,7 @@ TORRENT_TEST(dht_verify_node_address) { obs observer; // initial setup taken from dht test above - dht_settings s; + dht::dht_settings s; s.extended_routing_table = false; node_id id = to_hash("3123456789abcdef01232456789abcdef0123456"); const int bucket_size = 10; diff --git a/test/test_dht_storage.cpp b/test/test_dht_storage.cpp index 7607a46d1..617a0b0a6 100644 --- a/test/test_dht_storage.cpp +++ b/test/test_dht_storage.cpp @@ -34,6 +34,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/config.hpp" #include "libtorrent/session.hpp" +#include "libtorrent/kademlia/dht_settings.hpp" #include "libtorrent/bencode.hpp" #include "libtorrent/socket_io.hpp" // for hash_address #include "libtorrent/broadcast_socket.hpp" // for supports_ipv6 @@ -58,8 +59,8 @@ using namespace lt::dht; namespace { - dht_settings test_settings() { - dht_settings sett; + dht::dht_settings test_settings() { + dht::dht_settings sett; sett.max_torrents = 2; sett.max_dht_items = 2; sett.item_lifetime = int(seconds(120 * 60).count()); @@ -69,14 +70,14 @@ namespace bool g_storage_constructor_invoked = false; std::unique_ptr dht_custom_storage_constructor( - dht_settings const& settings) + dht::dht_settings const& settings) { g_storage_constructor_invoked = true; return dht_default_storage_constructor(settings); } std::unique_ptr create_default_dht_storage( - dht_settings const& sett) + dht::dht_settings const& sett) { std::unique_ptr s(dht_default_storage_constructor(sett)); TEST_CHECK(s != nullptr); @@ -94,7 +95,7 @@ sha1_hash const n4 = to_hash("5fbfbff10c5d6a4ec8a88e4c6ab4c28b95eee404"); TORRENT_TEST(announce_peer) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); std::unique_ptr s(create_default_dht_storage(sett)); entry peers; @@ -125,7 +126,7 @@ TORRENT_TEST(announce_peer) #if TORRENT_USE_IPV6 TORRENT_TEST(dual_stack) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); std::unique_ptr s(create_default_dht_storage(sett)); tcp::endpoint const p1 = ep("124.31.75.21", 1); @@ -152,7 +153,7 @@ TORRENT_TEST(dual_stack) TORRENT_TEST(put_items) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); std::unique_ptr s(create_default_dht_storage(sett)); entry item; @@ -182,7 +183,7 @@ TORRENT_TEST(put_items) TORRENT_TEST(counters) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); std::unique_ptr s(create_default_dht_storage(sett)); sha1_hash const n1 = to_hash("5fbfbff10c5d6a4ec8a88e4c6ab4c28b95eee401"); @@ -272,7 +273,7 @@ TORRENT_TEST(default_set_custom) TORRENT_TEST(peer_limit) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.max_peers = 42; std::unique_ptr s(create_default_dht_storage(sett)); @@ -289,7 +290,7 @@ TORRENT_TEST(peer_limit) TORRENT_TEST(torrent_limit) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.max_torrents = 42; std::unique_ptr s(create_default_dht_storage(sett)); @@ -306,7 +307,7 @@ TORRENT_TEST(torrent_limit) TORRENT_TEST(immutable_item_limit) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.max_dht_items = 42; std::unique_ptr s(create_default_dht_storage(sett)); @@ -322,7 +323,7 @@ TORRENT_TEST(immutable_item_limit) TORRENT_TEST(mutable_item_limit) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.max_dht_items = 42; std::unique_ptr s(create_default_dht_storage(sett)); @@ -344,7 +345,7 @@ TORRENT_TEST(get_peers_dist) // test that get_peers returns reasonably disjoint sets of peers with each call // take two samples of 100 peers from 1000 and make sure there aren't too many // peers found in both lists - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.max_peers = 2000; sett.max_peers_reply = 100; std::unique_ptr s(create_default_dht_storage(sett)); @@ -390,7 +391,7 @@ TORRENT_TEST(get_peers_dist) TORRENT_TEST(update_node_ids) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); std::unique_ptr s(dht_default_storage_constructor(sett)); TEST_CHECK(s != nullptr); @@ -440,7 +441,7 @@ TORRENT_TEST(update_node_ids) TORRENT_TEST(infohashes_sample) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.max_torrents = 5; sett.sample_infohashes_interval = 10; sett.max_infohashes_sample_count = 2; @@ -482,7 +483,7 @@ TORRENT_TEST(infohashes_sample) TORRENT_TEST(infohashes_sample_dist) { - dht_settings sett = test_settings(); + dht::dht_settings sett = test_settings(); sett.max_torrents = 1000; sett.sample_infohashes_interval = 0; // need this to force refresh every call sett.max_infohashes_sample_count = 1; diff --git a/test/test_magnet.cpp b/test/test_magnet.cpp index 817c60fbe..51a7ecb19 100644 --- a/test/test_magnet.cpp +++ b/test/test_magnet.cpp @@ -96,7 +96,7 @@ TORRENT_TEST(magnet) TEST_EQUAL(pack.get_int(settings_pack::tracker_receive_timeout), 1234); #ifndef TORRENT_DISABLE_DHT - dht_settings dhts; + dht::dht_settings dhts; dhts.max_peers_reply = 70; s->set_dht_settings(dhts); #endif diff --git a/test/test_session_params.cpp b/test/test_session_params.cpp index 80588724f..ce231eeb0 100644 --- a/test/test_session_params.cpp +++ b/test/test_session_params.cpp @@ -51,7 +51,7 @@ namespace bool g_storage_constructor_invoked = false; std::unique_ptr dht_custom_storage_constructor( - dht_settings const& settings) + dht::dht_settings const& settings) { g_storage_constructor_invoked = true; return dht_default_storage_constructor(settings); @@ -105,7 +105,7 @@ TORRENT_TEST(dht_state) settings_pack p = settings(); p.set_bool(settings_pack::enable_dht, true); - dht_settings sett; + dht::dht_settings sett; sett.max_dht_items = 10000; sett.max_peers = 20000;