tcp: remove Appropriate Byte Count support
authorStephen Hemminger <stephen@networkplumber.org>
Tue, 5 Feb 2013 07:25:17 +0000 (07:25 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 5 Feb 2013 19:51:16 +0000 (14:51 -0500)
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>
Documentation/networking/ip-sysctl.txt
include/linux/tcp.h
include/net/tcp.h
kernel/sysctl_binary.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp.c
net/ipv4/tcp_cong.c
net/ipv4/tcp_input.c
net/ipv4/tcp_minisocks.c

index 19ac1802bfd4d04a456b6934322d75b89cd1ea17..dc2dc87d2557b4fdf7537b9e8f4185965c3dd1ce 100644 (file)
@@ -130,17 +130,6 @@ somaxconn - INTEGER
        Defaults to 128.  See also tcp_max_syn_backlog for additional tuning
        for TCP sockets.
 
-tcp_abc - INTEGER
-       Controls Appropriate Byte Count (ABC) defined in RFC3465.
-       ABC is a way of increasing congestion window (cwnd) more slowly
-       in response to partial acknowledgments.
-       Possible values are:
-               0 increase cwnd once per acknowledgment (no ABC)
-               1 increase cwnd once per acknowledgment of full sized segment
-               2 allow increase cwnd by two if acknowledgment is
-                 of two segments to compensate for delayed acknowledgments.
-       Default: 0 (off)
-
 tcp_abort_on_overflow - BOOLEAN
        If listening service is too slow to accept new connections,
        reset them. Default state is FALSE. It means that if overflow
index 4e1d2283e3ccfda3f754229d7272e540c086d139..6d0d46138ae8f2e8e91faee4ba265153a52b8a22 100644 (file)
@@ -246,7 +246,6 @@ struct tcp_sock {
        u32     sacked_out;     /* SACK'd packets                       */
        u32     fackets_out;    /* FACK'd packets                       */
        u32     tso_deferred;
-       u32     bytes_acked;    /* Appropriate Byte Counting - RFC3465 */
 
        /* from STCP, retrans queue hinting */
        struct sk_buff* lost_skb_hint;
index 614af8b7758e4ac31b4deec6134a9a95759a6533..23f2e98d4b654dbd497def51219cbe0806c23cb8 100644 (file)
@@ -279,7 +279,6 @@ extern int sysctl_tcp_dma_copybreak;
 extern int sysctl_tcp_nometrics_save;
 extern int sysctl_tcp_moderate_rcvbuf;
 extern int sysctl_tcp_tso_win_divisor;
-extern int sysctl_tcp_abc;
 extern int sysctl_tcp_mtu_probing;
 extern int sysctl_tcp_base_mss;
 extern int sysctl_tcp_workaround_signed_windows;
index 5a63844505015668ce88ec649f5586badf49dbbd..b669ca1fa1038a418f05713718f5e9874bdc6b7d 100644 (file)
@@ -387,7 +387,6 @@ static const struct bin_table bin_net_ipv4_table[] = {
        { CTL_INT,      NET_TCP_MODERATE_RCVBUF,                "tcp_moderate_rcvbuf" },
        { CTL_INT,      NET_TCP_TSO_WIN_DIVISOR,                "tcp_tso_win_divisor" },
        { CTL_STR,      NET_TCP_CONG_CONTROL,                   "tcp_congestion_control" },
-       { CTL_INT,      NET_TCP_ABC,                            "tcp_abc" },
        { CTL_INT,      NET_TCP_MTU_PROBING,                    "tcp_mtu_probing" },
        { CTL_INT,      NET_TCP_BASE_MSS,                       "tcp_base_mss" },
        { CTL_INT,      NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS, "tcp_workaround_signed_windows" },
index 2622707602d1276649a6d8514dba66b2290fd549..960fd29d9b8e067e12f89a6dfdcb3fa7873ea468 100644 (file)
@@ -632,13 +632,6 @@ static struct ctl_table ipv4_table[] = {
                .maxlen         = TCP_CA_NAME_MAX,
                .proc_handler   = proc_tcp_congestion_control,
        },
-       {
-               .procname       = "tcp_abc",
-               .data           = &sysctl_tcp_abc,
-               .maxlen         = sizeof(int),
-               .mode           = 0644,
-               .proc_handler   = proc_dointvec,
-       },
        {
                .procname       = "tcp_mtu_probing",
                .data           = &sysctl_tcp_mtu_probing,
index 3ec1f69c5ceb2ed0670c242c7eab2c0ac579c285..2c7e5963c2eafcc4ccaf4680cbfbcb3e5405c31d 100644 (file)
@@ -2289,7 +2289,6 @@ int tcp_disconnect(struct sock *sk, int flags)
        tp->packets_out = 0;
        tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
        tp->snd_cwnd_cnt = 0;
-       tp->bytes_acked = 0;
        tp->window_clamp = 0;
        tcp_set_ca_state(sk, TCP_CA_Open);
        tcp_clear_retrans(tp);
index cdf2e707bb100500511d6b2d46ece69e19163cfa..019c2389a341f6254185c8b9169d9b09c8c16c78 100644 (file)
@@ -317,28 +317,11 @@ void tcp_slow_start(struct tcp_sock *tp)
                snd_cwnd = 1U;
        }
 
-       /* RFC3465: ABC Slow start
-        * Increase only after a full MSS of bytes is acked
-        *
-        * TCP sender SHOULD increase cwnd by the number of
-        * previously unacknowledged bytes ACKed by each incoming
-        * acknowledgment, provided the increase is not more than L
-        */
-       if (sysctl_tcp_abc && tp->bytes_acked < tp->mss_cache)
-               return;
-
        if (sysctl_tcp_max_ssthresh > 0 && tp->snd_cwnd > sysctl_tcp_max_ssthresh)
                cnt = sysctl_tcp_max_ssthresh >> 1;     /* limited slow start */
        else
                cnt = snd_cwnd;                         /* exponential increase */
 
-       /* RFC3465: ABC
-        * We MAY increase by 2 if discovered delayed ack
-        */
-       if (sysctl_tcp_abc > 1 && tp->bytes_acked >= 2*tp->mss_cache)
-               cnt <<= 1;
-       tp->bytes_acked = 0;
-
        tp->snd_cwnd_cnt += cnt;
        while (tp->snd_cwnd_cnt >= snd_cwnd) {
                tp->snd_cwnd_cnt -= snd_cwnd;
@@ -378,20 +361,9 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 in_flight)
        /* In "safe" area, increase. */
        if (tp->snd_cwnd <= tp->snd_ssthresh)
                tcp_slow_start(tp);
-
        /* In dangerous area, increase slowly. */
-       else if (sysctl_tcp_abc) {
-               /* RFC3465: Appropriate Byte Count
-                * increase once for each full cwnd acked
-                */
-               if (tp->bytes_acked >= tp->snd_cwnd*tp->mss_cache) {
-                       tp->bytes_acked -= tp->snd_cwnd*tp->mss_cache;
-                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
-                               tp->snd_cwnd++;
-               }
-       } else {
+       else
                tcp_cong_avoid_ai(tp, tp->snd_cwnd);
-       }
 }
 EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid);
 
index e376aa9591bc6cf436ab267ab3bd3a3e105c9067..f56bd1082f54c673771d83e4649aac64beb42f10 100644 (file)
@@ -98,7 +98,6 @@ int sysctl_tcp_frto_response __read_mostly;
 int sysctl_tcp_thin_dupack __read_mostly;
 
 int sysctl_tcp_moderate_rcvbuf __read_mostly = 1;
-int sysctl_tcp_abc __read_mostly;
 int sysctl_tcp_early_retrans __read_mostly = 2;
 
 #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)
        tp->snd_cwnd_cnt = 0;
        tp->snd_cwnd_stamp = tcp_time_stamp;
        tp->frto_counter = 0;
-       tp->bytes_acked = 0;
 
        tp->reordering = min_t(unsigned int, tp->reordering,
                               sysctl_tcp_reordering);
@@ -2056,7 +2054,6 @@ void tcp_enter_loss(struct sock *sk, int how)
        tp->snd_cwnd_cnt   = 0;
        tp->snd_cwnd_stamp = tcp_time_stamp;
 
-       tp->bytes_acked = 0;
        tcp_clear_retrans_partial(tp);
 
        if (tcp_is_reno(tp))
@@ -2684,7 +2681,6 @@ static void tcp_init_cwnd_reduction(struct sock *sk, const bool set_ssthresh)
        struct tcp_sock *tp = tcp_sk(sk);
 
        tp->high_seq = tp->snd_nxt;
-       tp->bytes_acked = 0;
        tp->snd_cwnd_cnt = 0;
        tp->prior_cwnd = tp->snd_cwnd;
        tp->prr_delivered = 0;
@@ -2735,7 +2731,6 @@ void tcp_enter_cwr(struct sock *sk, const int set_ssthresh)
        struct tcp_sock *tp = tcp_sk(sk);
 
        tp->prior_ssthresh = 0;
-       tp->bytes_acked = 0;
        if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) {
                tp->undo_marker = 0;
                tcp_init_cwnd_reduction(sk, set_ssthresh);
@@ -3417,7 +3412,6 @@ static void tcp_conservative_spur_to_response(struct tcp_sock *tp)
 {
        tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh);
        tp->snd_cwnd_cnt = 0;
-       tp->bytes_acked = 0;
        TCP_ECN_queue_cwr(tp);
        tcp_moderate_cwnd(tp);
 }
@@ -3609,15 +3603,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
        if (after(ack, prior_snd_una))
                flag |= FLAG_SND_UNA_ADVANCED;
 
-       if (sysctl_tcp_abc) {
-               if (icsk->icsk_ca_state < TCP_CA_CWR)
-                       tp->bytes_acked += ack - prior_snd_una;
-               else if (icsk->icsk_ca_state == TCP_CA_Loss)
-                       /* we assume just one segment left network */
-                       tp->bytes_acked += min(ack - prior_snd_una,
-                                              tp->mss_cache);
-       }
-
        prior_fackets = tp->fackets_out;
        prior_in_flight = tcp_packets_in_flight(tp);
 
index f35f2dfb64017cc3fedd3cd29d0682c14dcaf5ba..f0409287b5f4dbf59462b01be65e8d31da46644f 100644 (file)
@@ -446,7 +446,6 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
                 */
                newtp->snd_cwnd = TCP_INIT_CWND;
                newtp->snd_cwnd_cnt = 0;
-               newtp->bytes_acked = 0;
 
                newtp->frto_counter = 0;
                newtp->frto_highmark = 0;