diff options
author | Daniel Drake <dsd@gentoo.org> | 2007-06-09 14:07:14 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2007-07-17 21:50:20 -0400 |
commit | fd8bacc98027aa077ffbf2ecb0c3e930325b01a4 (patch) | |
tree | abed7113352ddc0facd3c562b862c55ed5062905 /net/mac80211/ieee80211_ioctl.c | |
parent | 7c8081eb8f20aa83deb5f1e95adc8a98902555a9 (diff) |
[PATCH] mac80211: regulatory domain cleanup
Currently, a function misnamed ieee80211_init_client() is used to handle
regulatory domain control. It is called from
ieee80211_register_hwmode(), which typically runs 2 or 3 times
(802.11a/b/g), but each time it iterates over all the modes.
This patch cleans this up and removes the confusion:
ieee80211_init_client was effectively renamed to
ieee80211_set_default_regdomain and is now run on a per-mode basis
(doesn't have to deal with netdevs). I also moved the regdomain handling
code into its own file and added some documentation.
Signed-off-by: Daniel Drake <dsd@gentoo.org>
Acked-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/ieee80211_ioctl.c')
-rw-r--r-- | net/mac80211/ieee80211_ioctl.c | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c index 5918dd079e12..d0e1ab5589db 100644 --- a/net/mac80211/ieee80211_ioctl.c +++ b/net/mac80211/ieee80211_ioctl.c | |||
@@ -27,20 +27,6 @@ | |||
27 | #include "aes_ccm.h" | 27 | #include "aes_ccm.h" |
28 | #include "debugfs_key.h" | 28 | #include "debugfs_key.h" |
29 | 29 | ||
30 | static int ieee80211_regdom = 0x10; /* FCC */ | ||
31 | module_param(ieee80211_regdom, int, 0444); | ||
32 | MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain; 64=MKK"); | ||
33 | |||
34 | /* | ||
35 | * If firmware is upgraded by the vendor, additional channels can be used based | ||
36 | * on the new Japanese regulatory rules. This is indicated by setting | ||
37 | * ieee80211_japan_5ghz module parameter to one when loading the 80211 kernel | ||
38 | * module. | ||
39 | */ | ||
40 | static int ieee80211_japan_5ghz /* = 0 */; | ||
41 | module_param(ieee80211_japan_5ghz, int, 0444); | ||
42 | MODULE_PARM_DESC(ieee80211_japan_5ghz, "Vendor-updated firmware for 5 GHz"); | ||
43 | |||
44 | static void ieee80211_set_hw_encryption(struct net_device *dev, | 30 | static void ieee80211_set_hw_encryption(struct net_device *dev, |
45 | struct sta_info *sta, u8 addr[ETH_ALEN], | 31 | struct sta_info *sta, u8 addr[ETH_ALEN], |
46 | struct ieee80211_key *key) | 32 | struct ieee80211_key *key) |
@@ -412,125 +398,6 @@ static int ieee80211_ioctl_giwrange(struct net_device *dev, | |||
412 | } | 398 | } |
413 | 399 | ||
414 | 400 | ||
415 | struct ieee80211_channel_range { | ||
416 | short start_freq; | ||
417 | short end_freq; | ||
418 | unsigned char power_level; | ||
419 | unsigned char antenna_max; | ||
420 | }; | ||
421 | |||
422 | static const struct ieee80211_channel_range ieee80211_fcc_channels[] = { | ||
423 | { 2412, 2462, 27, 6 } /* IEEE 802.11b/g, channels 1..11 */, | ||
424 | { 5180, 5240, 17, 6 } /* IEEE 802.11a, channels 36..48 */, | ||
425 | { 5260, 5320, 23, 6 } /* IEEE 802.11a, channels 52..64 */, | ||
426 | { 5745, 5825, 30, 6 } /* IEEE 802.11a, channels 149..165, outdoor */, | ||
427 | { 0 } | ||
428 | }; | ||
429 | |||
430 | static const struct ieee80211_channel_range ieee80211_mkk_channels[] = { | ||
431 | { 2412, 2472, 20, 6 } /* IEEE 802.11b/g, channels 1..13 */, | ||
432 | { 5170, 5240, 20, 6 } /* IEEE 802.11a, channels 34..48 */, | ||
433 | { 5260, 5320, 20, 6 } /* IEEE 802.11a, channels 52..64 */, | ||
434 | { 0 } | ||
435 | }; | ||
436 | |||
437 | |||
438 | static const struct ieee80211_channel_range *channel_range = | ||
439 | ieee80211_fcc_channels; | ||
440 | |||
441 | |||
442 | static void ieee80211_unmask_channel(struct net_device *dev, int mode, | ||
443 | struct ieee80211_channel *chan) | ||
444 | { | ||
445 | int i; | ||
446 | |||
447 | chan->flag = 0; | ||
448 | |||
449 | if (ieee80211_regdom == 64 && | ||
450 | (mode == MODE_ATHEROS_TURBO || mode == MODE_ATHEROS_TURBOG)) { | ||
451 | /* Do not allow Turbo modes in Japan. */ | ||
452 | return; | ||
453 | } | ||
454 | |||
455 | for (i = 0; channel_range[i].start_freq; i++) { | ||
456 | const struct ieee80211_channel_range *r = &channel_range[i]; | ||
457 | if (r->start_freq <= chan->freq && r->end_freq >= chan->freq) { | ||
458 | if (ieee80211_regdom == 64 && !ieee80211_japan_5ghz && | ||
459 | chan->freq >= 5260 && chan->freq <= 5320) { | ||
460 | /* | ||
461 | * Skip new channels in Japan since the | ||
462 | * firmware was not marked having been upgraded | ||
463 | * by the vendor. | ||
464 | */ | ||
465 | continue; | ||
466 | } | ||
467 | |||
468 | if (ieee80211_regdom == 0x10 && | ||
469 | (chan->freq == 5190 || chan->freq == 5210 || | ||
470 | chan->freq == 5230)) { | ||
471 | /* Skip MKK channels when in FCC domain. */ | ||
472 | continue; | ||
473 | } | ||
474 | |||
475 | chan->flag |= IEEE80211_CHAN_W_SCAN | | ||
476 | IEEE80211_CHAN_W_ACTIVE_SCAN | | ||
477 | IEEE80211_CHAN_W_IBSS; | ||
478 | chan->power_level = r->power_level; | ||
479 | chan->antenna_max = r->antenna_max; | ||
480 | |||
481 | if (ieee80211_regdom == 64 && | ||
482 | (chan->freq == 5170 || chan->freq == 5190 || | ||
483 | chan->freq == 5210 || chan->freq == 5230)) { | ||
484 | /* | ||
485 | * New regulatory rules in Japan have backwards | ||
486 | * compatibility with old channels in 5.15-5.25 | ||
487 | * GHz band, but the station is not allowed to | ||
488 | * use active scan on these old channels. | ||
489 | */ | ||
490 | chan->flag &= ~IEEE80211_CHAN_W_ACTIVE_SCAN; | ||
491 | } | ||
492 | |||
493 | if (ieee80211_regdom == 64 && | ||
494 | (chan->freq == 5260 || chan->freq == 5280 || | ||
495 | chan->freq == 5300 || chan->freq == 5320)) { | ||
496 | /* | ||
497 | * IBSS is not allowed on 5.25-5.35 GHz band | ||
498 | * due to radar detection requirements. | ||
499 | */ | ||
500 | chan->flag &= ~IEEE80211_CHAN_W_IBSS; | ||
501 | } | ||
502 | |||
503 | break; | ||
504 | } | ||
505 | } | ||
506 | } | ||
507 | |||
508 | |||
509 | static int ieee80211_unmask_channels(struct net_device *dev) | ||
510 | { | ||
511 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
512 | struct ieee80211_hw_mode *mode; | ||
513 | int c; | ||
514 | |||
515 | list_for_each_entry(mode, &local->modes_list, list) { | ||
516 | for (c = 0; c < mode->num_channels; c++) { | ||
517 | ieee80211_unmask_channel(dev, mode->mode, | ||
518 | &mode->channels[c]); | ||
519 | } | ||
520 | } | ||
521 | return 0; | ||
522 | } | ||
523 | |||
524 | |||
525 | int ieee80211_init_client(struct net_device *dev) | ||
526 | { | ||
527 | if (ieee80211_regdom == 0x40) | ||
528 | channel_range = ieee80211_mkk_channels; | ||
529 | ieee80211_unmask_channels(dev); | ||
530 | return 0; | ||
531 | } | ||
532 | |||
533 | |||
534 | static int ieee80211_ioctl_siwmode(struct net_device *dev, | 401 | static int ieee80211_ioctl_siwmode(struct net_device *dev, |
535 | struct iw_request_info *info, | 402 | struct iw_request_info *info, |
536 | __u32 *mode, char *extra) | 403 | __u32 *mode, char *extra) |