diff options
Diffstat (limited to 'sys/netinet/tcp_timewait.c')
-rw-r--r-- | sys/netinet/tcp_timewait.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index c83d952..845df42 100644 --- a/sys/netinet/tcp_timewait.c +++ b/sys/netinet/tcp_timewait.c @@ -166,13 +166,16 @@ static int tcp_inflight_debug = 0; SYSCTL_INT(_net_inet_tcp, OID_AUTO, inflight_debug, CTLFLAG_RW, &tcp_inflight_debug, 0, "Debug TCP inflight calculations"); -static int tcp_inflight_min = 1024; +static int tcp_inflight_min = 6144; SYSCTL_INT(_net_inet_tcp, OID_AUTO, inflight_min, CTLFLAG_RW, &tcp_inflight_min, 0, "Lower-bound for TCP inflight window"); static int tcp_inflight_max = TCP_MAXWIN << TCP_MAX_WINSHIFT; SYSCTL_INT(_net_inet_tcp, OID_AUTO, inflight_max, CTLFLAG_RW, &tcp_inflight_max, 0, "Upper-bound for TCP inflight window"); +static int tcp_inflight_stab = 20; +SYSCTL_INT(_net_inet_tcp, OID_AUTO, inflight_stab, CTLFLAG_RW, + &tcp_inflight_stab, 0, "Inflight Algorithm Stabilization 20 = 2 packets"); static void tcp_cleartaocache(void); static struct inpcb *tcp_notify(struct inpcb *, int); @@ -1652,8 +1655,9 @@ tcp_xmit_bandwidth_limit(struct tcpcb *tp, tcp_seq ack_seq) /* * Calculate the semi-static bandwidth delay product, plus two maximal * segments. The additional slop puts us squarely in the sweet - * spot and also handles the bandwidth run-up case. Without the - * slop we could be locking ourselves into a lower bandwidth. + * spot and also handles the bandwidth run-up case and stabilization. + * Without the slop we could be locking ourselves into a lower + * bandwidth. * * Situations Handled: * (1) Prevents over-queueing of packets on LANs, especially on @@ -1669,9 +1673,15 @@ tcp_xmit_bandwidth_limit(struct tcpcb *tp, tcp_seq ack_seq) * (3) Theoretically should stabilize in the face of multiple * connections implementing the same algorithm (this may need * a little work). + * + * (4) Stability value (defaults to 20 = 2 maximal packets) can + * be adjusted with a sysctl but typically only needs to be + * on very slow connections. A value no smaller then 5 + * should be used, but only reduce this default if you have + * no other choice. */ #define USERTT ((tp->t_srtt + tp->t_rttbest) / 2) - bwnd = (int64_t)bw * USERTT / (hz << TCP_RTT_SHIFT) + 2 * tp->t_maxseg; + bwnd = (int64_t)bw * USERTT / (hz << TCP_RTT_SHIFT) + tcp_inflight_stab * tp->t_maxseg / 10; #undef USERTT if (tcp_inflight_debug > 0) { |