|
@@ -197,11 +197,13 @@ static void tcp_enter_quickack_mode(struct sock *sk)
|
|
|
* and the session is not interactive.
|
|
|
*/
|
|
|
|
|
|
-static inline bool tcp_in_quickack_mode(const struct sock *sk)
|
|
|
+static bool tcp_in_quickack_mode(struct sock *sk)
|
|
|
{
|
|
|
const struct inet_connection_sock *icsk = inet_csk(sk);
|
|
|
+ const struct dst_entry *dst = __sk_dst_get(sk);
|
|
|
|
|
|
- return icsk->icsk_ack.quick && !icsk->icsk_ack.pingpong;
|
|
|
+ return (dst && dst_metric(dst, RTAX_QUICKACK)) ||
|
|
|
+ (icsk->icsk_ack.quick && !icsk->icsk_ack.pingpong);
|
|
|
}
|
|
|
|
|
|
static void tcp_ecn_queue_cwr(struct tcp_sock *tp)
|
|
@@ -3951,7 +3953,6 @@ void tcp_reset(struct sock *sk)
|
|
|
static void tcp_fin(struct sock *sk)
|
|
|
{
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
- const struct dst_entry *dst;
|
|
|
|
|
|
inet_csk_schedule_ack(sk);
|
|
|
|
|
@@ -3963,9 +3964,7 @@ static void tcp_fin(struct sock *sk)
|
|
|
case TCP_ESTABLISHED:
|
|
|
/* Move to CLOSE_WAIT */
|
|
|
tcp_set_state(sk, TCP_CLOSE_WAIT);
|
|
|
- dst = __sk_dst_get(sk);
|
|
|
- if (!dst || !dst_metric(dst, RTAX_QUICKACK))
|
|
|
- inet_csk(sk)->icsk_ack.pingpong = 1;
|
|
|
+ inet_csk(sk)->icsk_ack.pingpong = 1;
|
|
|
break;
|
|
|
|
|
|
case TCP_CLOSE_WAIT:
|