diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -1663,6 +1663,8 @@ if (flags & TH_FIN) tp->snd_nxt--; } + if (IN_RECOVERY(tp->t_flags)) + tp->sackhint.prr_out -= len; } SOCKBUF_UNLOCK_ASSERT(&so->so_snd); /* Check gotos. */ switch (error) { @@ -1700,6 +1702,11 @@ return (0); } /* FALLTHROUGH */ + case ENOTSUP: + if (tso && (flags & TH_CWR)) { + tso = 0; + goto send; + } default: return (error); }