Mercurial > flash_v2
changeset 1344:d578891243fd
TCP retransmit control changes - from Matt Jerdonek
| author | gthomas |
|---|---|
| date | Mon, 03 Nov 2003 14:57:33 +0000 |
| parents | 42a060de9457 |
| children | e1737b465766 |
| files | packages/net/bsd_tcpip/current/ChangeLog packages/net/bsd_tcpip/current/include/netinet/tcp_timer.h packages/net/bsd_tcpip/current/src/sys/netinet/tcp_output.c packages/net/bsd_tcpip/current/src/sys/netinet/tcp_subr.c packages/net/bsd_tcpip/current/src/sys/netinet/tcp_timer.c |
| diffstat | 5 files changed, 50 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/net/bsd_tcpip/current/ChangeLog +++ b/packages/net/bsd_tcpip/current/ChangeLog @@ -1,3 +1,15 @@ +2003-10-28 Matt Jerdonek <maj1224@yahoo.com> + + * src/sys/netinet/tcp_output.c (tcp_setpersist): Use variable + tcp_rexmit_shift_max instead of TCP_MAXRXTSHIFT + * src/sys/netinet/tcp_subr.c (tcp_newtcpcb): Add FreeBSD + changes to control minimum retransmit time + * src/sys/netinet/tcp_timer.c : Use variable tcp_rexmit_shift_max + instead of TCP_MAXRXTSHIFT. Also add FreeBSD changes to control + minimum retransmit time + * include/netinet/tcp_timer.h : Add external declarations to + support above. + 2003-10-15 Roland Cassebohm <roland.cassebohm@visionsystems.de> * src/sys/net/if.c (ifinit): Change printf(...) to log(LOG_INIT,...) to
--- a/packages/net/bsd_tcpip/current/include/netinet/tcp_timer.h +++ b/packages/net/bsd_tcpip/current/include/netinet/tcp_timer.h @@ -145,6 +145,8 @@ extern int tcp_keepintvl; /* time betwe extern int tcp_maxidle; /* time to drop after starting probes */ extern int tcp_delacktime; /* time before sending a delayed ACK */ extern int tcp_maxpersistidle; +extern int tcp_rexmit_min; /* min time between retransmissions */ +extern int tcp_rexmit_shift_max; /* maximum retransmission attempts */ extern int tcp_msl; extern int tcp_ttl; /* time to live for TCP segs */ extern int tcp_backoff[];
--- a/packages/net/bsd_tcpip/current/src/sys/netinet/tcp_output.c +++ b/packages/net/bsd_tcpip/current/src/sys/netinet/tcp_output.c @@ -943,6 +943,6 @@ tcp_setpersist(tp) TCPT_RANGESET(tt, t * tcp_backoff[tp->t_rxtshift], TCPTV_PERSMIN, TCPTV_PERSMAX); callout_reset(tp->tt_persist, tt, tcp_timer_persist, tp); - if (tp->t_rxtshift < TCP_MAXRXTSHIFT) + if (tp->t_rxtshift < tcp_rexmit_shift_max) tp->t_rxtshift++; }
--- a/packages/net/bsd_tcpip/current/src/sys/netinet/tcp_subr.c +++ b/packages/net/bsd_tcpip/current/src/sys/netinet/tcp_subr.c @@ -152,7 +152,7 @@ SYSCTL_INT(_net_inet_tcp, OID_AUTO, stri static int tcp_isn_reseed_interval = 0; SYSCTL_INT(_net_inet_tcp, OID_AUTO, isn_reseed_interval, CTLFLAG_RW, &tcp_isn_reseed_interval, 0, "Seconds between reseeding of ISN secret"); - + static void tcp_cleartaocache __P((void)); static void tcp_notify __P((struct inpcb *, int)); @@ -205,6 +205,7 @@ tcp_init() tcp_keepintvl = TCPTV_KEEPINTVL; tcp_maxpersistidle = TCPTV_KEEP_IDLE; tcp_msl = TCPTV_MSL; + tcp_rexmit_min = TCPTV_MIN; LIST_INIT(&tcb); tcbinfo.listhead = &tcb; @@ -544,7 +545,7 @@ tcp_newtcpcb(inp) */ tp->t_srtt = TCPTV_SRTTBASE; tp->t_rttvar = ((TCPTV_RTOBASE - TCPTV_SRTTBASE) << TCP_RTTVAR_SHIFT) / 4; - tp->t_rttmin = TCPTV_MIN; + tp->t_rttmin = tcp_rexmit_min; tp->t_rxtcur = TCPTV_RTOBASE; tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT;
--- a/packages/net/bsd_tcpip/current/src/sys/netinet/tcp_timer.c +++ b/packages/net/bsd_tcpip/current/src/sys/netinet/tcp_timer.c @@ -101,6 +101,26 @@ sysctl_msec_to_ticks(SYSCTL_HANDLER_ARGS *(int *)oidp->oid_arg1 = tt; return (0); } +static int +sysctl_rexmitmax_rangecheck(SYSCTL_HANDLER_ARGS) +{ + int error, tt; + + tt = *(int *)oidp->oid_arg1; + + error = sysctl_handle_int(oidp, &tt, 0, req); + if (error || !req->newptr) + return (error); + + if (tt > TCP_MAXRXTSHIFT) + return (EINVAL); + + if (tt < 2) + return (EINVAL); + + *(int *)oidp->oid_arg1 = tt; + return (0); +} #endif int tcp_keepinit; SYSCTL_PROC(_net_inet_tcp, TCPCTL_KEEPINIT, keepinit, CTLTYPE_INT|CTLFLAG_RW, @@ -126,6 +146,14 @@ SYSCTL_PROC(_net_inet_tcp, OID_AUTO, msl static int always_keepalive = 0; SYSCTL_INT(_net_inet_tcp, OID_AUTO, always_keepalive, CTLFLAG_RW, &always_keepalive , 0, "Assume SO_KEEPALIVE on all TCP connections"); + +int tcp_rexmit_min; +SYSCTL_PROC(_net_inet_tcp, OID_AUTO, rexmit_min, CTLTYPE_INT|CTLFLAG_RW, + &tcp_rexmit_min, 0, sysctl_msec_to_ticks, "I", "Minimum retransmission timeout"); + +int tcp_rexmit_shift_max = TCP_MAXRXTSHIFT; +SYSCTL_PROC(_net_inet_tcp, OID_AUTO, rexmit_shift_max, CTLTYPE_INT|CTLFLAG_RW, + &tcp_rexmit_shift_max, 0, sysctl_rexmitmax_rangecheck, "I", "Maximum TCP retransmissions"); static int tcp_keepcnt = TCPTV_KEEPCNT; /* max idle probes */ @@ -337,7 +365,7 @@ tcp_timer_persist(xtp) * (no responses to probes) reaches the maximum * backoff that we would use if retransmitting. */ - if (tp->t_rxtshift == TCP_MAXRXTSHIFT && + if (tp->t_rxtshift == tcp_rexmit_shift_max && ((ticks - tp->t_rcvtime) >= tcp_maxpersistidle || (ticks - tp->t_rcvtime) >= TCP_REXMTVAL(tp) * tcp_totbackoff)) { tcpstat.tcps_persistdrop++; @@ -381,8 +409,8 @@ tcp_timer_rexmt(xtp) * been acked within retransmit interval. Back off * to a longer retransmit interval and retransmit one segment. */ - if (++tp->t_rxtshift > TCP_MAXRXTSHIFT) { - tp->t_rxtshift = TCP_MAXRXTSHIFT; + if (++tp->t_rxtshift > tcp_rexmit_shift_max) { + tp->t_rxtshift = tcp_rexmit_shift_max; tcpstat.tcps_timeoutdrop++; tp = tcp_drop(tp, tp->t_softerror ? tp->t_softerror : ETIMEDOUT); @@ -426,7 +454,7 @@ tcp_timer_rexmt(xtp) * move the current srtt into rttvar to keep the current * retransmit times until then. */ - if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) { + if (tp->t_rxtshift > tcp_rexmit_shift_max / 4) { #ifdef INET6 if ((tp->t_inpcb->inp_vflag & INP_IPV6) != 0) in6_losing(tp->t_inpcb);
