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 */ |
