From 26c29ea0306f543358ba2de14ac86a9000ac9eeb Mon Sep 17 00:00:00 2001 From: arvidn Date: Sat, 5 Jan 2019 16:31:46 +0100 Subject: [PATCH 1/7] make sure we reset the duplicate ack counter every time we don't receive a duplicate ack. Also fix logging of outstanding packets --- include/libtorrent/packet_buffer.hpp | 6 ++++-- src/utp_stream.cpp | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/include/libtorrent/packet_buffer.hpp b/include/libtorrent/packet_buffer.hpp index 4d9419c05..7b30720f3 100644 --- a/include/libtorrent/packet_buffer.hpp +++ b/include/libtorrent/packet_buffer.hpp @@ -76,8 +76,9 @@ namespace libtorrent void* insert(index_type idx, void* value); - std::size_t size() const - { return m_size; } + std::size_t size() const { return m_size; } + + bool empty() const { return m_size == 0; } std::size_t capacity() const { return m_capacity; } @@ -119,6 +120,7 @@ namespace libtorrent using packet_buffer_impl::index_type; using packet_buffer_impl::size; + using packet_buffer_impl::empty; using packet_buffer_impl::capacity; using packet_buffer_impl::reserve; using packet_buffer_impl::cursor; diff --git a/src/utp_stream.cpp b/src/utp_stream.cpp index 1851bc620..d90380895 100644 --- a/src/utp_stream.cpp +++ b/src/utp_stream.cpp @@ -1586,6 +1586,8 @@ void utp_socket_impl::parse_sack(boost::uint16_t const packet_ack, boost::uint8_ if (ack_nr == m_seq_nr) break; } + if (m_outbuf.empty()) m_duplicate_acks = 0; + // now, scan the bits in reverse, and count the number of ACKed packets. Only // lost packets followed by 'dup_ack_limit' packets may be resent // start with the sequence number represented by the last bit in the SACK @@ -2975,6 +2977,8 @@ bool utp_socket_impl::incoming_packet(boost::uint8_t const* buf, int size ++m_duplicate_acks; } + TORRENT_ASSERT_VAL(m_outbuf.size() > 0 || m_duplicate_acks == 0, m_duplicate_acks); + boost::uint32_t min_rtt = (std::numeric_limits::max)(); TORRENT_ASSERT(m_outbuf.at((m_acked_seq_nr + 1) & ACK_MASK) || ((m_seq_nr - m_acked_seq_nr) & ACK_MASK) <= 1); @@ -3003,6 +3007,7 @@ bool utp_socket_impl::incoming_packet(boost::uint8_t const* buf, int size } maybe_inc_acked_seq_nr(); + if (m_outbuf.empty()) m_duplicate_acks = 0; } // look for extended headers @@ -3341,7 +3346,7 @@ bool utp_socket_impl::incoming_packet(boost::uint8_t const* buf, int size , packet_timeout() , int(total_milliseconds(m_timeout - receive_time)) , int(total_microseconds(receive_time.time_since_epoch())) - , (m_seq_nr - m_acked_seq_nr) & ACK_MASK + , m_outbuf.size() , m_mtu , their_delay_base , boost::uint32_t(m_reply_micro) From c6128e31c1d13ce0a1e5c8863551f3a704a27825 Mon Sep 17 00:00:00 2001 From: arvidn Date: Sun, 6 Jan 2019 17:35:23 +0100 Subject: [PATCH 2/7] add option to enable uTP logging to client_test, to simplify using it for uTP trouble-shooting --- examples/client_test.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/examples/client_test.cpp b/examples/client_test.cpp index d2cfba53b..36f873e94 100644 --- a/examples/client_test.cpp +++ b/examples/client_test.cpp @@ -51,9 +51,9 @@ POSSIBILITY OF SUCH DAMAGE. #pragma warning(pop) #endif -#include "libtorrent/extensions/ut_metadata.hpp" -#include "libtorrent/extensions/ut_pex.hpp" -#include "libtorrent/extensions/smart_ban.hpp" +#ifdef TORRENT_UTP_LOG_ENABLE +#include "libtorrent/utp_stream.hpp" +#endif #include "libtorrent/torrent_info.hpp" #include "libtorrent/announce_entry.hpp" @@ -1226,6 +1226,9 @@ int main(int argc, char* argv[]) " are present and check hashes on-demand)\n" " -E specify how many disk I/O threads to use\n" " -O print session stats counters to the log\n" +#ifdef TORRENT_UTP_LOG_ENABLE + " -q Enable uTP transport-level verbose logging\n" +#endif "\n BITTORRENT OPTIONS\n" " -c sets the max number of connections\n" " -T sets the max number of connections per torrent\n" @@ -1385,6 +1388,11 @@ int main(int argc, char* argv[]) if (strcmp(arg, "allocate") == 0) allocation_mode = storage_mode_allocate; else if (strcmp(arg, "sparse") == 0) allocation_mode = storage_mode_sparse; break; +#ifdef TORRENT_UTP_LOG_ENABLE + case 'q': + libtorrent::set_utp_stream_logging(true); + break; +#endif case 's': save_path = arg; break; case 'U': torrent_upload_limit = atoi(arg) * 1000; break; case 'D': torrent_download_limit = atoi(arg) * 1000; break; From 0ce899e27370239da805e475a065157ea5446fcb Mon Sep 17 00:00:00 2001 From: arvidn Date: Sat, 5 Jan 2019 17:12:49 +0100 Subject: [PATCH 3/7] don't treat loss of MTU probe packet as a congestion signal --- src/utp_stream.cpp | 115 +++++++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 52 deletions(-) diff --git a/src/utp_stream.cpp b/src/utp_stream.cpp index d90380895..a3301565a 100644 --- a/src/utp_stream.cpp +++ b/src/utp_stream.cpp @@ -1642,20 +1642,21 @@ void utp_socket_impl::parse_sack(boost::uint16_t const packet_ack, boost::uint8_ packet* p = m_outbuf.at(pkt_seq); UTP_LOGV("%8p: Packet %d lost. (fast_resend_seq_nr:%d trigger fast-resend)\n" , static_cast(this), pkt_seq, m_fast_resend_seq_nr); - if (p) - { - if (resend_packet(p, true)) - { - m_duplicate_acks = 0; - m_fast_resend_seq_nr = (pkt_seq + 1) & ACK_MASK; - } - } + if (!p) continue; - if (cut_cwnd) + // don't cut cwnd if the packet we lost was the MTU probe + // the logic to handle a lost MTU probe is in resend_packet() + if (cut_cwnd && (pkt_seq != m_mtu_seq || m_mtu_seq == 0)) { experienced_loss(pkt_seq); cut_cwnd = false; } + + if (resend_packet(p, true)) + { + m_duplicate_acks = 0; + m_fast_resend_seq_nr = (pkt_seq + 1) & ACK_MASK; + } } } @@ -3068,7 +3069,9 @@ bool utp_socket_impl::incoming_packet(boost::uint8_t const* buf, int size if (p) { - experienced_loss(m_fast_resend_seq_nr); + // don't consider a lost probe as proper loss, it doesn't necessarily + // signal congestion + if (!p->mtu_probe) experienced_loss(m_fast_resend_seq_nr); resend_packet(p, true); if (m_state == UTP_STATE_ERROR_WAIT || m_state == UTP_STATE_DELETE) return true; } @@ -3632,7 +3635,20 @@ void utp_socket_impl::tick(time_point const now) if (now > m_timeout) { // TIMEOUT! - // set cwnd to 1 MSS + + bool ignore_loss = false; + + if (((m_acked_seq_nr + 1) & ACK_MASK) == m_mtu_seq + && ((m_seq_nr - 1) & ACK_MASK) == m_mtu_seq + && m_mtu_seq != 0) + { + // we timed out, and the only outstanding packet + // we had was the probe. Assume it was dropped + // because it was too big + m_mtu_ceiling = m_mtu - 1; + update_mtu_limits(); + ignore_loss = true; + } // the close_reason here is a bit of a hack. When it's set, it indicates // that the upper layer intends to close the socket. However, it has been @@ -3641,7 +3657,9 @@ void utp_socket_impl::tick(time_point const now) // other end. This catches that case and let the socket time out. if (m_outbuf.size() || m_close_reason != 0) { - ++m_num_timeouts; + // m_num_timeouts is used to update the connection timeout, and if we + // lose this packet because it's an MTU-probe, don't change the timeout + if (!ignore_loss) ++m_num_timeouts; m_sm->inc_stats_counter(counters::utp_timeout); } @@ -3667,52 +3685,45 @@ void utp_socket_impl::tick(time_point const now) return; } - if (((m_acked_seq_nr + 1) & ACK_MASK) == m_mtu_seq - && ((m_seq_nr - 1) & ACK_MASK) == m_mtu_seq - && m_mtu_seq != 0) + if (!ignore_loss) { - // we timed out, and the only outstanding packet - // we had was the probe. Assume it was dropped - // because it was too big - m_mtu_ceiling = m_mtu - 1; - update_mtu_limits(); + // set cwnd to 1 MSS + if (m_bytes_in_flight == 0 && (m_cwnd >> 16) >= m_mtu) + { + // this is just a timeout because this direction of + // the stream is idle. Don't reset the cwnd, just decay it + m_cwnd = std::max(m_cwnd * 2 / 3, boost::int64_t(m_mtu) * (1 << 16)); + } + else + { + // we timed out because a packet was not ACKed or because + // the cwnd was made smaller than one packet + m_cwnd = boost::int64_t(m_mtu) * (1 << 16); + } + + TORRENT_ASSERT(m_cwnd >= 0); + + m_timeout = now + milliseconds(packet_timeout()); + + UTP_LOGV("%8p: resetting cwnd:%d\n" + , static_cast(this), int(m_cwnd >> 16)); + + // since we've already timed out now, don't count + // loss that we might detect for packets that just + // timed out + m_loss_seq_nr = m_seq_nr; + + // when we time out, the cwnd is reset to 1 MSS, which means we + // need to ramp it up quickly again. enter slow start mode. This time + // we're very likely to have an ssthres set, which will make us leave + // slow start before inducing more delay or loss. + m_slow_start = true; + UTP_LOGV("%8p: slow_start -> 1\n", static_cast(this)); } - if (m_bytes_in_flight == 0 && (m_cwnd >> 16) >= m_mtu) - { - // this is just a timeout because this direction of - // the stream is idle. Don't reset the cwnd, just decay it - m_cwnd = std::max(m_cwnd * 2 / 3, boost::int64_t(m_mtu) * (1 << 16)); - } - else - { - // we timed out because a packet was not ACKed or because - // the cwnd was made smaller than one packet - m_cwnd = boost::int64_t(m_mtu) * (1 << 16); - } - - TORRENT_ASSERT(m_cwnd >= 0); - - m_timeout = now + milliseconds(packet_timeout()); - - UTP_LOGV("%8p: resetting cwnd:%d\n" - , static_cast(this), int(m_cwnd >> 16)); - // we dropped all packets, that includes the mtu probe m_mtu_seq = 0; - // since we've already timed out now, don't count - // loss that we might detect for packets that just - // timed out - m_loss_seq_nr = m_seq_nr; - - // when we time out, the cwnd is reset to 1 MSS, which means we - // need to ramp it up quickly again. enter slow start mode. This time - // we're very likely to have an ssthres set, which will make us leave - // slow start before inducing more delay or loss. - m_slow_start = true; - UTP_LOGV("%8p: slow_start -> 1\n", static_cast(this)); - // we need to go one past m_seq_nr to cover the case // where we just sent a SYN packet and then adjusted for // the uTorrent sequence number reuse From e53bc71f63fabfd7d0cf502b4534f96e3d582d00 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Sun, 6 Jan 2019 22:35:35 +0800 Subject: [PATCH 4/7] Don't generate pkg-config when compiling with MSVC --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f79b184c..e99bae9a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -361,7 +361,11 @@ foreach (s ${COMPILETIME_OPTIONS_LIST}) set (COMPILETIME_OPTIONS "${COMPILETIME_OPTIONS} -D${s}") endforeach (s) -generate_and_install_pkg_config_file(torrent-rasterbar libtorrent-rasterbar) +# There is little to none support for using pkg-config with MSVC and most users won't bother with it. +# However, msys is a linux-like platform on Windows that do support/prefer using pkg-config. +if (NOT MSVC) + generate_and_install_pkg_config_file(torrent-rasterbar libtorrent-rasterbar) +endif() install(TARGETS torrent-rasterbar EXPORT LibtorrentRasterbarTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} From 33fa7454d0bb3bbc34fa50a2c2d611444f3eac31 Mon Sep 17 00:00:00 2001 From: airium Date: Mon, 7 Jan 2019 20:36:05 +0800 Subject: [PATCH 5/7] Avoid announcing local ip to private tracker --- src/torrent.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/torrent.cpp b/src/torrent.cpp index 3f343ec5e..d4aa62780 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -3253,10 +3253,12 @@ namespace { && m_torrent_file->priv()) { boost::optional ep4 = m_ses.get_ipv4_interface(); - if (ep4) req.ipv4 = ep4->address().to_v4(); + if (ep4 && !is_local(ep4->address()) && !is_loopback(ep4->address())) + req.ipv4 = ep4->address().to_v4(); #if TORRENT_USE_IPV6 boost::optional ep6 = m_ses.get_ipv6_interface(); - if (ep6) req.ipv6 = ep6->address().to_v6(); + if (ep6 && !is_local(ep6->address()) && !is_loopback(ep6->address())) + req.ipv6 = ep6->address().to_v6(); #endif } From 786d78b6c955486faaddd63cfcc7fecb6299282b Mon Sep 17 00:00:00 2001 From: arvidn Date: Mon, 7 Jan 2019 01:27:02 +0100 Subject: [PATCH 6/7] only allow cwnd to be reduced so often --- include/libtorrent/settings_pack.hpp | 5 +++++ include/libtorrent/utp_socket_manager.hpp | 1 + src/settings_pack.cpp | 1 + src/utp_stream.cpp | 22 +++++++++++++++++----- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/include/libtorrent/settings_pack.hpp b/include/libtorrent/settings_pack.hpp index b14947fd8..9ff65a2c0 100644 --- a/include/libtorrent/settings_pack.hpp +++ b/include/libtorrent/settings_pack.hpp @@ -1608,6 +1608,11 @@ namespace libtorrent // systems. close_file_interval, + // When uTP experiences packet loss, it will reduce the congestion + // window, and not reduce it again for this many milliseconds, even if + // experiencing another lost packet. + utp_cwnd_reduce_timer, + max_int_setting_internal }; diff --git a/include/libtorrent/utp_socket_manager.hpp b/include/libtorrent/utp_socket_manager.hpp index 8865fbd2f..4181d191c 100644 --- a/include/libtorrent/utp_socket_manager.hpp +++ b/include/libtorrent/utp_socket_manager.hpp @@ -87,6 +87,7 @@ namespace libtorrent int connect_timeout() const { return m_sett.get_int(settings_pack::utp_connect_timeout); } int min_timeout() const { return m_sett.get_int(settings_pack::utp_min_timeout); } int loss_multiplier() const { return m_sett.get_int(settings_pack::utp_loss_multiplier); } + int cwnd_reduce_timer() const { return m_sett.get_int(settings_pack::utp_cwnd_reduce_timer); } void mtu_for_dest(address const& addr, int& link_mtu, int& utp_mtu); void set_sock_buf(int size); diff --git a/src/settings_pack.cpp b/src/settings_pack.cpp index 4e1ab9590..a8018e6f1 100644 --- a/src/settings_pack.cpp +++ b/src/settings_pack.cpp @@ -366,6 +366,7 @@ namespace libtorrent SET_NOPREV(urlseed_max_request_bytes, 16 * 1024 * 1024, 0), SET_NOPREV(web_seed_name_lookup_retry, 1800, 0), SET_NOPREV(close_file_interval, CLOSE_FILE_INTERVAL, &session_impl::update_close_file_interval), + SET_NOPREV(utp_cwnd_reduce_timer, 100, 0), }; #undef SET diff --git a/src/utp_stream.cpp b/src/utp_stream.cpp index a3301565a..991a19def 100644 --- a/src/utp_stream.cpp +++ b/src/utp_stream.cpp @@ -359,7 +359,7 @@ struct utp_socket_impl bool consume_incoming_data( utp_header const* ph, boost::uint8_t const* ptr, int payload_size, time_point now); void update_mtu_limits(); - void experienced_loss(int seq_nr); + void experienced_loss(int seq_nr, time_point now); void set_state(int s); @@ -467,6 +467,10 @@ public: // the last time we stepped the timestamp history time_point m_last_history_step; + // the next time we allow a lost packet to halve cwnd. We only do this once every + // 100 ms + time_point m_next_loss; + // the max number of bytes in-flight. This is a fixed point // value, to get the true number of bytes, shift right 16 bits // the value is always >= 0, but the calculations performed on @@ -1648,7 +1652,7 @@ void utp_socket_impl::parse_sack(boost::uint16_t const packet_ack, boost::uint8_ // the logic to handle a lost MTU probe is in resend_packet() if (cut_cwnd && (pkt_seq != m_mtu_seq || m_mtu_seq == 0)) { - experienced_loss(pkt_seq); + experienced_loss(pkt_seq, now); cut_cwnd = false; } @@ -2360,7 +2364,7 @@ bool utp_socket_impl::resend_packet(packet* p, bool fast_resend) return !m_stalled; } -void utp_socket_impl::experienced_loss(int const seq_nr) +void utp_socket_impl::experienced_loss(int const seq_nr, time_point const now) { INVARIANT_CHECK; @@ -2380,11 +2384,17 @@ void utp_socket_impl::experienced_loss(int const seq_nr) // same packet again, ignore it. if (compare_less_wrap(seq_nr, m_loss_seq_nr + 1, ACK_MASK)) return; + // don't reduce cwnd more than once every 100ms + if (m_next_loss >= now) return; + + m_next_loss = now + milliseconds(m_sm->cwnd_reduce_timer()); + // cut window size in 2 m_cwnd = std::max(m_cwnd * m_sm->loss_multiplier() / 100 , boost::int64_t(m_mtu) * (1 << 16)); m_loss_seq_nr = m_seq_nr; - UTP_LOGV("%8p: Lost packet %d caused cwnd cut\n", static_cast(this), seq_nr); + UTP_LOGV("%8p: Lost packet %d caused cwnd cut. m_loss_seq_nr:%d\n" + , static_cast(this), seq_nr, m_seq_nr); // if we happen to be in slow-start mode, we need to leave it // note that we set ssthres to the window size _after_ reducing it. Next slow @@ -3071,7 +3081,7 @@ bool utp_socket_impl::incoming_packet(boost::uint8_t const* buf, int size { // don't consider a lost probe as proper loss, it doesn't necessarily // signal congestion - if (!p->mtu_probe) experienced_loss(m_fast_resend_seq_nr); + if (!p->mtu_probe) experienced_loss(m_fast_resend_seq_nr, receive_time); resend_packet(p, true); if (m_state == UTP_STATE_ERROR_WAIT || m_state == UTP_STATE_DELETE) return true; } @@ -3281,6 +3291,8 @@ bool utp_socket_impl::incoming_packet(boost::uint8_t const* buf, int size if (m_state == UTP_STATE_ERROR_WAIT || m_state == UTP_STATE_DELETE) return true; } + TORRENT_ASSERT(!compare_less_wrap(m_seq_nr, m_acked_seq_nr, ACK_MASK)); + #if TORRENT_UTP_LOG if (sample && acked_bytes && prev_bytes_in_flight) { From b443d3343017dac38228912c3641abf8d202c371 Mon Sep 17 00:00:00 2001 From: arvidn Date: Fri, 11 Jan 2019 02:37:26 +0100 Subject: [PATCH 7/7] bump version number --- CMakeLists.txt | 2 +- Jamfile | 2 +- bindings/python/setup.py | 2 +- configure.ac | 2 +- docs/building.rst | 2 +- docs/contributing.rst | 2 +- docs/dht_rss.rst | 2 +- docs/dht_sec.rst | 2 +- docs/dht_store.rst | 2 +- docs/examples.rst | 2 +- docs/features.rst | 2 +- docs/gen_reference_doc.py | 2 +- docs/hacking.rst | 2 +- docs/index.rst | 2 +- docs/manual.rst | 2 +- docs/troubleshooting.rst | 2 +- docs/tuning.rst | 2 +- docs/tutorial.rst | 2 +- docs/utp.rst | 2 +- include/libtorrent/version.hpp | 6 +++--- src/settings_pack.cpp | 2 +- 21 files changed, 23 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e99bae9a4..6dcbc5b00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR) project(libtorrent DESCRIPTION "Bittorrent library" - VERSION 1.1.11 + VERSION 1.1.12 ) set (SOVERSION "9") diff --git a/Jamfile b/Jamfile index 13a1b90bf..a64ffe019 100644 --- a/Jamfile +++ b/Jamfile @@ -57,7 +57,7 @@ else : : $(boost-include-path) ; } -VERSION = 1.1.11 ; +VERSION = 1.1.12 ; rule linking ( properties * ) { diff --git a/bindings/python/setup.py b/bindings/python/setup.py index 4fc74071a..6beac6cb6 100644 --- a/bindings/python/setup.py +++ b/bindings/python/setup.py @@ -154,7 +154,7 @@ else: libraries = ['torrent-rasterbar'] + flags.libraries)] setup(name = 'python-libtorrent', - version = '1.1.11', + version = '1.1.12', author = 'Arvid Norberg', author_email = 'arvid@libtorrent.org', description = 'Python bindings for libtorrent-rasterbar', diff --git a/configure.ac b/configure.ac index c38bd54d9..ab4973afe 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,7 @@ AC_PREREQ([2.63]) -AC_INIT([libtorrent-rasterbar],[1.1.11],[arvid@libtorrent.org], +AC_INIT([libtorrent-rasterbar],[1.1.12],[arvid@libtorrent.org], [libtorrent-rasterbar],[http://www.libtorrent.org]) AC_CONFIG_SRCDIR([src/torrent.cpp]) AC_CONFIG_AUX_DIR([build-aux]) diff --git a/docs/building.rst b/docs/building.rst index c07ab2261..f51217b5f 100644 --- a/docs/building.rst +++ b/docs/building.rst @@ -3,7 +3,7 @@ libtorrent manual ================= :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/contributing.rst b/docs/contributing.rst index 1d38ebc5b..3393612b4 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -3,7 +3,7 @@ libtorrent manual ================= :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/dht_rss.rst b/docs/dht_rss.rst index 3538cffdd..2ba40a4f5 100644 --- a/docs/dht_rss.rst +++ b/docs/dht_rss.rst @@ -3,7 +3,7 @@ BitTorrent extension for DHT RSS feeds ====================================== :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/dht_sec.rst b/docs/dht_sec.rst index 328bf9901..f271834c1 100644 --- a/docs/dht_sec.rst +++ b/docs/dht_sec.rst @@ -3,7 +3,7 @@ BitTorrent DHT security extension ================================= :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/dht_store.rst b/docs/dht_store.rst index 8ffe82139..bf65e462d 100644 --- a/docs/dht_store.rst +++ b/docs/dht_store.rst @@ -3,7 +3,7 @@ BitTorrent extension for arbitrary DHT store ============================================ :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/examples.rst b/docs/examples.rst index 164873541..d848c5a71 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -3,7 +3,7 @@ libtorrent Examples =================== :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/features.rst b/docs/features.rst index 54e977af4..3fd158671 100644 --- a/docs/features.rst +++ b/docs/features.rst @@ -3,7 +3,7 @@ libtorrent manual ================= :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/gen_reference_doc.py b/docs/gen_reference_doc.py index a9db0adb3..cbb4d41d2 100644 --- a/docs/gen_reference_doc.py +++ b/docs/gen_reference_doc.py @@ -1050,7 +1050,7 @@ for cat in categories: out.write(''' :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 `home`__ diff --git a/docs/hacking.rst b/docs/hacking.rst index a5905b894..e006d72c7 100644 --- a/docs/hacking.rst +++ b/docs/hacking.rst @@ -3,7 +3,7 @@ libtorrent hacking ================== :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/index.rst b/docs/index.rst index 231ebfb91..1e845b16e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,5 @@ :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. raw:: html diff --git a/docs/manual.rst b/docs/manual.rst index 8503a5312..732fbb54c 100644 --- a/docs/manual.rst +++ b/docs/manual.rst @@ -3,7 +3,7 @@ libtorrent API Documentation ============================ :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 1 diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index ecfdad311..9b87abf75 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -3,7 +3,7 @@ libtorrent manual ================= :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/tuning.rst b/docs/tuning.rst index df8dc0ac8..d1998198a 100644 --- a/docs/tuning.rst +++ b/docs/tuning.rst @@ -3,7 +3,7 @@ libtorrent manual ================= :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/tutorial.rst b/docs/tutorial.rst index 532eb15b9..5e04d95fa 100644 --- a/docs/tutorial.rst +++ b/docs/tutorial.rst @@ -3,7 +3,7 @@ libtorrent manual ================= :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/docs/utp.rst b/docs/utp.rst index 718f7faad..32808232a 100644 --- a/docs/utp.rst +++ b/docs/utp.rst @@ -3,7 +3,7 @@ libtorrent manual ================= :Author: Arvid Norberg, arvid@libtorrent.org -:Version: 1.1.11 +:Version: 1.1.12 .. contents:: Table of contents :depth: 2 diff --git a/include/libtorrent/version.hpp b/include/libtorrent/version.hpp index b2554ef6a..8803622af 100644 --- a/include/libtorrent/version.hpp +++ b/include/libtorrent/version.hpp @@ -37,14 +37,14 @@ POSSIBILITY OF SUCH DAMAGE. #define LIBTORRENT_VERSION_MAJOR 1 #define LIBTORRENT_VERSION_MINOR 1 -#define LIBTORRENT_VERSION_TINY 11 +#define LIBTORRENT_VERSION_TINY 12 // the format of this version is: MMmmtt // M = Major version, m = minor version, t = tiny version #define LIBTORRENT_VERSION_NUM ((LIBTORRENT_VERSION_MAJOR * 10000) + (LIBTORRENT_VERSION_MINOR * 100) + LIBTORRENT_VERSION_TINY) -#define LIBTORRENT_VERSION "1.1.11.0" -#define LIBTORRENT_REVISION "ed4ca98a1" +#define LIBTORRENT_VERSION "1.1.12.0" +#define LIBTORRENT_REVISION "786d78b6c" namespace libtorrent { diff --git a/src/settings_pack.cpp b/src/settings_pack.cpp index a8018e6f1..62be86fd8 100644 --- a/src/settings_pack.cpp +++ b/src/settings_pack.cpp @@ -148,7 +148,7 @@ namespace libtorrent SET_NOPREV(proxy_username, "", &session_impl::update_proxy), SET_NOPREV(proxy_password, "", &session_impl::update_proxy), SET_NOPREV(i2p_hostname, "", &session_impl::update_i2p_bridge), - SET_NOPREV(peer_fingerprint, "-LT11B0-", 0), + SET_NOPREV(peer_fingerprint, "-LT11C0-", 0), SET_NOPREV(dht_bootstrap_nodes, "dht.libtorrent.org:25401", &session_impl::update_dht_bootstrap_nodes) };