aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Scheffenegger <rscheff@FreeBSD.org>2024-11-14 07:38:30 +0000
committerRichard Scheffenegger <rscheff@FreeBSD.org>2024-11-14 08:15:53 +0000
commitc9047eb7b30d8f88fd90b62fbb40d90e046bd1d7 (patch)
tree3b27b3957eeb2d66731a80d9954929f191539cfe
parent45a77bf23fa2f36bf2169f7ba2a33b31f4c35adb (diff)
tcp: allow TSO even while RX path is unordered
Over IP networks, forward and return path largely act independently from each other. Do not disable LRO on the TX side, when reordering/loss is happening on the RX half-connection. Reviewed By: rrs, #transport, peter.lei_ieee.org Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D47056
-rw-r--r--sys/netinet/tcp_output.c8
-rw-r--r--sys/netinet/tcp_stacks/bbr.c1
-rw-r--r--sys/netinet/tcp_stacks/rack.c5
3 files changed, 5 insertions, 9 deletions
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index 8f19885f6b9b..38ce2e3f3145 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -513,8 +513,8 @@ after_sack_rexmit:
* hardware).
*
* TSO may only be used if we are in a pure bulk sending state. The
- * presence of TCP-MD5, SACK retransmits, SACK advertizements and
- * IP options prevent using TSO. With TSO the TCP header is the same
+ * presence of TCP-MD5, IP options (IPsec), and possibly SACK
+ * retransmits prevent using TSO. With TSO the TCP header is the same
* (except for the sequence number) for all generated packets. This
* makes it impossible to transmit any options which vary per generated
* segment or packet.
@@ -556,9 +556,9 @@ after_sack_rexmit:
if ((tp->t_flags & TF_TSO) && V_tcp_do_tso && len > tp->t_maxseg &&
(tp->t_port == 0) &&
((tp->t_flags & TF_SIGNATURE) == 0) &&
- tp->rcv_numsacks == 0 && ((sack_rxmit == 0) || V_tcp_sack_tso) &&
+ ((sack_rxmit == 0) || V_tcp_sack_tso) &&
(ipoptlen == 0 || (ipoptlen == ipsec_optlen &&
- (tp->t_flags2 & TF2_IPSEC_TSO) != 0)) &&
+ (tp->t_flags2 & TF2_IPSEC_TSO) != 0)) &&
!(flags & TH_SYN))
tso = 1;
diff --git a/sys/netinet/tcp_stacks/bbr.c b/sys/netinet/tcp_stacks/bbr.c
index 866ae29eef45..4ab12884b379 100644
--- a/sys/netinet/tcp_stacks/bbr.c
+++ b/sys/netinet/tcp_stacks/bbr.c
@@ -12619,7 +12619,6 @@ recheck_resend:
(len > maxseg) &&
(tp->t_port == 0) &&
((tp->t_flags & TF_SIGNATURE) == 0) &&
- tp->rcv_numsacks == 0 &&
ipoptlen == 0)
tso = 1;
diff --git a/sys/netinet/tcp_stacks/rack.c b/sys/netinet/tcp_stacks/rack.c
index e77604820b63..30b0704ed7d6 100644
--- a/sys/netinet/tcp_stacks/rack.c
+++ b/sys/netinet/tcp_stacks/rack.c
@@ -20708,7 +20708,7 @@ again:
if ((tp->t_flags & TF_TSO) && V_tcp_do_tso && len > segsiz &&
(tp->t_port == 0) &&
((tp->t_flags & TF_SIGNATURE) == 0) &&
- tp->rcv_numsacks == 0 && sack_rxmit == 0 &&
+ sack_rxmit == 0 &&
ipoptlen == 0)
tso = 1;
{
@@ -20910,7 +20910,6 @@ just_return_nolock:
rack_use_rfo &&
((flags & (TH_SYN|TH_FIN)) == 0) &&
(ipoptlen == 0) &&
- (tp->rcv_numsacks == 0) &&
rack->r_fsb_inited &&
TCPS_HAVEESTABLISHED(tp->t_state) &&
((IN_RECOVERY(tp->t_flags)) == 0) &&
@@ -22550,7 +22549,6 @@ enobufs:
((flags & (TH_SYN|TH_FIN)) == 0) &&
(rsm == NULL) &&
(ipoptlen == 0) &&
- (tp->rcv_numsacks == 0) &&
rack->r_fsb_inited &&
TCPS_HAVEESTABLISHED(tp->t_state) &&
((IN_RECOVERY(tp->t_flags)) == 0) &&
@@ -22578,7 +22576,6 @@ enobufs:
((flags & (TH_SYN|TH_FIN)) == 0) &&
(rsm == NULL) &&
(ipoptlen == 0) &&
- (tp->rcv_numsacks == 0) &&
(rack->r_must_retran == 0) &&
rack->r_fsb_inited &&
TCPS_HAVEESTABLISHED(tp->t_state) &&