forked from premiere/premiere-libtorrent
connect candidate fix
This commit is contained in:
parent
838a246f6b
commit
78a6df0b2a
|
@ -89,6 +89,8 @@ namespace libtorrent
|
|||
void connection_closed(const peer_connection& c, int session_time);
|
||||
|
||||
void ban_peer(policy::peer* p);
|
||||
void set_connection(policy::peer* p, peer_connection* c);
|
||||
void set_failcount(policy::peer* p, int f);
|
||||
|
||||
// the peer has got at least one interesting piece
|
||||
void peer_is_interesting(peer_connection& c);
|
||||
|
|
|
@ -2775,7 +2775,7 @@ namespace libtorrent
|
|||
// since it most likely is ourself then
|
||||
if (pid == m_ses.get_peer_id())
|
||||
{
|
||||
if (peer_info_struct()) peer_info_struct()->banned = true;
|
||||
if (peer_info_struct()) t->get_policy().ban_peer(peer_info_struct());
|
||||
disconnect(error_code(errors::self_connection, libtorrent_category), 1);
|
||||
return;
|
||||
}
|
||||
|
@ -2810,7 +2810,7 @@ namespace libtorrent
|
|||
(*m_logger) << time_now_string() << " <== HANDSHAKE\n";
|
||||
#endif
|
||||
// consider this a successful connection, reset the failcount
|
||||
if (peer_info_struct()) peer_info_struct()->failcount = 0;
|
||||
if (peer_info_struct()) t->get_policy().set_failcount(peer_info_struct(), 0);
|
||||
|
||||
#ifndef TORRENT_DISABLE_ENCRYPTION
|
||||
// Toggle pe_support back to false if this is a
|
||||
|
|
|
@ -2712,7 +2712,12 @@ namespace libtorrent
|
|||
|
||||
void peer_connection::send_not_interested()
|
||||
{
|
||||
if (!m_interesting) return;
|
||||
if (!m_interesting)
|
||||
{
|
||||
disconnect_if_redundant();
|
||||
return;
|
||||
}
|
||||
|
||||
boost::shared_ptr<torrent> t = m_torrent.lock();
|
||||
if (!t->ready_for_connections()) return;
|
||||
m_interesting = false;
|
||||
|
|
|
@ -288,6 +288,8 @@ namespace libtorrent
|
|||
// disconnects and removes all peers that are now filtered
|
||||
void policy::ip_filter_updated()
|
||||
{
|
||||
INVARIANT_CHECK;
|
||||
|
||||
aux::session_impl& ses = m_torrent->session();
|
||||
piece_picker* p = 0;
|
||||
if (m_torrent->has_picker()) p = &m_torrent->picker();
|
||||
|
@ -345,6 +347,7 @@ namespace libtorrent
|
|||
TORRENT_ASSERT(m_num_connect_candidates > 0);
|
||||
--m_num_connect_candidates;
|
||||
}
|
||||
TORRENT_ASSERT(m_num_connect_candidates < m_peers.size());
|
||||
if (m_round_robin > i - m_peers.begin()) --m_round_robin;
|
||||
|
||||
#if TORRENT_USE_IPV6
|
||||
|
@ -432,6 +435,31 @@ namespace libtorrent
|
|||
--m_num_connect_candidates;
|
||||
|
||||
p->banned = true;
|
||||
TORRENT_ASSERT(!is_connect_candidate(*p, m_finished));
|
||||
}
|
||||
|
||||
void policy::set_connection(policy::peer* p, peer_connection* c)
|
||||
{
|
||||
INVARIANT_CHECK;
|
||||
|
||||
TORRENT_ASSERT(c);
|
||||
|
||||
const bool was_conn_cand = is_connect_candidate(*p, m_finished);
|
||||
p->connection = c;
|
||||
if (was_conn_cand) --m_num_connect_candidates;
|
||||
}
|
||||
|
||||
void policy::set_failcount(policy::peer* p, int f)
|
||||
{
|
||||
INVARIANT_CHECK;
|
||||
|
||||
const bool was_conn_cand = is_connect_candidate(*p, m_finished);
|
||||
p->failcount = f;
|
||||
if (was_conn_cand != is_connect_candidate(*p, m_finished))
|
||||
{
|
||||
if (was_conn_cand) --m_num_connect_candidates;
|
||||
else ++m_num_connect_candidates;
|
||||
}
|
||||
}
|
||||
|
||||
bool policy::is_connect_candidate(peer const& p, bool finished) const
|
||||
|
@ -1047,14 +1075,14 @@ namespace libtorrent
|
|||
if (!m_torrent->connect_to_peer(&p))
|
||||
{
|
||||
// failcount is a 5 bit value
|
||||
const bool was_conn_cand = is_connect_candidate(p, m_finished);
|
||||
if (p.failcount < 31) ++p.failcount;
|
||||
if (!is_connect_candidate(p, m_finished))
|
||||
if (was_conn_cand && !is_connect_candidate(p, m_finished))
|
||||
--m_num_connect_candidates;
|
||||
return false;
|
||||
}
|
||||
TORRENT_ASSERT(p.connection);
|
||||
TORRENT_ASSERT(!is_connect_candidate(p, m_finished));
|
||||
--m_num_connect_candidates;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -3887,7 +3887,7 @@ namespace libtorrent
|
|||
// add the newly connected peer to this torrent's peer list
|
||||
m_connections.insert(boost::get_pointer(c));
|
||||
m_ses.m_connections.insert(c);
|
||||
peerinfo->connection = c.get();
|
||||
m_policy.set_connection(peerinfo, c.get());
|
||||
c->start();
|
||||
|
||||
int timeout = settings().peer_connect_timeout;
|
||||
|
|
Loading…
Reference in New Issue