summaryrefslogtreecommitdiffstats
path: root/sys/netinet/tcp_subr.c
diff options
context:
space:
mode:
authorsilby <silby@FreeBSD.org>2003-11-02 07:47:03 +0000
committersilby <silby@FreeBSD.org>2003-11-02 07:47:03 +0000
commit1bddc356b1744573a6128cf8f8c0fbebfc173571 (patch)
tree078870ac899a25193239c6660b6dea9f4e1405ef /sys/netinet/tcp_subr.c
parent841bb23cd98221fbaf9ae257e5be732de6675fb3 (diff)
downloadFreeBSD-src-1bddc356b1744573a6128cf8f8c0fbebfc173571.zip
FreeBSD-src-1bddc356b1744573a6128cf8f8c0fbebfc173571.tar.gz
Add an additional check to the tcp_twrecycleable function; I had
previously only considered the send sequence space. Unfortunately, some OSes (windows) still use a random positive increments scheme for their syn-ack ISNs, so I must consider receive sequence space as well. The value of 250000 bytes / second for Microsoft's ISN rate of increase was determined by testing with an XP machine.
Diffstat (limited to 'sys/netinet/tcp_subr.c')
-rw-r--r--sys/netinet/tcp_subr.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index d77ab59..78621e7 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -1638,6 +1638,7 @@ tcp_twstart(tp)
tw->snd_nxt = tp->snd_nxt;
tw->rcv_nxt = tp->rcv_nxt;
tw->iss = tp->iss;
+ tw->irs = tp->irs;
tw->cc_recv = tp->cc_recv;
tw->cc_send = tp->cc_send;
tw->t_starttime = tp->t_starttime;
@@ -1673,6 +1674,16 @@ tcp_twstart(tp)
}
/*
+ * The appromixate rate of ISN increase of Microsoft TCP stacks;
+ * the actual rate is slightly higher due to the addition of
+ * random positive increments.
+ *
+ * Most other new OSes use semi-randomized ISN values, so we
+ * do not need to worry about them.
+ */
+#define MS_ISN_BYTES_PER_SECOND 250000
+
+/*
* Determine if the ISN we will generate has advanced beyond the last
* sequence number used by the previous connection. If so, indicate
* that it is safe to recycle this tw socket by returning 1.
@@ -1680,11 +1691,13 @@ tcp_twstart(tp)
int
tcp_twrecycleable(struct tcptw *tw)
{
- tcp_seq new_isn = tw->iss;
+ tcp_seq new_iss = tw->iss;
+ tcp_seq new_irs = tw->irs;
- new_isn += (ticks - tw->t_starttime) * (ISN_BYTES_PER_SECOND / hz);
+ new_iss += (ticks - tw->t_starttime) * (ISN_BYTES_PER_SECOND / hz);
+ new_irs += (ticks - tw->t_starttime) * (MS_ISN_BYTES_PER_SECOND / hz);
- if (SEQ_GT(new_isn, tw->snd_nxt))
+ if (SEQ_GT(new_iss, tw->snd_nxt) && SEQ_GT(new_irs, tw->rcv_nxt))
return 1;
else
return 0;
OpenPOWER on IntegriCloud