diff options
| author | Stephen Hemminger <stephen@networkplumber.org> | 2013-02-05 02:25:17 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-02-05 14:51:16 -0500 |
| commit | ca2eb5679f8ddffff60156af42595df44a315ef0 (patch) | |
| tree | e056a2cf5454039f071d47cc919bf73a9bf0c60f | |
| parent | 547472b8e1da72ae226430c0c4273e36fc8ca768 (diff) | |
tcp: remove Appropriate Byte Count support
TCP Appropriate Byte Count was added by me, but later disabled.
There is no point in maintaining it since it is a potential source
of bugs and Linux already implements other better window protection
heuristics.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | Documentation/networking/ip-sysctl.txt | 11 | ||||
| -rw-r--r-- | include/linux/tcp.h | 1 | ||||
| -rw-r--r-- | include/net/tcp.h | 1 | ||||
| -rw-r--r-- | kernel/sysctl_binary.c | 1 | ||||
| -rw-r--r-- | net/ipv4/sysctl_net_ipv4.c | 7 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 1 | ||||
| -rw-r--r-- | net/ipv4/tcp_cong.c | 30 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 15 | ||||
| -rw-r--r-- | net/ipv4/tcp_minisocks.c | 1 |
9 files changed, 1 insertions, 67 deletions
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index 19ac1802bfd4..dc2dc87d2557 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
| @@ -130,17 +130,6 @@ somaxconn - INTEGER | |||
| 130 | Defaults to 128. See also tcp_max_syn_backlog for additional tuning | 130 | Defaults to 128. See also tcp_max_syn_backlog for additional tuning |
| 131 | for TCP sockets. | 131 | for TCP sockets. |
| 132 | 132 | ||
| 133 | tcp_abc - INTEGER | ||
| 134 | Controls Appropriate Byte Count (ABC) defined in RFC3465. | ||
| 135 | ABC is a way of increasing congestion window (cwnd) more slowly | ||
| 136 | in response to partial acknowledgments. | ||
| 137 | Possible values are: | ||
| 138 | 0 increase cwnd once per acknowledgment (no ABC) | ||
| 139 | 1 increase cwnd once per acknowledgment of full sized segment | ||
| 140 | 2 allow increase cwnd by two if acknowledgment is | ||
| 141 | of two segments to compensate for delayed acknowledgments. | ||
| 142 | Default: 0 (off) | ||
| 143 | |||
| 144 | tcp_abort_on_overflow - BOOLEAN | 133 | tcp_abort_on_overflow - BOOLEAN |
| 145 | If listening service is too slow to accept new connections, | 134 | If listening service is too slow to accept new connections, |
| 146 | reset them. Default state is FALSE. It means that if overflow | 135 | reset them. Default state is FALSE. It means that if overflow |
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 4e1d2283e3cc..6d0d46138ae8 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
| @@ -246,7 +246,6 @@ struct tcp_sock { | |||
| 246 | u32 sacked_out; /* SACK'd packets */ | 246 | u32 sacked_out; /* SACK'd packets */ |
| 247 | u32 fackets_out; /* FACK'd packets */ | 247 | u32 fackets_out; /* FACK'd packets */ |
| 248 | u32 tso_deferred; | 248 | u32 tso_deferred; |
| 249 | u32 bytes_acked; /* Appropriate Byte Counting - RFC3465 */ | ||
| 250 | 249 | ||
| 251 | /* from STCP, retrans queue hinting */ | 250 | /* from STCP, retrans queue hinting */ |
| 252 | struct sk_buff* lost_skb_hint; | 251 | struct sk_buff* lost_skb_hint; |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 614af8b7758e..23f2e98d4b65 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -279,7 +279,6 @@ extern int sysctl_tcp_dma_copybreak; | |||
| 279 | extern int sysctl_tcp_nometrics_save; | 279 | extern int sysctl_tcp_nometrics_save; |
| 280 | extern int sysctl_tcp_moderate_rcvbuf; | 280 | extern int sysctl_tcp_moderate_rcvbuf; |
| 281 | extern int sysctl_tcp_tso_win_divisor; | 281 | extern int sysctl_tcp_tso_win_divisor; |
| 282 | extern int sysctl_tcp_abc; | ||
| 283 | extern int sysctl_tcp_mtu_probing; | 282 | extern int sysctl_tcp_mtu_probing; |
| 284 | extern int sysctl_tcp_base_mss; | 283 | extern int sysctl_tcp_base_mss; |
| 285 | extern int sysctl_tcp_workaround_signed_windows; | 284 | extern int sysctl_tcp_workaround_signed_windows; |
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c index 5a6384450501..b669ca1fa103 100644 --- a/kernel/sysctl_binary.c +++ b/kernel/sysctl_binary.c | |||
| @@ -387,7 +387,6 @@ static const struct bin_table bin_net_ipv4_table[] = { | |||
| 387 | { CTL_INT, NET_TCP_MODERATE_RCVBUF, "tcp_moderate_rcvbuf" }, | 387 | { CTL_INT, NET_TCP_MODERATE_RCVBUF, "tcp_moderate_rcvbuf" }, |
| 388 | { CTL_INT, NET_TCP_TSO_WIN_DIVISOR, "tcp_tso_win_divisor" }, | 388 | { CTL_INT, NET_TCP_TSO_WIN_DIVISOR, "tcp_tso_win_divisor" }, |
| 389 | { CTL_STR, NET_TCP_CONG_CONTROL, "tcp_congestion_control" }, | 389 | { CTL_STR, NET_TCP_CONG_CONTROL, "tcp_congestion_control" }, |
| 390 | { CTL_INT, NET_TCP_ABC, "tcp_abc" }, | ||
| 391 | { CTL_INT, NET_TCP_MTU_PROBING, "tcp_mtu_probing" }, | 390 | { CTL_INT, NET_TCP_MTU_PROBING, "tcp_mtu_probing" }, |
| 392 | { CTL_INT, NET_TCP_BASE_MSS, "tcp_base_mss" }, | 391 | { CTL_INT, NET_TCP_BASE_MSS, "tcp_base_mss" }, |
| 393 | { CTL_INT, NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS, "tcp_workaround_signed_windows" }, | 392 | { CTL_INT, NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS, "tcp_workaround_signed_windows" }, |
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 2622707602d1..960fd29d9b8e 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
| @@ -633,13 +633,6 @@ static struct ctl_table ipv4_table[] = { | |||
| 633 | .proc_handler = proc_tcp_congestion_control, | 633 | .proc_handler = proc_tcp_congestion_control, |
| 634 | }, | 634 | }, |
| 635 | { | 635 | { |
| 636 | .procname = "tcp_abc", | ||
| 637 | .data = &sysctl_tcp_abc, | ||
| 638 | .maxlen = sizeof(int), | ||
| 639 | .mode = 0644, | ||
| 640 | .proc_handler = proc_dointvec, | ||
| 641 | }, | ||
| 642 | { | ||
| 643 | .procname = "tcp_mtu_probing", | 636 | .procname = "tcp_mtu_probing", |
| 644 | .data = &sysctl_tcp_mtu_probing, | 637 | .data = &sysctl_tcp_mtu_probing, |
| 645 | .maxlen = sizeof(int), | 638 | .maxlen = sizeof(int), |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 3ec1f69c5ceb..2c7e5963c2ea 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -2289,7 +2289,6 @@ int tcp_disconnect(struct sock *sk, int flags) | |||
| 2289 | tp->packets_out = 0; | 2289 | tp->packets_out = 0; |
| 2290 | tp->snd_ssthresh = TCP_INFINITE_SSTHRESH; | 2290 | tp->snd_ssthresh = TCP_INFINITE_SSTHRESH; |
| 2291 | tp->snd_cwnd_cnt = 0; | 2291 | tp->snd_cwnd_cnt = 0; |
| 2292 | tp->bytes_acked = 0; | ||
| 2293 | tp->window_clamp = 0; | 2292 | tp->window_clamp = 0; |
| 2294 | tcp_set_ca_state(sk, TCP_CA_Open); | 2293 | tcp_set_ca_state(sk, TCP_CA_Open); |
| 2295 | tcp_clear_retrans(tp); | 2294 | tcp_clear_retrans(tp); |
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index cdf2e707bb10..019c2389a341 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
| @@ -317,28 +317,11 @@ void tcp_slow_start(struct tcp_sock *tp) | |||
| 317 | snd_cwnd = 1U; | 317 | snd_cwnd = 1U; |
| 318 | } | 318 | } |
| 319 | 319 | ||
| 320 | /* RFC3465: ABC Slow start | ||
| 321 | * Increase only after a full MSS of bytes is acked | ||
| 322 | * | ||
| 323 | * TCP sender SHOULD increase cwnd by the number of | ||
| 324 | * previously unacknowledged bytes ACKed by each incoming | ||
| 325 | * acknowledgment, provided the increase is not more than L | ||
| 326 | */ | ||
| 327 | if (sysctl_tcp_abc && tp->bytes_acked < tp->mss_cache) | ||
| 328 | return; | ||
| 329 | |||
| 330 | if (sysctl_tcp_max_ssthresh > 0 && tp->snd_cwnd > sysctl_tcp_max_ssthresh) | 320 | if (sysctl_tcp_max_ssthresh > 0 && tp->snd_cwnd > sysctl_tcp_max_ssthresh) |
| 331 | cnt = sysctl_tcp_max_ssthresh >> 1; /* limited slow start */ | 321 | cnt = sysctl_tcp_max_ssthresh >> 1; /* limited slow start */ |
| 332 | else | 322 | else |
| 333 | cnt = snd_cwnd; /* exponential increase */ | 323 | cnt = snd_cwnd; /* exponential increase */ |
| 334 | 324 | ||
| 335 | /* RFC3465: ABC | ||
| 336 | * We MAY increase by 2 if discovered delayed ack | ||
| 337 | */ | ||
| 338 | if (sysctl_tcp_abc > 1 && tp->bytes_acked >= 2*tp->mss_cache) | ||
| 339 | cnt <<= 1; | ||
| 340 | tp->bytes_acked = 0; | ||
| 341 | |||
| 342 | tp->snd_cwnd_cnt += cnt; | 325 | tp->snd_cwnd_cnt += cnt; |
| 343 | while (tp->snd_cwnd_cnt >= snd_cwnd) { | 326 | while (tp->snd_cwnd_cnt >= snd_cwnd) { |
| 344 | tp->snd_cwnd_cnt -= snd_cwnd; | 327 | tp->snd_cwnd_cnt -= snd_cwnd; |
| @@ -378,20 +361,9 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 378 | /* In "safe" area, increase. */ | 361 | /* In "safe" area, increase. */ |
| 379 | if (tp->snd_cwnd <= tp->snd_ssthresh) | 362 | if (tp->snd_cwnd <= tp->snd_ssthresh) |
| 380 | tcp_slow_start(tp); | 363 | tcp_slow_start(tp); |
| 381 | |||
| 382 | /* In dangerous area, increase slowly. */ | 364 | /* In dangerous area, increase slowly. */ |
| 383 | else if (sysctl_tcp_abc) { | 365 | else |
| 384 | /* RFC3465: Appropriate Byte Count | ||
| 385 | * increase once for each full cwnd acked | ||
| 386 | */ | ||
| 387 | if (tp->bytes_acked >= tp->snd_cwnd*tp->mss_cache) { | ||
| 388 | tp->bytes_acked -= tp->snd_cwnd*tp->mss_cache; | ||
| 389 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) | ||
| 390 | tp->snd_cwnd++; | ||
| 391 | } | ||
| 392 | } else { | ||
| 393 | tcp_cong_avoid_ai(tp, tp->snd_cwnd); | 366 | tcp_cong_avoid_ai(tp, tp->snd_cwnd); |
| 394 | } | ||
| 395 | } | 367 | } |
| 396 | EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid); | 368 | EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid); |
| 397 | 369 | ||
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index e376aa9591bc..f56bd1082f54 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -98,7 +98,6 @@ int sysctl_tcp_frto_response __read_mostly; | |||
| 98 | int sysctl_tcp_thin_dupack __read_mostly; | 98 | int sysctl_tcp_thin_dupack __read_mostly; |
| 99 | 99 | ||
| 100 | int sysctl_tcp_moderate_rcvbuf __read_mostly = 1; | 100 | int sysctl_tcp_moderate_rcvbuf __read_mostly = 1; |
| 101 | int sysctl_tcp_abc __read_mostly; | ||
| 102 | int sysctl_tcp_early_retrans __read_mostly = 2; | 101 | int sysctl_tcp_early_retrans __read_mostly = 2; |
| 103 | 102 | ||
| 104 | #define FLAG_DATA 0x01 /* Incoming frame contained data. */ | 103 | #define FLAG_DATA 0x01 /* Incoming frame contained data. */ |
| @@ -2007,7 +2006,6 @@ static void tcp_enter_frto_loss(struct sock *sk, int allowed_segments, int flag) | |||
| 2007 | tp->snd_cwnd_cnt = 0; | 2006 | tp->snd_cwnd_cnt = 0; |
| 2008 | tp->snd_cwnd_stamp = tcp_time_stamp; | 2007 | tp->snd_cwnd_stamp = tcp_time_stamp; |
| 2009 | tp->frto_counter = 0; | 2008 | tp->frto_counter = 0; |
| 2010 | tp->bytes_acked = 0; | ||
| 2011 | 2009 | ||
| 2012 | tp->reordering = min_t(unsigned int, tp->reordering, | 2010 | tp->reordering = min_t(unsigned int, tp->reordering, |
| 2013 | sysctl_tcp_reordering); | 2011 | sysctl_tcp_reordering); |
| @@ -2056,7 +2054,6 @@ void tcp_enter_loss(struct sock *sk, int how) | |||
| 2056 | tp->snd_cwnd_cnt = 0; | ||
