diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-01-02 09:17:03 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 18:01:02 -0500 |
commit | 4b475898ec9dc6e62cebcb8fc0b3495c986a4590 (patch) | |
tree | 8409a6865f3d83965228fd8f6fae3b05e1e106ed /net/mac80211 | |
parent | 688b88a4886834d7e3457711cd4feef6611d3232 (diff) |
mac80211: better rate control algorithm selection
This patch changes mac80211's Kconfig/Makefile to:
* select between the PID and the SIMPLE rate control
algorithm as default
* always allow tri-state for the rate control algorithms,
building those that are selected 'y' into the mac80211
module (if that is a module, otherwise all into the kernel)
* force the default rate control algorithm to be built into
mac80211
It also makes both rate control algorithms proper modules again
with MODULE_LICENSE etc.
Only if EMBEDDED is the user allowed to select "NONE" as default
which will cause no algorithm to be selected, this will work
only when the driver brings one itself (e.g. iwlwifi drivers).
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/Kconfig | 37 | ||||
-rw-r--r-- | net/mac80211/Makefile | 41 | ||||
-rw-r--r-- | net/mac80211/ieee80211.c | 34 | ||||
-rw-r--r-- | net/mac80211/ieee80211_rate.c | 4 | ||||
-rw-r--r-- | net/mac80211/ieee80211_rate.h | 38 | ||||
-rw-r--r-- | net/mac80211/rc80211_pid_algo.c | 24 | ||||
-rw-r--r-- | net/mac80211/rc80211_simple.c | 21 |
7 files changed, 134 insertions, 65 deletions
diff --git a/net/mac80211/Kconfig b/net/mac80211/Kconfig index cac6cf2e9ac8..09c255002e56 100644 --- a/net/mac80211/Kconfig +++ b/net/mac80211/Kconfig | |||
@@ -13,25 +13,17 @@ config MAC80211 | |||
13 | This option enables the hardware independent IEEE 802.11 | 13 | This option enables the hardware independent IEEE 802.11 |
14 | networking stack. | 14 | networking stack. |
15 | 15 | ||
16 | config MAC80211_RC_DEFAULT_CHOICE | 16 | menu "Rate control algorithm selection" |
17 | bool "Choose default rate control algorithm" if EMBEDDED | 17 | depends on MAC80211 != n |
18 | default y | ||
19 | depends on MAC80211 | ||
20 | ---help--- | ||
21 | This options enables selection of a default rate control | ||
22 | algorithm to be built into the mac80211 module. Alternate | ||
23 | rate control algorithms might be built into the mac80211 | ||
24 | module as well. | ||
25 | 18 | ||
26 | choice | 19 | choice |
27 | prompt "Default rate control algorithm" | 20 | prompt "Default rate control algorithm" |
28 | default MAC80211_RC_DEFAULT_PID | 21 | default MAC80211_RC_DEFAULT_PID |
29 | depends on MAC80211 && MAC80211_RC_DEFAULT_CHOICE | ||
30 | ---help--- | 22 | ---help--- |
31 | This option selects the default rate control algorithm | 23 | This option selects the default rate control algorithm |
32 | mac80211 will use. Note that this default can still be | 24 | mac80211 will use. Note that this default can still be |
33 | overriden through the ieee80211_default_rc_algo module | 25 | overriden through the ieee80211_default_rc_algo module |
34 | parameter. | 26 | parameter if different algorithms are available. |
35 | 27 | ||
36 | config MAC80211_RC_DEFAULT_PID | 28 | config MAC80211_RC_DEFAULT_PID |
37 | bool "PID controller based rate control algorithm" | 29 | bool "PID controller based rate control algorithm" |
@@ -50,19 +42,27 @@ config MAC80211_RC_DEFAULT_SIMPLE | |||
50 | dumb algorithm. You should choose the PID rate control | 42 | dumb algorithm. You should choose the PID rate control |
51 | instead. | 43 | instead. |
52 | 44 | ||
45 | config MAC80211_RC_DEFAULT_NONE | ||
46 | bool "No default algorithm" | ||
47 | depends on EMBEDDED | ||
48 | help | ||
49 | Selecting this option will select no default algorithm | ||
50 | and allow you to not build any. Do not choose this | ||
51 | option unless you know your driver comes with another | ||
52 | suitable algorithm. | ||
53 | endchoice | 53 | endchoice |
54 | 54 | ||
55 | comment "Selecting 'y' for an algorithm will" | ||
56 | comment "build the algorithm into mac80211." | ||
57 | |||
55 | config MAC80211_RC_DEFAULT | 58 | config MAC80211_RC_DEFAULT |
56 | string | 59 | string |
57 | depends on MAC80211 | ||
58 | default "pid" if MAC80211_RC_DEFAULT_PID | 60 | default "pid" if MAC80211_RC_DEFAULT_PID |
59 | default "simple" if MAC80211_RC_DEFAULT_SIMPLE | 61 | default "simple" if MAC80211_RC_DEFAULT_SIMPLE |
60 | default "" | 62 | default "" |
61 | 63 | ||
62 | config MAC80211_RC_PID | 64 | config MAC80211_RC_PID |
63 | bool "PID controller based rate control algorithm" | 65 | tristate "PID controller based rate control algorithm" |
64 | default y | ||
65 | depends on MAC80211 | ||
66 | ---help--- | 66 | ---help--- |
67 | This option enables a TX rate control algorithm for | 67 | This option enables a TX rate control algorithm for |
68 | mac80211 that uses a PID controller to select the TX | 68 | mac80211 that uses a PID controller to select the TX |
@@ -72,16 +72,15 @@ config MAC80211_RC_PID | |||
72 | different rate control algorithm. | 72 | different rate control algorithm. |
73 | 73 | ||
74 | config MAC80211_RC_SIMPLE | 74 | config MAC80211_RC_SIMPLE |
75 | bool "Simple rate control algorithm (DEPRECATED)" | 75 | tristate "Simple rate control algorithm (DEPRECATED)" |
76 | default n | ||
77 | depends on MAC80211 | ||
78 | ---help--- | 76 | ---help--- |
79 | This option enables a very simple, non-responsive TX | 77 | This option enables a very simple, non-responsive TX |
80 | rate control algorithm. This algorithm is deprecated | 78 | rate control algorithm. This algorithm is deprecated |
81 | and will be removed from the kernel in near future. | 79 | and will be removed from the kernel in the near future. |
82 | It has been replaced by the PID algorithm. | 80 | It has been replaced by the PID algorithm. |
83 | 81 | ||
84 | Say N unless you know what you are doing. | 82 | Say N unless you know what you are doing. |
83 | endmenu | ||
85 | 84 | ||
86 | config MAC80211_LEDS | 85 | config MAC80211_LEDS |
87 | bool "Enable LED triggers" | 86 | bool "Enable LED triggers" |
diff --git a/net/mac80211/Makefile b/net/mac80211/Makefile index 06aea8009cd4..54f46bc80cfe 100644 --- a/net/mac80211/Makefile +++ b/net/mac80211/Makefile | |||
@@ -1,19 +1,15 @@ | |||
1 | obj-$(CONFIG_MAC80211) += mac80211.o | 1 | obj-$(CONFIG_MAC80211) += mac80211.o |
2 | 2 | ||
3 | mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o | 3 | # objects for PID algorithm |
4 | mac80211-objs-$(CONFIG_NET_SCHED) += wme.o | 4 | rc80211_pid-y := rc80211_pid_algo.o |
5 | mac80211-objs-$(CONFIG_MAC80211_RC_SIMPLE) += rc80211_simple.o | 5 | rc80211_pid-$(CONFIG_MAC80211_DEBUGFS) += rc80211_pid_debugfs.o |
6 | mac80211-objs-$(CONFIG_MAC80211_RC_PID) += rc80211_pid_algo.o | ||
7 | 6 | ||
8 | mac80211-debugfs-objs-$(CONFIG_MAC80211_RC_PID) += rc80211_pid_debugfs.o | 7 | # build helper for PID algorithm |
9 | mac80211-objs-$(CONFIG_MAC80211_DEBUGFS) += \ | 8 | rc-pid-y := $(rc80211_pid-y) |
10 | debugfs.o \ | 9 | rc-pid-m := rc80211_pid.o |
11 | debugfs_sta.o \ | ||
12 | debugfs_netdev.o \ | ||
13 | debugfs_key.o \ | ||
14 | $(mac80211-debugfs-objs-y) | ||
15 | 10 | ||
16 | mac80211-objs := \ | 11 | # mac80211 objects |
12 | mac80211-y := \ | ||
17 | ieee80211.o \ | 13 | ieee80211.o \ |
18 | ieee80211_ioctl.o \ | 14 | ieee80211_ioctl.o \ |
19 | sta_info.o \ | 15 | sta_info.o \ |
@@ -31,5 +27,22 @@ mac80211-objs := \ | |||
31 | tx.o \ | 27 | tx.o \ |
32 | key.o \ | 28 | key.o \ |
33 | util.o \ | 29 | util.o \ |
34 | event.o \ | 30 | event.o |
35 | $(mac80211-objs-y) | 31 | |
32 | mac80211-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o | ||
33 | mac80211-$(CONFIG_NET_SCHED) += wme.o | ||
34 | mac80211-$(CONFIG_MAC80211_DEBUGFS) += \ | ||
35 | debugfs.o \ | ||
36 | debugfs_sta.o \ | ||
37 | debugfs_netdev.o \ | ||
38 | debugfs_key.o | ||
39 | |||
40 | |||
41 | # Build rate control algorithm(s) | ||
42 | CFLAGS_rc80211_simple.o += -DRC80211_SIMPLE_COMPILE | ||
43 | CFLAGS_rc80211_pid_algo.o += -DRC80211_PID_COMPILE | ||
44 | mac80211-$(CONFIG_MAC80211_RC_SIMPLE) += rc80211_simple.o | ||
45 | mac80211-$(CONFIG_MAC80211_RC_PID) += $(rc-pid-$(CONFIG_MAC80211_RC_PID)) | ||
46 | |||
47 | # Modular rate algorithms are assigned to mac80211-m - make separate modules | ||
48 | obj-m += $(mac80211-m) | ||
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index 2011c726f2b1..8ba69ae676ca 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -1323,23 +1323,19 @@ static int __init ieee80211_init(void) | |||
1323 | 1323 | ||
1324 | BUILD_BUG_ON(sizeof(struct ieee80211_tx_packet_data) > sizeof(skb->cb)); | 1324 | BUILD_BUG_ON(sizeof(struct ieee80211_tx_packet_data) > sizeof(skb->cb)); |
1325 | 1325 | ||
1326 | #ifdef CONFIG_MAC80211_RC_SIMPLE | 1326 | ret = rc80211_simple_init(); |
1327 | ret = ieee80211_rate_control_register(&mac80211_rcsimple); | ||
1328 | if (ret) | 1327 | if (ret) |
1329 | goto fail; | 1328 | goto fail; |
1330 | #endif | ||
1331 | 1329 | ||
1332 | #ifdef CONFIG_MAC80211_RC_PID | 1330 | ret = rc80211_pid_init(); |
1333 | ret = ieee80211_rate_control_register(&mac80211_rcpid); | ||
1334 | if (ret) | 1331 | if (ret) |
1335 | goto fail; | 1332 | goto fail_simple; |
1336 | #endif | ||
1337 | 1333 | ||
1338 | ret = ieee80211_wme_register(); | 1334 | ret = ieee80211_wme_register(); |
1339 | if (ret) { | 1335 | if (ret) { |
1340 | printk(KERN_DEBUG "ieee80211_init: failed to " | 1336 | printk(KERN_DEBUG "ieee80211_init: failed to " |
1341 | "initialize WME (err=%d)\n", ret); | 1337 | "initialize WME (err=%d)\n", ret); |
1342 | goto fail; | 1338 | goto fail_pid; |
1343 | } | 1339 | } |
1344 | 1340 | ||
1345 | ieee80211_debugfs_netdev_init(); | 1341 | ieee80211_debugfs_netdev_init(); |
@@ -1347,26 +1343,18 @@ static int __init ieee80211_init(void) | |||
1347 | 1343 | ||
1348 | return 0; | 1344 | return 0; |
1349 | 1345 | ||
1350 | fail: | 1346 | fail_pid: |
1351 | 1347 | rc80211_simple_exit(); | |
1352 | #ifdef CONFIG_MAC80211_RC_SIMPLE | 1348 | fail_simple: |
1353 | ieee80211_rate_control_unregister(&mac80211_rcsimple); | 1349 | rc80211_pid_exit(); |
1354 | #endif | 1350 | fail: |
1355 | #ifdef CONFIG_MAC80211_RC_PID | ||
1356 | ieee80211_rate_control_unregister(&mac80211_rcpid); | ||
1357 | #endif | ||
1358 | |||
1359 | return ret; | 1351 | return ret; |
1360 | } | 1352 | } |
1361 | 1353 | ||
1362 | static void __exit ieee80211_exit(void) | 1354 | static void __exit ieee80211_exit(void) |
1363 | { | 1355 | { |
1364 | #ifdef CONFIG_MAC80211_RC_SIMPLE | 1356 | rc80211_simple_exit(); |
1365 | ieee80211_rate_control_unregister(&mac80211_rcsimple); | 1357 | rc80211_pid_exit(); |
1366 | #endif | ||
1367 | #ifdef CONFIG_MAC80211_RC_PID | ||
1368 | ieee80211_rate_control_unregister(&mac80211_rcpid); | ||
1369 | #endif | ||
1370 | 1358 | ||
1371 | ieee80211_wme_unregister(); | 1359 | ieee80211_wme_unregister(); |
1372 | ieee80211_debugfs_netdev_exit(); | 1360 | ieee80211_debugfs_netdev_exit(); |
diff --git a/net/mac80211/ieee80211_rate.c b/net/mac80211/ieee80211_rate.c index 65fc9ad615e9..5676a26a7c75 100644 --- a/net/mac80211/ieee80211_rate.c +++ b/net/mac80211/ieee80211_rate.c | |||
@@ -115,6 +115,10 @@ ieee80211_rate_control_ops_get(const char *name) | |||
115 | /* try default if specific alg requested but not found */ | 115 | /* try default if specific alg requested but not found */ |
116 | ops = ieee80211_try_rate_control_ops_get(ieee80211_default_rc_algo); | 116 | ops = ieee80211_try_rate_control_ops_get(ieee80211_default_rc_algo); |
117 | 117 | ||
118 | /* try built-in one if specific alg requested but not found */ | ||
119 | if (!ops && strlen(CONFIG_MAC80211_RC_DEFAULT)) | ||
120 | ops = ieee80211_try_rate_control_ops_get(CONFIG_MAC80211_RC_DEFAULT); | ||
121 | |||
118 | return ops; | 122 | return ops; |
119 | } | 123 | } |
120 | 124 | ||
diff --git a/net/mac80211/ieee80211_rate.h b/net/mac80211/ieee80211_rate.h index 3eb0696f3757..73f19e8aa51c 100644 --- a/net/mac80211/ieee80211_rate.h +++ b/net/mac80211/ieee80211_rate.h | |||
@@ -58,12 +58,6 @@ struct rate_control_ref { | |||
58 | struct kref kref; | 58 | struct kref kref; |
59 | }; | 59 | }; |
60 | 60 | ||
61 | /* default 'simple' algorithm */ | ||
62 | extern struct rate_control_ops mac80211_rcsimple; | ||
63 | |||
64 | /* 'PID' algorithm */ | ||
65 | extern struct rate_control_ops mac80211_rcpid; | ||
66 | |||
67 | int ieee80211_rate_control_register(struct rate_control_ops *ops); | 61 | int ieee80211_rate_control_register(struct rate_control_ops *ops); |
68 | void ieee80211_rate_control_unregister(struct rate_control_ops *ops); | 62 | void ieee80211_rate_control_unregister(struct rate_control_ops *ops); |
69 | 63 | ||
@@ -170,4 +164,36 @@ int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local, | |||
170 | const char *name); | 164 | const char *name); |
171 | void rate_control_deinitialize(struct ieee80211_local *local); | 165 | void rate_control_deinitialize(struct ieee80211_local *local); |
172 | 166 | ||
167 | |||
168 | /* Rate control algorithms */ | ||
169 | #if defined(RC80211_SIMPLE_COMPILE) || \ | ||
170 | (defined(CONFIG_MAC80211_RC_SIMPLE) && \ | ||
171 | !defined(CONFIG_MAC80211_RC_SIMPLE_MODULE)) | ||
172 | extern int rc80211_simple_init(void); | ||
173 | extern void rc80211_simple_exit(void); | ||
174 | #else | ||
175 | static inline int rc80211_simple_init(void) | ||
176 | { | ||
177 | return 0; | ||
178 | } | ||
179 | static inline void rc80211_simple_exit(void) | ||
180 | { | ||
181 | } | ||
182 | #endif | ||
183 | |||
184 | #if defined(RC80211_PID_COMPILE) || \ | ||
185 | (defined(CONFIG_MAC80211_RC_PID) && \ | ||
186 | !defined(CONFIG_MAC80211_RC_PID_MODULE)) | ||
187 | extern int rc80211_pid_init(void); | ||
188 | extern void rc80211_pid_exit(void); | ||
189 | #else | ||
190 | static inline int rc80211_pid_init(void) | ||
191 | { | ||
192 | return 0; | ||
193 | } | ||
194 | static inline void rc80211_pid_exit(void) | ||
195 | { | ||
196 | } | ||
197 | #endif | ||
198 | |||
173 | #endif /* IEEE80211_RATE_H */ | 199 | #endif /* IEEE80211_RATE_H */ |
diff --git a/net/mac80211/rc80211_pid_algo.c b/net/mac80211/rc80211_pid_algo.c index da3529017da1..0995bb9cec21 100644 --- a/net/mac80211/rc80211_pid_algo.c +++ b/net/mac80211/rc80211_pid_algo.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/netdevice.h> | 12 | #include <linux/netdevice.h> |
13 | #include <linux/types.h> | 13 | #include <linux/types.h> |
14 | #include <linux/skbuff.h> | 14 | #include <linux/skbuff.h> |
15 | 15 | #include <linux/debugfs.h> | |
16 | #include <net/mac80211.h> | 16 | #include <net/mac80211.h> |
17 | #include "ieee80211_rate.h" | 17 | #include "ieee80211_rate.h" |
18 | 18 | ||
@@ -492,7 +492,7 @@ static void rate_control_pid_free_sta(void *priv, void *priv_sta) | |||
492 | kfree(spinfo); | 492 | kfree(spinfo); |
493 | } | 493 | } |
494 | 494 | ||
495 | struct rate_control_ops mac80211_rcpid = { | 495 | static struct rate_control_ops mac80211_rcpid = { |
496 | .name = "pid", | 496 | .name = "pid", |
497 | .tx_status = rate_control_pid_tx_status, | 497 | .tx_status = rate_control_pid_tx_status, |
498 | .get_rate = rate_control_pid_get_rate, | 498 | .get_rate = rate_control_pid_get_rate, |
@@ -507,3 +507,23 @@ struct rate_control_ops mac80211_rcpid = { | |||
507 | .remove_sta_debugfs = rate_control_pid_remove_sta_debugfs, | 507 | .remove_sta_debugfs = rate_control_pid_remove_sta_debugfs, |
508 | #endif | 508 | #endif |
509 | }; | 509 | }; |
510 | |||
511 | MODULE_DESCRIPTION("PID controller based rate control algorithm"); | ||
512 | MODULE_AUTHOR("Stefano Brivio"); | ||
513 | MODULE_AUTHOR("Mattias Nissler"); | ||
514 | MODULE_LICENSE("GPL"); | ||
515 | |||
516 | int __init rc80211_pid_init(void) | ||
517 | { | ||
518 | return ieee80211_rate_control_register(&mac80211_rcpid); | ||
519 | } | ||
520 | |||
521 | void __exit rc80211_pid_exit(void) | ||
522 | { | ||
523 | ieee80211_rate_control_unregister(&mac80211_rcpid); | ||
524 | } | ||
525 | |||
526 | #ifdef CONFIG_MAC80211_RC_PID_MODULE | ||
527 | module_init(rc80211_pid_init); | ||
528 | module_exit(rc80211_pid_exit); | ||
529 | #endif | ||
diff --git a/net/mac80211/rc80211_simple.c b/net/mac80211/rc80211_simple.c index c1c8b76a56af..33de6f967e55 100644 --- a/net/mac80211/rc80211_simple.c +++ b/net/mac80211/rc80211_simple.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/skbuff.h> | 14 | #include <linux/skbuff.h> |
15 | #include <linux/compiler.h> | 15 | #include <linux/compiler.h> |
16 | #include <linux/module.h> | ||
16 | 17 | ||
17 | #include <net/mac80211.h> | 18 | #include <net/mac80211.h> |
18 | #include "ieee80211_i.h" | 19 | #include "ieee80211_i.h" |
@@ -349,7 +350,7 @@ static void rate_control_simple_remove_sta_debugfs(void *priv, void *priv_sta) | |||
349 | } | 350 | } |
350 | #endif | 351 | #endif |
351 | 352 | ||
352 | struct rate_control_ops mac80211_rcsimple = { | 353 | static struct rate_control_ops mac80211_rcsimple = { |
353 | .name = "simple", | 354 | .name = "simple", |
354 | .tx_status = rate_control_simple_tx_status, | 355 | .tx_status = rate_control_simple_tx_status, |
355 | .get_rate = rate_control_simple_get_rate, | 356 | .get_rate = rate_control_simple_get_rate, |
@@ -364,3 +365,21 @@ struct rate_control_ops mac80211_rcsimple = { | |||
364 | .remove_sta_debugfs = rate_control_simple_remove_sta_debugfs, | 365 | .remove_sta_debugfs = rate_control_simple_remove_sta_debugfs, |
365 | #endif | 366 | #endif |
366 | }; | 367 | }; |
368 | |||
369 | MODULE_LICENSE("GPL"); | ||
370 | MODULE_DESCRIPTION("Simple rate control algorithm"); | ||
371 | |||
372 | int __init rc80211_simple_init(void) | ||
373 | { | ||
374 | return ieee80211_rate_control_register(&mac80211_rcsimple); | ||
375 | } | ||
376 | |||
377 | void __exit rc80211_simple_exit(void) | ||
378 | { | ||
379 | ieee80211_rate_control_unregister(&mac80211_rcsimple); | ||
380 | } | ||
381 | |||
382 | #ifdef CONFIG_MAC80211_RC_SIMPLE_MODULE | ||
383 | module_init(rc80211_simple_init); | ||
384 | module_exit(rc80211_simple_exit); | ||
385 | #endif | ||