[TCP]: Allow autoloading of congestion control via setsockopt.

If user has permision to load modules, then autoload then attempt
autoload of TCP congestion module.

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Stephen Hemminger 2006-11-09 16:36:36 -08:00 committed by David S. Miller
parent ce7bc3bf15
commit 35bfbc9407

View file

@ -113,7 +113,7 @@ int tcp_set_default_congestion_control(const char *name)
spin_lock(&tcp_cong_list_lock); spin_lock(&tcp_cong_list_lock);
ca = tcp_ca_find(name); ca = tcp_ca_find(name);
#ifdef CONFIG_KMOD #ifdef CONFIG_KMOD
if (!ca) { if (!ca && capable(CAP_SYS_MODULE)) {
spin_unlock(&tcp_cong_list_lock); spin_unlock(&tcp_cong_list_lock);
request_module("tcp_%s", name); request_module("tcp_%s", name);
@ -236,9 +236,19 @@ int tcp_set_congestion_control(struct sock *sk, const char *name)
rcu_read_lock(); rcu_read_lock();
ca = tcp_ca_find(name); ca = tcp_ca_find(name);
/* no change asking for existing value */
if (ca == icsk->icsk_ca_ops) if (ca == icsk->icsk_ca_ops)
goto out; 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) if (!ca)
err = -ENOENT; err = -ENOENT;