summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/netinet/tcp_input.c19
-rw-r--r--sys/netinet/tcp_subr.c3
-rw-r--r--sys/netinet/tcp_usrreq.c5
-rw-r--r--sys/netinet/tcp_var.h7
4 files changed, 21 insertions, 13 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index d297e956bc4..2a2078b41c2 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tcp_input.c,v 1.148 2004/01/29 10:06:21 markus Exp $ */
+/* $OpenBSD: tcp_input.c,v 1.149 2004/01/29 11:55:28 markus Exp $ */
/* $NetBSD: tcp_input.c,v 1.23 1996/02/13 23:43:44 christos Exp $ */
/*
@@ -1178,6 +1178,9 @@ after_listen:
TCP_TIMER_DISARM(tp, TCPT_REXMT);
tp->irs = th->th_seq;
tcp_mss(tp, opti.maxseg);
+ /* Reset initial window to 1 segment for retransmit */
+ if (tp->t_rxtshift > 0)
+ tp->snd_cwnd = tp->t_maxseg;
tcp_rcvseqinit(tp);
tp->t_flags |= TF_ACKNOW;
#ifdef TCP_SACK
@@ -3067,6 +3070,9 @@ tcp_mss(tp, offer)
tp->snd_cwnd = ulmax((tp->snd_cwnd / tp->t_maxseg) *
mss, mss);
}
+ } else if (tcp_do_rfc3390) {
+ /* increase initial window */
+ tp->snd_cwnd = ulmin(4 * mss, ulmax(2 * mss, 4380));
} else
tp->snd_cwnd = mss;
@@ -3786,14 +3792,9 @@ syn_cache_get(src, dst, th, hlen, tlen, so, m)
tcp_mss(tp, sc->sc_peermaxseg); /* sets t_maxseg */
if (sc->sc_peermaxseg)
tcp_mss_update(tp);
-#if 0
- /*
- * XXX
- * Initialize the initial congestion window. If we
- * had to retransmit the SYN,ACK, we must initialize cwnd
- * to 1 segment (i.e. the Loss Window).
- */
-#endif
+ /* Reset initial window to 1 segment for retransmit */
+ if (sc->sc_rxtshift > 0)
+ tp->snd_cwnd = tp->t_maxseg;
tp->snd_wl1 = sc->sc_irs;
tp->rcv_up = sc->sc_irs + 1;
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 6d308645b00..ddd9c25d1ab 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tcp_subr.c,v 1.73 2004/01/09 12:22:30 markus Exp $ */
+/* $OpenBSD: tcp_subr.c,v 1.74 2004/01/29 11:55:28 markus Exp $ */
/* $NetBSD: tcp_subr.c,v 1.22 1996/02/13 23:44:00 christos Exp $ */
/*
@@ -131,6 +131,7 @@ int tcp_do_rfc1323 = TCP_DO_RFC1323;
int tcp_do_sack = TCP_DO_SACK; /* RFC 2018 selective ACKs */
int tcp_ack_on_push = 0; /* set to enable immediate ACK-on-PUSH */
int tcp_do_ecn = 0; /* RFC3168 ECN enabled/disabled? */
+int tcp_do_rfc3390 = 0; /* RFC3390 Increasing TCP's Initial Window */
u_int32_t tcp_now;
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index c1a167a37a5..1b415e25294 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tcp_usrreq.c,v 1.75 2004/01/06 17:38:13 markus Exp $ */
+/* $OpenBSD: tcp_usrreq.c,v 1.76 2004/01/29 11:55:28 markus Exp $ */
/* $NetBSD: tcp_usrreq.c,v 1.20 1996/02/13 23:44:16 christos Exp $ */
/*
@@ -931,6 +931,9 @@ tcp_sysctl(name, namelen, oldp, oldlenp, newp, newlen)
case TCPCTL_SYN_BUCKET_LIMIT:
return (sysctl_int(oldp, oldlenp, newp, newlen,
&tcp_syn_bucket_limit));
+ case TCPCTL_RFC3390:
+ return (sysctl_int(oldp, oldlenp, newp, newlen,
+ &tcp_do_rfc3390));
default:
return (ENOPROTOOPT);
}
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index 22a448336eb..3a2eb273114 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tcp_var.h,v 1.55 2004/01/14 13:38:21 markus Exp $ */
+/* $OpenBSD: tcp_var.h,v 1.56 2004/01/29 11:55:28 markus Exp $ */
/* $NetBSD: tcp_var.h,v 1.17 1996/02/13 23:44:24 christos Exp $ */
/*
@@ -434,7 +434,8 @@ struct tcpstat {
#define TCPCTL_ECN 14 /* RFC3168 ECN */
#define TCPCTL_SYN_CACHE_LIMIT 15 /* max size of comp. state engine */
#define TCPCTL_SYN_BUCKET_LIMIT 16 /* max size of hash bucket */
-#define TCPCTL_MAXID 17
+#define TCPCTL_RFC3390 17 /* enable/disable RFC3390 increased cwnd */
+#define TCPCTL_MAXID 18
#define TCPCTL_NAMES { \
{ 0, 0 }, \
@@ -454,6 +455,7 @@ struct tcpstat {
{ "ecn", CTLTYPE_INT }, \
{ "syncachelimit", CTLTYPE_INT }, \
{ "synbucketlimit", CTLTYPE_INT }, \
+ { "rfc3390", CTLTYPE_INT }, \
}
struct tcp_ident_mapping {
@@ -473,6 +475,7 @@ extern int tcp_do_sack; /* SACK enabled/disabled */
extern struct pool sackhl_pool;
#endif
extern int tcp_do_ecn; /* RFC3168 ECN enabled/disabled? */
+extern int tcp_do_rfc3390; /* RFC3390 Increasing TCP's Initial Window */
extern int tcp_syn_cache_limit; /* max entries for compressed state engine */
extern int tcp_syn_bucket_limit;/* max entries per hash bucket */