2 * Wireless utility functions
4 * Copyright 2007-2009 Johannes Berg <johannes@sipsolutions.net>
6 #include <linux/bitops.h>
7 #include <net/cfg80211.h>
10 struct ieee80211_rate
*
11 ieee80211_get_response_rate(struct ieee80211_supported_band
*sband
,
12 u32 basic_rates
, int bitrate
)
14 struct ieee80211_rate
*result
= &sband
->bitrates
[0];
17 for (i
= 0; i
< sband
->n_bitrates
; i
++) {
18 if (!(basic_rates
& BIT(i
)))
20 if (sband
->bitrates
[i
].bitrate
> bitrate
)
22 result
= &sband
->bitrates
[i
];
27 EXPORT_SYMBOL(ieee80211_get_response_rate
);
29 int ieee80211_channel_to_frequency(int chan
)
32 return 2407 + chan
* 5;
37 /* FIXME: 802.11j 17.3.8.3.2 */
38 return (chan
+ 1000) * 5;
40 EXPORT_SYMBOL(ieee80211_channel_to_frequency
);
42 int ieee80211_frequency_to_channel(int freq
)
48 return (freq
- 2407) / 5;
50 /* FIXME: 802.11j 17.3.8.3.2 */
53 EXPORT_SYMBOL(ieee80211_frequency_to_channel
);
55 struct ieee80211_channel
*__ieee80211_get_channel(struct wiphy
*wiphy
,
58 enum ieee80211_band band
;
59 struct ieee80211_supported_band
*sband
;
62 for (band
= 0; band
< IEEE80211_NUM_BANDS
; band
++) {
63 sband
= wiphy
->bands
[band
];
68 for (i
= 0; i
< sband
->n_channels
; i
++) {
69 if (sband
->channels
[i
].center_freq
== freq
)
70 return &sband
->channels
[i
];
76 EXPORT_SYMBOL(__ieee80211_get_channel
);
78 static void set_mandatory_flags_band(struct ieee80211_supported_band
*sband
,
79 enum ieee80211_band band
)
84 case IEEE80211_BAND_5GHZ
:
86 for (i
= 0; i
< sband
->n_bitrates
; i
++) {
87 if (sband
->bitrates
[i
].bitrate
== 60 ||
88 sband
->bitrates
[i
].bitrate
== 120 ||
89 sband
->bitrates
[i
].bitrate
== 240) {
90 sband
->bitrates
[i
].flags
|=
91 IEEE80211_RATE_MANDATORY_A
;
97 case IEEE80211_BAND_2GHZ
:
99 for (i
= 0; i
< sband
->n_bitrates
; i
++) {
100 if (sband
->bitrates
[i
].bitrate
== 10) {
101 sband
->bitrates
[i
].flags
|=
102 IEEE80211_RATE_MANDATORY_B
|
103 IEEE80211_RATE_MANDATORY_G
;
107 if (sband
->bitrates
[i
].bitrate
== 20 ||
108 sband
->bitrates
[i
].bitrate
== 55 ||
109 sband
->bitrates
[i
].bitrate
== 110 ||
110 sband
->bitrates
[i
].bitrate
== 60 ||
111 sband
->bitrates
[i
].bitrate
== 120 ||
112 sband
->bitrates
[i
].bitrate
== 240) {
113 sband
->bitrates
[i
].flags
|=
114 IEEE80211_RATE_MANDATORY_G
;
118 if (sband
->bitrates
[i
].bitrate
!= 10 &&
119 sband
->bitrates
[i
].bitrate
!= 20 &&
120 sband
->bitrates
[i
].bitrate
!= 55 &&
121 sband
->bitrates
[i
].bitrate
!= 110)
122 sband
->bitrates
[i
].flags
|=
123 IEEE80211_RATE_ERP_G
;
125 WARN_ON(want
!= 0 && want
!= 3 && want
!= 6);
127 case IEEE80211_NUM_BANDS
:
133 void ieee80211_set_bitrate_flags(struct wiphy
*wiphy
)
135 enum ieee80211_band band
;
137 for (band
= 0; band
< IEEE80211_NUM_BANDS
; band
++)
138 if (wiphy
->bands
[band
])
139 set_mandatory_flags_band(wiphy
->bands
[band
], band
);
142 int cfg80211_validate_key_settings(struct key_params
*params
, int key_idx
,
149 * Disallow pairwise keys with non-zero index unless it's WEP
150 * (because current deployments use pairwise WEP keys with
151 * non-zero indizes but 802.11i clearly specifies to use zero)
153 if (mac_addr
&& key_idx
&&
154 params
->cipher
!= WLAN_CIPHER_SUITE_WEP40
&&
155 params
->cipher
!= WLAN_CIPHER_SUITE_WEP104
)
158 /* TODO: add definitions for the lengths to linux/ieee80211.h */
159 switch (params
->cipher
) {
160 case WLAN_CIPHER_SUITE_WEP40
:
161 if (params
->key_len
!= 5)
164 case WLAN_CIPHER_SUITE_TKIP
:
165 if (params
->key_len
!= 32)
168 case WLAN_CIPHER_SUITE_CCMP
:
169 if (params
->key_len
!= 16)
172 case WLAN_CIPHER_SUITE_WEP104
:
173 if (params
->key_len
!= 13)
176 case WLAN_CIPHER_SUITE_AES_CMAC
:
177 if (params
->key_len
!= 16)