diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-10-14 10:58:37 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-10-31 19:00:16 -0400 |
commit | ae5eb02641233a4e9d1b92d22090f1b1afa14466 (patch) | |
tree | 117b7cb5efa3ff1cf714218098fc6db3820ed4e0 /include/net/mac80211.h | |
parent | bda3933a8aceedd03e0dd410844bd310033ca756 (diff) |
mac80211: rewrite HT handling
The HT handling has the following deficiencies, which I've
(partially) fixed:
* it always uses the AP info even if there is no AP,
hence has no chance of working as an AP
* it pretends to be HW config, but really is per-BSS
* channel sanity checking is left to the drivers
* it generally lets the driver control too much
HT enabling is still wrong with this patch if you have more than
one virtual STA mode interface, but that never happens currently.
Once WDS, IBSS or AP/VLAN gets HT capabilities, it will also be
wrong, see the comment in ieee80211_enable_ht().
Additionally, this fixes a number of bugs:
* mac80211: ieee80211_set_disassoc doesn't notify the driver any
more since the refactoring
* iwl-agn-rs: always uses the HT capabilities from the wrong stuff
mac80211 gives it rather than the actual peer STA
* ath9k: a number of bugs resulting from the broken HT API
I'm not entirely happy with putting the HT capabilities into
struct ieee80211_sta as restricted to our own HT TX capabilities,
but I see no cleaner solution for now.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'include/net/mac80211.h')
-rw-r--r-- | include/net/mac80211.h | 59 |
1 files changed, 26 insertions, 33 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 94ff3eface49..9801afb62545 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright 2002-2005, Devicescape Software, Inc. | 4 | * Copyright 2002-2005, Devicescape Software, Inc. |
5 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> | 5 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
6 | * Copyright 2007 Johannes Berg <johannes@sipsolutions.net> | 6 | * Copyright 2007-2008 Johannes Berg <johannes@sipsolutions.net> |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
@@ -82,22 +82,6 @@ enum ieee80211_notification_types { | |||
82 | }; | 82 | }; |
83 | 83 | ||
84 | /** | 84 | /** |
85 | * struct ieee80211_ht_bss_info - describing BSS's HT characteristics | ||
86 | * | ||
87 | * This structure describes most essential parameters needed | ||
88 | * to describe 802.11n HT characteristics in a BSS. | ||
89 | * | ||
90 | * @primary_channel: channel number of primery channel | ||
91 | * @bss_cap: 802.11n's general BSS capabilities (e.g. channel width) | ||
92 | * @bss_op_mode: 802.11n's BSS operation modes (e.g. HT protection) | ||
93 | */ | ||
94 | struct ieee80211_ht_bss_info { | ||
95 | u8 primary_channel; | ||
96 | u8 bss_cap; /* use IEEE80211_HT_IE_CHA_ */ | ||
97 | u8 bss_op_mode; /* use IEEE80211_HT_IE_ */ | ||
98 | }; | ||
99 | |||
100 | /** | ||
101 | * enum ieee80211_max_queues - maximum number of queues | 85 | * enum ieee80211_max_queues - maximum number of queues |
102 | * | 86 | * |
103 | * @IEEE80211_MAX_QUEUES: Maximum number of regular device queues. | 87 | * @IEEE80211_MAX_QUEUES: Maximum number of regular device queues. |
@@ -172,6 +156,19 @@ enum ieee80211_bss_change { | |||
172 | }; | 156 | }; |
173 | 157 | ||
174 | /** | 158 | /** |
159 | * struct ieee80211_bss_ht_conf - BSS's changing HT configuration | ||
160 | * @secondary_channel_offset: secondary channel offset, uses | ||
161 | * %IEEE80211_HT_PARAM_CHA_SEC_ values | ||
162 | * @width_40_ok: indicates that 40 MHz bandwidth may be used for TX | ||
163 | * @operation_mode: HT operation mode (like in &struct ieee80211_ht_info) | ||
164 | */ | ||
165 | struct ieee80211_bss_ht_conf { | ||
166 | u8 secondary_channel_offset; | ||
167 | bool width_40_ok; | ||
168 | u16 operation_mode; | ||
169 | }; | ||
170 | |||
171 | /** | ||
175 | * struct ieee80211_bss_conf - holds the BSS's changing parameters | 172 | * struct ieee80211_bss_conf - holds the BSS's changing parameters |
176 | * | 173 | * |
177 | * This structure keeps information about a BSS (and an association | 174 | * This structure keeps information about a BSS (and an association |
@@ -190,9 +187,7 @@ enum ieee80211_bss_change { | |||
190 | * @timestamp: beacon timestamp | 187 | * @timestamp: beacon timestamp |
191 | * @beacon_int: beacon interval | 188 | * @beacon_int: beacon interval |
192 | * @assoc_capability: capabilities taken from assoc resp | 189 | * @assoc_capability: capabilities taken from assoc resp |
193 | * @assoc_ht: association in HT mode | 190 | * @ht: BSS's HT configuration |
194 | * @ht_cap: ht capabilities | ||
195 | * @ht_bss_conf: ht extended capabilities | ||
196 | * @basic_rates: bitmap of basic rates, each bit stands for an | 191 | * @basic_rates: bitmap of basic rates, each bit stands for an |
197 | * index into the rate table configured by the driver in | 192 | * index into the rate table configured by the driver in |
198 | * the current band. | 193 | * the current band. |
@@ -210,10 +205,7 @@ struct ieee80211_bss_conf { | |||
210 | u16 assoc_capability; | 205 | u16 assoc_capability; |
211 | u64 timestamp; | 206 | u64 timestamp; |
212 | u64 basic_rates; | 207 | u64 basic_rates; |
213 | /* ht related data */ | 208 | struct ieee80211_bss_ht_conf ht; |
214 | bool assoc_ht; | ||
215 | struct ieee80211_sta_ht_cap *ht_cap; | ||
216 | struct ieee80211_ht_bss_info *ht_bss_conf; | ||
217 | }; | 209 | }; |
218 | 210 | ||
219 | /** | 211 | /** |
@@ -447,13 +439,11 @@ struct ieee80211_rx_status { | |||
447 | * Flags to define PHY configuration options | 439 | * Flags to define PHY configuration options |
448 | * | 440 | * |
449 | * @IEEE80211_CONF_RADIOTAP: add radiotap header at receive time (if supported) | 441 | * @IEEE80211_CONF_RADIOTAP: add radiotap header at receive time (if supported) |
450 | * @IEEE80211_CONF_SUPPORT_HT_MODE: use 802.11n HT capabilities (if supported) | ||
451 | * @IEEE80211_CONF_PS: Enable 802.11 power save mode | 442 | * @IEEE80211_CONF_PS: Enable 802.11 power save mode |
452 | */ | 443 | */ |
453 | enum ieee80211_conf_flags { | 444 | enum ieee80211_conf_flags { |
454 | IEEE80211_CONF_RADIOTAP = (1<<0), | 445 | IEEE80211_CONF_RADIOTAP = (1<<0), |
455 | IEEE80211_CONF_SUPPORT_HT_MODE = (1<<1), | 446 | IEEE80211_CONF_PS = (1<<1), |
456 | IEEE80211_CONF_PS = (1<<2), | ||
457 | }; | 447 | }; |
458 | 448 | ||
459 | /* XXX: remove all this once drivers stop trying to use it */ | 449 | /* XXX: remove all this once drivers stop trying to use it */ |
@@ -463,6 +453,10 @@ static inline int __deprecated __IEEE80211_CONF_SHORT_SLOT_TIME(void) | |||
463 | } | 453 | } |
464 | #define IEEE80211_CONF_SHORT_SLOT_TIME (__IEEE80211_CONF_SHORT_SLOT_TIME()) | 454 | #define IEEE80211_CONF_SHORT_SLOT_TIME (__IEEE80211_CONF_SHORT_SLOT_TIME()) |
465 | 455 | ||
456 | struct ieee80211_ht_conf { | ||
457 | bool enabled; | ||
458 | }; | ||
459 | |||
466 | /** | 460 | /** |
467 | * enum ieee80211_conf_changed - denotes which configuration changed | 461 | * enum ieee80211_conf_changed - denotes which configuration changed |
468 | * | 462 | * |
@@ -474,6 +468,7 @@ static inline int __deprecated __IEEE80211_CONF_SHORT_SLOT_TIME(void) | |||
474 | * @IEEE80211_CONF_CHANGE_POWER: the TX power changed | 468 | * @IEEE80211_CONF_CHANGE_POWER: the TX power changed |
475 | * @IEEE80211_CONF_CHANGE_CHANNEL: the channel changed | 469 | * @IEEE80211_CONF_CHANGE_CHANNEL: the channel changed |
476 | * @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed | 470 | * @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed |
471 | * @IEEE80211_CONF_CHANGE_HT: HT configuration changed | ||
477 | */ | 472 | */ |
478 | enum ieee80211_conf_changed { | 473 | enum ieee80211_conf_changed { |
479 | IEEE80211_CONF_CHANGE_RADIO_ENABLED = BIT(0), | 474 | IEEE80211_CONF_CHANGE_RADIO_ENABLED = BIT(0), |
@@ -484,6 +479,7 @@ enum ieee80211_conf_changed { | |||
484 | IEEE80211_CONF_CHANGE_POWER = BIT(5), | 479 | IEEE80211_CONF_CHANGE_POWER = BIT(5), |
485 | IEEE80211_CONF_CHANGE_CHANNEL = BIT(6), | 480 | IEEE80211_CONF_CHANGE_CHANNEL = BIT(6), |
486 | IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7), | 481 | IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7), |
482 | IEEE80211_CONF_CHANGE_HT = BIT(8), | ||
487 | }; | 483 | }; |
488 | 484 | ||
489 | /** | 485 | /** |
@@ -496,9 +492,8 @@ enum ieee80211_conf_changed { | |||
496 | * @listen_interval: listen interval in units of beacon interval | 492 | * @listen_interval: listen interval in units of beacon interval |
497 | * @flags: configuration flags defined above | 493 | * @flags: configuration flags defined above |
498 | * @power_level: requested transmit power (in dBm) | 494 | * @power_level: requested transmit power (in dBm) |
499 | * @ht_cap: describes current self configuration of 802.11n HT capabilities | ||
500 | * @ht_bss_conf: describes current BSS configuration of 802.11n HT parameters | ||
501 | * @channel: the channel to tune to | 495 | * @channel: the channel to tune to |
496 | * @ht: the HT configuration for the device | ||
502 | * @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame | 497 | * @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame |
503 | * (a frame not RTS protected), called "dot11LongRetryLimit" in 802.11, | 498 | * (a frame not RTS protected), called "dot11LongRetryLimit" in 802.11, |
504 | * but actually means the number of transmissions not the number of retries | 499 | * but actually means the number of transmissions not the number of retries |
@@ -517,9 +512,7 @@ struct ieee80211_conf { | |||
517 | u8 long_frame_max_tx_count, short_frame_max_tx_count; | 512 | u8 long_frame_max_tx_count, short_frame_max_tx_count; |
518 | 513 | ||
519 | struct ieee80211_channel *channel; | 514 | struct ieee80211_channel *channel; |
520 | 515 | struct ieee80211_ht_conf ht; | |
521 | struct ieee80211_sta_ht_cap ht_cap; | ||
522 | struct ieee80211_ht_bss_info ht_bss_conf; | ||
523 | }; | 516 | }; |
524 | 517 | ||
525 | /** | 518 | /** |
@@ -715,7 +708,7 @@ enum set_key_cmd { | |||
715 | * @addr: MAC address | 708 | * @addr: MAC address |
716 | * @aid: AID we assigned to the station if we're an AP | 709 | * @aid: AID we assigned to the station if we're an AP |
717 | * @supp_rates: Bitmap of supported rates (per band) | 710 | * @supp_rates: Bitmap of supported rates (per band) |
718 | * @ht_cap: HT capabilities of this STA | 711 | * @ht_cap: HT capabilities of this STA; restricted to our own TX capabilities |
719 | * @drv_priv: data area for driver use, will always be aligned to | 712 | * @drv_priv: data area for driver use, will always be aligned to |
720 | * sizeof(void *), size is determined in hw information. | 713 | * sizeof(void *), size is determined in hw information. |
721 | */ | 714 | */ |