ChangeSet 1.1537.1.43, 2005/02/21 17:54:02-08:00, [EMAIL PROTECTED]

        [TCP]: Fix BIC max_cwnd calculation error.
        
        The BIC TCP cwnd problem as identified by Yee-Ting Li and Doug Leith
        is that the computation is recalc_ssthresh is incorrect and
        BICTCP_1_OVER_BETA/2 should be BICTCP_1_OVER_BETA*2.
        
        My fix is to implement the code from BIC TCP 1.1 which uses a sysctl
        to set the beta.  There are a few variable name changes from the 1.1
        code, and made the scaling factor a #define instead of hardcoded.
        
        I validated this using netem and kprobes, for more details see
        http://developer.osdl.org/shemminger/bic-beta-patch.pdf
        
        Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>
        Signed-off-by: David S. Miller <[EMAIL PROTECTED]>



 include/linux/sysctl.h     |    1 +
 include/net/tcp.h          |   17 +++++++++--------
 net/ipv4/sysctl_net_ipv4.c |    3 +++
 net/ipv4/tcp_input.c       |    1 +
 4 files changed, 14 insertions(+), 8 deletions(-)


diff -Nru a/include/linux/sysctl.h b/include/linux/sysctl.h
--- a/include/linux/sysctl.h    2005-02-23 10:06:39 -08:00
+++ b/include/linux/sysctl.h    2005-02-23 10:06:39 -08:00
@@ -326,6 +326,7 @@
        NET_TCP_BIC_LOW_WINDOW=104,
        NET_TCP_DEFAULT_WIN_SCALE=105,
        NET_TCP_MODERATE_RCVBUF=106,
+       NET_TCP_BIC_BETA=108,
 };
 
 enum {
diff -Nru a/include/net/tcp.h b/include/net/tcp.h
--- a/include/net/tcp.h 2005-02-23 10:06:39 -08:00
+++ b/include/net/tcp.h 2005-02-23 10:06:39 -08:00
@@ -395,9 +395,8 @@
 # define TCP_TW_RECYCLE_TICK (12+2-TCP_TW_RECYCLE_SLOTS_LOG)
 #endif
 
-#define BICTCP_1_OVER_BETA     8       /*
-                                        * Fast recovery
-                                        * multiplicative decrease factor
+#define BICTCP_BETA_SCALE    1024      /* Scale factor beta calculation
+                                        * max_cwnd = snd_cwnd * beta
                                         */
 #define BICTCP_MAX_INCREMENT 32                /*
                                         * Limit on the amount of
@@ -491,6 +490,7 @@
 extern int sysctl_tcp_bic;
 extern int sysctl_tcp_bic_fast_convergence;
 extern int sysctl_tcp_bic_low_window;
+extern int sysctl_tcp_bic_beta;
 extern int sysctl_tcp_default_win_scale;
 extern int sysctl_tcp_moderate_rcvbuf;
 
@@ -1132,15 +1132,16 @@
        if (tcp_is_bic(tp)) {
                if (sysctl_tcp_bic_fast_convergence &&
                    tp->snd_cwnd < tp->bictcp.last_max_cwnd)
-                       tp->bictcp.last_max_cwnd
-                               = (tp->snd_cwnd * (2*BICTCP_1_OVER_BETA-1))
-                               / (BICTCP_1_OVER_BETA/2);
+                       tp->bictcp.last_max_cwnd = (tp->snd_cwnd * 
+                                                   (BICTCP_BETA_SCALE
+                                                    + sysctl_tcp_bic_beta))
+                               / (2 * BICTCP_BETA_SCALE);
                else
                        tp->bictcp.last_max_cwnd = tp->snd_cwnd;
 
                if (tp->snd_cwnd > sysctl_tcp_bic_low_window)
-                       return max(tp->snd_cwnd - 
(tp->snd_cwnd/BICTCP_1_OVER_BETA),
-                                  2U);
+                       return max((tp->snd_cwnd * sysctl_tcp_bic_beta)
+                                  / BICTCP_BETA_SCALE, 2U);
        }
 
        return max(tp->snd_cwnd >> 1U, 2U);
diff -Nru a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
--- a/net/ipv4/sysctl_net_ipv4.c        2005-02-23 10:06:39 -08:00
+++ b/net/ipv4/sysctl_net_ipv4.c        2005-02-23 10:06:39 -08:00
@@ -268,6 +268,9 @@
        {NET_TCP_MODERATE_RCVBUF, "tcp_moderate_rcvbuf",
         &sysctl_tcp_moderate_rcvbuf, sizeof(int), 0644, NULL,
         &proc_dointvec},
+       {NET_TCP_BIC_BETA, "tcp_bic_beta",
+        &sysctl_tcp_bic_beta, sizeof(int), 0644, NULL,
+        &proc_dointvec},
        {0}
 };
 
diff -Nru a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
--- a/net/ipv4/tcp_input.c      2005-02-23 10:06:39 -08:00
+++ b/net/ipv4/tcp_input.c      2005-02-23 10:06:39 -08:00
@@ -107,6 +107,7 @@
 int sysctl_tcp_bic;
 int sysctl_tcp_bic_fast_convergence = 1;
 int sysctl_tcp_bic_low_window = 14;
+int sysctl_tcp_bic_beta = 819;         /* = 819/1024 (BICTCP_BETA_SCALE) */
 
 #define FLAG_DATA              0x01 /* Incoming frame contained data.          
*/
 #define FLAG_WIN_UPDATE                0x02 /* Incoming ACK was a window 
update.       */
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-24" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to