diff options
-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 */ |