aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Stewart <rrs@FreeBSD.org>2026-02-24 16:47:36 +0000
committerRandall Stewart <rrs@FreeBSD.org>2026-02-24 16:47:36 +0000
commit9063968e8e394b8062a855592e12607b143c1b0f (patch)
tree92768de391c4e3903c04b51392da6672ff15a83b
parentf3be7df50f01d9a6ead9f27b55bb4dfd7dc4f9d2 (diff)
Mitigate a case where TCP rack can send an extra ack.
Rack will in theory send an extra rate limited ack when we get to a closing state (sending a FIN) so that if we have only 1 packet outstanding we might encourage the connection to close out. However it does this always which is not always wise. Change it so that it only does that if its been more than an srtt since we have had some activity i.e. a send or a receive of a packet. Reviewed by:tuexen, rscheff Differential Revision:<https://reviews.freebsd.org/D55459>
-rw-r--r--sys/netinet/tcp_stacks/rack.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/netinet/tcp_stacks/rack.c b/sys/netinet/tcp_stacks/rack.c
index f55abbf919b7..42c6757b4b2a 100644
--- a/sys/netinet/tcp_stacks/rack.c
+++ b/sys/netinet/tcp_stacks/rack.c
@@ -20742,8 +20742,17 @@ just_return_nolock:
* The idea behind that is instead of having to have
* the peer wait for the delayed-ack timer to run off
* we send an ack that makes the peer send us an ack.
+ *
+ * Note we do not send anything if its been less than
+ * a srtt.
*/
- rack_send_ack_challange(rack);
+ uint64_t tmark;
+
+ tmark = tcp_get_u64_usecs(&tv);
+ if ((tmark > rack->r_ctl.lt_timemark) &&
+ (((tmark - rack->r_ctl.lt_timemark) / 1000) > tp->t_srtt)) {
+ rack_send_ack_challange(rack);
+ }
}
if (tot_len_this_send > 0) {
rack->r_ctl.fsb.recwin = recwin;
@@ -21143,7 +21152,7 @@ send:
to.to_tsecr = tp->ts_recent;
to.to_flags |= TOF_TS;
if ((len == 0) &&
- (TCPS_HAVEESTABLISHED(tp->t_state)) &&
+ (tp->t_state == TCPS_ESTABLISHED) &&
((ms_cts - rack->r_ctl.last_rcv_tstmp_for_rtt) > RCV_PATH_RTT_MS) &&
(tp->snd_una == tp->snd_max) &&
(flags & TH_ACK) &&