commit 8b774af641799a6c0c558719f95fe3e30928cf00 Author: Andrey Zonov Date: Thu Sep 20 01:05:50 2012 +0400 - Make TCP timers tunable. diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index 53a4ab4..e095af6 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -1375,7 +1375,7 @@ tcp_setpersist(struct tcpcb *tp) * Start/restart persistance timer. */ TCPT_RANGESET(tt, t * tcp_backoff[tp->t_rxtshift], - TCPTV_PERSMIN, TCPTV_PERSMAX); + tcp_persmin, tcp_persmax); tcp_timer_activate(tp, TT_PERSIST, tt); if (tp->t_rxtshift < TCP_MAXRXTSHIFT) tp->t_rxtshift++; diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index 2662163..2e2c6c5 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -336,6 +336,9 @@ tcp_init(void) tcp_rexmit_min = 1; tcp_rexmit_slop = TCPTV_CPU_VAR; tcp_finwait2_timeout = TCPTV_FINWAIT2_TIMEOUT; + tcp_rtobase = TCPTV_RTOBASE; + tcp_persmin = TCPTV_PERSMIN; + tcp_persmax = TCPTV_PERSMAX; tcp_tcbhashsize = hashsize; TUNABLE_INT_FETCH("net.inet.tcp.soreceive_stream", &tcp_soreceive_stream); @@ -731,9 +734,9 @@ tcp_newtcpcb(struct inpcb *inp) * reasonable initial retransmit time. */ tp->t_srtt = TCPTV_SRTTBASE; - tp->t_rttvar = ((TCPTV_RTOBASE - TCPTV_SRTTBASE) << TCP_RTTVAR_SHIFT) / 4; + tp->t_rttvar = ((tcp_rtobase - TCPTV_SRTTBASE) << TCP_RTTVAR_SHIFT) / 4; tp->t_rttmin = tcp_rexmit_min; - tp->t_rxtcur = TCPTV_RTOBASE; + tp->t_rxtcur = tcp_rtobase; tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT; tp->t_rcvtime = ticks; diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c index 55a782b..1d3ba9d 100644 --- a/sys/netinet/tcp_syncache.c +++ b/sys/netinet/tcp_syncache.c @@ -175,6 +175,11 @@ SYSCTL_VNET_INT(_net_inet_tcp_syncache, OID_AUTO, rst_on_sock_fail, CTLFLAG_RW, &VNET_NAME(tcp_sc_rst_sock_fail), 0, "Send reset on socket allocation failure"); +static int tcp_sc_rexmttime; +SYSCTL_PROC(_net_inet_tcp_syncache, OID_AUTO, rexmttime, CTLTYPE_INT|CTLFLAG_RW, + &tcp_sc_rexmttime, 0, sysctl_msec_to_ticks, "I", + "SYN/ACK retransmit timeout"); + static MALLOC_DEFINE(M_SYNCACHE, "syncache", "TCP syncache"); #define SYNCACHE_HASH(inc, mask) \ @@ -225,6 +230,7 @@ syncache_init(void) { int i; + tcp_sc_rexmttime = TCPTV_RTOBASE; V_tcp_syncache.cache_count = 0; V_tcp_syncache.hashsize = TCP_SYNCACHE_HASHSIZE; V_tcp_syncache.bucket_limit = TCP_SYNCACHE_BUCKETLIMIT; @@ -383,7 +389,7 @@ static void syncache_timeout(struct syncache *sc, struct syncache_head *sch, int docallout) { sc->sc_rxttime = ticks + - TCPTV_RTOBASE * (tcp_backoff[sc->sc_rxmits]); + tcp_sc_rexmttime * (tcp_backoff[sc->sc_rxmits]); sc->sc_rxmits++; if (TSTMP_LT(sc->sc_rxttime, sch->sch_nextc)) { sch->sch_nextc = sc->sc_rxttime; diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c index 531899c..4510ad0 100644 --- a/sys/netinet/tcp_timer.c +++ b/sys/netinet/tcp_timer.c @@ -115,6 +115,18 @@ int tcp_keepcnt = TCPTV_KEEPCNT; SYSCTL_INT(_net_inet_tcp, OID_AUTO, keepcnt, CTLFLAG_RW, &tcp_keepcnt, 0, "Number of keepalive probes to send"); +int tcp_rtobase; +SYSCTL_PROC(_net_inet_tcp, OID_AUTO, rtobase, CTLTYPE_INT|CTLFLAG_RW, + &tcp_rtobase, 0, sysctl_msec_to_ticks, "I", "Initial retransmit timeout"); + +int tcp_persmin; +SYSCTL_PROC(_net_inet_tcp, OID_AUTO, persmin, CTLTYPE_INT|CTLFLAG_RW, + &tcp_persmin, 0, sysctl_msec_to_ticks, "I", "Retransmit persistence"); + +int tcp_persmax; +SYSCTL_PROC(_net_inet_tcp, OID_AUTO, persmax, CTLTYPE_INT|CTLFLAG_RW, + &tcp_persmax, 0, sysctl_msec_to_ticks, "I", "Maximum persist interval"); + /* max idle probes */ int tcp_maxpersistidle; diff --git a/sys/netinet/tcp_timer.h b/sys/netinet/tcp_timer.h index 8a93da8..0be3e6a 100644 --- a/sys/netinet/tcp_timer.h +++ b/sys/netinet/tcp_timer.h @@ -173,6 +173,9 @@ extern int tcp_backoff[]; extern int tcp_finwait2_timeout; extern int tcp_fast_finwait2_recycle; +extern int tcp_rtobase; +extern int tcp_persmin; +extern int tcp_persmax; void tcp_timer_init(void); void tcp_timer_2msl(void *xtp);