tcp: mandate a one-time immediate ACK
authorYuchung Cheng <ycheng@google.com>
Thu, 9 Aug 2018 16:38:09 +0000 (09:38 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 11 Aug 2018 18:31:35 +0000 (11:31 -0700)
Add a new flag to indicate a one-time immediate ACK. This flag is
occasionaly set under specific TCP protocol states in addition to
the more common quickack mechanism for interactive application.

In several cases in the TCP code we want to force an immediate ACK
but do not want to call tcp_enter_quickack_mode() because we do
not want to forget the icsk_ack.pingpong or icsk_ack.ato state.

Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: Wei Wang <weiwan@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet_connection_sock.h
net/ipv4/tcp_input.c

index 0a6c9e0f2b5a35b8dd04cb222147664cec67218c..fa43b82607d9cb70d1e9ce283850ff6e850660e7 100644 (file)
@@ -167,7 +167,8 @@ enum inet_csk_ack_state_t {
        ICSK_ACK_SCHED  = 1,
        ICSK_ACK_TIMER  = 2,
        ICSK_ACK_PUSHED = 4,
-       ICSK_ACK_PUSHED2 = 8
+       ICSK_ACK_PUSHED2 = 8,
+       ICSK_ACK_NOW = 16       /* Send the next ACK immediately (once) */
 };
 
 void inet_csk_init_xmit_timers(struct sock *sk,
index 715d541b52ddc4f4876dae2bf003863dfbdfe23e..b8849588c440da4bba2c00c8f5b97e4b57a0dfdb 100644 (file)
@@ -5179,7 +5179,9 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible)
            (tp->rcv_nxt - tp->copied_seq < sk->sk_rcvlowat ||
             __tcp_select_window(sk) >= tp->rcv_wnd)) ||
            /* We ACK each frame or... */
-           tcp_in_quickack_mode(sk)) {
+           tcp_in_quickack_mode(sk) ||
+           /* Protocol state mandates a one-time immediate ACK */
+           inet_csk(sk)->icsk_ack.pending & ICSK_ACK_NOW) {
 send_now:
                tcp_send_ack(sk);
                return;