|
@@ -160,6 +160,7 @@ static void tcp_event_data_sent(struct tcp_sock *tp,
|
|
{
|
|
{
|
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
|
const u32 now = tcp_time_stamp;
|
|
const u32 now = tcp_time_stamp;
|
|
|
|
+ const struct dst_entry *dst = __sk_dst_get(sk);
|
|
|
|
|
|
if (sysctl_tcp_slow_start_after_idle &&
|
|
if (sysctl_tcp_slow_start_after_idle &&
|
|
(!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto))
|
|
(!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto))
|
|
@@ -170,8 +171,9 @@ static void tcp_event_data_sent(struct tcp_sock *tp,
|
|
/* If it is a reply for ato after last received
|
|
/* If it is a reply for ato after last received
|
|
* packet, enter pingpong mode.
|
|
* packet, enter pingpong mode.
|
|
*/
|
|
*/
|
|
- if ((u32)(now - icsk->icsk_ack.lrcvtime) < icsk->icsk_ack.ato)
|
|
|
|
- icsk->icsk_ack.pingpong = 1;
|
|
|
|
|
|
+ if ((u32)(now - icsk->icsk_ack.lrcvtime) < icsk->icsk_ack.ato &&
|
|
|
|
+ (!dst || !dst_metric(dst, RTAX_QUICKACK)))
|
|
|
|
+ icsk->icsk_ack.pingpong = 1;
|
|
}
|
|
}
|
|
|
|
|
|
/* Account for an ACK we sent. */
|
|
/* Account for an ACK we sent. */
|