]> err.no Git - linux-2.6/blobdiff - net/ipv4/tcp_cong.c
[IPV4]: Convert ipv4 route to use the new dst_entry 'next' pointer
[linux-2.6] / net / ipv4 / tcp_cong.c
index 343d6197c92e95f0660cfc6853bda4e58435bc7a..c1b34f1edb32740fa38dc724f6792f5998118a54 100644 (file)
@@ -113,7 +113,7 @@ int tcp_set_default_congestion_control(const char *name)
        spin_lock(&tcp_cong_list_lock);
        ca = tcp_ca_find(name);
 #ifdef CONFIG_KMOD
-       if (!ca) {
+       if (!ca && capable(CAP_SYS_MODULE)) {
                spin_unlock(&tcp_cong_list_lock);
 
                request_module("tcp_%s", name);
@@ -236,9 +236,19 @@ int tcp_set_congestion_control(struct sock *sk, const char *name)
 
        rcu_read_lock();
        ca = tcp_ca_find(name);
+       /* no change asking for existing value */
        if (ca == icsk->icsk_ca_ops)
                goto out;
 
+#ifdef CONFIG_KMOD
+       /* not found attempt to autoload module */
+       if (!ca && capable(CAP_SYS_MODULE)) {
+               rcu_read_unlock();
+               request_module("tcp_%s", name);
+               rcu_read_lock();
+               ca = tcp_ca_find(name);
+       }
+#endif
        if (!ca)
                err = -ENOENT;
 
@@ -303,28 +313,28 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 rtt, u32 in_flight,
                return;
 
        /* In "safe" area, increase. */
-        if (tp->snd_cwnd <= tp->snd_ssthresh)
+       if (tp->snd_cwnd <= tp->snd_ssthresh)
                tcp_slow_start(tp);
 
-       /* In dangerous area, increase slowly. */
+       /* 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 {
-               /* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd */
-               if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
-                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
-                               tp->snd_cwnd++;
-                       tp->snd_cwnd_cnt = 0;
-               } else
-                       tp->snd_cwnd_cnt++;
-       }
+               /* 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 {
+               /* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd */
+               if (tp->snd_cwnd_cnt >= tp->snd_cwnd) {
+                       if (tp->snd_cwnd < tp->snd_cwnd_clamp)
+                               tp->snd_cwnd++;
+                       tp->snd_cwnd_cnt = 0;
+               } else
+                       tp->snd_cwnd_cnt++;
+       }
 }
 EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid);