Don't drop options from the third retransmitted SYN by default. If the
SYNs (or SYN/ACK replies) are dropped due to network congestion, then the remote end of the connection may act as if options such as window scaling are enabled but the local end will think they are not. This can result in very slow data transfers in the case of window scaling disagreements. The old behavior can be obtained by setting the net.inet.tcp.rexmit_drop_options sysctl to a non-zero value. Reviewed by: net@ MFC after: 2 weeks
This commit is contained in:
parent
d28396ae13
commit
6c0ef8957f
@ -119,6 +119,11 @@ SYSCTL_INT(_net_inet_tcp, OID_AUTO, keepcnt, CTLFLAG_RW, &tcp_keepcnt, 0,
|
||||
/* max idle probes */
|
||||
int tcp_maxpersistidle;
|
||||
|
||||
static int tcp_rexmit_drop_options = 0;
|
||||
SYSCTL_INT(_net_inet_tcp, OID_AUTO, rexmit_drop_options, CTLFLAG_RW,
|
||||
&tcp_rexmit_drop_options, 0,
|
||||
"Drop TCP options from 3rd and later retransmitted SYN");
|
||||
|
||||
static int per_cpu_timers = 0;
|
||||
SYSCTL_INT(_net_inet_tcp, OID_AUTO, per_cpu_timers, CTLFLAG_RW,
|
||||
&per_cpu_timers , 0, "run tcp timers on all cpus");
|
||||
@ -595,7 +600,8 @@ tcp_timer_rexmt(void * xtp)
|
||||
* header compression code which trashes TCP segments containing
|
||||
* unknown-to-them TCP options.
|
||||
*/
|
||||
if ((tp->t_state == TCPS_SYN_SENT) && (tp->t_rxtshift == 3))
|
||||
if (tcp_rexmit_drop_options && (tp->t_state == TCPS_SYN_SENT) &&
|
||||
(tp->t_rxtshift == 3))
|
||||
tp->t_flags &= ~(TF_REQ_SCALE|TF_REQ_TSTMP|TF_SACK_PERMIT);
|
||||
/*
|
||||
* If we backed off this far, our srtt estimate is probably bogus.
|
||||
|
Loading…
Reference in New Issue
Block a user