Index: head/sys/netinet/tcp_stacks/bbr.c =================================================================== --- head/sys/netinet/tcp_stacks/bbr.c +++ head/sys/netinet/tcp_stacks/bbr.c @@ -4078,6 +4078,7 @@ */ #define DELAY_ACK(tp, bbr, nsegs) \ (((tp->t_flags & TF_RXWIN0SENT) == 0) && \ + ((tp->t_flags & TF_DELACK) == 0) && \ ((bbr->bbr_segs_rcvd + nsegs) < tp->t_delayed_ack) && \ (tp->t_delayed_ack || (tp->t_flags & TF_NEEDSYN))) @@ -8992,7 +8993,7 @@ * If there's data, delay ACK; if there's also a FIN ACKNOW * will be turned on later. */ - if (DELAY_ACK(tp, bbr, 1) && tlen != 0 && (tfo_partial == 0)) { + if (DELAY_ACK(tp, bbr, 1) && tlen != 0 && !tfo_partial) { bbr->bbr_segs_rcvd += 1; tp->t_flags |= TF_DELACK; bbr_timer_cancel(bbr, __LINE__, bbr->r_ctl.rc_rcvtime); Index: head/sys/netinet/tcp_stacks/rack.c =================================================================== --- head/sys/netinet/tcp_stacks/rack.c +++ head/sys/netinet/tcp_stacks/rack.c @@ -9320,7 +9320,15 @@ * If there's data, delay ACK; if there's also a FIN ACKNOW * will be turned on later. */ - rack_handle_delayed_ack(tp, rack, tlen, tfo_partial); + if (DELAY_ACK(tp, tlen) && tlen != 0 && !tfo_partial) { + rack_timer_cancel(tp, rack, + rack->r_ctl.rc_rcvtime, __LINE__); + tp->t_flags |= TF_DELACK; + } else { + rack->r_wanted_output = 1; + tp->t_flags |= TF_ACKNOW; + rack->rc_dack_toggle = 0; + } if (((thflags & (TH_CWR | TH_ECE)) == TH_ECE) && (V_tcp_do_ecn == 1)) { tp->t_flags2 |= TF2_ECN_PERMIT;