diff options
author | silby <silby@FreeBSD.org> | 2003-11-02 07:47:03 +0000 |
---|---|---|
committer | silby <silby@FreeBSD.org> | 2003-11-02 07:47:03 +0000 |
commit | 1bddc356b1744573a6128cf8f8c0fbebfc173571 (patch) | |
tree | 078870ac899a25193239c6660b6dea9f4e1405ef /sys/netinet | |
parent | 841bb23cd98221fbaf9ae257e5be732de6675fb3 (diff) | |
download | FreeBSD-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')
-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 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; diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index d77ab59..78621e7 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 ceb292f..2e5b3fa 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 */ |