2024-12-10 00:17:37 +03:00
|
|
|
From 3002091ca590f27c6c7c5966883502c87502e01f Mon Sep 17 00:00:00 2001
|
2024-10-29 05:12:06 +03:00
|
|
|
From: Neal Cardwell <ncardwell@google.com>
|
|
|
|
Date: Sun, 7 Jan 2024 21:11:26 -0300
|
|
|
|
Subject: [PATCH 11/19] net-tcp: add fast_ack_mode=1: skip rwin check in
|
|
|
|
tcp_fast_ack_mode__tcp_ack_snd_check()
|
|
|
|
|
|
|
|
Add logic for an experimental TCP connection behavior, enabled with
|
|
|
|
tp->fast_ack_mode = 1, which disables checking the receive window
|
|
|
|
before sending an ack in __tcp_ack_snd_check(). If this behavior is
|
|
|
|
enabled, the data receiver sends an ACK if the amount of data is >
|
|
|
|
RCV.MSS.
|
|
|
|
|
|
|
|
Change-Id: Iaa0a0fd7108221f883137a79d5bfa724f1b096d4
|
|
|
|
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
|
|
|
---
|
|
|
|
include/linux/tcp.h | 3 ++-
|
|
|
|
net/ipv4/tcp.c | 1 +
|
|
|
|
net/ipv4/tcp_cong.c | 1 +
|
|
|
|
net/ipv4/tcp_input.c | 5 +++--
|
|
|
|
4 files changed, 7 insertions(+), 3 deletions(-)
|
|
|
|
|
|
|
|
--- a/include/linux/tcp.h
|
|
|
|
+++ b/include/linux/tcp.h
|
|
|
|
@@ -369,7 +369,8 @@ struct tcp_sock {
|
|
|
|
u8 compressed_ack;
|
|
|
|
u8 dup_ack_counter:2,
|
|
|
|
tlp_retrans:1, /* TLP is a retransmission */
|
|
|
|
- unused:5;
|
|
|
|
+ fast_ack_mode:2, /* which fast ack mode ? */
|
|
|
|
+ unused:3;
|
|
|
|
u8 thin_lto : 1,/* Use linear timeouts for thin streams */
|
|
|
|
fastopen_connect:1, /* FASTOPEN_CONNECT sockopt */
|
|
|
|
fastopen_no_cookie:1, /* Allow send/recv SYN+data without a cookie */
|
|
|
|
--- a/net/ipv4/tcp.c
|
|
|
|
+++ b/net/ipv4/tcp.c
|
2024-12-10 00:17:37 +03:00
|
|
|
@@ -3384,6 +3384,7 @@ int tcp_disconnect(struct sock *sk, int
|
2024-10-29 05:12:06 +03:00
|
|
|
tp->rx_opt.dsack = 0;
|
|
|
|
tp->rx_opt.num_sacks = 0;
|
|
|
|
tp->rcv_ooopack = 0;
|
|
|
|
+ tp->fast_ack_mode = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/* Clean up fastopen related fields */
|
|
|
|
--- a/net/ipv4/tcp_cong.c
|
|
|
|
+++ b/net/ipv4/tcp_cong.c
|
|
|
|
@@ -237,6 +237,7 @@ void tcp_init_congestion_control(struct
|
|
|
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
|
|
|
|
|
|
|
tcp_sk(sk)->prior_ssthresh = 0;
|
|
|
|
+ tcp_sk(sk)->fast_ack_mode = 0;
|
|
|
|
if (icsk->icsk_ca_ops->init)
|
|
|
|
icsk->icsk_ca_ops->init(sk);
|
|
|
|
if (tcp_ca_needs_ecn(sk))
|
|
|
|
--- a/net/ipv4/tcp_input.c
|
|
|
|
+++ b/net/ipv4/tcp_input.c
|
2024-12-10 00:17:37 +03:00
|
|
|
@@ -5770,13 +5770,14 @@ static void __tcp_ack_snd_check(struct s
|
2024-10-29 05:12:06 +03:00
|
|
|
|
|
|
|
/* More than one full frame received... */
|
|
|
|
if (((tp->rcv_nxt - tp->rcv_wup) > inet_csk(sk)->icsk_ack.rcv_mss &&
|
|
|
|
+ (tp->fast_ack_mode == 1 ||
|
|
|
|
/* ... and right edge of window advances far enough.
|
|
|
|
* (tcp_recvmsg() will send ACK otherwise).
|
|
|
|
* If application uses SO_RCVLOWAT, we want send ack now if
|
|
|
|
* we have not received enough bytes to satisfy the condition.
|
|
|
|
*/
|
|
|
|
- (tp->rcv_nxt - tp->copied_seq < sk->sk_rcvlowat ||
|
|
|
|
- __tcp_select_window(sk) >= tp->rcv_wnd)) ||
|
|
|
|
+ (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) ||
|
|
|
|
/* Protocol state mandates a one-time immediate ACK */
|