aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuchung Cheng <ycheng@google.com>2018-08-09 12:38:09 -0400
committerDavid S. Miller <davem@davemloft.net>2018-08-11 14:31:35 -0400
commit466466dc6c28ca9dc401f10e235b9cde9a7c9162 (patch)
treee3c233a4a6ce5a2f77bad3365ea9bbaf739b3f36
parent8a8a894ebbc23f52669b80c2ca5bf62d75267324 (diff)
tcp: mandate a one-time immediate ACK
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>
-rw-r--r--include/net/inet_connection_sock.h3
-rw-r--r--net/ipv4/tcp_input.c4
2 files changed, 5 insertions, 2 deletions
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h
index 0a6c9e0f2b5a..fa43b82607d9 100644
--- a/include/net/inet_connection_sock.h
+++ b/include/net/inet_connection_sock.h
@@ -167,7 +167,8 @@ enum inet_csk_ack_state_t {
167 ICSK_ACK_SCHED = 1, 167 ICSK_ACK_SCHED = 1,
168 ICSK_ACK_TIMER = 2, 168 ICSK_ACK_TIMER = 2,
169 ICSK_ACK_PUSHED = 4, 169 ICSK_ACK_PUSHED = 4,
170 ICSK_ACK_PUSHED2 = 8 170 ICSK_ACK_PUSHED2 = 8,
171 ICSK_ACK_NOW = 16 /* Send the next ACK immediately (once) */
171}; 172};
172 173
173void inet_csk_init_xmit_timers(struct sock *sk, 174void inet_csk_init_xmit_timers(struct sock *sk,
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 715d541b52dd..b8849588c440 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -5179,7 +5179,9 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible)
5179 (tp->rcv_nxt - tp->copied_seq < sk->sk_rcvlowat || 5179 (tp->rcv_nxt - tp->copied_seq < sk->sk_rcvlowat ||
5180 __tcp_select_window(sk) >= tp->rcv_wnd)) || 5180 __tcp_select_window(sk) >= tp->rcv_wnd)) ||
5181 /* We ACK each frame or... */ 5181 /* We ACK each frame or... */
5182 tcp_in_quickack_mode(sk)) { 5182 tcp_in_quickack_mode(sk) ||
5183 /* Protocol state mandates a one-time immediate ACK */
5184 inet_csk(sk)->icsk_ack.pending & ICSK_ACK_NOW) {
5183send_now: 5185send_now:
5184 tcp_send_ack(sk); 5186 tcp_send_ack(sk);
5185 return; 5187 return;