Who: John W. Linville <linville@tuxdriver.com>
---------------------------
+
+What: rc80211-simple rate control algorithm for mac80211
+When: 2.6.26
+Files: net/mac80211/rc80211-simple.c
+Why: This algorithm was provided for reference but always exhibited bad
+ responsiveness and performance and has some serious flaws. It has been
+ replaced by rc80211-pid.
+Who: Stefano Brivio <stefano.brivio@polimi.it>
This option enables the hardware independent IEEE 802.11
networking stack.
-config MAC80211_RCSIMPLE
- bool "'simple' rate control algorithm" if EMBEDDED
+config MAC80211_RC_DEFAULT_CHOICE
+ bool "Choose default rate control algorithm" if EMBEDDED
default y
depends on MAC80211
- help
- This option allows you to turn off the 'simple' rate
- control algorithm in mac80211. If you do turn it off,
- you absolutely need another rate control algorithm.
+ ---help---
+ This options enables selection of a default rate control
+ algorithm to be built into the mac80211 module. Alternate
+ rate control algorithms might be built into the mac80211
+ module as well.
+
+choice
+ prompt "Default rate control algorithm"
+ default MAC80211_RC_DEFAULT_PID
+ depends on MAC80211 && MAC80211_RC_DEFAULT_CHOICE
+ ---help---
+ This option selects the default rate control algorithm
+ mac80211 will use. Note that this default can still be
+ overriden through the ieee80211_default_rc_algo module
+ parameter.
+
+config MAC80211_RC_DEFAULT_PID
+ bool "PID controller based rate control algorithm"
+ select MAC80211_RC_PID
+ ---help---
+ Select the PID controller based rate control as the
+ default rate control algorithm. You should choose
+ this unless you know what you are doing.
+
+config MAC80211_RC_DEFAULT_SIMPLE
+ bool "Simple rate control algorithm"
+ select MAC80211_RC_SIMPLE
+ ---help---
+ Select the simple rate control as the default rate
+ control algorithm. Note that this is a non-responsive,
+ dumb algorithm. You should choose the PID rate control
+ instead.
+
+endchoice
- Say Y unless you know you will have another algorithm
- available.
+config MAC80211_RC_DEFAULT
+ string
+ depends on MAC80211
+ default "pid" if MAC80211_RC_DEFAULT_PID
+ default "simple" if MAC80211_RC_DEFAULT_SIMPLE
+ default ""
-config MAC80211_RCPID
- bool "'PID' rate control algorithm" if EMBEDDED
+config MAC80211_RC_PID
+ bool "PID controller based rate control algorithm"
default y
depends on MAC80211
- help
+ ---help---
This option enables a TX rate control algorithm for
mac80211 that uses a PID controller to select the TX
rate.
- Say Y unless you're sure you want to use a different
- rate control algorithm.
+ Say Y or M unless you're sure you want to use a
+ different rate control algorithm.
+
+config MAC80211_RC_SIMPLE
+ bool "Simple rate control algorithm (DEPRECATED)"
+ default n
+ depends on MAC80211
+ ---help---
+ This option enables a very simple, non-responsive TX
+ rate control algorithm. This algorithm is deprecated
+ and will be removed from the kernel in near future.
+ It has been replaced by the PID algorithm.
+
+ Say N unless you know what you are doing.
config MAC80211_LEDS
bool "Enable LED triggers"
mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o
mac80211-objs-$(CONFIG_MAC80211_DEBUGFS) += debugfs.o debugfs_sta.o debugfs_netdev.o debugfs_key.o
mac80211-objs-$(CONFIG_NET_SCHED) += wme.o
-mac80211-objs-$(CONFIG_MAC80211_RCSIMPLE) += rc80211_simple.o
-mac80211-objs-$(CONFIG_MAC80211_RCPID) += rc80211_pid.o
+mac80211-objs-$(CONFIG_MAC80211_RC_SIMPLE) += rc80211_simple.o
+mac80211-objs-$(CONFIG_MAC80211_RC_PID) += rc80211_pid.o
mac80211-objs := \
ieee80211.o \
BUILD_BUG_ON(sizeof(struct ieee80211_tx_packet_data) > sizeof(skb->cb));
-#ifdef CONFIG_MAC80211_RCSIMPLE
+#ifdef CONFIG_MAC80211_RC_SIMPLE
ret = ieee80211_rate_control_register(&mac80211_rcsimple);
if (ret)
goto fail;
#endif
-#ifdef CONFIG_MAC80211_RCPID
+#ifdef CONFIG_MAC80211_RC_PID
ret = ieee80211_rate_control_register(&mac80211_rcpid);
if (ret)
goto fail;
fail:
-#ifdef CONFIG_MAC80211_RCSIMPLE
+#ifdef CONFIG_MAC80211_RC_SIMPLE
ieee80211_rate_control_unregister(&mac80211_rcsimple);
#endif
-#ifdef CONFIG_MAC80211_RCPID
+#ifdef CONFIG_MAC80211_RC_PID
ieee80211_rate_control_unregister(&mac80211_rcpid);
#endif
static void __exit ieee80211_exit(void)
{
-#ifdef CONFIG_MAC80211_RCSIMPLE
+#ifdef CONFIG_MAC80211_RC_SIMPLE
ieee80211_rate_control_unregister(&mac80211_rcsimple);
#endif
-#ifdef CONFIG_MAC80211_RCPID
+#ifdef CONFIG_MAC80211_RC_PID
ieee80211_rate_control_unregister(&mac80211_rcpid);
#endif
static LIST_HEAD(rate_ctrl_algs);
static DEFINE_MUTEX(rate_ctrl_mutex);
+static char *ieee80211_default_rc_algo = CONFIG_MAC80211_RC_DEFAULT;
+module_param(ieee80211_default_rc_algo, charp, 0644);
+MODULE_PARM_DESC(ieee80211_default_rc_algo,
+ "Default rate control algorithm for mac80211 to use");
+
int ieee80211_rate_control_register(struct rate_control_ops *ops)
{
struct rate_control_alg *alg;
return ops;
}
-/* Get the rate control algorithm. If `name' is NULL, get the first
- * available algorithm. */
+/* Get the rate control algorithm. */
static struct rate_control_ops *
ieee80211_rate_control_ops_get(const char *name)
{
struct rate_control_ops *ops;
+ const char *alg_name;
if (!name)
- name = "simple";
+ alg_name = ieee80211_default_rc_algo;
+ else
+ alg_name = name;
- ops = ieee80211_try_rate_control_ops_get(name);
+ ops = ieee80211_try_rate_control_ops_get(alg_name);
if (!ops) {
- request_module("rc80211_%s", name);
- ops = ieee80211_try_rate_control_ops_get(name);
+ request_module("rc80211_%s", alg_name);
+ ops = ieee80211_try_rate_control_ops_get(alg_name);
}
+ if (!ops && name)
+ /* try default if specific alg requested but not found */
+ ops = ieee80211_try_rate_control_ops_get(ieee80211_default_rc_algo);
+
return ops;
}
local->rate_ctrl = NULL;
rate_control_put(ref);
}
+