From 95ef69c63c42feb4a1dd0e7973efbbdd00e80dae Mon Sep 17 00:00:00 2001 From: Randall Stewart Date: Tue, 16 Jun 2020 18:16:45 +0000 Subject: [PATCH] iSo in doing final checks on OCA firmware with all the latest tweaks the dup-ack checking packet drill script was failing with a number of unexpected acks. So it turns out if you have the default recvwin set up to 1Meg (like OCA's do) and you have no window scaling (like the dupack checking code) then we have another case where we are always trying to update the rwnd and sending an ack when we should not. Sponsored by: Netflix Inc. Differential Revision: https://reviews.freebsd.org/D25298 --- sys/netinet/tcp_stacks/bbr.c | 8 ++++---- sys/netinet/tcp_stacks/rack.c | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/sys/netinet/tcp_stacks/bbr.c b/sys/netinet/tcp_stacks/bbr.c index 9402dc37639..e8e558c76f9 100644 --- a/sys/netinet/tcp_stacks/bbr.c +++ b/sys/netinet/tcp_stacks/bbr.c @@ -12157,8 +12157,8 @@ bbr_output_wtime(struct tcpcb *tp, const struct timeval *tv) * have gotten more data into the socket buffer to * send. */ - recwin = min(max(sbspace(&so->so_rcv), 0), - TCP_MAXWIN << tp->rcv_scale); + recwin = lmin(lmax(sbspace(&so->so_rcv), 0), + (long)TCP_MAXWIN << tp->rcv_scale); if ((bbr_window_update_needed(tp, so, recwin, maxseg) == 0) && ((tcp_outflags[tp->t_state] & TH_RST) == 0) && ((sbavail(sb) + ((tcp_outflags[tp->t_state] & TH_FIN) ? 1 : 0)) <= @@ -12839,8 +12839,8 @@ recheck_resend: ipoptlen == 0) tso = 1; - recwin = min(max(sbspace(&so->so_rcv), 0), - TCP_MAXWIN << tp->rcv_scale); + recwin = lmin(lmax(sbspace(&so->so_rcv), 0), + (long)TCP_MAXWIN << tp->rcv_scale); /* * Sender silly window avoidance. We transmit under the following * conditions when len is non-zero: diff --git a/sys/netinet/tcp_stacks/rack.c b/sys/netinet/tcp_stacks/rack.c index 3fd08fd0c30..2ff76a5cf71 100644 --- a/sys/netinet/tcp_stacks/rack.c +++ b/sys/netinet/tcp_stacks/rack.c @@ -12750,7 +12750,8 @@ again: flags &= ~TH_FIN; } } - recwin = sbspace(&so->so_rcv); + recwin = lmin(lmax(sbspace(&so->so_rcv), 0), + (long)TCP_MAXWIN << tp->rcv_scale); /* * Sender silly window avoidance. We transmit under the following @@ -13656,8 +13657,6 @@ send: if (SEQ_GT(tp->rcv_adv, tp->rcv_nxt) && recwin < (long)(tp->rcv_adv - tp->rcv_nxt)) recwin = (long)(tp->rcv_adv - tp->rcv_nxt); - if (recwin > (long)TCP_MAXWIN << tp->rcv_scale) - recwin = (long)TCP_MAXWIN << tp->rcv_scale; } /*