diff options
Diffstat (limited to 'include/net/cfg80211.h')
-rw-r--r-- | include/net/cfg80211.h | 1059 |
1 files changed, 894 insertions, 165 deletions
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 5389afdc1297..1a21895b732b 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -1,71 +1,220 @@ | |||
1 | #ifndef __NET_CFG80211_H | 1 | #ifndef __NET_CFG80211_H |
2 | #define __NET_CFG80211_H | 2 | #define __NET_CFG80211_H |
3 | /* | ||
4 | * 802.11 device and configuration interface | ||
5 | * | ||
6 | * Copyright 2006-2009 Johannes Berg <johannes@sipsolutions.net> | ||
7 | * | ||
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 | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
3 | 12 | ||
13 | #include <linux/netdevice.h> | ||
14 | #include <linux/debugfs.h> | ||
15 | #include <linux/list.h> | ||
4 | #include <linux/netlink.h> | 16 | #include <linux/netlink.h> |
5 | #include <linux/skbuff.h> | 17 | #include <linux/skbuff.h> |
6 | #include <linux/nl80211.h> | 18 | #include <linux/nl80211.h> |
7 | #include <linux/if_ether.h> | 19 | #include <linux/if_ether.h> |
8 | #include <linux/ieee80211.h> | 20 | #include <linux/ieee80211.h> |
9 | #include <linux/wireless.h> | 21 | #include <net/regulatory.h> |
10 | #include <net/iw_handler.h> | 22 | |
11 | #include <net/genetlink.h> | ||
12 | /* remove once we remove the wext stuff */ | 23 | /* remove once we remove the wext stuff */ |
13 | #include <net/iw_handler.h> | 24 | #include <net/iw_handler.h> |
25 | #include <linux/wireless.h> | ||
26 | |||
14 | 27 | ||
15 | /* | 28 | /* |
16 | * 802.11 configuration in-kernel interface | 29 | * wireless hardware capability structures |
30 | */ | ||
31 | |||
32 | /** | ||
33 | * enum ieee80211_band - supported frequency bands | ||
34 | * | ||
35 | * The bands are assigned this way because the supported | ||
36 | * bitrates differ in these bands. | ||
17 | * | 37 | * |
18 | * Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net> | 38 | * @IEEE80211_BAND_2GHZ: 2.4GHz ISM band |
39 | * @IEEE80211_BAND_5GHZ: around 5GHz band (4.9-5.7) | ||
19 | */ | 40 | */ |
41 | enum ieee80211_band { | ||
42 | IEEE80211_BAND_2GHZ, | ||
43 | IEEE80211_BAND_5GHZ, | ||
44 | |||
45 | /* keep last */ | ||
46 | IEEE80211_NUM_BANDS | ||
47 | }; | ||
20 | 48 | ||
21 | /** | 49 | /** |
22 | * struct vif_params - describes virtual interface parameters | 50 | * enum ieee80211_channel_flags - channel flags |
23 | * @mesh_id: mesh ID to use | 51 | * |
24 | * @mesh_id_len: length of the mesh ID | 52 | * Channel flags set by the regulatory control code. |
53 | * | ||
54 | * @IEEE80211_CHAN_DISABLED: This channel is disabled. | ||
55 | * @IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted | ||
56 | * on this channel. | ||
57 | * @IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel. | ||
58 | * @IEEE80211_CHAN_RADAR: Radar detection is required on this channel. | ||
59 | * @IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel | ||
60 | * is not permitted. | ||
61 | * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel | ||
62 | * is not permitted. | ||
25 | */ | 63 | */ |
26 | struct vif_params { | 64 | enum ieee80211_channel_flags { |
27 | u8 *mesh_id; | 65 | IEEE80211_CHAN_DISABLED = 1<<0, |
28 | int mesh_id_len; | 66 | IEEE80211_CHAN_PASSIVE_SCAN = 1<<1, |
67 | IEEE80211_CHAN_NO_IBSS = 1<<2, | ||
68 | IEEE80211_CHAN_RADAR = 1<<3, | ||
69 | IEEE80211_CHAN_NO_HT40PLUS = 1<<4, | ||
70 | IEEE80211_CHAN_NO_HT40MINUS = 1<<5, | ||
29 | }; | 71 | }; |
30 | 72 | ||
31 | /* Radiotap header iteration | 73 | #define IEEE80211_CHAN_NO_HT40 \ |
32 | * implemented in net/wireless/radiotap.c | 74 | (IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS) |
33 | * docs in Documentation/networking/radiotap-headers.txt | 75 | |
76 | /** | ||
77 | * struct ieee80211_channel - channel definition | ||
78 | * | ||
79 | * This structure describes a single channel for use | ||
80 | * with cfg80211. | ||
81 | * | ||
82 | * @center_freq: center frequency in MHz | ||
83 | * @max_bandwidth: maximum allowed bandwidth for this channel, in MHz | ||
84 | * @hw_value: hardware-specific value for the channel | ||
85 | * @flags: channel flags from &enum ieee80211_channel_flags. | ||
86 | * @orig_flags: channel flags at registration time, used by regulatory | ||
87 | * code to support devices with additional restrictions | ||
88 | * @band: band this channel belongs to. | ||
89 | * @max_antenna_gain: maximum antenna gain in dBi | ||
90 | * @max_power: maximum transmission power (in dBm) | ||
91 | * @beacon_found: helper to regulatory code to indicate when a beacon | ||
92 | * has been found on this channel. Use regulatory_hint_found_beacon() | ||
93 | * to enable this, this is is useful only on 5 GHz band. | ||
94 | * @orig_mag: internal use | ||
95 | * @orig_mpwr: internal use | ||
34 | */ | 96 | */ |
97 | struct ieee80211_channel { | ||
98 | enum ieee80211_band band; | ||
99 | u16 center_freq; | ||
100 | u8 max_bandwidth; | ||
101 | u16 hw_value; | ||
102 | u32 flags; | ||
103 | int max_antenna_gain; | ||
104 | int max_power; | ||
105 | bool beacon_found; | ||
106 | u32 orig_flags; | ||
107 | int orig_mag, orig_mpwr; | ||
108 | }; | ||
109 | |||
35 | /** | 110 | /** |
36 | * struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args | 111 | * enum ieee80211_rate_flags - rate flags |
37 | * @rtheader: pointer to the radiotap header we are walking through | 112 | * |
38 | * @max_length: length of radiotap header in cpu byte ordering | 113 | * Hardware/specification flags for rates. These are structured |
39 | * @this_arg_index: IEEE80211_RADIOTAP_... index of current arg | 114 | * in a way that allows using the same bitrate structure for |
40 | * @this_arg: pointer to current radiotap arg | 115 | * different bands/PHY modes. |
41 | * @arg_index: internal next argument index | 116 | * |
42 | * @arg: internal next argument pointer | 117 | * @IEEE80211_RATE_SHORT_PREAMBLE: Hardware can send with short |
43 | * @next_bitmap: internal pointer to next present u32 | 118 | * preamble on this bitrate; only relevant in 2.4GHz band and |
44 | * @bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present | 119 | * with CCK rates. |
120 | * @IEEE80211_RATE_MANDATORY_A: This bitrate is a mandatory rate | ||
121 | * when used with 802.11a (on the 5 GHz band); filled by the | ||
122 | * core code when registering the wiphy. | ||
123 | * @IEEE80211_RATE_MANDATORY_B: This bitrate is a mandatory rate | ||
124 | * when used with 802.11b (on the 2.4 GHz band); filled by the | ||
125 | * core code when registering the wiphy. | ||
126 | * @IEEE80211_RATE_MANDATORY_G: This bitrate is a mandatory rate | ||
127 | * when used with 802.11g (on the 2.4 GHz band); filled by the | ||
128 | * core code when registering the wiphy. | ||
129 | * @IEEE80211_RATE_ERP_G: This is an ERP rate in 802.11g mode. | ||
45 | */ | 130 | */ |
131 | enum ieee80211_rate_flags { | ||
132 | IEEE80211_RATE_SHORT_PREAMBLE = 1<<0, | ||
133 | IEEE80211_RATE_MANDATORY_A = 1<<1, | ||
134 | IEEE80211_RATE_MANDATORY_B = 1<<2, | ||
135 | IEEE80211_RATE_MANDATORY_G = 1<<3, | ||
136 | IEEE80211_RATE_ERP_G = 1<<4, | ||
137 | }; | ||
46 | 138 | ||
47 | struct ieee80211_radiotap_iterator { | 139 | /** |
48 | struct ieee80211_radiotap_header *rtheader; | 140 | * struct ieee80211_rate - bitrate definition |
49 | int max_length; | 141 | * |
50 | int this_arg_index; | 142 | * This structure describes a bitrate that an 802.11 PHY can |
51 | u8 *this_arg; | 143 | * operate with. The two values @hw_value and @hw_value_short |
144 | * are only for driver use when pointers to this structure are | ||
145 | * passed around. | ||
146 | * | ||
147 | * @flags: rate-specific flags | ||
148 | * @bitrate: bitrate in units of 100 Kbps | ||
149 | * @hw_value: driver/hardware value for this rate | ||
150 | * @hw_value_short: driver/hardware value for this rate when | ||
151 | * short preamble is used | ||
152 | */ | ||
153 | struct ieee80211_rate { | ||
154 | u32 flags; | ||
155 | u16 bitrate; | ||
156 | u16 hw_value, hw_value_short; | ||
157 | }; | ||
52 | 158 | ||
53 | int arg_index; | 159 | /** |
54 | u8 *arg; | 160 | * struct ieee80211_sta_ht_cap - STA's HT capabilities |
55 | __le32 *next_bitmap; | 161 | * |
56 | u32 bitmap_shifter; | 162 | * This structure describes most essential parameters needed |
163 | * to describe 802.11n HT capabilities for an STA. | ||
164 | * | ||
165 | * @ht_supported: is HT supported by the STA | ||
166 | * @cap: HT capabilities map as described in 802.11n spec | ||
167 | * @ampdu_factor: Maximum A-MPDU length factor | ||
168 | * @ampdu_density: Minimum A-MPDU spacing | ||
169 | * @mcs: Supported MCS rates | ||
170 | */ | ||
171 | struct ieee80211_sta_ht_cap { | ||
172 | u16 cap; /* use IEEE80211_HT_CAP_ */ | ||
173 | bool ht_supported; | ||
174 | u8 ampdu_factor; | ||
175 | u8 ampdu_density; | ||
176 | struct ieee80211_mcs_info mcs; | ||
57 | }; | 177 | }; |
58 | 178 | ||
59 | extern int ieee80211_radiotap_iterator_init( | 179 | /** |
60 | struct ieee80211_radiotap_iterator *iterator, | 180 | * struct ieee80211_supported_band - frequency band definition |
61 | struct ieee80211_radiotap_header *radiotap_header, | 181 | * |
62 | int max_length); | 182 | * This structure describes a frequency band a wiphy |
183 | * is able to operate in. | ||
184 | * | ||
185 | * @channels: Array of channels the hardware can operate in | ||
186 | * in this band. | ||
187 | * @band: the band this structure represents | ||
188 | * @n_channels: Number of channels in @channels | ||
189 | * @bitrates: Array of bitrates the hardware can operate with | ||
190 | * in this band. Must be sorted to give a valid "supported | ||
191 | * rates" IE, i.e. CCK rates first, then OFDM. | ||
192 | * @n_bitrates: Number of bitrates in @bitrates | ||
193 | */ | ||
194 | struct ieee80211_supported_band { | ||
195 | struct ieee80211_channel *channels; | ||
196 | struct ieee80211_rate *bitrates; | ||
197 | enum ieee80211_band band; | ||
198 | int n_channels; | ||
199 | int n_bitrates; | ||
200 | struct ieee80211_sta_ht_cap ht_cap; | ||
201 | }; | ||
63 | 202 | ||
64 | extern int ieee80211_radiotap_iterator_next( | 203 | /* |
65 | struct ieee80211_radiotap_iterator *iterator); | 204 | * Wireless hardware/device configuration structures and methods |
205 | */ | ||
66 | 206 | ||
207 | /** | ||
208 | * struct vif_params - describes virtual interface parameters | ||
209 | * @mesh_id: mesh ID to use | ||
210 | * @mesh_id_len: length of the mesh ID | ||
211 | */ | ||
212 | struct vif_params { | ||
213 | u8 *mesh_id; | ||
214 | int mesh_id_len; | ||
215 | }; | ||
67 | 216 | ||
68 | /** | 217 | /** |
69 | * struct key_params - key information | 218 | * struct key_params - key information |
70 | * | 219 | * |
71 | * Information about a key | 220 | * Information about a key |
@@ -106,27 +255,6 @@ struct beacon_parameters { | |||
106 | }; | 255 | }; |
107 | 256 | ||
108 | /** | 257 | /** |
109 | * enum station_flags - station flags | ||
110 | * | ||
111 | * Station capability flags. Note that these must be the bits | ||
112 | * according to the nl80211 flags. | ||
113 | * | ||
114 | * @STATION_FLAG_CHANGED: station flags were changed | ||
115 | * @STATION_FLAG_AUTHORIZED: station is authorized to send frames (802.1X) | ||
116 | * @STATION_FLAG_SHORT_PREAMBLE: station is capable of receiving frames | ||
117 | * with short preambles | ||
118 | * @STATION_FLAG_WME: station is WME/QoS capable | ||
119 | * @STATION_FLAG_MFP: station uses management frame protection | ||
120 | */ | ||
121 | enum station_flags { | ||
122 | STATION_FLAG_CHANGED = 1<<0, | ||
123 | STATION_FLAG_AUTHORIZED = 1<<NL80211_STA_FLAG_AUTHORIZED, | ||
124 | STATION_FLAG_SHORT_PREAMBLE = 1<<NL80211_STA_FLAG_SHORT_PREAMBLE, | ||
125 | STATION_FLAG_WME = 1<<NL80211_STA_FLAG_WME, | ||
126 | STATION_FLAG_MFP = 1<<NL80211_STA_FLAG_MFP, | ||
127 | }; | ||
128 | |||
129 | /** | ||
130 | * enum plink_action - actions to perform in mesh peers | 258 | * enum plink_action - actions to perform in mesh peers |
131 | * | 259 | * |
132 | * @PLINK_ACTION_INVALID: action 0 is reserved | 260 | * @PLINK_ACTION_INVALID: action 0 is reserved |
@@ -148,14 +276,17 @@ enum plink_actions { | |||
148 | * @supported_rates: supported rates in IEEE 802.11 format | 276 | * @supported_rates: supported rates in IEEE 802.11 format |
149 | * (or NULL for no change) | 277 | * (or NULL for no change) |
150 | * @supported_rates_len: number of supported rates | 278 | * @supported_rates_len: number of supported rates |
151 | * @station_flags: station flags (see &enum station_flags) | 279 | * @sta_flags_mask: station flags that changed |
280 | * (bitmask of BIT(NL80211_STA_FLAG_...)) | ||
281 | * @sta_flags_set: station flags values | ||
282 | * (bitmask of BIT(NL80211_STA_FLAG_...)) | ||
152 | * @listen_interval: listen interval or -1 for no change | 283 | * @listen_interval: listen interval or -1 for no change |
153 | * @aid: AID or zero for no change | 284 | * @aid: AID or zero for no change |
154 | */ | 285 | */ |
155 | struct station_parameters { | 286 | struct station_parameters { |
156 | u8 *supported_rates; | 287 | u8 *supported_rates; |
157 | struct net_device *vlan; | 288 | struct net_device *vlan; |
158 | u32 station_flags; | 289 | u32 sta_flags_mask, sta_flags_set; |
159 | int listen_interval; | 290 | int listen_interval; |
160 | u16 aid; | 291 | u16 aid; |
161 | u8 supported_rates_len; | 292 | u8 supported_rates_len; |
@@ -348,92 +479,6 @@ struct bss_parameters { | |||
348 | u8 basic_rates_len; | 479 | u8 basic_rates_len; |
349 | }; | 480 | }; |
350 | 481 | ||
351 | /** | ||
352 | * enum environment_cap - Environment parsed from country IE | ||
353 | * @ENVIRON_ANY: indicates country IE applies to both indoor and | ||
354 | * outdoor operation. | ||
355 | * @ENVIRON_INDOOR: indicates country IE applies only to indoor operation | ||
356 | * @ENVIRON_OUTDOOR: indicates country IE applies only to outdoor operation | ||
357 | */ | ||
358 | enum environment_cap { | ||
359 | ENVIRON_ANY, | ||
360 | ENVIRON_INDOOR, | ||
361 | ENVIRON_OUTDOOR, | ||
362 | }; | ||
363 | |||
364 | /** | ||
365 | * struct regulatory_request - used to keep track of regulatory requests | ||
366 | * | ||
367 | * @wiphy_idx: this is set if this request's initiator is | ||
368 | * %REGDOM_SET_BY_COUNTRY_IE or %REGDOM_SET_BY_DRIVER. This | ||
369 | * can be used by the wireless core to deal with conflicts | ||
370 | * and potentially inform users of which devices specifically | ||
371 | * cased the conflicts. | ||
372 | * @initiator: indicates who sent this request, could be any of | ||
373 | * of those set in nl80211_reg_initiator (%NL80211_REGDOM_SET_BY_*) | ||
374 | * @alpha2: the ISO / IEC 3166 alpha2 country code of the requested | ||
375 | * regulatory domain. We have a few special codes: | ||
376 | * 00 - World regulatory domain | ||
377 | * 99 - built by driver but a specific alpha2 cannot be determined | ||
378 | * 98 - result of an intersection between two regulatory domains | ||
379 | * @intersect: indicates whether the wireless core should intersect | ||
380 | * the requested regulatory domain with the presently set regulatory | ||
381 | * domain. | ||
382 | * @country_ie_checksum: checksum of the last processed and accepted | ||
383 | * country IE | ||
384 | * @country_ie_env: lets us know if the AP is telling us we are outdoor, | ||
385 | * indoor, or if it doesn't matter | ||
386 | * @list: used to insert into the reg_requests_list linked list | ||
387 | */ | ||
388 | struct regulatory_request { | ||
389 | int wiphy_idx; | ||
390 | enum nl80211_reg_initiator initiator; | ||
391 | char alpha2[2]; | ||
392 | bool intersect; | ||
393 | u32 country_ie_checksum; | ||
394 | enum environment_cap country_ie_env; | ||
395 | struct list_head list; | ||
396 | }; | ||
397 | |||
398 | struct ieee80211_freq_range { | ||
399 | u32 start_freq_khz; | ||
400 | u32 end_freq_khz; | ||
401 | u32 max_bandwidth_khz; | ||
402 | }; | ||
403 | |||
404 | struct ieee80211_power_rule { | ||
405 | u32 max_antenna_gain; | ||
406 | u32 max_eirp; | ||
407 | }; | ||
408 | |||
409 | struct ieee80211_reg_rule { | ||
410 | struct ieee80211_freq_range freq_range; | ||
411 | struct ieee80211_power_rule power_rule; | ||
412 | u32 flags; | ||
413 | }; | ||
414 | |||
415 | struct ieee80211_regdomain { | ||
416 | u32 n_reg_rules; | ||
417 | char alpha2[2]; | ||
418 | struct ieee80211_reg_rule reg_rules[]; | ||
419 | }; | ||
420 | |||
421 | #define MHZ_TO_KHZ(freq) ((freq) * 1000) | ||
422 | #define KHZ_TO_MHZ(freq) ((freq) / 1000) | ||
423 | #define DBI_TO_MBI(gain) ((gain) * 100) | ||
424 | #define MBI_TO_DBI(gain) ((gain) / 100) | ||
425 | #define DBM_TO_MBM(gain) ((gain) * 100) | ||
426 | #define MBM_TO_DBM(gain) ((gain) / 100) | ||
427 | |||
428 | #define REG_RULE(start, end, bw, gain, eirp, reg_flags) { \ | ||
429 | .freq_range.start_freq_khz = MHZ_TO_KHZ(start), \ | ||
430 | .freq_range.end_freq_khz = MHZ_TO_KHZ(end), \ | ||
431 | .freq_range.max_bandwidth_khz = MHZ_TO_KHZ(bw), \ | ||
432 | .power_rule.max_antenna_gain = DBI_TO_MBI(gain), \ | ||
433 | .power_rule.max_eirp = DBM_TO_MBM(eirp), \ | ||
434 | .flags = reg_flags, \ | ||
435 | } | ||
436 | |||
437 | struct mesh_config { | 482 | struct mesh_config { |
438 | /* Timeouts in ms */ | 483 | /* Timeouts in ms */ |
439 | /* Mesh plink management parameters */ | 484 | /* Mesh plink management parameters */ |
@@ -504,7 +549,7 @@ struct cfg80211_scan_request { | |||
504 | int n_ssids; | 549 | int n_ssids; |
505 | struct ieee80211_channel **channels; | 550 | struct ieee80211_channel **channels; |
506 | u32 n_channels; | 551 | u32 n_channels; |
507 | u8 *ie; | 552 | const u8 *ie; |
508 | size_t ie_len; | 553 | size_t ie_len; |
509 | 554 | ||
510 | /* internal */ | 555 | /* internal */ |
@@ -612,6 +657,11 @@ struct cfg80211_auth_request { | |||
612 | * @ssid_len: Length of ssid in octets | 657 | * @ssid_len: Length of ssid in octets |
613 | * @ie: Extra IEs to add to (Re)Association Request frame or %NULL | 658 | * @ie: Extra IEs to add to (Re)Association Request frame or %NULL |
614 | * @ie_len: Length of ie buffer in octets | 659 | * @ie_len: Length of ie buffer in octets |
660 | * @use_mfp: Use management frame protection (IEEE 802.11w) in this association | ||
661 | * @control_port: Whether user space controls IEEE 802.1X port, i.e., | ||
662 | * sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is | ||
663 | * required to assume that the port is unauthorized until authorized by | ||
664 | * user space. Otherwise, port is marked authorized by default. | ||
615 | */ | 665 | */ |
616 | struct cfg80211_assoc_request { | 666 | struct cfg80211_assoc_request { |
617 | struct ieee80211_channel *chan; | 667 | struct ieee80211_channel *chan; |
@@ -620,6 +670,8 @@ struct cfg80211_assoc_request { | |||
620 | size_t ssid_len; | 670 | size_t ssid_len; |
621 | const u8 *ie; | 671 | const u8 *ie; |
622 | size_t ie_len; | 672 | size_t ie_len; |
673 | bool use_mfp; | ||
674 | bool control_port; | ||
623 | }; | 675 | }; |
624 | 676 | ||
625 | /** | 677 | /** |
@@ -659,6 +711,60 @@ struct cfg80211_disassoc_request { | |||
659 | }; | 711 | }; |
660 | 712 | ||
661 | /** | 713 | /** |
714 | * struct cfg80211_ibss_params - IBSS parameters | ||
715 | * | ||
716 | * This structure defines the IBSS parameters for the join_ibss() | ||
717 | * method. | ||
718 | * | ||
719 | * @ssid: The SSID, will always be non-null. | ||
720 | * @ssid_len: The length of the SSID, will always be non-zero. | ||
721 | * @bssid: Fixed BSSID requested, maybe be %NULL, if set do not | ||
722 | * search for IBSSs with a different BSSID. | ||
723 | * @channel: The channel to use if no IBSS can be found to join. | ||
724 | * @channel_fixed: The channel should be fixed -- do not search for | ||
725 | * IBSSs to join on other channels. | ||
726 | * @ie: information element(s) to include in the beacon | ||
727 | * @ie_len: length of that | ||
728 | * @beacon_interval: beacon interval to use | ||
729 | */ | ||
730 | struct cfg80211_ibss_params { | ||
731 | u8 *ssid; | ||
732 | u8 *bssid; | ||
733 | struct ieee80211_channel *channel; | ||
734 | u8 *ie; | ||
735 | u8 ssid_len, ie_len; | ||
736 | u16 beacon_interval; | ||
737 | bool channel_fixed; | ||
738 | }; | ||
739 | |||
740 | /** | ||
741 | * enum wiphy_params_flags - set_wiphy_params bitfield values | ||
742 | * WIPHY_PARAM_RETRY_SHORT: wiphy->retry_short has changed | ||
743 | * WIPHY_PARAM_RETRY_LONG: wiphy->retry_long has changed | ||
744 | * WIPHY_PARAM_FRAG_THRESHOLD: wiphy->frag_threshold has changed | ||
745 | * WIPHY_PARAM_RTS_THRESHOLD: wiphy->rts_threshold has changed | ||
746 | */ | ||
747 | enum wiphy_params_flags { | ||
748 | WIPHY_PARAM_RETRY_SHORT = 1 << 0, | ||
749 | WIPHY_PARAM_RETRY_LONG = 1 << 1, | ||
750 | WIPHY_PARAM_FRAG_THRESHOLD = 1 << 2, | ||
751 | WIPHY_PARAM_RTS_THRESHOLD = 1 << 3, | ||
752 | }; | ||
753 | |||
754 | /** | ||
755 | * enum tx_power_setting - TX power adjustment | ||
756 | * | ||
757 | * @TX_POWER_AUTOMATIC: the dbm parameter is ignored | ||
758 | * @TX_POWER_LIMITED: limit TX power by the dbm parameter | ||
759 | * @TX_POWER_FIXED: fix TX power to the dbm parameter | ||
760 | */ | ||
761 | enum tx_power_setting { | ||
762 | TX_POWER_AUTOMATIC, | ||
763 | TX_POWER_LIMITED, | ||
764 | TX_POWER_FIXED, | ||
765 | }; | ||
766 | |||
767 | /** | ||
662 | * struct cfg80211_ops - backend description for wireless configuration | 768 | * struct cfg80211_ops - backend description for wireless configuration |
663 | * | 769 | * |
664 | * This struct is registered by fullmac card drivers and/or wireless stacks | 770 | * This struct is registered by fullmac card drivers and/or wireless stacks |
@@ -688,10 +794,11 @@ struct cfg80211_disassoc_request { | |||
688 | * @get_key: get information about the key with the given parameters. | 794 | * @get_key: get information about the key with the given parameters. |
689 | * @mac_addr will be %NULL when requesting information for a group | 795 | * @mac_addr will be %NULL when requesting information for a group |
690 | * key. All pointers given to the @callback function need not be valid | 796 | * key. All pointers given to the @callback function need not be valid |
691 | * after it returns. | 797 | * after it returns. This function should return an error if it is |
798 | * not possible to retrieve the key, -ENOENT if it doesn't exist. | ||
692 | * | 799 | * |
693 | * @del_key: remove a key given the @mac_addr (%NULL for a group key) | 800 | * @del_key: remove a key given the @mac_addr (%NULL for a group key) |
694 | * and @key_index | 801 | * and @key_index, return -ENOENT if the key doesn't exist. |
695 | * | 802 | * |
696 | * @set_default_key: set the default key on an interface | 803 | * @set_default_key: set the default key on an interface |
697 | * | 804 | * |
@@ -733,6 +840,23 @@ struct cfg80211_disassoc_request { | |||
733 | * @assoc: Request to (re)associate with the specified peer | 840 | * @assoc: Request to (re)associate with the specified peer |
734 | * @deauth: Request to deauthenticate from the specified peer | 841 | * @deauth: Request to deauthenticate from the specified peer |
735 | * @disassoc: Request to disassociate from the specified peer | 842 | * @disassoc: Request to disassociate from the specified peer |
843 | * | ||
844 | * @join_ibss: Join the specified IBSS (or create if necessary). Once done, call | ||
845 | * cfg80211_ibss_joined(), also call that function when changing BSSID due | ||
846 | * to a merge. | ||
847 | * @leave_ibss: Leave the IBSS. | ||
848 | * | ||
849 | * @set_wiphy_params: Notify that wiphy parameters have changed; | ||
850 | * @changed bitfield (see &enum wiphy_params_flags) describes which values | ||
851 | * have changed. The actual parameter values are available in | ||
852 | * struct wiphy. If returning an error, no value should be changed. | ||
853 | * | ||
854 | * @set_tx_power: set the transmit power according to the parameters | ||
855 | * @get_tx_power: store the current TX power into the dbm variable; | ||
856 | * return 0 if successful | ||
857 | * | ||
858 | * @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting | ||
859 | * functions to adjust rfkill hw state | ||
736 | */ | 860 | */ |
737 | struct cfg80211_ops { | 861 | struct cfg80211_ops { |
738 | int (*suspend)(struct wiphy *wiphy); | 862 | int (*suspend)(struct wiphy *wiphy); |
@@ -747,13 +871,13 @@ struct cfg80211_ops { | |||
747 | struct vif_params *params); | 871 | struct vif_params *params); |
748 | 872 | ||
749 | int (*add_key)(struct wiphy *wiphy, struct net_device *netdev, | 873 | int (*add_key)(struct wiphy *wiphy, struct net_device *netdev, |
750 | u8 key_index, u8 *mac_addr, | 874 | u8 key_index, const u8 *mac_addr, |
751 | struct key_params *params); | 875 | struct key_params *params); |
752 | int (*get_key)(struct wiphy *wiphy, struct net_device *netdev, | 876 | int (*get_key)(struct wiphy *wiphy, struct net_device *netdev, |
753 | u8 key_index, u8 *mac_addr, void *cookie, | 877 | u8 key_index, const u8 *mac_addr, void *cookie, |
754 | void (*callback)(void *cookie, struct key_params*)); | 878 | void (*callback)(void *cookie, struct key_params*)); |
755 | int (*del_key)(struct wiphy *wiphy, struct net_device *netdev, | 879 | int (*del_key)(struct wiphy *wiphy, struct net_device *netdev, |
756 | u8 key_index, u8 *mac_addr); | 880 | u8 key_index, const u8 *mac_addr); |
757 | int (*set_default_key)(struct wiphy *wiphy, | 881 | int (*set_default_key)(struct wiphy *wiphy, |
758 | struct net_device *netdev, | 882 | struct net_device *netdev, |
759 | u8 key_index); | 883 | u8 key_index); |
@@ -818,9 +942,473 @@ struct cfg80211_ops { | |||
818 | struct cfg80211_deauth_request *req); | 942 | struct cfg80211_deauth_request *req); |
819 | int (*disassoc)(struct wiphy *wiphy, struct net_device *dev, | 943 | int (*disassoc)(struct wiphy *wiphy, struct net_device *dev, |
820 | struct cfg80211_disassoc_request *req); | 944 | struct cfg80211_disassoc_request *req); |
945 | |||
946 | int (*join_ibss)(struct wiphy *wiphy, struct net_device *dev, | ||
947 | struct cfg80211_ibss_params *params); | ||
948 | int (*leave_ibss)(struct wiphy *wiphy, struct net_device *dev); | ||
949 | |||
950 | int (*set_wiphy_params)(struct wiphy *wiphy, u32 changed); | ||
951 | |||
952 | int (*set_tx_power)(struct wiphy *wiphy, | ||
953 | enum tx_power_setting type, int dbm); | ||
954 | int (*get_tx_power)(struct wiphy *wiphy, int *dbm); | ||
955 | |||
956 | void (*rfkill_poll)(struct wiphy *wiphy); | ||
821 | }; | 957 | }; |
822 | 958 | ||
823 | /* temporary wext handlers */ | 959 | /* |
960 | * wireless hardware and networking interfaces structures | ||
961 | * and registration/helper functions | ||
962 | */ | ||
963 | |||
964 | /** | ||
965 | * struct wiphy - wireless hardware description | ||
966 | * @idx: the wiphy index assigned to this item | ||
967 | * @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name> | ||
968 | * @custom_regulatory: tells us the driver for this device | ||
969 | * has its own custom regulatory domain and cannot identify the | ||
970 | * ISO / IEC 3166 alpha2 it belongs to. When this is enabled | ||
971 | * we will disregard the first regulatory hint (when the | ||
972 | * initiator is %REGDOM_SET_BY_CORE). | ||
973 | * @strict_regulatory: tells us the driver for this device will ignore | ||
974 | * regulatory domain settings until it gets its own regulatory domain | ||
975 | * via its regulatory_hint(). After its gets its own regulatory domain | ||
976 | * it will only allow further regulatory domain settings to further | ||
977 | * enhance compliance. For example if channel 13 and 14 are disabled | ||
978 | * by this regulatory domain no user regulatory domain can enable these | ||
979 | * channels at a later time. This can be used for devices which do not | ||
980 | * have calibration information gauranteed for frequencies or settings | ||
981 | * outside of its regulatory domain. | ||
982 | * @reg_notifier: the driver's regulatory notification callback | ||
983 | * @regd: the driver's regulatory domain, if one was requested via | ||
984 | * the regulatory_hint() API. This can be used by the driver | ||
985 | * on the reg_notifier() if it chooses to ignore future | ||
986 | * regulatory domain changes caused by other drivers. | ||
987 | * @signal_type: signal type reported in &struct cfg80211_bss. | ||
988 | * @cipher_suites: supported cipher suites | ||
989 | * @n_cipher_suites: number of supported cipher suites | ||
990 | * @retry_short: Retry limit for short frames (dot11ShortRetryLimit) | ||
991 | * @retry_long: Retry limit for long frames (dot11LongRetryLimit) | ||
992 | * @frag_threshold: Fragmentation threshold (dot11FragmentationThreshold); | ||
993 | * -1 = fragmentation disabled, only odd values >= 256 used | ||
994 | * @rts_threshold: RTS threshold (dot11RTSThreshold); -1 = RTS/CTS disabled | ||
995 | */ | ||
996 | struct wiphy { | ||
997 | /* assign these fields before you register the wiphy */ | ||
998 | |||
999 | /* permanent MAC address */ | ||
1000 | u8 perm_addr[ETH_ALEN]; | ||
1001 | |||
1002 | /* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */ | ||
1003 | u16 interface_modes; | ||
1004 | |||
1005 | bool custom_regulatory; | ||
1006 | bool strict_regulatory; | ||
1007 | |||
1008 | enum cfg80211_signal_type signal_type; | ||
1009 | |||
1010 | int bss_priv_size; | ||
1011 | u8 max_scan_ssids; | ||
1012 | u16 max_scan_ie_len; | ||
1013 | |||
1014 | int n_cipher_suites; | ||
1015 | const u32 *cipher_suites; | ||
1016 | |||
1017 | u8 retry_short; | ||
1018 | u8 retry_long; | ||
1019 | u32 frag_threshold; | ||
1020 | u32 rts_threshold; | ||
1021 | |||
1022 | /* If multiple wiphys are registered and you're handed e.g. | ||
1023 | * a regular netdev with assigned ieee80211_ptr, you won't | ||
1024 | * know whether it points to a wiphy your driver has registered | ||
1025 | * or not. Assign this to something global to your driver to | ||
1026 | * help determine whether you own this wiphy or not. */ | ||
1027 | const void *privid; | ||
1028 | |||
1029 | struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS]; | ||
1030 | |||
1031 | /* Lets us get back the wiphy on the callback */ | ||
1032 | int (*reg_notifier)(struct wiphy *wiphy, | ||
1033 | struct regulatory_request *request); | ||
1034 | |||
1035 | /* fields below are read-only, assigned by cfg80211 */ | ||
1036 | |||
1037 | const struct ieee80211_regdomain *regd; | ||
1038 | |||
1039 | /* the item in /sys/class/ieee80211/ points to this, | ||
1040 | * you need use set_wiphy_dev() (see below) */ | ||
1041 | struct device dev; | ||
1042 | |||
1043 | /* dir in debugfs: ieee80211/<wiphyname> */ | ||
1044 | struct dentry *debugfsdir; | ||
1045 | |||
1046 | char priv[0] __attribute__((__aligned__(NETDEV_ALIGN))); | ||
1047 | }; | ||
1048 | |||
1049 | /** | ||
1050 | * wiphy_priv - return priv from wiphy | ||
1051 | * | ||
1052 | * @wiphy: the wiphy whose priv pointer to return | ||
1053 | */ | ||
1054 | static inline void *wiphy_priv(struct wiphy *wiphy) | ||
1055 | { | ||
1056 | BUG_ON(!wiphy); | ||
1057 | return &wiphy->priv; | ||
1058 | } | ||
1059 | |||
1060 | /** | ||
1061 | * set_wiphy_dev - set device pointer for wiphy | ||
1062 | * | ||
1063 | * @wiphy: The wiphy whose device to bind | ||
1064 | * @dev: The device to parent it to | ||
1065 | */ | ||
1066 | static inline void set_wiphy_dev(struct wiphy *wiphy, struct device *dev) | ||
1067 | { | ||
1068 | wiphy->dev.parent = dev; | ||
1069 | } | ||
1070 | |||
1071 | /** | ||
1072 | * wiphy_dev - get wiphy dev pointer | ||
1073 | * | ||
1074 | * @wiphy: The wiphy whose device struct to look up | ||
1075 | */ | ||
1076 | static inline struct device *wiphy_dev(struct wiphy *wiphy) | ||
1077 | { | ||
1078 | return wiphy->dev.parent; | ||
1079 | } | ||
1080 | |||
1081 | /** | ||
1082 | * wiphy_name - get wiphy name | ||
1083 | * | ||
1084 | * @wiphy: The wiphy whose name to return | ||
1085 | */ | ||
1086 | static inline const char *wiphy_name(struct wiphy *wiphy) | ||
1087 | { | ||
1088 | return dev_name(&wiphy->dev); | ||
1089 | } | ||
1090 | |||
1091 | /** | ||
1092 | * wiphy_new - create a new wiphy for use with cfg80211 | ||
1093 | * | ||
1094 | * @ops: The configuration operations for this device | ||
1095 | * @sizeof_priv: The size of the private area to allocate | ||
1096 | * | ||
1097 | * Create a new wiphy and associate the given operations with it. | ||
1098 | * @sizeof_priv bytes are allocated for private use. | ||
1099 | * | ||
1100 | * The returned pointer must be assigned to each netdev's | ||
1101 | * ieee80211_ptr for proper operation. | ||
1102 | */ | ||
1103 | struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv); | ||
1104 | |||
1105 | /** | ||
1106 | * wiphy_register - register a wiphy with cfg80211 | ||
1107 | * | ||
1108 | * @wiphy: The wiphy to register. | ||
1109 | * | ||
1110 | * Returns a non-negative wiphy index or a negative error code. | ||
1111 | */ | ||
1112 | extern int wiphy_register(struct wiphy *wiphy); | ||
1113 | |||
1114 | /** | ||
1115 | * wiphy_unregister - deregister a wiphy from cfg80211 | ||
1116 | * | ||
1117 | * @wiphy: The wiphy to unregister. | ||
1118 | * | ||
1119 | * After this call, no more requests can be made with this priv | ||
1120 | * pointer, but the call may sleep to wait for an outstanding | ||
1121 | * request that is being handled. | ||
1122 | */ | ||
1123 | extern void wiphy_unregister(struct wiphy *wiphy); | ||
1124 | |||
1125 | /** | ||
1126 | * wiphy_free - free wiphy | ||
1127 | * | ||
1128 | * @wiphy: The wiphy to free | ||
1129 | */ | ||
1130 | extern void wiphy_free(struct wiphy *wiphy); | ||
1131 | |||
1132 | /** | ||
1133 | * struct wireless_dev - wireless per-netdev state | ||
1134 | * | ||
1135 | * This structure must be allocated by the driver/stack | ||
1136 | * that uses the ieee80211_ptr field in struct net_device | ||
1137 | * (this is intentional so it can be allocated along with | ||
1138 | * the netdev.) | ||
1139 | * | ||
1140 | * @wiphy: pointer to hardware description | ||
1141 | * @iftype: interface type | ||
1142 | * @list: (private) Used to collect the interfaces | ||
1143 | * @netdev: (private) Used to reference back to the netdev | ||
1144 | * @current_bss: (private) Used by the internal configuration code | ||
1145 | * @bssid: (private) Used by the internal configuration code | ||
1146 | * @ssid: (private) Used by the internal configuration code | ||
1147 | * @ssid_len: (private) Used by the internal configuration code | ||
1148 | * @wext: (private) Used by the internal wireless extensions compat code | ||
1149 | * @wext_bssid: (private) Used by the internal wireless extensions compat code | ||
1150 | */ | ||
1151 | struct wireless_dev { | ||
1152 | struct wiphy *wiphy; | ||
1153 | enum nl80211_iftype iftype; | ||
1154 | |||
1155 | /* private to the generic wireless code */ | ||
1156 | struct list_head list; | ||
1157 | struct net_device *netdev; | ||
1158 | |||
1159 | /* currently used for IBSS - might be rearranged in the future */ | ||
1160 | struct cfg80211_bss *current_bss; | ||
1161 | u8 bssid[ETH_ALEN]; | ||
1162 | u8 ssid[IEEE80211_MAX_SSID_LEN]; | ||
1163 | u8 ssid_len; | ||
1164 | |||
1165 | #ifdef CONFIG_WIRELESS_EXT | ||
1166 | /* wext data */ | ||
1167 | struct { | ||
1168 | struct cfg80211_ibss_params ibss; | ||
1169 | u8 bssid[ETH_ALEN]; | ||
1170 | s8 default_key, default_mgmt_key; | ||
1171 | } wext; | ||
1172 | #endif | ||
1173 | }; | ||
1174 | |||
1175 | /** | ||
1176 | * wdev_priv - return wiphy priv from wireless_dev | ||
1177 | * | ||
1178 | * @wdev: The wireless device whose wiphy's priv pointer to return | ||
1179 | */ | ||
1180 | static inline void *wdev_priv(struct wireless_dev *wdev) | ||
1181 | { | ||
1182 | BUG_ON(!wdev); | ||
1183 | return wiphy_priv(wdev->wiphy); | ||
1184 | } | ||
1185 | |||
1186 | /* | ||
1187 | * Utility functions | ||
1188 | */ | ||
1189 | |||
1190 | /** | ||
1191 | * ieee80211_channel_to_frequency - convert channel number to frequency | ||
1192 | */ | ||
1193 | extern int ieee80211_channel_to_frequency(int chan); | ||
1194 | |||
1195 | /** | ||
1196 | * ieee80211_frequency_to_channel - convert frequency to channel number | ||
1197 | */ | ||
1198 | extern int ieee80211_frequency_to_channel(int freq); | ||
1199 | |||
1200 | /* | ||
1201 | * Name indirection necessary because the ieee80211 code also has | ||
1202 | * a function named "ieee80211_get_channel", so if you include | ||
1203 | * cfg80211's header file you get cfg80211's version, if you try | ||
1204 | * to include both header files you'll (rightfully!) get a symbol | ||
1205 | * clash. | ||
1206 | */ | ||
1207 | extern struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy, | ||
1208 | int freq); | ||
1209 | /** | ||
1210 | * ieee80211_get_channel - get channel struct from wiphy for specified frequency | ||
1211 | */ | ||
1212 | static inline struct ieee80211_channel * | ||
1213 | ieee80211_get_channel(struct wiphy *wiphy, int freq) | ||
1214 | { | ||
1215 | return __ieee80211_get_channel(wiphy, freq); | ||
1216 | } | ||
1217 | |||
1218 | /** | ||
1219 | * ieee80211_get_response_rate - get basic rate for a given rate | ||
1220 | * | ||
1221 | * @sband: the band to look for rates in | ||
1222 | * @basic_rates: bitmap of basic rates | ||
1223 | * @bitrate: the bitrate for which to find the basic rate | ||
1224 | * | ||
1225 | * This function returns the basic rate corresponding to a given | ||
1226 | * bitrate, that is the next lower bitrate contained in the basic | ||
1227 | * rate map, which is, for this function, given as a bitmap of | ||
1228 | * indices of rates in the band's bitrate table. | ||
1229 | */ | ||
1230 | struct ieee80211_rate * | ||
1231 | ieee80211_get_response_rate(struct ieee80211_supported_band *sband, | ||
1232 | u32 basic_rates, int bitrate); | ||
1233 | |||
1234 | /* | ||
1235 | * Radiotap parsing functions -- for controlled injection support | ||
1236 | * | ||
1237 | * Implemented in net/wireless/radiotap.c | ||
1238 | * Documentation in Documentation/networking/radiotap-headers.txt | ||
1239 | */ | ||
1240 | |||
1241 | /** | ||
1242 | * struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args | ||
1243 | * @rtheader: pointer to the radiotap header we are walking through | ||
1244 | * @max_length: length of radiotap header in cpu byte ordering | ||
1245 | * @this_arg_index: IEEE80211_RADIOTAP_... index of current arg | ||
1246 | * @this_arg: pointer to current radiotap arg | ||
1247 | * @arg_index: internal next argument index | ||
1248 | * @arg: internal next argument pointer | ||
1249 | * @next_bitmap: internal pointer to next present u32 | ||
1250 | * @bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present | ||
1251 | */ | ||
1252 | |||
1253 | struct ieee80211_radiotap_iterator { | ||
1254 | struct ieee80211_radiotap_header *rtheader; | ||
1255 | int max_length; | ||
1256 | int this_arg_index; | ||
1257 | u8 *this_arg; | ||
1258 | |||
1259 | int arg_index; | ||
1260 | u8 *arg; | ||
1261 | __le32 *next_bitmap; | ||
1262 | u32 bitmap_shifter; | ||
1263 | }; | ||
1264 | |||
1265 | extern int ieee80211_radiotap_iterator_init( | ||
1266 | struct ieee80211_radiotap_iterator *iterator, | ||
1267 | struct ieee80211_radiotap_header *radiotap_header, | ||
1268 | int max_length); | ||
1269 | |||
1270 | extern int ieee80211_radiotap_iterator_next( | ||
1271 | struct ieee80211_radiotap_iterator *iterator); | ||
1272 | |||
1273 | extern const unsigned char rfc1042_header[6]; | ||
1274 | extern const unsigned char bridge_tunnel_header[6]; | ||
1275 | |||
1276 | /** | ||
1277 | * ieee80211_get_hdrlen_from_skb - get header length from data | ||
1278 | * | ||
1279 | * Given an skb with a raw 802.11 header at the data pointer this function | ||
1280 | * returns the 802.11 header length in bytes (not including encryption | ||
1281 | * headers). If the data in the sk_buff is too short to contain a valid 802.11 | ||
1282 | * header the function returns 0. | ||
1283 | * | ||
1284 | * @skb: the frame | ||
1285 | */ | ||
1286 | unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb); | ||
1287 | |||
1288 | /** | ||
1289 | * ieee80211_hdrlen - get header length in bytes from frame control | ||
1290 | * @fc: frame control field in little-endian format | ||
1291 | */ | ||
1292 | unsigned int ieee80211_hdrlen(__le16 fc); | ||
1293 | |||
1294 | /** | ||
1295 | * ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3 | ||
1296 | * @skb: the 802.11 data frame | ||
1297 | * @addr: the device MAC address | ||
1298 | * @iftype: the virtual interface type | ||
1299 | */ | ||
1300 | int ieee80211_data_to_8023(struct sk_buff *skb, u8 *addr, | ||
1301 | enum nl80211_iftype iftype); | ||
1302 | |||
1303 | /** | ||
1304 | * ieee80211_data_from_8023 - convert an 802.3 frame to 802.11 | ||
1305 | * @skb: the 802.3 frame | ||
1306 | * @addr: the device MAC address | ||
1307 | * @iftype: the virtual interface type | ||
1308 | * @bssid: the network bssid (used only for iftype STATION and ADHOC) | ||
1309 | * @qos: build 802.11 QoS data frame | ||
1310 | */ | ||
1311 | int ieee80211_data_from_8023(struct sk_buff *skb, u8 *addr, | ||
1312 | enum nl80211_iftype iftype, u8 *bssid, bool qos); | ||
1313 | |||
1314 | /** | ||
1315 | * cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame | ||
1316 | * @skb: the data frame | ||
1317 | */ | ||
1318 | unsigned int cfg80211_classify8021d(struct sk_buff *skb); | ||
1319 | |||
1320 | /* | ||
1321 | * Regulatory helper functions for wiphys | ||
1322 | */ | ||
1323 | |||
1324 | /** | ||
1325 | * regulatory_hint - driver hint to the wireless core a regulatory domain | ||
1326 | * @wiphy: the wireless device giving the hint (used only for reporting | ||
1327 | * conflicts) | ||
1328 | * @alpha2: the ISO/IEC 3166 alpha2 the driver claims its regulatory domain | ||
1329 | * should be in. If @rd is set this should be NULL. Note that if you | ||
1330 | * set this to NULL you should still set rd->alpha2 to some accepted | ||
1331 | * alpha2. | ||
1332 | * | ||
1333 | * Wireless drivers can use this function to hint to the wireless core | ||
1334 | * what it believes should be the current regulatory domain by | ||
1335 | * giving it an ISO/IEC 3166 alpha2 country code it knows its regulatory | ||
1336 | * domain should be in or by providing a completely build regulatory domain. | ||
1337 | * If the driver provides an ISO/IEC 3166 alpha2 userspace will be queried | ||
1338 | * for a regulatory domain structure for the respective country. | ||
1339 | * | ||
1340 | * The wiphy must have been registered to cfg80211 prior to this call. | ||
1341 | * For cfg80211 drivers this means you must first use wiphy_register(), | ||
1342 | * for mac80211 drivers you must first use ieee80211_register_hw(). | ||
1343 | * | ||
1344 | * Drivers should check the return value, its possible you can get | ||
1345 | * an -ENOMEM. | ||
1346 | */ | ||
1347 | extern int regulatory_hint(struct wiphy *wiphy, const char *alpha2); | ||
1348 | |||
1349 | /** | ||
1350 | * regulatory_hint_11d - hints a country IE as a regulatory domain | ||
1351 | * @wiphy: the wireless device giving the hint (used only for reporting | ||
1352 | * conflicts) | ||
1353 | * @country_ie: pointer to the country IE | ||
1354 | * @country_ie_len: length of the country IE | ||
1355 | * | ||
1356 | * We will intersect the rd with the what CRDA tells us should apply | ||
1357 | * for the alpha2 this country IE belongs to, this prevents APs from | ||
1358 | * sending us incorrect or outdated information against a country. | ||
1359 | */ | ||
1360 | extern void regulatory_hint_11d(struct wiphy *wiphy, | ||
1361 | u8 *country_ie, | ||
1362 | u8 country_ie_len); | ||
1363 | /** | ||
1364 | * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain | ||
1365 | * @wiphy: the wireless device we want to process the regulatory domain on | ||
1366 | * @regd: the custom regulatory domain to use for this wiphy | ||
1367 | * | ||
1368 | * Drivers can sometimes have custom regulatory domains which do not apply | ||
1369 | * to a specific country. Drivers can use this to apply such custom regulatory | ||
1370 | * domains. This routine must be called prior to wiphy registration. The | ||
1371 | * custom regulatory domain will be trusted completely and as such previous | ||
1372 | * default channel settings will be disregarded. If no rule is found for a | ||
1373 | * channel on the regulatory domain the channel will be disabled. | ||
1374 | */ | ||
1375 | extern void wiphy_apply_custom_regulatory( | ||
1376 | struct wiphy *wiphy, | ||
1377 | const struct ieee80211_regdomain *regd); | ||
1378 | |||
1379 | /** | ||
1380 | * freq_reg_info - get regulatory information for the given frequency | ||
1381 | * @wiphy: the wiphy for which we want to process this rule for | ||
1382 | * @center_freq: Frequency in KHz for which we want regulatory information for | ||
1383 | * @desired_bw_khz: the desired max bandwidth you want to use per | ||
1384 | * channel. Note that this is still 20 MHz if you want to use HT40 | ||
1385 | * as HT40 makes use of two channels for its 40 MHz width bandwidth. | ||
1386 | * If set to 0 we'll assume you want the standard 20 MHz. | ||
1387 | * @reg_rule: the regulatory rule which we have for this frequency | ||
1388 | * | ||
1389 | * Use this function to get the regulatory rule for a specific frequency on | ||
1390 | * a given wireless device. If the device has a specific regulatory domain | ||
1391 | * it wants to follow we respect that unless a country IE has been received | ||
1392 | * and processed already. | ||
1393 | * | ||
1394 | * Returns 0 if it was able to find a valid regulatory rule which does | ||
1395 | * apply to the given center_freq otherwise it returns non-zero. It will | ||
1396 | * also return -ERANGE if we determine the given center_freq does not even have | ||
1397 | * a regulatory rule for a frequency range in the center_freq's band. See | ||
1398 | * freq_in_rule_band() for our current definition of a band -- this is purely | ||
1399 | * subjective and right now its 802.11 specific. | ||
1400 | */ | ||
1401 | extern int freq_reg_info(struct wiphy *wiphy, | ||
1402 | u32 center_freq, | ||
1403 | u32 desired_bw_khz, | ||
1404 | const struct ieee80211_reg_rule **reg_rule); | ||
1405 | |||
1406 | /* | ||
1407 | * Temporary wext handlers & helper functions | ||
1408 | * | ||
1409 | * In the future cfg80211 will simply assign the entire wext handler | ||
1410 | * structure to netdevs it manages, but we're not there yet. | ||
1411 | */ | ||
824 | int cfg80211_wext_giwname(struct net_device *dev, | 1412 | int cfg80211_wext_giwname(struct net_device *dev, |
825 | struct iw_request_info *info, | 1413 | struct iw_request_info *info, |
826 | char *name, char *extra); | 1414 | char *name, char *extra); |
@@ -834,9 +1422,72 @@ int cfg80211_wext_siwscan(struct net_device *dev, | |||
834 | int cfg80211_wext_giwscan(struct net_device *dev, | 1422 | int cfg80211_wext_giwscan(struct net_device *dev, |
835 | struct iw_request_info *info, | 1423 | struct iw_request_info *info, |
836 | struct iw_point *data, char *extra); | 1424 | struct iw_point *data, char *extra); |
1425 | int cfg80211_wext_siwmlme(struct net_device *dev, | ||
1426 | struct iw_request_info *info, | ||
1427 | struct iw_point *data, char *extra); | ||
837 | int cfg80211_wext_giwrange(struct net_device *dev, | 1428 | int cfg80211_wext_giwrange(struct net_device *dev, |
838 | struct iw_request_info *info, | 1429 | struct iw_request_info *info, |
839 | struct iw_point *data, char *extra); | 1430 | struct iw_point *data, char *extra); |
1431 | int cfg80211_ibss_wext_siwfreq(struct net_device *dev, | ||
1432 | struct iw_request_info *info, | ||
1433 | struct iw_freq *freq, char *extra); | ||
1434 | int cfg80211_ibss_wext_giwfreq(struct net_device *dev, | ||
1435 | struct iw_request_info *info, | ||
1436 | struct iw_freq *freq, char *extra); | ||
1437 | int cfg80211_ibss_wext_siwessid(struct net_device *dev, | ||
1438 | struct iw_request_info *info, | ||
1439 | struct iw_point *data, char *ssid); | ||
1440 | int cfg80211_ibss_wext_giwessid(struct net_device *dev, | ||
1441 | struct iw_request_info *info, | ||
1442 | struct iw_point *data, char *ssid); | ||
1443 | int cfg80211_ibss_wext_siwap(struct net_device *dev, | ||
1444 | struct iw_request_info *info, | ||
1445 | struct sockaddr *ap_addr, char *extra); | ||
1446 | int cfg80211_ibss_wext_giwap(struct net_device *dev, | ||
1447 | struct iw_request_info *info, | ||
1448 | struct sockaddr *ap_addr, char *extra); | ||
1449 | |||
1450 | struct ieee80211_channel *cfg80211_wext_freq(struct wiphy *wiphy, | ||
1451 | struct iw_freq *freq); | ||
1452 | |||
1453 | int cfg80211_wext_siwrts(struct net_device *dev, | ||
1454 | struct iw_request_info *info, | ||
1455 | struct iw_param *rts, char *extra); | ||
1456 | int cfg80211_wext_giwrts(struct net_device *dev, | ||
1457 | struct iw_request_info *info, | ||
1458 | struct iw_param *rts, char *extra); | ||
1459 | int cfg80211_wext_siwfrag(struct net_device *dev, | ||
1460 | struct iw_request_info *info, | ||
1461 | struct iw_param *frag, char *extra); | ||
1462 | int cfg80211_wext_giwfrag(struct net_device *dev, | ||
1463 | struct iw_request_info *info, | ||
1464 | struct iw_param *frag, char *extra); | ||
1465 | int cfg80211_wext_siwretry(struct net_device *dev, | ||
1466 | struct iw_request_info *info, | ||
1467 | struct iw_param *retry, char *extra); | ||
1468 | int cfg80211_wext_giwretry(struct net_device *dev, | ||
1469 | struct iw_request_info *info, | ||
1470 | struct iw_param *retry, char *extra); | ||
1471 | int cfg80211_wext_siwencodeext(struct net_device *dev, | ||
1472 | struct iw_request_info *info, | ||
1473 | struct iw_point *erq, char *extra); | ||
1474 | int cfg80211_wext_siwencode(struct net_device *dev, | ||
1475 | struct iw_request_info *info, | ||
1476 | struct iw_point *erq, char *keybuf); | ||
1477 | int cfg80211_wext_giwencode(struct net_device *dev, | ||
1478 | struct iw_request_info *info, | ||
1479 | struct iw_point *erq, char *keybuf); | ||
1480 | int cfg80211_wext_siwtxpower(struct net_device *dev, | ||
1481 | struct iw_request_info *info, | ||
1482 | union iwreq_data *data, char *keybuf); | ||
1483 | int cfg80211_wext_giwtxpower(struct net_device *dev, | ||
1484 | struct iw_request_info *info, | ||
1485 | union iwreq_data *data, char *keybuf); | ||
1486 | |||
1487 | /* | ||
1488 | * callbacks for asynchronous cfg80211 methods, notification | ||
1489 | * functions and BSS handling helpers | ||
1490 | */ | ||
840 | 1491 | ||
841 | /** | 1492 | /** |
842 | * cfg80211_scan_done - notify that scan finished | 1493 | * cfg80211_scan_done - notify that scan finished |
@@ -864,6 +1515,14 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy, | |||
864 | struct ieee80211_mgmt *mgmt, size_t len, | 1515 | struct ieee80211_mgmt *mgmt, size_t len, |
865 | s32 signal, gfp_t gfp); | 1516 | s32 signal, gfp_t gfp); |
866 | 1517 | ||
1518 | struct cfg80211_bss* | ||
1519 | cfg80211_inform_bss(struct wiphy *wiphy, | ||
1520 | struct ieee80211_channel *channel, | ||
1521 | const u8 *bssid, | ||
1522 | u64 timestamp, u16 capability, u16 beacon_interval, | ||
1523 | const u8 *ie, size_t ielen, | ||
1524 | s32 signal, gfp_t gfp); | ||
1525 | |||
867 | struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy, | 1526 | struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy, |
868 | struct ieee80211_channel *channel, | 1527 | struct ieee80211_channel *channel, |
869 | const u8 *bssid, | 1528 | const u8 *bssid, |
@@ -883,6 +1542,7 @@ struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy, | |||
883 | const u8 *meshid, size_t meshidlen, | 1542 | const u8 *meshid, size_t meshidlen, |
884 | const u8 *meshcfg); | 1543 | const u8 *meshcfg); |
885 | void cfg80211_put_bss(struct cfg80211_bss *bss); | 1544 | void cfg80211_put_bss(struct cfg80211_bss *bss); |
1545 | |||
886 | /** | 1546 | /** |
887 | * cfg80211_unlink_bss - unlink BSS from internal data structures | 1547 | * cfg80211_unlink_bss - unlink BSS from internal data structures |
888 | * @wiphy: the wiphy | 1548 | * @wiphy: the wiphy |
@@ -902,44 +1562,62 @@ void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *bss); | |||
902 | * @len: length of the frame data | 1562 | * @len: length of the frame data |
903 | * | 1563 | * |
904 | * This function is called whenever an authentication has been processed in | 1564 | * This function is called whenever an authentication has been processed in |
905 | * station mode. | 1565 | * station mode. The driver is required to call either this function or |
1566 | * cfg80211_send_auth_timeout() to indicate the result of cfg80211_ops::auth() | ||
1567 | * call. | ||
906 | */ | 1568 | */ |
907 | void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len); | 1569 | void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len); |
908 | 1570 | ||
909 | /** | 1571 | /** |
1572 | * cfg80211_send_auth_timeout - notification of timed out authentication | ||
1573 | * @dev: network device | ||
1574 | * @addr: The MAC address of the device with which the authentication timed out | ||
1575 | */ | ||
1576 | void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr); | ||
1577 | |||
1578 | /** | ||
910 | * cfg80211_send_rx_assoc - notification of processed association | 1579 | * cfg80211_send_rx_assoc - notification of processed association |
911 | * @dev: network device | 1580 | * @dev: network device |
912 | * @buf: (re)association response frame (header + body) | 1581 | * @buf: (re)association response frame (header + body) |
913 | * @len: length of the frame data | 1582 | * @len: length of the frame data |
914 | * | 1583 | * |
915 | * This function is called whenever a (re)association response has been | 1584 | * This function is called whenever a (re)association response has been |
916 | * processed in station mode. | 1585 | * processed in station mode. The driver is required to call either this |
1586 | * function or cfg80211_send_assoc_timeout() to indicate the result of | ||
1587 | * cfg80211_ops::assoc() call. | ||
917 | */ | 1588 | */ |
918 | void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len); | 1589 | void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len); |
919 | 1590 | ||
920 | /** | 1591 | /** |
921 | * cfg80211_send_rx_deauth - notification of processed deauthentication | 1592 | * cfg80211_send_assoc_timeout - notification of timed out association |
1593 | * @dev: network device | ||
1594 | * @addr: The MAC address of the device with which the association timed out | ||
1595 | */ | ||
1596 | void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr); | ||
1597 | |||
1598 | /** | ||
1599 | * cfg80211_send_deauth - notification of processed deauthentication | ||
922 | * @dev: network device | 1600 | * @dev: network device |
923 | * @buf: deauthentication frame (header + body) | 1601 | * @buf: deauthentication frame (header + body) |
924 | * @len: length of the frame data | 1602 | * @len: length of the frame data |
925 | * | 1603 | * |
926 | * This function is called whenever deauthentication has been processed in | 1604 | * This function is called whenever deauthentication has been processed in |
927 | * station mode. | 1605 | * station mode. This includes both received deauthentication frames and |
1606 | * locally generated ones. | ||
928 | */ | 1607 | */ |
929 | void cfg80211_send_rx_deauth(struct net_device *dev, const u8 *buf, | 1608 | void cfg80211_send_deauth(struct net_device *dev, const u8 *buf, size_t len); |
930 | size_t len); | ||
931 | 1609 | ||
932 | /** | 1610 | /** |
933 | * cfg80211_send_rx_disassoc - notification of processed disassociation | 1611 | * cfg80211_send_disassoc - notification of processed disassociation |
934 | * @dev: network device | 1612 | * @dev: network device |
935 | * @buf: disassociation response frame (header + body) | 1613 | * @buf: disassociation response frame (header + body) |
936 | * @len: length of the frame data | 1614 | * @len: length of the frame data |
937 | * | 1615 | * |
938 | * This function is called whenever disassociation has been processed in | 1616 | * This function is called whenever disassociation has been processed in |
939 | * station mode. | 1617 | * station mode. This includes both received disassociation frames and locally |
1618 | * generated ones. | ||
940 | */ | 1619 | */ |
941 | void cfg80211_send_rx_disassoc(struct net_device *dev, const u8 *buf, | 1620 | void cfg80211_send_disassoc(struct net_device *dev, const u8 *buf, size_t len); |
942 | size_t len); | ||
943 | 1621 | ||
944 | /** | 1622 | /** |
945 | * cfg80211_hold_bss - exclude bss from expiration | 1623 | * cfg80211_hold_bss - exclude bss from expiration |
@@ -958,4 +1636,55 @@ void cfg80211_hold_bss(struct cfg80211_bss *bss); | |||
958 | */ | 1636 | */ |
959 | void cfg80211_unhold_bss(struct cfg80211_bss *bss); | 1637 | void cfg80211_unhold_bss(struct cfg80211_bss *bss); |
960 | 1638 | ||
1639 | /** | ||
1640 | * cfg80211_michael_mic_failure - notification of Michael MIC failure (TKIP) | ||
1641 | * @dev: network device | ||
1642 | * @addr: The source MAC address of the frame | ||
1643 | * @key_type: The key type that the received frame used | ||
1644 | * @key_id: Key identifier (0..3) | ||
1645 | * @tsc: The TSC value of the frame that generated the MIC failure (6 octets) | ||
1646 | * | ||
1647 | * This function is called whenever the local MAC detects a MIC failure in a | ||
1648 | * received frame. This matches with MLME-MICHAELMICFAILURE.indication() | ||
1649 | * primitive. | ||
1650 | */ | ||
1651 | void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr, | ||
1652 | enum nl80211_key_type key_type, int key_id, | ||
1653 | const u8 *tsc); | ||
1654 | |||
1655 | /** | ||
1656 | * cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS | ||
1657 | * | ||
1658 | * @dev: network device | ||
1659 | * @bssid: the BSSID of the IBSS joined | ||
1660 | * @gfp: allocation flags | ||
1661 | * | ||
1662 | * This function notifies cfg80211 that the device joined an IBSS or | ||
1663 | * switched to a different BSSID. Before this function can be called, | ||
1664 | * either a beacon has to have been received from the IBSS, or one of | ||
1665 | * the cfg80211_inform_bss{,_frame} functions must have been called | ||
1666 | * with the locally generated beacon -- this guarantees that there is | ||
1667 | * always a scan result for this IBSS. cfg80211 will handle the rest. | ||
1668 | */ | ||
1669 | void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp); | ||
1670 | |||
1671 | /** | ||
1672 | * wiphy_rfkill_set_hw_state - notify cfg80211 about hw block state | ||
1673 | * @wiphy: the wiphy | ||
1674 | * @blocked: block status | ||
1675 | */ | ||
1676 | void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked); | ||
1677 | |||
1678 | /** | ||
1679 | * wiphy_rfkill_start_polling - start polling rfkill | ||
1680 | * @wiphy: the wiphy | ||
1681 | */ | ||
1682 | void wiphy_rfkill_start_polling(struct wiphy *wiphy); | ||
1683 | |||
1684 | /** | ||
1685 | * wiphy_rfkill_stop_polling - stop polling rfkill | ||
1686 | * @wiphy: the wiphy | ||
1687 | */ | ||
1688 | void wiphy_rfkill_stop_polling(struct wiphy *wiphy); | ||
1689 | |||
961 | #endif /* __NET_CFG80211_H */ | 1690 | #endif /* __NET_CFG80211_H */ |