diff options
| -rw-r--r-- | include/uapi/linux/rtnetlink.h | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 5 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 6 |
3 files changed, 10 insertions, 3 deletions
diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h index 7a2144e1afae..eb0f1a554d7b 100644 --- a/include/uapi/linux/rtnetlink.h +++ b/include/uapi/linux/rtnetlink.h | |||
| @@ -386,6 +386,8 @@ enum { | |||
| 386 | #define RTAX_RTO_MIN RTAX_RTO_MIN | 386 | #define RTAX_RTO_MIN RTAX_RTO_MIN |
| 387 | RTAX_INITRWND, | 387 | RTAX_INITRWND, |
| 388 | #define RTAX_INITRWND RTAX_INITRWND | 388 | #define RTAX_INITRWND RTAX_INITRWND |
| 389 | RTAX_QUICKACK, | ||
| 390 | #define RTAX_QUICKACK RTAX_QUICKACK | ||
| 389 | __RTAX_MAX | 391 | __RTAX_MAX |
| 390 | }; | 392 | }; |
| 391 | 393 | ||
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 46271cdcf088..28af45abe062 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -3717,6 +3717,7 @@ void tcp_reset(struct sock *sk) | |||
| 3717 | static void tcp_fin(struct sock *sk) | 3717 | static void tcp_fin(struct sock *sk) |
| 3718 | { | 3718 | { |
| 3719 | struct tcp_sock *tp = tcp_sk(sk); | 3719 | struct tcp_sock *tp = tcp_sk(sk); |
| 3720 | const struct dst_entry *dst; | ||
| 3720 | 3721 | ||
| 3721 | inet_csk_schedule_ack(sk); | 3722 | inet_csk_schedule_ack(sk); |
| 3722 | 3723 | ||
| @@ -3728,7 +3729,9 @@ static void tcp_fin(struct sock *sk) | |||
| 3728 | case TCP_ESTABLISHED: | 3729 | case TCP_ESTABLISHED: |
| 3729 | /* Move to CLOSE_WAIT */ | 3730 | /* Move to CLOSE_WAIT */ |
| 3730 | tcp_set_state(sk, TCP_CLOSE_WAIT); | 3731 | tcp_set_state(sk, TCP_CLOSE_WAIT); |
| 3731 | inet_csk(sk)->icsk_ack.pingpong = 1; | 3732 | dst = __sk_dst_get(sk); |
| 3733 | if (!dst || !dst_metric(dst, RTAX_QUICKACK)) | ||
| 3734 | inet_csk(sk)->icsk_ack.pingpong = 1; | ||
| 3732 | break; | 3735 | break; |
| 3733 | 3736 | ||
| 3734 | case TCP_CLOSE_WAIT: | 3737 | case TCP_CLOSE_WAIT: |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index e2c1333ee318..3d609490f118 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -160,6 +160,7 @@ static void tcp_event_data_sent(struct tcp_sock *tp, | |||
| 160 | { | 160 | { |
| 161 | struct inet_connection_sock *icsk = inet_csk(sk); | 161 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 162 | const u32 now = tcp_time_stamp; | 162 | const u32 now = tcp_time_stamp; |
| 163 | const struct dst_entry *dst = __sk_dst_get(sk); | ||
| 163 | 164 | ||
| 164 | if (sysctl_tcp_slow_start_after_idle && | 165 | if (sysctl_tcp_slow_start_after_idle && |
| 165 | (!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto)) | 166 | (!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto)) |
| @@ -170,8 +171,9 @@ static void tcp_event_data_sent(struct tcp_sock *tp, | |||
| 170 | /* If it is a reply for ato after last received | 171 | /* If it is a reply for ato after last received |
| 171 | * packet, enter pingpong mode. | 172 | * packet, enter pingpong mode. |
| 172 | */ | 173 | */ |
| 173 | if ((u32)(now - icsk->icsk_ack.lrcvtime) < icsk->icsk_ack.ato) | 174 | if ((u32)(now - icsk->icsk_ack.lrcvtime) < icsk->icsk_ack.ato && |
| 174 | icsk->icsk_ack.pingpong = 1; | 175 | (!dst || !dst_metric(dst, RTAX_QUICKACK))) |
| 176 | icsk->icsk_ack.pingpong = 1; | ||
| 175 | } | 177 | } |
| 176 | 178 | ||
| 177 | /* Account for an ACK we sent. */ | 179 | /* Account for an ACK we sent. */ |
