diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netinet/tcp_input.c | 27 | ||||
-rw-r--r-- | sys/netinet/tcp_reass.c | 27 |
2 files changed, 40 insertions, 14 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index ee6d3ce..78b1fad 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -1931,12 +1931,25 @@ trimthenstep6: } else if (tp->t_dupacks == tcprexmtthresh) { tcp_seq onxt = tp->snd_nxt; u_int win; - if ((tcp_do_newreno || - tp->sack_enable) && - SEQ_LEQ(th->th_ack, - tp->snd_recover)) { - tp->t_dupacks = 0; - break; + + /* + * If we're doing sack, check to + * see if we're already in sack + * recovery. If we're not doing sack, + * check to see if we're in newreno + * recovery. + */ + if (tp->sack_enable) { + if (IN_FASTRECOVERY(tp)) { + tp->t_dupacks = 0; + break; + } + } else if (tcp_do_newreno) { + if (SEQ_LEQ(th->th_ack, + tp->snd_recover)) { + tp->t_dupacks = 0; + break; + } } win = min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg; @@ -1953,7 +1966,7 @@ trimthenstep6: tp->t_maxseg * tp->t_dupacks; (void) tcp_output(tp); - tp->snd_cwnd = + tp->snd_cwnd += tp->snd_ssthresh; goto drop; } diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c index ee6d3ce..78b1fad 100644 --- a/sys/netinet/tcp_reass.c +++ b/sys/netinet/tcp_reass.c @@ -1931,12 +1931,25 @@ trimthenstep6: } else if (tp->t_dupacks == tcprexmtthresh) { tcp_seq onxt = tp->snd_nxt; u_int win; - if ((tcp_do_newreno || - tp->sack_enable) && - SEQ_LEQ(th->th_ack, - tp->snd_recover)) { - tp->t_dupacks = 0; - break; + + /* + * If we're doing sack, check to + * see if we're already in sack + * recovery. If we're not doing sack, + * check to see if we're in newreno + * recovery. + */ + if (tp->sack_enable) { + if (IN_FASTRECOVERY(tp)) { + tp->t_dupacks = 0; + break; + } + } else if (tcp_do_newreno) { + if (SEQ_LEQ(th->th_ack, + tp->snd_recover)) { + tp->t_dupacks = 0; + break; + } } win = min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg; @@ -1953,7 +1966,7 @@ trimthenstep6: tp->t_maxseg * tp->t_dupacks; (void) tcp_output(tp); - tp->snd_cwnd = + tp->snd_cwnd += tp->snd_ssthresh; goto drop; } |