pmtud fix
This commit is contained in:
@@ -705,17 +705,6 @@ void utp_socket_impl::update_mtu_limits()
|
|||||||
// clear the mtu probe sequence number since
|
// clear the mtu probe sequence number since
|
||||||
// it was either dropped or acked
|
// it was either dropped or acked
|
||||||
m_mtu_seq = 0;
|
m_mtu_seq = 0;
|
||||||
|
|
||||||
if (m_mtu_ceiling - m_mtu_floor < 10)
|
|
||||||
{
|
|
||||||
// we have narrowed down the mtu within 10
|
|
||||||
// bytes. That's good enough, start using
|
|
||||||
// floor as the packet size from now on.
|
|
||||||
// set the ceiling to the floor as well to
|
|
||||||
// disable more probes to be sent
|
|
||||||
// we'll never re-probe this connection
|
|
||||||
m_mtu = m_mtu_ceiling = m_mtu_floor;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int utp_socket_state(utp_socket_impl const* s)
|
int utp_socket_state(utp_socket_impl const* s)
|
||||||
@@ -1732,7 +1721,7 @@ bool utp_socket_impl::send_pkt(int flags)
|
|||||||
|
|
||||||
// MTU DISCOVERY
|
// MTU DISCOVERY
|
||||||
if (m_mtu_seq == 0
|
if (m_mtu_seq == 0
|
||||||
&& packet_size > m_mtu_floor
|
&& p->size > m_mtu_floor
|
||||||
&& m_seq_nr != 0)
|
&& m_seq_nr != 0)
|
||||||
{
|
{
|
||||||
p->mtu_probe = true;
|
p->mtu_probe = true;
|
||||||
@@ -1764,7 +1753,7 @@ bool utp_socket_impl::send_pkt(int flags)
|
|||||||
"mtu_probe:%d extension:%d\n"
|
"mtu_probe:%d extension:%d\n"
|
||||||
, this, int(h->seq_nr), int(h->ack_nr), packet_type_names[h->get_type()]
|
, this, int(h->seq_nr), int(h->ack_nr), packet_type_names[h->get_type()]
|
||||||
, m_send_id, print_endpoint(udp::endpoint(m_remote_address, m_port)).c_str()
|
, m_send_id, print_endpoint(udp::endpoint(m_remote_address, m_port)).c_str()
|
||||||
, packet_size, m_error.message().c_str(), m_write_buffer_size, int(m_cwnd >> 16)
|
, p->size, m_error.message().c_str(), m_write_buffer_size, int(m_cwnd >> 16)
|
||||||
, m_adv_wnd, m_bytes_in_flight, m_mtu, boost::uint32_t(h->timestamp_microseconds)
|
, m_adv_wnd, m_bytes_in_flight, m_mtu, boost::uint32_t(h->timestamp_microseconds)
|
||||||
, boost::uint32_t(h->timestamp_difference_microseconds), int(p->mtu_probe)
|
, boost::uint32_t(h->timestamp_difference_microseconds), int(p->mtu_probe)
|
||||||
, h->extension);
|
, h->extension);
|
||||||
@@ -1783,7 +1772,8 @@ bool utp_socket_impl::send_pkt(int flags)
|
|||||||
|
|
||||||
if (ec == error::message_size && p->mtu_probe)
|
if (ec == error::message_size && p->mtu_probe)
|
||||||
{
|
{
|
||||||
m_mtu_ceiling = m_mtu - 1;
|
m_mtu_ceiling = p->size - 1;
|
||||||
|
if (m_mtu_floor > m_mtu_ceiling) m_mtu_floor = m_mtu_ceiling;
|
||||||
update_mtu_limits();
|
update_mtu_limits();
|
||||||
// TODO: we might want to do something else here
|
// TODO: we might want to do something else here
|
||||||
// as well, to resend the packet immediately without
|
// as well, to resend the packet immediately without
|
||||||
@@ -1871,7 +1861,9 @@ bool utp_socket_impl::resend_packet(packet* p, bool fast_resend)
|
|||||||
p->mtu_probe = false;
|
p->mtu_probe = false;
|
||||||
// we got multiple acks for the packet before our probe, assume
|
// we got multiple acks for the packet before our probe, assume
|
||||||
// it was dropped because it was too big
|
// it was dropped because it was too big
|
||||||
m_mtu_ceiling = m_mtu - 1;
|
// if the packet we just lost was smaller than the mtu
|
||||||
|
// ignore it
|
||||||
|
m_mtu_ceiling = p->size - 1;
|
||||||
update_mtu_limits();
|
update_mtu_limits();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2024,7 +2016,7 @@ void utp_socket_impl::ack_packet(packet* p, ptime const& receive_time
|
|||||||
{
|
{
|
||||||
TORRENT_ASSERT(p->mtu_probe);
|
TORRENT_ASSERT(p->mtu_probe);
|
||||||
// our mtu probe was acked!
|
// our mtu probe was acked!
|
||||||
m_mtu_floor = m_mtu;
|
m_mtu_floor = (std::max)(m_mtu_floor, p->size);
|
||||||
update_mtu_limits();
|
update_mtu_limits();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3111,6 +3103,7 @@ void utp_socket_impl::tick(ptime const& now)
|
|||||||
// we had was the probe. Assume it was dropped
|
// we had was the probe. Assume it was dropped
|
||||||
// because it was too big
|
// because it was too big
|
||||||
m_mtu_ceiling = m_mtu - 1;
|
m_mtu_ceiling = m_mtu - 1;
|
||||||
|
if (m_mtu_floor > m_mtu_ceiling) m_mtu_floor = m_mtu_ceiling;
|
||||||
update_mtu_limits();
|
update_mtu_limits();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user