diff --git a/sys/netinet/tcp_sack.c b/sys/netinet/tcp_sack.c --- a/sys/netinet/tcp_sack.c +++ b/sys/netinet/tcp_sack.c @@ -879,7 +879,6 @@ */ if ((V_tcp_do_newsack) && SEQ_LT(th->th_ack, tp->snd_recover) && - (tp->snd_recover == tp->snd_max) && TAILQ_EMPTY(&tp->snd_holes) && (tp->sackhint.delivered_data > 0)) { /* @@ -891,6 +890,7 @@ tcp_seq highdata = tp->snd_max; if (tp->t_flags & TF_SENTFIN) highdata--; + highdata = SEQ_MIN(highdata, tp->snd_recover); if (th->th_ack != highdata) { tp->snd_fack = th->th_ack; (void)tcp_sackhole_insert(tp, SEQ_MAX(th->th_ack,