diff options
author | Mike Silbersack <silby@FreeBSD.org> | 2003-11-02 07:47:03 +0000 |
---|---|---|
committer | Mike Silbersack <silby@FreeBSD.org> | 2003-11-02 07:47:03 +0000 |
commit | 4bd4fa3fe69b8003e0869cc4ed5f368226b2003d (patch) | |
tree | 078870ac899a25193239c6660b6dea9f4e1405ef | |
parent | 03e432ad9cfa06218afdda215c66e94dea5af208 (diff) | |
download | src-4bd4fa3fe69b8003e0869cc4ed5f368226b2003d.tar.gz src-4bd4fa3fe69b8003e0869cc4ed5f368226b2003d.zip |
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.
Notes
Notes:
svn path=/head/; revision=121884
-rw-r--r-- | sys/netinet/tcp_subr.c | 19 | ||||
-rw-r--r-- | sys/netinet/tcp_timewait.c | 19 | ||||
-rw-r--r-- | sys/netinet/tcp_var.h | 1 |
3 files changed, 33 insertions, 6 deletions
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index d77ab59b2394..78621e71398c 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; diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index d77ab59b2394..78621e71398c 100644 --- a/sys/netinet/tcp_timewait.c +++ b/sys/netinet/tcp_timewait.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; diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h index ceb292fcf1c9..2e5b3fa58b19 100644 --- a/sys/netinet/tcp_var.h +++ b/sys/netinet/tcp_var.h @@ -247,6 +247,7 @@ struct tcptw { tcp_seq snd_nxt; tcp_seq rcv_nxt; tcp_seq iss; + tcp_seq irs; tcp_cc cc_recv; tcp_cc cc_send; u_short last_win; /* cached window value */ |