summaryrefslogtreecommitdiff
path: root/sys/netinet/tcp_input.c
diff options
context:
space:
mode:
authorJayanth Vijayaraghavan <jayanth@FreeBSD.org>2004-07-01 23:34:06 +0000
committerJayanth Vijayaraghavan <jayanth@FreeBSD.org>2004-07-01 23:34:06 +0000
commita0445c2e2ca2615b5d2f5a43c4b694d3ac7bf297 (patch)
tree8b7987e999d9e82d18517e3f3328293db657f082 /sys/netinet/tcp_input.c
parent6ff8a07467dc5732d43402777d9f253c353563ed (diff)
Notes
Diffstat (limited to 'sys/netinet/tcp_input.c')
-rw-r--r--sys/netinet/tcp_input.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index ee6d3cec1f10..78b1fadcfba7 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;
}