1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2704232c2SJohannes Berg #ifndef __NET_CFG80211_H 3704232c2SJohannes Berg #define __NET_CFG80211_H 4d3236553SJohannes Berg /* 5d3236553SJohannes Berg * 802.11 device and configuration interface 6d3236553SJohannes Berg * 7026331c4SJouni Malinen * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> 82740f0cfSJohannes Berg * Copyright 2013-2014 Intel Mobile Communications GmbH 98585989dSLuca Coelho * Copyright 2015-2017 Intel Deutschland GmbH 107011ba58SSara Sharon * Copyright (C) 2018-2019 Intel Corporation 11d3236553SJohannes Berg */ 12704232c2SJohannes Berg 13d3236553SJohannes Berg #include <linux/netdevice.h> 14d3236553SJohannes Berg #include <linux/debugfs.h> 15d3236553SJohannes Berg #include <linux/list.h> 16187f1882SPaul Gortmaker #include <linux/bug.h> 17704232c2SJohannes Berg #include <linux/netlink.h> 18704232c2SJohannes Berg #include <linux/skbuff.h> 1955682965SJohannes Berg #include <linux/nl80211.h> 202a519311SJohannes Berg #include <linux/if_ether.h> 212a519311SJohannes Berg #include <linux/ieee80211.h> 222a0e047eSJohannes Berg #include <linux/net.h> 23d3236553SJohannes Berg #include <net/regulatory.h> 24d3236553SJohannes Berg 25d70e9693SJohannes Berg /** 26d70e9693SJohannes Berg * DOC: Introduction 27d70e9693SJohannes Berg * 28d70e9693SJohannes Berg * cfg80211 is the configuration API for 802.11 devices in Linux. It bridges 29d70e9693SJohannes Berg * userspace and drivers, and offers some utility functionality associated 30d70e9693SJohannes Berg * with 802.11. cfg80211 must, directly or indirectly via mac80211, be used 31d70e9693SJohannes Berg * by all modern wireless drivers in Linux, so that they offer a consistent 32d70e9693SJohannes Berg * API through nl80211. For backward compatibility, cfg80211 also offers 33d70e9693SJohannes Berg * wireless extensions to userspace, but hides them from drivers completely. 34d70e9693SJohannes Berg * 35d70e9693SJohannes Berg * Additionally, cfg80211 contains code to help enforce regulatory spectrum 36d70e9693SJohannes Berg * use restrictions. 37d70e9693SJohannes Berg */ 38d70e9693SJohannes Berg 39d70e9693SJohannes Berg 40d70e9693SJohannes Berg /** 41d70e9693SJohannes Berg * DOC: Device registration 42d70e9693SJohannes Berg * 43d70e9693SJohannes Berg * In order for a driver to use cfg80211, it must register the hardware device 44d70e9693SJohannes Berg * with cfg80211. This happens through a number of hardware capability structs 45d70e9693SJohannes Berg * described below. 46d70e9693SJohannes Berg * 47d70e9693SJohannes Berg * The fundamental structure for each device is the 'wiphy', of which each 48d70e9693SJohannes Berg * instance describes a physical wireless device connected to the system. Each 49d70e9693SJohannes Berg * such wiphy can have zero, one, or many virtual interfaces associated with 50d70e9693SJohannes Berg * it, which need to be identified as such by pointing the network interface's 51d70e9693SJohannes Berg * @ieee80211_ptr pointer to a &struct wireless_dev which further describes 52d70e9693SJohannes Berg * the wireless part of the interface, normally this struct is embedded in the 53d70e9693SJohannes Berg * network interface's private data area. Drivers can optionally allow creating 54d70e9693SJohannes Berg * or destroying virtual interfaces on the fly, but without at least one or the 55d70e9693SJohannes Berg * ability to create some the wireless device isn't useful. 56d70e9693SJohannes Berg * 57d70e9693SJohannes Berg * Each wiphy structure contains device capability information, and also has 58d70e9693SJohannes Berg * a pointer to the various operations the driver offers. The definitions and 59d70e9693SJohannes Berg * structures here describe these capabilities in detail. 60d70e9693SJohannes Berg */ 61d70e9693SJohannes Berg 629f5e8f6eSJohannes Berg struct wiphy; 639f5e8f6eSJohannes Berg 64704232c2SJohannes Berg /* 65d3236553SJohannes Berg * wireless hardware capability structures 66d3236553SJohannes Berg */ 67d3236553SJohannes Berg 68d3236553SJohannes Berg /** 69d3236553SJohannes Berg * enum ieee80211_channel_flags - channel flags 70d3236553SJohannes Berg * 71d3236553SJohannes Berg * Channel flags set by the regulatory control code. 72d3236553SJohannes Berg * 73d3236553SJohannes Berg * @IEEE80211_CHAN_DISABLED: This channel is disabled. 748fe02e16SLuis R. Rodriguez * @IEEE80211_CHAN_NO_IR: do not initiate radiation, this includes 758fe02e16SLuis R. Rodriguez * sending probe requests or beaconing. 76d3236553SJohannes Berg * @IEEE80211_CHAN_RADAR: Radar detection is required on this channel. 77689da1b3SLuis R. Rodriguez * @IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel 78d3236553SJohannes Berg * is not permitted. 79689da1b3SLuis R. Rodriguez * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel 80d3236553SJohannes Berg * is not permitted. 8103f6b084SSeth Forshee * @IEEE80211_CHAN_NO_OFDM: OFDM is not allowed on this channel. 82c7a6ee27SJohannes Berg * @IEEE80211_CHAN_NO_80MHZ: If the driver supports 80 MHz on the band, 83c7a6ee27SJohannes Berg * this flag indicates that an 80 MHz channel cannot use this 84c7a6ee27SJohannes Berg * channel as the control or any of the secondary channels. 85c7a6ee27SJohannes Berg * This may be due to the driver or due to regulatory bandwidth 86c7a6ee27SJohannes Berg * restrictions. 87c7a6ee27SJohannes Berg * @IEEE80211_CHAN_NO_160MHZ: If the driver supports 160 MHz on the band, 88c7a6ee27SJohannes Berg * this flag indicates that an 160 MHz channel cannot use this 89c7a6ee27SJohannes Berg * channel as the control or any of the secondary channels. 90c7a6ee27SJohannes Berg * This may be due to the driver or due to regulatory bandwidth 91c7a6ee27SJohannes Berg * restrictions. 92570dbde1SDavid Spinadel * @IEEE80211_CHAN_INDOOR_ONLY: see %NL80211_FREQUENCY_ATTR_INDOOR_ONLY 9306f207fcSArik Nemtsov * @IEEE80211_CHAN_IR_CONCURRENT: see %NL80211_FREQUENCY_ATTR_IR_CONCURRENT 94ea077c1cSRostislav Lisovy * @IEEE80211_CHAN_NO_20MHZ: 20 MHz bandwidth is not permitted 95ea077c1cSRostislav Lisovy * on this channel. 96ea077c1cSRostislav Lisovy * @IEEE80211_CHAN_NO_10MHZ: 10 MHz bandwidth is not permitted 97ea077c1cSRostislav Lisovy * on this channel. 98570dbde1SDavid Spinadel * 99d3236553SJohannes Berg */ 100d3236553SJohannes Berg enum ieee80211_channel_flags { 101d3236553SJohannes Berg IEEE80211_CHAN_DISABLED = 1<<0, 1028fe02e16SLuis R. Rodriguez IEEE80211_CHAN_NO_IR = 1<<1, 1038fe02e16SLuis R. Rodriguez /* hole at 1<<2 */ 104d3236553SJohannes Berg IEEE80211_CHAN_RADAR = 1<<3, 105689da1b3SLuis R. Rodriguez IEEE80211_CHAN_NO_HT40PLUS = 1<<4, 106689da1b3SLuis R. Rodriguez IEEE80211_CHAN_NO_HT40MINUS = 1<<5, 10703f6b084SSeth Forshee IEEE80211_CHAN_NO_OFDM = 1<<6, 108c7a6ee27SJohannes Berg IEEE80211_CHAN_NO_80MHZ = 1<<7, 109c7a6ee27SJohannes Berg IEEE80211_CHAN_NO_160MHZ = 1<<8, 110570dbde1SDavid Spinadel IEEE80211_CHAN_INDOOR_ONLY = 1<<9, 11106f207fcSArik Nemtsov IEEE80211_CHAN_IR_CONCURRENT = 1<<10, 112ea077c1cSRostislav Lisovy IEEE80211_CHAN_NO_20MHZ = 1<<11, 113ea077c1cSRostislav Lisovy IEEE80211_CHAN_NO_10MHZ = 1<<12, 114d3236553SJohannes Berg }; 115d3236553SJohannes Berg 116038659e7SLuis R. Rodriguez #define IEEE80211_CHAN_NO_HT40 \ 117689da1b3SLuis R. Rodriguez (IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS) 118038659e7SLuis R. Rodriguez 11904f39047SSimon Wunderlich #define IEEE80211_DFS_MIN_CAC_TIME_MS 60000 12004f39047SSimon Wunderlich #define IEEE80211_DFS_MIN_NOP_TIME_MS (30 * 60 * 1000) 12104f39047SSimon Wunderlich 122d3236553SJohannes Berg /** 123d3236553SJohannes Berg * struct ieee80211_channel - channel definition 124d3236553SJohannes Berg * 125d3236553SJohannes Berg * This structure describes a single channel for use 126d3236553SJohannes Berg * with cfg80211. 127d3236553SJohannes Berg * 128d3236553SJohannes Berg * @center_freq: center frequency in MHz 129d3236553SJohannes Berg * @hw_value: hardware-specific value for the channel 130d3236553SJohannes Berg * @flags: channel flags from &enum ieee80211_channel_flags. 131d3236553SJohannes Berg * @orig_flags: channel flags at registration time, used by regulatory 132d3236553SJohannes Berg * code to support devices with additional restrictions 133d3236553SJohannes Berg * @band: band this channel belongs to. 134d3236553SJohannes Berg * @max_antenna_gain: maximum antenna gain in dBi 135d3236553SJohannes Berg * @max_power: maximum transmission power (in dBm) 136eccc068eSHong Wu * @max_reg_power: maximum regulatory transmission power (in dBm) 137d3236553SJohannes Berg * @beacon_found: helper to regulatory code to indicate when a beacon 138d3236553SJohannes Berg * has been found on this channel. Use regulatory_hint_found_beacon() 13977c2061dSWalter Goldens * to enable this, this is useful only on 5 GHz band. 140d3236553SJohannes Berg * @orig_mag: internal use 141d3236553SJohannes Berg * @orig_mpwr: internal use 14204f39047SSimon Wunderlich * @dfs_state: current state of this channel. Only relevant if radar is required 14304f39047SSimon Wunderlich * on this channel. 14404f39047SSimon Wunderlich * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered. 145089027e5SJanusz Dziedzic * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels. 146d3236553SJohannes Berg */ 147d3236553SJohannes Berg struct ieee80211_channel { 14857fbcce3SJohannes Berg enum nl80211_band band; 1499cf0a0b4SAlexei Avshalom Lazar u32 center_freq; 150d3236553SJohannes Berg u16 hw_value; 151d3236553SJohannes Berg u32 flags; 152d3236553SJohannes Berg int max_antenna_gain; 153d3236553SJohannes Berg int max_power; 154eccc068eSHong Wu int max_reg_power; 155d3236553SJohannes Berg bool beacon_found; 156d3236553SJohannes Berg u32 orig_flags; 157d3236553SJohannes Berg int orig_mag, orig_mpwr; 15804f39047SSimon Wunderlich enum nl80211_dfs_state dfs_state; 15904f39047SSimon Wunderlich unsigned long dfs_state_entered; 160089027e5SJanusz Dziedzic unsigned int dfs_cac_ms; 161d3236553SJohannes Berg }; 162d3236553SJohannes Berg 163d3236553SJohannes Berg /** 164d3236553SJohannes Berg * enum ieee80211_rate_flags - rate flags 165d3236553SJohannes Berg * 166d3236553SJohannes Berg * Hardware/specification flags for rates. These are structured 167d3236553SJohannes Berg * in a way that allows using the same bitrate structure for 168d3236553SJohannes Berg * different bands/PHY modes. 169d3236553SJohannes Berg * 170d3236553SJohannes Berg * @IEEE80211_RATE_SHORT_PREAMBLE: Hardware can send with short 171d3236553SJohannes Berg * preamble on this bitrate; only relevant in 2.4GHz band and 172d3236553SJohannes Berg * with CCK rates. 173d3236553SJohannes Berg * @IEEE80211_RATE_MANDATORY_A: This bitrate is a mandatory rate 174d3236553SJohannes Berg * when used with 802.11a (on the 5 GHz band); filled by the 175d3236553SJohannes Berg * core code when registering the wiphy. 176d3236553SJohannes Berg * @IEEE80211_RATE_MANDATORY_B: This bitrate is a mandatory rate 177d3236553SJohannes Berg * when used with 802.11b (on the 2.4 GHz band); filled by the 178d3236553SJohannes Berg * core code when registering the wiphy. 179d3236553SJohannes Berg * @IEEE80211_RATE_MANDATORY_G: This bitrate is a mandatory rate 180d3236553SJohannes Berg * when used with 802.11g (on the 2.4 GHz band); filled by the 181d3236553SJohannes Berg * core code when registering the wiphy. 182d3236553SJohannes Berg * @IEEE80211_RATE_ERP_G: This is an ERP rate in 802.11g mode. 18330e74732SSimon Wunderlich * @IEEE80211_RATE_SUPPORTS_5MHZ: Rate can be used in 5 MHz mode 18430e74732SSimon Wunderlich * @IEEE80211_RATE_SUPPORTS_10MHZ: Rate can be used in 10 MHz mode 185d3236553SJohannes Berg */ 186d3236553SJohannes Berg enum ieee80211_rate_flags { 187d3236553SJohannes Berg IEEE80211_RATE_SHORT_PREAMBLE = 1<<0, 188d3236553SJohannes Berg IEEE80211_RATE_MANDATORY_A = 1<<1, 189d3236553SJohannes Berg IEEE80211_RATE_MANDATORY_B = 1<<2, 190d3236553SJohannes Berg IEEE80211_RATE_MANDATORY_G = 1<<3, 191d3236553SJohannes Berg IEEE80211_RATE_ERP_G = 1<<4, 19230e74732SSimon Wunderlich IEEE80211_RATE_SUPPORTS_5MHZ = 1<<5, 19330e74732SSimon Wunderlich IEEE80211_RATE_SUPPORTS_10MHZ = 1<<6, 194d3236553SJohannes Berg }; 195d3236553SJohannes Berg 196d3236553SJohannes Berg /** 1976eb18137SDedy Lansky * enum ieee80211_bss_type - BSS type filter 1986eb18137SDedy Lansky * 1996eb18137SDedy Lansky * @IEEE80211_BSS_TYPE_ESS: Infrastructure BSS 2006eb18137SDedy Lansky * @IEEE80211_BSS_TYPE_PBSS: Personal BSS 2016eb18137SDedy Lansky * @IEEE80211_BSS_TYPE_IBSS: Independent BSS 2026eb18137SDedy Lansky * @IEEE80211_BSS_TYPE_MBSS: Mesh BSS 2036eb18137SDedy Lansky * @IEEE80211_BSS_TYPE_ANY: Wildcard value for matching any BSS type 2046eb18137SDedy Lansky */ 2056eb18137SDedy Lansky enum ieee80211_bss_type { 2066eb18137SDedy Lansky IEEE80211_BSS_TYPE_ESS, 2076eb18137SDedy Lansky IEEE80211_BSS_TYPE_PBSS, 2086eb18137SDedy Lansky IEEE80211_BSS_TYPE_IBSS, 2096eb18137SDedy Lansky IEEE80211_BSS_TYPE_MBSS, 2106eb18137SDedy Lansky IEEE80211_BSS_TYPE_ANY 2116eb18137SDedy Lansky }; 2126eb18137SDedy Lansky 2136eb18137SDedy Lansky /** 2146eb18137SDedy Lansky * enum ieee80211_privacy - BSS privacy filter 2156eb18137SDedy Lansky * 2166eb18137SDedy Lansky * @IEEE80211_PRIVACY_ON: privacy bit set 2176eb18137SDedy Lansky * @IEEE80211_PRIVACY_OFF: privacy bit clear 2186eb18137SDedy Lansky * @IEEE80211_PRIVACY_ANY: Wildcard value for matching any privacy setting 2196eb18137SDedy Lansky */ 2206eb18137SDedy Lansky enum ieee80211_privacy { 2216eb18137SDedy Lansky IEEE80211_PRIVACY_ON, 2226eb18137SDedy Lansky IEEE80211_PRIVACY_OFF, 2236eb18137SDedy Lansky IEEE80211_PRIVACY_ANY 2246eb18137SDedy Lansky }; 2256eb18137SDedy Lansky 2266eb18137SDedy Lansky #define IEEE80211_PRIVACY(x) \ 2276eb18137SDedy Lansky ((x) ? IEEE80211_PRIVACY_ON : IEEE80211_PRIVACY_OFF) 2286eb18137SDedy Lansky 2296eb18137SDedy Lansky /** 230d3236553SJohannes Berg * struct ieee80211_rate - bitrate definition 231d3236553SJohannes Berg * 232d3236553SJohannes Berg * This structure describes a bitrate that an 802.11 PHY can 233d3236553SJohannes Berg * operate with. The two values @hw_value and @hw_value_short 234d3236553SJohannes Berg * are only for driver use when pointers to this structure are 235d3236553SJohannes Berg * passed around. 236d3236553SJohannes Berg * 237d3236553SJohannes Berg * @flags: rate-specific flags 238d3236553SJohannes Berg * @bitrate: bitrate in units of 100 Kbps 239d3236553SJohannes Berg * @hw_value: driver/hardware value for this rate 240d3236553SJohannes Berg * @hw_value_short: driver/hardware value for this rate when 241d3236553SJohannes Berg * short preamble is used 242d3236553SJohannes Berg */ 243d3236553SJohannes Berg struct ieee80211_rate { 244d3236553SJohannes Berg u32 flags; 245d3236553SJohannes Berg u16 bitrate; 246d3236553SJohannes Berg u16 hw_value, hw_value_short; 247d3236553SJohannes Berg }; 248d3236553SJohannes Berg 249d3236553SJohannes Berg /** 250d3236553SJohannes Berg * struct ieee80211_sta_ht_cap - STA's HT capabilities 251d3236553SJohannes Berg * 252d3236553SJohannes Berg * This structure describes most essential parameters needed 253d3236553SJohannes Berg * to describe 802.11n HT capabilities for an STA. 254d3236553SJohannes Berg * 255d3236553SJohannes Berg * @ht_supported: is HT supported by the STA 256d3236553SJohannes Berg * @cap: HT capabilities map as described in 802.11n spec 257d3236553SJohannes Berg * @ampdu_factor: Maximum A-MPDU length factor 258d3236553SJohannes Berg * @ampdu_density: Minimum A-MPDU spacing 259d3236553SJohannes Berg * @mcs: Supported MCS rates 260d3236553SJohannes Berg */ 261d3236553SJohannes Berg struct ieee80211_sta_ht_cap { 262d3236553SJohannes Berg u16 cap; /* use IEEE80211_HT_CAP_ */ 263d3236553SJohannes Berg bool ht_supported; 264d3236553SJohannes Berg u8 ampdu_factor; 265d3236553SJohannes Berg u8 ampdu_density; 266d3236553SJohannes Berg struct ieee80211_mcs_info mcs; 267d3236553SJohannes Berg }; 268d3236553SJohannes Berg 269d3236553SJohannes Berg /** 270bf0c111eSMahesh Palivela * struct ieee80211_sta_vht_cap - STA's VHT capabilities 271bf0c111eSMahesh Palivela * 272bf0c111eSMahesh Palivela * This structure describes most essential parameters needed 273bf0c111eSMahesh Palivela * to describe 802.11ac VHT capabilities for an STA. 274bf0c111eSMahesh Palivela * 275bf0c111eSMahesh Palivela * @vht_supported: is VHT supported by the STA 276bf0c111eSMahesh Palivela * @cap: VHT capabilities map as described in 802.11ac spec 277bf0c111eSMahesh Palivela * @vht_mcs: Supported VHT MCS rates 278bf0c111eSMahesh Palivela */ 279bf0c111eSMahesh Palivela struct ieee80211_sta_vht_cap { 280bf0c111eSMahesh Palivela bool vht_supported; 281bf0c111eSMahesh Palivela u32 cap; /* use IEEE80211_VHT_CAP_ */ 282bf0c111eSMahesh Palivela struct ieee80211_vht_mcs_info vht_mcs; 283bf0c111eSMahesh Palivela }; 284bf0c111eSMahesh Palivela 285c4cbaf79SLuca Coelho #define IEEE80211_HE_PPE_THRES_MAX_LEN 25 286c4cbaf79SLuca Coelho 287c4cbaf79SLuca Coelho /** 288c4cbaf79SLuca Coelho * struct ieee80211_sta_he_cap - STA's HE capabilities 289c4cbaf79SLuca Coelho * 290c4cbaf79SLuca Coelho * This structure describes most essential parameters needed 291c4cbaf79SLuca Coelho * to describe 802.11ax HE capabilities for a STA. 292c4cbaf79SLuca Coelho * 293c4cbaf79SLuca Coelho * @has_he: true iff HE data is valid. 294c4cbaf79SLuca Coelho * @he_cap_elem: Fixed portion of the HE capabilities element. 295c4cbaf79SLuca Coelho * @he_mcs_nss_supp: The supported NSS/MCS combinations. 296c4cbaf79SLuca Coelho * @ppe_thres: Holds the PPE Thresholds data. 297c4cbaf79SLuca Coelho */ 298c4cbaf79SLuca Coelho struct ieee80211_sta_he_cap { 299c4cbaf79SLuca Coelho bool has_he; 300c4cbaf79SLuca Coelho struct ieee80211_he_cap_elem he_cap_elem; 301c4cbaf79SLuca Coelho struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp; 302c4cbaf79SLuca Coelho u8 ppe_thres[IEEE80211_HE_PPE_THRES_MAX_LEN]; 303c4cbaf79SLuca Coelho }; 304c4cbaf79SLuca Coelho 305c4cbaf79SLuca Coelho /** 306c4cbaf79SLuca Coelho * struct ieee80211_sband_iftype_data 307c4cbaf79SLuca Coelho * 308c4cbaf79SLuca Coelho * This structure encapsulates sband data that is relevant for the 309c4cbaf79SLuca Coelho * interface types defined in @types_mask. Each type in the 310c4cbaf79SLuca Coelho * @types_mask must be unique across all instances of iftype_data. 311c4cbaf79SLuca Coelho * 312c4cbaf79SLuca Coelho * @types_mask: interface types mask 313c4cbaf79SLuca Coelho * @he_cap: holds the HE capabilities 314c4cbaf79SLuca Coelho */ 315c4cbaf79SLuca Coelho struct ieee80211_sband_iftype_data { 316c4cbaf79SLuca Coelho u16 types_mask; 317c4cbaf79SLuca Coelho struct ieee80211_sta_he_cap he_cap; 318c4cbaf79SLuca Coelho }; 319c4cbaf79SLuca Coelho 320bf0c111eSMahesh Palivela /** 321d3236553SJohannes Berg * struct ieee80211_supported_band - frequency band definition 322d3236553SJohannes Berg * 323d3236553SJohannes Berg * This structure describes a frequency band a wiphy 324d3236553SJohannes Berg * is able to operate in. 325d3236553SJohannes Berg * 326d3236553SJohannes Berg * @channels: Array of channels the hardware can operate in 327d3236553SJohannes Berg * in this band. 328d3236553SJohannes Berg * @band: the band this structure represents 329d3236553SJohannes Berg * @n_channels: Number of channels in @channels 330d3236553SJohannes Berg * @bitrates: Array of bitrates the hardware can operate with 331d3236553SJohannes Berg * in this band. Must be sorted to give a valid "supported 332d3236553SJohannes Berg * rates" IE, i.e. CCK rates first, then OFDM. 333d3236553SJohannes Berg * @n_bitrates: Number of bitrates in @bitrates 334abe37c4bSJohannes Berg * @ht_cap: HT capabilities in this band 335c9a0a302SRobert P. J. Day * @vht_cap: VHT capabilities in this band 336c4cbaf79SLuca Coelho * @n_iftype_data: number of iftype data entries 337c4cbaf79SLuca Coelho * @iftype_data: interface type data entries. Note that the bits in 338c4cbaf79SLuca Coelho * @types_mask inside this structure cannot overlap (i.e. only 339c4cbaf79SLuca Coelho * one occurrence of each type is allowed across all instances of 340c4cbaf79SLuca Coelho * iftype_data). 341d3236553SJohannes Berg */ 342d3236553SJohannes Berg struct ieee80211_supported_band { 343d3236553SJohannes Berg struct ieee80211_channel *channels; 344d3236553SJohannes Berg struct ieee80211_rate *bitrates; 34557fbcce3SJohannes Berg enum nl80211_band band; 346d3236553SJohannes Berg int n_channels; 347d3236553SJohannes Berg int n_bitrates; 348d3236553SJohannes Berg struct ieee80211_sta_ht_cap ht_cap; 349bf0c111eSMahesh Palivela struct ieee80211_sta_vht_cap vht_cap; 350c4cbaf79SLuca Coelho u16 n_iftype_data; 351c4cbaf79SLuca Coelho const struct ieee80211_sband_iftype_data *iftype_data; 352d3236553SJohannes Berg }; 353d3236553SJohannes Berg 354e691ac2fSRafał Miłecki /** 355c4cbaf79SLuca Coelho * ieee80211_get_sband_iftype_data - return sband data for a given iftype 356c4cbaf79SLuca Coelho * @sband: the sband to search for the STA on 357c4cbaf79SLuca Coelho * @iftype: enum nl80211_iftype 358c4cbaf79SLuca Coelho * 359c4cbaf79SLuca Coelho * Return: pointer to struct ieee80211_sband_iftype_data, or NULL is none found 360c4cbaf79SLuca Coelho */ 361c4cbaf79SLuca Coelho static inline const struct ieee80211_sband_iftype_data * 362c4cbaf79SLuca Coelho ieee80211_get_sband_iftype_data(const struct ieee80211_supported_band *sband, 363c4cbaf79SLuca Coelho u8 iftype) 364c4cbaf79SLuca Coelho { 365c4cbaf79SLuca Coelho int i; 366c4cbaf79SLuca Coelho 367c4cbaf79SLuca Coelho if (WARN_ON(iftype >= NL80211_IFTYPE_MAX)) 368c4cbaf79SLuca Coelho return NULL; 369c4cbaf79SLuca Coelho 370c4cbaf79SLuca Coelho for (i = 0; i < sband->n_iftype_data; i++) { 371c4cbaf79SLuca Coelho const struct ieee80211_sband_iftype_data *data = 372c4cbaf79SLuca Coelho &sband->iftype_data[i]; 373c4cbaf79SLuca Coelho 374c4cbaf79SLuca Coelho if (data->types_mask & BIT(iftype)) 375c4cbaf79SLuca Coelho return data; 376c4cbaf79SLuca Coelho } 377c4cbaf79SLuca Coelho 378c4cbaf79SLuca Coelho return NULL; 379c4cbaf79SLuca Coelho } 380c4cbaf79SLuca Coelho 381c4cbaf79SLuca Coelho /** 382c4cbaf79SLuca Coelho * ieee80211_get_he_sta_cap - return HE capabilities for an sband's STA 383c4cbaf79SLuca Coelho * @sband: the sband to search for the STA on 384c4cbaf79SLuca Coelho * 385c4cbaf79SLuca Coelho * Return: pointer to the struct ieee80211_sta_he_cap, or NULL is none found 386c4cbaf79SLuca Coelho */ 387c4cbaf79SLuca Coelho static inline const struct ieee80211_sta_he_cap * 388c4cbaf79SLuca Coelho ieee80211_get_he_sta_cap(const struct ieee80211_supported_band *sband) 389c4cbaf79SLuca Coelho { 390c4cbaf79SLuca Coelho const struct ieee80211_sband_iftype_data *data = 391c4cbaf79SLuca Coelho ieee80211_get_sband_iftype_data(sband, NL80211_IFTYPE_STATION); 392c4cbaf79SLuca Coelho 393c4cbaf79SLuca Coelho if (data && data->he_cap.has_he) 394c4cbaf79SLuca Coelho return &data->he_cap; 395c4cbaf79SLuca Coelho 396c4cbaf79SLuca Coelho return NULL; 397c4cbaf79SLuca Coelho } 398c4cbaf79SLuca Coelho 399c4cbaf79SLuca Coelho /** 400e691ac2fSRafał Miłecki * wiphy_read_of_freq_limits - read frequency limits from device tree 401e691ac2fSRafał Miłecki * 402e691ac2fSRafał Miłecki * @wiphy: the wireless device to get extra limits for 403e691ac2fSRafał Miłecki * 404e691ac2fSRafał Miłecki * Some devices may have extra limitations specified in DT. This may be useful 405e691ac2fSRafał Miłecki * for chipsets that normally support more bands but are limited due to board 406e691ac2fSRafał Miłecki * design (e.g. by antennas or external power amplifier). 407e691ac2fSRafał Miłecki * 408e691ac2fSRafał Miłecki * This function reads info from DT and uses it to *modify* channels (disable 409e691ac2fSRafał Miłecki * unavailable ones). It's usually a *bad* idea to use it in drivers with 410e691ac2fSRafał Miłecki * shared channel data as DT limitations are device specific. You should make 411e691ac2fSRafał Miłecki * sure to call it only if channels in wiphy are copied and can be modified 412e691ac2fSRafał Miłecki * without affecting other devices. 413e691ac2fSRafał Miłecki * 414e691ac2fSRafał Miłecki * As this function access device node it has to be called after set_wiphy_dev. 415e691ac2fSRafał Miłecki * It also modifies channels so they have to be set first. 416e691ac2fSRafał Miłecki * If using this helper, call it before wiphy_register(). 417e691ac2fSRafał Miłecki */ 418e691ac2fSRafał Miłecki #ifdef CONFIG_OF 419e691ac2fSRafał Miłecki void wiphy_read_of_freq_limits(struct wiphy *wiphy); 420e691ac2fSRafał Miłecki #else /* CONFIG_OF */ 421e691ac2fSRafał Miłecki static inline void wiphy_read_of_freq_limits(struct wiphy *wiphy) 422e691ac2fSRafał Miłecki { 423e691ac2fSRafał Miłecki } 424e691ac2fSRafał Miłecki #endif /* !CONFIG_OF */ 425e691ac2fSRafał Miłecki 426e691ac2fSRafał Miłecki 427d3236553SJohannes Berg /* 428d3236553SJohannes Berg * Wireless hardware/device configuration structures and methods 429704232c2SJohannes Berg */ 430704232c2SJohannes Berg 4312ec600d6SLuis Carlos Cobo /** 432d70e9693SJohannes Berg * DOC: Actions and configuration 433d70e9693SJohannes Berg * 434d70e9693SJohannes Berg * Each wireless device and each virtual interface offer a set of configuration 435d70e9693SJohannes Berg * operations and other actions that are invoked by userspace. Each of these 436d70e9693SJohannes Berg * actions is described in the operations structure, and the parameters these 437d70e9693SJohannes Berg * operations use are described separately. 438d70e9693SJohannes Berg * 439d70e9693SJohannes Berg * Additionally, some operations are asynchronous and expect to get status 440d70e9693SJohannes Berg * information via some functions that drivers need to call. 441d70e9693SJohannes Berg * 442d70e9693SJohannes Berg * Scanning and BSS list handling with its associated functionality is described 443d70e9693SJohannes Berg * in a separate chapter. 444d70e9693SJohannes Berg */ 445d70e9693SJohannes Berg 446c6e6a0c8SAviya Erenfeld #define VHT_MUMIMO_GROUPS_DATA_LEN (WLAN_MEMBERSHIP_LEN +\ 447c6e6a0c8SAviya Erenfeld WLAN_USER_POSITION_LEN) 448c6e6a0c8SAviya Erenfeld 449d70e9693SJohannes Berg /** 4502ec600d6SLuis Carlos Cobo * struct vif_params - describes virtual interface parameters 451818a986eSJohannes Berg * @flags: monitor interface flags, unchanged if 0, otherwise 452818a986eSJohannes Berg * %MONITOR_FLAG_CHANGED will be set 4538b787643SFelix Fietkau * @use_4addr: use 4-address frames 454e8f479b1SBen Greear * @macaddr: address to use for this virtual interface. 455e8f479b1SBen Greear * If this parameter is set to zero address the driver may 456e8f479b1SBen Greear * determine the address as needed. 457e8f479b1SBen Greear * This feature is only fully supported by drivers that enable the 458e8f479b1SBen Greear * %NL80211_FEATURE_MAC_ON_CREATE flag. Others may support creating 459e8f479b1SBen Greear ** only p2p devices with specified MAC. 460b0265024SJohannes Berg * @vht_mumimo_groups: MU-MIMO groupID, used for monitoring MU-MIMO packets 461b0265024SJohannes Berg * belonging to that MU-MIMO groupID; %NULL if not changed 462b0265024SJohannes Berg * @vht_mumimo_follow_addr: MU-MIMO follow address, used for monitoring 463b0265024SJohannes Berg * MU-MIMO packets going to the specified station; %NULL if not changed 4642ec600d6SLuis Carlos Cobo */ 4652ec600d6SLuis Carlos Cobo struct vif_params { 466818a986eSJohannes Berg u32 flags; 4678b787643SFelix Fietkau int use_4addr; 4681c18f145SArend van Spriel u8 macaddr[ETH_ALEN]; 469b0265024SJohannes Berg const u8 *vht_mumimo_groups; 470b0265024SJohannes Berg const u8 *vht_mumimo_follow_addr; 4712ec600d6SLuis Carlos Cobo }; 4722ec600d6SLuis Carlos Cobo 47341ade00fSJohannes Berg /** 47441ade00fSJohannes Berg * struct key_params - key information 47541ade00fSJohannes Berg * 47641ade00fSJohannes Berg * Information about a key 47741ade00fSJohannes Berg * 47841ade00fSJohannes Berg * @key: key material 47941ade00fSJohannes Berg * @key_len: length of key material 48041ade00fSJohannes Berg * @cipher: cipher suite selector 48141ade00fSJohannes Berg * @seq: sequence counter (IV/PN) for TKIP and CCMP keys, only used 48241ade00fSJohannes Berg * with the get_key() callback, must be in little endian, 48341ade00fSJohannes Berg * length given by @seq_len. 484abe37c4bSJohannes Berg * @seq_len: length of @seq. 4856cdd3979SAlexander Wetzel * @mode: key install mode (RX_TX, NO_TX or SET_TX) 48641ade00fSJohannes Berg */ 48741ade00fSJohannes Berg struct key_params { 488c1e5f471SJohannes Berg const u8 *key; 489c1e5f471SJohannes Berg const u8 *seq; 49041ade00fSJohannes Berg int key_len; 49141ade00fSJohannes Berg int seq_len; 49241ade00fSJohannes Berg u32 cipher; 4936cdd3979SAlexander Wetzel enum nl80211_key_mode mode; 49441ade00fSJohannes Berg }; 49541ade00fSJohannes Berg 496ed1b6cc7SJohannes Berg /** 497683b6d3bSJohannes Berg * struct cfg80211_chan_def - channel definition 498683b6d3bSJohannes Berg * @chan: the (control) channel 4993d9d1d66SJohannes Berg * @width: channel width 5003d9d1d66SJohannes Berg * @center_freq1: center frequency of first segment 5013d9d1d66SJohannes Berg * @center_freq2: center frequency of second segment 5023d9d1d66SJohannes Berg * (only with 80+80 MHz) 503683b6d3bSJohannes Berg */ 504683b6d3bSJohannes Berg struct cfg80211_chan_def { 505683b6d3bSJohannes Berg struct ieee80211_channel *chan; 5063d9d1d66SJohannes Berg enum nl80211_chan_width width; 5073d9d1d66SJohannes Berg u32 center_freq1; 5083d9d1d66SJohannes Berg u32 center_freq2; 509683b6d3bSJohannes Berg }; 510683b6d3bSJohannes Berg 5113d9d1d66SJohannes Berg /** 5123d9d1d66SJohannes Berg * cfg80211_get_chandef_type - return old channel type from chandef 5133d9d1d66SJohannes Berg * @chandef: the channel definition 5143d9d1d66SJohannes Berg * 5150ae997dcSYacine Belkadi * Return: The old channel type (NOHT, HT20, HT40+/-) from a given 5163d9d1d66SJohannes Berg * chandef, which must have a bandwidth allowing this conversion. 5173d9d1d66SJohannes Berg */ 518683b6d3bSJohannes Berg static inline enum nl80211_channel_type 519683b6d3bSJohannes Berg cfg80211_get_chandef_type(const struct cfg80211_chan_def *chandef) 520683b6d3bSJohannes Berg { 5213d9d1d66SJohannes Berg switch (chandef->width) { 5223d9d1d66SJohannes Berg case NL80211_CHAN_WIDTH_20_NOHT: 5233d9d1d66SJohannes Berg return NL80211_CHAN_NO_HT; 5243d9d1d66SJohannes Berg case NL80211_CHAN_WIDTH_20: 5253d9d1d66SJohannes Berg return NL80211_CHAN_HT20; 5263d9d1d66SJohannes Berg case NL80211_CHAN_WIDTH_40: 5273d9d1d66SJohannes Berg if (chandef->center_freq1 > chandef->chan->center_freq) 5283d9d1d66SJohannes Berg return NL80211_CHAN_HT40PLUS; 5293d9d1d66SJohannes Berg return NL80211_CHAN_HT40MINUS; 5303d9d1d66SJohannes Berg default: 5313d9d1d66SJohannes Berg WARN_ON(1); 5323d9d1d66SJohannes Berg return NL80211_CHAN_NO_HT; 533683b6d3bSJohannes Berg } 5343d9d1d66SJohannes Berg } 5353d9d1d66SJohannes Berg 5363d9d1d66SJohannes Berg /** 5373d9d1d66SJohannes Berg * cfg80211_chandef_create - create channel definition using channel type 5383d9d1d66SJohannes Berg * @chandef: the channel definition struct to fill 5393d9d1d66SJohannes Berg * @channel: the control channel 5403d9d1d66SJohannes Berg * @chantype: the channel type 5413d9d1d66SJohannes Berg * 5423d9d1d66SJohannes Berg * Given a channel type, create a channel definition. 5433d9d1d66SJohannes Berg */ 5443d9d1d66SJohannes Berg void cfg80211_chandef_create(struct cfg80211_chan_def *chandef, 5453d9d1d66SJohannes Berg struct ieee80211_channel *channel, 5463d9d1d66SJohannes Berg enum nl80211_channel_type chantype); 5473d9d1d66SJohannes Berg 5483d9d1d66SJohannes Berg /** 5493d9d1d66SJohannes Berg * cfg80211_chandef_identical - check if two channel definitions are identical 5503d9d1d66SJohannes Berg * @chandef1: first channel definition 5513d9d1d66SJohannes Berg * @chandef2: second channel definition 5523d9d1d66SJohannes Berg * 5530ae997dcSYacine Belkadi * Return: %true if the channels defined by the channel definitions are 5543d9d1d66SJohannes Berg * identical, %false otherwise. 5553d9d1d66SJohannes Berg */ 5563d9d1d66SJohannes Berg static inline bool 5573d9d1d66SJohannes Berg cfg80211_chandef_identical(const struct cfg80211_chan_def *chandef1, 5583d9d1d66SJohannes Berg const struct cfg80211_chan_def *chandef2) 5593d9d1d66SJohannes Berg { 5603d9d1d66SJohannes Berg return (chandef1->chan == chandef2->chan && 5613d9d1d66SJohannes Berg chandef1->width == chandef2->width && 5623d9d1d66SJohannes Berg chandef1->center_freq1 == chandef2->center_freq1 && 5633d9d1d66SJohannes Berg chandef1->center_freq2 == chandef2->center_freq2); 5643d9d1d66SJohannes Berg } 5653d9d1d66SJohannes Berg 5663d9d1d66SJohannes Berg /** 5673d9d1d66SJohannes Berg * cfg80211_chandef_compatible - check if two channel definitions are compatible 5683d9d1d66SJohannes Berg * @chandef1: first channel definition 5693d9d1d66SJohannes Berg * @chandef2: second channel definition 5703d9d1d66SJohannes Berg * 5710ae997dcSYacine Belkadi * Return: %NULL if the given channel definitions are incompatible, 5723d9d1d66SJohannes Berg * chandef1 or chandef2 otherwise. 5733d9d1d66SJohannes Berg */ 5743d9d1d66SJohannes Berg const struct cfg80211_chan_def * 5753d9d1d66SJohannes Berg cfg80211_chandef_compatible(const struct cfg80211_chan_def *chandef1, 5763d9d1d66SJohannes Berg const struct cfg80211_chan_def *chandef2); 577683b6d3bSJohannes Berg 578683b6d3bSJohannes Berg /** 5799f5e8f6eSJohannes Berg * cfg80211_chandef_valid - check if a channel definition is valid 5809f5e8f6eSJohannes Berg * @chandef: the channel definition to check 5810ae997dcSYacine Belkadi * Return: %true if the channel definition is valid. %false otherwise. 5829f5e8f6eSJohannes Berg */ 5839f5e8f6eSJohannes Berg bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef); 5849f5e8f6eSJohannes Berg 5859f5e8f6eSJohannes Berg /** 5869f5e8f6eSJohannes Berg * cfg80211_chandef_usable - check if secondary channels can be used 5879f5e8f6eSJohannes Berg * @wiphy: the wiphy to validate against 5889f5e8f6eSJohannes Berg * @chandef: the channel definition to check 5890ae997dcSYacine Belkadi * @prohibited_flags: the regulatory channel flags that must not be set 5900ae997dcSYacine Belkadi * Return: %true if secondary channels are usable. %false otherwise. 5919f5e8f6eSJohannes Berg */ 5929f5e8f6eSJohannes Berg bool cfg80211_chandef_usable(struct wiphy *wiphy, 5939f5e8f6eSJohannes Berg const struct cfg80211_chan_def *chandef, 5949f5e8f6eSJohannes Berg u32 prohibited_flags); 5959f5e8f6eSJohannes Berg 5969f5e8f6eSJohannes Berg /** 597774f0734SSimon Wunderlich * cfg80211_chandef_dfs_required - checks if radar detection is required 598774f0734SSimon Wunderlich * @wiphy: the wiphy to validate against 599774f0734SSimon Wunderlich * @chandef: the channel definition to check 6002beb6dabSLuciano Coelho * @iftype: the interface type as specified in &enum nl80211_iftype 6012beb6dabSLuciano Coelho * Returns: 6022beb6dabSLuciano Coelho * 1 if radar detection is required, 0 if it is not, < 0 on error 603774f0734SSimon Wunderlich */ 604774f0734SSimon Wunderlich int cfg80211_chandef_dfs_required(struct wiphy *wiphy, 6052beb6dabSLuciano Coelho const struct cfg80211_chan_def *chandef, 606c3d62036SLuciano Coelho enum nl80211_iftype iftype); 607774f0734SSimon Wunderlich 608774f0734SSimon Wunderlich /** 60930e74732SSimon Wunderlich * ieee80211_chandef_rate_flags - returns rate flags for a channel 61030e74732SSimon Wunderlich * 61130e74732SSimon Wunderlich * In some channel types, not all rates may be used - for example CCK 61230e74732SSimon Wunderlich * rates may not be used in 5/10 MHz channels. 61330e74732SSimon Wunderlich * 61430e74732SSimon Wunderlich * @chandef: channel definition for the channel 61530e74732SSimon Wunderlich * 61630e74732SSimon Wunderlich * Returns: rate flags which apply for this channel 61730e74732SSimon Wunderlich */ 61830e74732SSimon Wunderlich static inline enum ieee80211_rate_flags 61930e74732SSimon Wunderlich ieee80211_chandef_rate_flags(struct cfg80211_chan_def *chandef) 62030e74732SSimon Wunderlich { 62130e74732SSimon Wunderlich switch (chandef->width) { 62230e74732SSimon Wunderlich case NL80211_CHAN_WIDTH_5: 62330e74732SSimon Wunderlich return IEEE80211_RATE_SUPPORTS_5MHZ; 62430e74732SSimon Wunderlich case NL80211_CHAN_WIDTH_10: 62530e74732SSimon Wunderlich return IEEE80211_RATE_SUPPORTS_10MHZ; 62630e74732SSimon Wunderlich default: 62730e74732SSimon Wunderlich break; 62830e74732SSimon Wunderlich } 62930e74732SSimon Wunderlich return 0; 63030e74732SSimon Wunderlich } 63130e74732SSimon Wunderlich 63230e74732SSimon Wunderlich /** 6330430c883SSimon Wunderlich * ieee80211_chandef_max_power - maximum transmission power for the chandef 6340430c883SSimon Wunderlich * 6350430c883SSimon Wunderlich * In some regulations, the transmit power may depend on the configured channel 6360430c883SSimon Wunderlich * bandwidth which may be defined as dBm/MHz. This function returns the actual 6370430c883SSimon Wunderlich * max_power for non-standard (20 MHz) channels. 6380430c883SSimon Wunderlich * 6390430c883SSimon Wunderlich * @chandef: channel definition for the channel 6400430c883SSimon Wunderlich * 6410430c883SSimon Wunderlich * Returns: maximum allowed transmission power in dBm for the chandef 6420430c883SSimon Wunderlich */ 6430430c883SSimon Wunderlich static inline int 6440430c883SSimon Wunderlich ieee80211_chandef_max_power(struct cfg80211_chan_def *chandef) 6450430c883SSimon Wunderlich { 6460430c883SSimon Wunderlich switch (chandef->width) { 6470430c883SSimon Wunderlich case NL80211_CHAN_WIDTH_5: 6480430c883SSimon Wunderlich return min(chandef->chan->max_reg_power - 6, 6490430c883SSimon Wunderlich chandef->chan->max_power); 6500430c883SSimon Wunderlich case NL80211_CHAN_WIDTH_10: 6510430c883SSimon Wunderlich return min(chandef->chan->max_reg_power - 3, 6520430c883SSimon Wunderlich chandef->chan->max_power); 6530430c883SSimon Wunderlich default: 6540430c883SSimon Wunderlich break; 6550430c883SSimon Wunderlich } 6560430c883SSimon Wunderlich return chandef->chan->max_power; 6570430c883SSimon Wunderlich } 6580430c883SSimon Wunderlich 6590430c883SSimon Wunderlich /** 66061fa713cSHolger Schurig * enum survey_info_flags - survey information flags 66161fa713cSHolger Schurig * 662abe37c4bSJohannes Berg * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in 66317e5a808SFelix Fietkau * @SURVEY_INFO_IN_USE: channel is currently being used 6644ed20bebSJohannes Berg * @SURVEY_INFO_TIME: active time (in ms) was filled in 6654ed20bebSJohannes Berg * @SURVEY_INFO_TIME_BUSY: busy time was filled in 6664ed20bebSJohannes Berg * @SURVEY_INFO_TIME_EXT_BUSY: extension channel busy time was filled in 6674ed20bebSJohannes Berg * @SURVEY_INFO_TIME_RX: receive time was filled in 6684ed20bebSJohannes Berg * @SURVEY_INFO_TIME_TX: transmit time was filled in 669052536abSJohannes Berg * @SURVEY_INFO_TIME_SCAN: scan time was filled in 670abe37c4bSJohannes Berg * 67161fa713cSHolger Schurig * Used by the driver to indicate which info in &struct survey_info 67261fa713cSHolger Schurig * it has filled in during the get_survey(). 67361fa713cSHolger Schurig */ 67461fa713cSHolger Schurig enum survey_info_flags { 6754ed20bebSJohannes Berg SURVEY_INFO_NOISE_DBM = BIT(0), 6764ed20bebSJohannes Berg SURVEY_INFO_IN_USE = BIT(1), 6774ed20bebSJohannes Berg SURVEY_INFO_TIME = BIT(2), 6784ed20bebSJohannes Berg SURVEY_INFO_TIME_BUSY = BIT(3), 6794ed20bebSJohannes Berg SURVEY_INFO_TIME_EXT_BUSY = BIT(4), 6804ed20bebSJohannes Berg SURVEY_INFO_TIME_RX = BIT(5), 6814ed20bebSJohannes Berg SURVEY_INFO_TIME_TX = BIT(6), 682052536abSJohannes Berg SURVEY_INFO_TIME_SCAN = BIT(7), 68361fa713cSHolger Schurig }; 68461fa713cSHolger Schurig 68561fa713cSHolger Schurig /** 68661fa713cSHolger Schurig * struct survey_info - channel survey response 68761fa713cSHolger Schurig * 68811f78ac3SJohannes Berg * @channel: the channel this survey record reports, may be %NULL for a single 68911f78ac3SJohannes Berg * record to report global statistics 69061fa713cSHolger Schurig * @filled: bitflag of flags from &enum survey_info_flags 69161fa713cSHolger Schurig * @noise: channel noise in dBm. This and all following fields are 69261fa713cSHolger Schurig * optional 6934ed20bebSJohannes Berg * @time: amount of time in ms the radio was turn on (on the channel) 6944ed20bebSJohannes Berg * @time_busy: amount of time the primary channel was sensed busy 6954ed20bebSJohannes Berg * @time_ext_busy: amount of time the extension channel was sensed busy 6964ed20bebSJohannes Berg * @time_rx: amount of time the radio spent receiving data 6974ed20bebSJohannes Berg * @time_tx: amount of time the radio spent transmitting data 698052536abSJohannes Berg * @time_scan: amount of time the radio spent for scanning 69961fa713cSHolger Schurig * 700abe37c4bSJohannes Berg * Used by dump_survey() to report back per-channel survey information. 701abe37c4bSJohannes Berg * 70261fa713cSHolger Schurig * This structure can later be expanded with things like 70361fa713cSHolger Schurig * channel duty cycle etc. 70461fa713cSHolger Schurig */ 70561fa713cSHolger Schurig struct survey_info { 70661fa713cSHolger Schurig struct ieee80211_channel *channel; 7074ed20bebSJohannes Berg u64 time; 7084ed20bebSJohannes Berg u64 time_busy; 7094ed20bebSJohannes Berg u64 time_ext_busy; 7104ed20bebSJohannes Berg u64 time_rx; 7114ed20bebSJohannes Berg u64 time_tx; 712052536abSJohannes Berg u64 time_scan; 71361fa713cSHolger Schurig u32 filled; 71461fa713cSHolger Schurig s8 noise; 71561fa713cSHolger Schurig }; 71661fa713cSHolger Schurig 717b8676221SDavid Spinadel #define CFG80211_MAX_WEP_KEYS 4 718b8676221SDavid Spinadel 71961fa713cSHolger Schurig /** 7205fb628e9SJouni Malinen * struct cfg80211_crypto_settings - Crypto settings 7215fb628e9SJouni Malinen * @wpa_versions: indicates which, if any, WPA versions are enabled 7225fb628e9SJouni Malinen * (from enum nl80211_wpa_versions) 7235fb628e9SJouni Malinen * @cipher_group: group key cipher suite (or 0 if unset) 7245fb628e9SJouni Malinen * @n_ciphers_pairwise: number of AP supported unicast ciphers 7255fb628e9SJouni Malinen * @ciphers_pairwise: unicast key cipher suites 7265fb628e9SJouni Malinen * @n_akm_suites: number of AKM suites 7275fb628e9SJouni Malinen * @akm_suites: AKM suites 7285fb628e9SJouni Malinen * @control_port: Whether user space controls IEEE 802.1X port, i.e., 7295fb628e9SJouni Malinen * sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is 7305fb628e9SJouni Malinen * required to assume that the port is unauthorized until authorized by 7315fb628e9SJouni Malinen * user space. Otherwise, port is marked authorized by default. 7325fb628e9SJouni Malinen * @control_port_ethertype: the control port protocol that should be 7335fb628e9SJouni Malinen * allowed through even on unauthorized ports 7345fb628e9SJouni Malinen * @control_port_no_encrypt: TRUE to prevent encryption of control port 7355fb628e9SJouni Malinen * protocol frames. 73664bf3d4bSDenis Kenzior * @control_port_over_nl80211: TRUE if userspace expects to exchange control 73764bf3d4bSDenis Kenzior * port frames over NL80211 instead of the network interface. 738b8676221SDavid Spinadel * @wep_keys: static WEP keys, if not NULL points to an array of 739b8676221SDavid Spinadel * CFG80211_MAX_WEP_KEYS WEP keys 740b8676221SDavid Spinadel * @wep_tx_key: key index (0..3) of the default TX static WEP key 74191b5ab62SEliad Peller * @psk: PSK (for devices supporting 4-way-handshake offload) 7425fb628e9SJouni Malinen */ 7435fb628e9SJouni Malinen struct cfg80211_crypto_settings { 7445fb628e9SJouni Malinen u32 wpa_versions; 7455fb628e9SJouni Malinen u32 cipher_group; 7465fb628e9SJouni Malinen int n_ciphers_pairwise; 7475fb628e9SJouni Malinen u32 ciphers_pairwise[NL80211_MAX_NR_CIPHER_SUITES]; 7485fb628e9SJouni Malinen int n_akm_suites; 7495fb628e9SJouni Malinen u32 akm_suites[NL80211_MAX_NR_AKM_SUITES]; 7505fb628e9SJouni Malinen bool control_port; 7515fb628e9SJouni Malinen __be16 control_port_ethertype; 7525fb628e9SJouni Malinen bool control_port_no_encrypt; 75364bf3d4bSDenis Kenzior bool control_port_over_nl80211; 754b8676221SDavid Spinadel struct key_params *wep_keys; 755b8676221SDavid Spinadel int wep_tx_key; 75691b5ab62SEliad Peller const u8 *psk; 7575fb628e9SJouni Malinen }; 7585fb628e9SJouni Malinen 7595fb628e9SJouni Malinen /** 7608860020eSJohannes Berg * struct cfg80211_beacon_data - beacon data 761ed1b6cc7SJohannes Berg * @head: head portion of beacon (before TIM IE) 762ed1b6cc7SJohannes Berg * or %NULL if not changed 763ed1b6cc7SJohannes Berg * @tail: tail portion of beacon (after TIM IE) 764ed1b6cc7SJohannes Berg * or %NULL if not changed 765ed1b6cc7SJohannes Berg * @head_len: length of @head 766ed1b6cc7SJohannes Berg * @tail_len: length of @tail 7679946ecfbSJouni Malinen * @beacon_ies: extra information element(s) to add into Beacon frames or %NULL 7689946ecfbSJouni Malinen * @beacon_ies_len: length of beacon_ies in octets 7699946ecfbSJouni Malinen * @proberesp_ies: extra information element(s) to add into Probe Response 7709946ecfbSJouni Malinen * frames or %NULL 7719946ecfbSJouni Malinen * @proberesp_ies_len: length of proberesp_ies in octets 7729946ecfbSJouni Malinen * @assocresp_ies: extra information element(s) to add into (Re)Association 7739946ecfbSJouni Malinen * Response frames or %NULL 7749946ecfbSJouni Malinen * @assocresp_ies_len: length of assocresp_ies in octets 77500f740e1SArik Nemtsov * @probe_resp_len: length of probe response template (@probe_resp) 77600f740e1SArik Nemtsov * @probe_resp: probe response template (AP mode only) 77781e54d08SPradeep Kumar Chitrapu * @ftm_responder: enable FTM responder functionality; -1 for no change 77881e54d08SPradeep Kumar Chitrapu * (which also implies no change in LCI/civic location data) 77930db641eSJohannes Berg * @lci: Measurement Report element content, starting with Measurement Token 78030db641eSJohannes Berg * (measurement type 8) 78130db641eSJohannes Berg * @civicloc: Measurement Report element content, starting with Measurement 78230db641eSJohannes Berg * Token (measurement type 11) 78381e54d08SPradeep Kumar Chitrapu * @lci_len: LCI data length 78481e54d08SPradeep Kumar Chitrapu * @civicloc_len: Civic location data length 785ed1b6cc7SJohannes Berg */ 7868860020eSJohannes Berg struct cfg80211_beacon_data { 7878860020eSJohannes Berg const u8 *head, *tail; 7888860020eSJohannes Berg const u8 *beacon_ies; 7898860020eSJohannes Berg const u8 *proberesp_ies; 7908860020eSJohannes Berg const u8 *assocresp_ies; 7918860020eSJohannes Berg const u8 *probe_resp; 79281e54d08SPradeep Kumar Chitrapu const u8 *lci; 79381e54d08SPradeep Kumar Chitrapu const u8 *civicloc; 79481e54d08SPradeep Kumar Chitrapu s8 ftm_responder; 7958860020eSJohannes Berg 7968860020eSJohannes Berg size_t head_len, tail_len; 7978860020eSJohannes Berg size_t beacon_ies_len; 7988860020eSJohannes Berg size_t proberesp_ies_len; 7998860020eSJohannes Berg size_t assocresp_ies_len; 8008860020eSJohannes Berg size_t probe_resp_len; 80181e54d08SPradeep Kumar Chitrapu size_t lci_len; 80281e54d08SPradeep Kumar Chitrapu size_t civicloc_len; 8038860020eSJohannes Berg }; 8048860020eSJohannes Berg 8056d45a74bSVasanthakumar Thiagarajan struct mac_address { 8066d45a74bSVasanthakumar Thiagarajan u8 addr[ETH_ALEN]; 8076d45a74bSVasanthakumar Thiagarajan }; 8086d45a74bSVasanthakumar Thiagarajan 8098860020eSJohannes Berg /** 81077765eafSVasanthakumar Thiagarajan * struct cfg80211_acl_data - Access control list data 81177765eafSVasanthakumar Thiagarajan * 81277765eafSVasanthakumar Thiagarajan * @acl_policy: ACL policy to be applied on the station's 813077f897aSJohannes Berg * entry specified by mac_addr 81477765eafSVasanthakumar Thiagarajan * @n_acl_entries: Number of MAC address entries passed 81577765eafSVasanthakumar Thiagarajan * @mac_addrs: List of MAC addresses of stations to be used for ACL 81677765eafSVasanthakumar Thiagarajan */ 81777765eafSVasanthakumar Thiagarajan struct cfg80211_acl_data { 81877765eafSVasanthakumar Thiagarajan enum nl80211_acl_policy acl_policy; 81977765eafSVasanthakumar Thiagarajan int n_acl_entries; 82077765eafSVasanthakumar Thiagarajan 82177765eafSVasanthakumar Thiagarajan /* Keep it last */ 82277765eafSVasanthakumar Thiagarajan struct mac_address mac_addrs[]; 82377765eafSVasanthakumar Thiagarajan }; 82477765eafSVasanthakumar Thiagarajan 825a7c7fbffSPurushottam Kushwaha /* 826a7c7fbffSPurushottam Kushwaha * cfg80211_bitrate_mask - masks for bitrate control 827a7c7fbffSPurushottam Kushwaha */ 828a7c7fbffSPurushottam Kushwaha struct cfg80211_bitrate_mask { 829a7c7fbffSPurushottam Kushwaha struct { 830a7c7fbffSPurushottam Kushwaha u32 legacy; 831a7c7fbffSPurushottam Kushwaha u8 ht_mcs[IEEE80211_HT_MCS_MASK_LEN]; 832a7c7fbffSPurushottam Kushwaha u16 vht_mcs[NL80211_VHT_NSS_MAX]; 833a7c7fbffSPurushottam Kushwaha enum nl80211_txrate_gi gi; 834a7c7fbffSPurushottam Kushwaha } control[NUM_NL80211_BANDS]; 835a7c7fbffSPurushottam Kushwaha }; 836a7c7fbffSPurushottam Kushwaha 8378860020eSJohannes Berg /** 838fe494370SSrinivas Dasari * enum cfg80211_ap_settings_flags - AP settings flags 839fe494370SSrinivas Dasari * 840fe494370SSrinivas Dasari * Used by cfg80211_ap_settings 841fe494370SSrinivas Dasari * 842fe494370SSrinivas Dasari * @AP_SETTINGS_EXTERNAL_AUTH_SUPPORT: AP supports external authentication 843fe494370SSrinivas Dasari */ 844fe494370SSrinivas Dasari enum cfg80211_ap_settings_flags { 845fe494370SSrinivas Dasari AP_SETTINGS_EXTERNAL_AUTH_SUPPORT = BIT(0), 846fe494370SSrinivas Dasari }; 847fe494370SSrinivas Dasari 848fe494370SSrinivas Dasari /** 8498860020eSJohannes Berg * struct cfg80211_ap_settings - AP configuration 8508860020eSJohannes Berg * 8518860020eSJohannes Berg * Used to configure an AP interface. 8528860020eSJohannes Berg * 853683b6d3bSJohannes Berg * @chandef: defines the channel to use 8548860020eSJohannes Berg * @beacon: beacon data 8558860020eSJohannes Berg * @beacon_interval: beacon interval 8568860020eSJohannes Berg * @dtim_period: DTIM period 8578860020eSJohannes Berg * @ssid: SSID to be used in the BSS (note: may be %NULL if not provided from 8588860020eSJohannes Berg * user space) 8598860020eSJohannes Berg * @ssid_len: length of @ssid 8608860020eSJohannes Berg * @hidden_ssid: whether to hide the SSID in Beacon/Probe Response frames 8618860020eSJohannes Berg * @crypto: crypto settings 8628860020eSJohannes Berg * @privacy: the BSS uses privacy 8638860020eSJohannes Berg * @auth_type: Authentication type (algorithm) 86418998c38SEliad Peller * @smps_mode: SMPS mode 8651b658f11SVasanthakumar Thiagarajan * @inactivity_timeout: time in seconds to determine station's inactivity. 86653cabad7SJohannes Berg * @p2p_ctwindow: P2P CT Window 86753cabad7SJohannes Berg * @p2p_opp_ps: P2P opportunistic PS 86877765eafSVasanthakumar Thiagarajan * @acl: ACL configuration used by the drivers which has support for 86977765eafSVasanthakumar Thiagarajan * MAC address based access control 87034d50519SLior David * @pbss: If set, start as a PCP instead of AP. Relevant for DMG 87134d50519SLior David * networks. 8728564e382SJohannes Berg * @beacon_rate: bitrate to be used for beacons 87366cd794eSJohannes Berg * @ht_cap: HT capabilities (or %NULL if HT isn't enabled) 87466cd794eSJohannes Berg * @vht_cap: VHT capabilities (or %NULL if VHT isn't enabled) 875244eb9aeSShaul Triebitz * @he_cap: HE capabilities (or %NULL if HE isn't enabled) 87666cd794eSJohannes Berg * @ht_required: stations must support HT 87766cd794eSJohannes Berg * @vht_required: stations must support VHT 878fe494370SSrinivas Dasari * @flags: flags, as defined in enum cfg80211_ap_settings_flags 8798860020eSJohannes Berg */ 8808860020eSJohannes Berg struct cfg80211_ap_settings { 881683b6d3bSJohannes Berg struct cfg80211_chan_def chandef; 882aa430da4SJohannes Berg 8838860020eSJohannes Berg struct cfg80211_beacon_data beacon; 8848860020eSJohannes Berg 8858860020eSJohannes Berg int beacon_interval, dtim_period; 88632e9de84SJouni Malinen const u8 *ssid; 88732e9de84SJouni Malinen size_t ssid_len; 88832e9de84SJouni Malinen enum nl80211_hidden_ssid hidden_ssid; 8895fb628e9SJouni Malinen struct cfg80211_crypto_settings crypto; 8905fb628e9SJouni Malinen bool privacy; 8915fb628e9SJouni Malinen enum nl80211_auth_type auth_type; 89218998c38SEliad Peller enum nl80211_smps_mode smps_mode; 8931b658f11SVasanthakumar Thiagarajan int inactivity_timeout; 89453cabad7SJohannes Berg u8 p2p_ctwindow; 89553cabad7SJohannes Berg bool p2p_opp_ps; 89677765eafSVasanthakumar Thiagarajan const struct cfg80211_acl_data *acl; 89734d50519SLior David bool pbss; 898a7c7fbffSPurushottam Kushwaha struct cfg80211_bitrate_mask beacon_rate; 89966cd794eSJohannes Berg 90066cd794eSJohannes Berg const struct ieee80211_ht_cap *ht_cap; 90166cd794eSJohannes Berg const struct ieee80211_vht_cap *vht_cap; 902244eb9aeSShaul Triebitz const struct ieee80211_he_cap_elem *he_cap; 90366cd794eSJohannes Berg bool ht_required, vht_required; 904fe494370SSrinivas Dasari u32 flags; 905ed1b6cc7SJohannes Berg }; 906ed1b6cc7SJohannes Berg 9075727ef1bSJohannes Berg /** 90816ef1fe2SSimon Wunderlich * struct cfg80211_csa_settings - channel switch settings 90916ef1fe2SSimon Wunderlich * 91016ef1fe2SSimon Wunderlich * Used for channel switch 91116ef1fe2SSimon Wunderlich * 91216ef1fe2SSimon Wunderlich * @chandef: defines the channel to use after the switch 91316ef1fe2SSimon Wunderlich * @beacon_csa: beacon data while performing the switch 9149a774c78SAndrei Otcheretianski * @counter_offsets_beacon: offsets of the counters within the beacon (tail) 9159a774c78SAndrei Otcheretianski * @counter_offsets_presp: offsets of the counters within the probe response 9169a774c78SAndrei Otcheretianski * @n_counter_offsets_beacon: number of csa counters the beacon (tail) 9179a774c78SAndrei Otcheretianski * @n_counter_offsets_presp: number of csa counters in the probe response 91816ef1fe2SSimon Wunderlich * @beacon_after: beacon data to be used on the new channel 91916ef1fe2SSimon Wunderlich * @radar_required: whether radar detection is required on the new channel 92016ef1fe2SSimon Wunderlich * @block_tx: whether transmissions should be blocked while changing 92116ef1fe2SSimon Wunderlich * @count: number of beacons until switch 92216ef1fe2SSimon Wunderlich */ 92316ef1fe2SSimon Wunderlich struct cfg80211_csa_settings { 92416ef1fe2SSimon Wunderlich struct cfg80211_chan_def chandef; 92516ef1fe2SSimon Wunderlich struct cfg80211_beacon_data beacon_csa; 9269a774c78SAndrei Otcheretianski const u16 *counter_offsets_beacon; 9279a774c78SAndrei Otcheretianski const u16 *counter_offsets_presp; 9289a774c78SAndrei Otcheretianski unsigned int n_counter_offsets_beacon; 9299a774c78SAndrei Otcheretianski unsigned int n_counter_offsets_presp; 93016ef1fe2SSimon Wunderlich struct cfg80211_beacon_data beacon_after; 93116ef1fe2SSimon Wunderlich bool radar_required; 93216ef1fe2SSimon Wunderlich bool block_tx; 93316ef1fe2SSimon Wunderlich u8 count; 93416ef1fe2SSimon Wunderlich }; 93516ef1fe2SSimon Wunderlich 93651a1aaa6SJohannes Berg #define CFG80211_MAX_NUM_DIFFERENT_CHANNELS 10 93751a1aaa6SJohannes Berg 93816ef1fe2SSimon Wunderlich /** 939e227300cSPurushottam Kushwaha * struct iface_combination_params - input parameters for interface combinations 940e227300cSPurushottam Kushwaha * 941e227300cSPurushottam Kushwaha * Used to pass interface combination parameters 942e227300cSPurushottam Kushwaha * 943e227300cSPurushottam Kushwaha * @num_different_channels: the number of different channels we want 944e227300cSPurushottam Kushwaha * to use for verification 945e227300cSPurushottam Kushwaha * @radar_detect: a bitmap where each bit corresponds to a channel 946e227300cSPurushottam Kushwaha * width where radar detection is needed, as in the definition of 947e227300cSPurushottam Kushwaha * &struct ieee80211_iface_combination.@radar_detect_widths 948e227300cSPurushottam Kushwaha * @iftype_num: array with the number of interfaces of each interface 949e227300cSPurushottam Kushwaha * type. The index is the interface type as specified in &enum 950e227300cSPurushottam Kushwaha * nl80211_iftype. 9514c8dea63SJohannes Berg * @new_beacon_int: set this to the beacon interval of a new interface 9524c8dea63SJohannes Berg * that's not operating yet, if such is to be checked as part of 9534c8dea63SJohannes Berg * the verification 954e227300cSPurushottam Kushwaha */ 955e227300cSPurushottam Kushwaha struct iface_combination_params { 956e227300cSPurushottam Kushwaha int num_different_channels; 957e227300cSPurushottam Kushwaha u8 radar_detect; 958e227300cSPurushottam Kushwaha int iftype_num[NUM_NL80211_IFTYPES]; 9594c8dea63SJohannes Berg u32 new_beacon_int; 960e227300cSPurushottam Kushwaha }; 961e227300cSPurushottam Kushwaha 962e227300cSPurushottam Kushwaha /** 9633b9ce80cSJohannes Berg * enum station_parameters_apply_mask - station parameter values to apply 9643b9ce80cSJohannes Berg * @STATION_PARAM_APPLY_UAPSD: apply new uAPSD parameters (uapsd_queues, max_sp) 9659d62a986SJouni Malinen * @STATION_PARAM_APPLY_CAPABILITY: apply new capability 966f8bacc21SJohannes Berg * @STATION_PARAM_APPLY_PLINK_STATE: apply new plink state 9673b9ce80cSJohannes Berg * 9683b9ce80cSJohannes Berg * Not all station parameters have in-band "no change" signalling, 9693b9ce80cSJohannes Berg * for those that don't these flags will are used. 9703b9ce80cSJohannes Berg */ 9713b9ce80cSJohannes Berg enum station_parameters_apply_mask { 9723b9ce80cSJohannes Berg STATION_PARAM_APPLY_UAPSD = BIT(0), 9739d62a986SJouni Malinen STATION_PARAM_APPLY_CAPABILITY = BIT(1), 974f8bacc21SJohannes Berg STATION_PARAM_APPLY_PLINK_STATE = BIT(2), 975e96d1cd2SAshok Raj Nagarajan STATION_PARAM_APPLY_STA_TXPOWER = BIT(3), 976e96d1cd2SAshok Raj Nagarajan }; 977e96d1cd2SAshok Raj Nagarajan 978e96d1cd2SAshok Raj Nagarajan /** 979e96d1cd2SAshok Raj Nagarajan * struct sta_txpwr - station txpower configuration 980e96d1cd2SAshok Raj Nagarajan * 981e96d1cd2SAshok Raj Nagarajan * Used to configure txpower for station. 982e96d1cd2SAshok Raj Nagarajan * 983e96d1cd2SAshok Raj Nagarajan * @power: tx power (in dBm) to be used for sending data traffic. If tx power 984e96d1cd2SAshok Raj Nagarajan * is not provided, the default per-interface tx power setting will be 985e96d1cd2SAshok Raj Nagarajan * overriding. Driver should be picking up the lowest tx power, either tx 986e96d1cd2SAshok Raj Nagarajan * power per-interface or per-station. 987e96d1cd2SAshok Raj Nagarajan * @type: In particular if TPC %type is NL80211_TX_POWER_LIMITED then tx power 988e96d1cd2SAshok Raj Nagarajan * will be less than or equal to specified from userspace, whereas if TPC 989e96d1cd2SAshok Raj Nagarajan * %type is NL80211_TX_POWER_AUTOMATIC then it indicates default tx power. 990e96d1cd2SAshok Raj Nagarajan * NL80211_TX_POWER_FIXED is not a valid configuration option for 991e96d1cd2SAshok Raj Nagarajan * per peer TPC. 992e96d1cd2SAshok Raj Nagarajan */ 993e96d1cd2SAshok Raj Nagarajan struct sta_txpwr { 994e96d1cd2SAshok Raj Nagarajan s16 power; 995e96d1cd2SAshok Raj Nagarajan enum nl80211_tx_power_setting type; 9963b9ce80cSJohannes Berg }; 9973b9ce80cSJohannes Berg 9983b9ce80cSJohannes Berg /** 9995727ef1bSJohannes Berg * struct station_parameters - station parameters 10005727ef1bSJohannes Berg * 10015727ef1bSJohannes Berg * Used to change and create a new station. 10025727ef1bSJohannes Berg * 10035727ef1bSJohannes Berg * @vlan: vlan interface station should belong to 10045727ef1bSJohannes Berg * @supported_rates: supported rates in IEEE 802.11 format 10055727ef1bSJohannes Berg * (or NULL for no change) 10065727ef1bSJohannes Berg * @supported_rates_len: number of supported rates 1007eccb8e8fSJohannes Berg * @sta_flags_mask: station flags that changed 1008819bf593SJohannes Berg * (bitmask of BIT(%NL80211_STA_FLAG_...)) 1009eccb8e8fSJohannes Berg * @sta_flags_set: station flags values 1010819bf593SJohannes Berg * (bitmask of BIT(%NL80211_STA_FLAG_...)) 10115727ef1bSJohannes Berg * @listen_interval: listen interval or -1 for no change 10125727ef1bSJohannes Berg * @aid: AID or zero for no change 10137d27a0baSMasashi Honma * @peer_aid: mesh peer AID or zero for no change 1014abe37c4bSJohannes Berg * @plink_action: plink action to take 10159c3990aaSJavier Cardona * @plink_state: set the peer link state for a station 1016abe37c4bSJohannes Berg * @ht_capa: HT capabilities of station 1017f461be3eSMahesh Palivela * @vht_capa: VHT capabilities of station 1018910868dbSEliad Peller * @uapsd_queues: bitmap of queues configured for uapsd. same format 1019910868dbSEliad Peller * as the AC bitmap in the QoS info field 1020910868dbSEliad Peller * @max_sp: max Service Period. same format as the MAX_SP in the 1021910868dbSEliad Peller * QoS info field (but already shifted down) 1022c26887d2SJohannes Berg * @sta_modify_mask: bitmap indicating which parameters changed 1023c26887d2SJohannes Berg * (for those that don't have a natural "no change" value), 1024c26887d2SJohannes Berg * see &enum station_parameters_apply_mask 10253b1c5a53SMarco Porsch * @local_pm: local link-specific mesh power save mode (no change when set 10263b1c5a53SMarco Porsch * to unknown) 10279d62a986SJouni Malinen * @capability: station capability 10289d62a986SJouni Malinen * @ext_capab: extended capabilities of the station 10299d62a986SJouni Malinen * @ext_capab_len: number of extended capabilities 1030c01fc9adSSunil Dutt * @supported_channels: supported channels in IEEE 802.11 format 1031c01fc9adSSunil Dutt * @supported_channels_len: number of supported channels 1032c01fc9adSSunil Dutt * @supported_oper_classes: supported oper classes in IEEE 802.11 format 1033c01fc9adSSunil Dutt * @supported_oper_classes_len: number of supported operating classes 103460f4a7b1SMarek Kwaczynski * @opmode_notif: operating mode field from Operating Mode Notification 103560f4a7b1SMarek Kwaczynski * @opmode_notif_used: information if operating mode field is used 103617b94247SAyala Beker * @support_p2p_ps: information if station supports P2P PS mechanism 1037c4cbaf79SLuca Coelho * @he_capa: HE capabilities of station 1038c4cbaf79SLuca Coelho * @he_capa_len: the length of the HE capabilities 103936647055SToke Høiland-Jørgensen * @airtime_weight: airtime scheduler weight for this station 10405727ef1bSJohannes Berg */ 10415727ef1bSJohannes Berg struct station_parameters { 10422c1aabf3SJohannes Berg const u8 *supported_rates; 10435727ef1bSJohannes Berg struct net_device *vlan; 1044eccb8e8fSJohannes Berg u32 sta_flags_mask, sta_flags_set; 10453b9ce80cSJohannes Berg u32 sta_modify_mask; 10465727ef1bSJohannes Berg int listen_interval; 10475727ef1bSJohannes Berg u16 aid; 10487d27a0baSMasashi Honma u16 peer_aid; 10495727ef1bSJohannes Berg u8 supported_rates_len; 10502ec600d6SLuis Carlos Cobo u8 plink_action; 10519c3990aaSJavier Cardona u8 plink_state; 10522c1aabf3SJohannes Berg const struct ieee80211_ht_cap *ht_capa; 10532c1aabf3SJohannes Berg const struct ieee80211_vht_cap *vht_capa; 1054c75786c9SEliad Peller u8 uapsd_queues; 1055c75786c9SEliad Peller u8 max_sp; 10563b1c5a53SMarco Porsch enum nl80211_mesh_power_mode local_pm; 10579d62a986SJouni Malinen u16 capability; 10582c1aabf3SJohannes Berg const u8 *ext_capab; 10599d62a986SJouni Malinen u8 ext_capab_len; 1060c01fc9adSSunil Dutt const u8 *supported_channels; 1061c01fc9adSSunil Dutt u8 supported_channels_len; 1062c01fc9adSSunil Dutt const u8 *supported_oper_classes; 1063c01fc9adSSunil Dutt u8 supported_oper_classes_len; 106460f4a7b1SMarek Kwaczynski u8 opmode_notif; 106560f4a7b1SMarek Kwaczynski bool opmode_notif_used; 106617b94247SAyala Beker int support_p2p_ps; 1067c4cbaf79SLuca Coelho const struct ieee80211_he_cap_elem *he_capa; 1068c4cbaf79SLuca Coelho u8 he_capa_len; 106936647055SToke Høiland-Jørgensen u16 airtime_weight; 1070e96d1cd2SAshok Raj Nagarajan struct sta_txpwr txpwr; 10715727ef1bSJohannes Berg }; 10725727ef1bSJohannes Berg 1073fd5b74dcSJohannes Berg /** 107489c771e5SJouni Malinen * struct station_del_parameters - station deletion parameters 107589c771e5SJouni Malinen * 107689c771e5SJouni Malinen * Used to delete a station entry (or all stations). 107789c771e5SJouni Malinen * 107889c771e5SJouni Malinen * @mac: MAC address of the station to remove or NULL to remove all stations 107998856866SJouni Malinen * @subtype: Management frame subtype to use for indicating removal 108098856866SJouni Malinen * (10 = Disassociation, 12 = Deauthentication) 108198856866SJouni Malinen * @reason_code: Reason code for the Disassociation/Deauthentication frame 108289c771e5SJouni Malinen */ 108389c771e5SJouni Malinen struct station_del_parameters { 108489c771e5SJouni Malinen const u8 *mac; 108598856866SJouni Malinen u8 subtype; 108698856866SJouni Malinen u16 reason_code; 108789c771e5SJouni Malinen }; 108889c771e5SJouni Malinen 108989c771e5SJouni Malinen /** 109077ee7c89SJohannes Berg * enum cfg80211_station_type - the type of station being modified 109177ee7c89SJohannes Berg * @CFG80211_STA_AP_CLIENT: client of an AP interface 109247edb11bSAyala Beker * @CFG80211_STA_AP_CLIENT_UNASSOC: client of an AP interface that is still 109347edb11bSAyala Beker * unassociated (update properties for this type of client is permitted) 109477ee7c89SJohannes Berg * @CFG80211_STA_AP_MLME_CLIENT: client of an AP interface that has 109577ee7c89SJohannes Berg * the AP MLME in the device 109677ee7c89SJohannes Berg * @CFG80211_STA_AP_STA: AP station on managed interface 109777ee7c89SJohannes Berg * @CFG80211_STA_IBSS: IBSS station 109877ee7c89SJohannes Berg * @CFG80211_STA_TDLS_PEER_SETUP: TDLS peer on managed interface (dummy entry 109977ee7c89SJohannes Berg * while TDLS setup is in progress, it moves out of this state when 110077ee7c89SJohannes Berg * being marked authorized; use this only if TDLS with external setup is 110177ee7c89SJohannes Berg * supported/used) 110277ee7c89SJohannes Berg * @CFG80211_STA_TDLS_PEER_ACTIVE: TDLS peer on managed interface (active 110377ee7c89SJohannes Berg * entry that is operating, has been marked authorized by userspace) 1104eef941e6SThomas Pedersen * @CFG80211_STA_MESH_PEER_KERNEL: peer on mesh interface (kernel managed) 1105eef941e6SThomas Pedersen * @CFG80211_STA_MESH_PEER_USER: peer on mesh interface (user managed) 110677ee7c89SJohannes Berg */ 110777ee7c89SJohannes Berg enum cfg80211_station_type { 110877ee7c89SJohannes Berg CFG80211_STA_AP_CLIENT, 110947edb11bSAyala Beker CFG80211_STA_AP_CLIENT_UNASSOC, 111077ee7c89SJohannes Berg CFG80211_STA_AP_MLME_CLIENT, 111177ee7c89SJohannes Berg CFG80211_STA_AP_STA, 111277ee7c89SJohannes Berg CFG80211_STA_IBSS, 111377ee7c89SJohannes Berg CFG80211_STA_TDLS_PEER_SETUP, 111477ee7c89SJohannes Berg CFG80211_STA_TDLS_PEER_ACTIVE, 1115eef941e6SThomas Pedersen CFG80211_STA_MESH_PEER_KERNEL, 1116eef941e6SThomas Pedersen CFG80211_STA_MESH_PEER_USER, 111777ee7c89SJohannes Berg }; 111877ee7c89SJohannes Berg 111977ee7c89SJohannes Berg /** 112077ee7c89SJohannes Berg * cfg80211_check_station_change - validate parameter changes 112177ee7c89SJohannes Berg * @wiphy: the wiphy this operates on 112277ee7c89SJohannes Berg * @params: the new parameters for a station 112377ee7c89SJohannes Berg * @statype: the type of station being modified 112477ee7c89SJohannes Berg * 112577ee7c89SJohannes Berg * Utility function for the @change_station driver method. Call this function 112677ee7c89SJohannes Berg * with the appropriate station type looking up the station (and checking that 112777ee7c89SJohannes Berg * it exists). It will verify whether the station change is acceptable, and if 112877ee7c89SJohannes Berg * not will return an error code. Note that it may modify the parameters for 112977ee7c89SJohannes Berg * backward compatibility reasons, so don't use them before calling this. 113077ee7c89SJohannes Berg */ 113177ee7c89SJohannes Berg int cfg80211_check_station_change(struct wiphy *wiphy, 113277ee7c89SJohannes Berg struct station_parameters *params, 113377ee7c89SJohannes Berg enum cfg80211_station_type statype); 113477ee7c89SJohannes Berg 113577ee7c89SJohannes Berg /** 1136420e7fabSHenning Rogge * enum station_info_rate_flags - bitrate info flags 1137420e7fabSHenning Rogge * 1138420e7fabSHenning Rogge * Used by the driver to indicate the specific rate transmission 1139420e7fabSHenning Rogge * type for 802.11n transmissions. 1140420e7fabSHenning Rogge * 1141db9c64cfSJohannes Berg * @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS 1142db9c64cfSJohannes Berg * @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS 1143420e7fabSHenning Rogge * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval 1144db9c64cfSJohannes Berg * @RATE_INFO_FLAGS_60G: 60GHz MCS 1145c4cbaf79SLuca Coelho * @RATE_INFO_FLAGS_HE_MCS: HE MCS information 1146420e7fabSHenning Rogge */ 1147420e7fabSHenning Rogge enum rate_info_flags { 1148db9c64cfSJohannes Berg RATE_INFO_FLAGS_MCS = BIT(0), 1149db9c64cfSJohannes Berg RATE_INFO_FLAGS_VHT_MCS = BIT(1), 1150b51f3beeSJohannes Berg RATE_INFO_FLAGS_SHORT_GI = BIT(2), 1151b51f3beeSJohannes Berg RATE_INFO_FLAGS_60G = BIT(3), 1152c4cbaf79SLuca Coelho RATE_INFO_FLAGS_HE_MCS = BIT(4), 1153b51f3beeSJohannes Berg }; 1154b51f3beeSJohannes Berg 1155b51f3beeSJohannes Berg /** 1156b51f3beeSJohannes Berg * enum rate_info_bw - rate bandwidth information 1157b51f3beeSJohannes Berg * 1158b51f3beeSJohannes Berg * Used by the driver to indicate the rate bandwidth. 1159b51f3beeSJohannes Berg * 1160b51f3beeSJohannes Berg * @RATE_INFO_BW_5: 5 MHz bandwidth 1161b51f3beeSJohannes Berg * @RATE_INFO_BW_10: 10 MHz bandwidth 1162b51f3beeSJohannes Berg * @RATE_INFO_BW_20: 20 MHz bandwidth 1163b51f3beeSJohannes Berg * @RATE_INFO_BW_40: 40 MHz bandwidth 1164b51f3beeSJohannes Berg * @RATE_INFO_BW_80: 80 MHz bandwidth 1165b51f3beeSJohannes Berg * @RATE_INFO_BW_160: 160 MHz bandwidth 1166c4cbaf79SLuca Coelho * @RATE_INFO_BW_HE_RU: bandwidth determined by HE RU allocation 1167b51f3beeSJohannes Berg */ 1168b51f3beeSJohannes Berg enum rate_info_bw { 1169842be75cSJohannes Berg RATE_INFO_BW_20 = 0, 1170b51f3beeSJohannes Berg RATE_INFO_BW_5, 1171b51f3beeSJohannes Berg RATE_INFO_BW_10, 1172b51f3beeSJohannes Berg RATE_INFO_BW_40, 1173b51f3beeSJohannes Berg RATE_INFO_BW_80, 1174b51f3beeSJohannes Berg RATE_INFO_BW_160, 1175c4cbaf79SLuca Coelho RATE_INFO_BW_HE_RU, 1176420e7fabSHenning Rogge }; 1177420e7fabSHenning Rogge 1178420e7fabSHenning Rogge /** 1179420e7fabSHenning Rogge * struct rate_info - bitrate information 1180420e7fabSHenning Rogge * 1181420e7fabSHenning Rogge * Information about a receiving or transmitting bitrate 1182420e7fabSHenning Rogge * 1183420e7fabSHenning Rogge * @flags: bitflag of flags from &enum rate_info_flags 1184c4cbaf79SLuca Coelho * @mcs: mcs index if struct describes an HT/VHT/HE rate 1185420e7fabSHenning Rogge * @legacy: bitrate in 100kbit/s for 802.11abg 1186c4cbaf79SLuca Coelho * @nss: number of streams (VHT & HE only) 1187b51f3beeSJohannes Berg * @bw: bandwidth (from &enum rate_info_bw) 1188c4cbaf79SLuca Coelho * @he_gi: HE guard interval (from &enum nl80211_he_gi) 1189c4cbaf79SLuca Coelho * @he_dcm: HE DCM value 1190c4cbaf79SLuca Coelho * @he_ru_alloc: HE RU allocation (from &enum nl80211_he_ru_alloc, 1191c4cbaf79SLuca Coelho * only valid if bw is %RATE_INFO_BW_HE_RU) 1192420e7fabSHenning Rogge */ 1193420e7fabSHenning Rogge struct rate_info { 1194420e7fabSHenning Rogge u8 flags; 1195420e7fabSHenning Rogge u8 mcs; 1196420e7fabSHenning Rogge u16 legacy; 1197db9c64cfSJohannes Berg u8 nss; 1198b51f3beeSJohannes Berg u8 bw; 1199c4cbaf79SLuca Coelho u8 he_gi; 1200c4cbaf79SLuca Coelho u8 he_dcm; 1201c4cbaf79SLuca Coelho u8 he_ru_alloc; 1202fd5b74dcSJohannes Berg }; 1203fd5b74dcSJohannes Berg 1204fd5b74dcSJohannes Berg /** 1205f4263c98SPaul Stewart * enum station_info_rate_flags - bitrate info flags 1206f4263c98SPaul Stewart * 1207f4263c98SPaul Stewart * Used by the driver to indicate the specific rate transmission 1208f4263c98SPaul Stewart * type for 802.11n transmissions. 1209f4263c98SPaul Stewart * 1210f4263c98SPaul Stewart * @BSS_PARAM_FLAGS_CTS_PROT: whether CTS protection is enabled 1211f4263c98SPaul Stewart * @BSS_PARAM_FLAGS_SHORT_PREAMBLE: whether short preamble is enabled 1212f4263c98SPaul Stewart * @BSS_PARAM_FLAGS_SHORT_SLOT_TIME: whether short slot time is enabled 1213f4263c98SPaul Stewart */ 1214f4263c98SPaul Stewart enum bss_param_flags { 1215f4263c98SPaul Stewart BSS_PARAM_FLAGS_CTS_PROT = 1<<0, 1216f4263c98SPaul Stewart BSS_PARAM_FLAGS_SHORT_PREAMBLE = 1<<1, 1217f4263c98SPaul Stewart BSS_PARAM_FLAGS_SHORT_SLOT_TIME = 1<<2, 1218f4263c98SPaul Stewart }; 1219f4263c98SPaul Stewart 1220f4263c98SPaul Stewart /** 1221f4263c98SPaul Stewart * struct sta_bss_parameters - BSS parameters for the attached station 1222f4263c98SPaul Stewart * 1223f4263c98SPaul Stewart * Information about the currently associated BSS 1224f4263c98SPaul Stewart * 1225f4263c98SPaul Stewart * @flags: bitflag of flags from &enum bss_param_flags 1226f4263c98SPaul Stewart * @dtim_period: DTIM period for the BSS 1227f4263c98SPaul Stewart * @beacon_interval: beacon interval 1228f4263c98SPaul Stewart */ 1229f4263c98SPaul Stewart struct sta_bss_parameters { 1230f4263c98SPaul Stewart u8 flags; 1231f4263c98SPaul Stewart u8 dtim_period; 1232f4263c98SPaul Stewart u16 beacon_interval; 1233f4263c98SPaul Stewart }; 1234f4263c98SPaul Stewart 12356de39808SJohannes Berg /** 123652539ca8SToke Høiland-Jørgensen * struct cfg80211_txq_stats - TXQ statistics for this TID 123752539ca8SToke Høiland-Jørgensen * @filled: bitmap of flags using the bits of &enum nl80211_txq_stats to 123852539ca8SToke Høiland-Jørgensen * indicate the relevant values in this struct are filled 123952539ca8SToke Høiland-Jørgensen * @backlog_bytes: total number of bytes currently backlogged 124052539ca8SToke Høiland-Jørgensen * @backlog_packets: total number of packets currently backlogged 124152539ca8SToke Høiland-Jørgensen * @flows: number of new flows seen 124252539ca8SToke Høiland-Jørgensen * @drops: total number of packets dropped 124352539ca8SToke Høiland-Jørgensen * @ecn_marks: total number of packets marked with ECN CE 124452539ca8SToke Høiland-Jørgensen * @overlimit: number of drops due to queue space overflow 124552539ca8SToke Høiland-Jørgensen * @overmemory: number of drops due to memory limit overflow 124652539ca8SToke Høiland-Jørgensen * @collisions: number of hash collisions 124752539ca8SToke Høiland-Jørgensen * @tx_bytes: total number of bytes dequeued 124852539ca8SToke Høiland-Jørgensen * @tx_packets: total number of packets dequeued 124952539ca8SToke Høiland-Jørgensen * @max_flows: maximum number of flows supported 125052539ca8SToke Høiland-Jørgensen */ 125152539ca8SToke Høiland-Jørgensen struct cfg80211_txq_stats { 125252539ca8SToke Høiland-Jørgensen u32 filled; 125352539ca8SToke Høiland-Jørgensen u32 backlog_bytes; 125452539ca8SToke Høiland-Jørgensen u32 backlog_packets; 125552539ca8SToke Høiland-Jørgensen u32 flows; 125652539ca8SToke Høiland-Jørgensen u32 drops; 125752539ca8SToke Høiland-Jørgensen u32 ecn_marks; 125852539ca8SToke Høiland-Jørgensen u32 overlimit; 125952539ca8SToke Høiland-Jørgensen u32 overmemory; 126052539ca8SToke Høiland-Jørgensen u32 collisions; 126152539ca8SToke Høiland-Jørgensen u32 tx_bytes; 126252539ca8SToke Høiland-Jørgensen u32 tx_packets; 126352539ca8SToke Høiland-Jørgensen u32 max_flows; 126452539ca8SToke Høiland-Jørgensen }; 126552539ca8SToke Høiland-Jørgensen 126652539ca8SToke Høiland-Jørgensen /** 12676de39808SJohannes Berg * struct cfg80211_tid_stats - per-TID statistics 12686de39808SJohannes Berg * @filled: bitmap of flags using the bits of &enum nl80211_tid_stats to 12696de39808SJohannes Berg * indicate the relevant values in this struct are filled 12706de39808SJohannes Berg * @rx_msdu: number of received MSDUs 12716de39808SJohannes Berg * @tx_msdu: number of (attempted) transmitted MSDUs 12726de39808SJohannes Berg * @tx_msdu_retries: number of retries (not counting the first) for 12736de39808SJohannes Berg * transmitted MSDUs 12746de39808SJohannes Berg * @tx_msdu_failed: number of failed transmitted MSDUs 127552539ca8SToke Høiland-Jørgensen * @txq_stats: TXQ statistics 12766de39808SJohannes Berg */ 12776de39808SJohannes Berg struct cfg80211_tid_stats { 12786de39808SJohannes Berg u32 filled; 12796de39808SJohannes Berg u64 rx_msdu; 12806de39808SJohannes Berg u64 tx_msdu; 12816de39808SJohannes Berg u64 tx_msdu_retries; 12826de39808SJohannes Berg u64 tx_msdu_failed; 128352539ca8SToke Høiland-Jørgensen struct cfg80211_txq_stats txq_stats; 12846de39808SJohannes Berg }; 12856de39808SJohannes Berg 1286119363c7SFelix Fietkau #define IEEE80211_MAX_CHAINS 4 1287119363c7SFelix Fietkau 1288f4263c98SPaul Stewart /** 12892ec600d6SLuis Carlos Cobo * struct station_info - station information 1290fd5b74dcSJohannes Berg * 12912ec600d6SLuis Carlos Cobo * Station information filled by driver for get_station() and dump_station. 1292fd5b74dcSJohannes Berg * 1293319090bfSJohannes Berg * @filled: bitflag of flags using the bits of &enum nl80211_sta_info to 1294319090bfSJohannes Berg * indicate the relevant values in this struct for them 1295ebe27c91SMohammed Shafi Shajakhan * @connected_time: time(in secs) since a station is last connected 1296fd5b74dcSJohannes Berg * @inactive_time: time since last station activity (tx/rx) in milliseconds 12978d791361SJohannes Berg * @rx_bytes: bytes (size of MPDUs) received from this station 12988d791361SJohannes Berg * @tx_bytes: bytes (size of MPDUs) transmitted to this station 12992ec600d6SLuis Carlos Cobo * @llid: mesh local link id 13002ec600d6SLuis Carlos Cobo * @plid: mesh peer link id 13012ec600d6SLuis Carlos Cobo * @plink_state: mesh peer link state 130273c3df3bSJohannes Berg * @signal: The signal strength, type depends on the wiphy's signal_type. 130373c3df3bSJohannes Berg * For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. 130473c3df3bSJohannes Berg * @signal_avg: Average signal strength, type depends on the wiphy's signal_type. 130573c3df3bSJohannes Berg * For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. 1306119363c7SFelix Fietkau * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg 1307119363c7SFelix Fietkau * @chain_signal: per-chain signal strength of last received packet in dBm 1308119363c7SFelix Fietkau * @chain_signal_avg: per-chain signal strength average in dBm 1309858022aaSRandy Dunlap * @txrate: current unicast bitrate from this station 1310858022aaSRandy Dunlap * @rxrate: current unicast bitrate to this station 13118d791361SJohannes Berg * @rx_packets: packets (MSDUs & MMPDUs) received from this station 13128d791361SJohannes Berg * @tx_packets: packets (MSDUs & MMPDUs) transmitted to this station 13138d791361SJohannes Berg * @tx_retries: cumulative retry counts (MPDUs) 13148d791361SJohannes Berg * @tx_failed: number of failed transmissions (MPDUs) (retries exceeded, no ACK) 13155a5c731aSBen Greear * @rx_dropped_misc: Dropped for un-specified reason. 13161ba01458SRandy Dunlap * @bss_param: current BSS parameters 1317f5ea9120SJohannes Berg * @generation: generation number for nl80211 dumps. 1318f5ea9120SJohannes Berg * This number should increase every time the list of stations 1319f5ea9120SJohannes Berg * changes, i.e. when a station is added or removed, so that 1320f5ea9120SJohannes Berg * userspace can tell whether it got a consistent snapshot. 132150d3dfb7SJouni Malinen * @assoc_req_ies: IEs from (Re)Association Request. 132250d3dfb7SJouni Malinen * This is used only when in AP mode with drivers that do not use 132350d3dfb7SJouni Malinen * user space MLME/SME implementation. The information is provided for 132450d3dfb7SJouni Malinen * the cfg80211_new_sta() calls to notify user space of the IEs. 132550d3dfb7SJouni Malinen * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets. 1326c26887d2SJohannes Berg * @sta_flags: station flags mask & values 1327a85e1d55SPaul Stewart * @beacon_loss_count: Number of times beacon loss event has triggered. 1328d299a1f2SJavier Cardona * @t_offset: Time offset of the station relative to this host. 13293b1c5a53SMarco Porsch * @local_pm: local mesh STA power save mode 13303b1c5a53SMarco Porsch * @peer_pm: peer mesh STA power save mode 13313b1c5a53SMarco Porsch * @nonpeer_pm: non-peer mesh STA power save mode 1332867d849fSAntonio Quartulli * @expected_throughput: expected throughput in kbps (including 802.11 headers) 1333867d849fSAntonio Quartulli * towards this station. 1334a76b1942SJohannes Berg * @rx_beacon: number of beacons received from this peer 1335a76b1942SJohannes Berg * @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received 1336a76b1942SJohannes Berg * from this peer 1337dbdaee7aSBob Copeland * @connected_to_gate: true if mesh STA has a path to mesh gate 1338739960f1SMohammed Shafi Shajakhan * @rx_duration: aggregate PPDU duration(usecs) for all the frames from a peer 133936647055SToke Høiland-Jørgensen * @tx_duration: aggregate PPDU duration(usecs) for all the frames to a peer 134036647055SToke Høiland-Jørgensen * @airtime_weight: current airtime scheduling weight 13416de39808SJohannes Berg * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last 13426de39808SJohannes Berg * (IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs. 13438689c051SArend van Spriel * Note that this doesn't use the @filled bit, but is used if non-NULL. 1344c4b50cd3SVenkateswara Naralasetty * @ack_signal: signal strength (in dBm) of the last ACK frame. 134581d5439dSBalaji Pothunoori * @avg_ack_signal: average rssi value of ack packet for the no of msdu's has 134681d5439dSBalaji Pothunoori * been sent. 13470d4e14a3SAnkita Bajaj * @rx_mpdu_count: number of MPDUs received from this station 13480d4e14a3SAnkita Bajaj * @fcs_err_count: number of packets (MPDUs) received from this station with 13490d4e14a3SAnkita Bajaj * an FCS error. This counter should be incremented only when TA of the 13500d4e14a3SAnkita Bajaj * received packet with an FCS error matches the peer MAC address. 1351ab60633cSNarayanraddi Masti * @airtime_link_metric: mesh airtime link metric. 1352fd5b74dcSJohannes Berg */ 13532ec600d6SLuis Carlos Cobo struct station_info { 1354739960f1SMohammed Shafi Shajakhan u64 filled; 1355ebe27c91SMohammed Shafi Shajakhan u32 connected_time; 1356fd5b74dcSJohannes Berg u32 inactive_time; 135742745e03SVladimir Kondratiev u64 rx_bytes; 135842745e03SVladimir Kondratiev u64 tx_bytes; 13592ec600d6SLuis Carlos Cobo u16 llid; 13602ec600d6SLuis Carlos Cobo u16 plid; 13612ec600d6SLuis Carlos Cobo u8 plink_state; 1362420e7fabSHenning Rogge s8 signal; 1363541a45a1SBruno Randolf s8 signal_avg; 1364119363c7SFelix Fietkau 1365119363c7SFelix Fietkau u8 chains; 1366119363c7SFelix Fietkau s8 chain_signal[IEEE80211_MAX_CHAINS]; 1367119363c7SFelix Fietkau s8 chain_signal_avg[IEEE80211_MAX_CHAINS]; 1368119363c7SFelix Fietkau 1369420e7fabSHenning Rogge struct rate_info txrate; 1370c8dcfd8aSFelix Fietkau struct rate_info rxrate; 137198c8a60aSJouni Malinen u32 rx_packets; 137298c8a60aSJouni Malinen u32 tx_packets; 1373b206b4efSBruno Randolf u32 tx_retries; 1374b206b4efSBruno Randolf u32 tx_failed; 13755a5c731aSBen Greear u32 rx_dropped_misc; 1376f4263c98SPaul Stewart struct sta_bss_parameters bss_param; 1377bb6e753eSHelmut Schaa struct nl80211_sta_flag_update sta_flags; 1378f5ea9120SJohannes Berg 1379f5ea9120SJohannes Berg int generation; 138050d3dfb7SJouni Malinen 138150d3dfb7SJouni Malinen const u8 *assoc_req_ies; 138250d3dfb7SJouni Malinen size_t assoc_req_ies_len; 1383f612cedfSJouni Malinen 1384a85e1d55SPaul Stewart u32 beacon_loss_count; 1385d299a1f2SJavier Cardona s64 t_offset; 13863b1c5a53SMarco Porsch enum nl80211_mesh_power_mode local_pm; 13873b1c5a53SMarco Porsch enum nl80211_mesh_power_mode peer_pm; 13883b1c5a53SMarco Porsch enum nl80211_mesh_power_mode nonpeer_pm; 1389a85e1d55SPaul Stewart 1390867d849fSAntonio Quartulli u32 expected_throughput; 1391a76b1942SJohannes Berg 139236647055SToke Høiland-Jørgensen u64 tx_duration; 1393739960f1SMohammed Shafi Shajakhan u64 rx_duration; 139436647055SToke Høiland-Jørgensen u64 rx_beacon; 1395a76b1942SJohannes Berg u8 rx_beacon_signal_avg; 1396dbdaee7aSBob Copeland u8 connected_to_gate; 1397dbdaee7aSBob Copeland 13988689c051SArend van Spriel struct cfg80211_tid_stats *pertid; 1399c4b50cd3SVenkateswara Naralasetty s8 ack_signal; 140081d5439dSBalaji Pothunoori s8 avg_ack_signal; 14010d4e14a3SAnkita Bajaj 140236647055SToke Høiland-Jørgensen u16 airtime_weight; 140336647055SToke Høiland-Jørgensen 14040d4e14a3SAnkita Bajaj u32 rx_mpdu_count; 14050d4e14a3SAnkita Bajaj u32 fcs_err_count; 1406ab60633cSNarayanraddi Masti 1407ab60633cSNarayanraddi Masti u32 airtime_link_metric; 1408fd5b74dcSJohannes Berg }; 1409fd5b74dcSJohannes Berg 141061aaa0e8SLinus Lüssing #if IS_ENABLED(CONFIG_CFG80211) 141166f7ac50SMichael Wu /** 14127406353dSAntonio Quartulli * cfg80211_get_station - retrieve information about a given station 14137406353dSAntonio Quartulli * @dev: the device where the station is supposed to be connected to 14147406353dSAntonio Quartulli * @mac_addr: the mac address of the station of interest 14157406353dSAntonio Quartulli * @sinfo: pointer to the structure to fill with the information 14167406353dSAntonio Quartulli * 14177406353dSAntonio Quartulli * Returns 0 on success and sinfo is filled with the available information 14187406353dSAntonio Quartulli * otherwise returns a negative error code and the content of sinfo has to be 14197406353dSAntonio Quartulli * considered undefined. 14207406353dSAntonio Quartulli */ 14217406353dSAntonio Quartulli int cfg80211_get_station(struct net_device *dev, const u8 *mac_addr, 14227406353dSAntonio Quartulli struct station_info *sinfo); 142361aaa0e8SLinus Lüssing #else 142461aaa0e8SLinus Lüssing static inline int cfg80211_get_station(struct net_device *dev, 142561aaa0e8SLinus Lüssing const u8 *mac_addr, 142661aaa0e8SLinus Lüssing struct station_info *sinfo) 142761aaa0e8SLinus Lüssing { 142861aaa0e8SLinus Lüssing return -ENOENT; 142961aaa0e8SLinus Lüssing } 143061aaa0e8SLinus Lüssing #endif 14317406353dSAntonio Quartulli 14327406353dSAntonio Quartulli /** 143366f7ac50SMichael Wu * enum monitor_flags - monitor flags 143466f7ac50SMichael Wu * 143566f7ac50SMichael Wu * Monitor interface configuration flags. Note that these must be the bits 143666f7ac50SMichael Wu * according to the nl80211 flags. 143766f7ac50SMichael Wu * 1438818a986eSJohannes Berg * @MONITOR_FLAG_CHANGED: set if the flags were changed 143966f7ac50SMichael Wu * @MONITOR_FLAG_FCSFAIL: pass frames with bad FCS 144066f7ac50SMichael Wu * @MONITOR_FLAG_PLCPFAIL: pass frames with bad PLCP 144166f7ac50SMichael Wu * @MONITOR_FLAG_CONTROL: pass control frames 144266f7ac50SMichael Wu * @MONITOR_FLAG_OTHER_BSS: disable BSSID filtering 144366f7ac50SMichael Wu * @MONITOR_FLAG_COOK_FRAMES: report frames after processing 1444e057d3c3SFelix Fietkau * @MONITOR_FLAG_ACTIVE: active monitor, ACKs frames on its MAC address 144566f7ac50SMichael Wu */ 144666f7ac50SMichael Wu enum monitor_flags { 1447818a986eSJohannes Berg MONITOR_FLAG_CHANGED = 1<<__NL80211_MNTR_FLAG_INVALID, 144866f7ac50SMichael Wu MONITOR_FLAG_FCSFAIL = 1<<NL80211_MNTR_FLAG_FCSFAIL, 144966f7ac50SMichael Wu MONITOR_FLAG_PLCPFAIL = 1<<NL80211_MNTR_FLAG_PLCPFAIL, 145066f7ac50SMichael Wu MONITOR_FLAG_CONTROL = 1<<NL80211_MNTR_FLAG_CONTROL, 145166f7ac50SMichael Wu MONITOR_FLAG_OTHER_BSS = 1<<NL80211_MNTR_FLAG_OTHER_BSS, 145266f7ac50SMichael Wu MONITOR_FLAG_COOK_FRAMES = 1<<NL80211_MNTR_FLAG_COOK_FRAMES, 1453e057d3c3SFelix Fietkau MONITOR_FLAG_ACTIVE = 1<<NL80211_MNTR_FLAG_ACTIVE, 145466f7ac50SMichael Wu }; 145566f7ac50SMichael Wu 14562ec600d6SLuis Carlos Cobo /** 14572ec600d6SLuis Carlos Cobo * enum mpath_info_flags - mesh path information flags 14582ec600d6SLuis Carlos Cobo * 14592ec600d6SLuis Carlos Cobo * Used by the driver to indicate which info in &struct mpath_info it has filled 14602ec600d6SLuis Carlos Cobo * in during get_station() or dump_station(). 14612ec600d6SLuis Carlos Cobo * 1462abe37c4bSJohannes Berg * @MPATH_INFO_FRAME_QLEN: @frame_qlen filled 1463abe37c4bSJohannes Berg * @MPATH_INFO_SN: @sn filled 1464abe37c4bSJohannes Berg * @MPATH_INFO_METRIC: @metric filled 1465abe37c4bSJohannes Berg * @MPATH_INFO_EXPTIME: @exptime filled 1466abe37c4bSJohannes Berg * @MPATH_INFO_DISCOVERY_TIMEOUT: @discovery_timeout filled 1467abe37c4bSJohannes Berg * @MPATH_INFO_DISCOVERY_RETRIES: @discovery_retries filled 1468abe37c4bSJohannes Berg * @MPATH_INFO_FLAGS: @flags filled 1469cc241636SJulan Hsu * @MPATH_INFO_HOP_COUNT: @hop_count filled 14709874b71fSJohannes Berg * @MPATH_INFO_PATH_CHANGE: @path_change_count filled 14712ec600d6SLuis Carlos Cobo */ 14722ec600d6SLuis Carlos Cobo enum mpath_info_flags { 14732ec600d6SLuis Carlos Cobo MPATH_INFO_FRAME_QLEN = BIT(0), 1474d19b3bf6SRui Paulo MPATH_INFO_SN = BIT(1), 14752ec600d6SLuis Carlos Cobo MPATH_INFO_METRIC = BIT(2), 14762ec600d6SLuis Carlos Cobo MPATH_INFO_EXPTIME = BIT(3), 14772ec600d6SLuis Carlos Cobo MPATH_INFO_DISCOVERY_TIMEOUT = BIT(4), 14782ec600d6SLuis Carlos Cobo MPATH_INFO_DISCOVERY_RETRIES = BIT(5), 14792ec600d6SLuis Carlos Cobo MPATH_INFO_FLAGS = BIT(6), 1480540bbcb9SJulan Hsu MPATH_INFO_HOP_COUNT = BIT(7), 1481540bbcb9SJulan Hsu MPATH_INFO_PATH_CHANGE = BIT(8), 14822ec600d6SLuis Carlos Cobo }; 14832ec600d6SLuis Carlos Cobo 14842ec600d6SLuis Carlos Cobo /** 14852ec600d6SLuis Carlos Cobo * struct mpath_info - mesh path information 14862ec600d6SLuis Carlos Cobo * 14872ec600d6SLuis Carlos Cobo * Mesh path information filled by driver for get_mpath() and dump_mpath(). 14882ec600d6SLuis Carlos Cobo * 14892ec600d6SLuis Carlos Cobo * @filled: bitfield of flags from &enum mpath_info_flags 14902ec600d6SLuis Carlos Cobo * @frame_qlen: number of queued frames for this destination 1491d19b3bf6SRui Paulo * @sn: target sequence number 14922ec600d6SLuis Carlos Cobo * @metric: metric (cost) of this mesh path 14932ec600d6SLuis Carlos Cobo * @exptime: expiration time for the mesh path from now, in msecs 14942ec600d6SLuis Carlos Cobo * @flags: mesh path flags 14952ec600d6SLuis Carlos Cobo * @discovery_timeout: total mesh path discovery timeout, in msecs 14962ec600d6SLuis Carlos Cobo * @discovery_retries: mesh path discovery retries 1497f5ea9120SJohannes Berg * @generation: generation number for nl80211 dumps. 1498f5ea9120SJohannes Berg * This number should increase every time the list of mesh paths 1499f5ea9120SJohannes Berg * changes, i.e. when a station is added or removed, so that 1500f5ea9120SJohannes Berg * userspace can tell whether it got a consistent snapshot. 1501cc241636SJulan Hsu * @hop_count: hops to destination 1502540bbcb9SJulan Hsu * @path_change_count: total number of path changes to destination 15032ec600d6SLuis Carlos Cobo */ 15042ec600d6SLuis Carlos Cobo struct mpath_info { 15052ec600d6SLuis Carlos Cobo u32 filled; 15062ec600d6SLuis Carlos Cobo u32 frame_qlen; 1507d19b3bf6SRui Paulo u32 sn; 15082ec600d6SLuis Carlos Cobo u32 metric; 15092ec600d6SLuis Carlos Cobo u32 exptime; 15102ec600d6SLuis Carlos Cobo u32 discovery_timeout; 15112ec600d6SLuis Carlos Cobo u8 discovery_retries; 15122ec600d6SLuis Carlos Cobo u8 flags; 1513cc241636SJulan Hsu u8 hop_count; 1514540bbcb9SJulan Hsu u32 path_change_count; 1515f5ea9120SJohannes Berg 1516f5ea9120SJohannes Berg int generation; 15172ec600d6SLuis Carlos Cobo }; 15182ec600d6SLuis Carlos Cobo 15199f1ba906SJouni Malinen /** 15209f1ba906SJouni Malinen * struct bss_parameters - BSS parameters 15219f1ba906SJouni Malinen * 15229f1ba906SJouni Malinen * Used to change BSS parameters (mainly for AP mode). 15239f1ba906SJouni Malinen * 15249f1ba906SJouni Malinen * @use_cts_prot: Whether to use CTS protection 15259f1ba906SJouni Malinen * (0 = no, 1 = yes, -1 = do not change) 15269f1ba906SJouni Malinen * @use_short_preamble: Whether the use of short preambles is allowed 15279f1ba906SJouni Malinen * (0 = no, 1 = yes, -1 = do not change) 15289f1ba906SJouni Malinen * @use_short_slot_time: Whether the use of short slot time is allowed 15299f1ba906SJouni Malinen * (0 = no, 1 = yes, -1 = do not change) 153090c97a04SJouni Malinen * @basic_rates: basic rates in IEEE 802.11 format 153190c97a04SJouni Malinen * (or NULL for no change) 153290c97a04SJouni Malinen * @basic_rates_len: number of basic rates 1533fd8aaaf3SFelix Fietkau * @ap_isolate: do not forward packets between connected stations 153450b12f59SHelmut Schaa * @ht_opmode: HT Operation mode 153550b12f59SHelmut Schaa * (u16 = opmode, -1 = do not change) 153653cabad7SJohannes Berg * @p2p_ctwindow: P2P CT Window (-1 = no change) 153753cabad7SJohannes Berg * @p2p_opp_ps: P2P opportunistic PS (-1 = no change) 15389f1ba906SJouni Malinen */ 15399f1ba906SJouni Malinen struct bss_parameters { 15409f1ba906SJouni Malinen int use_cts_prot; 15419f1ba906SJouni Malinen int use_short_preamble; 15429f1ba906SJouni Malinen int use_short_slot_time; 1543c1e5f471SJohannes Berg const u8 *basic_rates; 154490c97a04SJouni Malinen u8 basic_rates_len; 1545fd8aaaf3SFelix Fietkau int ap_isolate; 154650b12f59SHelmut Schaa int ht_opmode; 154753cabad7SJohannes Berg s8 p2p_ctwindow, p2p_opp_ps; 15489f1ba906SJouni Malinen }; 15492ec600d6SLuis Carlos Cobo 15503ddd53f3SChun-Yeow Yeoh /** 155129cbe68cSJohannes Berg * struct mesh_config - 802.11s mesh configuration 155229cbe68cSJohannes Berg * 155329cbe68cSJohannes Berg * These parameters can be changed while the mesh is active. 15543ddd53f3SChun-Yeow Yeoh * 15553ddd53f3SChun-Yeow Yeoh * @dot11MeshRetryTimeout: the initial retry timeout in millisecond units used 15563ddd53f3SChun-Yeow Yeoh * by the Mesh Peering Open message 15573ddd53f3SChun-Yeow Yeoh * @dot11MeshConfirmTimeout: the initial retry timeout in millisecond units 15583ddd53f3SChun-Yeow Yeoh * used by the Mesh Peering Open message 15593ddd53f3SChun-Yeow Yeoh * @dot11MeshHoldingTimeout: the confirm timeout in millisecond units used by 15603ddd53f3SChun-Yeow Yeoh * the mesh peering management to close a mesh peering 15613ddd53f3SChun-Yeow Yeoh * @dot11MeshMaxPeerLinks: the maximum number of peer links allowed on this 15623ddd53f3SChun-Yeow Yeoh * mesh interface 15633ddd53f3SChun-Yeow Yeoh * @dot11MeshMaxRetries: the maximum number of peer link open retries that can 15643ddd53f3SChun-Yeow Yeoh * be sent to establish a new peer link instance in a mesh 15653ddd53f3SChun-Yeow Yeoh * @dot11MeshTTL: the value of TTL field set at a source mesh STA 15663ddd53f3SChun-Yeow Yeoh * @element_ttl: the value of TTL field set at a mesh STA for path selection 15673ddd53f3SChun-Yeow Yeoh * elements 15683ddd53f3SChun-Yeow Yeoh * @auto_open_plinks: whether we should automatically open peer links when we 15693ddd53f3SChun-Yeow Yeoh * detect compatible mesh peers 15703ddd53f3SChun-Yeow Yeoh * @dot11MeshNbrOffsetMaxNeighbor: the maximum number of neighbors to 15713ddd53f3SChun-Yeow Yeoh * synchronize to for 11s default synchronization method 15723ddd53f3SChun-Yeow Yeoh * @dot11MeshHWMPmaxPREQretries: the number of action frames containing a PREQ 15733ddd53f3SChun-Yeow Yeoh * that an originator mesh STA can send to a particular path target 15743ddd53f3SChun-Yeow Yeoh * @path_refresh_time: how frequently to refresh mesh paths in milliseconds 15753ddd53f3SChun-Yeow Yeoh * @min_discovery_timeout: the minimum length of time to wait until giving up on 15763ddd53f3SChun-Yeow Yeoh * a path discovery in milliseconds 15773ddd53f3SChun-Yeow Yeoh * @dot11MeshHWMPactivePathTimeout: the time (in TUs) for which mesh STAs 15783ddd53f3SChun-Yeow Yeoh * receiving a PREQ shall consider the forwarding information from the 15793ddd53f3SChun-Yeow Yeoh * root to be valid. (TU = time unit) 15803ddd53f3SChun-Yeow Yeoh * @dot11MeshHWMPpreqMinInterval: the minimum interval of time (in TUs) during 15813ddd53f3SChun-Yeow Yeoh * which a mesh STA can send only one action frame containing a PREQ 15823ddd53f3SChun-Yeow Yeoh * element 15833ddd53f3SChun-Yeow Yeoh * @dot11MeshHWMPperrMinInterval: the minimum interval of time (in TUs) during 15843ddd53f3SChun-Yeow Yeoh * which a mesh STA can send only one Action frame containing a PERR 15853ddd53f3SChun-Yeow Yeoh * element 15863ddd53f3SChun-Yeow Yeoh * @dot11MeshHWMPnetDiameterTraversalTime: the interval of time (in TUs) that 15873ddd53f3SChun-Yeow Yeoh * it takes for an HWMP information element to propagate across the mesh 15883ddd53f3SChun-Yeow Yeoh * @dot11MeshHWMPRootMode: the configuration of a mesh STA as root mesh STA 15893ddd53f3SChun-Yeow Yeoh * @dot11MeshHWMPRannInterval: the interval of time (in TUs) between root 15903ddd53f3SChun-Yeow Yeoh * announcements are transmitted 15913ddd53f3SChun-Yeow Yeoh * @dot11MeshGateAnnouncementProtocol: whether to advertise that this mesh 15923ddd53f3SChun-Yeow Yeoh * station has access to a broader network beyond the MBSS. (This is 15933ddd53f3SChun-Yeow Yeoh * missnamed in draft 12.0: dot11MeshGateAnnouncementProtocol set to true 15943ddd53f3SChun-Yeow Yeoh * only means that the station will announce others it's a mesh gate, but 15953ddd53f3SChun-Yeow Yeoh * not necessarily using the gate announcement protocol. Still keeping the 15963ddd53f3SChun-Yeow Yeoh * same nomenclature to be in sync with the spec) 15973ddd53f3SChun-Yeow Yeoh * @dot11MeshForwarding: whether the Mesh STA is forwarding or non-forwarding 15983ddd53f3SChun-Yeow Yeoh * entity (default is TRUE - forwarding entity) 15993ddd53f3SChun-Yeow Yeoh * @rssi_threshold: the threshold for average signal strength of candidate 16003ddd53f3SChun-Yeow Yeoh * station to establish a peer link 16013ddd53f3SChun-Yeow Yeoh * @ht_opmode: mesh HT protection mode 1602ac1073a6SChun-Yeow Yeoh * 1603ac1073a6SChun-Yeow Yeoh * @dot11MeshHWMPactivePathToRootTimeout: The time (in TUs) for which mesh STAs 1604ac1073a6SChun-Yeow Yeoh * receiving a proactive PREQ shall consider the forwarding information to 1605ac1073a6SChun-Yeow Yeoh * the root mesh STA to be valid. 1606ac1073a6SChun-Yeow Yeoh * 1607ac1073a6SChun-Yeow Yeoh * @dot11MeshHWMProotInterval: The interval of time (in TUs) between proactive 1608ac1073a6SChun-Yeow Yeoh * PREQs are transmitted. 1609728b19e5SChun-Yeow Yeoh * @dot11MeshHWMPconfirmationInterval: The minimum interval of time (in TUs) 1610728b19e5SChun-Yeow Yeoh * during which a mesh STA can send only one Action frame containing 1611728b19e5SChun-Yeow Yeoh * a PREQ element for root path confirmation. 16123b1c5a53SMarco Porsch * @power_mode: The default mesh power save mode which will be the initial 16133b1c5a53SMarco Porsch * setting for new peer links. 16143b1c5a53SMarco Porsch * @dot11MeshAwakeWindowDuration: The duration in TUs the STA will remain awake 16153b1c5a53SMarco Porsch * after transmitting its beacon. 16168e7c0538SColleen Twitty * @plink_timeout: If no tx activity is seen from a STA we've established 16178e7c0538SColleen Twitty * peering with for longer than this time (in seconds), then remove it 16188e7c0538SColleen Twitty * from the STA's list of peers. Default is 30 minutes. 161901d66fbdSBob Copeland * @dot11MeshConnectedToMeshGate: if set to true, advertise that this STA is 162001d66fbdSBob Copeland * connected to a mesh gate in mesh formation info. If false, the 162101d66fbdSBob Copeland * value in mesh formation is determined by the presence of root paths 162201d66fbdSBob Copeland * in the mesh path table 162329cbe68cSJohannes Berg */ 162493da9cc1Scolin@cozybit.com struct mesh_config { 162593da9cc1Scolin@cozybit.com u16 dot11MeshRetryTimeout; 162693da9cc1Scolin@cozybit.com u16 dot11MeshConfirmTimeout; 162793da9cc1Scolin@cozybit.com u16 dot11MeshHoldingTimeout; 162893da9cc1Scolin@cozybit.com u16 dot11MeshMaxPeerLinks; 162993da9cc1Scolin@cozybit.com u8 dot11MeshMaxRetries; 163093da9cc1Scolin@cozybit.com u8 dot11MeshTTL; 163145904f21SJavier Cardona u8 element_ttl; 163293da9cc1Scolin@cozybit.com bool auto_open_plinks; 1633d299a1f2SJavier Cardona u32 dot11MeshNbrOffsetMaxNeighbor; 163493da9cc1Scolin@cozybit.com u8 dot11MeshHWMPmaxPREQretries; 163593da9cc1Scolin@cozybit.com u32 path_refresh_time; 163693da9cc1Scolin@cozybit.com u16 min_discovery_timeout; 163793da9cc1Scolin@cozybit.com u32 dot11MeshHWMPactivePathTimeout; 163893da9cc1Scolin@cozybit.com u16 dot11MeshHWMPpreqMinInterval; 1639dca7e943SThomas Pedersen u16 dot11MeshHWMPperrMinInterval; 164093da9cc1Scolin@cozybit.com u16 dot11MeshHWMPnetDiameterTraversalTime; 164163c5723bSRui Paulo u8 dot11MeshHWMPRootMode; 164201d66fbdSBob Copeland bool dot11MeshConnectedToMeshGate; 16430507e159SJavier Cardona u16 dot11MeshHWMPRannInterval; 164416dd7267SJavier Cardona bool dot11MeshGateAnnouncementProtocol; 164594f90656SChun-Yeow Yeoh bool dot11MeshForwarding; 164655335137SAshok Nagarajan s32 rssi_threshold; 164770c33eaaSAshok Nagarajan u16 ht_opmode; 1648ac1073a6SChun-Yeow Yeoh u32 dot11MeshHWMPactivePathToRootTimeout; 1649ac1073a6SChun-Yeow Yeoh u16 dot11MeshHWMProotInterval; 1650728b19e5SChun-Yeow Yeoh u16 dot11MeshHWMPconfirmationInterval; 16513b1c5a53SMarco Porsch enum nl80211_mesh_power_mode power_mode; 16523b1c5a53SMarco Porsch u16 dot11MeshAwakeWindowDuration; 16538e7c0538SColleen Twitty u32 plink_timeout; 165493da9cc1Scolin@cozybit.com }; 165593da9cc1Scolin@cozybit.com 165631888487SJouni Malinen /** 165729cbe68cSJohannes Berg * struct mesh_setup - 802.11s mesh setup configuration 1658683b6d3bSJohannes Berg * @chandef: defines the channel to use 165929cbe68cSJohannes Berg * @mesh_id: the mesh ID 166029cbe68cSJohannes Berg * @mesh_id_len: length of the mesh ID, at least 1 and at most 32 bytes 1661d299a1f2SJavier Cardona * @sync_method: which synchronization method to use 1662c80d545dSJavier Cardona * @path_sel_proto: which path selection protocol to use 1663c80d545dSJavier Cardona * @path_metric: which metric to use 16646e16d90bSColleen Twitty * @auth_id: which authentication method this mesh is using 1665581a8b0fSJavier Cardona * @ie: vendor information elements (optional) 1666581a8b0fSJavier Cardona * @ie_len: length of vendor information elements 1667b130e5ceSJavier Cardona * @is_authenticated: this mesh requires authentication 1668b130e5ceSJavier Cardona * @is_secure: this mesh uses security 1669bb2798d4SThomas Pedersen * @user_mpm: userspace handles all MPM functions 16709bdbf04dSMarco Porsch * @dtim_period: DTIM period to use 16719bdbf04dSMarco Porsch * @beacon_interval: beacon interval to use 16724bb62344SChun-Yeow Yeoh * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a] 1673ffb3cf30SAshok Nagarajan * @basic_rates: basic rates to use when creating the mesh 16748564e382SJohannes Berg * @beacon_rate: bitrate to be used for beacons 1675d37d49c2SBenjamin Berg * @userspace_handles_dfs: whether user space controls DFS operation, i.e. 1676d37d49c2SBenjamin Berg * changes the channel when a radar is detected. This is required 1677d37d49c2SBenjamin Berg * to operate on DFS channels. 16781224f583SDenis Kenzior * @control_port_over_nl80211: TRUE if userspace expects to exchange control 16791224f583SDenis Kenzior * port frames over NL80211 instead of the network interface. 168029cbe68cSJohannes Berg * 168129cbe68cSJohannes Berg * These parameters are fixed when the mesh is created. 168229cbe68cSJohannes Berg */ 168329cbe68cSJohannes Berg struct mesh_setup { 1684683b6d3bSJohannes Berg struct cfg80211_chan_def chandef; 168529cbe68cSJohannes Berg const u8 *mesh_id; 168629cbe68cSJohannes Berg u8 mesh_id_len; 1687d299a1f2SJavier Cardona u8 sync_method; 1688c80d545dSJavier Cardona u8 path_sel_proto; 1689c80d545dSJavier Cardona u8 path_metric; 16906e16d90bSColleen Twitty u8 auth_id; 1691581a8b0fSJavier Cardona const u8 *ie; 1692581a8b0fSJavier Cardona u8 ie_len; 1693b130e5ceSJavier Cardona bool is_authenticated; 169415d5dda6SJavier Cardona bool is_secure; 1695bb2798d4SThomas Pedersen bool user_mpm; 16969bdbf04dSMarco Porsch u8 dtim_period; 16979bdbf04dSMarco Porsch u16 beacon_interval; 169857fbcce3SJohannes Berg int mcast_rate[NUM_NL80211_BANDS]; 1699ffb3cf30SAshok Nagarajan u32 basic_rates; 17008564e382SJohannes Berg struct cfg80211_bitrate_mask beacon_rate; 1701d37d49c2SBenjamin Berg bool userspace_handles_dfs; 17021224f583SDenis Kenzior bool control_port_over_nl80211; 170329cbe68cSJohannes Berg }; 170429cbe68cSJohannes Berg 170529cbe68cSJohannes Berg /** 17066e0bd6c3SRostislav Lisovy * struct ocb_setup - 802.11p OCB mode setup configuration 17076e0bd6c3SRostislav Lisovy * @chandef: defines the channel to use 17086e0bd6c3SRostislav Lisovy * 17096e0bd6c3SRostislav Lisovy * These parameters are fixed when connecting to the network 17106e0bd6c3SRostislav Lisovy */ 17116e0bd6c3SRostislav Lisovy struct ocb_setup { 17126e0bd6c3SRostislav Lisovy struct cfg80211_chan_def chandef; 17136e0bd6c3SRostislav Lisovy }; 17146e0bd6c3SRostislav Lisovy 17156e0bd6c3SRostislav Lisovy /** 171631888487SJouni Malinen * struct ieee80211_txq_params - TX queue parameters 1717a3304b0aSJohannes Berg * @ac: AC identifier 171831888487SJouni Malinen * @txop: Maximum burst time in units of 32 usecs, 0 meaning disabled 171931888487SJouni Malinen * @cwmin: Minimum contention window [a value of the form 2^n-1 in the range 172031888487SJouni Malinen * 1..32767] 172131888487SJouni Malinen * @cwmax: Maximum contention window [a value of the form 2^n-1 in the range 172231888487SJouni Malinen * 1..32767] 172331888487SJouni Malinen * @aifs: Arbitration interframe space [0..255] 172431888487SJouni Malinen */ 172531888487SJouni Malinen struct ieee80211_txq_params { 1726a3304b0aSJohannes Berg enum nl80211_ac ac; 172731888487SJouni Malinen u16 txop; 172831888487SJouni Malinen u16 cwmin; 172931888487SJouni Malinen u16 cwmax; 173031888487SJouni Malinen u8 aifs; 173131888487SJouni Malinen }; 173231888487SJouni Malinen 1733d70e9693SJohannes Berg /** 1734d70e9693SJohannes Berg * DOC: Scanning and BSS list handling 1735d70e9693SJohannes Berg * 1736d70e9693SJohannes Berg * The scanning process itself is fairly simple, but cfg80211 offers quite 1737d70e9693SJohannes Berg * a bit of helper functionality. To start a scan, the scan operation will 1738d70e9693SJohannes Berg * be invoked with a scan definition. This scan definition contains the 1739d70e9693SJohannes Berg * channels to scan, and the SSIDs to send probe requests for (including the 1740d70e9693SJohannes Berg * wildcard, if desired). A passive scan is indicated by having no SSIDs to 1741d70e9693SJohannes Berg * probe. Additionally, a scan request may contain extra information elements 1742d70e9693SJohannes Berg * that should be added to the probe request. The IEs are guaranteed to be 1743d70e9693SJohannes Berg * well-formed, and will not exceed the maximum length the driver advertised 1744d70e9693SJohannes Berg * in the wiphy structure. 1745d70e9693SJohannes Berg * 1746d70e9693SJohannes Berg * When scanning finds a BSS, cfg80211 needs to be notified of that, because 1747d70e9693SJohannes Berg * it is responsible for maintaining the BSS list; the driver should not 1748d70e9693SJohannes Berg * maintain a list itself. For this notification, various functions exist. 1749d70e9693SJohannes Berg * 1750d70e9693SJohannes Berg * Since drivers do not maintain a BSS list, there are also a number of 1751d70e9693SJohannes Berg * functions to search for a BSS and obtain information about it from the 1752d70e9693SJohannes Berg * BSS structure cfg80211 maintains. The BSS list is also made available 1753d70e9693SJohannes Berg * to userspace. 1754d70e9693SJohannes Berg */ 175572bdcf34SJouni Malinen 1756704232c2SJohannes Berg /** 17572a519311SJohannes Berg * struct cfg80211_ssid - SSID description 17582a519311SJohannes Berg * @ssid: the SSID 17592a519311SJohannes Berg * @ssid_len: length of the ssid 17602a519311SJohannes Berg */ 17612a519311SJohannes Berg struct cfg80211_ssid { 17622a519311SJohannes Berg u8 ssid[IEEE80211_MAX_SSID_LEN]; 17632a519311SJohannes Berg u8 ssid_len; 17642a519311SJohannes Berg }; 17652a519311SJohannes Berg 17662a519311SJohannes Berg /** 17671d76250bSAvraham Stern * struct cfg80211_scan_info - information about completed scan 17681d76250bSAvraham Stern * @scan_start_tsf: scan start time in terms of the TSF of the BSS that the 17691d76250bSAvraham Stern * wireless device that requested the scan is connected to. If this 17701d76250bSAvraham Stern * information is not available, this field is left zero. 17711d76250bSAvraham Stern * @tsf_bssid: the BSSID according to which %scan_start_tsf is set. 17721d76250bSAvraham Stern * @aborted: set to true if the scan was aborted for any reason, 17731d76250bSAvraham Stern * userspace will be notified of that 17741d76250bSAvraham Stern */ 17751d76250bSAvraham Stern struct cfg80211_scan_info { 17761d76250bSAvraham Stern u64 scan_start_tsf; 17771d76250bSAvraham Stern u8 tsf_bssid[ETH_ALEN] __aligned(2); 17781d76250bSAvraham Stern bool aborted; 17791d76250bSAvraham Stern }; 17801d76250bSAvraham Stern 17811d76250bSAvraham Stern /** 17822a519311SJohannes Berg * struct cfg80211_scan_request - scan request description 17832a519311SJohannes Berg * 17842a519311SJohannes Berg * @ssids: SSIDs to scan for (active scan only) 17852a519311SJohannes Berg * @n_ssids: number of SSIDs 17862a519311SJohannes Berg * @channels: channels to scan on. 1787ca3dbc20SHelmut Schaa * @n_channels: total number of channels to scan 1788dcd6eac1SSimon Wunderlich * @scan_width: channel width for scanning 178970692ad2SJouni Malinen * @ie: optional information element(s) to add into Probe Request or %NULL 179070692ad2SJouni Malinen * @ie_len: length of ie in octets 17911d76250bSAvraham Stern * @duration: how long to listen on each channel, in TUs. If 17921d76250bSAvraham Stern * %duration_mandatory is not set, this is the maximum dwell time and 17931d76250bSAvraham Stern * the actual dwell time may be shorter. 17941d76250bSAvraham Stern * @duration_mandatory: if set, the scan duration must be as specified by the 17951d76250bSAvraham Stern * %duration field. 1796ed473771SSam Leffler * @flags: bit field of flags controlling operation 179734850ab2SJohannes Berg * @rates: bitmap of rates to advertise for each band 17982a519311SJohannes Berg * @wiphy: the wiphy this was for 179915d6030bSSam Leffler * @scan_start: time (in jiffies) when the scan started 1800fd014284SJohannes Berg * @wdev: the wireless device to scan for 18011d76250bSAvraham Stern * @info: (internal) information about completed scan 18025fe231e8SJohannes Berg * @notified: (internal) scan request was notified as done or aborted 1803e9f935e3SRajkumar Manoharan * @no_cck: used to send probe requests at non CCK rate in 2GHz band 1804ad2b26abSJohannes Berg * @mac_addr: MAC address used with randomisation 1805ad2b26abSJohannes Berg * @mac_addr_mask: MAC address mask used with randomisation, bits that 1806ad2b26abSJohannes Berg * are 0 in the mask should be randomised, bits that are 1 should 1807ad2b26abSJohannes Berg * be taken from the @mac_addr 1808818965d3SJouni Malinen * @bssid: BSSID to scan for (most commonly, the wildcard BSSID) 18092a519311SJohannes Berg */ 18102a519311SJohannes Berg struct cfg80211_scan_request { 18112a519311SJohannes Berg struct cfg80211_ssid *ssids; 18122a519311SJohannes Berg int n_ssids; 18132a519311SJohannes Berg u32 n_channels; 1814dcd6eac1SSimon Wunderlich enum nl80211_bss_scan_width scan_width; 1815de95a54bSJohannes Berg const u8 *ie; 181670692ad2SJouni Malinen size_t ie_len; 18171d76250bSAvraham Stern u16 duration; 18181d76250bSAvraham Stern bool duration_mandatory; 1819ed473771SSam Leffler u32 flags; 18202a519311SJohannes Berg 182157fbcce3SJohannes Berg u32 rates[NUM_NL80211_BANDS]; 182234850ab2SJohannes Berg 1823fd014284SJohannes Berg struct wireless_dev *wdev; 1824fd014284SJohannes Berg 1825ad2b26abSJohannes Berg u8 mac_addr[ETH_ALEN] __aligned(2); 1826ad2b26abSJohannes Berg u8 mac_addr_mask[ETH_ALEN] __aligned(2); 1827818965d3SJouni Malinen u8 bssid[ETH_ALEN] __aligned(2); 1828ad2b26abSJohannes Berg 18292a519311SJohannes Berg /* internal */ 18302a519311SJohannes Berg struct wiphy *wiphy; 183115d6030bSSam Leffler unsigned long scan_start; 18321d76250bSAvraham Stern struct cfg80211_scan_info info; 18331d76250bSAvraham Stern bool notified; 1834e9f935e3SRajkumar Manoharan bool no_cck; 18355ba63533SJohannes Berg 18365ba63533SJohannes Berg /* keep last */ 18375ba63533SJohannes Berg struct ieee80211_channel *channels[0]; 18382a519311SJohannes Berg }; 18392a519311SJohannes Berg 1840ad2b26abSJohannes Berg static inline void get_random_mask_addr(u8 *buf, const u8 *addr, const u8 *mask) 1841ad2b26abSJohannes Berg { 1842ad2b26abSJohannes Berg int i; 1843ad2b26abSJohannes Berg 1844ad2b26abSJohannes Berg get_random_bytes(buf, ETH_ALEN); 1845ad2b26abSJohannes Berg for (i = 0; i < ETH_ALEN; i++) { 1846ad2b26abSJohannes Berg buf[i] &= ~mask[i]; 1847ad2b26abSJohannes Berg buf[i] |= addr[i] & mask[i]; 1848ad2b26abSJohannes Berg } 1849ad2b26abSJohannes Berg } 1850ad2b26abSJohannes Berg 18512a519311SJohannes Berg /** 1852a1f1c21cSLuciano Coelho * struct cfg80211_match_set - sets of attributes to match 1853a1f1c21cSLuciano Coelho * 18543007e352SArend Van Spriel * @ssid: SSID to be matched; may be zero-length in case of BSSID match 18553007e352SArend Van Spriel * or no match (RSSI only) 18563007e352SArend Van Spriel * @bssid: BSSID to be matched; may be all-zero BSSID in case of SSID match 18573007e352SArend Van Spriel * or no match (RSSI only) 1858ea73cbceSJohannes Berg * @rssi_thold: don't report scan results below this threshold (in s32 dBm) 18591e1b11b6Svamsi krishna * @per_band_rssi_thold: Minimum rssi threshold for each band to be applied 18601e1b11b6Svamsi krishna * for filtering out scan results received. Drivers advertize this support 18611e1b11b6Svamsi krishna * of band specific rssi based filtering through the feature capability 18621e1b11b6Svamsi krishna * %NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD. These band 18631e1b11b6Svamsi krishna * specific rssi thresholds take precedence over rssi_thold, if specified. 18641e1b11b6Svamsi krishna * If not specified for any band, it will be assigned with rssi_thold of 18651e1b11b6Svamsi krishna * corresponding matchset. 1866a1f1c21cSLuciano Coelho */ 1867a1f1c21cSLuciano Coelho struct cfg80211_match_set { 1868a1f1c21cSLuciano Coelho struct cfg80211_ssid ssid; 18693007e352SArend Van Spriel u8 bssid[ETH_ALEN]; 1870ea73cbceSJohannes Berg s32 rssi_thold; 18711e1b11b6Svamsi krishna s32 per_band_rssi_thold[NUM_NL80211_BANDS]; 1872a1f1c21cSLuciano Coelho }; 1873a1f1c21cSLuciano Coelho 1874a1f1c21cSLuciano Coelho /** 18753b06d277SAvraham Stern * struct cfg80211_sched_scan_plan - scan plan for scheduled scan 18763b06d277SAvraham Stern * 18773b06d277SAvraham Stern * @interval: interval between scheduled scan iterations. In seconds. 18783b06d277SAvraham Stern * @iterations: number of scan iterations in this scan plan. Zero means 18793b06d277SAvraham Stern * infinite loop. 18803b06d277SAvraham Stern * The last scan plan will always have this parameter set to zero, 18813b06d277SAvraham Stern * all other scan plans will have a finite number of iterations. 18823b06d277SAvraham Stern */ 18833b06d277SAvraham Stern struct cfg80211_sched_scan_plan { 18843b06d277SAvraham Stern u32 interval; 18853b06d277SAvraham Stern u32 iterations; 18863b06d277SAvraham Stern }; 18873b06d277SAvraham Stern 18883b06d277SAvraham Stern /** 1889bf95ecdbSvamsi krishna * struct cfg80211_bss_select_adjust - BSS selection with RSSI adjustment. 1890bf95ecdbSvamsi krishna * 1891bf95ecdbSvamsi krishna * @band: band of BSS which should match for RSSI level adjustment. 1892bf95ecdbSvamsi krishna * @delta: value of RSSI level adjustment. 1893bf95ecdbSvamsi krishna */ 1894bf95ecdbSvamsi krishna struct cfg80211_bss_select_adjust { 1895bf95ecdbSvamsi krishna enum nl80211_band band; 1896bf95ecdbSvamsi krishna s8 delta; 1897bf95ecdbSvamsi krishna }; 1898bf95ecdbSvamsi krishna 1899bf95ecdbSvamsi krishna /** 1900807f8a8cSLuciano Coelho * struct cfg80211_sched_scan_request - scheduled scan request description 1901807f8a8cSLuciano Coelho * 190296b08fd6SArend Van Spriel * @reqid: identifies this request. 1903807f8a8cSLuciano Coelho * @ssids: SSIDs to scan for (passed in the probe_reqs in active scans) 1904807f8a8cSLuciano Coelho * @n_ssids: number of SSIDs 1905807f8a8cSLuciano Coelho * @n_channels: total number of channels to scan 1906dcd6eac1SSimon Wunderlich * @scan_width: channel width for scanning 1907807f8a8cSLuciano Coelho * @ie: optional information element(s) to add into Probe Request or %NULL 1908807f8a8cSLuciano Coelho * @ie_len: length of ie in octets 1909ed473771SSam Leffler * @flags: bit field of flags controlling operation 1910a1f1c21cSLuciano Coelho * @match_sets: sets of parameters to be matched for a scan result 1911a1f1c21cSLuciano Coelho * entry to be considered valid and to be passed to the host 1912a1f1c21cSLuciano Coelho * (others are filtered out). 1913a1f1c21cSLuciano Coelho * If ommited, all results are passed. 1914a1f1c21cSLuciano Coelho * @n_match_sets: number of match sets 19156406c919SJohannes Berg * @report_results: indicates that results were reported for this request 1916807f8a8cSLuciano Coelho * @wiphy: the wiphy this was for 1917807f8a8cSLuciano Coelho * @dev: the interface 1918077f897aSJohannes Berg * @scan_start: start time of the scheduled scan 1919807f8a8cSLuciano Coelho * @channels: channels to scan 1920ea73cbceSJohannes Berg * @min_rssi_thold: for drivers only supporting a single threshold, this 1921ea73cbceSJohannes Berg * contains the minimum over all matchsets 1922ad2b26abSJohannes Berg * @mac_addr: MAC address used with randomisation 1923ad2b26abSJohannes Berg * @mac_addr_mask: MAC address mask used with randomisation, bits that 1924ad2b26abSJohannes Berg * are 0 in the mask should be randomised, bits that are 1 should 1925ad2b26abSJohannes Berg * be taken from the @mac_addr 19263b06d277SAvraham Stern * @scan_plans: scan plans to be executed in this scheduled scan. Lowest 19273b06d277SAvraham Stern * index must be executed first. 19283b06d277SAvraham Stern * @n_scan_plans: number of scan plans, at least 1. 192931a60ed1SJukka Rissanen * @rcu_head: RCU callback used to free the struct 193093a1e86cSJukka Rissanen * @owner_nlportid: netlink portid of owner (if this should is a request 193193a1e86cSJukka Rissanen * owned by a particular socket) 1932ca986ad9SArend Van Spriel * @nl_owner_dead: netlink owner socket was closed - this request be freed 1933ca986ad9SArend Van Spriel * @list: for keeping list of requests. 19349c748934SLuciano Coelho * @delay: delay in seconds to use before starting the first scan 19359c748934SLuciano Coelho * cycle. The driver may ignore this parameter and start 19369c748934SLuciano Coelho * immediately (or at any other time), if this feature is not 19379c748934SLuciano Coelho * supported. 1938bf95ecdbSvamsi krishna * @relative_rssi_set: Indicates whether @relative_rssi is set or not. 1939bf95ecdbSvamsi krishna * @relative_rssi: Relative RSSI threshold in dB to restrict scan result 1940bf95ecdbSvamsi krishna * reporting in connected state to cases where a matching BSS is determined 1941bf95ecdbSvamsi krishna * to have better or slightly worse RSSI than the current connected BSS. 1942bf95ecdbSvamsi krishna * The relative RSSI threshold values are ignored in disconnected state. 1943bf95ecdbSvamsi krishna * @rssi_adjust: delta dB of RSSI preference to be given to the BSSs that belong 1944bf95ecdbSvamsi krishna * to the specified band while deciding whether a better BSS is reported 1945bf95ecdbSvamsi krishna * using @relative_rssi. If delta is a negative number, the BSSs that 1946bf95ecdbSvamsi krishna * belong to the specified band will be penalized by delta dB in relative 1947bf95ecdbSvamsi krishna * comparisions. 1948807f8a8cSLuciano Coelho */ 1949807f8a8cSLuciano Coelho struct cfg80211_sched_scan_request { 195096b08fd6SArend Van Spriel u64 reqid; 1951807f8a8cSLuciano Coelho struct cfg80211_ssid *ssids; 1952807f8a8cSLuciano Coelho int n_ssids; 1953807f8a8cSLuciano Coelho u32 n_channels; 1954dcd6eac1SSimon Wunderlich enum nl80211_bss_scan_width scan_width; 1955807f8a8cSLuciano Coelho const u8 *ie; 1956807f8a8cSLuciano Coelho size_t ie_len; 1957ed473771SSam Leffler u32 flags; 1958a1f1c21cSLuciano Coelho struct cfg80211_match_set *match_sets; 1959a1f1c21cSLuciano Coelho int n_match_sets; 1960ea73cbceSJohannes Berg s32 min_rssi_thold; 19619c748934SLuciano Coelho u32 delay; 19623b06d277SAvraham Stern struct cfg80211_sched_scan_plan *scan_plans; 19633b06d277SAvraham Stern int n_scan_plans; 1964807f8a8cSLuciano Coelho 1965ad2b26abSJohannes Berg u8 mac_addr[ETH_ALEN] __aligned(2); 1966ad2b26abSJohannes Berg u8 mac_addr_mask[ETH_ALEN] __aligned(2); 1967ad2b26abSJohannes Berg 1968bf95ecdbSvamsi krishna bool relative_rssi_set; 1969bf95ecdbSvamsi krishna s8 relative_rssi; 1970bf95ecdbSvamsi krishna struct cfg80211_bss_select_adjust rssi_adjust; 1971bf95ecdbSvamsi krishna 1972807f8a8cSLuciano Coelho /* internal */ 1973807f8a8cSLuciano Coelho struct wiphy *wiphy; 1974807f8a8cSLuciano Coelho struct net_device *dev; 197515d6030bSSam Leffler unsigned long scan_start; 1976b34939b9SArend Van Spriel bool report_results; 197731a60ed1SJukka Rissanen struct rcu_head rcu_head; 197893a1e86cSJukka Rissanen u32 owner_nlportid; 1979ca986ad9SArend Van Spriel bool nl_owner_dead; 1980ca986ad9SArend Van Spriel struct list_head list; 1981807f8a8cSLuciano Coelho 1982807f8a8cSLuciano Coelho /* keep last */ 1983807f8a8cSLuciano Coelho struct ieee80211_channel *channels[0]; 1984807f8a8cSLuciano Coelho }; 1985807f8a8cSLuciano Coelho 1986807f8a8cSLuciano Coelho /** 19872a519311SJohannes Berg * enum cfg80211_signal_type - signal type 19882a519311SJohannes Berg * 19892a519311SJohannes Berg * @CFG80211_SIGNAL_TYPE_NONE: no signal strength information available 19902a519311SJohannes Berg * @CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) 19912a519311SJohannes Berg * @CFG80211_SIGNAL_TYPE_UNSPEC: signal strength, increasing from 0 through 100 19922a519311SJohannes Berg */ 19932a519311SJohannes Berg enum cfg80211_signal_type { 19942a519311SJohannes Berg CFG80211_SIGNAL_TYPE_NONE, 19952a519311SJohannes Berg CFG80211_SIGNAL_TYPE_MBM, 19962a519311SJohannes Berg CFG80211_SIGNAL_TYPE_UNSPEC, 19972a519311SJohannes Berg }; 19982a519311SJohannes Berg 19992a519311SJohannes Berg /** 20006e19bc4bSDmitry Shmidt * struct cfg80211_inform_bss - BSS inform data 20016e19bc4bSDmitry Shmidt * @chan: channel the frame was received on 20026e19bc4bSDmitry Shmidt * @scan_width: scan width that was used 20036e19bc4bSDmitry Shmidt * @signal: signal strength value, according to the wiphy's 20046e19bc4bSDmitry Shmidt * signal type 20056e19bc4bSDmitry Shmidt * @boottime_ns: timestamp (CLOCK_BOOTTIME) when the information was 20066e19bc4bSDmitry Shmidt * received; should match the time when the frame was actually 20076e19bc4bSDmitry Shmidt * received by the device (not just by the host, in case it was 20086e19bc4bSDmitry Shmidt * buffered on the device) and be accurate to about 10ms. 20096e19bc4bSDmitry Shmidt * If the frame isn't buffered, just passing the return value of 20106e19bc4bSDmitry Shmidt * ktime_get_boot_ns() is likely appropriate. 20111d76250bSAvraham Stern * @parent_tsf: the time at the start of reception of the first octet of the 20121d76250bSAvraham Stern * timestamp field of the frame. The time is the TSF of the BSS specified 20131d76250bSAvraham Stern * by %parent_bssid. 20141d76250bSAvraham Stern * @parent_bssid: the BSS according to which %parent_tsf is set. This is set to 20151d76250bSAvraham Stern * the BSS that requested the scan in which the beacon/probe was received. 2016983dafaaSSunil Dutt * @chains: bitmask for filled values in @chain_signal. 2017983dafaaSSunil Dutt * @chain_signal: per-chain signal strength of last received BSS in dBm. 20186e19bc4bSDmitry Shmidt */ 20196e19bc4bSDmitry Shmidt struct cfg80211_inform_bss { 20206e19bc4bSDmitry Shmidt struct ieee80211_channel *chan; 20216e19bc4bSDmitry Shmidt enum nl80211_bss_scan_width scan_width; 20226e19bc4bSDmitry Shmidt s32 signal; 20236e19bc4bSDmitry Shmidt u64 boottime_ns; 20241d76250bSAvraham Stern u64 parent_tsf; 20251d76250bSAvraham Stern u8 parent_bssid[ETH_ALEN] __aligned(2); 2026983dafaaSSunil Dutt u8 chains; 2027983dafaaSSunil Dutt s8 chain_signal[IEEE80211_MAX_CHAINS]; 20286e19bc4bSDmitry Shmidt }; 20296e19bc4bSDmitry Shmidt 20306e19bc4bSDmitry Shmidt /** 20312aa4d456SAkira Moroo * struct cfg80211_bss_ies - BSS entry IE data 20328cef2c9dSJohannes Berg * @tsf: TSF contained in the frame that carried these IEs 20339caf0364SJohannes Berg * @rcu_head: internal use, for freeing 20349caf0364SJohannes Berg * @len: length of the IEs 20350e227084SJohannes Berg * @from_beacon: these IEs are known to come from a beacon 20369caf0364SJohannes Berg * @data: IE data 20379caf0364SJohannes Berg */ 20389caf0364SJohannes Berg struct cfg80211_bss_ies { 20398cef2c9dSJohannes Berg u64 tsf; 20409caf0364SJohannes Berg struct rcu_head rcu_head; 20419caf0364SJohannes Berg int len; 20420e227084SJohannes Berg bool from_beacon; 20439caf0364SJohannes Berg u8 data[]; 20449caf0364SJohannes Berg }; 20459caf0364SJohannes Berg 20469caf0364SJohannes Berg /** 20472a519311SJohannes Berg * struct cfg80211_bss - BSS description 20482a519311SJohannes Berg * 20492a519311SJohannes Berg * This structure describes a BSS (which may also be a mesh network) 20502a519311SJohannes Berg * for use in scan results and similar. 20512a519311SJohannes Berg * 2052abe37c4bSJohannes Berg * @channel: channel this BSS is on 2053dcd6eac1SSimon Wunderlich * @scan_width: width of the control channel 20542a519311SJohannes Berg * @bssid: BSSID of the BSS 20552a519311SJohannes Berg * @beacon_interval: the beacon interval as from the frame 20562a519311SJohannes Berg * @capability: the capability field in host byte order 205783c7aa1aSJohannes Berg * @ies: the information elements (Note that there is no guarantee that these 205883c7aa1aSJohannes Berg * are well-formed!); this is a pointer to either the beacon_ies or 205983c7aa1aSJohannes Berg * proberesp_ies depending on whether Probe Response frame has been 206083c7aa1aSJohannes Berg * received. It is always non-%NULL. 206134a6eddbSJouni Malinen * @beacon_ies: the information elements from the last Beacon frame 2062776b3580SJohannes Berg * (implementation note: if @hidden_beacon_bss is set this struct doesn't 2063776b3580SJohannes Berg * own the beacon_ies, but they're just pointers to the ones from the 2064776b3580SJohannes Berg * @hidden_beacon_bss struct) 206534a6eddbSJouni Malinen * @proberesp_ies: the information elements from the last Probe Response frame 2066776b3580SJohannes Berg * @hidden_beacon_bss: in case this BSS struct represents a probe response from 2067776b3580SJohannes Berg * a BSS that hides the SSID in its beacon, this points to the BSS struct 2068776b3580SJohannes Berg * that holds the beacon data. @beacon_ies is still valid, of course, and 2069776b3580SJohannes Berg * points to the same data as hidden_beacon_bss->beacon_ies in that case. 2070851ae31dSJohannes Berg * @transmitted_bss: pointer to the transmitted BSS, if this is a 2071851ae31dSJohannes Berg * non-transmitted one (multi-BSSID support) 2072851ae31dSJohannes Berg * @nontrans_list: list of non-transmitted BSS, if this is a transmitted one 2073851ae31dSJohannes Berg * (multi-BSSID support) 207477965c97SJohannes Berg * @signal: signal strength value (type depends on the wiphy's signal_type) 2075983dafaaSSunil Dutt * @chains: bitmask for filled values in @chain_signal. 2076983dafaaSSunil Dutt * @chain_signal: per-chain signal strength of last received BSS in dBm. 20770cd01efbSSara Sharon * @bssid_index: index in the multiple BSS set 20780cd01efbSSara Sharon * @max_bssid_indicator: max number of members in the BSS set 20792a519311SJohannes Berg * @priv: private area for driver use, has at least wiphy->bss_priv_size bytes 20802a519311SJohannes Berg */ 20812a519311SJohannes Berg struct cfg80211_bss { 20822a519311SJohannes Berg struct ieee80211_channel *channel; 2083dcd6eac1SSimon Wunderlich enum nl80211_bss_scan_width scan_width; 20842a519311SJohannes Berg 20859caf0364SJohannes Berg const struct cfg80211_bss_ies __rcu *ies; 20869caf0364SJohannes Berg const struct cfg80211_bss_ies __rcu *beacon_ies; 20879caf0364SJohannes Berg const struct cfg80211_bss_ies __rcu *proberesp_ies; 20889caf0364SJohannes Berg 2089776b3580SJohannes Berg struct cfg80211_bss *hidden_beacon_bss; 20907011ba58SSara Sharon struct cfg80211_bss *transmitted_bss; 20917011ba58SSara Sharon struct list_head nontrans_list; 20922a519311SJohannes Berg 20932a519311SJohannes Berg s32 signal; 20942a519311SJohannes Berg 20959caf0364SJohannes Berg u16 beacon_interval; 20969caf0364SJohannes Berg u16 capability; 20979caf0364SJohannes Berg 20989caf0364SJohannes Berg u8 bssid[ETH_ALEN]; 2099983dafaaSSunil Dutt u8 chains; 2100983dafaaSSunil Dutt s8 chain_signal[IEEE80211_MAX_CHAINS]; 21019caf0364SJohannes Berg 21020cd01efbSSara Sharon u8 bssid_index; 21030cd01efbSSara Sharon u8 max_bssid_indicator; 21040cd01efbSSara Sharon 21051c06ef98SJohannes Berg u8 priv[0] __aligned(sizeof(void *)); 21062a519311SJohannes Berg }; 21072a519311SJohannes Berg 21082a519311SJohannes Berg /** 210949a68e0dSJohannes Berg * ieee80211_bss_get_elem - find element with given ID 2110517357c6SJohannes Berg * @bss: the bss to search 211149a68e0dSJohannes Berg * @id: the element ID 21129caf0364SJohannes Berg * 21139caf0364SJohannes Berg * Note that the return value is an RCU-protected pointer, so 21149caf0364SJohannes Berg * rcu_read_lock() must be held when calling this function. 21150ae997dcSYacine Belkadi * Return: %NULL if not found. 2116517357c6SJohannes Berg */ 211749a68e0dSJohannes Berg const struct element *ieee80211_bss_get_elem(struct cfg80211_bss *bss, u8 id); 211849a68e0dSJohannes Berg 211949a68e0dSJohannes Berg /** 212049a68e0dSJohannes Berg * ieee80211_bss_get_ie - find IE with given ID 212149a68e0dSJohannes Berg * @bss: the bss to search 212249a68e0dSJohannes Berg * @id: the element ID 212349a68e0dSJohannes Berg * 212449a68e0dSJohannes Berg * Note that the return value is an RCU-protected pointer, so 212549a68e0dSJohannes Berg * rcu_read_lock() must be held when calling this function. 212649a68e0dSJohannes Berg * Return: %NULL if not found. 212749a68e0dSJohannes Berg */ 212849a68e0dSJohannes Berg static inline const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 id) 212949a68e0dSJohannes Berg { 213049a68e0dSJohannes Berg return (void *)ieee80211_bss_get_elem(bss, id); 213149a68e0dSJohannes Berg } 2132517357c6SJohannes Berg 2133517357c6SJohannes Berg 2134517357c6SJohannes Berg /** 2135636a5d36SJouni Malinen * struct cfg80211_auth_request - Authentication request data 2136636a5d36SJouni Malinen * 2137636a5d36SJouni Malinen * This structure provides information needed to complete IEEE 802.11 2138636a5d36SJouni Malinen * authentication. 2139636a5d36SJouni Malinen * 2140959867faSJohannes Berg * @bss: The BSS to authenticate with, the callee must obtain a reference 2141959867faSJohannes Berg * to it if it needs to keep it. 2142636a5d36SJouni Malinen * @auth_type: Authentication type (algorithm) 2143636a5d36SJouni Malinen * @ie: Extra IEs to add to Authentication frame or %NULL 2144636a5d36SJouni Malinen * @ie_len: Length of ie buffer in octets 2145fffd0934SJohannes Berg * @key_len: length of WEP key for shared key authentication 2146fffd0934SJohannes Berg * @key_idx: index of WEP key for shared key authentication 2147fffd0934SJohannes Berg * @key: WEP key for shared key authentication 214811b6b5a4SJouni Malinen * @auth_data: Fields and elements in Authentication frames. This contains 214911b6b5a4SJouni Malinen * the authentication frame body (non-IE and IE data), excluding the 215011b6b5a4SJouni Malinen * Authentication algorithm number, i.e., starting at the Authentication 215111b6b5a4SJouni Malinen * transaction sequence number field. 215211b6b5a4SJouni Malinen * @auth_data_len: Length of auth_data buffer in octets 2153636a5d36SJouni Malinen */ 2154636a5d36SJouni Malinen struct cfg80211_auth_request { 215519957bb3SJohannes Berg struct cfg80211_bss *bss; 2156636a5d36SJouni Malinen const u8 *ie; 2157636a5d36SJouni Malinen size_t ie_len; 215819957bb3SJohannes Berg enum nl80211_auth_type auth_type; 2159fffd0934SJohannes Berg const u8 *key; 2160fffd0934SJohannes Berg u8 key_len, key_idx; 216111b6b5a4SJouni Malinen const u8 *auth_data; 216211b6b5a4SJouni Malinen size_t auth_data_len; 2163636a5d36SJouni Malinen }; 2164636a5d36SJouni Malinen 2165636a5d36SJouni Malinen /** 21667e7c8926SBen Greear * enum cfg80211_assoc_req_flags - Over-ride default behaviour in association. 21677e7c8926SBen Greear * 21687e7c8926SBen Greear * @ASSOC_REQ_DISABLE_HT: Disable HT (802.11n) 2169ee2aca34SJohannes Berg * @ASSOC_REQ_DISABLE_VHT: Disable VHT 2170bab5ab7dSAssaf Krauss * @ASSOC_REQ_USE_RRM: Declare RRM capability in this association 217140cbfa90SSrinivas Dasari * @CONNECT_REQ_EXTERNAL_AUTH_SUPPORT: User space indicates external 217240cbfa90SSrinivas Dasari * authentication capability. Drivers can offload authentication to 217340cbfa90SSrinivas Dasari * userspace if this flag is set. Only applicable for cfg80211_connect() 217440cbfa90SSrinivas Dasari * request (connect callback). 21757e7c8926SBen Greear */ 21767e7c8926SBen Greear enum cfg80211_assoc_req_flags { 21777e7c8926SBen Greear ASSOC_REQ_DISABLE_HT = BIT(0), 2178ee2aca34SJohannes Berg ASSOC_REQ_DISABLE_VHT = BIT(1), 2179bab5ab7dSAssaf Krauss ASSOC_REQ_USE_RRM = BIT(2), 218040cbfa90SSrinivas Dasari CONNECT_REQ_EXTERNAL_AUTH_SUPPORT = BIT(3), 21817e7c8926SBen Greear }; 21827e7c8926SBen Greear 21837e7c8926SBen Greear /** 2184636a5d36SJouni Malinen * struct cfg80211_assoc_request - (Re)Association request data 2185636a5d36SJouni Malinen * 2186636a5d36SJouni Malinen * This structure provides information needed to complete IEEE 802.11 2187636a5d36SJouni Malinen * (re)association. 2188959867faSJohannes Berg * @bss: The BSS to associate with. If the call is successful the driver is 2189959867faSJohannes Berg * given a reference that it must give back to cfg80211_send_rx_assoc() 2190959867faSJohannes Berg * or to cfg80211_assoc_timeout(). To ensure proper refcounting, new 2191959867faSJohannes Berg * association requests while already associating must be rejected. 2192636a5d36SJouni Malinen * @ie: Extra IEs to add to (Re)Association Request frame or %NULL 2193636a5d36SJouni Malinen * @ie_len: Length of ie buffer in octets 2194dc6382ceSJouni Malinen * @use_mfp: Use management frame protection (IEEE 802.11w) in this association 2195b23aa676SSamuel Ortiz * @crypto: crypto settings 219635eb8f7bSJouni Malinen * @prev_bssid: previous BSSID, if not %NULL use reassociate frame. This is used 219735eb8f7bSJouni Malinen * to indicate a request to reassociate within the ESS instead of a request 219835eb8f7bSJouni Malinen * do the initial association with the ESS. When included, this is set to 219935eb8f7bSJouni Malinen * the BSSID of the current association, i.e., to the value that is 220035eb8f7bSJouni Malinen * included in the Current AP address field of the Reassociation Request 220135eb8f7bSJouni Malinen * frame. 22027e7c8926SBen Greear * @flags: See &enum cfg80211_assoc_req_flags 22037e7c8926SBen Greear * @ht_capa: HT Capabilities over-rides. Values set in ht_capa_mask 22047e7c8926SBen Greear * will be used in ht_capa. Un-supported values will be ignored. 22057e7c8926SBen Greear * @ht_capa_mask: The bits of ht_capa which are to be used. 2206ee2aca34SJohannes Berg * @vht_capa: VHT capability override 2207ee2aca34SJohannes Berg * @vht_capa_mask: VHT capability mask indicating which fields to use 2208348bd456SJouni Malinen * @fils_kek: FILS KEK for protecting (Re)Association Request/Response frame or 2209348bd456SJouni Malinen * %NULL if FILS is not used. 2210348bd456SJouni Malinen * @fils_kek_len: Length of fils_kek in octets 2211348bd456SJouni Malinen * @fils_nonces: FILS nonces (part of AAD) for protecting (Re)Association 2212348bd456SJouni Malinen * Request/Response frame or %NULL if FILS is not used. This field starts 2213348bd456SJouni Malinen * with 16 octets of STA Nonce followed by 16 octets of AP Nonce. 2214636a5d36SJouni Malinen */ 2215636a5d36SJouni Malinen struct cfg80211_assoc_request { 221619957bb3SJohannes Berg struct cfg80211_bss *bss; 22173e5d7649SJohannes Berg const u8 *ie, *prev_bssid; 2218636a5d36SJouni Malinen size_t ie_len; 2219b23aa676SSamuel Ortiz struct cfg80211_crypto_settings crypto; 222019957bb3SJohannes Berg bool use_mfp; 22217e7c8926SBen Greear u32 flags; 22227e7c8926SBen Greear struct ieee80211_ht_cap ht_capa; 22237e7c8926SBen Greear struct ieee80211_ht_cap ht_capa_mask; 2224ee2aca34SJohannes Berg struct ieee80211_vht_cap vht_capa, vht_capa_mask; 2225348bd456SJouni Malinen const u8 *fils_kek; 2226348bd456SJouni Malinen size_t fils_kek_len; 2227348bd456SJouni Malinen const u8 *fils_nonces; 2228636a5d36SJouni Malinen }; 2229636a5d36SJouni Malinen 2230636a5d36SJouni Malinen /** 2231636a5d36SJouni Malinen * struct cfg80211_deauth_request - Deauthentication request data 2232636a5d36SJouni Malinen * 2233636a5d36SJouni Malinen * This structure provides information needed to complete IEEE 802.11 2234636a5d36SJouni Malinen * deauthentication. 2235636a5d36SJouni Malinen * 223695de817bSJohannes Berg * @bssid: the BSSID of the BSS to deauthenticate from 2237636a5d36SJouni Malinen * @ie: Extra IEs to add to Deauthentication frame or %NULL 2238636a5d36SJouni Malinen * @ie_len: Length of ie buffer in octets 223919957bb3SJohannes Berg * @reason_code: The reason code for the deauthentication 2240077f897aSJohannes Berg * @local_state_change: if set, change local state only and 2241077f897aSJohannes Berg * do not set a deauth frame 2242636a5d36SJouni Malinen */ 2243636a5d36SJouni Malinen struct cfg80211_deauth_request { 224495de817bSJohannes Berg const u8 *bssid; 2245636a5d36SJouni Malinen const u8 *ie; 2246636a5d36SJouni Malinen size_t ie_len; 224719957bb3SJohannes Berg u16 reason_code; 22486863255bSStanislaw Gruszka bool local_state_change; 2249636a5d36SJouni Malinen }; 2250636a5d36SJouni Malinen 2251636a5d36SJouni Malinen /** 2252636a5d36SJouni Malinen * struct cfg80211_disassoc_request - Disassociation request data 2253636a5d36SJouni Malinen * 2254636a5d36SJouni Malinen * This structure provides information needed to complete IEEE 802.11 225566f00449SMasahiro Yamada * disassociation. 2256636a5d36SJouni Malinen * 225719957bb3SJohannes Berg * @bss: the BSS to disassociate from 2258636a5d36SJouni Malinen * @ie: Extra IEs to add to Disassociation frame or %NULL 2259636a5d36SJouni Malinen * @ie_len: Length of ie buffer in octets 226019957bb3SJohannes Berg * @reason_code: The reason code for the disassociation 2261d5cdfacbSJouni Malinen * @local_state_change: This is a request for a local state only, i.e., no 2262d5cdfacbSJouni Malinen * Disassociation frame is to be transmitted. 2263636a5d36SJouni Malinen */ 2264636a5d36SJouni Malinen struct cfg80211_disassoc_request { 226519957bb3SJohannes Berg struct cfg80211_bss *bss; 2266636a5d36SJouni Malinen const u8 *ie; 2267636a5d36SJouni Malinen size_t ie_len; 226819957bb3SJohannes Berg u16 reason_code; 2269d5cdfacbSJouni Malinen bool local_state_change; 2270636a5d36SJouni Malinen }; 2271636a5d36SJouni Malinen 2272636a5d36SJouni Malinen /** 227304a773adSJohannes Berg * struct cfg80211_ibss_params - IBSS parameters 227404a773adSJohannes Berg * 227504a773adSJohannes Berg * This structure defines the IBSS parameters for the join_ibss() 227604a773adSJohannes Berg * method. 227704a773adSJohannes Berg * 227804a773adSJohannes Berg * @ssid: The SSID, will always be non-null. 227904a773adSJohannes Berg * @ssid_len: The length of the SSID, will always be non-zero. 228004a773adSJohannes Berg * @bssid: Fixed BSSID requested, maybe be %NULL, if set do not 228104a773adSJohannes Berg * search for IBSSs with a different BSSID. 2282683b6d3bSJohannes Berg * @chandef: defines the channel to use if no other IBSS to join can be found 228304a773adSJohannes Berg * @channel_fixed: The channel should be fixed -- do not search for 228404a773adSJohannes Berg * IBSSs to join on other channels. 228504a773adSJohannes Berg * @ie: information element(s) to include in the beacon 228604a773adSJohannes Berg * @ie_len: length of that 22878e30bc55SJohannes Berg * @beacon_interval: beacon interval to use 2288fffd0934SJohannes Berg * @privacy: this is a protected network, keys will be configured 2289fffd0934SJohannes Berg * after joining 2290267335d6SAntonio Quartulli * @control_port: whether user space controls IEEE 802.1X port, i.e., 2291267335d6SAntonio Quartulli * sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is 2292267335d6SAntonio Quartulli * required to assume that the port is unauthorized until authorized by 2293267335d6SAntonio Quartulli * user space. Otherwise, port is marked authorized by default. 2294c3bfe1f6SDenis Kenzior * @control_port_over_nl80211: TRUE if userspace expects to exchange control 2295c3bfe1f6SDenis Kenzior * port frames over NL80211 instead of the network interface. 22965336fa88SSimon Wunderlich * @userspace_handles_dfs: whether user space controls DFS operation, i.e. 22975336fa88SSimon Wunderlich * changes the channel when a radar is detected. This is required 22985336fa88SSimon Wunderlich * to operate on DFS channels. 2299fbd2c8dcSTeemu Paasikivi * @basic_rates: bitmap of basic rates to use when creating the IBSS 2300dd5b4cc7SFelix Fietkau * @mcast_rate: per-band multicast rate index + 1 (0: disabled) 2301803768f5SSimon Wunderlich * @ht_capa: HT Capabilities over-rides. Values set in ht_capa_mask 2302803768f5SSimon Wunderlich * will be used in ht_capa. Un-supported values will be ignored. 2303803768f5SSimon Wunderlich * @ht_capa_mask: The bits of ht_capa which are to be used. 23049ae3b172STova Mussai * @wep_keys: static WEP keys, if not NULL points to an array of 23059ae3b172STova Mussai * CFG80211_MAX_WEP_KEYS WEP keys 23069ae3b172STova Mussai * @wep_tx_key: key index (0..3) of the default TX static WEP key 230704a773adSJohannes Berg */ 230804a773adSJohannes Berg struct cfg80211_ibss_params { 2309c1e5f471SJohannes Berg const u8 *ssid; 2310c1e5f471SJohannes Berg const u8 *bssid; 2311683b6d3bSJohannes Berg struct cfg80211_chan_def chandef; 2312c1e5f471SJohannes Berg const u8 *ie; 231304a773adSJohannes Berg u8 ssid_len, ie_len; 23148e30bc55SJohannes Berg u16 beacon_interval; 2315fbd2c8dcSTeemu Paasikivi u32 basic_rates; 231604a773adSJohannes Berg bool channel_fixed; 2317fffd0934SJohannes Berg bool privacy; 2318267335d6SAntonio Quartulli bool control_port; 2319c3bfe1f6SDenis Kenzior bool control_port_over_nl80211; 23205336fa88SSimon Wunderlich bool userspace_handles_dfs; 232157fbcce3SJohannes Berg int mcast_rate[NUM_NL80211_BANDS]; 2322803768f5SSimon Wunderlich struct ieee80211_ht_cap ht_capa; 2323803768f5SSimon Wunderlich struct ieee80211_ht_cap ht_capa_mask; 23249ae3b172STova Mussai struct key_params *wep_keys; 23259ae3b172STova Mussai int wep_tx_key; 232604a773adSJohannes Berg }; 232704a773adSJohannes Berg 232804a773adSJohannes Berg /** 232938de03d2SArend van Spriel * struct cfg80211_bss_selection - connection parameters for BSS selection. 233038de03d2SArend van Spriel * 233138de03d2SArend van Spriel * @behaviour: requested BSS selection behaviour. 233238de03d2SArend van Spriel * @param: parameters for requestion behaviour. 233338de03d2SArend van Spriel * @band_pref: preferred band for %NL80211_BSS_SELECT_ATTR_BAND_PREF. 233438de03d2SArend van Spriel * @adjust: parameters for %NL80211_BSS_SELECT_ATTR_RSSI_ADJUST. 233538de03d2SArend van Spriel */ 233638de03d2SArend van Spriel struct cfg80211_bss_selection { 233738de03d2SArend van Spriel enum nl80211_bss_select_attr behaviour; 233838de03d2SArend van Spriel union { 233957fbcce3SJohannes Berg enum nl80211_band band_pref; 234038de03d2SArend van Spriel struct cfg80211_bss_select_adjust adjust; 234138de03d2SArend van Spriel } param; 234238de03d2SArend van Spriel }; 234338de03d2SArend van Spriel 234438de03d2SArend van Spriel /** 2345b23aa676SSamuel Ortiz * struct cfg80211_connect_params - Connection parameters 2346b23aa676SSamuel Ortiz * 2347b23aa676SSamuel Ortiz * This structure provides information needed to complete IEEE 802.11 2348b23aa676SSamuel Ortiz * authentication and association. 2349b23aa676SSamuel Ortiz * 2350b23aa676SSamuel Ortiz * @channel: The channel to use or %NULL if not specified (auto-select based 2351b23aa676SSamuel Ortiz * on scan results) 23521df4a510SJouni Malinen * @channel_hint: The channel of the recommended BSS for initial connection or 23531df4a510SJouni Malinen * %NULL if not specified 2354b23aa676SSamuel Ortiz * @bssid: The AP BSSID or %NULL if not specified (auto-select based on scan 2355b23aa676SSamuel Ortiz * results) 23561df4a510SJouni Malinen * @bssid_hint: The recommended AP BSSID for initial connection to the BSS or 23571df4a510SJouni Malinen * %NULL if not specified. Unlike the @bssid parameter, the driver is 23581df4a510SJouni Malinen * allowed to ignore this @bssid_hint if it has knowledge of a better BSS 23591df4a510SJouni Malinen * to use. 2360b23aa676SSamuel Ortiz * @ssid: SSID 2361b23aa676SSamuel Ortiz * @ssid_len: Length of ssid in octets 2362b23aa676SSamuel Ortiz * @auth_type: Authentication type (algorithm) 2363abe37c4bSJohannes Berg * @ie: IEs for association request 2364abe37c4bSJohannes Berg * @ie_len: Length of assoc_ie in octets 2365b23aa676SSamuel Ortiz * @privacy: indicates whether privacy-enabled APs should be used 2366cee00a95SJouni Malinen * @mfp: indicate whether management frame protection is used 2367b23aa676SSamuel Ortiz * @crypto: crypto settings 2368fffd0934SJohannes Berg * @key_len: length of WEP key for shared key authentication 2369fffd0934SJohannes Berg * @key_idx: index of WEP key for shared key authentication 2370fffd0934SJohannes Berg * @key: WEP key for shared key authentication 23717e7c8926SBen Greear * @flags: See &enum cfg80211_assoc_req_flags 23724486ea98SBala Shanmugam * @bg_scan_period: Background scan period in seconds 23734486ea98SBala Shanmugam * or -1 to indicate that default value is to be used. 23747e7c8926SBen Greear * @ht_capa: HT Capabilities over-rides. Values set in ht_capa_mask 23757e7c8926SBen Greear * will be used in ht_capa. Un-supported values will be ignored. 23767e7c8926SBen Greear * @ht_capa_mask: The bits of ht_capa which are to be used. 2377ee2aca34SJohannes Berg * @vht_capa: VHT Capability overrides 2378ee2aca34SJohannes Berg * @vht_capa_mask: The bits of vht_capa which are to be used. 237934d50519SLior David * @pbss: if set, connect to a PCP instead of AP. Valid for DMG 238034d50519SLior David * networks. 238138de03d2SArend van Spriel * @bss_select: criteria to be used for BSS selection. 238235eb8f7bSJouni Malinen * @prev_bssid: previous BSSID, if not %NULL use reassociate frame. This is used 238335eb8f7bSJouni Malinen * to indicate a request to reassociate within the ESS instead of a request 238435eb8f7bSJouni Malinen * do the initial association with the ESS. When included, this is set to 238535eb8f7bSJouni Malinen * the BSSID of the current association, i.e., to the value that is 238635eb8f7bSJouni Malinen * included in the Current AP address field of the Reassociation Request 238735eb8f7bSJouni Malinen * frame. 2388a3caf744SVidyullatha Kanchanapally * @fils_erp_username: EAP re-authentication protocol (ERP) username part of the 2389a3caf744SVidyullatha Kanchanapally * NAI or %NULL if not specified. This is used to construct FILS wrapped 2390a3caf744SVidyullatha Kanchanapally * data IE. 2391a3caf744SVidyullatha Kanchanapally * @fils_erp_username_len: Length of @fils_erp_username in octets. 2392a3caf744SVidyullatha Kanchanapally * @fils_erp_realm: EAP re-authentication protocol (ERP) realm part of NAI or 2393a3caf744SVidyullatha Kanchanapally * %NULL if not specified. This specifies the domain name of ER server and 2394a3caf744SVidyullatha Kanchanapally * is used to construct FILS wrapped data IE. 2395a3caf744SVidyullatha Kanchanapally * @fils_erp_realm_len: Length of @fils_erp_realm in octets. 2396a3caf744SVidyullatha Kanchanapally * @fils_erp_next_seq_num: The next sequence number to use in the FILS ERP 2397a3caf744SVidyullatha Kanchanapally * messages. This is also used to construct FILS wrapped data IE. 2398a3caf744SVidyullatha Kanchanapally * @fils_erp_rrk: ERP re-authentication Root Key (rRK) used to derive additional 2399a3caf744SVidyullatha Kanchanapally * keys in FILS or %NULL if not specified. 2400a3caf744SVidyullatha Kanchanapally * @fils_erp_rrk_len: Length of @fils_erp_rrk in octets. 24013a00df57SAvraham Stern * @want_1x: indicates user-space supports and wants to use 802.1X driver 24023a00df57SAvraham Stern * offload of 4-way handshake. 2403b23aa676SSamuel Ortiz */ 2404b23aa676SSamuel Ortiz struct cfg80211_connect_params { 2405b23aa676SSamuel Ortiz struct ieee80211_channel *channel; 24061df4a510SJouni Malinen struct ieee80211_channel *channel_hint; 2407664834deSJouni Malinen const u8 *bssid; 24081df4a510SJouni Malinen const u8 *bssid_hint; 2409664834deSJouni Malinen const u8 *ssid; 2410b23aa676SSamuel Ortiz size_t ssid_len; 2411b23aa676SSamuel Ortiz enum nl80211_auth_type auth_type; 24124b5800feSJohannes Berg const u8 *ie; 2413b23aa676SSamuel Ortiz size_t ie_len; 2414b23aa676SSamuel Ortiz bool privacy; 2415cee00a95SJouni Malinen enum nl80211_mfp mfp; 2416b23aa676SSamuel Ortiz struct cfg80211_crypto_settings crypto; 2417fffd0934SJohannes Berg const u8 *key; 2418fffd0934SJohannes Berg u8 key_len, key_idx; 24197e7c8926SBen Greear u32 flags; 24204486ea98SBala Shanmugam int bg_scan_period; 24217e7c8926SBen Greear struct ieee80211_ht_cap ht_capa; 24227e7c8926SBen Greear struct ieee80211_ht_cap ht_capa_mask; 2423ee2aca34SJohannes Berg struct ieee80211_vht_cap vht_capa; 2424ee2aca34SJohannes Berg struct ieee80211_vht_cap vht_capa_mask; 242534d50519SLior David bool pbss; 242638de03d2SArend van Spriel struct cfg80211_bss_selection bss_select; 2427ba6fbacfSJouni Malinen const u8 *prev_bssid; 2428a3caf744SVidyullatha Kanchanapally const u8 *fils_erp_username; 2429a3caf744SVidyullatha Kanchanapally size_t fils_erp_username_len; 2430a3caf744SVidyullatha Kanchanapally const u8 *fils_erp_realm; 2431a3caf744SVidyullatha Kanchanapally size_t fils_erp_realm_len; 2432a3caf744SVidyullatha Kanchanapally u16 fils_erp_next_seq_num; 2433a3caf744SVidyullatha Kanchanapally const u8 *fils_erp_rrk; 2434a3caf744SVidyullatha Kanchanapally size_t fils_erp_rrk_len; 24353a00df57SAvraham Stern bool want_1x; 2436b23aa676SSamuel Ortiz }; 2437b23aa676SSamuel Ortiz 2438b23aa676SSamuel Ortiz /** 2439088e8df8Svamsi krishna * enum cfg80211_connect_params_changed - Connection parameters being updated 2440088e8df8Svamsi krishna * 2441088e8df8Svamsi krishna * This enum provides information of all connect parameters that 2442088e8df8Svamsi krishna * have to be updated as part of update_connect_params() call. 2443088e8df8Svamsi krishna * 2444088e8df8Svamsi krishna * @UPDATE_ASSOC_IES: Indicates whether association request IEs are updated 24457f9a3e15SVidyullatha Kanchanapally * @UPDATE_FILS_ERP_INFO: Indicates that FILS connection parameters (realm, 24467f9a3e15SVidyullatha Kanchanapally * username, erp sequence number and rrk) are updated 24477f9a3e15SVidyullatha Kanchanapally * @UPDATE_AUTH_TYPE: Indicates that authentication type is updated 2448088e8df8Svamsi krishna */ 2449088e8df8Svamsi krishna enum cfg80211_connect_params_changed { 2450088e8df8Svamsi krishna UPDATE_ASSOC_IES = BIT(0), 24517f9a3e15SVidyullatha Kanchanapally UPDATE_FILS_ERP_INFO = BIT(1), 24527f9a3e15SVidyullatha Kanchanapally UPDATE_AUTH_TYPE = BIT(2), 2453088e8df8Svamsi krishna }; 2454088e8df8Svamsi krishna 2455088e8df8Svamsi krishna /** 2456b9a5f8caSJouni Malinen * enum wiphy_params_flags - set_wiphy_params bitfield values 2457abe37c4bSJohannes Berg * @WIPHY_PARAM_RETRY_SHORT: wiphy->retry_short has changed 2458abe37c4bSJohannes Berg * @WIPHY_PARAM_RETRY_LONG: wiphy->retry_long has changed 2459abe37c4bSJohannes Berg * @WIPHY_PARAM_FRAG_THRESHOLD: wiphy->frag_threshold has changed 2460abe37c4bSJohannes Berg * @WIPHY_PARAM_RTS_THRESHOLD: wiphy->rts_threshold has changed 2461abe37c4bSJohannes Berg * @WIPHY_PARAM_COVERAGE_CLASS: coverage class changed 24623057dbfdSLorenzo Bianconi * @WIPHY_PARAM_DYN_ACK: dynack has been enabled 246352539ca8SToke Høiland-Jørgensen * @WIPHY_PARAM_TXQ_LIMIT: TXQ packet limit has been changed 246452539ca8SToke Høiland-Jørgensen * @WIPHY_PARAM_TXQ_MEMORY_LIMIT: TXQ memory limit has been changed 246552539ca8SToke Høiland-Jørgensen * @WIPHY_PARAM_TXQ_QUANTUM: TXQ scheduler quantum 2466b9a5f8caSJouni Malinen */ 2467b9a5f8caSJouni Malinen enum wiphy_params_flags { 2468b9a5f8caSJouni Malinen WIPHY_PARAM_RETRY_SHORT = 1 << 0, 2469b9a5f8caSJouni Malinen WIPHY_PARAM_RETRY_LONG = 1 << 1, 2470b9a5f8caSJouni Malinen WIPHY_PARAM_FRAG_THRESHOLD = 1 << 2, 2471b9a5f8caSJouni Malinen WIPHY_PARAM_RTS_THRESHOLD = 1 << 3, 247281077e82SLukáš Turek WIPHY_PARAM_COVERAGE_CLASS = 1 << 4, 24733057dbfdSLorenzo Bianconi WIPHY_PARAM_DYN_ACK = 1 << 5, 247452539ca8SToke Høiland-Jørgensen WIPHY_PARAM_TXQ_LIMIT = 1 << 6, 247552539ca8SToke Høiland-Jørgensen WIPHY_PARAM_TXQ_MEMORY_LIMIT = 1 << 7, 247652539ca8SToke Høiland-Jørgensen WIPHY_PARAM_TXQ_QUANTUM = 1 << 8, 2477b9a5f8caSJouni Malinen }; 2478b9a5f8caSJouni Malinen 247936647055SToke Høiland-Jørgensen #define IEEE80211_DEFAULT_AIRTIME_WEIGHT 256 248036647055SToke Høiland-Jørgensen 248167fbb16bSSamuel Ortiz /** 248267fbb16bSSamuel Ortiz * struct cfg80211_pmksa - PMK Security Association 248367fbb16bSSamuel Ortiz * 248467fbb16bSSamuel Ortiz * This structure is passed to the set/del_pmksa() method for PMKSA 248567fbb16bSSamuel Ortiz * caching. 248667fbb16bSSamuel Ortiz * 2487a3caf744SVidyullatha Kanchanapally * @bssid: The AP's BSSID (may be %NULL). 2488a3caf744SVidyullatha Kanchanapally * @pmkid: The identifier to refer a PMKSA. 2489a3caf744SVidyullatha Kanchanapally * @pmk: The PMK for the PMKSA identified by @pmkid. This is used for key 2490a3caf744SVidyullatha Kanchanapally * derivation by a FILS STA. Otherwise, %NULL. 2491a3caf744SVidyullatha Kanchanapally * @pmk_len: Length of the @pmk. The length of @pmk can differ depending on 2492a3caf744SVidyullatha Kanchanapally * the hash algorithm used to generate this. 2493a3caf744SVidyullatha Kanchanapally * @ssid: SSID to specify the ESS within which a PMKSA is valid when using FILS 2494a3caf744SVidyullatha Kanchanapally * cache identifier (may be %NULL). 2495a3caf744SVidyullatha Kanchanapally * @ssid_len: Length of the @ssid in octets. 2496a3caf744SVidyullatha Kanchanapally * @cache_id: 2-octet cache identifier advertized by a FILS AP identifying the 2497a3caf744SVidyullatha Kanchanapally * scope of PMKSA. This is valid only if @ssid_len is non-zero (may be 2498a3caf744SVidyullatha Kanchanapally * %NULL). 249967fbb16bSSamuel Ortiz */ 250067fbb16bSSamuel Ortiz struct cfg80211_pmksa { 2501c1e5f471SJohannes Berg const u8 *bssid; 2502c1e5f471SJohannes Berg const u8 *pmkid; 2503a3caf744SVidyullatha Kanchanapally const u8 *pmk; 2504a3caf744SVidyullatha Kanchanapally size_t pmk_len; 2505a3caf744SVidyullatha Kanchanapally const u8 *ssid; 2506a3caf744SVidyullatha Kanchanapally size_t ssid_len; 2507a3caf744SVidyullatha Kanchanapally const u8 *cache_id; 250867fbb16bSSamuel Ortiz }; 25099930380fSJohannes Berg 25107643a2c3SJohannes Berg /** 251150ac6607SAmitkumar Karwar * struct cfg80211_pkt_pattern - packet pattern 2512ff1b6e69SJohannes Berg * @mask: bitmask where to match pattern and where to ignore bytes, 2513ff1b6e69SJohannes Berg * one bit per byte, in same format as nl80211 2514ff1b6e69SJohannes Berg * @pattern: bytes to match where bitmask is 1 2515ff1b6e69SJohannes Berg * @pattern_len: length of pattern (in bytes) 2516bb92d199SAmitkumar Karwar * @pkt_offset: packet offset (in bytes) 2517ff1b6e69SJohannes Berg * 2518ff1b6e69SJohannes Berg * Internal note: @mask and @pattern are allocated in one chunk of 2519ff1b6e69SJohannes Berg * memory, free @mask only! 2520ff1b6e69SJohannes Berg */ 252150ac6607SAmitkumar Karwar struct cfg80211_pkt_pattern { 2522922bd80fSJohannes Berg const u8 *mask, *pattern; 2523ff1b6e69SJohannes Berg int pattern_len; 2524bb92d199SAmitkumar Karwar int pkt_offset; 2525ff1b6e69SJohannes Berg }; 2526ff1b6e69SJohannes Berg 2527ff1b6e69SJohannes Berg /** 25282a0e047eSJohannes Berg * struct cfg80211_wowlan_tcp - TCP connection parameters 25292a0e047eSJohannes Berg * 25302a0e047eSJohannes Berg * @sock: (internal) socket for source port allocation 25312a0e047eSJohannes Berg * @src: source IP address 25322a0e047eSJohannes Berg * @dst: destination IP address 25332a0e047eSJohannes Berg * @dst_mac: destination MAC address 25342a0e047eSJohannes Berg * @src_port: source port 25352a0e047eSJohannes Berg * @dst_port: destination port 25362a0e047eSJohannes Berg * @payload_len: data payload length 25372a0e047eSJohannes Berg * @payload: data payload buffer 25382a0e047eSJohannes Berg * @payload_seq: payload sequence stamping configuration 25392a0e047eSJohannes Berg * @data_interval: interval at which to send data packets 25402a0e047eSJohannes Berg * @wake_len: wakeup payload match length 25412a0e047eSJohannes Berg * @wake_data: wakeup payload match data 25422a0e047eSJohannes Berg * @wake_mask: wakeup payload match mask 25432a0e047eSJohannes Berg * @tokens_size: length of the tokens buffer 25442a0e047eSJohannes Berg * @payload_tok: payload token usage configuration 25452a0e047eSJohannes Berg */ 25462a0e047eSJohannes Berg struct cfg80211_wowlan_tcp { 25472a0e047eSJohannes Berg struct socket *sock; 25482a0e047eSJohannes Berg __be32 src, dst; 25492a0e047eSJohannes Berg u16 src_port, dst_port; 25502a0e047eSJohannes Berg u8 dst_mac[ETH_ALEN]; 25512a0e047eSJohannes Berg int payload_len; 25522a0e047eSJohannes Berg const u8 *payload; 25532a0e047eSJohannes Berg struct nl80211_wowlan_tcp_data_seq payload_seq; 25542a0e047eSJohannes Berg u32 data_interval; 25552a0e047eSJohannes Berg u32 wake_len; 25562a0e047eSJohannes Berg const u8 *wake_data, *wake_mask; 25572a0e047eSJohannes Berg u32 tokens_size; 25582a0e047eSJohannes Berg /* must be last, variable member */ 25592a0e047eSJohannes Berg struct nl80211_wowlan_tcp_data_token payload_tok; 2560ff1b6e69SJohannes Berg }; 2561ff1b6e69SJohannes Berg 2562ff1b6e69SJohannes Berg /** 2563ff1b6e69SJohannes Berg * struct cfg80211_wowlan - Wake on Wireless-LAN support info 2564ff1b6e69SJohannes Berg * 2565ff1b6e69SJohannes Berg * This structure defines the enabled WoWLAN triggers for the device. 2566ff1b6e69SJohannes Berg * @any: wake up on any activity -- special trigger if device continues 2567ff1b6e69SJohannes Berg * operating as normal during suspend 2568ff1b6e69SJohannes Berg * @disconnect: wake up if getting disconnected 2569ff1b6e69SJohannes Berg * @magic_pkt: wake up on receiving magic packet 2570ff1b6e69SJohannes Berg * @patterns: wake up on receiving packet matching a pattern 2571ff1b6e69SJohannes Berg * @n_patterns: number of patterns 257277dbbb13SJohannes Berg * @gtk_rekey_failure: wake up on GTK rekey failure 257377dbbb13SJohannes Berg * @eap_identity_req: wake up on EAP identity request packet 257477dbbb13SJohannes Berg * @four_way_handshake: wake up on 4-way handshake 257577dbbb13SJohannes Berg * @rfkill_release: wake up when rfkill is released 25762a0e047eSJohannes Berg * @tcp: TCP connection establishment/wakeup parameters, see nl80211.h. 25772a0e047eSJohannes Berg * NULL if not configured. 25788cd4d456SLuciano Coelho * @nd_config: configuration for the scan to be used for net detect wake. 2579ff1b6e69SJohannes Berg */ 2580ff1b6e69SJohannes Berg struct cfg80211_wowlan { 258177dbbb13SJohannes Berg bool any, disconnect, magic_pkt, gtk_rekey_failure, 258277dbbb13SJohannes Berg eap_identity_req, four_way_handshake, 258377dbbb13SJohannes Berg rfkill_release; 258450ac6607SAmitkumar Karwar struct cfg80211_pkt_pattern *patterns; 25852a0e047eSJohannes Berg struct cfg80211_wowlan_tcp *tcp; 2586ff1b6e69SJohannes Berg int n_patterns; 25878cd4d456SLuciano Coelho struct cfg80211_sched_scan_request *nd_config; 2588ff1b6e69SJohannes Berg }; 2589ff1b6e69SJohannes Berg 2590ff1b6e69SJohannes Berg /** 2591be29b99aSAmitkumar Karwar * struct cfg80211_coalesce_rules - Coalesce rule parameters 2592be29b99aSAmitkumar Karwar * 2593be29b99aSAmitkumar Karwar * This structure defines coalesce rule for the device. 2594be29b99aSAmitkumar Karwar * @delay: maximum coalescing delay in msecs. 2595be29b99aSAmitkumar Karwar * @condition: condition for packet coalescence. 2596be29b99aSAmitkumar Karwar * see &enum nl80211_coalesce_condition. 2597be29b99aSAmitkumar Karwar * @patterns: array of packet patterns 2598be29b99aSAmitkumar Karwar * @n_patterns: number of patterns 2599be29b99aSAmitkumar Karwar */ 2600be29b99aSAmitkumar Karwar struct cfg80211_coalesce_rules { 2601be29b99aSAmitkumar Karwar int delay; 2602be29b99aSAmitkumar Karwar enum nl80211_coalesce_condition condition; 2603be29b99aSAmitkumar Karwar struct cfg80211_pkt_pattern *patterns; 2604be29b99aSAmitkumar Karwar int n_patterns; 2605be29b99aSAmitkumar Karwar }; 2606be29b99aSAmitkumar Karwar 2607be29b99aSAmitkumar Karwar /** 2608be29b99aSAmitkumar Karwar * struct cfg80211_coalesce - Packet coalescing settings 2609be29b99aSAmitkumar Karwar * 2610be29b99aSAmitkumar Karwar * This structure defines coalescing settings. 2611be29b99aSAmitkumar Karwar * @rules: array of coalesce rules 2612be29b99aSAmitkumar Karwar * @n_rules: number of rules 2613be29b99aSAmitkumar Karwar */ 2614be29b99aSAmitkumar Karwar struct cfg80211_coalesce { 2615be29b99aSAmitkumar Karwar struct cfg80211_coalesce_rules *rules; 2616be29b99aSAmitkumar Karwar int n_rules; 2617be29b99aSAmitkumar Karwar }; 2618be29b99aSAmitkumar Karwar 2619be29b99aSAmitkumar Karwar /** 26208cd4d456SLuciano Coelho * struct cfg80211_wowlan_nd_match - information about the match 26218cd4d456SLuciano Coelho * 26228cd4d456SLuciano Coelho * @ssid: SSID of the match that triggered the wake up 26238cd4d456SLuciano Coelho * @n_channels: Number of channels where the match occurred. This 26248cd4d456SLuciano Coelho * value may be zero if the driver can't report the channels. 26258cd4d456SLuciano Coelho * @channels: center frequencies of the channels where a match 26268cd4d456SLuciano Coelho * occurred (in MHz) 26278cd4d456SLuciano Coelho */ 26288cd4d456SLuciano Coelho struct cfg80211_wowlan_nd_match { 26298cd4d456SLuciano Coelho struct cfg80211_ssid ssid; 26308cd4d456SLuciano Coelho int n_channels; 26318cd4d456SLuciano Coelho u32 channels[]; 26328cd4d456SLuciano Coelho }; 26338cd4d456SLuciano Coelho 26348cd4d456SLuciano Coelho /** 26358cd4d456SLuciano Coelho * struct cfg80211_wowlan_nd_info - net detect wake up information 26368cd4d456SLuciano Coelho * 26378cd4d456SLuciano Coelho * @n_matches: Number of match information instances provided in 26388cd4d456SLuciano Coelho * @matches. This value may be zero if the driver can't provide 26398cd4d456SLuciano Coelho * match information. 26408cd4d456SLuciano Coelho * @matches: Array of pointers to matches containing information about 26418cd4d456SLuciano Coelho * the matches that triggered the wake up. 26428cd4d456SLuciano Coelho */ 26438cd4d456SLuciano Coelho struct cfg80211_wowlan_nd_info { 26448cd4d456SLuciano Coelho int n_matches; 26458cd4d456SLuciano Coelho struct cfg80211_wowlan_nd_match *matches[]; 26468cd4d456SLuciano Coelho }; 26478cd4d456SLuciano Coelho 26488cd4d456SLuciano Coelho /** 2649cd8f7cb4SJohannes Berg * struct cfg80211_wowlan_wakeup - wakeup report 2650cd8f7cb4SJohannes Berg * @disconnect: woke up by getting disconnected 2651cd8f7cb4SJohannes Berg * @magic_pkt: woke up by receiving magic packet 2652cd8f7cb4SJohannes Berg * @gtk_rekey_failure: woke up by GTK rekey failure 2653cd8f7cb4SJohannes Berg * @eap_identity_req: woke up by EAP identity request packet 2654cd8f7cb4SJohannes Berg * @four_way_handshake: woke up by 4-way handshake 2655cd8f7cb4SJohannes Berg * @rfkill_release: woke up by rfkill being released 2656cd8f7cb4SJohannes Berg * @pattern_idx: pattern that caused wakeup, -1 if not due to pattern 2657cd8f7cb4SJohannes Berg * @packet_present_len: copied wakeup packet data 2658cd8f7cb4SJohannes Berg * @packet_len: original wakeup packet length 2659cd8f7cb4SJohannes Berg * @packet: The packet causing the wakeup, if any. 2660cd8f7cb4SJohannes Berg * @packet_80211: For pattern match, magic packet and other data 2661cd8f7cb4SJohannes Berg * frame triggers an 802.3 frame should be reported, for 2662cd8f7cb4SJohannes Berg * disconnect due to deauth 802.11 frame. This indicates which 2663cd8f7cb4SJohannes Berg * it is. 26642a0e047eSJohannes Berg * @tcp_match: TCP wakeup packet received 26652a0e047eSJohannes Berg * @tcp_connlost: TCP connection lost or failed to establish 26662a0e047eSJohannes Berg * @tcp_nomoretokens: TCP data ran out of tokens 26678cd4d456SLuciano Coelho * @net_detect: if not %NULL, woke up because of net detect 2668cd8f7cb4SJohannes Berg */ 2669cd8f7cb4SJohannes Berg struct cfg80211_wowlan_wakeup { 2670cd8f7cb4SJohannes Berg bool disconnect, magic_pkt, gtk_rekey_failure, 2671cd8f7cb4SJohannes Berg eap_identity_req, four_way_handshake, 26722a0e047eSJohannes Berg rfkill_release, packet_80211, 26732a0e047eSJohannes Berg tcp_match, tcp_connlost, tcp_nomoretokens; 2674cd8f7cb4SJohannes Berg s32 pattern_idx; 2675cd8f7cb4SJohannes Berg u32 packet_present_len, packet_len; 2676cd8f7cb4SJohannes Berg const void *packet; 26778cd4d456SLuciano Coelho struct cfg80211_wowlan_nd_info *net_detect; 2678cd8f7cb4SJohannes Berg }; 2679cd8f7cb4SJohannes Berg 2680cd8f7cb4SJohannes Berg /** 2681e5497d76SJohannes Berg * struct cfg80211_gtk_rekey_data - rekey data 268278f686caSJohannes Berg * @kek: key encryption key (NL80211_KEK_LEN bytes) 268378f686caSJohannes Berg * @kck: key confirmation key (NL80211_KCK_LEN bytes) 268478f686caSJohannes Berg * @replay_ctr: replay counter (NL80211_REPLAY_CTR_LEN bytes) 2685e5497d76SJohannes Berg */ 2686e5497d76SJohannes Berg struct cfg80211_gtk_rekey_data { 268778f686caSJohannes Berg const u8 *kek, *kck, *replay_ctr; 2688e5497d76SJohannes Berg }; 2689e5497d76SJohannes Berg 2690e5497d76SJohannes Berg /** 2691355199e0SJouni Malinen * struct cfg80211_update_ft_ies_params - FT IE Information 2692355199e0SJouni Malinen * 2693355199e0SJouni Malinen * This structure provides information needed to update the fast transition IE 2694355199e0SJouni Malinen * 2695355199e0SJouni Malinen * @md: The Mobility Domain ID, 2 Octet value 2696355199e0SJouni Malinen * @ie: Fast Transition IEs 2697355199e0SJouni Malinen * @ie_len: Length of ft_ie in octets 2698355199e0SJouni Malinen */ 2699355199e0SJouni Malinen struct cfg80211_update_ft_ies_params { 2700355199e0SJouni Malinen u16 md; 2701355199e0SJouni Malinen const u8 *ie; 2702355199e0SJouni Malinen size_t ie_len; 2703355199e0SJouni Malinen }; 2704355199e0SJouni Malinen 2705355199e0SJouni Malinen /** 2706b176e629SAndrei Otcheretianski * struct cfg80211_mgmt_tx_params - mgmt tx parameters 2707b176e629SAndrei Otcheretianski * 2708b176e629SAndrei Otcheretianski * This structure provides information needed to transmit a mgmt frame 2709b176e629SAndrei Otcheretianski * 2710b176e629SAndrei Otcheretianski * @chan: channel to use 2711b176e629SAndrei Otcheretianski * @offchan: indicates wether off channel operation is required 2712b176e629SAndrei Otcheretianski * @wait: duration for ROC 2713b176e629SAndrei Otcheretianski * @buf: buffer to transmit 2714b176e629SAndrei Otcheretianski * @len: buffer length 2715b176e629SAndrei Otcheretianski * @no_cck: don't use cck rates for this frame 2716b176e629SAndrei Otcheretianski * @dont_wait_for_ack: tells the low level not to wait for an ack 271734d22ce2SAndrei Otcheretianski * @n_csa_offsets: length of csa_offsets array 271834d22ce2SAndrei Otcheretianski * @csa_offsets: array of all the csa offsets in the frame 2719b176e629SAndrei Otcheretianski */ 2720b176e629SAndrei Otcheretianski struct cfg80211_mgmt_tx_params { 2721b176e629SAndrei Otcheretianski struct ieee80211_channel *chan; 2722b176e629SAndrei Otcheretianski bool offchan; 2723b176e629SAndrei Otcheretianski unsigned int wait; 2724b176e629SAndrei Otcheretianski const u8 *buf; 2725b176e629SAndrei Otcheretianski size_t len; 2726b176e629SAndrei Otcheretianski bool no_cck; 2727b176e629SAndrei Otcheretianski bool dont_wait_for_ack; 272834d22ce2SAndrei Otcheretianski int n_csa_offsets; 272934d22ce2SAndrei Otcheretianski const u16 *csa_offsets; 2730b176e629SAndrei Otcheretianski }; 2731b176e629SAndrei Otcheretianski 2732b176e629SAndrei Otcheretianski /** 2733fa9ffc74SKyeyoon Park * struct cfg80211_dscp_exception - DSCP exception 2734fa9ffc74SKyeyoon Park * 2735fa9ffc74SKyeyoon Park * @dscp: DSCP value that does not adhere to the user priority range definition 2736fa9ffc74SKyeyoon Park * @up: user priority value to which the corresponding DSCP value belongs 2737fa9ffc74SKyeyoon Park */ 2738fa9ffc74SKyeyoon Park struct cfg80211_dscp_exception { 2739fa9ffc74SKyeyoon Park u8 dscp; 2740fa9ffc74SKyeyoon Park u8 up; 2741fa9ffc74SKyeyoon Park }; 2742fa9ffc74SKyeyoon Park 2743fa9ffc74SKyeyoon Park /** 2744fa9ffc74SKyeyoon Park * struct cfg80211_dscp_range - DSCP range definition for user priority 2745fa9ffc74SKyeyoon Park * 2746fa9ffc74SKyeyoon Park * @low: lowest DSCP value of this user priority range, inclusive 2747fa9ffc74SKyeyoon Park * @high: highest DSCP value of this user priority range, inclusive 2748fa9ffc74SKyeyoon Park */ 2749fa9ffc74SKyeyoon Park struct cfg80211_dscp_range { 2750fa9ffc74SKyeyoon Park u8 low; 2751fa9ffc74SKyeyoon Park u8 high; 2752fa9ffc74SKyeyoon Park }; 2753fa9ffc74SKyeyoon Park 2754fa9ffc74SKyeyoon Park /* QoS Map Set element length defined in IEEE Std 802.11-2012, 8.4.2.97 */ 2755fa9ffc74SKyeyoon Park #define IEEE80211_QOS_MAP_MAX_EX 21 2756fa9ffc74SKyeyoon Park #define IEEE80211_QOS_MAP_LEN_MIN 16 2757fa9ffc74SKyeyoon Park #define IEEE80211_QOS_MAP_LEN_MAX \ 2758fa9ffc74SKyeyoon Park (IEEE80211_QOS_MAP_LEN_MIN + 2 * IEEE80211_QOS_MAP_MAX_EX) 2759fa9ffc74SKyeyoon Park 2760fa9ffc74SKyeyoon Park /** 2761fa9ffc74SKyeyoon Park * struct cfg80211_qos_map - QoS Map Information 2762fa9ffc74SKyeyoon Park * 2763fa9ffc74SKyeyoon Park * This struct defines the Interworking QoS map setting for DSCP values 2764fa9ffc74SKyeyoon Park * 2765fa9ffc74SKyeyoon Park * @num_des: number of DSCP exceptions (0..21) 2766fa9ffc74SKyeyoon Park * @dscp_exception: optionally up to maximum of 21 DSCP exceptions from 2767fa9ffc74SKyeyoon Park * the user priority DSCP range definition 2768fa9ffc74SKyeyoon Park * @up: DSCP range definition for a particular user priority 2769fa9ffc74SKyeyoon Park */ 2770fa9ffc74SKyeyoon Park struct cfg80211_qos_map { 2771fa9ffc74SKyeyoon Park u8 num_des; 2772fa9ffc74SKyeyoon Park struct cfg80211_dscp_exception dscp_exception[IEEE80211_QOS_MAP_MAX_EX]; 2773fa9ffc74SKyeyoon Park struct cfg80211_dscp_range up[8]; 2774fa9ffc74SKyeyoon Park }; 2775fa9ffc74SKyeyoon Park 2776fa9ffc74SKyeyoon Park /** 2777cb3b7d87SAyala Beker * struct cfg80211_nan_conf - NAN configuration 2778cb3b7d87SAyala Beker * 2779cb3b7d87SAyala Beker * This struct defines NAN configuration parameters 2780cb3b7d87SAyala Beker * 2781cb3b7d87SAyala Beker * @master_pref: master preference (1 - 255) 27828585989dSLuca Coelho * @bands: operating bands, a bitmap of &enum nl80211_band values. 27838585989dSLuca Coelho * For instance, for NL80211_BAND_2GHZ, bit 0 would be set 27848585989dSLuca Coelho * (i.e. BIT(NL80211_BAND_2GHZ)). 2785cb3b7d87SAyala Beker */ 2786cb3b7d87SAyala Beker struct cfg80211_nan_conf { 2787cb3b7d87SAyala Beker u8 master_pref; 27888585989dSLuca Coelho u8 bands; 2789cb3b7d87SAyala Beker }; 2790cb3b7d87SAyala Beker 2791cb3b7d87SAyala Beker /** 2792a5a9dcf2SAyala Beker * enum cfg80211_nan_conf_changes - indicates changed fields in NAN 2793a5a9dcf2SAyala Beker * configuration 2794a5a9dcf2SAyala Beker * 2795a5a9dcf2SAyala Beker * @CFG80211_NAN_CONF_CHANGED_PREF: master preference 27968585989dSLuca Coelho * @CFG80211_NAN_CONF_CHANGED_BANDS: operating bands 2797a5a9dcf2SAyala Beker */ 2798a5a9dcf2SAyala Beker enum cfg80211_nan_conf_changes { 2799a5a9dcf2SAyala Beker CFG80211_NAN_CONF_CHANGED_PREF = BIT(0), 28008585989dSLuca Coelho CFG80211_NAN_CONF_CHANGED_BANDS = BIT(1), 2801a5a9dcf2SAyala Beker }; 2802a5a9dcf2SAyala Beker 2803a5a9dcf2SAyala Beker /** 2804a442b761SAyala Beker * struct cfg80211_nan_func_filter - a NAN function Rx / Tx filter 2805a442b761SAyala Beker * 2806a442b761SAyala Beker * @filter: the content of the filter 2807a442b761SAyala Beker * @len: the length of the filter 2808a442b761SAyala Beker */ 2809a442b761SAyala Beker struct cfg80211_nan_func_filter { 2810a442b761SAyala Beker const u8 *filter; 2811a442b761SAyala Beker u8 len; 2812a442b761SAyala Beker }; 2813a442b761SAyala Beker 2814a442b761SAyala Beker /** 2815a442b761SAyala Beker * struct cfg80211_nan_func - a NAN function 2816a442b761SAyala Beker * 2817a442b761SAyala Beker * @type: &enum nl80211_nan_function_type 2818a442b761SAyala Beker * @service_id: the service ID of the function 2819a442b761SAyala Beker * @publish_type: &nl80211_nan_publish_type 2820a442b761SAyala Beker * @close_range: if true, the range should be limited. Threshold is 2821a442b761SAyala Beker * implementation specific. 2822a442b761SAyala Beker * @publish_bcast: if true, the solicited publish should be broadcasted 2823a442b761SAyala Beker * @subscribe_active: if true, the subscribe is active 2824a442b761SAyala Beker * @followup_id: the instance ID for follow up 2825a442b761SAyala Beker * @followup_reqid: the requestor instance ID for follow up 2826a442b761SAyala Beker * @followup_dest: MAC address of the recipient of the follow up 2827a442b761SAyala Beker * @ttl: time to live counter in DW. 2828a442b761SAyala Beker * @serv_spec_info: Service Specific Info 2829a442b761SAyala Beker * @serv_spec_info_len: Service Specific Info length 2830a442b761SAyala Beker * @srf_include: if true, SRF is inclusive 2831a442b761SAyala Beker * @srf_bf: Bloom Filter 2832a442b761SAyala Beker * @srf_bf_len: Bloom Filter length 2833a442b761SAyala Beker * @srf_bf_idx: Bloom Filter index 2834a442b761SAyala Beker * @srf_macs: SRF MAC addresses 2835a442b761SAyala Beker * @srf_num_macs: number of MAC addresses in SRF 2836a442b761SAyala Beker * @rx_filters: rx filters that are matched with corresponding peer's tx_filter 2837a442b761SAyala Beker * @tx_filters: filters that should be transmitted in the SDF. 2838a442b761SAyala Beker * @num_rx_filters: length of &rx_filters. 2839a442b761SAyala Beker * @num_tx_filters: length of &tx_filters. 2840a442b761SAyala Beker * @instance_id: driver allocated id of the function. 2841a442b761SAyala Beker * @cookie: unique NAN function identifier. 2842a442b761SAyala Beker */ 2843a442b761SAyala Beker struct cfg80211_nan_func { 2844a442b761SAyala Beker enum nl80211_nan_function_type type; 2845a442b761SAyala Beker u8 service_id[NL80211_NAN_FUNC_SERVICE_ID_LEN]; 2846a442b761SAyala Beker u8 publish_type; 2847a442b761SAyala Beker bool close_range; 2848a442b761SAyala Beker bool publish_bcast; 2849a442b761SAyala Beker bool subscribe_active; 2850a442b761SAyala Beker u8 followup_id; 2851a442b761SAyala Beker u8 followup_reqid; 2852a442b761SAyala Beker struct mac_address followup_dest; 2853a442b761SAyala Beker u32 ttl; 2854a442b761SAyala Beker const u8 *serv_spec_info; 2855a442b761SAyala Beker u8 serv_spec_info_len; 2856a442b761SAyala Beker bool srf_include; 2857a442b761SAyala Beker const u8 *srf_bf; 2858a442b761SAyala Beker u8 srf_bf_len; 2859a442b761SAyala Beker u8 srf_bf_idx; 2860a442b761SAyala Beker struct mac_address *srf_macs; 2861a442b761SAyala Beker int srf_num_macs; 2862a442b761SAyala Beker struct cfg80211_nan_func_filter *rx_filters; 2863a442b761SAyala Beker struct cfg80211_nan_func_filter *tx_filters; 2864a442b761SAyala Beker u8 num_tx_filters; 2865a442b761SAyala Beker u8 num_rx_filters; 2866a442b761SAyala Beker u8 instance_id; 2867a442b761SAyala Beker u64 cookie; 2868a442b761SAyala Beker }; 2869a442b761SAyala Beker 2870a442b761SAyala Beker /** 28713a00df57SAvraham Stern * struct cfg80211_pmk_conf - PMK configuration 28723a00df57SAvraham Stern * 28733a00df57SAvraham Stern * @aa: authenticator address 28743a00df57SAvraham Stern * @pmk_len: PMK length in bytes. 28753a00df57SAvraham Stern * @pmk: the PMK material 28763a00df57SAvraham Stern * @pmk_r0_name: PMK-R0 Name. NULL if not applicable (i.e., the PMK 28773a00df57SAvraham Stern * is not PMK-R0). When pmk_r0_name is not NULL, the pmk field 28783a00df57SAvraham Stern * holds PMK-R0. 28793a00df57SAvraham Stern */ 28803a00df57SAvraham Stern struct cfg80211_pmk_conf { 28813a00df57SAvraham Stern const u8 *aa; 28823a00df57SAvraham Stern u8 pmk_len; 28833a00df57SAvraham Stern const u8 *pmk; 28843a00df57SAvraham Stern const u8 *pmk_r0_name; 28853a00df57SAvraham Stern }; 28863a00df57SAvraham Stern 28873a00df57SAvraham Stern /** 288840cbfa90SSrinivas Dasari * struct cfg80211_external_auth_params - Trigger External authentication. 288940cbfa90SSrinivas Dasari * 289040cbfa90SSrinivas Dasari * Commonly used across the external auth request and event interfaces. 289140cbfa90SSrinivas Dasari * 289240cbfa90SSrinivas Dasari * @action: action type / trigger for external authentication. Only significant 289340cbfa90SSrinivas Dasari * for the authentication request event interface (driver to user space). 289440cbfa90SSrinivas Dasari * @bssid: BSSID of the peer with which the authentication has 289540cbfa90SSrinivas Dasari * to happen. Used by both the authentication request event and 289640cbfa90SSrinivas Dasari * authentication response command interface. 289740cbfa90SSrinivas Dasari * @ssid: SSID of the AP. Used by both the authentication request event and 289840cbfa90SSrinivas Dasari * authentication response command interface. 289940cbfa90SSrinivas Dasari * @key_mgmt_suite: AKM suite of the respective authentication. Used by the 290040cbfa90SSrinivas Dasari * authentication request event interface. 290140cbfa90SSrinivas Dasari * @status: status code, %WLAN_STATUS_SUCCESS for successful authentication, 290240cbfa90SSrinivas Dasari * use %WLAN_STATUS_UNSPECIFIED_FAILURE if user space cannot give you 290340cbfa90SSrinivas Dasari * the real status code for failures. Used only for the authentication 290440cbfa90SSrinivas Dasari * response command interface (user space to driver). 2905fe494370SSrinivas Dasari * @pmkid: The identifier to refer a PMKSA. 290640cbfa90SSrinivas Dasari */ 290740cbfa90SSrinivas Dasari struct cfg80211_external_auth_params { 290840cbfa90SSrinivas Dasari enum nl80211_external_auth_action action; 290940cbfa90SSrinivas Dasari u8 bssid[ETH_ALEN] __aligned(2); 291040cbfa90SSrinivas Dasari struct cfg80211_ssid ssid; 291140cbfa90SSrinivas Dasari unsigned int key_mgmt_suite; 291240cbfa90SSrinivas Dasari u16 status; 2913fe494370SSrinivas Dasari const u8 *pmkid; 291440cbfa90SSrinivas Dasari }; 291540cbfa90SSrinivas Dasari 291640cbfa90SSrinivas Dasari /** 29173453de98SRandy Dunlap * struct cfg80211_ftm_responder_stats - FTM responder statistics 291881e54d08SPradeep Kumar Chitrapu * 291981e54d08SPradeep Kumar Chitrapu * @filled: bitflag of flags using the bits of &enum nl80211_ftm_stats to 292081e54d08SPradeep Kumar Chitrapu * indicate the relevant values in this struct for them 292181e54d08SPradeep Kumar Chitrapu * @success_num: number of FTM sessions in which all frames were successfully 292281e54d08SPradeep Kumar Chitrapu * answered 292381e54d08SPradeep Kumar Chitrapu * @partial_num: number of FTM sessions in which part of frames were 292481e54d08SPradeep Kumar Chitrapu * successfully answered 292581e54d08SPradeep Kumar Chitrapu * @failed_num: number of failed FTM sessions 292681e54d08SPradeep Kumar Chitrapu * @asap_num: number of ASAP FTM sessions 292781e54d08SPradeep Kumar Chitrapu * @non_asap_num: number of non-ASAP FTM sessions 292881e54d08SPradeep Kumar Chitrapu * @total_duration_ms: total sessions durations - gives an indication 292981e54d08SPradeep Kumar Chitrapu * of how much time the responder was busy 293081e54d08SPradeep Kumar Chitrapu * @unknown_triggers_num: number of unknown FTM triggers - triggers from 293181e54d08SPradeep Kumar Chitrapu * initiators that didn't finish successfully the negotiation phase with 293281e54d08SPradeep Kumar Chitrapu * the responder 293381e54d08SPradeep Kumar Chitrapu * @reschedule_requests_num: number of FTM reschedule requests - initiator asks 293481e54d08SPradeep Kumar Chitrapu * for a new scheduling although it already has scheduled FTM slot 293581e54d08SPradeep Kumar Chitrapu * @out_of_window_triggers_num: total FTM triggers out of scheduled window 293681e54d08SPradeep Kumar Chitrapu */ 293781e54d08SPradeep Kumar Chitrapu struct cfg80211_ftm_responder_stats { 293881e54d08SPradeep Kumar Chitrapu u32 filled; 293981e54d08SPradeep Kumar Chitrapu u32 success_num; 294081e54d08SPradeep Kumar Chitrapu u32 partial_num; 294181e54d08SPradeep Kumar Chitrapu u32 failed_num; 294281e54d08SPradeep Kumar Chitrapu u32 asap_num; 294381e54d08SPradeep Kumar Chitrapu u32 non_asap_num; 294481e54d08SPradeep Kumar Chitrapu u64 total_duration_ms; 294581e54d08SPradeep Kumar Chitrapu u32 unknown_triggers_num; 294681e54d08SPradeep Kumar Chitrapu u32 reschedule_requests_num; 294781e54d08SPradeep Kumar Chitrapu u32 out_of_window_triggers_num; 294881e54d08SPradeep Kumar Chitrapu }; 294981e54d08SPradeep Kumar Chitrapu 295081e54d08SPradeep Kumar Chitrapu /** 29519bb7e0f2SJohannes Berg * struct cfg80211_pmsr_ftm_result - FTM result 29529bb7e0f2SJohannes Berg * @failure_reason: if this measurement failed (PMSR status is 29539bb7e0f2SJohannes Berg * %NL80211_PMSR_STATUS_FAILURE), this gives a more precise 29549bb7e0f2SJohannes Berg * reason than just "failure" 29559bb7e0f2SJohannes Berg * @burst_index: if reporting partial results, this is the index 29569bb7e0f2SJohannes Berg * in [0 .. num_bursts-1] of the burst that's being reported 29579bb7e0f2SJohannes Berg * @num_ftmr_attempts: number of FTM request frames transmitted 29589bb7e0f2SJohannes Berg * @num_ftmr_successes: number of FTM request frames acked 29599bb7e0f2SJohannes Berg * @busy_retry_time: if failure_reason is %NL80211_PMSR_FTM_FAILURE_PEER_BUSY, 29609bb7e0f2SJohannes Berg * fill this to indicate in how many seconds a retry is deemed possible 29619bb7e0f2SJohannes Berg * by the responder 29629bb7e0f2SJohannes Berg * @num_bursts_exp: actual number of bursts exponent negotiated 29639bb7e0f2SJohannes Berg * @burst_duration: actual burst duration negotiated 29649bb7e0f2SJohannes Berg * @ftms_per_burst: actual FTMs per burst negotiated 29659bb7e0f2SJohannes Berg * @lci_len: length of LCI information (if present) 29669bb7e0f2SJohannes Berg * @civicloc_len: length of civic location information (if present) 29679bb7e0f2SJohannes Berg * @lci: LCI data (may be %NULL) 29689bb7e0f2SJohannes Berg * @civicloc: civic location data (may be %NULL) 29699bb7e0f2SJohannes Berg * @rssi_avg: average RSSI over FTM action frames reported 29709bb7e0f2SJohannes Berg * @rssi_spread: spread of the RSSI over FTM action frames reported 29719bb7e0f2SJohannes Berg * @tx_rate: bitrate for transmitted FTM action frame response 29729bb7e0f2SJohannes Berg * @rx_rate: bitrate of received FTM action frame 29739bb7e0f2SJohannes Berg * @rtt_avg: average of RTTs measured (must have either this or @dist_avg) 29749bb7e0f2SJohannes Berg * @rtt_variance: variance of RTTs measured (note that standard deviation is 29759bb7e0f2SJohannes Berg * the square root of the variance) 29769bb7e0f2SJohannes Berg * @rtt_spread: spread of the RTTs measured 29779bb7e0f2SJohannes Berg * @dist_avg: average of distances (mm) measured 29789bb7e0f2SJohannes Berg * (must have either this or @rtt_avg) 29799bb7e0f2SJohannes Berg * @dist_variance: variance of distances measured (see also @rtt_variance) 29809bb7e0f2SJohannes Berg * @dist_spread: spread of distances measured (see also @rtt_spread) 29819bb7e0f2SJohannes Berg * @num_ftmr_attempts_valid: @num_ftmr_attempts is valid 29829bb7e0f2SJohannes Berg * @num_ftmr_successes_valid: @num_ftmr_successes is valid 29839bb7e0f2SJohannes Berg * @rssi_avg_valid: @rssi_avg is valid 29849bb7e0f2SJohannes Berg * @rssi_spread_valid: @rssi_spread is valid 29859bb7e0f2SJohannes Berg * @tx_rate_valid: @tx_rate is valid 29869bb7e0f2SJohannes Berg * @rx_rate_valid: @rx_rate is valid 29879bb7e0f2SJohannes Berg * @rtt_avg_valid: @rtt_avg is valid 29889bb7e0f2SJohannes Berg * @rtt_variance_valid: @rtt_variance is valid 29899bb7e0f2SJohannes Berg * @rtt_spread_valid: @rtt_spread is valid 29909bb7e0f2SJohannes Berg * @dist_avg_valid: @dist_avg is valid 29919bb7e0f2SJohannes Berg * @dist_variance_valid: @dist_variance is valid 29929bb7e0f2SJohannes Berg * @dist_spread_valid: @dist_spread is valid 29939bb7e0f2SJohannes Berg */ 29949bb7e0f2SJohannes Berg struct cfg80211_pmsr_ftm_result { 29959bb7e0f2SJohannes Berg const u8 *lci; 29969bb7e0f2SJohannes Berg const u8 *civicloc; 29979bb7e0f2SJohannes Berg unsigned int lci_len; 29989bb7e0f2SJohannes Berg unsigned int civicloc_len; 29999bb7e0f2SJohannes Berg enum nl80211_peer_measurement_ftm_failure_reasons failure_reason; 30009bb7e0f2SJohannes Berg u32 num_ftmr_attempts, num_ftmr_successes; 30019bb7e0f2SJohannes Berg s16 burst_index; 30029bb7e0f2SJohannes Berg u8 busy_retry_time; 30039bb7e0f2SJohannes Berg u8 num_bursts_exp; 30049bb7e0f2SJohannes Berg u8 burst_duration; 30059bb7e0f2SJohannes Berg u8 ftms_per_burst; 30069bb7e0f2SJohannes Berg s32 rssi_avg; 30079bb7e0f2SJohannes Berg s32 rssi_spread; 30089bb7e0f2SJohannes Berg struct rate_info tx_rate, rx_rate; 30099bb7e0f2SJohannes Berg s64 rtt_avg; 30109bb7e0f2SJohannes Berg s64 rtt_variance; 30119bb7e0f2SJohannes Berg s64 rtt_spread; 30129bb7e0f2SJohannes Berg s64 dist_avg; 30139bb7e0f2SJohannes Berg s64 dist_variance; 30149bb7e0f2SJohannes Berg s64 dist_spread; 30159bb7e0f2SJohannes Berg 30169bb7e0f2SJohannes Berg u16 num_ftmr_attempts_valid:1, 30179bb7e0f2SJohannes Berg num_ftmr_successes_valid:1, 30189bb7e0f2SJohannes Berg rssi_avg_valid:1, 30199bb7e0f2SJohannes Berg rssi_spread_valid:1, 30209bb7e0f2SJohannes Berg tx_rate_valid:1, 30219bb7e0f2SJohannes Berg rx_rate_valid:1, 30229bb7e0f2SJohannes Berg rtt_avg_valid:1, 30239bb7e0f2SJohannes Berg rtt_variance_valid:1, 30249bb7e0f2SJohannes Berg rtt_spread_valid:1, 30259bb7e0f2SJohannes Berg dist_avg_valid:1, 30269bb7e0f2SJohannes Berg dist_variance_valid:1, 30279bb7e0f2SJohannes Berg dist_spread_valid:1; 30289bb7e0f2SJohannes Berg }; 30299bb7e0f2SJohannes Berg 30309bb7e0f2SJohannes Berg /** 30319bb7e0f2SJohannes Berg * struct cfg80211_pmsr_result - peer measurement result 30329bb7e0f2SJohannes Berg * @addr: address of the peer 30339bb7e0f2SJohannes Berg * @host_time: host time (use ktime_get_boottime() adjust to the time when the 30349bb7e0f2SJohannes Berg * measurement was made) 30359bb7e0f2SJohannes Berg * @ap_tsf: AP's TSF at measurement time 30369bb7e0f2SJohannes Berg * @status: status of the measurement 30379bb7e0f2SJohannes Berg * @final: if reporting partial results, mark this as the last one; if not 30389bb7e0f2SJohannes Berg * reporting partial results always set this flag 30399bb7e0f2SJohannes Berg * @ap_tsf_valid: indicates the @ap_tsf value is valid 30409bb7e0f2SJohannes Berg * @type: type of the measurement reported, note that we only support reporting 30419bb7e0f2SJohannes Berg * one type at a time, but you can report multiple results separately and 30429bb7e0f2SJohannes Berg * they're all aggregated for userspace. 30439bb7e0f2SJohannes Berg */ 30449bb7e0f2SJohannes Berg struct cfg80211_pmsr_result { 30459bb7e0f2SJohannes Berg u64 host_time, ap_tsf; 30469bb7e0f2SJohannes Berg enum nl80211_peer_measurement_status status; 30479bb7e0f2SJohannes Berg 30489bb7e0f2SJohannes Berg u8 addr[ETH_ALEN]; 30499bb7e0f2SJohannes Berg 30509bb7e0f2SJohannes Berg u8 final:1, 30519bb7e0f2SJohannes Berg ap_tsf_valid:1; 30529bb7e0f2SJohannes Berg 30539bb7e0f2SJohannes Berg enum nl80211_peer_measurement_type type; 30549bb7e0f2SJohannes Berg 30559bb7e0f2SJohannes Berg union { 30569bb7e0f2SJohannes Berg struct cfg80211_pmsr_ftm_result ftm; 30579bb7e0f2SJohannes Berg }; 30589bb7e0f2SJohannes Berg }; 30599bb7e0f2SJohannes Berg 30609bb7e0f2SJohannes Berg /** 30619bb7e0f2SJohannes Berg * struct cfg80211_pmsr_ftm_request_peer - FTM request data 30629bb7e0f2SJohannes Berg * @requested: indicates FTM is requested 30639bb7e0f2SJohannes Berg * @preamble: frame preamble to use 30649bb7e0f2SJohannes Berg * @burst_period: burst period to use 30659bb7e0f2SJohannes Berg * @asap: indicates to use ASAP mode 30669bb7e0f2SJohannes Berg * @num_bursts_exp: number of bursts exponent 30679bb7e0f2SJohannes Berg * @burst_duration: burst duration 30689bb7e0f2SJohannes Berg * @ftms_per_burst: number of FTMs per burst 30699bb7e0f2SJohannes Berg * @ftmr_retries: number of retries for FTM request 30709bb7e0f2SJohannes Berg * @request_lci: request LCI information 30719bb7e0f2SJohannes Berg * @request_civicloc: request civic location information 30729bb7e0f2SJohannes Berg * 30739bb7e0f2SJohannes Berg * See also nl80211 for the respective attribute documentation. 30749bb7e0f2SJohannes Berg */ 30759bb7e0f2SJohannes Berg struct cfg80211_pmsr_ftm_request_peer { 30769bb7e0f2SJohannes Berg enum nl80211_preamble preamble; 30779bb7e0f2SJohannes Berg u16 burst_period; 30789bb7e0f2SJohannes Berg u8 requested:1, 30799bb7e0f2SJohannes Berg asap:1, 30809bb7e0f2SJohannes Berg request_lci:1, 30819bb7e0f2SJohannes Berg request_civicloc:1; 30829bb7e0f2SJohannes Berg u8 num_bursts_exp; 30839bb7e0f2SJohannes Berg u8 burst_duration; 30849bb7e0f2SJohannes Berg u8 ftms_per_burst; 30859bb7e0f2SJohannes Berg u8 ftmr_retries; 30869bb7e0f2SJohannes Berg }; 30879bb7e0f2SJohannes Berg 30889bb7e0f2SJohannes Berg /** 30899bb7e0f2SJohannes Berg * struct cfg80211_pmsr_request_peer - peer data for a peer measurement request 30909bb7e0f2SJohannes Berg * @addr: MAC address 30919bb7e0f2SJohannes Berg * @chandef: channel to use 30929bb7e0f2SJohannes Berg * @report_ap_tsf: report the associated AP's TSF 30939bb7e0f2SJohannes Berg * @ftm: FTM data, see &struct cfg80211_pmsr_ftm_request_peer 30949bb7e0f2SJohannes Berg */ 30959bb7e0f2SJohannes Berg struct cfg80211_pmsr_request_peer { 30969bb7e0f2SJohannes Berg u8 addr[ETH_ALEN]; 30979bb7e0f2SJohannes Berg struct cfg80211_chan_def chandef; 30989bb7e0f2SJohannes Berg u8 report_ap_tsf:1; 30999bb7e0f2SJohannes Berg struct cfg80211_pmsr_ftm_request_peer ftm; 31009bb7e0f2SJohannes Berg }; 31019bb7e0f2SJohannes Berg 31029bb7e0f2SJohannes Berg /** 31039bb7e0f2SJohannes Berg * struct cfg80211_pmsr_request - peer measurement request 31049bb7e0f2SJohannes Berg * @cookie: cookie, set by cfg80211 31059bb7e0f2SJohannes Berg * @nl_portid: netlink portid - used by cfg80211 31069bb7e0f2SJohannes Berg * @drv_data: driver data for this request, if required for aborting, 31079bb7e0f2SJohannes Berg * not otherwise freed or anything by cfg80211 31089bb7e0f2SJohannes Berg * @mac_addr: MAC address used for (randomised) request 31099bb7e0f2SJohannes Berg * @mac_addr_mask: MAC address mask used for randomisation, bits that 31109bb7e0f2SJohannes Berg * are 0 in the mask should be randomised, bits that are 1 should 31119bb7e0f2SJohannes Berg * be taken from the @mac_addr 31129bb7e0f2SJohannes Berg * @list: used by cfg80211 to hold on to the request 31139bb7e0f2SJohannes Berg * @timeout: timeout (in milliseconds) for the whole operation, if 31149bb7e0f2SJohannes Berg * zero it means there's no timeout 31159bb7e0f2SJohannes Berg * @n_peers: number of peers to do measurements with 31169bb7e0f2SJohannes Berg * @peers: per-peer measurement request data 31179bb7e0f2SJohannes Berg */ 31189bb7e0f2SJohannes Berg struct cfg80211_pmsr_request { 31199bb7e0f2SJohannes Berg u64 cookie; 31209bb7e0f2SJohannes Berg void *drv_data; 31219bb7e0f2SJohannes Berg u32 n_peers; 31229bb7e0f2SJohannes Berg u32 nl_portid; 31239bb7e0f2SJohannes Berg 31249bb7e0f2SJohannes Berg u32 timeout; 31259bb7e0f2SJohannes Berg 31269bb7e0f2SJohannes Berg u8 mac_addr[ETH_ALEN] __aligned(2); 31279bb7e0f2SJohannes Berg u8 mac_addr_mask[ETH_ALEN] __aligned(2); 31289bb7e0f2SJohannes Berg 31299bb7e0f2SJohannes Berg struct list_head list; 31309bb7e0f2SJohannes Berg 31319bb7e0f2SJohannes Berg struct cfg80211_pmsr_request_peer peers[]; 31329bb7e0f2SJohannes Berg }; 31339bb7e0f2SJohannes Berg 31349bb7e0f2SJohannes Berg /** 3135cb74e977SSunil Dutt * struct cfg80211_update_owe_info - OWE Information 3136cb74e977SSunil Dutt * 3137cb74e977SSunil Dutt * This structure provides information needed for the drivers to offload OWE 3138cb74e977SSunil Dutt * (Opportunistic Wireless Encryption) processing to the user space. 3139cb74e977SSunil Dutt * 3140cb74e977SSunil Dutt * Commonly used across update_owe_info request and event interfaces. 3141cb74e977SSunil Dutt * 3142cb74e977SSunil Dutt * @peer: MAC address of the peer device for which the OWE processing 3143cb74e977SSunil Dutt * has to be done. 3144cb74e977SSunil Dutt * @status: status code, %WLAN_STATUS_SUCCESS for successful OWE info 3145cb74e977SSunil Dutt * processing, use %WLAN_STATUS_UNSPECIFIED_FAILURE if user space 3146cb74e977SSunil Dutt * cannot give you the real status code for failures. Used only for 3147cb74e977SSunil Dutt * OWE update request command interface (user space to driver). 3148cb74e977SSunil Dutt * @ie: IEs obtained from the peer or constructed by the user space. These are 3149cb74e977SSunil Dutt * the IEs of the remote peer in the event from the host driver and 3150cb74e977SSunil Dutt * the constructed IEs by the user space in the request interface. 3151cb74e977SSunil Dutt * @ie_len: Length of IEs in octets. 3152cb74e977SSunil Dutt */ 3153cb74e977SSunil Dutt struct cfg80211_update_owe_info { 3154cb74e977SSunil Dutt u8 peer[ETH_ALEN] __aligned(2); 3155cb74e977SSunil Dutt u16 status; 3156cb74e977SSunil Dutt const u8 *ie; 3157cb74e977SSunil Dutt size_t ie_len; 3158cb74e977SSunil Dutt }; 3159cb74e977SSunil Dutt 3160cb74e977SSunil Dutt /** 3161704232c2SJohannes Berg * struct cfg80211_ops - backend description for wireless configuration 3162704232c2SJohannes Berg * 3163704232c2SJohannes Berg * This struct is registered by fullmac card drivers and/or wireless stacks 3164704232c2SJohannes Berg * in order to handle configuration requests on their interfaces. 3165704232c2SJohannes Berg * 3166704232c2SJohannes Berg * All callbacks except where otherwise noted should return 0 3167704232c2SJohannes Berg * on success or a negative error code. 3168704232c2SJohannes Berg * 316943fb45cbSJohannes Berg * All operations are currently invoked under rtnl for consistency with the 317043fb45cbSJohannes Berg * wireless extensions but this is subject to reevaluation as soon as this 317143fb45cbSJohannes Berg * code is used more widely and we have a first user without wext. 317243fb45cbSJohannes Berg * 3173ff1b6e69SJohannes Berg * @suspend: wiphy device needs to be suspended. The variable @wow will 3174ff1b6e69SJohannes Berg * be %NULL or contain the enabled Wake-on-Wireless triggers that are 3175ff1b6e69SJohannes Berg * configured for the device. 31760378b3f1SJohannes Berg * @resume: wiphy device needs to be resumed 31776d52563fSJohannes Berg * @set_wakeup: Called when WoWLAN is enabled/disabled, use this callback 31786d52563fSJohannes Berg * to call device_set_wakeup_enable() to enable/disable wakeup from 31796d52563fSJohannes Berg * the device. 31800378b3f1SJohannes Berg * 318160719ffdSJohannes Berg * @add_virtual_intf: create a new virtual interface with the given name, 3182463d0183SJohannes Berg * must set the struct wireless_dev's iftype. Beware: You must create 318384efbb84SJohannes Berg * the new netdev in the wiphy's network namespace! Returns the struct 318498104fdeSJohannes Berg * wireless_dev, or an ERR_PTR. For P2P device wdevs, the driver must 318598104fdeSJohannes Berg * also set the address member in the wdev. 3186704232c2SJohannes Berg * 318784efbb84SJohannes Berg * @del_virtual_intf: remove the virtual interface 318855682965SJohannes Berg * 318960719ffdSJohannes Berg * @change_virtual_intf: change type/configuration of virtual interface, 319060719ffdSJohannes Berg * keep the struct wireless_dev's iftype updated. 319155682965SJohannes Berg * 319241ade00fSJohannes Berg * @add_key: add a key with the given parameters. @mac_addr will be %NULL 319341ade00fSJohannes Berg * when adding a group key. 319441ade00fSJohannes Berg * 319541ade00fSJohannes Berg * @get_key: get information about the key with the given parameters. 319641ade00fSJohannes Berg * @mac_addr will be %NULL when requesting information for a group 319741ade00fSJohannes Berg * key. All pointers given to the @callback function need not be valid 3198e3da574aSJohannes Berg * after it returns. This function should return an error if it is 3199e3da574aSJohannes Berg * not possible to retrieve the key, -ENOENT if it doesn't exist. 320041ade00fSJohannes Berg * 320141ade00fSJohannes Berg * @del_key: remove a key given the @mac_addr (%NULL for a group key) 3202e3da574aSJohannes Berg * and @key_index, return -ENOENT if the key doesn't exist. 320341ade00fSJohannes Berg * 320441ade00fSJohannes Berg * @set_default_key: set the default key on an interface 3205ed1b6cc7SJohannes Berg * 32063cfcf6acSJouni Malinen * @set_default_mgmt_key: set the default management frame key on an interface 32073cfcf6acSJouni Malinen * 3208e5497d76SJohannes Berg * @set_rekey_data: give the data necessary for GTK rekeying to the driver 3209e5497d76SJohannes Berg * 3210c04a4ff7SJohannes Berg * @start_ap: Start acting in AP mode defined by the parameters. 3211c04a4ff7SJohannes Berg * @change_beacon: Change the beacon parameters for an access point mode 3212c04a4ff7SJohannes Berg * interface. This should reject the call when AP mode wasn't started. 3213c04a4ff7SJohannes Berg * @stop_ap: Stop being an AP, including stopping beaconing. 32145727ef1bSJohannes Berg * 32155727ef1bSJohannes Berg * @add_station: Add a new station. 321689c771e5SJouni Malinen * @del_station: Remove a station 3217bdd90d5eSJohannes Berg * @change_station: Modify a given station. Note that flags changes are not much 3218bdd90d5eSJohannes Berg * validated in cfg80211, in particular the auth/assoc/authorized flags 3219bdd90d5eSJohannes Berg * might come to the driver in invalid combinations -- make sure to check 322077ee7c89SJohannes Berg * them, also against the existing state! Drivers must call 322177ee7c89SJohannes Berg * cfg80211_check_station_change() to validate the information. 3222abe37c4bSJohannes Berg * @get_station: get station information for the station identified by @mac 3223abe37c4bSJohannes Berg * @dump_station: dump station callback -- resume dump at index @idx 3224abe37c4bSJohannes Berg * 3225abe37c4bSJohannes Berg * @add_mpath: add a fixed mesh path 3226abe37c4bSJohannes Berg * @del_mpath: delete a given mesh path 3227abe37c4bSJohannes Berg * @change_mpath: change a given mesh path 3228abe37c4bSJohannes Berg * @get_mpath: get a mesh path for the given parameters 3229abe37c4bSJohannes Berg * @dump_mpath: dump mesh path callback -- resume dump at index @idx 323066be7d2bSHenning Rogge * @get_mpp: get a mesh proxy path for the given parameters 323166be7d2bSHenning Rogge * @dump_mpp: dump mesh proxy path callback -- resume dump at index @idx 3232f52555a4SJohannes Berg * @join_mesh: join the mesh network with the specified parameters 32338d61ffa5SJohannes Berg * (invoked with the wireless_dev mutex held) 3234f52555a4SJohannes Berg * @leave_mesh: leave the current mesh network 32358d61ffa5SJohannes Berg * (invoked with the wireless_dev mutex held) 32362ec600d6SLuis Carlos Cobo * 323724bdd9f4SJavier Cardona * @get_mesh_config: Get the current mesh configuration 323893da9cc1Scolin@cozybit.com * 323924bdd9f4SJavier Cardona * @update_mesh_config: Update mesh parameters on a running mesh. 324093da9cc1Scolin@cozybit.com * The mask is a bitfield which tells us which parameters to 324193da9cc1Scolin@cozybit.com * set, and which to leave alone. 324293da9cc1Scolin@cozybit.com * 32439f1ba906SJouni Malinen * @change_bss: Modify parameters for a given BSS. 324431888487SJouni Malinen * 324531888487SJouni Malinen * @set_txq_params: Set TX queue parameters 324672bdcf34SJouni Malinen * 3247e8c9bd5bSJohannes Berg * @libertas_set_mesh_channel: Only for backward compatibility for libertas, 3248e8c9bd5bSJohannes Berg * as it doesn't implement join_mesh and needs to set the channel to 3249e8c9bd5bSJohannes Berg * join the mesh instead. 3250e8c9bd5bSJohannes Berg * 3251e8c9bd5bSJohannes Berg * @set_monitor_channel: Set the monitor mode channel for the device. If other 3252e8c9bd5bSJohannes Berg * interfaces are active this callback should reject the configuration. 3253e8c9bd5bSJohannes Berg * If no interfaces are active or the device is down, the channel should 3254e8c9bd5bSJohannes Berg * be stored for when a monitor interface becomes active. 32559aed3cc1SJouni Malinen * 32562a519311SJohannes Berg * @scan: Request to do a scan. If returning zero, the scan request is given 32572a519311SJohannes Berg * the driver, and will be valid until passed to cfg80211_scan_done(). 32582a519311SJohannes Berg * For scan results, call cfg80211_inform_bss(); you can call this outside 32592a519311SJohannes Berg * the scan/scan_done bracket too. 326091d3ab46SVidyullatha Kanchanapally * @abort_scan: Tell the driver to abort an ongoing scan. The driver shall 326191d3ab46SVidyullatha Kanchanapally * indicate the status of the scan through cfg80211_scan_done(). 3262636a5d36SJouni Malinen * 3263636a5d36SJouni Malinen * @auth: Request to authenticate with the specified peer 32648d61ffa5SJohannes Berg * (invoked with the wireless_dev mutex held) 3265636a5d36SJouni Malinen * @assoc: Request to (re)associate with the specified peer 32668d61ffa5SJohannes Berg * (invoked with the wireless_dev mutex held) 3267636a5d36SJouni Malinen * @deauth: Request to deauthenticate from the specified peer 32688d61ffa5SJohannes Berg * (invoked with the wireless_dev mutex held) 3269636a5d36SJouni Malinen * @disassoc: Request to disassociate from the specified peer 32708d61ffa5SJohannes Berg * (invoked with the wireless_dev mutex held) 327104a773adSJohannes Berg * 3272b23aa676SSamuel Ortiz * @connect: Connect to the ESS with the specified parameters. When connected, 3273bf1ecd21SJouni Malinen * call cfg80211_connect_result()/cfg80211_connect_bss() with status code 3274bf1ecd21SJouni Malinen * %WLAN_STATUS_SUCCESS. If the connection fails for some reason, call 3275bf1ecd21SJouni Malinen * cfg80211_connect_result()/cfg80211_connect_bss() with the status code 3276bf1ecd21SJouni Malinen * from the AP or cfg80211_connect_timeout() if no frame with status code 3277bf1ecd21SJouni Malinen * was received. 3278bf1ecd21SJouni Malinen * The driver is allowed to roam to other BSSes within the ESS when the 3279bf1ecd21SJouni Malinen * other BSS matches the connect parameters. When such roaming is initiated 3280bf1ecd21SJouni Malinen * by the driver, the driver is expected to verify that the target matches 3281bf1ecd21SJouni Malinen * the configured security parameters and to use Reassociation Request 3282bf1ecd21SJouni Malinen * frame instead of Association Request frame. 3283bf1ecd21SJouni Malinen * The connect function can also be used to request the driver to perform a 3284bf1ecd21SJouni Malinen * specific roam when connected to an ESS. In that case, the prev_bssid 328535eb8f7bSJouni Malinen * parameter is set to the BSSID of the currently associated BSS as an 3286bf1ecd21SJouni Malinen * indication of requesting reassociation. 3287bf1ecd21SJouni Malinen * In both the driver-initiated and new connect() call initiated roaming 3288bf1ecd21SJouni Malinen * cases, the result of roaming is indicated with a call to 328929ce6ecbSAvraham Stern * cfg80211_roamed(). (invoked with the wireless_dev mutex held) 3290088e8df8Svamsi krishna * @update_connect_params: Update the connect parameters while connected to a 3291088e8df8Svamsi krishna * BSS. The updated parameters can be used by driver/firmware for 3292088e8df8Svamsi krishna * subsequent BSS selection (roaming) decisions and to form the 3293088e8df8Svamsi krishna * Authentication/(Re)Association Request frames. This call does not 3294088e8df8Svamsi krishna * request an immediate disassociation or reassociation with the current 3295088e8df8Svamsi krishna * BSS, i.e., this impacts only subsequent (re)associations. The bits in 3296088e8df8Svamsi krishna * changed are defined in &enum cfg80211_connect_params_changed. 3297088e8df8Svamsi krishna * (invoked with the wireless_dev mutex held) 32980711d638SIlan Peer * @disconnect: Disconnect from the BSS/ESS or stop connection attempts if 32990711d638SIlan Peer * connection is in progress. Once done, call cfg80211_disconnected() in 33000711d638SIlan Peer * case connection was already established (invoked with the 33010711d638SIlan Peer * wireless_dev mutex held), otherwise call cfg80211_connect_timeout(). 3302b23aa676SSamuel Ortiz * 330304a773adSJohannes Berg * @join_ibss: Join the specified IBSS (or create if necessary). Once done, call 330404a773adSJohannes Berg * cfg80211_ibss_joined(), also call that function when changing BSSID due 330504a773adSJohannes Berg * to a merge. 33068d61ffa5SJohannes Berg * (invoked with the wireless_dev mutex held) 330704a773adSJohannes Berg * @leave_ibss: Leave the IBSS. 33088d61ffa5SJohannes Berg * (invoked with the wireless_dev mutex held) 3309b9a5f8caSJouni Malinen * 3310f4e583c8SAntonio Quartulli * @set_mcast_rate: Set the specified multicast rate (only if vif is in ADHOC or 3311f4e583c8SAntonio Quartulli * MESH mode) 3312f4e583c8SAntonio Quartulli * 3313b9a5f8caSJouni Malinen * @set_wiphy_params: Notify that wiphy parameters have changed; 3314b9a5f8caSJouni Malinen * @changed bitfield (see &enum wiphy_params_flags) describes which values 3315b9a5f8caSJouni Malinen * have changed. The actual parameter values are available in 3316b9a5f8caSJouni Malinen * struct wiphy. If returning an error, no value should be changed. 33177643a2c3SJohannes Berg * 33181432de07SLuis R. Rodriguez * @set_tx_power: set the transmit power according to the parameters, 3319c8442118SJohannes Berg * the power passed is in mBm, to get dBm use MBM_TO_DBM(). The 3320c8442118SJohannes Berg * wdev may be %NULL if power was set for the wiphy, and will 3321c8442118SJohannes Berg * always be %NULL unless the driver supports per-vif TX power 3322c8442118SJohannes Berg * (as advertised by the nl80211 feature flag.) 33237643a2c3SJohannes Berg * @get_tx_power: store the current TX power into the dbm variable; 33241f87f7d3SJohannes Berg * return 0 if successful 33251f87f7d3SJohannes Berg * 3326abe37c4bSJohannes Berg * @set_wds_peer: set the WDS peer for a WDS interface 3327abe37c4bSJohannes Berg * 33281f87f7d3SJohannes Berg * @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting 33291f87f7d3SJohannes Berg * functions to adjust rfkill hw state 3330aff89a9bSJohannes Berg * 333161fa713cSHolger Schurig * @dump_survey: get site survey information. 333261fa713cSHolger Schurig * 33339588bbd5SJouni Malinen * @remain_on_channel: Request the driver to remain awake on the specified 33349588bbd5SJouni Malinen * channel for the specified duration to complete an off-channel 33359588bbd5SJouni Malinen * operation (e.g., public action frame exchange). When the driver is 33369588bbd5SJouni Malinen * ready on the requested channel, it must indicate this with an event 33379588bbd5SJouni Malinen * notification by calling cfg80211_ready_on_channel(). 33389588bbd5SJouni Malinen * @cancel_remain_on_channel: Cancel an on-going remain-on-channel operation. 33399588bbd5SJouni Malinen * This allows the operation to be terminated prior to timeout based on 33409588bbd5SJouni Malinen * the duration value. 3341f7ca38dfSJohannes Berg * @mgmt_tx: Transmit a management frame. 3342f7ca38dfSJohannes Berg * @mgmt_tx_cancel_wait: Cancel the wait time from transmitting a management 3343f7ca38dfSJohannes Berg * frame on another channel 33449588bbd5SJouni Malinen * 3345fc73f11fSDavid Spinadel * @testmode_cmd: run a test mode command; @wdev may be %NULL 334671063f0eSWey-Yi Guy * @testmode_dump: Implement a test mode dump. The cb->args[2] and up may be 334771063f0eSWey-Yi Guy * used by the function, but 0 and 1 must not be touched. Additionally, 334871063f0eSWey-Yi Guy * return error codes other than -ENOBUFS and -ENOENT will terminate the 334971063f0eSWey-Yi Guy * dump and return to userspace with an error, so be careful. If any data 335071063f0eSWey-Yi Guy * was passed in from userspace then the data/len arguments will be present 335171063f0eSWey-Yi Guy * and point to the data contained in %NL80211_ATTR_TESTDATA. 335267fbb16bSSamuel Ortiz * 3353abe37c4bSJohannes Berg * @set_bitrate_mask: set the bitrate mask configuration 3354abe37c4bSJohannes Berg * 335567fbb16bSSamuel Ortiz * @set_pmksa: Cache a PMKID for a BSSID. This is mostly useful for fullmac 335667fbb16bSSamuel Ortiz * devices running firmwares capable of generating the (re) association 335767fbb16bSSamuel Ortiz * RSN IE. It allows for faster roaming between WPA2 BSSIDs. 335867fbb16bSSamuel Ortiz * @del_pmksa: Delete a cached PMKID. 335967fbb16bSSamuel Ortiz * @flush_pmksa: Flush all cached PMKIDs. 33609043f3b8SJuuso Oikarinen * @set_power_mgmt: Configure WLAN power management. A timeout value of -1 33619043f3b8SJuuso Oikarinen * allows the driver to adjust the dynamic ps timeout value. 3362d6dc1a38SJuuso Oikarinen * @set_cqm_rssi_config: Configure connection quality monitor RSSI threshold. 3363e86abc68SJohannes Berg * After configuration, the driver should (soon) send an event indicating 3364e86abc68SJohannes Berg * the current level is above/below the configured threshold; this may 3365e86abc68SJohannes Berg * need some care when the configuration is changed (without first being 3366e86abc68SJohannes Berg * disabled.) 33674a4b8169SAndrew Zaborowski * @set_cqm_rssi_range_config: Configure two RSSI thresholds in the 33684a4b8169SAndrew Zaborowski * connection quality monitor. An event is to be sent only when the 33694a4b8169SAndrew Zaborowski * signal level is found to be outside the two values. The driver should 33704a4b8169SAndrew Zaborowski * set %NL80211_EXT_FEATURE_CQM_RSSI_LIST if this method is implemented. 33714a4b8169SAndrew Zaborowski * If it is provided then there's no point providing @set_cqm_rssi_config. 337284f10708SThomas Pedersen * @set_cqm_txe_config: Configure connection quality monitor TX error 337384f10708SThomas Pedersen * thresholds. 3374807f8a8cSLuciano Coelho * @sched_scan_start: Tell the driver to start a scheduled scan. 33753a3ecf1dSArend Van Spriel * @sched_scan_stop: Tell the driver to stop an ongoing scheduled scan with 33763a3ecf1dSArend Van Spriel * given request id. This call must stop the scheduled scan and be ready 33773a3ecf1dSArend Van Spriel * for starting a new one before it returns, i.e. @sched_scan_start may be 33783a3ecf1dSArend Van Spriel * called immediately after that again and should not fail in that case. 33793a3ecf1dSArend Van Spriel * The driver should not call cfg80211_sched_scan_stopped() for a requested 33803a3ecf1dSArend Van Spriel * stop (when this method returns 0). 338167fbb16bSSamuel Ortiz * 3382271733cfSJohannes Berg * @mgmt_frame_register: Notify driver that a management frame type was 338333d8783cSJohannes Berg * registered. The callback is allowed to sleep. 3384547025d5SBruno Randolf * 3385547025d5SBruno Randolf * @set_antenna: Set antenna configuration (tx_ant, rx_ant) on the device. 3386547025d5SBruno Randolf * Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may 3387547025d5SBruno Randolf * reject TX/RX mask combinations they cannot support by returning -EINVAL 3388547025d5SBruno Randolf * (also see nl80211.h @NL80211_ATTR_WIPHY_ANTENNA_TX). 3389547025d5SBruno Randolf * 3390547025d5SBruno Randolf * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant). 33913677713bSJohn W. Linville * 3392109086ceSArik Nemtsov * @tdls_mgmt: Transmit a TDLS management frame. 3393109086ceSArik Nemtsov * @tdls_oper: Perform a high-level TDLS operation (e.g. TDLS link setup). 33947f6cf311SJohannes Berg * 33957f6cf311SJohannes Berg * @probe_client: probe an associated client, must return a cookie that it 33967f6cf311SJohannes Berg * later passes to cfg80211_probe_status(). 33971d9d9213SSimon Wunderlich * 33981d9d9213SSimon Wunderlich * @set_noack_map: Set the NoAck Map for the TIDs. 3399d6199218SBen Greear * 34005b7ccaf3SJohannes Berg * @get_channel: Get the current operating channel for the virtual interface. 34015b7ccaf3SJohannes Berg * For monitor interfaces, it should return %NULL unless there's a single 34025b7ccaf3SJohannes Berg * current monitoring channel. 340398104fdeSJohannes Berg * 340498104fdeSJohannes Berg * @start_p2p_device: Start the given P2P device. 340598104fdeSJohannes Berg * @stop_p2p_device: Stop the given P2P device. 340677765eafSVasanthakumar Thiagarajan * 340777765eafSVasanthakumar Thiagarajan * @set_mac_acl: Sets MAC address control list in AP and P2P GO mode. 340877765eafSVasanthakumar Thiagarajan * Parameters include ACL policy, an array of MAC address of stations 340977765eafSVasanthakumar Thiagarajan * and the number of MAC addresses. If there is already a list in driver 341077765eafSVasanthakumar Thiagarajan * this new list replaces the existing one. Driver has to clear its ACL 341177765eafSVasanthakumar Thiagarajan * when number of MAC addresses entries is passed as 0. Drivers which 341277765eafSVasanthakumar Thiagarajan * advertise the support for MAC based ACL have to implement this callback. 341304f39047SSimon Wunderlich * 341404f39047SSimon Wunderlich * @start_radar_detection: Start radar detection in the driver. 34158bf24293SJouni Malinen * 34168bf24293SJouni Malinen * @update_ft_ies: Provide updated Fast BSS Transition information to the 34178bf24293SJouni Malinen * driver. If the SME is in the driver/firmware, this information can be 34188bf24293SJouni Malinen * used in building Authentication and Reassociation Request frames. 34195de17984SArend van Spriel * 34205de17984SArend van Spriel * @crit_proto_start: Indicates a critical protocol needs more link reliability 34215de17984SArend van Spriel * for a given duration (milliseconds). The protocol is provided so the 34225de17984SArend van Spriel * driver can take the most appropriate actions. 34235de17984SArend van Spriel * @crit_proto_stop: Indicates critical protocol no longer needs increased link 34245de17984SArend van Spriel * reliability. This operation can not fail. 3425be29b99aSAmitkumar Karwar * @set_coalesce: Set coalesce parameters. 342616ef1fe2SSimon Wunderlich * 342797dc94f1SMichal Kazior * @channel_switch: initiate channel-switch procedure (with CSA). Driver is 342897dc94f1SMichal Kazior * responsible for veryfing if the switch is possible. Since this is 342997dc94f1SMichal Kazior * inherently tricky driver may decide to disconnect an interface later 343097dc94f1SMichal Kazior * with cfg80211_stop_iface(). This doesn't mean driver can accept 343197dc94f1SMichal Kazior * everything. It should do it's best to verify requests and reject them 343297dc94f1SMichal Kazior * as soon as possible. 3433fa9ffc74SKyeyoon Park * 3434fa9ffc74SKyeyoon Park * @set_qos_map: Set QoS mapping information to the driver 3435e16821bcSJouni Malinen * 3436e16821bcSJouni Malinen * @set_ap_chanwidth: Set the AP (including P2P GO) mode channel width for the 3437e16821bcSJouni Malinen * given interface This is used e.g. for dynamic HT 20/40 MHz channel width 3438e16821bcSJouni Malinen * changes during the lifetime of the BSS. 3439960d01acSJohannes Berg * 3440960d01acSJohannes Berg * @add_tx_ts: validate (if admitted_time is 0) or add a TX TS to the device 3441960d01acSJohannes Berg * with the given parameters; action frame exchange has been handled by 3442960d01acSJohannes Berg * userspace so this just has to modify the TX path to take the TS into 3443960d01acSJohannes Berg * account. 3444960d01acSJohannes Berg * If the admitted time is 0 just validate the parameters to make sure 3445960d01acSJohannes Berg * the session can be created at all; it is valid to just always return 3446960d01acSJohannes Berg * success for that but that may result in inefficient behaviour (handshake 3447960d01acSJohannes Berg * with the peer followed by immediate teardown when the addition is later 3448960d01acSJohannes Berg * rejected) 3449960d01acSJohannes Berg * @del_tx_ts: remove an existing TX TS 34506e0bd6c3SRostislav Lisovy * 34516e0bd6c3SRostislav Lisovy * @join_ocb: join the OCB network with the specified parameters 34526e0bd6c3SRostislav Lisovy * (invoked with the wireless_dev mutex held) 34536e0bd6c3SRostislav Lisovy * @leave_ocb: leave the current OCB network 34546e0bd6c3SRostislav Lisovy * (invoked with the wireless_dev mutex held) 34551057d35eSArik Nemtsov * 34561057d35eSArik Nemtsov * @tdls_channel_switch: Start channel-switching with a TDLS peer. The driver 34571057d35eSArik Nemtsov * is responsible for continually initiating channel-switching operations 34581057d35eSArik Nemtsov * and returning to the base channel for communication with the AP. 34591057d35eSArik Nemtsov * @tdls_cancel_channel_switch: Stop channel-switching with a TDLS peer. Both 34601057d35eSArik Nemtsov * peers must be on the base channel when the call completes. 3461cb3b7d87SAyala Beker * @start_nan: Start the NAN interface. 3462cb3b7d87SAyala Beker * @stop_nan: Stop the NAN interface. 3463a442b761SAyala Beker * @add_nan_func: Add a NAN function. Returns negative value on failure. 3464a442b761SAyala Beker * On success @nan_func ownership is transferred to the driver and 3465a442b761SAyala Beker * it may access it outside of the scope of this function. The driver 3466a442b761SAyala Beker * should free the @nan_func when no longer needed by calling 3467a442b761SAyala Beker * cfg80211_free_nan_func(). 3468a442b761SAyala Beker * On success the driver should assign an instance_id in the 3469a442b761SAyala Beker * provided @nan_func. 3470a442b761SAyala Beker * @del_nan_func: Delete a NAN function. 3471a5a9dcf2SAyala Beker * @nan_change_conf: changes NAN configuration. The changed parameters must 3472a5a9dcf2SAyala Beker * be specified in @changes (using &enum cfg80211_nan_conf_changes); 3473a5a9dcf2SAyala Beker * All other parameters must be ignored. 3474ce0ce13aSMichael Braun * 3475ce0ce13aSMichael Braun * @set_multicast_to_unicast: configure multicast to unicast conversion for BSS 34763a00df57SAvraham Stern * 347752539ca8SToke Høiland-Jørgensen * @get_txq_stats: Get TXQ stats for interface or phy. If wdev is %NULL, this 347852539ca8SToke Høiland-Jørgensen * function should return phy stats, and interface stats otherwise. 347952539ca8SToke Høiland-Jørgensen * 34803a00df57SAvraham Stern * @set_pmk: configure the PMK to be used for offloaded 802.1X 4-Way handshake. 34813a00df57SAvraham Stern * If not deleted through @del_pmk the PMK remains valid until disconnect 34823a00df57SAvraham Stern * upon which the driver should clear it. 34833a00df57SAvraham Stern * (invoked with the wireless_dev mutex held) 34843a00df57SAvraham Stern * @del_pmk: delete the previously configured PMK for the given authenticator. 34853a00df57SAvraham Stern * (invoked with the wireless_dev mutex held) 348640cbfa90SSrinivas Dasari * 348740cbfa90SSrinivas Dasari * @external_auth: indicates result of offloaded authentication processing from 348840cbfa90SSrinivas Dasari * user space 34892576a9acSDenis Kenzior * 34902576a9acSDenis Kenzior * @tx_control_port: TX a control port frame (EAPoL). The noencrypt parameter 34912576a9acSDenis Kenzior * tells the driver that the frame should not be encrypted. 349281e54d08SPradeep Kumar Chitrapu * 349381e54d08SPradeep Kumar Chitrapu * @get_ftm_responder_stats: Retrieve FTM responder statistics, if available. 349481e54d08SPradeep Kumar Chitrapu * Statistics should be cumulative, currently no way to reset is provided. 34959bb7e0f2SJohannes Berg * @start_pmsr: start peer measurement (e.g. FTM) 34969bb7e0f2SJohannes Berg * @abort_pmsr: abort peer measurement 3497cb74e977SSunil Dutt * 3498cb74e977SSunil Dutt * @update_owe_info: Provide updated OWE info to driver. Driver implementing SME 3499cb74e977SSunil Dutt * but offloading OWE processing to the user space will get the updated 3500cb74e977SSunil Dutt * DH IE through this interface. 35015ab92e7fSRajkumar Manoharan * 35025ab92e7fSRajkumar Manoharan * @probe_mesh_link: Probe direct Mesh peer's link quality by sending data frame 35035ab92e7fSRajkumar Manoharan * and overrule HWMP path selection algorithm. 3504704232c2SJohannes Berg */ 3505704232c2SJohannes Berg struct cfg80211_ops { 3506ff1b6e69SJohannes Berg int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow); 35070378b3f1SJohannes Berg int (*resume)(struct wiphy *wiphy); 35086d52563fSJohannes Berg void (*set_wakeup)(struct wiphy *wiphy, bool enabled); 35090378b3f1SJohannes Berg 351084efbb84SJohannes Berg struct wireless_dev * (*add_virtual_intf)(struct wiphy *wiphy, 3511552bff0cSJohannes Berg const char *name, 35126bab2e19STom Gundersen unsigned char name_assign_type, 3513f9e10ce4SJohannes Berg enum nl80211_iftype type, 35142ec600d6SLuis Carlos Cobo struct vif_params *params); 351584efbb84SJohannes Berg int (*del_virtual_intf)(struct wiphy *wiphy, 351684efbb84SJohannes Berg struct wireless_dev *wdev); 3517e36d56b6SJohannes Berg int (*change_virtual_intf)(struct wiphy *wiphy, 3518e36d56b6SJohannes Berg struct net_device *dev, 3519818a986eSJohannes Berg enum nl80211_iftype type, 35202ec600d6SLuis Carlos Cobo struct vif_params *params); 352141ade00fSJohannes Berg 352241ade00fSJohannes Berg int (*add_key)(struct wiphy *wiphy, struct net_device *netdev, 3523e31b8213SJohannes Berg u8 key_index, bool pairwise, const u8 *mac_addr, 352441ade00fSJohannes Berg struct key_params *params); 352541ade00fSJohannes Berg int (*get_key)(struct wiphy *wiphy, struct net_device *netdev, 3526e31b8213SJohannes Berg u8 key_index, bool pairwise, const u8 *mac_addr, 3527e31b8213SJohannes Berg void *cookie, 352841ade00fSJohannes Berg void (*callback)(void *cookie, struct key_params*)); 352941ade00fSJohannes Berg int (*del_key)(struct wiphy *wiphy, struct net_device *netdev, 3530e31b8213SJohannes Berg u8 key_index, bool pairwise, const u8 *mac_addr); 353141ade00fSJohannes Berg int (*set_default_key)(struct wiphy *wiphy, 353241ade00fSJohannes Berg struct net_device *netdev, 3533dbd2fd65SJohannes Berg u8 key_index, bool unicast, bool multicast); 35343cfcf6acSJouni Malinen int (*set_default_mgmt_key)(struct wiphy *wiphy, 35353cfcf6acSJouni Malinen struct net_device *netdev, 35363cfcf6acSJouni Malinen u8 key_index); 3537ed1b6cc7SJohannes Berg 35388860020eSJohannes Berg int (*start_ap)(struct wiphy *wiphy, struct net_device *dev, 35398860020eSJohannes Berg struct cfg80211_ap_settings *settings); 35408860020eSJohannes Berg int (*change_beacon)(struct wiphy *wiphy, struct net_device *dev, 35418860020eSJohannes Berg struct cfg80211_beacon_data *info); 35428860020eSJohannes Berg int (*stop_ap)(struct wiphy *wiphy, struct net_device *dev); 35435727ef1bSJohannes Berg 35445727ef1bSJohannes Berg 35455727ef1bSJohannes Berg int (*add_station)(struct wiphy *wiphy, struct net_device *dev, 35463b3a0162SJohannes Berg const u8 *mac, 35473b3a0162SJohannes Berg struct station_parameters *params); 35485727ef1bSJohannes Berg int (*del_station)(struct wiphy *wiphy, struct net_device *dev, 354989c771e5SJouni Malinen struct station_del_parameters *params); 35505727ef1bSJohannes Berg int (*change_station)(struct wiphy *wiphy, struct net_device *dev, 35513b3a0162SJohannes Berg const u8 *mac, 35523b3a0162SJohannes Berg struct station_parameters *params); 3553fd5b74dcSJohannes Berg int (*get_station)(struct wiphy *wiphy, struct net_device *dev, 35543b3a0162SJohannes Berg const u8 *mac, struct station_info *sinfo); 35552ec600d6SLuis Carlos Cobo int (*dump_station)(struct wiphy *wiphy, struct net_device *dev, 35562ec600d6SLuis Carlos Cobo int idx, u8 *mac, struct station_info *sinfo); 35572ec600d6SLuis Carlos Cobo 35582ec600d6SLuis Carlos Cobo int (*add_mpath)(struct wiphy *wiphy, struct net_device *dev, 35593b3a0162SJohannes Berg const u8 *dst, const u8 *next_hop); 35602ec600d6SLuis Carlos Cobo int (*del_mpath)(struct wiphy *wiphy, struct net_device *dev, 35613b3a0162SJohannes Berg const u8 *dst); 35622ec600d6SLuis Carlos Cobo int (*change_mpath)(struct wiphy *wiphy, struct net_device *dev, 35633b3a0162SJohannes Berg const u8 *dst, const u8 *next_hop); 35642ec600d6SLuis Carlos Cobo int (*get_mpath)(struct wiphy *wiphy, struct net_device *dev, 35653b3a0162SJohannes Berg u8 *dst, u8 *next_hop, struct mpath_info *pinfo); 35662ec600d6SLuis Carlos Cobo int (*dump_mpath)(struct wiphy *wiphy, struct net_device *dev, 35672ec600d6SLuis Carlos Cobo int idx, u8 *dst, u8 *next_hop, 35682ec600d6SLuis Carlos Cobo struct mpath_info *pinfo); 356966be7d2bSHenning Rogge int (*get_mpp)(struct wiphy *wiphy, struct net_device *dev, 357066be7d2bSHenning Rogge u8 *dst, u8 *mpp, struct mpath_info *pinfo); 357166be7d2bSHenning Rogge int (*dump_mpp)(struct wiphy *wiphy, struct net_device *dev, 357266be7d2bSHenning Rogge int idx, u8 *dst, u8 *mpp, 357366be7d2bSHenning Rogge struct mpath_info *pinfo); 357424bdd9f4SJavier Cardona int (*get_mesh_config)(struct wiphy *wiphy, 357593da9cc1Scolin@cozybit.com struct net_device *dev, 357693da9cc1Scolin@cozybit.com struct mesh_config *conf); 357724bdd9f4SJavier Cardona int (*update_mesh_config)(struct wiphy *wiphy, 357829cbe68cSJohannes Berg struct net_device *dev, u32 mask, 357929cbe68cSJohannes Berg const struct mesh_config *nconf); 358029cbe68cSJohannes Berg int (*join_mesh)(struct wiphy *wiphy, struct net_device *dev, 358129cbe68cSJohannes Berg const struct mesh_config *conf, 358229cbe68cSJohannes Berg const struct mesh_setup *setup); 358329cbe68cSJohannes Berg int (*leave_mesh)(struct wiphy *wiphy, struct net_device *dev); 358429cbe68cSJohannes Berg 35856e0bd6c3SRostislav Lisovy int (*join_ocb)(struct wiphy *wiphy, struct net_device *dev, 35866e0bd6c3SRostislav Lisovy struct ocb_setup *setup); 35876e0bd6c3SRostislav Lisovy int (*leave_ocb)(struct wiphy *wiphy, struct net_device *dev); 35886e0bd6c3SRostislav Lisovy 35899f1ba906SJouni Malinen int (*change_bss)(struct wiphy *wiphy, struct net_device *dev, 35909f1ba906SJouni Malinen struct bss_parameters *params); 359131888487SJouni Malinen 3592f70f01c2SEliad Peller int (*set_txq_params)(struct wiphy *wiphy, struct net_device *dev, 359331888487SJouni Malinen struct ieee80211_txq_params *params); 359472bdcf34SJouni Malinen 3595e8c9bd5bSJohannes Berg int (*libertas_set_mesh_channel)(struct wiphy *wiphy, 3596e8c9bd5bSJohannes Berg struct net_device *dev, 3597e8c9bd5bSJohannes Berg struct ieee80211_channel *chan); 3598e8c9bd5bSJohannes Berg 3599e8c9bd5bSJohannes Berg int (*set_monitor_channel)(struct wiphy *wiphy, 3600683b6d3bSJohannes Berg struct cfg80211_chan_def *chandef); 36019aed3cc1SJouni Malinen 3602fd014284SJohannes Berg int (*scan)(struct wiphy *wiphy, 36032a519311SJohannes Berg struct cfg80211_scan_request *request); 360491d3ab46SVidyullatha Kanchanapally void (*abort_scan)(struct wiphy *wiphy, struct wireless_dev *wdev); 3605636a5d36SJouni Malinen 3606636a5d36SJouni Malinen int (*auth)(struct wiphy *wiphy, struct net_device *dev, 3607636a5d36SJouni Malinen struct cfg80211_auth_request *req); 3608636a5d36SJouni Malinen int (*assoc)(struct wiphy *wiphy, struct net_device *dev, 3609636a5d36SJouni Malinen struct cfg80211_assoc_request *req); 3610636a5d36SJouni Malinen int (*deauth)(struct wiphy *wiphy, struct net_device *dev, 361163c9c5e7SJohannes Berg struct cfg80211_deauth_request *req); 3612636a5d36SJouni Malinen int (*disassoc)(struct wiphy *wiphy, struct net_device *dev, 361363c9c5e7SJohannes Berg struct cfg80211_disassoc_request *req); 361404a773adSJohannes Berg 3615b23aa676SSamuel Ortiz int (*connect)(struct wiphy *wiphy, struct net_device *dev, 3616b23aa676SSamuel Ortiz struct cfg80211_connect_params *sme); 3617088e8df8Svamsi krishna int (*update_connect_params)(struct wiphy *wiphy, 3618088e8df8Svamsi krishna struct net_device *dev, 3619088e8df8Svamsi krishna struct cfg80211_connect_params *sme, 3620088e8df8Svamsi krishna u32 changed); 3621b23aa676SSamuel Ortiz int (*disconnect)(struct wiphy *wiphy, struct net_device *dev, 3622b23aa676SSamuel Ortiz u16 reason_code); 3623b23aa676SSamuel Ortiz 362404a773adSJohannes Berg int (*join_ibss)(struct wiphy *wiphy, struct net_device *dev, 362504a773adSJohannes Berg struct cfg80211_ibss_params *params); 362604a773adSJohannes Berg int (*leave_ibss)(struct wiphy *wiphy, struct net_device *dev); 3627b9a5f8caSJouni Malinen 3628f4e583c8SAntonio Quartulli int (*set_mcast_rate)(struct wiphy *wiphy, struct net_device *dev, 362957fbcce3SJohannes Berg int rate[NUM_NL80211_BANDS]); 3630f4e583c8SAntonio Quartulli 3631b9a5f8caSJouni Malinen int (*set_wiphy_params)(struct wiphy *wiphy, u32 changed); 36327643a2c3SJohannes Berg 3633c8442118SJohannes Berg int (*set_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, 3634fa61cf70SJuuso Oikarinen enum nl80211_tx_power_setting type, int mbm); 3635c8442118SJohannes Berg int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, 3636c8442118SJohannes Berg int *dbm); 36371f87f7d3SJohannes Berg 3638ab737a4fSJohannes Berg int (*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev, 3639388ac775SJohannes Berg const u8 *addr); 3640ab737a4fSJohannes Berg 36411f87f7d3SJohannes Berg void (*rfkill_poll)(struct wiphy *wiphy); 3642aff89a9bSJohannes Berg 3643aff89a9bSJohannes Berg #ifdef CONFIG_NL80211_TESTMODE 3644fc73f11fSDavid Spinadel int (*testmode_cmd)(struct wiphy *wiphy, struct wireless_dev *wdev, 3645fc73f11fSDavid Spinadel void *data, int len); 364671063f0eSWey-Yi Guy int (*testmode_dump)(struct wiphy *wiphy, struct sk_buff *skb, 364771063f0eSWey-Yi Guy struct netlink_callback *cb, 364871063f0eSWey-Yi Guy void *data, int len); 3649aff89a9bSJohannes Berg #endif 3650bc92afd9SJohannes Berg 36519930380fSJohannes Berg int (*set_bitrate_mask)(struct wiphy *wiphy, 36529930380fSJohannes Berg struct net_device *dev, 36539930380fSJohannes Berg const u8 *peer, 36549930380fSJohannes Berg const struct cfg80211_bitrate_mask *mask); 36559930380fSJohannes Berg 365661fa713cSHolger Schurig int (*dump_survey)(struct wiphy *wiphy, struct net_device *netdev, 365761fa713cSHolger Schurig int idx, struct survey_info *info); 365861fa713cSHolger Schurig 365967fbb16bSSamuel Ortiz int (*set_pmksa)(struct wiphy *wiphy, struct net_device *netdev, 366067fbb16bSSamuel Ortiz struct cfg80211_pmksa *pmksa); 366167fbb16bSSamuel Ortiz int (*del_pmksa)(struct wiphy *wiphy, struct net_device *netdev, 366267fbb16bSSamuel Ortiz struct cfg80211_pmksa *pmksa); 366367fbb16bSSamuel Ortiz int (*flush_pmksa)(struct wiphy *wiphy, struct net_device *netdev); 366467fbb16bSSamuel Ortiz 36659588bbd5SJouni Malinen int (*remain_on_channel)(struct wiphy *wiphy, 366671bbc994SJohannes Berg struct wireless_dev *wdev, 36679588bbd5SJouni Malinen struct ieee80211_channel *chan, 36689588bbd5SJouni Malinen unsigned int duration, 36699588bbd5SJouni Malinen u64 *cookie); 36709588bbd5SJouni Malinen int (*cancel_remain_on_channel)(struct wiphy *wiphy, 367171bbc994SJohannes Berg struct wireless_dev *wdev, 36729588bbd5SJouni Malinen u64 cookie); 36739588bbd5SJouni Malinen 367471bbc994SJohannes Berg int (*mgmt_tx)(struct wiphy *wiphy, struct wireless_dev *wdev, 3675b176e629SAndrei Otcheretianski struct cfg80211_mgmt_tx_params *params, 3676b176e629SAndrei Otcheretianski u64 *cookie); 3677f7ca38dfSJohannes Berg int (*mgmt_tx_cancel_wait)(struct wiphy *wiphy, 367871bbc994SJohannes Berg struct wireless_dev *wdev, 3679f7ca38dfSJohannes Berg u64 cookie); 3680026331c4SJouni Malinen 3681bc92afd9SJohannes Berg int (*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev, 3682bc92afd9SJohannes Berg bool enabled, int timeout); 3683d6dc1a38SJuuso Oikarinen 3684d6dc1a38SJuuso Oikarinen int (*set_cqm_rssi_config)(struct wiphy *wiphy, 3685d6dc1a38SJuuso Oikarinen struct net_device *dev, 3686d6dc1a38SJuuso Oikarinen s32 rssi_thold, u32 rssi_hyst); 3687271733cfSJohannes Berg 36884a4b8169SAndrew Zaborowski int (*set_cqm_rssi_range_config)(struct wiphy *wiphy, 36894a4b8169SAndrew Zaborowski struct net_device *dev, 36904a4b8169SAndrew Zaborowski s32 rssi_low, s32 rssi_high); 36914a4b8169SAndrew Zaborowski 369284f10708SThomas Pedersen int (*set_cqm_txe_config)(struct wiphy *wiphy, 369384f10708SThomas Pedersen struct net_device *dev, 369484f10708SThomas Pedersen u32 rate, u32 pkts, u32 intvl); 369584f10708SThomas Pedersen 3696271733cfSJohannes Berg void (*mgmt_frame_register)(struct wiphy *wiphy, 369771bbc994SJohannes Berg struct wireless_dev *wdev, 3698271733cfSJohannes Berg u16 frame_type, bool reg); 3699afe0cbf8SBruno Randolf 3700afe0cbf8SBruno Randolf int (*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant); 3701afe0cbf8SBruno Randolf int (*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant); 37023677713bSJohn W. Linville 3703807f8a8cSLuciano Coelho int (*sched_scan_start)(struct wiphy *wiphy, 3704807f8a8cSLuciano Coelho struct net_device *dev, 3705807f8a8cSLuciano Coelho struct cfg80211_sched_scan_request *request); 37063a3ecf1dSArend Van Spriel int (*sched_scan_stop)(struct wiphy *wiphy, struct net_device *dev, 37073a3ecf1dSArend Van Spriel u64 reqid); 3708e5497d76SJohannes Berg 3709e5497d76SJohannes Berg int (*set_rekey_data)(struct wiphy *wiphy, struct net_device *dev, 3710e5497d76SJohannes Berg struct cfg80211_gtk_rekey_data *data); 3711109086ceSArik Nemtsov 3712109086ceSArik Nemtsov int (*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev, 37133b3a0162SJohannes Berg const u8 *peer, u8 action_code, u8 dialog_token, 3714df942e7bSSunil Dutt Undekari u16 status_code, u32 peer_capability, 371531fa97c5SArik Nemtsov bool initiator, const u8 *buf, size_t len); 3716109086ceSArik Nemtsov int (*tdls_oper)(struct wiphy *wiphy, struct net_device *dev, 37173b3a0162SJohannes Berg const u8 *peer, enum nl80211_tdls_operation oper); 37187f6cf311SJohannes Berg 37197f6cf311SJohannes Berg int (*probe_client)(struct wiphy *wiphy, struct net_device *dev, 37207f6cf311SJohannes Berg const u8 *peer, u64 *cookie); 3721e999882aSJohannes Berg 37221d9d9213SSimon Wunderlich int (*set_noack_map)(struct wiphy *wiphy, 37231d9d9213SSimon Wunderlich struct net_device *dev, 37241d9d9213SSimon Wunderlich u16 noack_map); 37251d9d9213SSimon Wunderlich 3726683b6d3bSJohannes Berg int (*get_channel)(struct wiphy *wiphy, 37275b7ccaf3SJohannes Berg struct wireless_dev *wdev, 3728683b6d3bSJohannes Berg struct cfg80211_chan_def *chandef); 372998104fdeSJohannes Berg 373098104fdeSJohannes Berg int (*start_p2p_device)(struct wiphy *wiphy, 373198104fdeSJohannes Berg struct wireless_dev *wdev); 373298104fdeSJohannes Berg void (*stop_p2p_device)(struct wiphy *wiphy, 373398104fdeSJohannes Berg struct wireless_dev *wdev); 373477765eafSVasanthakumar Thiagarajan 373577765eafSVasanthakumar Thiagarajan int (*set_mac_acl)(struct wiphy *wiphy, struct net_device *dev, 373677765eafSVasanthakumar Thiagarajan const struct cfg80211_acl_data *params); 373704f39047SSimon Wunderlich 373804f39047SSimon Wunderlich int (*start_radar_detection)(struct wiphy *wiphy, 373904f39047SSimon Wunderlich struct net_device *dev, 374031559f35SJanusz Dziedzic struct cfg80211_chan_def *chandef, 374131559f35SJanusz Dziedzic u32 cac_time_ms); 3742355199e0SJouni Malinen int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev, 3743355199e0SJouni Malinen struct cfg80211_update_ft_ies_params *ftie); 37445de17984SArend van Spriel int (*crit_proto_start)(struct wiphy *wiphy, 37455de17984SArend van Spriel struct wireless_dev *wdev, 37465de17984SArend van Spriel enum nl80211_crit_proto_id protocol, 37475de17984SArend van Spriel u16 duration); 37485de17984SArend van Spriel void (*crit_proto_stop)(struct wiphy *wiphy, 37495de17984SArend van Spriel struct wireless_dev *wdev); 3750be29b99aSAmitkumar Karwar int (*set_coalesce)(struct wiphy *wiphy, 3751be29b99aSAmitkumar Karwar struct cfg80211_coalesce *coalesce); 375216ef1fe2SSimon Wunderlich 375316ef1fe2SSimon Wunderlich int (*channel_switch)(struct wiphy *wiphy, 375416ef1fe2SSimon Wunderlich struct net_device *dev, 375516ef1fe2SSimon Wunderlich struct cfg80211_csa_settings *params); 3756e16821bcSJouni Malinen 3757fa9ffc74SKyeyoon Park int (*set_qos_map)(struct wiphy *wiphy, 3758fa9ffc74SKyeyoon Park struct net_device *dev, 3759fa9ffc74SKyeyoon Park struct cfg80211_qos_map *qos_map); 3760e16821bcSJouni Malinen 3761e16821bcSJouni Malinen int (*set_ap_chanwidth)(struct wiphy *wiphy, struct net_device *dev, 3762e16821bcSJouni Malinen struct cfg80211_chan_def *chandef); 3763960d01acSJohannes Berg 3764960d01acSJohannes Berg int (*add_tx_ts)(struct wiphy *wiphy, struct net_device *dev, 3765960d01acSJohannes Berg u8 tsid, const u8 *peer, u8 user_prio, 3766960d01acSJohannes Berg u16 admitted_time); 3767960d01acSJohannes Berg int (*del_tx_ts)(struct wiphy *wiphy, struct net_device *dev, 3768960d01acSJohannes Berg u8 tsid, const u8 *peer); 37691057d35eSArik Nemtsov 37701057d35eSArik Nemtsov int (*tdls_channel_switch)(struct wiphy *wiphy, 37711057d35eSArik Nemtsov struct net_device *dev, 37721057d35eSArik Nemtsov const u8 *addr, u8 oper_class, 37731057d35eSArik Nemtsov struct cfg80211_chan_def *chandef); 37741057d35eSArik Nemtsov void (*tdls_cancel_channel_switch)(struct wiphy *wiphy, 37751057d35eSArik Nemtsov struct net_device *dev, 37761057d35eSArik Nemtsov const u8 *addr); 3777cb3b7d87SAyala Beker int (*start_nan)(struct wiphy *wiphy, struct wireless_dev *wdev, 3778cb3b7d87SAyala Beker struct cfg80211_nan_conf *conf); 3779cb3b7d87SAyala Beker void (*stop_nan)(struct wiphy *wiphy, struct wireless_dev *wdev); 3780a442b761SAyala Beker int (*add_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev, 3781a442b761SAyala Beker struct cfg80211_nan_func *nan_func); 3782a442b761SAyala Beker void (*del_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev, 3783a442b761SAyala Beker u64 cookie); 3784a5a9dcf2SAyala Beker int (*nan_change_conf)(struct wiphy *wiphy, 3785a5a9dcf2SAyala Beker struct wireless_dev *wdev, 3786a5a9dcf2SAyala Beker struct cfg80211_nan_conf *conf, 3787a5a9dcf2SAyala Beker u32 changes); 3788ce0ce13aSMichael Braun 3789ce0ce13aSMichael Braun int (*set_multicast_to_unicast)(struct wiphy *wiphy, 3790ce0ce13aSMichael Braun struct net_device *dev, 3791ce0ce13aSMichael Braun const bool enabled); 37923a00df57SAvraham Stern 379352539ca8SToke Høiland-Jørgensen int (*get_txq_stats)(struct wiphy *wiphy, 379452539ca8SToke Høiland-Jørgensen struct wireless_dev *wdev, 379552539ca8SToke Høiland-Jørgensen struct cfg80211_txq_stats *txqstats); 379652539ca8SToke Høiland-Jørgensen 37973a00df57SAvraham Stern int (*set_pmk)(struct wiphy *wiphy, struct net_device *dev, 37983a00df57SAvraham Stern const struct cfg80211_pmk_conf *conf); 37993a00df57SAvraham Stern int (*del_pmk)(struct wiphy *wiphy, struct net_device *dev, 38003a00df57SAvraham Stern const u8 *aa); 380140cbfa90SSrinivas Dasari int (*external_auth)(struct wiphy *wiphy, struct net_device *dev, 380240cbfa90SSrinivas Dasari struct cfg80211_external_auth_params *params); 38032576a9acSDenis Kenzior 38042576a9acSDenis Kenzior int (*tx_control_port)(struct wiphy *wiphy, 38052576a9acSDenis Kenzior struct net_device *dev, 38062576a9acSDenis Kenzior const u8 *buf, size_t len, 38072576a9acSDenis Kenzior const u8 *dest, const __be16 proto, 38082576a9acSDenis Kenzior const bool noencrypt); 380981e54d08SPradeep Kumar Chitrapu 381081e54d08SPradeep Kumar Chitrapu int (*get_ftm_responder_stats)(struct wiphy *wiphy, 381181e54d08SPradeep Kumar Chitrapu struct net_device *dev, 381281e54d08SPradeep Kumar Chitrapu struct cfg80211_ftm_responder_stats *ftm_stats); 38139bb7e0f2SJohannes Berg 38149bb7e0f2SJohannes Berg int (*start_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev, 38159bb7e0f2SJohannes Berg struct cfg80211_pmsr_request *request); 38169bb7e0f2SJohannes Berg void (*abort_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev, 38179bb7e0f2SJohannes Berg struct cfg80211_pmsr_request *request); 3818cb74e977SSunil Dutt int (*update_owe_info)(struct wiphy *wiphy, struct net_device *dev, 3819cb74e977SSunil Dutt struct cfg80211_update_owe_info *owe_info); 38205ab92e7fSRajkumar Manoharan int (*probe_mesh_link)(struct wiphy *wiphy, struct net_device *dev, 38215ab92e7fSRajkumar Manoharan const u8 *buf, size_t len); 3822704232c2SJohannes Berg }; 3823704232c2SJohannes Berg 3824d3236553SJohannes Berg /* 3825d3236553SJohannes Berg * wireless hardware and networking interfaces structures 3826d3236553SJohannes Berg * and registration/helper functions 3827d3236553SJohannes Berg */ 3828d3236553SJohannes Berg 3829d3236553SJohannes Berg /** 38305be83de5SJohannes Berg * enum wiphy_flags - wiphy capability flags 38315be83de5SJohannes Berg * 38325be83de5SJohannes Berg * @WIPHY_FLAG_NETNS_OK: if not set, do not allow changing the netns of this 38335be83de5SJohannes Berg * wiphy at all 38345be83de5SJohannes Berg * @WIPHY_FLAG_PS_ON_BY_DEFAULT: if set to true, powersave will be enabled 38355be83de5SJohannes Berg * by default -- this flag will be set depending on the kernel's default 38365be83de5SJohannes Berg * on wiphy_new(), but can be changed by the driver if it has a good 38375be83de5SJohannes Berg * reason to override the default 38389bc383deSJohannes Berg * @WIPHY_FLAG_4ADDR_AP: supports 4addr mode even on AP (with a single station 38399bc383deSJohannes Berg * on a VLAN interface) 38409bc383deSJohannes Berg * @WIPHY_FLAG_4ADDR_STATION: supports 4addr mode even as a station 3841c0692b8fSJohannes Berg * @WIPHY_FLAG_CONTROL_PORT_PROTOCOL: This device supports setting the 3842c0692b8fSJohannes Berg * control port protocol ethertype. The device also honours the 3843c0692b8fSJohannes Berg * control_port_no_encrypt flag. 3844e31b8213SJohannes Berg * @WIPHY_FLAG_IBSS_RSN: The device supports IBSS RSN. 384515d5dda6SJavier Cardona * @WIPHY_FLAG_MESH_AUTH: The device supports mesh authentication by routing 384615d5dda6SJavier Cardona * auth frames to userspace. See @NL80211_MESH_SETUP_USERSPACE_AUTH. 3847f4b34b55SVivek Natarajan * @WIPHY_FLAG_SUPPORTS_FW_ROAM: The device supports roaming feature in the 3848f4b34b55SVivek Natarajan * firmware. 3849cedb5412SEliad Peller * @WIPHY_FLAG_AP_UAPSD: The device supports uapsd on AP. 3850109086ceSArik Nemtsov * @WIPHY_FLAG_SUPPORTS_TDLS: The device supports TDLS (802.11z) operation. 3851109086ceSArik Nemtsov * @WIPHY_FLAG_TDLS_EXTERNAL_SETUP: The device does not handle TDLS (802.11z) 3852109086ceSArik Nemtsov * link setup/discovery operations internally. Setup, discovery and 3853109086ceSArik Nemtsov * teardown packets should be sent through the @NL80211_CMD_TDLS_MGMT 3854109086ceSArik Nemtsov * command. When this flag is not set, @NL80211_CMD_TDLS_OPER should be 3855109086ceSArik Nemtsov * used for asking the driver/firmware to perform a TDLS operation. 3856562a7480SJohannes Berg * @WIPHY_FLAG_HAVE_AP_SME: device integrates AP SME 38575e760230SJohannes Berg * @WIPHY_FLAG_REPORTS_OBSS: the device will report beacons from other BSSes 38585e760230SJohannes Berg * when there are virtual interfaces in AP mode by calling 38595e760230SJohannes Berg * cfg80211_report_obss_beacon(). 386087bbbe22SArik Nemtsov * @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD: When operating as an AP, the device 386187bbbe22SArik Nemtsov * responds to probe-requests in hardware. 38627c4ef712SJohannes Berg * @WIPHY_FLAG_OFFCHAN_TX: Device supports direct off-channel TX. 38637c4ef712SJohannes Berg * @WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL: Device supports remain-on-channel call. 38642f301ab2SSimon Wunderlich * @WIPHY_FLAG_SUPPORTS_5_10_MHZ: Device supports 5 MHz and 10 MHz channels. 386516ef1fe2SSimon Wunderlich * @WIPHY_FLAG_HAS_CHANNEL_SWITCH: Device supports channel switch in 386616ef1fe2SSimon Wunderlich * beaconing mode (AP, IBSS, Mesh, ...). 3867b8676221SDavid Spinadel * @WIPHY_FLAG_HAS_STATIC_WEP: The device supports static WEP key installation 3868b8676221SDavid Spinadel * before connection. 38695be83de5SJohannes Berg */ 38705be83de5SJohannes Berg enum wiphy_flags { 3871723e73acSJohannes Berg /* use hole at 0 */ 3872a2f73b6cSLuis R. Rodriguez /* use hole at 1 */ 3873a2f73b6cSLuis R. Rodriguez /* use hole at 2 */ 38745be83de5SJohannes Berg WIPHY_FLAG_NETNS_OK = BIT(3), 38755be83de5SJohannes Berg WIPHY_FLAG_PS_ON_BY_DEFAULT = BIT(4), 38769bc383deSJohannes Berg WIPHY_FLAG_4ADDR_AP = BIT(5), 38779bc383deSJohannes Berg WIPHY_FLAG_4ADDR_STATION = BIT(6), 3878c0692b8fSJohannes Berg WIPHY_FLAG_CONTROL_PORT_PROTOCOL = BIT(7), 3879309075cfSJussi Kivilinna WIPHY_FLAG_IBSS_RSN = BIT(8), 388015d5dda6SJavier Cardona WIPHY_FLAG_MESH_AUTH = BIT(10), 3881ca986ad9SArend Van Spriel /* use hole at 11 */ 38828e8b41f9SJohannes Berg /* use hole at 12 */ 3883f4b34b55SVivek Natarajan WIPHY_FLAG_SUPPORTS_FW_ROAM = BIT(13), 3884cedb5412SEliad Peller WIPHY_FLAG_AP_UAPSD = BIT(14), 3885109086ceSArik Nemtsov WIPHY_FLAG_SUPPORTS_TDLS = BIT(15), 3886109086ceSArik Nemtsov WIPHY_FLAG_TDLS_EXTERNAL_SETUP = BIT(16), 3887562a7480SJohannes Berg WIPHY_FLAG_HAVE_AP_SME = BIT(17), 38885e760230SJohannes Berg WIPHY_FLAG_REPORTS_OBSS = BIT(18), 388987bbbe22SArik Nemtsov WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD = BIT(19), 38907c4ef712SJohannes Berg WIPHY_FLAG_OFFCHAN_TX = BIT(20), 38917c4ef712SJohannes Berg WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL = BIT(21), 38922f301ab2SSimon Wunderlich WIPHY_FLAG_SUPPORTS_5_10_MHZ = BIT(22), 389316ef1fe2SSimon Wunderlich WIPHY_FLAG_HAS_CHANNEL_SWITCH = BIT(23), 3894b8676221SDavid Spinadel WIPHY_FLAG_HAS_STATIC_WEP = BIT(24), 38957527a782SJohannes Berg }; 38967527a782SJohannes Berg 38977527a782SJohannes Berg /** 38987527a782SJohannes Berg * struct ieee80211_iface_limit - limit on certain interface types 38997527a782SJohannes Berg * @max: maximum number of interfaces of these types 39007527a782SJohannes Berg * @types: interface types (bits) 39017527a782SJohannes Berg */ 39027527a782SJohannes Berg struct ieee80211_iface_limit { 39037527a782SJohannes Berg u16 max; 39047527a782SJohannes Berg u16 types; 39057527a782SJohannes Berg }; 39067527a782SJohannes Berg 39077527a782SJohannes Berg /** 39087527a782SJohannes Berg * struct ieee80211_iface_combination - possible interface combination 39097527a782SJohannes Berg * 3910b80edbc1SLuciano Coelho * With this structure the driver can describe which interface 3911b80edbc1SLuciano Coelho * combinations it supports concurrently. 39127527a782SJohannes Berg * 3913b80edbc1SLuciano Coelho * Examples: 3914b80edbc1SLuciano Coelho * 3915b80edbc1SLuciano Coelho * 1. Allow #STA <= 1, #AP <= 1, matching BI, channels = 1, 2 total: 39167527a782SJohannes Berg * 3917819bf593SJohannes Berg * .. code-block:: c 3918819bf593SJohannes Berg * 39197527a782SJohannes Berg * struct ieee80211_iface_limit limits1[] = { 39207527a782SJohannes Berg * { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), }, 39217527a782SJohannes Berg * { .max = 1, .types = BIT(NL80211_IFTYPE_AP}, }, 39227527a782SJohannes Berg * }; 39237527a782SJohannes Berg * struct ieee80211_iface_combination combination1 = { 39247527a782SJohannes Berg * .limits = limits1, 39257527a782SJohannes Berg * .n_limits = ARRAY_SIZE(limits1), 39267527a782SJohannes Berg * .max_interfaces = 2, 39277527a782SJohannes Berg * .beacon_int_infra_match = true, 39287527a782SJohannes Berg * }; 39297527a782SJohannes Berg * 39307527a782SJohannes Berg * 3931b80edbc1SLuciano Coelho * 2. Allow #{AP, P2P-GO} <= 8, channels = 1, 8 total: 39327527a782SJohannes Berg * 3933819bf593SJohannes Berg * .. code-block:: c 3934819bf593SJohannes Berg * 39357527a782SJohannes Berg * struct ieee80211_iface_limit limits2[] = { 39367527a782SJohannes Berg * { .max = 8, .types = BIT(NL80211_IFTYPE_AP) | 39377527a782SJohannes Berg * BIT(NL80211_IFTYPE_P2P_GO), }, 39387527a782SJohannes Berg * }; 39397527a782SJohannes Berg * struct ieee80211_iface_combination combination2 = { 39407527a782SJohannes Berg * .limits = limits2, 39417527a782SJohannes Berg * .n_limits = ARRAY_SIZE(limits2), 39427527a782SJohannes Berg * .max_interfaces = 8, 39437527a782SJohannes Berg * .num_different_channels = 1, 39447527a782SJohannes Berg * }; 39457527a782SJohannes Berg * 39467527a782SJohannes Berg * 3947b80edbc1SLuciano Coelho * 3. Allow #STA <= 1, #{P2P-client,P2P-GO} <= 3 on two channels, 4 total. 3948b80edbc1SLuciano Coelho * 39497527a782SJohannes Berg * This allows for an infrastructure connection and three P2P connections. 39507527a782SJohannes Berg * 3951819bf593SJohannes Berg * .. code-block:: c 3952819bf593SJohannes Berg * 39537527a782SJohannes Berg * struct ieee80211_iface_limit limits3[] = { 39547527a782SJohannes Berg * { .max = 1, .types = BIT(NL80211_IFTYPE_STATION), }, 39557527a782SJohannes Berg * { .max = 3, .types = BIT(NL80211_IFTYPE_P2P_GO) | 39567527a782SJohannes Berg * BIT(NL80211_IFTYPE_P2P_CLIENT), }, 39577527a782SJohannes Berg * }; 39587527a782SJohannes Berg * struct ieee80211_iface_combination combination3 = { 39597527a782SJohannes Berg * .limits = limits3, 39607527a782SJohannes Berg * .n_limits = ARRAY_SIZE(limits3), 39617527a782SJohannes Berg * .max_interfaces = 4, 39627527a782SJohannes Berg * .num_different_channels = 2, 39637527a782SJohannes Berg * }; 3964819bf593SJohannes Berg * 39657527a782SJohannes Berg */ 39667527a782SJohannes Berg struct ieee80211_iface_combination { 3967c6c94aeaSJohannes Berg /** 3968c6c94aeaSJohannes Berg * @limits: 3969c6c94aeaSJohannes Berg * limits for the given interface types 3970c6c94aeaSJohannes Berg */ 39717527a782SJohannes Berg const struct ieee80211_iface_limit *limits; 3972c6c94aeaSJohannes Berg 3973c6c94aeaSJohannes Berg /** 3974c6c94aeaSJohannes Berg * @num_different_channels: 3975c6c94aeaSJohannes Berg * can use up to this many different channels 3976c6c94aeaSJohannes Berg */ 39777527a782SJohannes Berg u32 num_different_channels; 3978c6c94aeaSJohannes Berg 3979c6c94aeaSJohannes Berg /** 3980c6c94aeaSJohannes Berg * @max_interfaces: 3981c6c94aeaSJohannes Berg * maximum number of interfaces in total allowed in this group 3982c6c94aeaSJohannes Berg */ 39837527a782SJohannes Berg u16 max_interfaces; 3984c6c94aeaSJohannes Berg 3985c6c94aeaSJohannes Berg /** 3986c6c94aeaSJohannes Berg * @n_limits: 3987c6c94aeaSJohannes Berg * number of limitations 3988c6c94aeaSJohannes Berg */ 39897527a782SJohannes Berg u8 n_limits; 3990c6c94aeaSJohannes Berg 3991c6c94aeaSJohannes Berg /** 3992c6c94aeaSJohannes Berg * @beacon_int_infra_match: 3993c6c94aeaSJohannes Berg * In this combination, the beacon intervals between infrastructure 3994c6c94aeaSJohannes Berg * and AP types must match. This is required only in special cases. 3995c6c94aeaSJohannes Berg */ 39967527a782SJohannes Berg bool beacon_int_infra_match; 3997c6c94aeaSJohannes Berg 3998c6c94aeaSJohannes Berg /** 3999c6c94aeaSJohannes Berg * @radar_detect_widths: 4000c6c94aeaSJohannes Berg * bitmap of channel widths supported for radar detection 4001c6c94aeaSJohannes Berg */ 400211c4a075SSimon Wunderlich u8 radar_detect_widths; 4003c6c94aeaSJohannes Berg 4004c6c94aeaSJohannes Berg /** 4005c6c94aeaSJohannes Berg * @radar_detect_regions: 4006c6c94aeaSJohannes Berg * bitmap of regions supported for radar detection 4007c6c94aeaSJohannes Berg */ 40088c48b50aSFelix Fietkau u8 radar_detect_regions; 4009c6c94aeaSJohannes Berg 4010c6c94aeaSJohannes Berg /** 4011c6c94aeaSJohannes Berg * @beacon_int_min_gcd: 4012c6c94aeaSJohannes Berg * This interface combination supports different beacon intervals. 4013c6c94aeaSJohannes Berg * 4014c6c94aeaSJohannes Berg * = 0 4015c6c94aeaSJohannes Berg * all beacon intervals for different interface must be same. 4016c6c94aeaSJohannes Berg * > 0 4017c6c94aeaSJohannes Berg * any beacon interval for the interface part of this combination AND 4018c6c94aeaSJohannes Berg * GCD of all beacon intervals from beaconing interfaces of this 4019c6c94aeaSJohannes Berg * combination must be greater or equal to this value. 4020c6c94aeaSJohannes Berg */ 40210c317a02SPurushottam Kushwaha u32 beacon_int_min_gcd; 40225be83de5SJohannes Berg }; 40235be83de5SJohannes Berg 40242e161f78SJohannes Berg struct ieee80211_txrx_stypes { 40252e161f78SJohannes Berg u16 tx, rx; 40262e161f78SJohannes Berg }; 40272e161f78SJohannes Berg 40285be83de5SJohannes Berg /** 4029ff1b6e69SJohannes Berg * enum wiphy_wowlan_support_flags - WoWLAN support flags 4030ff1b6e69SJohannes Berg * @WIPHY_WOWLAN_ANY: supports wakeup for the special "any" 4031ff1b6e69SJohannes Berg * trigger that keeps the device operating as-is and 4032ff1b6e69SJohannes Berg * wakes up the host on any activity, for example a 4033ff1b6e69SJohannes Berg * received packet that passed filtering; note that the 4034ff1b6e69SJohannes Berg * packet should be preserved in that case 4035ff1b6e69SJohannes Berg * @WIPHY_WOWLAN_MAGIC_PKT: supports wakeup on magic packet 4036ff1b6e69SJohannes Berg * (see nl80211.h) 4037ff1b6e69SJohannes Berg * @WIPHY_WOWLAN_DISCONNECT: supports wakeup on disconnect 403877dbbb13SJohannes Berg * @WIPHY_WOWLAN_SUPPORTS_GTK_REKEY: supports GTK rekeying while asleep 403977dbbb13SJohannes Berg * @WIPHY_WOWLAN_GTK_REKEY_FAILURE: supports wakeup on GTK rekey failure 404077dbbb13SJohannes Berg * @WIPHY_WOWLAN_EAP_IDENTITY_REQ: supports wakeup on EAP identity request 404177dbbb13SJohannes Berg * @WIPHY_WOWLAN_4WAY_HANDSHAKE: supports wakeup on 4-way handshake failure 404277dbbb13SJohannes Berg * @WIPHY_WOWLAN_RFKILL_RELEASE: supports wakeup on RF-kill release 40438cd4d456SLuciano Coelho * @WIPHY_WOWLAN_NET_DETECT: supports wakeup on network detection 4044ff1b6e69SJohannes Berg */ 4045ff1b6e69SJohannes Berg enum wiphy_wowlan_support_flags { 4046ff1b6e69SJohannes Berg WIPHY_WOWLAN_ANY = BIT(0), 4047ff1b6e69SJohannes Berg WIPHY_WOWLAN_MAGIC_PKT = BIT(1), 4048ff1b6e69SJohannes Berg WIPHY_WOWLAN_DISCONNECT = BIT(2), 404977dbbb13SJohannes Berg WIPHY_WOWLAN_SUPPORTS_GTK_REKEY = BIT(3), 405077dbbb13SJohannes Berg WIPHY_WOWLAN_GTK_REKEY_FAILURE = BIT(4), 405177dbbb13SJohannes Berg WIPHY_WOWLAN_EAP_IDENTITY_REQ = BIT(5), 405277dbbb13SJohannes Berg WIPHY_WOWLAN_4WAY_HANDSHAKE = BIT(6), 405377dbbb13SJohannes Berg WIPHY_WOWLAN_RFKILL_RELEASE = BIT(7), 40548cd4d456SLuciano Coelho WIPHY_WOWLAN_NET_DETECT = BIT(8), 4055ff1b6e69SJohannes Berg }; 4056ff1b6e69SJohannes Berg 40572a0e047eSJohannes Berg struct wiphy_wowlan_tcp_support { 40582a0e047eSJohannes Berg const struct nl80211_wowlan_tcp_data_token_feature *tok; 40592a0e047eSJohannes Berg u32 data_payload_max; 40602a0e047eSJohannes Berg u32 data_interval_max; 40612a0e047eSJohannes Berg u32 wake_payload_max; 40622a0e047eSJohannes Berg bool seq; 40632a0e047eSJohannes Berg }; 40642a0e047eSJohannes Berg 4065ff1b6e69SJohannes Berg /** 4066ff1b6e69SJohannes Berg * struct wiphy_wowlan_support - WoWLAN support data 4067ff1b6e69SJohannes Berg * @flags: see &enum wiphy_wowlan_support_flags 4068ff1b6e69SJohannes Berg * @n_patterns: number of supported wakeup patterns 4069ff1b6e69SJohannes Berg * (see nl80211.h for the pattern definition) 4070ff1b6e69SJohannes Berg * @pattern_max_len: maximum length of each pattern 4071ff1b6e69SJohannes Berg * @pattern_min_len: minimum length of each pattern 4072bb92d199SAmitkumar Karwar * @max_pkt_offset: maximum Rx packet offset 40738cd4d456SLuciano Coelho * @max_nd_match_sets: maximum number of matchsets for net-detect, 40748cd4d456SLuciano Coelho * similar, but not necessarily identical, to max_match_sets for 40758cd4d456SLuciano Coelho * scheduled scans. 40768cd4d456SLuciano Coelho * See &struct cfg80211_sched_scan_request.@match_sets for more 40778cd4d456SLuciano Coelho * details. 40782a0e047eSJohannes Berg * @tcp: TCP wakeup support information 4079ff1b6e69SJohannes Berg */ 4080ff1b6e69SJohannes Berg struct wiphy_wowlan_support { 4081ff1b6e69SJohannes Berg u32 flags; 4082ff1b6e69SJohannes Berg int n_patterns; 4083ff1b6e69SJohannes Berg int pattern_max_len; 4084ff1b6e69SJohannes Berg int pattern_min_len; 4085bb92d199SAmitkumar Karwar int max_pkt_offset; 40868cd4d456SLuciano Coelho int max_nd_match_sets; 40872a0e047eSJohannes Berg const struct wiphy_wowlan_tcp_support *tcp; 4088ff1b6e69SJohannes Berg }; 4089ff1b6e69SJohannes Berg 4090ff1b6e69SJohannes Berg /** 4091be29b99aSAmitkumar Karwar * struct wiphy_coalesce_support - coalesce support data 4092be29b99aSAmitkumar Karwar * @n_rules: maximum number of coalesce rules 4093be29b99aSAmitkumar Karwar * @max_delay: maximum supported coalescing delay in msecs 4094be29b99aSAmitkumar Karwar * @n_patterns: number of supported patterns in a rule 4095be29b99aSAmitkumar Karwar * (see nl80211.h for the pattern definition) 4096be29b99aSAmitkumar Karwar * @pattern_max_len: maximum length of each pattern 4097be29b99aSAmitkumar Karwar * @pattern_min_len: minimum length of each pattern 4098be29b99aSAmitkumar Karwar * @max_pkt_offset: maximum Rx packet offset 4099be29b99aSAmitkumar Karwar */ 4100be29b99aSAmitkumar Karwar struct wiphy_coalesce_support { 4101be29b99aSAmitkumar Karwar int n_rules; 4102be29b99aSAmitkumar Karwar int max_delay; 4103be29b99aSAmitkumar Karwar int n_patterns; 4104be29b99aSAmitkumar Karwar int pattern_max_len; 4105be29b99aSAmitkumar Karwar int pattern_min_len; 4106be29b99aSAmitkumar Karwar int max_pkt_offset; 4107be29b99aSAmitkumar Karwar }; 4108be29b99aSAmitkumar Karwar 4109be29b99aSAmitkumar Karwar /** 4110ad7e718cSJohannes Berg * enum wiphy_vendor_command_flags - validation flags for vendor commands 4111ad7e718cSJohannes Berg * @WIPHY_VENDOR_CMD_NEED_WDEV: vendor command requires wdev 4112ad7e718cSJohannes Berg * @WIPHY_VENDOR_CMD_NEED_NETDEV: vendor command requires netdev 4113ad7e718cSJohannes Berg * @WIPHY_VENDOR_CMD_NEED_RUNNING: interface/wdev must be up & running 4114ad7e718cSJohannes Berg * (must be combined with %_WDEV or %_NETDEV) 4115ad7e718cSJohannes Berg */ 4116ad7e718cSJohannes Berg enum wiphy_vendor_command_flags { 4117ad7e718cSJohannes Berg WIPHY_VENDOR_CMD_NEED_WDEV = BIT(0), 4118ad7e718cSJohannes Berg WIPHY_VENDOR_CMD_NEED_NETDEV = BIT(1), 4119ad7e718cSJohannes Berg WIPHY_VENDOR_CMD_NEED_RUNNING = BIT(2), 4120ad7e718cSJohannes Berg }; 4121ad7e718cSJohannes Berg 4122ad7e718cSJohannes Berg /** 4123466b9936Stamizhr@codeaurora.org * enum wiphy_opmode_flag - Station's ht/vht operation mode information flags 4124466b9936Stamizhr@codeaurora.org * 4125466b9936Stamizhr@codeaurora.org * @STA_OPMODE_MAX_BW_CHANGED: Max Bandwidth changed 4126466b9936Stamizhr@codeaurora.org * @STA_OPMODE_SMPS_MODE_CHANGED: SMPS mode changed 4127466b9936Stamizhr@codeaurora.org * @STA_OPMODE_N_SS_CHANGED: max N_SS (number of spatial streams) changed 4128466b9936Stamizhr@codeaurora.org * 4129466b9936Stamizhr@codeaurora.org */ 4130466b9936Stamizhr@codeaurora.org enum wiphy_opmode_flag { 4131466b9936Stamizhr@codeaurora.org STA_OPMODE_MAX_BW_CHANGED = BIT(0), 4132466b9936Stamizhr@codeaurora.org STA_OPMODE_SMPS_MODE_CHANGED = BIT(1), 4133466b9936Stamizhr@codeaurora.org STA_OPMODE_N_SS_CHANGED = BIT(2), 4134466b9936Stamizhr@codeaurora.org }; 4135466b9936Stamizhr@codeaurora.org 4136466b9936Stamizhr@codeaurora.org /** 4137466b9936Stamizhr@codeaurora.org * struct sta_opmode_info - Station's ht/vht operation mode information 4138466b9936Stamizhr@codeaurora.org * @changed: contains value from &enum wiphy_opmode_flag 41395e78abd0Stamizhr@codeaurora.org * @smps_mode: New SMPS mode value from &enum nl80211_smps_mode of a station 41405e78abd0Stamizhr@codeaurora.org * @bw: new max bandwidth value from &enum nl80211_chan_width of a station 4141466b9936Stamizhr@codeaurora.org * @rx_nss: new rx_nss value of a station 4142466b9936Stamizhr@codeaurora.org */ 4143466b9936Stamizhr@codeaurora.org 4144466b9936Stamizhr@codeaurora.org struct sta_opmode_info { 4145466b9936Stamizhr@codeaurora.org u32 changed; 41465e78abd0Stamizhr@codeaurora.org enum nl80211_smps_mode smps_mode; 41475e78abd0Stamizhr@codeaurora.org enum nl80211_chan_width bw; 4148466b9936Stamizhr@codeaurora.org u8 rx_nss; 4149466b9936Stamizhr@codeaurora.org }; 4150466b9936Stamizhr@codeaurora.org 4151466b9936Stamizhr@codeaurora.org /** 4152ad7e718cSJohannes Berg * struct wiphy_vendor_command - vendor command definition 4153ad7e718cSJohannes Berg * @info: vendor command identifying information, as used in nl80211 4154ad7e718cSJohannes Berg * @flags: flags, see &enum wiphy_vendor_command_flags 4155ad7e718cSJohannes Berg * @doit: callback for the operation, note that wdev is %NULL if the 4156ad7e718cSJohannes Berg * flags didn't ask for a wdev and non-%NULL otherwise; the data 4157ad7e718cSJohannes Berg * pointer may be %NULL if userspace provided no data at all 41587bdbe400SJohannes Berg * @dumpit: dump callback, for transferring bigger/multiple items. The 41597bdbe400SJohannes Berg * @storage points to cb->args[5], ie. is preserved over the multiple 41607bdbe400SJohannes Berg * dumpit calls. 41617bdbe400SJohannes Berg * It's recommended to not have the same sub command with both @doit and 41627bdbe400SJohannes Berg * @dumpit, so that userspace can assume certain ones are get and others 41637bdbe400SJohannes Berg * are used with dump requests. 4164ad7e718cSJohannes Berg */ 4165ad7e718cSJohannes Berg struct wiphy_vendor_command { 4166ad7e718cSJohannes Berg struct nl80211_vendor_cmd_info info; 4167ad7e718cSJohannes Berg u32 flags; 4168ad7e718cSJohannes Berg int (*doit)(struct wiphy *wiphy, struct wireless_dev *wdev, 4169ad7e718cSJohannes Berg const void *data, int data_len); 41707bdbe400SJohannes Berg int (*dumpit)(struct wiphy *wiphy, struct wireless_dev *wdev, 41717bdbe400SJohannes Berg struct sk_buff *skb, const void *data, int data_len, 41727bdbe400SJohannes Berg unsigned long *storage); 4173ad7e718cSJohannes Berg }; 4174ad7e718cSJohannes Berg 4175ad7e718cSJohannes Berg /** 4176019ae3a9SKanchanapally, Vidyullatha * struct wiphy_iftype_ext_capab - extended capabilities per interface type 4177019ae3a9SKanchanapally, Vidyullatha * @iftype: interface type 4178019ae3a9SKanchanapally, Vidyullatha * @extended_capabilities: extended capabilities supported by the driver, 4179019ae3a9SKanchanapally, Vidyullatha * additional capabilities might be supported by userspace; these are the 4180019ae3a9SKanchanapally, Vidyullatha * 802.11 extended capabilities ("Extended Capabilities element") and are 4181019ae3a9SKanchanapally, Vidyullatha * in the same format as in the information element. See IEEE Std 4182019ae3a9SKanchanapally, Vidyullatha * 802.11-2012 8.4.2.29 for the defined fields. 4183019ae3a9SKanchanapally, Vidyullatha * @extended_capabilities_mask: mask of the valid values 4184019ae3a9SKanchanapally, Vidyullatha * @extended_capabilities_len: length of the extended capabilities 4185019ae3a9SKanchanapally, Vidyullatha */ 4186019ae3a9SKanchanapally, Vidyullatha struct wiphy_iftype_ext_capab { 4187019ae3a9SKanchanapally, Vidyullatha enum nl80211_iftype iftype; 4188019ae3a9SKanchanapally, Vidyullatha const u8 *extended_capabilities; 4189019ae3a9SKanchanapally, Vidyullatha const u8 *extended_capabilities_mask; 4190019ae3a9SKanchanapally, Vidyullatha u8 extended_capabilities_len; 4191019ae3a9SKanchanapally, Vidyullatha }; 4192019ae3a9SKanchanapally, Vidyullatha 4193019ae3a9SKanchanapally, Vidyullatha /** 41949bb7e0f2SJohannes Berg * struct cfg80211_pmsr_capabilities - cfg80211 peer measurement capabilities 41959bb7e0f2SJohannes Berg * @max_peers: maximum number of peers in a single measurement 41969bb7e0f2SJohannes Berg * @report_ap_tsf: can report assoc AP's TSF for radio resource measurement 41979bb7e0f2SJohannes Berg * @randomize_mac_addr: can randomize MAC address for measurement 41989bb7e0f2SJohannes Berg * @ftm.supported: FTM measurement is supported 41999bb7e0f2SJohannes Berg * @ftm.asap: ASAP-mode is supported 42009bb7e0f2SJohannes Berg * @ftm.non_asap: non-ASAP-mode is supported 42019bb7e0f2SJohannes Berg * @ftm.request_lci: can request LCI data 42029bb7e0f2SJohannes Berg * @ftm.request_civicloc: can request civic location data 42039bb7e0f2SJohannes Berg * @ftm.preambles: bitmap of preambles supported (&enum nl80211_preamble) 42049bb7e0f2SJohannes Berg * @ftm.bandwidths: bitmap of bandwidths supported (&enum nl80211_chan_width) 42059bb7e0f2SJohannes Berg * @ftm.max_bursts_exponent: maximum burst exponent supported 42069bb7e0f2SJohannes Berg * (set to -1 if not limited; note that setting this will necessarily 42079bb7e0f2SJohannes Berg * forbid using the value 15 to let the responder pick) 42089bb7e0f2SJohannes Berg * @ftm.max_ftms_per_burst: maximum FTMs per burst supported (set to 0 if 42099bb7e0f2SJohannes Berg * not limited) 42109bb7e0f2SJohannes Berg */ 42119bb7e0f2SJohannes Berg struct cfg80211_pmsr_capabilities { 42129bb7e0f2SJohannes Berg unsigned int max_peers; 42139bb7e0f2SJohannes Berg u8 report_ap_tsf:1, 42149bb7e0f2SJohannes Berg randomize_mac_addr:1; 42159bb7e0f2SJohannes Berg 42169bb7e0f2SJohannes Berg struct { 42179bb7e0f2SJohannes Berg u32 preambles; 42189bb7e0f2SJohannes Berg u32 bandwidths; 42199bb7e0f2SJohannes Berg s8 max_bursts_exponent; 42209bb7e0f2SJohannes Berg u8 max_ftms_per_burst; 42219bb7e0f2SJohannes Berg u8 supported:1, 42229bb7e0f2SJohannes Berg asap:1, 42239bb7e0f2SJohannes Berg non_asap:1, 42249bb7e0f2SJohannes Berg request_lci:1, 42259bb7e0f2SJohannes Berg request_civicloc:1; 42269bb7e0f2SJohannes Berg } ftm; 42279bb7e0f2SJohannes Berg }; 42289bb7e0f2SJohannes Berg 42299bb7e0f2SJohannes Berg /** 42305be83de5SJohannes Berg * struct wiphy - wireless hardware description 42312784fe91SLuis R. Rodriguez * @reg_notifier: the driver's regulatory notification callback, 42322784fe91SLuis R. Rodriguez * note that if your driver uses wiphy_apply_custom_regulatory() 42332784fe91SLuis R. Rodriguez * the reg_notifier's request can be passed as NULL 4234d3236553SJohannes Berg * @regd: the driver's regulatory domain, if one was requested via 4235d3236553SJohannes Berg * the regulatory_hint() API. This can be used by the driver 4236d3236553SJohannes Berg * on the reg_notifier() if it chooses to ignore future 4237d3236553SJohannes Berg * regulatory domain changes caused by other drivers. 4238d3236553SJohannes Berg * @signal_type: signal type reported in &struct cfg80211_bss. 4239d3236553SJohannes Berg * @cipher_suites: supported cipher suites 4240d3236553SJohannes Berg * @n_cipher_suites: number of supported cipher suites 4241ab4dfa20SVeerendranath Jakkam * @akm_suites: supported AKM suites 4242ab4dfa20SVeerendranath Jakkam * @n_akm_suites: number of supported AKM suites 4243b9a5f8caSJouni Malinen * @retry_short: Retry limit for short frames (dot11ShortRetryLimit) 4244b9a5f8caSJouni Malinen * @retry_long: Retry limit for long frames (dot11LongRetryLimit) 4245b9a5f8caSJouni Malinen * @frag_threshold: Fragmentation threshold (dot11FragmentationThreshold); 4246b9a5f8caSJouni Malinen * -1 = fragmentation disabled, only odd values >= 256 used 4247b9a5f8caSJouni Malinen * @rts_threshold: RTS threshold (dot11RTSThreshold); -1 = RTS/CTS disabled 4248abe37c4bSJohannes Berg * @_net: the network namespace this wiphy currently lives in 4249ef15aac6SJohannes Berg * @perm_addr: permanent MAC address of this device 4250ef15aac6SJohannes Berg * @addr_mask: If the device supports multiple MAC addresses by masking, 4251ef15aac6SJohannes Berg * set this to a mask with variable bits set to 1, e.g. if the last 42520fcf8ac5SLuciano Coelho * four bits are variable then set it to 00-00-00-00-00-0f. The actual 4253ef15aac6SJohannes Berg * variable bits shall be determined by the interfaces added, with 4254ef15aac6SJohannes Berg * interfaces not matching the mask being rejected to be brought up. 4255ef15aac6SJohannes Berg * @n_addresses: number of addresses in @addresses. 4256ef15aac6SJohannes Berg * @addresses: If the device has more than one address, set this pointer 4257ef15aac6SJohannes Berg * to a list of addresses (6 bytes each). The first one will be used 4258ef15aac6SJohannes Berg * by default for perm_addr. In this case, the mask should be set to 4259ef15aac6SJohannes Berg * all-zeroes. In this case it is assumed that the device can handle 4260ef15aac6SJohannes Berg * the same number of arbitrary MAC addresses. 4261fd235913SRandy Dunlap * @registered: protects ->resume and ->suspend sysfs callbacks against 4262fd235913SRandy Dunlap * unregister hardware 4263abe37c4bSJohannes Berg * @debugfsdir: debugfs directory used for this wiphy, will be renamed 4264abe37c4bSJohannes Berg * automatically on wiphy renames 4265abe37c4bSJohannes Berg * @dev: (virtual) struct device for this wiphy 42664a711a85SStanislaw Gruszka * @registered: helps synchronize suspend/resume with wiphy unregister 4267abe37c4bSJohannes Berg * @wext: wireless extension handlers 4268abe37c4bSJohannes Berg * @priv: driver private data (sized according to wiphy_new() parameter) 4269abe37c4bSJohannes Berg * @interface_modes: bitmask of interfaces types valid for this wiphy, 4270abe37c4bSJohannes Berg * must be set by driver 42717527a782SJohannes Berg * @iface_combinations: Valid interface combinations array, should not 42727527a782SJohannes Berg * list single interface types. 42737527a782SJohannes Berg * @n_iface_combinations: number of entries in @iface_combinations array. 42747527a782SJohannes Berg * @software_iftypes: bitmask of software interface types, these are not 42757527a782SJohannes Berg * subject to any restrictions since they are purely managed in SW. 4276abe37c4bSJohannes Berg * @flags: wiphy flags, see &enum wiphy_flags 4277a2f73b6cSLuis R. Rodriguez * @regulatory_flags: wiphy regulatory flags, see 4278a2f73b6cSLuis R. Rodriguez * &enum ieee80211_regulatory_flags 42791f074bd8SJohannes Berg * @features: features advertised to nl80211, see &enum nl80211_feature_flags. 4280d75bb06bSGautam Kumar Shukla * @ext_features: extended features advertised to nl80211, see 4281d75bb06bSGautam Kumar Shukla * &enum nl80211_ext_feature_index. 4282abe37c4bSJohannes Berg * @bss_priv_size: each BSS struct has private data allocated with it, 4283abe37c4bSJohannes Berg * this variable determines its size 4284abe37c4bSJohannes Berg * @max_scan_ssids: maximum number of SSIDs the device can scan for in 4285abe37c4bSJohannes Berg * any given scan 4286ca986ad9SArend Van Spriel * @max_sched_scan_reqs: maximum number of scheduled scan requests that 4287ca986ad9SArend Van Spriel * the device can run concurrently. 428893b6aa69SLuciano Coelho * @max_sched_scan_ssids: maximum number of SSIDs the device can scan 428993b6aa69SLuciano Coelho * for in any given scheduled scan 4290a1f1c21cSLuciano Coelho * @max_match_sets: maximum number of match sets the device can handle 4291a1f1c21cSLuciano Coelho * when performing a scheduled scan, 0 if filtering is not 4292a1f1c21cSLuciano Coelho * supported. 4293abe37c4bSJohannes Berg * @max_scan_ie_len: maximum length of user-controlled IEs device can 4294abe37c4bSJohannes Berg * add to probe request frames transmitted during a scan, must not 4295abe37c4bSJohannes Berg * include fixed IEs like supported rates 42965a865badSLuciano Coelho * @max_sched_scan_ie_len: same as max_scan_ie_len, but for scheduled 42975a865badSLuciano Coelho * scans 42983b06d277SAvraham Stern * @max_sched_scan_plans: maximum number of scan plans (scan interval and number 42993b06d277SAvraham Stern * of iterations) for scheduled scan supported by the device. 43003b06d277SAvraham Stern * @max_sched_scan_plan_interval: maximum interval (in seconds) for a 43013b06d277SAvraham Stern * single scan plan supported by the device. 43023b06d277SAvraham Stern * @max_sched_scan_plan_iterations: maximum number of iterations for a single 43033b06d277SAvraham Stern * scan plan supported by the device. 4304abe37c4bSJohannes Berg * @coverage_class: current coverage class 4305abe37c4bSJohannes Berg * @fw_version: firmware version for ethtool reporting 4306abe37c4bSJohannes Berg * @hw_version: hardware version for ethtool reporting 4307abe37c4bSJohannes Berg * @max_num_pmkids: maximum number of PMKIDs supported by device 4308abe37c4bSJohannes Berg * @privid: a pointer that drivers can use to identify if an arbitrary 4309abe37c4bSJohannes Berg * wiphy is theirs, e.g. in global notifiers 4310abe37c4bSJohannes Berg * @bands: information about bands/channels supported by this device 43112e161f78SJohannes Berg * 43122e161f78SJohannes Berg * @mgmt_stypes: bitmasks of frame subtypes that can be subscribed to or 43132e161f78SJohannes Berg * transmitted through nl80211, points to an array indexed by interface 43142e161f78SJohannes Berg * type 4315a7ffac95SBruno Randolf * 43167f531e03SBruno Randolf * @available_antennas_tx: bitmap of antennas which are available to be 43177f531e03SBruno Randolf * configured as TX antennas. Antenna configuration commands will be 43187f531e03SBruno Randolf * rejected unless this or @available_antennas_rx is set. 43197f531e03SBruno Randolf * 43207f531e03SBruno Randolf * @available_antennas_rx: bitmap of antennas which are available to be 43217f531e03SBruno Randolf * configured as RX antennas. Antenna configuration commands will be 43227f531e03SBruno Randolf * rejected unless this or @available_antennas_tx is set. 4323a293911dSJohannes Berg * 432415f0ebc2SRandy Dunlap * @probe_resp_offload: 432515f0ebc2SRandy Dunlap * Bitmap of supported protocols for probe response offloading. 432615f0ebc2SRandy Dunlap * See &enum nl80211_probe_resp_offload_support_attr. Only valid 432715f0ebc2SRandy Dunlap * when the wiphy flag @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD is set. 432815f0ebc2SRandy Dunlap * 4329a293911dSJohannes Berg * @max_remain_on_channel_duration: Maximum time a remain-on-channel operation 4330a293911dSJohannes Berg * may request, if implemented. 4331ff1b6e69SJohannes Berg * 4332ff1b6e69SJohannes Berg * @wowlan: WoWLAN support information 43336abb9cb9SJohannes Berg * @wowlan_config: current WoWLAN configuration; this should usually not be 43346abb9cb9SJohannes Berg * used since access to it is necessarily racy, use the parameter passed 43356abb9cb9SJohannes Berg * to the suspend() operation instead. 4336562a7480SJohannes Berg * 4337562a7480SJohannes Berg * @ap_sme_capa: AP SME capabilities, flags from &enum nl80211_ap_sme_features. 43387e7c8926SBen Greear * @ht_capa_mod_mask: Specify what ht_cap values can be over-ridden. 43397e7c8926SBen Greear * If null, then none can be over-ridden. 4340ee2aca34SJohannes Berg * @vht_capa_mod_mask: Specify what VHT capabilities can be over-ridden. 4341ee2aca34SJohannes Berg * If null, then none can be over-ridden. 434277765eafSVasanthakumar Thiagarajan * 434353873f13SJohannes Berg * @wdev_list: the list of associated (virtual) interfaces; this list must 434453873f13SJohannes Berg * not be modified by the driver, but can be read with RTNL/RCU protection. 434553873f13SJohannes Berg * 434677765eafSVasanthakumar Thiagarajan * @max_acl_mac_addrs: Maximum number of MAC addresses that the device 434777765eafSVasanthakumar Thiagarajan * supports for ACL. 4348a50df0c4SJohannes Berg * 4349a50df0c4SJohannes Berg * @extended_capabilities: extended capabilities supported by the driver, 4350a50df0c4SJohannes Berg * additional capabilities might be supported by userspace; these are 4351a50df0c4SJohannes Berg * the 802.11 extended capabilities ("Extended Capabilities element") 4352a50df0c4SJohannes Berg * and are in the same format as in the information element. See 4353019ae3a9SKanchanapally, Vidyullatha * 802.11-2012 8.4.2.29 for the defined fields. These are the default 4354019ae3a9SKanchanapally, Vidyullatha * extended capabilities to be used if the capabilities are not specified 4355019ae3a9SKanchanapally, Vidyullatha * for a specific interface type in iftype_ext_capab. 4356a50df0c4SJohannes Berg * @extended_capabilities_mask: mask of the valid values 4357a50df0c4SJohannes Berg * @extended_capabilities_len: length of the extended capabilities 4358019ae3a9SKanchanapally, Vidyullatha * @iftype_ext_capab: array of extended capabilities per interface type 4359019ae3a9SKanchanapally, Vidyullatha * @num_iftype_ext_capab: number of interface types for which extended 4360019ae3a9SKanchanapally, Vidyullatha * capabilities are specified separately. 4361be29b99aSAmitkumar Karwar * @coalesce: packet coalescing support information 4362ad7e718cSJohannes Berg * 4363ad7e718cSJohannes Berg * @vendor_commands: array of vendor commands supported by the hardware 4364ad7e718cSJohannes Berg * @n_vendor_commands: number of vendor commands 4365567ffc35SJohannes Berg * @vendor_events: array of vendor events supported by the hardware 4366567ffc35SJohannes Berg * @n_vendor_events: number of vendor events 4367b43504cfSJouni Malinen * 4368b43504cfSJouni Malinen * @max_ap_assoc_sta: maximum number of associated stations supported in AP mode 4369b43504cfSJouni Malinen * (including P2P GO) or 0 to indicate no such limit is advertised. The 4370b43504cfSJouni Malinen * driver is allowed to advertise a theoretical limit that it can reach in 4371b43504cfSJouni Malinen * some cases, but may not always reach. 4372c2e4323bSLuciano Coelho * 4373c2e4323bSLuciano Coelho * @max_num_csa_counters: Number of supported csa_counters in beacons 4374c2e4323bSLuciano Coelho * and probe responses. This value should be set if the driver 4375c2e4323bSLuciano Coelho * wishes to limit the number of csa counters. Default (0) means 4376c2e4323bSLuciano Coelho * infinite. 437767af9811SEmmanuel Grumbach * @max_adj_channel_rssi_comp: max offset of between the channel on which the 437867af9811SEmmanuel Grumbach * frame was sent and the channel on which the frame was heard for which 437967af9811SEmmanuel Grumbach * the reported rssi is still valid. If a driver is able to compensate the 438067af9811SEmmanuel Grumbach * low rssi when a frame is heard on different channel, then it should set 438167af9811SEmmanuel Grumbach * this variable to the maximal offset for which it can compensate. 438267af9811SEmmanuel Grumbach * This value should be set in MHz. 438338de03d2SArend van Spriel * @bss_select_support: bitmask indicating the BSS selection criteria supported 438438de03d2SArend van Spriel * by the driver in the .connect() callback. The bit position maps to the 438538de03d2SArend van Spriel * attribute indices defined in &enum nl80211_bss_select_attr. 4386a442b761SAyala Beker * 43878585989dSLuca Coelho * @nan_supported_bands: bands supported by the device in NAN mode, a 43888585989dSLuca Coelho * bitmap of &enum nl80211_band values. For instance, for 43898585989dSLuca Coelho * NL80211_BAND_2GHZ, bit 0 would be set 43908585989dSLuca Coelho * (i.e. BIT(NL80211_BAND_2GHZ)). 4391f3a7ca64SJohannes Berg * 4392f3a7ca64SJohannes Berg * @txq_limit: configuration of internal TX queue frame limit 4393f3a7ca64SJohannes Berg * @txq_memory_limit: configuration internal TX queue memory limit 4394f3a7ca64SJohannes Berg * @txq_quantum: configuration of internal TX queue scheduler quantum 43959bb7e0f2SJohannes Berg * 4396213ed579SSara Sharon * @support_mbssid: can HW support association with nontransmitted AP 4397213ed579SSara Sharon * @support_only_he_mbssid: don't parse MBSSID elements if it is not 4398213ed579SSara Sharon * HE AP, in order to avoid compatibility issues. 4399213ed579SSara Sharon * @support_mbssid must be set for this to have any effect. 4400213ed579SSara Sharon * 44019bb7e0f2SJohannes Berg * @pmsr_capa: peer measurement capabilities 4402d3236553SJohannes Berg */ 4403d3236553SJohannes Berg struct wiphy { 4404d3236553SJohannes Berg /* assign these fields before you register the wiphy */ 4405d3236553SJohannes Berg 4406ef15aac6SJohannes Berg /* permanent MAC address(es) */ 4407d3236553SJohannes Berg u8 perm_addr[ETH_ALEN]; 4408ef15aac6SJohannes Berg u8 addr_mask[ETH_ALEN]; 4409ef15aac6SJohannes Berg 4410ef15aac6SJohannes Berg struct mac_address *addresses; 4411d3236553SJohannes Berg 44122e161f78SJohannes Berg const struct ieee80211_txrx_stypes *mgmt_stypes; 44132e161f78SJohannes Berg 44147527a782SJohannes Berg const struct ieee80211_iface_combination *iface_combinations; 44157527a782SJohannes Berg int n_iface_combinations; 44167527a782SJohannes Berg u16 software_iftypes; 44177527a782SJohannes Berg 44182e161f78SJohannes Berg u16 n_addresses; 44192e161f78SJohannes Berg 4420d3236553SJohannes Berg /* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */ 4421d3236553SJohannes Berg u16 interface_modes; 4422d3236553SJohannes Berg 442377765eafSVasanthakumar Thiagarajan u16 max_acl_mac_addrs; 442477765eafSVasanthakumar Thiagarajan 4425a2f73b6cSLuis R. Rodriguez u32 flags, regulatory_flags, features; 4426d75bb06bSGautam Kumar Shukla u8 ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES, 8)]; 4427463d0183SJohannes Berg 4428562a7480SJohannes Berg u32 ap_sme_capa; 4429562a7480SJohannes Berg 4430d3236553SJohannes Berg enum cfg80211_signal_type signal_type; 4431d3236553SJohannes Berg 4432d3236553SJohannes Berg int bss_priv_size; 4433d3236553SJohannes Berg u8 max_scan_ssids; 4434ca986ad9SArend Van Spriel u8 max_sched_scan_reqs; 443593b6aa69SLuciano Coelho u8 max_sched_scan_ssids; 4436a1f1c21cSLuciano Coelho u8 max_match_sets; 4437d3236553SJohannes Berg u16 max_scan_ie_len; 44385a865badSLuciano Coelho u16 max_sched_scan_ie_len; 44393b06d277SAvraham Stern u32 max_sched_scan_plans; 44403b06d277SAvraham Stern u32 max_sched_scan_plan_interval; 44413b06d277SAvraham Stern u32 max_sched_scan_plan_iterations; 4442d3236553SJohannes Berg 4443d3236553SJohannes Berg int n_cipher_suites; 4444d3236553SJohannes Berg const u32 *cipher_suites; 4445d3236553SJohannes Berg 4446ab4dfa20SVeerendranath Jakkam int n_akm_suites; 4447ab4dfa20SVeerendranath Jakkam const u32 *akm_suites; 4448ab4dfa20SVeerendranath Jakkam 4449b9a5f8caSJouni Malinen u8 retry_short; 4450b9a5f8caSJouni Malinen u8 retry_long; 4451b9a5f8caSJouni Malinen u32 frag_threshold; 4452b9a5f8caSJouni Malinen u32 rts_threshold; 445381077e82SLukáš Turek u8 coverage_class; 4454b9a5f8caSJouni Malinen 445581135548SJiri Pirko char fw_version[ETHTOOL_FWVERS_LEN]; 4456dfce95f5SKalle Valo u32 hw_version; 4457dfce95f5SKalle Valo 4458dfb89c56SJohannes Berg #ifdef CONFIG_PM 4459964dc9e2SJohannes Berg const struct wiphy_wowlan_support *wowlan; 44606abb9cb9SJohannes Berg struct cfg80211_wowlan *wowlan_config; 4461dfb89c56SJohannes Berg #endif 4462ff1b6e69SJohannes Berg 4463a293911dSJohannes Berg u16 max_remain_on_channel_duration; 4464a293911dSJohannes Berg 446567fbb16bSSamuel Ortiz u8 max_num_pmkids; 446667fbb16bSSamuel Ortiz 44677f531e03SBruno Randolf u32 available_antennas_tx; 44687f531e03SBruno Randolf u32 available_antennas_rx; 4469a7ffac95SBruno Randolf 447087bbbe22SArik Nemtsov /* 447187bbbe22SArik Nemtsov * Bitmap of supported protocols for probe response offloading 447287bbbe22SArik Nemtsov * see &enum nl80211_probe_resp_offload_support_attr. Only valid 447387bbbe22SArik Nemtsov * when the wiphy flag @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD is set. 447487bbbe22SArik Nemtsov */ 447587bbbe22SArik Nemtsov u32 probe_resp_offload; 447687bbbe22SArik Nemtsov 4477a50df0c4SJohannes Berg const u8 *extended_capabilities, *extended_capabilities_mask; 4478a50df0c4SJohannes Berg u8 extended_capabilities_len; 4479a50df0c4SJohannes Berg 4480019ae3a9SKanchanapally, Vidyullatha const struct wiphy_iftype_ext_capab *iftype_ext_capab; 4481019ae3a9SKanchanapally, Vidyullatha unsigned int num_iftype_ext_capab; 4482019ae3a9SKanchanapally, Vidyullatha 4483d3236553SJohannes Berg /* If multiple wiphys are registered and you're handed e.g. 4484d3236553SJohannes Berg * a regular netdev with assigned ieee80211_ptr, you won't 4485d3236553SJohannes Berg * know whether it points to a wiphy your driver has registered 4486d3236553SJohannes Berg * or not. Assign this to something global to your driver to 4487d3236553SJohannes Berg * help determine whether you own this wiphy or not. */ 4488cf5aa2f1SDavid Kilroy const void *privid; 4489d3236553SJohannes Berg 449057fbcce3SJohannes Berg struct ieee80211_supported_band *bands[NUM_NL80211_BANDS]; 4491d3236553SJohannes Berg 4492d3236553SJohannes Berg /* Lets us get back the wiphy on the callback */ 44930c0280bdSLuis R. Rodriguez void (*reg_notifier)(struct wiphy *wiphy, 4494d3236553SJohannes Berg struct regulatory_request *request); 4495d3236553SJohannes Berg 4496d3236553SJohannes Berg /* fields below are read-only, assigned by cfg80211 */ 4497d3236553SJohannes Berg 4498458f4f9eSJohannes Berg const struct ieee80211_regdomain __rcu *regd; 4499d3236553SJohannes Berg 4500d3236553SJohannes Berg /* the item in /sys/class/ieee80211/ points to this, 4501d3236553SJohannes Berg * you need use set_wiphy_dev() (see below) */ 4502d3236553SJohannes Berg struct device dev; 4503d3236553SJohannes Berg 4504ecb44335SStanislaw Gruszka /* protects ->resume, ->suspend sysfs callbacks against unregister hw */ 4505ecb44335SStanislaw Gruszka bool registered; 4506ecb44335SStanislaw Gruszka 4507d3236553SJohannes Berg /* dir in debugfs: ieee80211/<wiphyname> */ 4508d3236553SJohannes Berg struct dentry *debugfsdir; 4509d3236553SJohannes Berg 45107e7c8926SBen Greear const struct ieee80211_ht_cap *ht_capa_mod_mask; 4511ee2aca34SJohannes Berg const struct ieee80211_vht_cap *vht_capa_mod_mask; 45127e7c8926SBen Greear 451353873f13SJohannes Berg struct list_head wdev_list; 451453873f13SJohannes Berg 4515463d0183SJohannes Berg /* the network namespace this phy lives in currently */ 45160c5c9fb5SEric W. Biederman possible_net_t _net; 4517463d0183SJohannes Berg 45183d23e349SJohannes Berg #ifdef CONFIG_CFG80211_WEXT 45193d23e349SJohannes Berg const struct iw_handler_def *wext; 45203d23e349SJohannes Berg #endif 45213d23e349SJohannes Berg 4522be29b99aSAmitkumar Karwar const struct wiphy_coalesce_support *coalesce; 4523be29b99aSAmitkumar Karwar 4524ad7e718cSJohannes Berg const struct wiphy_vendor_command *vendor_commands; 4525567ffc35SJohannes Berg const struct nl80211_vendor_cmd_info *vendor_events; 4526567ffc35SJohannes Berg int n_vendor_commands, n_vendor_events; 4527ad7e718cSJohannes Berg 4528b43504cfSJouni Malinen u16 max_ap_assoc_sta; 4529b43504cfSJouni Malinen 45309a774c78SAndrei Otcheretianski u8 max_num_csa_counters; 453167af9811SEmmanuel Grumbach u8 max_adj_channel_rssi_comp; 45329a774c78SAndrei Otcheretianski 453338de03d2SArend van Spriel u32 bss_select_support; 453438de03d2SArend van Spriel 45358585989dSLuca Coelho u8 nan_supported_bands; 45368585989dSLuca Coelho 453752539ca8SToke Høiland-Jørgensen u32 txq_limit; 453852539ca8SToke Høiland-Jørgensen u32 txq_memory_limit; 453952539ca8SToke Høiland-Jørgensen u32 txq_quantum; 454052539ca8SToke Høiland-Jørgensen 4541213ed579SSara Sharon u8 support_mbssid:1, 4542213ed579SSara Sharon support_only_he_mbssid:1; 4543213ed579SSara Sharon 45449bb7e0f2SJohannes Berg const struct cfg80211_pmsr_capabilities *pmsr_capa; 45459bb7e0f2SJohannes Berg 45461c06ef98SJohannes Berg char priv[0] __aligned(NETDEV_ALIGN); 4547d3236553SJohannes Berg }; 4548d3236553SJohannes Berg 4549463d0183SJohannes Berg static inline struct net *wiphy_net(struct wiphy *wiphy) 4550463d0183SJohannes Berg { 4551c2d9ba9bSEric Dumazet return read_pnet(&wiphy->_net); 4552463d0183SJohannes Berg } 4553463d0183SJohannes Berg 4554463d0183SJohannes Berg static inline void wiphy_net_set(struct wiphy *wiphy, struct net *net) 4555463d0183SJohannes Berg { 4556c2d9ba9bSEric Dumazet write_pnet(&wiphy->_net, net); 4557463d0183SJohannes Berg } 4558463d0183SJohannes Berg 4559d3236553SJohannes Berg /** 4560d3236553SJohannes Berg * wiphy_priv - return priv from wiphy 4561d3236553SJohannes Berg * 4562d3236553SJohannes Berg * @wiphy: the wiphy whose priv pointer to return 45630ae997dcSYacine Belkadi * Return: The priv of @wiphy. 4564d3236553SJohannes Berg */ 4565d3236553SJohannes Berg static inline void *wiphy_priv(struct wiphy *wiphy) 4566d3236553SJohannes Berg { 4567d3236553SJohannes Berg BUG_ON(!wiphy); 4568d3236553SJohannes Berg return &wiphy->priv; 4569d3236553SJohannes Berg } 4570d3236553SJohannes Berg 4571d3236553SJohannes Berg /** 4572f1f74825SDavid Kilroy * priv_to_wiphy - return the wiphy containing the priv 4573f1f74825SDavid Kilroy * 4574f1f74825SDavid Kilroy * @priv: a pointer previously returned by wiphy_priv 45750ae997dcSYacine Belkadi * Return: The wiphy of @priv. 4576f1f74825SDavid Kilroy */ 4577f1f74825SDavid Kilroy static inline struct wiphy *priv_to_wiphy(void *priv) 4578f1f74825SDavid Kilroy { 4579f1f74825SDavid Kilroy BUG_ON(!priv); 4580f1f74825SDavid Kilroy return container_of(priv, struct wiphy, priv); 4581f1f74825SDavid Kilroy } 4582f1f74825SDavid Kilroy 4583f1f74825SDavid Kilroy /** 4584d3236553SJohannes Berg * set_wiphy_dev - set device pointer for wiphy 4585d3236553SJohannes Berg * 4586d3236553SJohannes Berg * @wiphy: The wiphy whose device to bind 4587d3236553SJohannes Berg * @dev: The device to parent it to 4588d3236553SJohannes Berg */ 4589d3236553SJohannes Berg static inline void set_wiphy_dev(struct wiphy *wiphy, struct device *dev) 4590d3236553SJohannes Berg { 4591d3236553SJohannes Berg wiphy->dev.parent = dev; 4592d3236553SJohannes Berg } 4593d3236553SJohannes Berg 4594d3236553SJohannes Berg /** 4595d3236553SJohannes Berg * wiphy_dev - get wiphy dev pointer 4596d3236553SJohannes Berg * 4597d3236553SJohannes Berg * @wiphy: The wiphy whose device struct to look up 45980ae997dcSYacine Belkadi * Return: The dev of @wiphy. 4599d3236553SJohannes Berg */ 4600d3236553SJohannes Berg static inline struct device *wiphy_dev(struct wiphy *wiphy) 4601d3236553SJohannes Berg { 4602d3236553SJohannes Berg return wiphy->dev.parent; 4603d3236553SJohannes Berg } 4604d3236553SJohannes Berg 4605d3236553SJohannes Berg /** 4606d3236553SJohannes Berg * wiphy_name - get wiphy name 4607d3236553SJohannes Berg * 4608d3236553SJohannes Berg * @wiphy: The wiphy whose name to return 46090ae997dcSYacine Belkadi * Return: The name of @wiphy. 4610d3236553SJohannes Berg */ 4611e1db74fcSJoe Perches static inline const char *wiphy_name(const struct wiphy *wiphy) 4612d3236553SJohannes Berg { 4613d3236553SJohannes Berg return dev_name(&wiphy->dev); 4614d3236553SJohannes Berg } 4615d3236553SJohannes Berg 4616d3236553SJohannes Berg /** 46171998d90aSBen Greear * wiphy_new_nm - create a new wiphy for use with cfg80211 46181998d90aSBen Greear * 46191998d90aSBen Greear * @ops: The configuration operations for this device 46201998d90aSBen Greear * @sizeof_priv: The size of the private area to allocate 46211998d90aSBen Greear * @requested_name: Request a particular name. 46221998d90aSBen Greear * NULL is valid value, and means use the default phy%d naming. 46231998d90aSBen Greear * 46241998d90aSBen Greear * Create a new wiphy and associate the given operations with it. 46251998d90aSBen Greear * @sizeof_priv bytes are allocated for private use. 46261998d90aSBen Greear * 46271998d90aSBen Greear * Return: A pointer to the new wiphy. This pointer must be 46281998d90aSBen Greear * assigned to each netdev's ieee80211_ptr for proper operation. 46291998d90aSBen Greear */ 46301998d90aSBen Greear struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv, 46311998d90aSBen Greear const char *requested_name); 46321998d90aSBen Greear 46331998d90aSBen Greear /** 4634d3236553SJohannes Berg * wiphy_new - create a new wiphy for use with cfg80211 4635d3236553SJohannes Berg * 4636d3236553SJohannes Berg * @ops: The configuration operations for this device 4637d3236553SJohannes Berg * @sizeof_priv: The size of the private area to allocate 4638d3236553SJohannes Berg * 4639d3236553SJohannes Berg * Create a new wiphy and associate the given operations with it. 4640d3236553SJohannes Berg * @sizeof_priv bytes are allocated for private use. 4641d3236553SJohannes Berg * 46420ae997dcSYacine Belkadi * Return: A pointer to the new wiphy. This pointer must be 46430ae997dcSYacine Belkadi * assigned to each netdev's ieee80211_ptr for proper operation. 4644d3236553SJohannes Berg */ 46451998d90aSBen Greear static inline struct wiphy *wiphy_new(const struct cfg80211_ops *ops, 46461998d90aSBen Greear int sizeof_priv) 46471998d90aSBen Greear { 46481998d90aSBen Greear return wiphy_new_nm(ops, sizeof_priv, NULL); 46491998d90aSBen Greear } 4650d3236553SJohannes Berg 4651d3236553SJohannes Berg /** 4652d3236553SJohannes Berg * wiphy_register - register a wiphy with cfg80211 4653d3236553SJohannes Berg * 4654d3236553SJohannes Berg * @wiphy: The wiphy to register. 4655d3236553SJohannes Berg * 46560ae997dcSYacine Belkadi * Return: A non-negative wiphy index or a negative error code. 4657d3236553SJohannes Berg */ 465810dd9b7cSJoe Perches int wiphy_register(struct wiphy *wiphy); 4659d3236553SJohannes Berg 4660d3236553SJohannes Berg /** 4661d3236553SJohannes Berg * wiphy_unregister - deregister a wiphy from cfg80211 4662d3236553SJohannes Berg * 4663d3236553SJohannes Berg * @wiphy: The wiphy to unregister. 4664d3236553SJohannes Berg * 4665d3236553SJohannes Berg * After this call, no more requests can be made with this priv 4666d3236553SJohannes Berg * pointer, but the call may sleep to wait for an outstanding 4667d3236553SJohannes Berg * request that is being handled. 4668d3236553SJohannes Berg */ 466910dd9b7cSJoe Perches void wiphy_unregister(struct wiphy *wiphy); 4670d3236553SJohannes Berg 4671d3236553SJohannes Berg /** 4672d3236553SJohannes Berg * wiphy_free - free wiphy 4673d3236553SJohannes Berg * 4674d3236553SJohannes Berg * @wiphy: The wiphy to free 4675d3236553SJohannes Berg */ 467610dd9b7cSJoe Perches void wiphy_free(struct wiphy *wiphy); 4677d3236553SJohannes Berg 4678fffd0934SJohannes Berg /* internal structs */ 46796829c878SJohannes Berg struct cfg80211_conn; 468019957bb3SJohannes Berg struct cfg80211_internal_bss; 4681fffd0934SJohannes Berg struct cfg80211_cached_keys; 46824a4b8169SAndrew Zaborowski struct cfg80211_cqm_config; 468319957bb3SJohannes Berg 4684d3236553SJohannes Berg /** 468589a54e48SJohannes Berg * struct wireless_dev - wireless device state 4686d3236553SJohannes Berg * 468789a54e48SJohannes Berg * For netdevs, this structure must be allocated by the driver 468889a54e48SJohannes Berg * that uses the ieee80211_ptr field in struct net_device (this 468989a54e48SJohannes Berg * is intentional so it can be allocated along with the netdev.) 469089a54e48SJohannes Berg * It need not be registered then as netdev registration will 469189a54e48SJohannes Berg * be intercepted by cfg80211 to see the new wireless device. 469289a54e48SJohannes Berg * 469389a54e48SJohannes Berg * For non-netdev uses, it must also be allocated by the driver 469489a54e48SJohannes Berg * in response to the cfg80211 callbacks that require it, as 469589a54e48SJohannes Berg * there's no netdev registration in that case it may not be 469689a54e48SJohannes Berg * allocated outside of callback operations that return it. 4697d3236553SJohannes Berg * 4698d3236553SJohannes Berg * @wiphy: pointer to hardware description 4699d3236553SJohannes Berg * @iftype: interface type 4700d3236553SJohannes Berg * @list: (private) Used to collect the interfaces 470189a54e48SJohannes Berg * @netdev: (private) Used to reference back to the netdev, may be %NULL 470289a54e48SJohannes Berg * @identifier: (private) Identifier used in nl80211 to identify this 470389a54e48SJohannes Berg * wireless device if it has no netdev 4704d3236553SJohannes Berg * @current_bss: (private) Used by the internal configuration code 47059e0e2961SMichal Kazior * @chandef: (private) Used by the internal configuration code to track 47069e0e2961SMichal Kazior * the user-set channel definition. 4707780b40dfSJohannes Berg * @preset_chandef: (private) Used by the internal configuration code to 4708aa430da4SJohannes Berg * track the channel to be used for AP later 4709d3236553SJohannes Berg * @bssid: (private) Used by the internal configuration code 4710d3236553SJohannes Berg * @ssid: (private) Used by the internal configuration code 4711d3236553SJohannes Berg * @ssid_len: (private) Used by the internal configuration code 471229cbe68cSJohannes Berg * @mesh_id_len: (private) Used by the internal configuration code 471329cbe68cSJohannes Berg * @mesh_id_up_len: (private) Used by the internal configuration code 4714d3236553SJohannes Berg * @wext: (private) Used by the internal wireless extensions compat code 47159874b71fSJohannes Berg * @wext.ibss: (private) IBSS data part of wext handling 47169874b71fSJohannes Berg * @wext.connect: (private) connection handling data 47179874b71fSJohannes Berg * @wext.keys: (private) (WEP) key data 47189874b71fSJohannes Berg * @wext.ie: (private) extra elements for association 47199874b71fSJohannes Berg * @wext.ie_len: (private) length of extra elements 47209874b71fSJohannes Berg * @wext.bssid: (private) selected network BSSID 47219874b71fSJohannes Berg * @wext.ssid: (private) selected network SSID 47229874b71fSJohannes Berg * @wext.default_key: (private) selected default key index 47239874b71fSJohannes Berg * @wext.default_mgmt_key: (private) selected default management key index 47249874b71fSJohannes Berg * @wext.prev_bssid: (private) previous BSSID for reassociation 47259874b71fSJohannes Berg * @wext.prev_bssid_valid: (private) previous BSSID validity 47269bc383deSJohannes Berg * @use_4addr: indicates 4addr mode is used on this interface, must be 47279bc383deSJohannes Berg * set by driver (if supported) on add_interface BEFORE registering the 47289bc383deSJohannes Berg * netdev and may otherwise be used by driver read-only, will be update 47299bc383deSJohannes Berg * by cfg80211 on change_interface 47302e161f78SJohannes Berg * @mgmt_registrations: list of registrations for management frames 47312e161f78SJohannes Berg * @mgmt_registrations_lock: lock for the list 47328d61ffa5SJohannes Berg * @mtx: mutex used to lock data in this struct, may be used by drivers 47338d61ffa5SJohannes Berg * and some API functions require it held 473456d1893dSJohannes Berg * @beacon_interval: beacon interval used on this device for transmitting 473556d1893dSJohannes Berg * beacons, 0 when not valid 473698104fdeSJohannes Berg * @address: The address for this device, valid only if @netdev is %NULL 473773c7da3dSArend Van Spriel * @is_running: true if this is a non-netdev device that has been started, e.g. 473873c7da3dSArend Van Spriel * the P2P Device. 473904f39047SSimon Wunderlich * @cac_started: true if DFS channel availability check has been started 474004f39047SSimon Wunderlich * @cac_start_time: timestamp (jiffies) when the dfs state was entered. 474131559f35SJanusz Dziedzic * @cac_time_ms: CAC time in ms 4742780b40dfSJohannes Berg * @ps: powersave mode is enabled 4743780b40dfSJohannes Berg * @ps_timeout: dynamic powersave timeout 4744780b40dfSJohannes Berg * @ap_unexpected_nlportid: (private) netlink port ID of application 4745780b40dfSJohannes Berg * registered for unexpected class 3 frames (AP mode) 4746780b40dfSJohannes Berg * @conn: (private) cfg80211 software SME connection state machine data 4747780b40dfSJohannes Berg * @connect_keys: (private) keys to set after connection is established 474834d50519SLior David * @conn_bss_type: connecting/connected BSS type 4749bd2522b1SAndrzej Zaborowski * @conn_owner_nlportid: (private) connection owner socket port ID 4750bd2522b1SAndrzej Zaborowski * @disconnect_wk: (private) auto-disconnect work 4751bd2522b1SAndrzej Zaborowski * @disconnect_bssid: (private) the BSSID to use for auto-disconnect 4752780b40dfSJohannes Berg * @ibss_fixed: (private) IBSS is using fixed BSSID 47535336fa88SSimon Wunderlich * @ibss_dfs_possible: (private) IBSS may change to a DFS channel 4754780b40dfSJohannes Berg * @event_list: (private) list for internal event processing 4755780b40dfSJohannes Berg * @event_lock: (private) lock for event list 475678f22b6aSJohannes Berg * @owner_nlportid: (private) owner socket port ID 4757ab81007aSJohannes Berg * @nl_owner_dead: (private) owner socket went away 47584a4b8169SAndrew Zaborowski * @cqm_config: (private) nl80211 RSSI monitor state 47599bb7e0f2SJohannes Berg * @pmsr_list: (private) peer measurement requests 47609bb7e0f2SJohannes Berg * @pmsr_lock: (private) peer measurements requests/results lock 47619bb7e0f2SJohannes Berg * @pmsr_free_wk: (private) peer measurements cleanup work 4762d3236553SJohannes Berg */ 4763d3236553SJohannes Berg struct wireless_dev { 4764d3236553SJohannes Berg struct wiphy *wiphy; 4765d3236553SJohannes Berg enum nl80211_iftype iftype; 4766d3236553SJohannes Berg 4767667503ddSJohannes Berg /* the remainder of this struct should be private to cfg80211 */ 4768d3236553SJohannes Berg struct list_head list; 4769d3236553SJohannes Berg struct net_device *netdev; 4770d3236553SJohannes Berg 477189a54e48SJohannes Berg u32 identifier; 477289a54e48SJohannes Berg 47732e161f78SJohannes Berg struct list_head mgmt_registrations; 47742e161f78SJohannes Berg spinlock_t mgmt_registrations_lock; 4775026331c4SJouni Malinen 4776667503ddSJohannes Berg struct mutex mtx; 4777667503ddSJohannes Berg 477873c7da3dSArend Van Spriel bool use_4addr, is_running; 477998104fdeSJohannes Berg 478098104fdeSJohannes Berg u8 address[ETH_ALEN] __aligned(sizeof(u16)); 47819bc383deSJohannes Berg 4782b23aa676SSamuel Ortiz /* currently used for IBSS and SME - might be rearranged later */ 4783d3236553SJohannes Berg u8 ssid[IEEE80211_MAX_SSID_LEN]; 478429cbe68cSJohannes Berg u8 ssid_len, mesh_id_len, mesh_id_up_len; 47856829c878SJohannes Berg struct cfg80211_conn *conn; 4786fffd0934SJohannes Berg struct cfg80211_cached_keys *connect_keys; 478734d50519SLior David enum ieee80211_bss_type conn_bss_type; 4788bd2522b1SAndrzej Zaborowski u32 conn_owner_nlportid; 4789bd2522b1SAndrzej Zaborowski 4790bd2522b1SAndrzej Zaborowski struct work_struct disconnect_wk; 4791bd2522b1SAndrzej Zaborowski u8 disconnect_bssid[ETH_ALEN]; 4792d3236553SJohannes Berg 4793667503ddSJohannes Berg struct list_head event_list; 4794667503ddSJohannes Berg spinlock_t event_lock; 4795667503ddSJohannes Berg 479619957bb3SJohannes Berg struct cfg80211_internal_bss *current_bss; /* associated / joined */ 4797683b6d3bSJohannes Berg struct cfg80211_chan_def preset_chandef; 47989e0e2961SMichal Kazior struct cfg80211_chan_def chandef; 4799f4489ebeSMichal Kazior 4800c30a3d38SMichal Kazior bool ibss_fixed; 48015336fa88SSimon Wunderlich bool ibss_dfs_possible; 4802c30a3d38SMichal Kazior 4803ffb9eb3dSKalle Valo bool ps; 4804ffb9eb3dSKalle Valo int ps_timeout; 4805ffb9eb3dSKalle Valo 480656d1893dSJohannes Berg int beacon_interval; 480756d1893dSJohannes Berg 480815e47304SEric W. Biederman u32 ap_unexpected_nlportid; 480928946da7SJohannes Berg 4810ab81007aSJohannes Berg u32 owner_nlportid; 4811ab81007aSJohannes Berg bool nl_owner_dead; 4812ab81007aSJohannes Berg 481304f39047SSimon Wunderlich bool cac_started; 481404f39047SSimon Wunderlich unsigned long cac_start_time; 481531559f35SJanusz Dziedzic unsigned int cac_time_ms; 481604f39047SSimon Wunderlich 48173d23e349SJohannes Berg #ifdef CONFIG_CFG80211_WEXT 4818d3236553SJohannes Berg /* wext data */ 4819cbe8fa9cSJohannes Berg struct { 4820cbe8fa9cSJohannes Berg struct cfg80211_ibss_params ibss; 4821f2129354SJohannes Berg struct cfg80211_connect_params connect; 4822fffd0934SJohannes Berg struct cfg80211_cached_keys *keys; 4823c1e5f471SJohannes Berg const u8 *ie; 4824f2129354SJohannes Berg size_t ie_len; 48259874b71fSJohannes Berg u8 bssid[ETH_ALEN]; 48269874b71fSJohannes Berg u8 prev_bssid[ETH_ALEN]; 4827f2129354SJohannes Berg u8 ssid[IEEE80211_MAX_SSID_LEN]; 482808645126SJohannes Berg s8 default_key, default_mgmt_key; 4829ffb9eb3dSKalle Valo bool prev_bssid_valid; 4830cbe8fa9cSJohannes Berg } wext; 4831d3236553SJohannes Berg #endif 48324a4b8169SAndrew Zaborowski 48334a4b8169SAndrew Zaborowski struct cfg80211_cqm_config *cqm_config; 48349bb7e0f2SJohannes Berg 48359bb7e0f2SJohannes Berg struct list_head pmsr_list; 48369bb7e0f2SJohannes Berg spinlock_t pmsr_lock; 48379bb7e0f2SJohannes Berg struct work_struct pmsr_free_wk; 4838d3236553SJohannes Berg }; 4839d3236553SJohannes Berg 484098104fdeSJohannes Berg static inline u8 *wdev_address(struct wireless_dev *wdev) 484198104fdeSJohannes Berg { 484298104fdeSJohannes Berg if (wdev->netdev) 484398104fdeSJohannes Berg return wdev->netdev->dev_addr; 484498104fdeSJohannes Berg return wdev->address; 484598104fdeSJohannes Berg } 484698104fdeSJohannes Berg 484773c7da3dSArend Van Spriel static inline bool wdev_running(struct wireless_dev *wdev) 484873c7da3dSArend Van Spriel { 484973c7da3dSArend Van Spriel if (wdev->netdev) 485073c7da3dSArend Van Spriel return netif_running(wdev->netdev); 485173c7da3dSArend Van Spriel return wdev->is_running; 485273c7da3dSArend Van Spriel } 485373c7da3dSArend Van Spriel 4854d3236553SJohannes Berg /** 4855d3236553SJohannes Berg * wdev_priv - return wiphy priv from wireless_dev 4856d3236553SJohannes Berg * 4857d3236553SJohannes Berg * @wdev: The wireless device whose wiphy's priv pointer to return 48580ae997dcSYacine Belkadi * Return: The wiphy priv of @wdev. 4859d3236553SJohannes Berg */ 4860d3236553SJohannes Berg static inline void *wdev_priv(struct wireless_dev *wdev) 4861d3236553SJohannes Berg { 4862d3236553SJohannes Berg BUG_ON(!wdev); 4863d3236553SJohannes Berg return wiphy_priv(wdev->wiphy); 4864d3236553SJohannes Berg } 4865d3236553SJohannes Berg 4866d70e9693SJohannes Berg /** 4867d70e9693SJohannes Berg * DOC: Utility functions 4868d70e9693SJohannes Berg * 4869d70e9693SJohannes Berg * cfg80211 offers a number of utility functions that can be useful. 4870d3236553SJohannes Berg */ 4871d3236553SJohannes Berg 4872d3236553SJohannes Berg /** 4873d3236553SJohannes Berg * ieee80211_channel_to_frequency - convert channel number to frequency 4874abe37c4bSJohannes Berg * @chan: channel number 487559eb21a6SBruno Randolf * @band: band, necessary due to channel number overlap 48760ae997dcSYacine Belkadi * Return: The corresponding frequency (in MHz), or 0 if the conversion failed. 4877d3236553SJohannes Berg */ 487857fbcce3SJohannes Berg int ieee80211_channel_to_frequency(int chan, enum nl80211_band band); 4879d3236553SJohannes Berg 4880d3236553SJohannes Berg /** 4881d3236553SJohannes Berg * ieee80211_frequency_to_channel - convert frequency to channel number 4882abe37c4bSJohannes Berg * @freq: center frequency 48830ae997dcSYacine Belkadi * Return: The corresponding channel, or 0 if the conversion failed. 4884d3236553SJohannes Berg */ 488510dd9b7cSJoe Perches int ieee80211_frequency_to_channel(int freq); 4886d3236553SJohannes Berg 4887d3236553SJohannes Berg /** 4888d3236553SJohannes Berg * ieee80211_get_channel - get channel struct from wiphy for specified frequency 4889543b921bSArend Van Spriel * 4890abe37c4bSJohannes Berg * @wiphy: the struct wiphy to get the channel for 4891abe37c4bSJohannes Berg * @freq: the center frequency of the channel 4892543b921bSArend Van Spriel * 48930ae997dcSYacine Belkadi * Return: The channel struct from @wiphy at @freq. 4894d3236553SJohannes Berg */ 4895543b921bSArend Van Spriel struct ieee80211_channel *ieee80211_get_channel(struct wiphy *wiphy, int freq); 4896d3236553SJohannes Berg 4897d3236553SJohannes Berg /** 4898d3236553SJohannes Berg * ieee80211_get_response_rate - get basic rate for a given rate 4899d3236553SJohannes Berg * 4900d3236553SJohannes Berg * @sband: the band to look for rates in 4901d3236553SJohannes Berg * @basic_rates: bitmap of basic rates 4902d3236553SJohannes Berg * @bitrate: the bitrate for which to find the basic rate 4903d3236553SJohannes Berg * 49040ae997dcSYacine Belkadi * Return: The basic rate corresponding to a given bitrate, that 49050ae997dcSYacine Belkadi * is the next lower bitrate contained in the basic rate map, 49060ae997dcSYacine Belkadi * which is, for this function, given as a bitmap of indices of 49070ae997dcSYacine Belkadi * rates in the band's bitrate table. 4908d3236553SJohannes Berg */ 4909d3236553SJohannes Berg struct ieee80211_rate * 4910d3236553SJohannes Berg ieee80211_get_response_rate(struct ieee80211_supported_band *sband, 4911d3236553SJohannes Berg u32 basic_rates, int bitrate); 4912d3236553SJohannes Berg 4913b422c6cdSAshok Nagarajan /** 4914b422c6cdSAshok Nagarajan * ieee80211_mandatory_rates - get mandatory rates for a given band 4915b422c6cdSAshok Nagarajan * @sband: the band to look for rates in 491674608acaSSimon Wunderlich * @scan_width: width of the control channel 4917b422c6cdSAshok Nagarajan * 4918b422c6cdSAshok Nagarajan * This function returns a bitmap of the mandatory rates for the given 4919b422c6cdSAshok Nagarajan * band, bits are set according to the rate position in the bitrates array. 4920b422c6cdSAshok Nagarajan */ 492174608acaSSimon Wunderlich u32 ieee80211_mandatory_rates(struct ieee80211_supported_band *sband, 492274608acaSSimon Wunderlich enum nl80211_bss_scan_width scan_width); 4923b422c6cdSAshok Nagarajan 4924d3236553SJohannes Berg /* 4925d3236553SJohannes Berg * Radiotap parsing functions -- for controlled injection support 4926d3236553SJohannes Berg * 4927d3236553SJohannes Berg * Implemented in net/wireless/radiotap.c 4928d3236553SJohannes Berg * Documentation in Documentation/networking/radiotap-headers.txt 4929d3236553SJohannes Berg */ 4930d3236553SJohannes Berg 493133e5a2f7SJohannes Berg struct radiotap_align_size { 493233e5a2f7SJohannes Berg uint8_t align:4, size:4; 493333e5a2f7SJohannes Berg }; 493433e5a2f7SJohannes Berg 493533e5a2f7SJohannes Berg struct ieee80211_radiotap_namespace { 493633e5a2f7SJohannes Berg const struct radiotap_align_size *align_size; 493733e5a2f7SJohannes Berg int n_bits; 493833e5a2f7SJohannes Berg uint32_t oui; 493933e5a2f7SJohannes Berg uint8_t subns; 494033e5a2f7SJohannes Berg }; 494133e5a2f7SJohannes Berg 494233e5a2f7SJohannes Berg struct ieee80211_radiotap_vendor_namespaces { 494333e5a2f7SJohannes Berg const struct ieee80211_radiotap_namespace *ns; 494433e5a2f7SJohannes Berg int n_ns; 494533e5a2f7SJohannes Berg }; 494633e5a2f7SJohannes Berg 4947d3236553SJohannes Berg /** 4948d3236553SJohannes Berg * struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args 494933e5a2f7SJohannes Berg * @this_arg_index: index of current arg, valid after each successful call 495033e5a2f7SJohannes Berg * to ieee80211_radiotap_iterator_next() 495133e5a2f7SJohannes Berg * @this_arg: pointer to current radiotap arg; it is valid after each 495233e5a2f7SJohannes Berg * call to ieee80211_radiotap_iterator_next() but also after 495333e5a2f7SJohannes Berg * ieee80211_radiotap_iterator_init() where it will point to 495433e5a2f7SJohannes Berg * the beginning of the actual data portion 495533e5a2f7SJohannes Berg * @this_arg_size: length of the current arg, for convenience 495633e5a2f7SJohannes Berg * @current_namespace: pointer to the current namespace definition 495733e5a2f7SJohannes Berg * (or internally %NULL if the current namespace is unknown) 495833e5a2f7SJohannes Berg * @is_radiotap_ns: indicates whether the current namespace is the default 495933e5a2f7SJohannes Berg * radiotap namespace or not 496033e5a2f7SJohannes Berg * 496133e5a2f7SJohannes Berg * @_rtheader: pointer to the radiotap header we are walking through 496233e5a2f7SJohannes Berg * @_max_length: length of radiotap header in cpu byte ordering 496333e5a2f7SJohannes Berg * @_arg_index: next argument index 496433e5a2f7SJohannes Berg * @_arg: next argument pointer 496533e5a2f7SJohannes Berg * @_next_bitmap: internal pointer to next present u32 496633e5a2f7SJohannes Berg * @_bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present 496733e5a2f7SJohannes Berg * @_vns: vendor namespace definitions 496833e5a2f7SJohannes Berg * @_next_ns_data: beginning of the next namespace's data 496933e5a2f7SJohannes Berg * @_reset_on_ext: internal; reset the arg index to 0 when going to the 497033e5a2f7SJohannes Berg * next bitmap word 497133e5a2f7SJohannes Berg * 497233e5a2f7SJohannes Berg * Describes the radiotap parser state. Fields prefixed with an underscore 497333e5a2f7SJohannes Berg * must not be used by users of the parser, only by the parser internally. 4974d3236553SJohannes Berg */ 4975d3236553SJohannes Berg 4976d3236553SJohannes Berg struct ieee80211_radiotap_iterator { 497733e5a2f7SJohannes Berg struct ieee80211_radiotap_header *_rtheader; 497833e5a2f7SJohannes Berg const struct ieee80211_radiotap_vendor_namespaces *_vns; 497933e5a2f7SJohannes Berg const struct ieee80211_radiotap_namespace *current_namespace; 4980d3236553SJohannes Berg 498133e5a2f7SJohannes Berg unsigned char *_arg, *_next_ns_data; 498267272440SJohannes Berg __le32 *_next_bitmap; 498333e5a2f7SJohannes Berg 498433e5a2f7SJohannes Berg unsigned char *this_arg; 498533e5a2f7SJohannes Berg int this_arg_index; 498633e5a2f7SJohannes Berg int this_arg_size; 498733e5a2f7SJohannes Berg 498833e5a2f7SJohannes Berg int is_radiotap_ns; 498933e5a2f7SJohannes Berg 499033e5a2f7SJohannes Berg int _max_length; 499133e5a2f7SJohannes Berg int _arg_index; 499233e5a2f7SJohannes Berg uint32_t _bitmap_shifter; 499333e5a2f7SJohannes Berg int _reset_on_ext; 4994d3236553SJohannes Berg }; 4995d3236553SJohannes Berg 499610dd9b7cSJoe Perches int 499710dd9b7cSJoe Perches ieee80211_radiotap_iterator_init(struct ieee80211_radiotap_iterator *iterator, 4998d3236553SJohannes Berg struct ieee80211_radiotap_header *radiotap_header, 499910dd9b7cSJoe Perches int max_length, 500010dd9b7cSJoe Perches const struct ieee80211_radiotap_vendor_namespaces *vns); 5001d3236553SJohannes Berg 500210dd9b7cSJoe Perches int 500310dd9b7cSJoe Perches ieee80211_radiotap_iterator_next(struct ieee80211_radiotap_iterator *iterator); 5004d3236553SJohannes Berg 500533e5a2f7SJohannes Berg 5006e31a16d6SZhu Yi extern const unsigned char rfc1042_header[6]; 5007e31a16d6SZhu Yi extern const unsigned char bridge_tunnel_header[6]; 5008e31a16d6SZhu Yi 5009e31a16d6SZhu Yi /** 5010e31a16d6SZhu Yi * ieee80211_get_hdrlen_from_skb - get header length from data 5011e31a16d6SZhu Yi * 5012e31a16d6SZhu Yi * @skb: the frame 50130ae997dcSYacine Belkadi * 50140ae997dcSYacine Belkadi * Given an skb with a raw 802.11 header at the data pointer this function 50150ae997dcSYacine Belkadi * returns the 802.11 header length. 50160ae997dcSYacine Belkadi * 50170ae997dcSYacine Belkadi * Return: The 802.11 header length in bytes (not including encryption 50180ae997dcSYacine Belkadi * headers). Or 0 if the data in the sk_buff is too short to contain a valid 50190ae997dcSYacine Belkadi * 802.11 header. 5020e31a16d6SZhu Yi */ 5021e31a16d6SZhu Yi unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb); 5022e31a16d6SZhu Yi 5023e31a16d6SZhu Yi /** 5024e31a16d6SZhu Yi * ieee80211_hdrlen - get header length in bytes from frame control 5025e31a16d6SZhu Yi * @fc: frame control field in little-endian format 50260ae997dcSYacine Belkadi * Return: The header length in bytes. 5027e31a16d6SZhu Yi */ 5028633adf1aSJohannes Berg unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc); 5029e31a16d6SZhu Yi 5030e31a16d6SZhu Yi /** 50319b395bc3SJohannes Berg * ieee80211_get_mesh_hdrlen - get mesh extension header length 50329b395bc3SJohannes Berg * @meshhdr: the mesh extension header, only the flags field 50339b395bc3SJohannes Berg * (first byte) will be accessed 50340ae997dcSYacine Belkadi * Return: The length of the extension header, which is always at 50359b395bc3SJohannes Berg * least 6 bytes and at most 18 if address 5 and 6 are present. 50369b395bc3SJohannes Berg */ 50379b395bc3SJohannes Berg unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr); 50389b395bc3SJohannes Berg 50399b395bc3SJohannes Berg /** 5040d70e9693SJohannes Berg * DOC: Data path helpers 5041d70e9693SJohannes Berg * 5042d70e9693SJohannes Berg * In addition to generic utilities, cfg80211 also offers 5043d70e9693SJohannes Berg * functions that help implement the data path for devices 5044d70e9693SJohannes Berg * that do not do the 802.11/802.3 conversion on the device. 5045d70e9693SJohannes Berg */ 5046d70e9693SJohannes Berg 5047d70e9693SJohannes Berg /** 50487f6990c8SJohannes Berg * ieee80211_data_to_8023_exthdr - convert an 802.11 data frame to 802.3 50497f6990c8SJohannes Berg * @skb: the 802.11 data frame 50507f6990c8SJohannes Berg * @ehdr: pointer to a &struct ethhdr that will get the header, instead 50517f6990c8SJohannes Berg * of it being pushed into the SKB 50527f6990c8SJohannes Berg * @addr: the device MAC address 50537f6990c8SJohannes Berg * @iftype: the virtual interface type 505424bba078SFelix Fietkau * @data_offset: offset of payload after the 802.11 header 50557f6990c8SJohannes Berg * Return: 0 on success. Non-zero on error. 50567f6990c8SJohannes Berg */ 50577f6990c8SJohannes Berg int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, 505824bba078SFelix Fietkau const u8 *addr, enum nl80211_iftype iftype, 505924bba078SFelix Fietkau u8 data_offset); 50607f6990c8SJohannes Berg 50617f6990c8SJohannes Berg /** 5062e31a16d6SZhu Yi * ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3 5063e31a16d6SZhu Yi * @skb: the 802.11 data frame 5064e31a16d6SZhu Yi * @addr: the device MAC address 5065e31a16d6SZhu Yi * @iftype: the virtual interface type 50660ae997dcSYacine Belkadi * Return: 0 on success. Non-zero on error. 5067e31a16d6SZhu Yi */ 50687f6990c8SJohannes Berg static inline int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, 50697f6990c8SJohannes Berg enum nl80211_iftype iftype) 50707f6990c8SJohannes Berg { 507124bba078SFelix Fietkau return ieee80211_data_to_8023_exthdr(skb, NULL, addr, iftype, 0); 50727f6990c8SJohannes Berg } 5073e31a16d6SZhu Yi 5074e31a16d6SZhu Yi /** 5075eaf85ca7SZhu Yi * ieee80211_amsdu_to_8023s - decode an IEEE 802.11n A-MSDU frame 5076eaf85ca7SZhu Yi * 50777f6990c8SJohannes Berg * Decode an IEEE 802.11 A-MSDU and convert it to a list of 802.3 frames. 50787f6990c8SJohannes Berg * The @list will be empty if the decode fails. The @skb must be fully 50797f6990c8SJohannes Berg * header-less before being passed in here; it is freed in this function. 5080eaf85ca7SZhu Yi * 50817f6990c8SJohannes Berg * @skb: The input A-MSDU frame without any headers. 5082eaf85ca7SZhu Yi * @list: The output list of 802.3 frames. It must be allocated and 5083eaf85ca7SZhu Yi * initialized by by the caller. 5084eaf85ca7SZhu Yi * @addr: The device MAC address. 5085eaf85ca7SZhu Yi * @iftype: The device interface type. 5086eaf85ca7SZhu Yi * @extra_headroom: The hardware extra headroom for SKBs in the @list. 50878b935ee2SJohannes Berg * @check_da: DA to check in the inner ethernet header, or NULL 50888b935ee2SJohannes Berg * @check_sa: SA to check in the inner ethernet header, or NULL 5089eaf85ca7SZhu Yi */ 5090eaf85ca7SZhu Yi void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, 5091eaf85ca7SZhu Yi const u8 *addr, enum nl80211_iftype iftype, 50928b3becadSYogesh Ashok Powar const unsigned int extra_headroom, 50938b935ee2SJohannes Berg const u8 *check_da, const u8 *check_sa); 5094eaf85ca7SZhu Yi 5095eaf85ca7SZhu Yi /** 5096e31a16d6SZhu Yi * cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame 5097e31a16d6SZhu Yi * @skb: the data frame 5098fa9ffc74SKyeyoon Park * @qos_map: Interworking QoS mapping or %NULL if not in use 50990ae997dcSYacine Belkadi * Return: The 802.1p/1d tag. 5100e31a16d6SZhu Yi */ 5101fa9ffc74SKyeyoon Park unsigned int cfg80211_classify8021d(struct sk_buff *skb, 5102fa9ffc74SKyeyoon Park struct cfg80211_qos_map *qos_map); 5103e31a16d6SZhu Yi 5104c21dbf92SJohannes Berg /** 510549a68e0dSJohannes Berg * cfg80211_find_elem_match - match information element and byte array in data 510649a68e0dSJohannes Berg * 510749a68e0dSJohannes Berg * @eid: element ID 510849a68e0dSJohannes Berg * @ies: data consisting of IEs 510949a68e0dSJohannes Berg * @len: length of data 511049a68e0dSJohannes Berg * @match: byte array to match 511149a68e0dSJohannes Berg * @match_len: number of bytes in the match array 511249a68e0dSJohannes Berg * @match_offset: offset in the IE data where the byte array should match. 511349a68e0dSJohannes Berg * Note the difference to cfg80211_find_ie_match() which considers 511449a68e0dSJohannes Berg * the offset to start from the element ID byte, but here we take 511549a68e0dSJohannes Berg * the data portion instead. 511649a68e0dSJohannes Berg * 511749a68e0dSJohannes Berg * Return: %NULL if the element ID could not be found or if 511849a68e0dSJohannes Berg * the element is invalid (claims to be longer than the given 511949a68e0dSJohannes Berg * data) or if the byte array doesn't match; otherwise return the 512049a68e0dSJohannes Berg * requested element struct. 512149a68e0dSJohannes Berg * 512249a68e0dSJohannes Berg * Note: There are no checks on the element length other than 512349a68e0dSJohannes Berg * having to fit into the given data and being large enough for the 512449a68e0dSJohannes Berg * byte array to match. 512549a68e0dSJohannes Berg */ 512649a68e0dSJohannes Berg const struct element * 512749a68e0dSJohannes Berg cfg80211_find_elem_match(u8 eid, const u8 *ies, unsigned int len, 512849a68e0dSJohannes Berg const u8 *match, unsigned int match_len, 512949a68e0dSJohannes Berg unsigned int match_offset); 513049a68e0dSJohannes Berg 513149a68e0dSJohannes Berg /** 5132fbd05e4aSLuca Coelho * cfg80211_find_ie_match - match information element and byte array in data 5133fbd05e4aSLuca Coelho * 5134fbd05e4aSLuca Coelho * @eid: element ID 5135fbd05e4aSLuca Coelho * @ies: data consisting of IEs 5136fbd05e4aSLuca Coelho * @len: length of data 5137fbd05e4aSLuca Coelho * @match: byte array to match 5138fbd05e4aSLuca Coelho * @match_len: number of bytes in the match array 5139fbd05e4aSLuca Coelho * @match_offset: offset in the IE where the byte array should match. 5140fbd05e4aSLuca Coelho * If match_len is zero, this must also be set to zero. 5141fbd05e4aSLuca Coelho * Otherwise this must be set to 2 or more, because the first 5142fbd05e4aSLuca Coelho * byte is the element id, which is already compared to eid, and 5143fbd05e4aSLuca Coelho * the second byte is the IE length. 5144fbd05e4aSLuca Coelho * 5145fbd05e4aSLuca Coelho * Return: %NULL if the element ID could not be found or if 5146fbd05e4aSLuca Coelho * the element is invalid (claims to be longer than the given 5147fbd05e4aSLuca Coelho * data) or if the byte array doesn't match, or a pointer to the first 5148fbd05e4aSLuca Coelho * byte of the requested element, that is the byte containing the 5149fbd05e4aSLuca Coelho * element ID. 5150fbd05e4aSLuca Coelho * 5151fbd05e4aSLuca Coelho * Note: There are no checks on the element length other than 5152fbd05e4aSLuca Coelho * having to fit into the given data and being large enough for the 5153fbd05e4aSLuca Coelho * byte array to match. 5154fbd05e4aSLuca Coelho */ 515549a68e0dSJohannes Berg static inline const u8 * 515649a68e0dSJohannes Berg cfg80211_find_ie_match(u8 eid, const u8 *ies, unsigned int len, 515749a68e0dSJohannes Berg const u8 *match, unsigned int match_len, 515849a68e0dSJohannes Berg unsigned int match_offset) 515949a68e0dSJohannes Berg { 516049a68e0dSJohannes Berg /* match_offset can't be smaller than 2, unless match_len is 516149a68e0dSJohannes Berg * zero, in which case match_offset must be zero as well. 516249a68e0dSJohannes Berg */ 516349a68e0dSJohannes Berg if (WARN_ON((match_len && match_offset < 2) || 516449a68e0dSJohannes Berg (!match_len && match_offset))) 516549a68e0dSJohannes Berg return NULL; 516649a68e0dSJohannes Berg 516749a68e0dSJohannes Berg return (void *)cfg80211_find_elem_match(eid, ies, len, 516849a68e0dSJohannes Berg match, match_len, 516949a68e0dSJohannes Berg match_offset ? 517049a68e0dSJohannes Berg match_offset - 2 : 0); 517149a68e0dSJohannes Berg } 517249a68e0dSJohannes Berg 517349a68e0dSJohannes Berg /** 517449a68e0dSJohannes Berg * cfg80211_find_elem - find information element in data 517549a68e0dSJohannes Berg * 517649a68e0dSJohannes Berg * @eid: element ID 517749a68e0dSJohannes Berg * @ies: data consisting of IEs 517849a68e0dSJohannes Berg * @len: length of data 517949a68e0dSJohannes Berg * 518049a68e0dSJohannes Berg * Return: %NULL if the element ID could not be found or if 518149a68e0dSJohannes Berg * the element is invalid (claims to be longer than the given 518249a68e0dSJohannes Berg * data) or if the byte array doesn't match; otherwise return the 518349a68e0dSJohannes Berg * requested element struct. 518449a68e0dSJohannes Berg * 518549a68e0dSJohannes Berg * Note: There are no checks on the element length other than 518649a68e0dSJohannes Berg * having to fit into the given data. 518749a68e0dSJohannes Berg */ 518849a68e0dSJohannes Berg static inline const struct element * 518949a68e0dSJohannes Berg cfg80211_find_elem(u8 eid, const u8 *ies, int len) 519049a68e0dSJohannes Berg { 519149a68e0dSJohannes Berg return cfg80211_find_elem_match(eid, ies, len, NULL, 0, 0); 519249a68e0dSJohannes Berg } 5193fbd05e4aSLuca Coelho 5194fbd05e4aSLuca Coelho /** 5195c21dbf92SJohannes Berg * cfg80211_find_ie - find information element in data 5196c21dbf92SJohannes Berg * 5197c21dbf92SJohannes Berg * @eid: element ID 5198c21dbf92SJohannes Berg * @ies: data consisting of IEs 5199c21dbf92SJohannes Berg * @len: length of data 5200c21dbf92SJohannes Berg * 52010ae997dcSYacine Belkadi * Return: %NULL if the element ID could not be found or if 52020ae997dcSYacine Belkadi * the element is invalid (claims to be longer than the given 52030ae997dcSYacine Belkadi * data), or a pointer to the first byte of the requested 52040ae997dcSYacine Belkadi * element, that is the byte containing the element ID. 52050ae997dcSYacine Belkadi * 52060ae997dcSYacine Belkadi * Note: There are no checks on the element length other than 52070ae997dcSYacine Belkadi * having to fit into the given data. 5208c21dbf92SJohannes Berg */ 5209fbd05e4aSLuca Coelho static inline const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len) 5210fbd05e4aSLuca Coelho { 5211fbd05e4aSLuca Coelho return cfg80211_find_ie_match(eid, ies, len, NULL, 0, 0); 5212fbd05e4aSLuca Coelho } 5213c21dbf92SJohannes Berg 5214d70e9693SJohannes Berg /** 521549a68e0dSJohannes Berg * cfg80211_find_ext_elem - find information element with EID Extension in data 521649a68e0dSJohannes Berg * 521749a68e0dSJohannes Berg * @ext_eid: element ID Extension 521849a68e0dSJohannes Berg * @ies: data consisting of IEs 521949a68e0dSJohannes Berg * @len: length of data 522049a68e0dSJohannes Berg * 522149a68e0dSJohannes Berg * Return: %NULL if the etended element could not be found or if 522249a68e0dSJohannes Berg * the element is invalid (claims to be longer than the given 522349a68e0dSJohannes Berg * data) or if the byte array doesn't match; otherwise return the 522449a68e0dSJohannes Berg * requested element struct. 522549a68e0dSJohannes Berg * 522649a68e0dSJohannes Berg * Note: There are no checks on the element length other than 522749a68e0dSJohannes Berg * having to fit into the given data. 522849a68e0dSJohannes Berg */ 522949a68e0dSJohannes Berg static inline const struct element * 523049a68e0dSJohannes Berg cfg80211_find_ext_elem(u8 ext_eid, const u8 *ies, int len) 523149a68e0dSJohannes Berg { 523249a68e0dSJohannes Berg return cfg80211_find_elem_match(WLAN_EID_EXTENSION, ies, len, 523349a68e0dSJohannes Berg &ext_eid, 1, 0); 523449a68e0dSJohannes Berg } 523549a68e0dSJohannes Berg 523649a68e0dSJohannes Berg /** 52373f817fe7SJouni Malinen * cfg80211_find_ext_ie - find information element with EID Extension in data 52383f817fe7SJouni Malinen * 52393f817fe7SJouni Malinen * @ext_eid: element ID Extension 52403f817fe7SJouni Malinen * @ies: data consisting of IEs 52413f817fe7SJouni Malinen * @len: length of data 52423f817fe7SJouni Malinen * 52433f817fe7SJouni Malinen * Return: %NULL if the extended element ID could not be found or if 52443f817fe7SJouni Malinen * the element is invalid (claims to be longer than the given 52453f817fe7SJouni Malinen * data), or a pointer to the first byte of the requested 52463f817fe7SJouni Malinen * element, that is the byte containing the element ID. 52473f817fe7SJouni Malinen * 52483f817fe7SJouni Malinen * Note: There are no checks on the element length other than 52493f817fe7SJouni Malinen * having to fit into the given data. 52503f817fe7SJouni Malinen */ 52513f817fe7SJouni Malinen static inline const u8 *cfg80211_find_ext_ie(u8 ext_eid, const u8 *ies, int len) 52523f817fe7SJouni Malinen { 52533f817fe7SJouni Malinen return cfg80211_find_ie_match(WLAN_EID_EXTENSION, ies, len, 52543f817fe7SJouni Malinen &ext_eid, 1, 2); 52553f817fe7SJouni Malinen } 52563f817fe7SJouni Malinen 52573f817fe7SJouni Malinen /** 525849a68e0dSJohannes Berg * cfg80211_find_vendor_elem - find vendor specific information element in data 525949a68e0dSJohannes Berg * 526049a68e0dSJohannes Berg * @oui: vendor OUI 526149a68e0dSJohannes Berg * @oui_type: vendor-specific OUI type (must be < 0xff), negative means any 526249a68e0dSJohannes Berg * @ies: data consisting of IEs 526349a68e0dSJohannes Berg * @len: length of data 526449a68e0dSJohannes Berg * 526549a68e0dSJohannes Berg * Return: %NULL if the vendor specific element ID could not be found or if the 526649a68e0dSJohannes Berg * element is invalid (claims to be longer than the given data); otherwise 526749a68e0dSJohannes Berg * return the element structure for the requested element. 526849a68e0dSJohannes Berg * 526949a68e0dSJohannes Berg * Note: There are no checks on the element length other than having to fit into 527049a68e0dSJohannes Berg * the given data. 527149a68e0dSJohannes Berg */ 527249a68e0dSJohannes Berg const struct element *cfg80211_find_vendor_elem(unsigned int oui, int oui_type, 527349a68e0dSJohannes Berg const u8 *ies, 527449a68e0dSJohannes Berg unsigned int len); 527549a68e0dSJohannes Berg 527649a68e0dSJohannes Berg /** 52770c28ec58SEliad Peller * cfg80211_find_vendor_ie - find vendor specific information element in data 52780c28ec58SEliad Peller * 52790c28ec58SEliad Peller * @oui: vendor OUI 52809e9ea439SEmmanuel Grumbach * @oui_type: vendor-specific OUI type (must be < 0xff), negative means any 52810c28ec58SEliad Peller * @ies: data consisting of IEs 52820c28ec58SEliad Peller * @len: length of data 52830c28ec58SEliad Peller * 52840ae997dcSYacine Belkadi * Return: %NULL if the vendor specific element ID could not be found or if the 52850ae997dcSYacine Belkadi * element is invalid (claims to be longer than the given data), or a pointer to 52860ae997dcSYacine Belkadi * the first byte of the requested element, that is the byte containing the 52870ae997dcSYacine Belkadi * element ID. 52880ae997dcSYacine Belkadi * 52890ae997dcSYacine Belkadi * Note: There are no checks on the element length other than having to fit into 52900ae997dcSYacine Belkadi * the given data. 52910c28ec58SEliad Peller */ 529249a68e0dSJohannes Berg static inline const u8 * 529349a68e0dSJohannes Berg cfg80211_find_vendor_ie(unsigned int oui, int oui_type, 529449a68e0dSJohannes Berg const u8 *ies, unsigned int len) 529549a68e0dSJohannes Berg { 529649a68e0dSJohannes Berg return (void *)cfg80211_find_vendor_elem(oui, oui_type, ies, len); 529749a68e0dSJohannes Berg } 52980c28ec58SEliad Peller 52990c28ec58SEliad Peller /** 530030ca1aa5SDedy Lansky * cfg80211_send_layer2_update - send layer 2 update frame 530130ca1aa5SDedy Lansky * 530230ca1aa5SDedy Lansky * @dev: network device 530330ca1aa5SDedy Lansky * @addr: STA MAC address 530430ca1aa5SDedy Lansky * 530530ca1aa5SDedy Lansky * Wireless drivers can use this function to update forwarding tables in bridge 530630ca1aa5SDedy Lansky * devices upon STA association. 530730ca1aa5SDedy Lansky */ 530830ca1aa5SDedy Lansky void cfg80211_send_layer2_update(struct net_device *dev, const u8 *addr); 530930ca1aa5SDedy Lansky 531030ca1aa5SDedy Lansky /** 5311d70e9693SJohannes Berg * DOC: Regulatory enforcement infrastructure 5312d70e9693SJohannes Berg * 5313d70e9693SJohannes Berg * TODO 5314d3236553SJohannes Berg */ 5315d3236553SJohannes Berg 5316d3236553SJohannes Berg /** 5317d3236553SJohannes Berg * regulatory_hint - driver hint to the wireless core a regulatory domain 5318d3236553SJohannes Berg * @wiphy: the wireless device giving the hint (used only for reporting 5319d3236553SJohannes Berg * conflicts) 5320d3236553SJohannes Berg * @alpha2: the ISO/IEC 3166 alpha2 the driver claims its regulatory domain 5321d3236553SJohannes Berg * should be in. If @rd is set this should be NULL. Note that if you 5322d3236553SJohannes Berg * set this to NULL you should still set rd->alpha2 to some accepted 5323d3236553SJohannes Berg * alpha2. 5324d3236553SJohannes Berg * 5325d3236553SJohannes Berg * Wireless drivers can use this function to hint to the wireless core 5326d3236553SJohannes Berg * what it believes should be the current regulatory domain by 5327d3236553SJohannes Berg * giving it an ISO/IEC 3166 alpha2 country code it knows its regulatory 5328d3236553SJohannes Berg * domain should be in or by providing a completely build regulatory domain. 5329d3236553SJohannes Berg * If the driver provides an ISO/IEC 3166 alpha2 userspace will be queried 5330d3236553SJohannes Berg * for a regulatory domain structure for the respective country. 5331d3236553SJohannes Berg * 5332d3236553SJohannes Berg * The wiphy must have been registered to cfg80211 prior to this call. 5333d3236553SJohannes Berg * For cfg80211 drivers this means you must first use wiphy_register(), 5334d3236553SJohannes Berg * for mac80211 drivers you must first use ieee80211_register_hw(). 5335d3236553SJohannes Berg * 5336d3236553SJohannes Berg * Drivers should check the return value, its possible you can get 5337d3236553SJohannes Berg * an -ENOMEM. 53380ae997dcSYacine Belkadi * 53390ae997dcSYacine Belkadi * Return: 0 on success. -ENOMEM. 5340d3236553SJohannes Berg */ 534110dd9b7cSJoe Perches int regulatory_hint(struct wiphy *wiphy, const char *alpha2); 5342d3236553SJohannes Berg 5343d3236553SJohannes Berg /** 5344b0d7aa59SJonathan Doron * regulatory_set_wiphy_regd - set regdom info for self managed drivers 5345b0d7aa59SJonathan Doron * @wiphy: the wireless device we want to process the regulatory domain on 5346b0d7aa59SJonathan Doron * @rd: the regulatory domain informatoin to use for this wiphy 5347b0d7aa59SJonathan Doron * 5348b0d7aa59SJonathan Doron * Set the regulatory domain information for self-managed wiphys, only they 5349b0d7aa59SJonathan Doron * may use this function. See %REGULATORY_WIPHY_SELF_MANAGED for more 5350b0d7aa59SJonathan Doron * information. 5351b0d7aa59SJonathan Doron * 5352b0d7aa59SJonathan Doron * Return: 0 on success. -EINVAL, -EPERM 5353b0d7aa59SJonathan Doron */ 5354b0d7aa59SJonathan Doron int regulatory_set_wiphy_regd(struct wiphy *wiphy, 5355b0d7aa59SJonathan Doron struct ieee80211_regdomain *rd); 5356b0d7aa59SJonathan Doron 5357b0d7aa59SJonathan Doron /** 53582c3e861cSArik Nemtsov * regulatory_set_wiphy_regd_sync_rtnl - set regdom for self-managed drivers 53592c3e861cSArik Nemtsov * @wiphy: the wireless device we want to process the regulatory domain on 53602c3e861cSArik Nemtsov * @rd: the regulatory domain information to use for this wiphy 53612c3e861cSArik Nemtsov * 53622c3e861cSArik Nemtsov * This functions requires the RTNL to be held and applies the new regdomain 53632c3e861cSArik Nemtsov * synchronously to this wiphy. For more details see 53642c3e861cSArik Nemtsov * regulatory_set_wiphy_regd(). 53652c3e861cSArik Nemtsov * 53662c3e861cSArik Nemtsov * Return: 0 on success. -EINVAL, -EPERM 53672c3e861cSArik Nemtsov */ 53682c3e861cSArik Nemtsov int regulatory_set_wiphy_regd_sync_rtnl(struct wiphy *wiphy, 53692c3e861cSArik Nemtsov struct ieee80211_regdomain *rd); 53702c3e861cSArik Nemtsov 53712c3e861cSArik Nemtsov /** 5372d3236553SJohannes Berg * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain 5373d3236553SJohannes Berg * @wiphy: the wireless device we want to process the regulatory domain on 5374d3236553SJohannes Berg * @regd: the custom regulatory domain to use for this wiphy 5375d3236553SJohannes Berg * 5376d3236553SJohannes Berg * Drivers can sometimes have custom regulatory domains which do not apply 5377d3236553SJohannes Berg * to a specific country. Drivers can use this to apply such custom regulatory 5378d3236553SJohannes Berg * domains. This routine must be called prior to wiphy registration. The 5379d3236553SJohannes Berg * custom regulatory domain will be trusted completely and as such previous 5380d3236553SJohannes Berg * default channel settings will be disregarded. If no rule is found for a 5381d3236553SJohannes Berg * channel on the regulatory domain the channel will be disabled. 5382222ea581SLuis R. Rodriguez * Drivers using this for a wiphy should also set the wiphy flag 5383ce26151bSKalle Valo * REGULATORY_CUSTOM_REG or cfg80211 will set it for the wiphy 5384222ea581SLuis R. Rodriguez * that called this helper. 5385d3236553SJohannes Berg */ 538610dd9b7cSJoe Perches void wiphy_apply_custom_regulatory(struct wiphy *wiphy, 5387d3236553SJohannes Berg const struct ieee80211_regdomain *regd); 5388d3236553SJohannes Berg 5389d3236553SJohannes Berg /** 5390d3236553SJohannes Berg * freq_reg_info - get regulatory information for the given frequency 5391d3236553SJohannes Berg * @wiphy: the wiphy for which we want to process this rule for 5392d3236553SJohannes Berg * @center_freq: Frequency in KHz for which we want regulatory information for 5393d3236553SJohannes Berg * 5394d3236553SJohannes Berg * Use this function to get the regulatory rule for a specific frequency on 5395d3236553SJohannes Berg * a given wireless device. If the device has a specific regulatory domain 5396d3236553SJohannes Berg * it wants to follow we respect that unless a country IE has been received 5397d3236553SJohannes Berg * and processed already. 5398d3236553SJohannes Berg * 53990ae997dcSYacine Belkadi * Return: A valid pointer, or, when an error occurs, for example if no rule 54000ae997dcSYacine Belkadi * can be found, the return value is encoded using ERR_PTR(). Use IS_ERR() to 54010ae997dcSYacine Belkadi * check and PTR_ERR() to obtain the numeric return value. The numeric return 54020ae997dcSYacine Belkadi * value will be -ERANGE if we determine the given center_freq does not even 54030ae997dcSYacine Belkadi * have a regulatory rule for a frequency range in the center_freq's band. 54040ae997dcSYacine Belkadi * See freq_in_rule_band() for our current definition of a band -- this is 54050ae997dcSYacine Belkadi * purely subjective and right now it's 802.11 specific. 5406d3236553SJohannes Berg */ 5407361c9c8bSJohannes Berg const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy, 5408361c9c8bSJohannes Berg u32 center_freq); 5409d3236553SJohannes Berg 5410034c6d6eSLuis R. Rodriguez /** 5411034c6d6eSLuis R. Rodriguez * reg_initiator_name - map regulatory request initiator enum to name 5412034c6d6eSLuis R. Rodriguez * @initiator: the regulatory request initiator 5413034c6d6eSLuis R. Rodriguez * 5414034c6d6eSLuis R. Rodriguez * You can use this to map the regulatory request initiator enum to a 5415034c6d6eSLuis R. Rodriguez * proper string representation. 5416034c6d6eSLuis R. Rodriguez */ 5417034c6d6eSLuis R. Rodriguez const char *reg_initiator_name(enum nl80211_reg_initiator initiator); 5418034c6d6eSLuis R. Rodriguez 541919d3577eSHaim Dreyfuss /** 542019d3577eSHaim Dreyfuss * DOC: Internal regulatory db functions 542119d3577eSHaim Dreyfuss * 542219d3577eSHaim Dreyfuss */ 542319d3577eSHaim Dreyfuss 542419d3577eSHaim Dreyfuss /** 542519d3577eSHaim Dreyfuss * reg_query_regdb_wmm - Query internal regulatory db for wmm rule 542619d3577eSHaim Dreyfuss * Regulatory self-managed driver can use it to proactively 542719d3577eSHaim Dreyfuss * 542819d3577eSHaim Dreyfuss * @alpha2: the ISO/IEC 3166 alpha2 wmm rule to be queried. 542919d3577eSHaim Dreyfuss * @freq: the freqency(in MHz) to be queried. 543019d3577eSHaim Dreyfuss * @rule: pointer to store the wmm rule from the regulatory db. 543119d3577eSHaim Dreyfuss * 543219d3577eSHaim Dreyfuss * Self-managed wireless drivers can use this function to query 543319d3577eSHaim Dreyfuss * the internal regulatory database to check whether the given 543419d3577eSHaim Dreyfuss * ISO/IEC 3166 alpha2 country and freq have wmm rule limitations. 543519d3577eSHaim Dreyfuss * 543619d3577eSHaim Dreyfuss * Drivers should check the return value, its possible you can get 543719d3577eSHaim Dreyfuss * an -ENODATA. 543819d3577eSHaim Dreyfuss * 543919d3577eSHaim Dreyfuss * Return: 0 on success. -ENODATA. 544019d3577eSHaim Dreyfuss */ 544138cb87eeSStanislaw Gruszka int reg_query_regdb_wmm(char *alpha2, int freq, 544238cb87eeSStanislaw Gruszka struct ieee80211_reg_rule *rule); 544319d3577eSHaim Dreyfuss 5444d3236553SJohannes Berg /* 5445d3236553SJohannes Berg * callbacks for asynchronous cfg80211 methods, notification 5446d3236553SJohannes Berg * functions and BSS handling helpers 5447d3236553SJohannes Berg */ 5448d3236553SJohannes Berg 54492a519311SJohannes Berg /** 54502a519311SJohannes Berg * cfg80211_scan_done - notify that scan finished 54512a519311SJohannes Berg * 54522a519311SJohannes Berg * @request: the corresponding scan request 54531d76250bSAvraham Stern * @info: information about the completed scan 54542a519311SJohannes Berg */ 54551d76250bSAvraham Stern void cfg80211_scan_done(struct cfg80211_scan_request *request, 54561d76250bSAvraham Stern struct cfg80211_scan_info *info); 54572a519311SJohannes Berg 54582a519311SJohannes Berg /** 5459807f8a8cSLuciano Coelho * cfg80211_sched_scan_results - notify that new scan results are available 5460807f8a8cSLuciano Coelho * 5461807f8a8cSLuciano Coelho * @wiphy: the wiphy which got scheduled scan results 5462b34939b9SArend Van Spriel * @reqid: identifier for the related scheduled scan request 5463807f8a8cSLuciano Coelho */ 5464b34939b9SArend Van Spriel void cfg80211_sched_scan_results(struct wiphy *wiphy, u64 reqid); 5465807f8a8cSLuciano Coelho 5466807f8a8cSLuciano Coelho /** 5467807f8a8cSLuciano Coelho * cfg80211_sched_scan_stopped - notify that the scheduled scan has stopped 5468807f8a8cSLuciano Coelho * 5469807f8a8cSLuciano Coelho * @wiphy: the wiphy on which the scheduled scan stopped 5470b34939b9SArend Van Spriel * @reqid: identifier for the related scheduled scan request 5471807f8a8cSLuciano Coelho * 5472807f8a8cSLuciano Coelho * The driver can call this function to inform cfg80211 that the 5473807f8a8cSLuciano Coelho * scheduled scan had to be stopped, for whatever reason. The driver 5474807f8a8cSLuciano Coelho * is then called back via the sched_scan_stop operation when done. 5475807f8a8cSLuciano Coelho */ 5476b34939b9SArend Van Spriel void cfg80211_sched_scan_stopped(struct wiphy *wiphy, u64 reqid); 5477807f8a8cSLuciano Coelho 5478807f8a8cSLuciano Coelho /** 5479792e6aa7SEliad Peller * cfg80211_sched_scan_stopped_rtnl - notify that the scheduled scan has stopped 5480792e6aa7SEliad Peller * 5481792e6aa7SEliad Peller * @wiphy: the wiphy on which the scheduled scan stopped 5482b34939b9SArend Van Spriel * @reqid: identifier for the related scheduled scan request 5483792e6aa7SEliad Peller * 5484792e6aa7SEliad Peller * The driver can call this function to inform cfg80211 that the 5485792e6aa7SEliad Peller * scheduled scan had to be stopped, for whatever reason. The driver 5486792e6aa7SEliad Peller * is then called back via the sched_scan_stop operation when done. 5487792e6aa7SEliad Peller * This function should be called with rtnl locked. 5488792e6aa7SEliad Peller */ 5489b34939b9SArend Van Spriel void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy, u64 reqid); 5490792e6aa7SEliad Peller 5491792e6aa7SEliad Peller /** 54926e19bc4bSDmitry Shmidt * cfg80211_inform_bss_frame_data - inform cfg80211 of a received BSS frame 54932a519311SJohannes Berg * @wiphy: the wiphy reporting the BSS 54946e19bc4bSDmitry Shmidt * @data: the BSS metadata 5495abe37c4bSJohannes Berg * @mgmt: the management frame (probe response or beacon) 5496abe37c4bSJohannes Berg * @len: length of the management frame 54972a519311SJohannes Berg * @gfp: context flags 54982a519311SJohannes Berg * 54992a519311SJohannes Berg * This informs cfg80211 that BSS information was found and 55002a519311SJohannes Berg * the BSS should be updated/added. 5501ef100682SJohannes Berg * 55020ae997dcSYacine Belkadi * Return: A referenced struct, must be released with cfg80211_put_bss()! 55030ae997dcSYacine Belkadi * Or %NULL on error. 55042a519311SJohannes Berg */ 5505ef100682SJohannes Berg struct cfg80211_bss * __must_check 55066e19bc4bSDmitry Shmidt cfg80211_inform_bss_frame_data(struct wiphy *wiphy, 55076e19bc4bSDmitry Shmidt struct cfg80211_inform_bss *data, 55086e19bc4bSDmitry Shmidt struct ieee80211_mgmt *mgmt, size_t len, 55096e19bc4bSDmitry Shmidt gfp_t gfp); 55106e19bc4bSDmitry Shmidt 55116e19bc4bSDmitry Shmidt static inline struct cfg80211_bss * __must_check 5512dcd6eac1SSimon Wunderlich cfg80211_inform_bss_width_frame(struct wiphy *wiphy, 55133afc2167SEmmanuel Grumbach struct ieee80211_channel *rx_channel, 5514dcd6eac1SSimon Wunderlich enum nl80211_bss_scan_width scan_width, 5515dcd6eac1SSimon Wunderlich struct ieee80211_mgmt *mgmt, size_t len, 55166e19bc4bSDmitry Shmidt s32 signal, gfp_t gfp) 55176e19bc4bSDmitry Shmidt { 55186e19bc4bSDmitry Shmidt struct cfg80211_inform_bss data = { 55196e19bc4bSDmitry Shmidt .chan = rx_channel, 55206e19bc4bSDmitry Shmidt .scan_width = scan_width, 55216e19bc4bSDmitry Shmidt .signal = signal, 55226e19bc4bSDmitry Shmidt }; 55236e19bc4bSDmitry Shmidt 55246e19bc4bSDmitry Shmidt return cfg80211_inform_bss_frame_data(wiphy, &data, mgmt, len, gfp); 55256e19bc4bSDmitry Shmidt } 5526dcd6eac1SSimon Wunderlich 5527dcd6eac1SSimon Wunderlich static inline struct cfg80211_bss * __must_check 55282a519311SJohannes Berg cfg80211_inform_bss_frame(struct wiphy *wiphy, 55293afc2167SEmmanuel Grumbach struct ieee80211_channel *rx_channel, 55302a519311SJohannes Berg struct ieee80211_mgmt *mgmt, size_t len, 5531dcd6eac1SSimon Wunderlich s32 signal, gfp_t gfp) 5532dcd6eac1SSimon Wunderlich { 55336e19bc4bSDmitry Shmidt struct cfg80211_inform_bss data = { 55346e19bc4bSDmitry Shmidt .chan = rx_channel, 55356e19bc4bSDmitry Shmidt .scan_width = NL80211_BSS_CHAN_WIDTH_20, 55366e19bc4bSDmitry Shmidt .signal = signal, 55376e19bc4bSDmitry Shmidt }; 55386e19bc4bSDmitry Shmidt 55396e19bc4bSDmitry Shmidt return cfg80211_inform_bss_frame_data(wiphy, &data, mgmt, len, gfp); 5540dcd6eac1SSimon Wunderlich } 55412a519311SJohannes Berg 5542abe37c4bSJohannes Berg /** 55437ece9c37SSara Sharon * cfg80211_gen_new_bssid - generate a nontransmitted BSSID for multi-BSSID 55447ece9c37SSara Sharon * @bssid: transmitter BSSID 55457ece9c37SSara Sharon * @max_bssid: max BSSID indicator, taken from Multiple BSSID element 55467ece9c37SSara Sharon * @mbssid_index: BSSID index, taken from Multiple BSSID index element 55475d4071abSJohannes Berg * @new_bssid: calculated nontransmitted BSSID 55487ece9c37SSara Sharon */ 55497ece9c37SSara Sharon static inline void cfg80211_gen_new_bssid(const u8 *bssid, u8 max_bssid, 55505d4071abSJohannes Berg u8 mbssid_index, u8 *new_bssid) 55517ece9c37SSara Sharon { 55525d4071abSJohannes Berg u64 bssid_u64 = ether_addr_to_u64(bssid); 55535d4071abSJohannes Berg u64 mask = GENMASK_ULL(max_bssid - 1, 0); 55545d4071abSJohannes Berg u64 new_bssid_u64; 55557ece9c37SSara Sharon 55565d4071abSJohannes Berg new_bssid_u64 = bssid_u64 & ~mask; 55577ece9c37SSara Sharon 55585d4071abSJohannes Berg new_bssid_u64 |= ((bssid_u64 & mask) + mbssid_index) & mask; 55597ece9c37SSara Sharon 55605d4071abSJohannes Berg u64_to_ether_addr(new_bssid_u64, new_bssid); 55617ece9c37SSara Sharon } 55627ece9c37SSara Sharon 55637ece9c37SSara Sharon /** 5564f7dacfb1SSara Sharon * cfg80211_is_element_inherited - returns if element ID should be inherited 5565f7dacfb1SSara Sharon * @element: element to check 5566f7dacfb1SSara Sharon * @non_inherit_element: non inheritance element 5567f7dacfb1SSara Sharon */ 5568f7dacfb1SSara Sharon bool cfg80211_is_element_inherited(const struct element *element, 5569f7dacfb1SSara Sharon const struct element *non_inherit_element); 5570f7dacfb1SSara Sharon 5571f7dacfb1SSara Sharon /** 5572fe806e49SSara Sharon * cfg80211_merge_profile - merges a MBSSID profile if it is split between IEs 5573fe806e49SSara Sharon * @ie: ies 5574fe806e49SSara Sharon * @ielen: length of IEs 5575fe806e49SSara Sharon * @mbssid_elem: current MBSSID element 5576fe806e49SSara Sharon * @sub_elem: current MBSSID subelement (profile) 5577fe806e49SSara Sharon * @merged_ie: location of the merged profile 5578fe806e49SSara Sharon * @max_copy_len: max merged profile length 5579fe806e49SSara Sharon */ 5580fe806e49SSara Sharon size_t cfg80211_merge_profile(const u8 *ie, size_t ielen, 5581fe806e49SSara Sharon const struct element *mbssid_elem, 5582fe806e49SSara Sharon const struct element *sub_elem, 55835809a5d5SDan Carpenter u8 *merged_ie, size_t max_copy_len); 5584fe806e49SSara Sharon 5585fe806e49SSara Sharon /** 55865bc8c1f2SJohannes Berg * enum cfg80211_bss_frame_type - frame type that the BSS data came from 55875bc8c1f2SJohannes Berg * @CFG80211_BSS_FTYPE_UNKNOWN: driver doesn't know whether the data is 55885bc8c1f2SJohannes Berg * from a beacon or probe response 55895bc8c1f2SJohannes Berg * @CFG80211_BSS_FTYPE_BEACON: data comes from a beacon 55905bc8c1f2SJohannes Berg * @CFG80211_BSS_FTYPE_PRESP: data comes from a probe response 55915bc8c1f2SJohannes Berg */ 55925bc8c1f2SJohannes Berg enum cfg80211_bss_frame_type { 55935bc8c1f2SJohannes Berg CFG80211_BSS_FTYPE_UNKNOWN, 55945bc8c1f2SJohannes Berg CFG80211_BSS_FTYPE_BEACON, 55955bc8c1f2SJohannes Berg CFG80211_BSS_FTYPE_PRESP, 55965bc8c1f2SJohannes Berg }; 55975bc8c1f2SJohannes Berg 55985bc8c1f2SJohannes Berg /** 55996e19bc4bSDmitry Shmidt * cfg80211_inform_bss_data - inform cfg80211 of a new BSS 5600abe37c4bSJohannes Berg * 5601abe37c4bSJohannes Berg * @wiphy: the wiphy reporting the BSS 56026e19bc4bSDmitry Shmidt * @data: the BSS metadata 56035bc8c1f2SJohannes Berg * @ftype: frame type (if known) 5604abe37c4bSJohannes Berg * @bssid: the BSSID of the BSS 56057b8bcff2SJohannes Berg * @tsf: the TSF sent by the peer in the beacon/probe response (or 0) 5606abe37c4bSJohannes Berg * @capability: the capability field sent by the peer 5607abe37c4bSJohannes Berg * @beacon_interval: the beacon interval announced by the peer 5608abe37c4bSJohannes Berg * @ie: additional IEs sent by the peer 5609abe37c4bSJohannes Berg * @ielen: length of the additional IEs 5610abe37c4bSJohannes Berg * @gfp: context flags 5611abe37c4bSJohannes Berg * 5612abe37c4bSJohannes Berg * This informs cfg80211 that BSS information was found and 5613abe37c4bSJohannes Berg * the BSS should be updated/added. 5614ef100682SJohannes Berg * 56150ae997dcSYacine Belkadi * Return: A referenced struct, must be released with cfg80211_put_bss()! 56160ae997dcSYacine Belkadi * Or %NULL on error. 5617abe37c4bSJohannes Berg */ 5618ef100682SJohannes Berg struct cfg80211_bss * __must_check 56196e19bc4bSDmitry Shmidt cfg80211_inform_bss_data(struct wiphy *wiphy, 56206e19bc4bSDmitry Shmidt struct cfg80211_inform_bss *data, 56216e19bc4bSDmitry Shmidt enum cfg80211_bss_frame_type ftype, 56226e19bc4bSDmitry Shmidt const u8 *bssid, u64 tsf, u16 capability, 56236e19bc4bSDmitry Shmidt u16 beacon_interval, const u8 *ie, size_t ielen, 56246e19bc4bSDmitry Shmidt gfp_t gfp); 56256e19bc4bSDmitry Shmidt 56266e19bc4bSDmitry Shmidt static inline struct cfg80211_bss * __must_check 5627dcd6eac1SSimon Wunderlich cfg80211_inform_bss_width(struct wiphy *wiphy, 56283afc2167SEmmanuel Grumbach struct ieee80211_channel *rx_channel, 5629dcd6eac1SSimon Wunderlich enum nl80211_bss_scan_width scan_width, 56305bc8c1f2SJohannes Berg enum cfg80211_bss_frame_type ftype, 5631dcd6eac1SSimon Wunderlich const u8 *bssid, u64 tsf, u16 capability, 5632dcd6eac1SSimon Wunderlich u16 beacon_interval, const u8 *ie, size_t ielen, 56336e19bc4bSDmitry Shmidt s32 signal, gfp_t gfp) 56346e19bc4bSDmitry Shmidt { 56356e19bc4bSDmitry Shmidt struct cfg80211_inform_bss data = { 56366e19bc4bSDmitry Shmidt .chan = rx_channel, 56376e19bc4bSDmitry Shmidt .scan_width = scan_width, 56386e19bc4bSDmitry Shmidt .signal = signal, 56396e19bc4bSDmitry Shmidt }; 56406e19bc4bSDmitry Shmidt 56416e19bc4bSDmitry Shmidt return cfg80211_inform_bss_data(wiphy, &data, ftype, bssid, tsf, 56426e19bc4bSDmitry Shmidt capability, beacon_interval, ie, ielen, 56436e19bc4bSDmitry Shmidt gfp); 56446e19bc4bSDmitry Shmidt } 5645dcd6eac1SSimon Wunderlich 5646dcd6eac1SSimon Wunderlich static inline struct cfg80211_bss * __must_check 564706aa7afaSJussi Kivilinna cfg80211_inform_bss(struct wiphy *wiphy, 56483afc2167SEmmanuel Grumbach struct ieee80211_channel *rx_channel, 56495bc8c1f2SJohannes Berg enum cfg80211_bss_frame_type ftype, 56507b8bcff2SJohannes Berg const u8 *bssid, u64 tsf, u16 capability, 56517b8bcff2SJohannes Berg u16 beacon_interval, const u8 *ie, size_t ielen, 5652dcd6eac1SSimon Wunderlich s32 signal, gfp_t gfp) 5653dcd6eac1SSimon Wunderlich { 56546e19bc4bSDmitry Shmidt struct cfg80211_inform_bss data = { 56556e19bc4bSDmitry Shmidt .chan = rx_channel, 56566e19bc4bSDmitry Shmidt .scan_width = NL80211_BSS_CHAN_WIDTH_20, 56576e19bc4bSDmitry Shmidt .signal = signal, 56586e19bc4bSDmitry Shmidt }; 56596e19bc4bSDmitry Shmidt 56606e19bc4bSDmitry Shmidt return cfg80211_inform_bss_data(wiphy, &data, ftype, bssid, tsf, 56616e19bc4bSDmitry Shmidt capability, beacon_interval, ie, ielen, 5662dcd6eac1SSimon Wunderlich gfp); 5663dcd6eac1SSimon Wunderlich } 566406aa7afaSJussi Kivilinna 566527548677SJohannes Berg /** 566627548677SJohannes Berg * cfg80211_get_bss - get a BSS reference 566727548677SJohannes Berg * @wiphy: the wiphy this BSS struct belongs to 566827548677SJohannes Berg * @channel: the channel to search on (or %NULL) 566927548677SJohannes Berg * @bssid: the desired BSSID (or %NULL) 567027548677SJohannes Berg * @ssid: the desired SSID (or %NULL) 567127548677SJohannes Berg * @ssid_len: length of the SSID (or 0) 567227548677SJohannes Berg * @bss_type: type of BSS, see &enum ieee80211_bss_type 567327548677SJohannes Berg * @privacy: privacy filter, see &enum ieee80211_privacy 567427548677SJohannes Berg */ 56752a519311SJohannes Berg struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy, 56762a519311SJohannes Berg struct ieee80211_channel *channel, 56772a519311SJohannes Berg const u8 *bssid, 567879420f09SJohannes Berg const u8 *ssid, size_t ssid_len, 56796eb18137SDedy Lansky enum ieee80211_bss_type bss_type, 568027548677SJohannes Berg enum ieee80211_privacy privacy); 568179420f09SJohannes Berg static inline struct cfg80211_bss * 568279420f09SJohannes Berg cfg80211_get_ibss(struct wiphy *wiphy, 568379420f09SJohannes Berg struct ieee80211_channel *channel, 568479420f09SJohannes Berg const u8 *ssid, size_t ssid_len) 568579420f09SJohannes Berg { 568679420f09SJohannes Berg return cfg80211_get_bss(wiphy, channel, NULL, ssid, ssid_len, 56876eb18137SDedy Lansky IEEE80211_BSS_TYPE_IBSS, 56886eb18137SDedy Lansky IEEE80211_PRIVACY_ANY); 568979420f09SJohannes Berg } 569079420f09SJohannes Berg 56914c0c0b75SJohannes Berg /** 56924c0c0b75SJohannes Berg * cfg80211_ref_bss - reference BSS struct 56935b112d3dSJohannes Berg * @wiphy: the wiphy this BSS struct belongs to 56944c0c0b75SJohannes Berg * @bss: the BSS struct to reference 56954c0c0b75SJohannes Berg * 56964c0c0b75SJohannes Berg * Increments the refcount of the given BSS struct. 56974c0c0b75SJohannes Berg */ 56985b112d3dSJohannes Berg void cfg80211_ref_bss(struct wiphy *wiphy, struct cfg80211_bss *bss); 56994c0c0b75SJohannes Berg 57004c0c0b75SJohannes Berg /** 57014c0c0b75SJohannes Berg * cfg80211_put_bss - unref BSS struct 57025b112d3dSJohannes Berg * @wiphy: the wiphy this BSS struct belongs to 57034c0c0b75SJohannes Berg * @bss: the BSS struct 57044c0c0b75SJohannes Berg * 57054c0c0b75SJohannes Berg * Decrements the refcount of the given BSS struct. 57064c0c0b75SJohannes Berg */ 57075b112d3dSJohannes Berg void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *bss); 5708d3236553SJohannes Berg 5709d491af19SJohannes Berg /** 5710d491af19SJohannes Berg * cfg80211_unlink_bss - unlink BSS from internal data structures 5711d491af19SJohannes Berg * @wiphy: the wiphy 5712d491af19SJohannes Berg * @bss: the bss to remove 5713d491af19SJohannes Berg * 5714d491af19SJohannes Berg * This function removes the given BSS from the internal data structures 5715d491af19SJohannes Berg * thereby making it no longer show up in scan results etc. Use this 5716d491af19SJohannes Berg * function when you detect a BSS is gone. Normally BSSes will also time 5717d491af19SJohannes Berg * out, so it is not necessary to use this function at all. 5718d491af19SJohannes Berg */ 5719d491af19SJohannes Berg void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *bss); 5720fee52678SJohannes Berg 5721dcd6eac1SSimon Wunderlich static inline enum nl80211_bss_scan_width 5722dcd6eac1SSimon Wunderlich cfg80211_chandef_to_scan_width(const struct cfg80211_chan_def *chandef) 5723dcd6eac1SSimon Wunderlich { 5724dcd6eac1SSimon Wunderlich switch (chandef->width) { 5725dcd6eac1SSimon Wunderlich case NL80211_CHAN_WIDTH_5: 5726dcd6eac1SSimon Wunderlich return NL80211_BSS_CHAN_WIDTH_5; 5727dcd6eac1SSimon Wunderlich case NL80211_CHAN_WIDTH_10: 5728dcd6eac1SSimon Wunderlich return NL80211_BSS_CHAN_WIDTH_10; 5729dcd6eac1SSimon Wunderlich default: 5730dcd6eac1SSimon Wunderlich return NL80211_BSS_CHAN_WIDTH_20; 5731dcd6eac1SSimon Wunderlich } 5732dcd6eac1SSimon Wunderlich } 5733dcd6eac1SSimon Wunderlich 57346039f6d2SJouni Malinen /** 57356ff57cf8SJohannes Berg * cfg80211_rx_mlme_mgmt - notification of processed MLME management frame 57366039f6d2SJouni Malinen * @dev: network device 57376039f6d2SJouni Malinen * @buf: authentication frame (header + body) 57386039f6d2SJouni Malinen * @len: length of the frame data 57396039f6d2SJouni Malinen * 57406ff57cf8SJohannes Berg * This function is called whenever an authentication, disassociation or 57416ff57cf8SJohannes Berg * deauthentication frame has been received and processed in station mode. 57426ff57cf8SJohannes Berg * After being asked to authenticate via cfg80211_ops::auth() the driver must 57436ff57cf8SJohannes Berg * call either this function or cfg80211_auth_timeout(). 57446ff57cf8SJohannes Berg * After being asked to associate via cfg80211_ops::assoc() the driver must 57456ff57cf8SJohannes Berg * call either this function or cfg80211_auth_timeout(). 57466ff57cf8SJohannes Berg * While connected, the driver must calls this for received and processed 57476ff57cf8SJohannes Berg * disassociation and deauthentication frames. If the frame couldn't be used 57486ff57cf8SJohannes Berg * because it was unprotected, the driver must call the function 57496ff57cf8SJohannes Berg * cfg80211_rx_unprot_mlme_mgmt() instead. 57506ff57cf8SJohannes Berg * 57516ff57cf8SJohannes Berg * This function may sleep. The caller must hold the corresponding wdev's mutex. 57526039f6d2SJouni Malinen */ 57536ff57cf8SJohannes Berg void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len); 57546039f6d2SJouni Malinen 57556039f6d2SJouni Malinen /** 57566ff57cf8SJohannes Berg * cfg80211_auth_timeout - notification of timed out authentication 57571965c853SJouni Malinen * @dev: network device 57581965c853SJouni Malinen * @addr: The MAC address of the device with which the authentication timed out 5759cb0b4bebSJohannes Berg * 57608d61ffa5SJohannes Berg * This function may sleep. The caller must hold the corresponding wdev's 57618d61ffa5SJohannes Berg * mutex. 57621965c853SJouni Malinen */ 57636ff57cf8SJohannes Berg void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr); 57641965c853SJouni Malinen 57651965c853SJouni Malinen /** 57666ff57cf8SJohannes Berg * cfg80211_rx_assoc_resp - notification of processed association response 57676039f6d2SJouni Malinen * @dev: network device 57686ff57cf8SJohannes Berg * @bss: the BSS that association was requested with, ownership of the pointer 57696ff57cf8SJohannes Berg * moves to cfg80211 in this call 57704d9ec73dSJouni Malinen * @buf: (Re)Association Response frame (header + body) 57716039f6d2SJouni Malinen * @len: length of the frame data 5772f438ceb8SEmmanuel Grumbach * @uapsd_queues: bitmap of queues configured for uapsd. Same format 5773f438ceb8SEmmanuel Grumbach * as the AC bitmap in the QoS info field 57744d9ec73dSJouni Malinen * @req_ies: information elements from the (Re)Association Request frame 57754d9ec73dSJouni Malinen * @req_ies_len: length of req_ies data 57766039f6d2SJouni Malinen * 57776ff57cf8SJohannes Berg * After being asked to associate via cfg80211_ops::assoc() the driver must 57786ff57cf8SJohannes Berg * call either this function or cfg80211_auth_timeout(). 57796ff57cf8SJohannes Berg * 57806ff57cf8SJohannes Berg * This function may sleep. The caller must hold the corresponding wdev's mutex. 57816039f6d2SJouni Malinen */ 57826ff57cf8SJohannes Berg void cfg80211_rx_assoc_resp(struct net_device *dev, 57836ff57cf8SJohannes Berg struct cfg80211_bss *bss, 5784b0b6aa2cSEliad Peller const u8 *buf, size_t len, 57854d9ec73dSJouni Malinen int uapsd_queues, 57864d9ec73dSJouni Malinen const u8 *req_ies, size_t req_ies_len); 57876039f6d2SJouni Malinen 57886039f6d2SJouni Malinen /** 57896ff57cf8SJohannes Berg * cfg80211_assoc_timeout - notification of timed out association 57901965c853SJouni Malinen * @dev: network device 5791959867faSJohannes Berg * @bss: The BSS entry with which association timed out. 5792cb0b4bebSJohannes Berg * 57938d61ffa5SJohannes Berg * This function may sleep. The caller must hold the corresponding wdev's mutex. 57941965c853SJouni Malinen */ 5795959867faSJohannes Berg void cfg80211_assoc_timeout(struct net_device *dev, struct cfg80211_bss *bss); 57961965c853SJouni Malinen 57971965c853SJouni Malinen /** 5798e6f462dfSJohannes Berg * cfg80211_abandon_assoc - notify cfg80211 of abandoned association attempt 5799e6f462dfSJohannes Berg * @dev: network device 5800e6f462dfSJohannes Berg * @bss: The BSS entry with which association was abandoned. 5801e6f462dfSJohannes Berg * 5802e6f462dfSJohannes Berg * Call this whenever - for reasons reported through other API, like deauth RX, 5803e6f462dfSJohannes Berg * an association attempt was abandoned. 5804e6f462dfSJohannes Berg * This function may sleep. The caller must hold the corresponding wdev's mutex. 5805e6f462dfSJohannes Berg */ 5806e6f462dfSJohannes Berg void cfg80211_abandon_assoc(struct net_device *dev, struct cfg80211_bss *bss); 5807e6f462dfSJohannes Berg 5808e6f462dfSJohannes Berg /** 58096ff57cf8SJohannes Berg * cfg80211_tx_mlme_mgmt - notification of transmitted deauth/disassoc frame 58106039f6d2SJouni Malinen * @dev: network device 58116ff57cf8SJohannes Berg * @buf: 802.11 frame (header + body) 58126039f6d2SJouni Malinen * @len: length of the frame data 58136039f6d2SJouni Malinen * 58146039f6d2SJouni Malinen * This function is called whenever deauthentication has been processed in 581553b46b84SJouni Malinen * station mode. This includes both received deauthentication frames and 58168d61ffa5SJohannes Berg * locally generated ones. This function may sleep. The caller must hold the 58178d61ffa5SJohannes Berg * corresponding wdev's mutex. 58186039f6d2SJouni Malinen */ 58196ff57cf8SJohannes Berg void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len); 5820ce470613SHolger Schurig 5821ce470613SHolger Schurig /** 58226ff57cf8SJohannes Berg * cfg80211_rx_unprot_mlme_mgmt - notification of unprotected mlme mgmt frame 5823cf4e594eSJouni Malinen * @dev: network device 5824cf4e594eSJouni Malinen * @buf: deauthentication frame (header + body) 5825cf4e594eSJouni Malinen * @len: length of the frame data 5826cf4e594eSJouni Malinen * 58276ff57cf8SJohannes Berg * This function is called whenever a received deauthentication or dissassoc 58286ff57cf8SJohannes Berg * frame has been dropped in station mode because of MFP being used but the 5829cf4e594eSJouni Malinen * frame was not protected. This function may sleep. 5830cf4e594eSJouni Malinen */ 58316ff57cf8SJohannes Berg void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, 58326ff57cf8SJohannes Berg const u8 *buf, size_t len); 5833cf4e594eSJouni Malinen 5834cf4e594eSJouni Malinen /** 5835a3b8b056SJouni Malinen * cfg80211_michael_mic_failure - notification of Michael MIC failure (TKIP) 5836a3b8b056SJouni Malinen * @dev: network device 5837a3b8b056SJouni Malinen * @addr: The source MAC address of the frame 5838a3b8b056SJouni Malinen * @key_type: The key type that the received frame used 5839a66b98dbSArik Nemtsov * @key_id: Key identifier (0..3). Can be -1 if missing. 5840a3b8b056SJouni Malinen * @tsc: The TSC value of the frame that generated the MIC failure (6 octets) 5841e6d6e342SJohannes Berg * @gfp: allocation flags 5842a3b8b056SJouni Malinen * 5843a3b8b056SJouni Malinen * This function is called whenever the local MAC detects a MIC failure in a 5844a3b8b056SJouni Malinen * received frame. This matches with MLME-MICHAELMICFAILURE.indication() 5845a3b8b056SJouni Malinen * primitive. 5846a3b8b056SJouni Malinen */ 5847a3b8b056SJouni Malinen void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr, 5848a3b8b056SJouni Malinen enum nl80211_key_type key_type, int key_id, 5849e6d6e342SJohannes Berg const u8 *tsc, gfp_t gfp); 5850a3b8b056SJouni Malinen 585104a773adSJohannes Berg /** 585204a773adSJohannes Berg * cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS 585304a773adSJohannes Berg * 585404a773adSJohannes Berg * @dev: network device 585504a773adSJohannes Berg * @bssid: the BSSID of the IBSS joined 5856fe94f3a4SAntonio Quartulli * @channel: the channel of the IBSS joined 585704a773adSJohannes Berg * @gfp: allocation flags 585804a773adSJohannes Berg * 585904a773adSJohannes Berg * This function notifies cfg80211 that the device joined an IBSS or 586004a773adSJohannes Berg * switched to a different BSSID. Before this function can be called, 586104a773adSJohannes Berg * either a beacon has to have been received from the IBSS, or one of 586204a773adSJohannes Berg * the cfg80211_inform_bss{,_frame} functions must have been called 586304a773adSJohannes Berg * with the locally generated beacon -- this guarantees that there is 586404a773adSJohannes Berg * always a scan result for this IBSS. cfg80211 will handle the rest. 586504a773adSJohannes Berg */ 5866fe94f3a4SAntonio Quartulli void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, 5867fe94f3a4SAntonio Quartulli struct ieee80211_channel *channel, gfp_t gfp); 586804a773adSJohannes Berg 58691f87f7d3SJohannes Berg /** 5870c93b5e71SJavier Cardona * cfg80211_notify_new_candidate - notify cfg80211 of a new mesh peer candidate 5871c93b5e71SJavier Cardona * 5872c93b5e71SJavier Cardona * @dev: network device 5873c93b5e71SJavier Cardona * @macaddr: the MAC address of the new candidate 5874c93b5e71SJavier Cardona * @ie: information elements advertised by the peer candidate 58755ac4a12dSMatteo Croce * @ie_len: length of the information elements buffer 5876c93b5e71SJavier Cardona * @gfp: allocation flags 5877c93b5e71SJavier Cardona * 5878c93b5e71SJavier Cardona * This function notifies cfg80211 that the mesh peer candidate has been 5879c93b5e71SJavier Cardona * detected, most likely via a beacon or, less likely, via a probe response. 5880c93b5e71SJavier Cardona * cfg80211 then sends a notification to userspace. 5881c93b5e71SJavier Cardona */ 5882c93b5e71SJavier Cardona void cfg80211_notify_new_peer_candidate(struct net_device *dev, 5883ecbc12adSBob Copeland const u8 *macaddr, const u8 *ie, u8 ie_len, 5884ecbc12adSBob Copeland int sig_dbm, gfp_t gfp); 5885c93b5e71SJavier Cardona 5886c93b5e71SJavier Cardona /** 5887d70e9693SJohannes Berg * DOC: RFkill integration 5888d70e9693SJohannes Berg * 5889d70e9693SJohannes Berg * RFkill integration in cfg80211 is almost invisible to drivers, 5890d70e9693SJohannes Berg * as cfg80211 automatically registers an rfkill instance for each 5891d70e9693SJohannes Berg * wireless device it knows about. Soft kill is also translated 5892d70e9693SJohannes Berg * into disconnecting and turning all interfaces off, drivers are 5893d70e9693SJohannes Berg * expected to turn off the device when all interfaces are down. 5894d70e9693SJohannes Berg * 5895d70e9693SJohannes Berg * However, devices may have a hard RFkill line, in which case they 5896d70e9693SJohannes Berg * also need to interact with the rfkill subsystem, via cfg80211. 5897d70e9693SJohannes Berg * They can do this with a few helper functions documented here. 5898d70e9693SJohannes Berg */ 5899d70e9693SJohannes Berg 5900d70e9693SJohannes Berg /** 59011f87f7d3SJohannes Berg * wiphy_rfkill_set_hw_state - notify cfg80211 about hw block state 59021f87f7d3SJohannes Berg * @wiphy: the wiphy 59031f87f7d3SJohannes Berg * @blocked: block status 59041f87f7d3SJohannes Berg */ 59051f87f7d3SJohannes Berg void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked); 59061f87f7d3SJohannes Berg 59071f87f7d3SJohannes Berg /** 59081f87f7d3SJohannes Berg * wiphy_rfkill_start_polling - start polling rfkill 59091f87f7d3SJohannes Berg * @wiphy: the wiphy 59101f87f7d3SJohannes Berg */ 59111f87f7d3SJohannes Berg void wiphy_rfkill_start_polling(struct wiphy *wiphy); 59121f87f7d3SJohannes Berg 59131f87f7d3SJohannes Berg /** 59141f87f7d3SJohannes Berg * wiphy_rfkill_stop_polling - stop polling rfkill 59151f87f7d3SJohannes Berg * @wiphy: the wiphy 59161f87f7d3SJohannes Berg */ 59171f87f7d3SJohannes Berg void wiphy_rfkill_stop_polling(struct wiphy *wiphy); 59181f87f7d3SJohannes Berg 5919ad7e718cSJohannes Berg /** 5920ad7e718cSJohannes Berg * DOC: Vendor commands 5921ad7e718cSJohannes Berg * 5922ad7e718cSJohannes Berg * Occasionally, there are special protocol or firmware features that 5923ad7e718cSJohannes Berg * can't be implemented very openly. For this and similar cases, the 5924ad7e718cSJohannes Berg * vendor command functionality allows implementing the features with 5925ad7e718cSJohannes Berg * (typically closed-source) userspace and firmware, using nl80211 as 5926ad7e718cSJohannes Berg * the configuration mechanism. 5927ad7e718cSJohannes Berg * 5928ad7e718cSJohannes Berg * A driver supporting vendor commands must register them as an array 5929ad7e718cSJohannes Berg * in struct wiphy, with handlers for each one, each command has an 5930ad7e718cSJohannes Berg * OUI and sub command ID to identify it. 5931ad7e718cSJohannes Berg * 5932ad7e718cSJohannes Berg * Note that this feature should not be (ab)used to implement protocol 5933ad7e718cSJohannes Berg * features that could openly be shared across drivers. In particular, 5934ad7e718cSJohannes Berg * it must never be required to use vendor commands to implement any 5935ad7e718cSJohannes Berg * "normal" functionality that higher-level userspace like connection 5936ad7e718cSJohannes Berg * managers etc. need. 5937ad7e718cSJohannes Berg */ 5938ad7e718cSJohannes Berg 5939ad7e718cSJohannes Berg struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 5940ad7e718cSJohannes Berg enum nl80211_commands cmd, 5941ad7e718cSJohannes Berg enum nl80211_attrs attr, 5942ad7e718cSJohannes Berg int approxlen); 5943ad7e718cSJohannes Berg 5944567ffc35SJohannes Berg struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 59456c09e791SAhmad Kholaif struct wireless_dev *wdev, 5946567ffc35SJohannes Berg enum nl80211_commands cmd, 5947567ffc35SJohannes Berg enum nl80211_attrs attr, 594855c1fdf0SJohannes Berg unsigned int portid, 5949567ffc35SJohannes Berg int vendor_event_idx, 5950567ffc35SJohannes Berg int approxlen, gfp_t gfp); 5951567ffc35SJohannes Berg 5952567ffc35SJohannes Berg void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp); 5953567ffc35SJohannes Berg 5954ad7e718cSJohannes Berg /** 5955ad7e718cSJohannes Berg * cfg80211_vendor_cmd_alloc_reply_skb - allocate vendor command reply 5956ad7e718cSJohannes Berg * @wiphy: the wiphy 5957ad7e718cSJohannes Berg * @approxlen: an upper bound of the length of the data that will 5958ad7e718cSJohannes Berg * be put into the skb 5959ad7e718cSJohannes Berg * 5960ad7e718cSJohannes Berg * This function allocates and pre-fills an skb for a reply to 5961ad7e718cSJohannes Berg * a vendor command. Since it is intended for a reply, calling 5962ad7e718cSJohannes Berg * it outside of a vendor command's doit() operation is invalid. 5963ad7e718cSJohannes Berg * 5964ad7e718cSJohannes Berg * The returned skb is pre-filled with some identifying data in 5965ad7e718cSJohannes Berg * a way that any data that is put into the skb (with skb_put(), 5966ad7e718cSJohannes Berg * nla_put() or similar) will end up being within the 5967ad7e718cSJohannes Berg * %NL80211_ATTR_VENDOR_DATA attribute, so all that needs to be done 5968ad7e718cSJohannes Berg * with the skb is adding data for the corresponding userspace tool 5969ad7e718cSJohannes Berg * which can then read that data out of the vendor data attribute. 5970ad7e718cSJohannes Berg * You must not modify the skb in any other way. 5971ad7e718cSJohannes Berg * 5972ad7e718cSJohannes Berg * When done, call cfg80211_vendor_cmd_reply() with the skb and return 5973ad7e718cSJohannes Berg * its error code as the result of the doit() operation. 5974ad7e718cSJohannes Berg * 5975ad7e718cSJohannes Berg * Return: An allocated and pre-filled skb. %NULL if any errors happen. 5976ad7e718cSJohannes Berg */ 5977ad7e718cSJohannes Berg static inline struct sk_buff * 5978ad7e718cSJohannes Berg cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int approxlen) 5979ad7e718cSJohannes Berg { 5980ad7e718cSJohannes Berg return __cfg80211_alloc_reply_skb(wiphy, NL80211_CMD_VENDOR, 5981ad7e718cSJohannes Berg NL80211_ATTR_VENDOR_DATA, approxlen); 5982ad7e718cSJohannes Berg } 5983ad7e718cSJohannes Berg 5984ad7e718cSJohannes Berg /** 5985ad7e718cSJohannes Berg * cfg80211_vendor_cmd_reply - send the reply skb 5986ad7e718cSJohannes Berg * @skb: The skb, must have been allocated with 5987ad7e718cSJohannes Berg * cfg80211_vendor_cmd_alloc_reply_skb() 5988ad7e718cSJohannes Berg * 5989ad7e718cSJohannes Berg * Since calling this function will usually be the last thing 5990ad7e718cSJohannes Berg * before returning from the vendor command doit() you should 5991ad7e718cSJohannes Berg * return the error code. Note that this function consumes the 5992ad7e718cSJohannes Berg * skb regardless of the return value. 5993ad7e718cSJohannes Berg * 5994ad7e718cSJohannes Berg * Return: An error code or 0 on success. 5995ad7e718cSJohannes Berg */ 5996ad7e718cSJohannes Berg int cfg80211_vendor_cmd_reply(struct sk_buff *skb); 5997ad7e718cSJohannes Berg 5998567ffc35SJohannes Berg /** 599955c1fdf0SJohannes Berg * cfg80211_vendor_cmd_get_sender 600055c1fdf0SJohannes Berg * @wiphy: the wiphy 600155c1fdf0SJohannes Berg * 600255c1fdf0SJohannes Berg * Return the current netlink port ID in a vendor command handler. 600355c1fdf0SJohannes Berg * Valid to call only there. 600455c1fdf0SJohannes Berg */ 600555c1fdf0SJohannes Berg unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy); 600655c1fdf0SJohannes Berg 600755c1fdf0SJohannes Berg /** 6008567ffc35SJohannes Berg * cfg80211_vendor_event_alloc - allocate vendor-specific event skb 6009567ffc35SJohannes Berg * @wiphy: the wiphy 60106c09e791SAhmad Kholaif * @wdev: the wireless device 6011567ffc35SJohannes Berg * @event_idx: index of the vendor event in the wiphy's vendor_events 6012567ffc35SJohannes Berg * @approxlen: an upper bound of the length of the data that will 6013567ffc35SJohannes Berg * be put into the skb 6014567ffc35SJohannes Berg * @gfp: allocation flags 6015567ffc35SJohannes Berg * 6016567ffc35SJohannes Berg * This function allocates and pre-fills an skb for an event on the 6017567ffc35SJohannes Berg * vendor-specific multicast group. 6018567ffc35SJohannes Berg * 60196c09e791SAhmad Kholaif * If wdev != NULL, both the ifindex and identifier of the specified 60206c09e791SAhmad Kholaif * wireless device are added to the event message before the vendor data 60216c09e791SAhmad Kholaif * attribute. 60226c09e791SAhmad Kholaif * 6023567ffc35SJohannes Berg * When done filling the skb, call cfg80211_vendor_event() with the 6024567ffc35SJohannes Berg * skb to send the event. 6025567ffc35SJohannes Berg * 6026567ffc35SJohannes Berg * Return: An allocated and pre-filled skb. %NULL if any errors happen. 6027567ffc35SJohannes Berg */ 6028567ffc35SJohannes Berg static inline struct sk_buff * 60296c09e791SAhmad Kholaif cfg80211_vendor_event_alloc(struct wiphy *wiphy, struct wireless_dev *wdev, 60306c09e791SAhmad Kholaif int approxlen, int event_idx, gfp_t gfp) 6031567ffc35SJohannes Berg { 60326c09e791SAhmad Kholaif return __cfg80211_alloc_event_skb(wiphy, wdev, NL80211_CMD_VENDOR, 6033567ffc35SJohannes Berg NL80211_ATTR_VENDOR_DATA, 603455c1fdf0SJohannes Berg 0, event_idx, approxlen, gfp); 603555c1fdf0SJohannes Berg } 603655c1fdf0SJohannes Berg 603755c1fdf0SJohannes Berg /** 603855c1fdf0SJohannes Berg * cfg80211_vendor_event_alloc_ucast - alloc unicast vendor-specific event skb 603955c1fdf0SJohannes Berg * @wiphy: the wiphy 604055c1fdf0SJohannes Berg * @wdev: the wireless device 604155c1fdf0SJohannes Berg * @event_idx: index of the vendor event in the wiphy's vendor_events 604255c1fdf0SJohannes Berg * @portid: port ID of the receiver 604355c1fdf0SJohannes Berg * @approxlen: an upper bound of the length of the data that will 604455c1fdf0SJohannes Berg * be put into the skb 604555c1fdf0SJohannes Berg * @gfp: allocation flags 604655c1fdf0SJohannes Berg * 604755c1fdf0SJohannes Berg * This function allocates and pre-fills an skb for an event to send to 604855c1fdf0SJohannes Berg * a specific (userland) socket. This socket would previously have been 604955c1fdf0SJohannes Berg * obtained by cfg80211_vendor_cmd_get_sender(), and the caller MUST take 605055c1fdf0SJohannes Berg * care to register a netlink notifier to see when the socket closes. 605155c1fdf0SJohannes Berg * 605255c1fdf0SJohannes Berg * If wdev != NULL, both the ifindex and identifier of the specified 605355c1fdf0SJohannes Berg * wireless device are added to the event message before the vendor data 605455c1fdf0SJohannes Berg * attribute. 605555c1fdf0SJohannes Berg * 605655c1fdf0SJohannes Berg * When done filling the skb, call cfg80211_vendor_event() with the 605755c1fdf0SJohannes Berg * skb to send the event. 605855c1fdf0SJohannes Berg * 605955c1fdf0SJohannes Berg * Return: An allocated and pre-filled skb. %NULL if any errors happen. 606055c1fdf0SJohannes Berg */ 606155c1fdf0SJohannes Berg static inline struct sk_buff * 606255c1fdf0SJohannes Berg cfg80211_vendor_event_alloc_ucast(struct wiphy *wiphy, 606355c1fdf0SJohannes Berg struct wireless_dev *wdev, 606455c1fdf0SJohannes Berg unsigned int portid, int approxlen, 606555c1fdf0SJohannes Berg int event_idx, gfp_t gfp) 606655c1fdf0SJohannes Berg { 606755c1fdf0SJohannes Berg return __cfg80211_alloc_event_skb(wiphy, wdev, NL80211_CMD_VENDOR, 606855c1fdf0SJohannes Berg NL80211_ATTR_VENDOR_DATA, 606955c1fdf0SJohannes Berg portid, event_idx, approxlen, gfp); 6070567ffc35SJohannes Berg } 6071567ffc35SJohannes Berg 6072567ffc35SJohannes Berg /** 6073567ffc35SJohannes Berg * cfg80211_vendor_event - send the event 6074567ffc35SJohannes Berg * @skb: The skb, must have been allocated with cfg80211_vendor_event_alloc() 6075567ffc35SJohannes Berg * @gfp: allocation flags 6076567ffc35SJohannes Berg * 6077567ffc35SJohannes Berg * This function sends the given @skb, which must have been allocated 6078567ffc35SJohannes Berg * by cfg80211_vendor_event_alloc(), as an event. It always consumes it. 6079567ffc35SJohannes Berg */ 6080567ffc35SJohannes Berg static inline void cfg80211_vendor_event(struct sk_buff *skb, gfp_t gfp) 6081567ffc35SJohannes Berg { 6082567ffc35SJohannes Berg __cfg80211_send_event_skb(skb, gfp); 6083567ffc35SJohannes Berg } 6084567ffc35SJohannes Berg 6085aff89a9bSJohannes Berg #ifdef CONFIG_NL80211_TESTMODE 6086aff89a9bSJohannes Berg /** 6087d70e9693SJohannes Berg * DOC: Test mode 6088d70e9693SJohannes Berg * 6089d70e9693SJohannes Berg * Test mode is a set of utility functions to allow drivers to 6090d70e9693SJohannes Berg * interact with driver-specific tools to aid, for instance, 6091d70e9693SJohannes Berg * factory programming. 6092d70e9693SJohannes Berg * 6093d70e9693SJohannes Berg * This chapter describes how drivers interact with it, for more 6094d70e9693SJohannes Berg * information see the nl80211 book's chapter on it. 6095d70e9693SJohannes Berg */ 6096d70e9693SJohannes Berg 6097d70e9693SJohannes Berg /** 6098aff89a9bSJohannes Berg * cfg80211_testmode_alloc_reply_skb - allocate testmode reply 6099aff89a9bSJohannes Berg * @wiphy: the wiphy 6100aff89a9bSJohannes Berg * @approxlen: an upper bound of the length of the data that will 6101aff89a9bSJohannes Berg * be put into the skb 6102aff89a9bSJohannes Berg * 6103aff89a9bSJohannes Berg * This function allocates and pre-fills an skb for a reply to 6104aff89a9bSJohannes Berg * the testmode command. Since it is intended for a reply, calling 6105aff89a9bSJohannes Berg * it outside of the @testmode_cmd operation is invalid. 6106aff89a9bSJohannes Berg * 61070ae997dcSYacine Belkadi * The returned skb is pre-filled with the wiphy index and set up in 61080ae997dcSYacine Belkadi * a way that any data that is put into the skb (with skb_put(), 61090ae997dcSYacine Belkadi * nla_put() or similar) will end up being within the 61100ae997dcSYacine Belkadi * %NL80211_ATTR_TESTDATA attribute, so all that needs to be done 61110ae997dcSYacine Belkadi * with the skb is adding data for the corresponding userspace tool 61120ae997dcSYacine Belkadi * which can then read that data out of the testdata attribute. You 61130ae997dcSYacine Belkadi * must not modify the skb in any other way. 6114aff89a9bSJohannes Berg * 6115aff89a9bSJohannes Berg * When done, call cfg80211_testmode_reply() with the skb and return 6116aff89a9bSJohannes Berg * its error code as the result of the @testmode_cmd operation. 61170ae997dcSYacine Belkadi * 61180ae997dcSYacine Belkadi * Return: An allocated and pre-filled skb. %NULL if any errors happen. 6119aff89a9bSJohannes Berg */ 6120ad7e718cSJohannes Berg static inline struct sk_buff * 6121ad7e718cSJohannes Berg cfg80211_testmode_alloc_reply_skb(struct wiphy *wiphy, int approxlen) 6122ad7e718cSJohannes Berg { 6123ad7e718cSJohannes Berg return __cfg80211_alloc_reply_skb(wiphy, NL80211_CMD_TESTMODE, 6124ad7e718cSJohannes Berg NL80211_ATTR_TESTDATA, approxlen); 6125ad7e718cSJohannes Berg } 6126aff89a9bSJohannes Berg 6127aff89a9bSJohannes Berg /** 6128aff89a9bSJohannes Berg * cfg80211_testmode_reply - send the reply skb 6129aff89a9bSJohannes Berg * @skb: The skb, must have been allocated with 6130aff89a9bSJohannes Berg * cfg80211_testmode_alloc_reply_skb() 6131aff89a9bSJohannes Berg * 61320ae997dcSYacine Belkadi * Since calling this function will usually be the last thing 61330ae997dcSYacine Belkadi * before returning from the @testmode_cmd you should return 61340ae997dcSYacine Belkadi * the error code. Note that this function consumes the skb 61350ae997dcSYacine Belkadi * regardless of the return value. 61360ae997dcSYacine Belkadi * 61370ae997dcSYacine Belkadi * Return: An error code or 0 on success. 6138aff89a9bSJohannes Berg */ 6139ad7e718cSJohannes Berg static inline int cfg80211_testmode_reply(struct sk_buff *skb) 6140ad7e718cSJohannes Berg { 6141ad7e718cSJohannes Berg return cfg80211_vendor_cmd_reply(skb); 6142ad7e718cSJohannes Berg } 6143aff89a9bSJohannes Berg 6144aff89a9bSJohannes Berg /** 6145aff89a9bSJohannes Berg * cfg80211_testmode_alloc_event_skb - allocate testmode event 6146aff89a9bSJohannes Berg * @wiphy: the wiphy 6147aff89a9bSJohannes Berg * @approxlen: an upper bound of the length of the data that will 6148aff89a9bSJohannes Berg * be put into the skb 6149aff89a9bSJohannes Berg * @gfp: allocation flags 6150aff89a9bSJohannes Berg * 6151aff89a9bSJohannes Berg * This function allocates and pre-fills an skb for an event on the 6152aff89a9bSJohannes Berg * testmode multicast group. 6153aff89a9bSJohannes Berg * 61540ae997dcSYacine Belkadi * The returned skb is set up in the same way as with 61550ae997dcSYacine Belkadi * cfg80211_testmode_alloc_reply_skb() but prepared for an event. As 61560ae997dcSYacine Belkadi * there, you should simply add data to it that will then end up in the 61570ae997dcSYacine Belkadi * %NL80211_ATTR_TESTDATA attribute. Again, you must not modify the skb 61580ae997dcSYacine Belkadi * in any other way. 6159aff89a9bSJohannes Berg * 6160aff89a9bSJohannes Berg * When done filling the skb, call cfg80211_testmode_event() with the 6161aff89a9bSJohannes Berg * skb to send the event. 61620ae997dcSYacine Belkadi * 61630ae997dcSYacine Belkadi * Return: An allocated and pre-filled skb. %NULL if any errors happen. 6164aff89a9bSJohannes Berg */ 6165567ffc35SJohannes Berg static inline struct sk_buff * 6166567ffc35SJohannes Berg cfg80211_testmode_alloc_event_skb(struct wiphy *wiphy, int approxlen, gfp_t gfp) 6167567ffc35SJohannes Berg { 61686c09e791SAhmad Kholaif return __cfg80211_alloc_event_skb(wiphy, NULL, NL80211_CMD_TESTMODE, 616955c1fdf0SJohannes Berg NL80211_ATTR_TESTDATA, 0, -1, 6170567ffc35SJohannes Berg approxlen, gfp); 6171567ffc35SJohannes Berg } 6172aff89a9bSJohannes Berg 6173aff89a9bSJohannes Berg /** 6174aff89a9bSJohannes Berg * cfg80211_testmode_event - send the event 6175aff89a9bSJohannes Berg * @skb: The skb, must have been allocated with 6176aff89a9bSJohannes Berg * cfg80211_testmode_alloc_event_skb() 6177aff89a9bSJohannes Berg * @gfp: allocation flags 6178aff89a9bSJohannes Berg * 6179aff89a9bSJohannes Berg * This function sends the given @skb, which must have been allocated 6180aff89a9bSJohannes Berg * by cfg80211_testmode_alloc_event_skb(), as an event. It always 6181aff89a9bSJohannes Berg * consumes it. 6182aff89a9bSJohannes Berg */ 6183567ffc35SJohannes Berg static inline void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp) 6184567ffc35SJohannes Berg { 6185567ffc35SJohannes Berg __cfg80211_send_event_skb(skb, gfp); 6186567ffc35SJohannes Berg } 6187aff89a9bSJohannes Berg 6188aff89a9bSJohannes Berg #define CFG80211_TESTMODE_CMD(cmd) .testmode_cmd = (cmd), 618971063f0eSWey-Yi Guy #define CFG80211_TESTMODE_DUMP(cmd) .testmode_dump = (cmd), 6190aff89a9bSJohannes Berg #else 6191aff89a9bSJohannes Berg #define CFG80211_TESTMODE_CMD(cmd) 619271063f0eSWey-Yi Guy #define CFG80211_TESTMODE_DUMP(cmd) 6193aff89a9bSJohannes Berg #endif 6194aff89a9bSJohannes Berg 6195b23aa676SSamuel Ortiz /** 619676804d28SArend Van Spriel * struct cfg80211_fils_resp_params - FILS connection response params 619776804d28SArend Van Spriel * @kek: KEK derived from a successful FILS connection (may be %NULL) 619876804d28SArend Van Spriel * @kek_len: Length of @fils_kek in octets 619976804d28SArend Van Spriel * @update_erp_next_seq_num: Boolean value to specify whether the value in 620076804d28SArend Van Spriel * @erp_next_seq_num is valid. 620176804d28SArend Van Spriel * @erp_next_seq_num: The next sequence number to use in ERP message in 620276804d28SArend Van Spriel * FILS Authentication. This value should be specified irrespective of the 620376804d28SArend Van Spriel * status for a FILS connection. 620476804d28SArend Van Spriel * @pmk: A new PMK if derived from a successful FILS connection (may be %NULL). 620576804d28SArend Van Spriel * @pmk_len: Length of @pmk in octets 620676804d28SArend Van Spriel * @pmkid: A new PMKID if derived from a successful FILS connection or the PMKID 620776804d28SArend Van Spriel * used for this FILS connection (may be %NULL). 620876804d28SArend Van Spriel */ 620976804d28SArend Van Spriel struct cfg80211_fils_resp_params { 621076804d28SArend Van Spriel const u8 *kek; 621176804d28SArend Van Spriel size_t kek_len; 621276804d28SArend Van Spriel bool update_erp_next_seq_num; 621376804d28SArend Van Spriel u16 erp_next_seq_num; 621476804d28SArend Van Spriel const u8 *pmk; 621576804d28SArend Van Spriel size_t pmk_len; 621676804d28SArend Van Spriel const u8 *pmkid; 621776804d28SArend Van Spriel }; 621876804d28SArend Van Spriel 621976804d28SArend Van Spriel /** 62205349a0f7SVidyullatha Kanchanapally * struct cfg80211_connect_resp_params - Connection response params 62215349a0f7SVidyullatha Kanchanapally * @status: Status code, %WLAN_STATUS_SUCCESS for successful connection, use 62225349a0f7SVidyullatha Kanchanapally * %WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you 62235349a0f7SVidyullatha Kanchanapally * the real status code for failures. If this call is used to report a 62245349a0f7SVidyullatha Kanchanapally * failure due to a timeout (e.g., not receiving an Authentication frame 62255349a0f7SVidyullatha Kanchanapally * from the AP) instead of an explicit rejection by the AP, -1 is used to 62265349a0f7SVidyullatha Kanchanapally * indicate that this is a failure, but without a status code. 62275349a0f7SVidyullatha Kanchanapally * @timeout_reason is used to report the reason for the timeout in that 62285349a0f7SVidyullatha Kanchanapally * case. 62295349a0f7SVidyullatha Kanchanapally * @bssid: The BSSID of the AP (may be %NULL) 62305349a0f7SVidyullatha Kanchanapally * @bss: Entry of bss to which STA got connected to, can be obtained through 62315349a0f7SVidyullatha Kanchanapally * cfg80211_get_bss() (may be %NULL). Only one parameter among @bssid and 62325349a0f7SVidyullatha Kanchanapally * @bss needs to be specified. 62335349a0f7SVidyullatha Kanchanapally * @req_ie: Association request IEs (may be %NULL) 62345349a0f7SVidyullatha Kanchanapally * @req_ie_len: Association request IEs length 62355349a0f7SVidyullatha Kanchanapally * @resp_ie: Association response IEs (may be %NULL) 62365349a0f7SVidyullatha Kanchanapally * @resp_ie_len: Association response IEs length 623776804d28SArend Van Spriel * @fils: FILS connection response parameters. 62385349a0f7SVidyullatha Kanchanapally * @timeout_reason: Reason for connection timeout. This is used when the 62395349a0f7SVidyullatha Kanchanapally * connection fails due to a timeout instead of an explicit rejection from 62405349a0f7SVidyullatha Kanchanapally * the AP. %NL80211_TIMEOUT_UNSPECIFIED is used when the timeout reason is 62415349a0f7SVidyullatha Kanchanapally * not known. This value is used only if @status < 0 to indicate that the 62425349a0f7SVidyullatha Kanchanapally * failure is due to a timeout and not due to explicit rejection by the AP. 62435349a0f7SVidyullatha Kanchanapally * This value is ignored in other cases (@status >= 0). 62445349a0f7SVidyullatha Kanchanapally */ 62455349a0f7SVidyullatha Kanchanapally struct cfg80211_connect_resp_params { 62465349a0f7SVidyullatha Kanchanapally int status; 62475349a0f7SVidyullatha Kanchanapally const u8 *bssid; 62485349a0f7SVidyullatha Kanchanapally struct cfg80211_bss *bss; 62495349a0f7SVidyullatha Kanchanapally const u8 *req_ie; 62505349a0f7SVidyullatha Kanchanapally size_t req_ie_len; 62515349a0f7SVidyullatha Kanchanapally const u8 *resp_ie; 62525349a0f7SVidyullatha Kanchanapally size_t resp_ie_len; 625376804d28SArend Van Spriel struct cfg80211_fils_resp_params fils; 62545349a0f7SVidyullatha Kanchanapally enum nl80211_timeout_reason timeout_reason; 62555349a0f7SVidyullatha Kanchanapally }; 62565349a0f7SVidyullatha Kanchanapally 62575349a0f7SVidyullatha Kanchanapally /** 62585349a0f7SVidyullatha Kanchanapally * cfg80211_connect_done - notify cfg80211 of connection result 62595349a0f7SVidyullatha Kanchanapally * 62605349a0f7SVidyullatha Kanchanapally * @dev: network device 62615349a0f7SVidyullatha Kanchanapally * @params: connection response parameters 62625349a0f7SVidyullatha Kanchanapally * @gfp: allocation flags 62635349a0f7SVidyullatha Kanchanapally * 62645349a0f7SVidyullatha Kanchanapally * It should be called by the underlying driver once execution of the connection 62655349a0f7SVidyullatha Kanchanapally * request from connect() has been completed. This is similar to 62665349a0f7SVidyullatha Kanchanapally * cfg80211_connect_bss(), but takes a structure pointer for connection response 62675349a0f7SVidyullatha Kanchanapally * parameters. Only one of the functions among cfg80211_connect_bss(), 62685349a0f7SVidyullatha Kanchanapally * cfg80211_connect_result(), cfg80211_connect_timeout(), 62695349a0f7SVidyullatha Kanchanapally * and cfg80211_connect_done() should be called. 62705349a0f7SVidyullatha Kanchanapally */ 62715349a0f7SVidyullatha Kanchanapally void cfg80211_connect_done(struct net_device *dev, 62725349a0f7SVidyullatha Kanchanapally struct cfg80211_connect_resp_params *params, 62735349a0f7SVidyullatha Kanchanapally gfp_t gfp); 62745349a0f7SVidyullatha Kanchanapally 62755349a0f7SVidyullatha Kanchanapally /** 6276e7054989SKanchanapally, Vidyullatha * cfg80211_connect_bss - notify cfg80211 of connection result 6277e7054989SKanchanapally, Vidyullatha * 6278e7054989SKanchanapally, Vidyullatha * @dev: network device 6279e7054989SKanchanapally, Vidyullatha * @bssid: the BSSID of the AP 6280e7054989SKanchanapally, Vidyullatha * @bss: entry of bss to which STA got connected to, can be obtained 6281e7054989SKanchanapally, Vidyullatha * through cfg80211_get_bss (may be %NULL) 6282e7054989SKanchanapally, Vidyullatha * @req_ie: association request IEs (maybe be %NULL) 6283e7054989SKanchanapally, Vidyullatha * @req_ie_len: association request IEs length 6284e7054989SKanchanapally, Vidyullatha * @resp_ie: association response IEs (may be %NULL) 6285e7054989SKanchanapally, Vidyullatha * @resp_ie_len: assoc response IEs length 6286c88215d7SJouni Malinen * @status: status code, %WLAN_STATUS_SUCCESS for successful connection, use 6287e7054989SKanchanapally, Vidyullatha * %WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you 6288c88215d7SJouni Malinen * the real status code for failures. If this call is used to report a 6289c88215d7SJouni Malinen * failure due to a timeout (e.g., not receiving an Authentication frame 6290c88215d7SJouni Malinen * from the AP) instead of an explicit rejection by the AP, -1 is used to 6291c88215d7SJouni Malinen * indicate that this is a failure, but without a status code. 6292c88215d7SJouni Malinen * @timeout_reason is used to report the reason for the timeout in that 6293c88215d7SJouni Malinen * case. 6294e7054989SKanchanapally, Vidyullatha * @gfp: allocation flags 62953093ebbeSPurushottam Kushwaha * @timeout_reason: reason for connection timeout. This is used when the 62963093ebbeSPurushottam Kushwaha * connection fails due to a timeout instead of an explicit rejection from 62973093ebbeSPurushottam Kushwaha * the AP. %NL80211_TIMEOUT_UNSPECIFIED is used when the timeout reason is 62983093ebbeSPurushottam Kushwaha * not known. This value is used only if @status < 0 to indicate that the 62993093ebbeSPurushottam Kushwaha * failure is due to a timeout and not due to explicit rejection by the AP. 63003093ebbeSPurushottam Kushwaha * This value is ignored in other cases (@status >= 0). 6301e7054989SKanchanapally, Vidyullatha * 6302c88215d7SJouni Malinen * It should be called by the underlying driver once execution of the connection 6303c88215d7SJouni Malinen * request from connect() has been completed. This is similar to 6304c88215d7SJouni Malinen * cfg80211_connect_result(), but with the option of identifying the exact bss 63055349a0f7SVidyullatha Kanchanapally * entry for the connection. Only one of the functions among 63065349a0f7SVidyullatha Kanchanapally * cfg80211_connect_bss(), cfg80211_connect_result(), 63075349a0f7SVidyullatha Kanchanapally * cfg80211_connect_timeout(), and cfg80211_connect_done() should be called. 6308e7054989SKanchanapally, Vidyullatha */ 63095349a0f7SVidyullatha Kanchanapally static inline void 63105349a0f7SVidyullatha Kanchanapally cfg80211_connect_bss(struct net_device *dev, const u8 *bssid, 6311e7054989SKanchanapally, Vidyullatha struct cfg80211_bss *bss, const u8 *req_ie, 6312e7054989SKanchanapally, Vidyullatha size_t req_ie_len, const u8 *resp_ie, 63133093ebbeSPurushottam Kushwaha size_t resp_ie_len, int status, gfp_t gfp, 63145349a0f7SVidyullatha Kanchanapally enum nl80211_timeout_reason timeout_reason) 63155349a0f7SVidyullatha Kanchanapally { 63165349a0f7SVidyullatha Kanchanapally struct cfg80211_connect_resp_params params; 63175349a0f7SVidyullatha Kanchanapally 63185349a0f7SVidyullatha Kanchanapally memset(¶ms, 0, sizeof(params)); 63195349a0f7SVidyullatha Kanchanapally params.status = status; 63205349a0f7SVidyullatha Kanchanapally params.bssid = bssid; 63215349a0f7SVidyullatha Kanchanapally params.bss = bss; 63225349a0f7SVidyullatha Kanchanapally params.req_ie = req_ie; 63235349a0f7SVidyullatha Kanchanapally params.req_ie_len = req_ie_len; 63245349a0f7SVidyullatha Kanchanapally params.resp_ie = resp_ie; 63255349a0f7SVidyullatha Kanchanapally params.resp_ie_len = resp_ie_len; 63265349a0f7SVidyullatha Kanchanapally params.timeout_reason = timeout_reason; 63275349a0f7SVidyullatha Kanchanapally 63285349a0f7SVidyullatha Kanchanapally cfg80211_connect_done(dev, ¶ms, gfp); 63295349a0f7SVidyullatha Kanchanapally } 6330e7054989SKanchanapally, Vidyullatha 6331e7054989SKanchanapally, Vidyullatha /** 6332b23aa676SSamuel Ortiz * cfg80211_connect_result - notify cfg80211 of connection result 6333b23aa676SSamuel Ortiz * 6334b23aa676SSamuel Ortiz * @dev: network device 6335b23aa676SSamuel Ortiz * @bssid: the BSSID of the AP 6336b23aa676SSamuel Ortiz * @req_ie: association request IEs (maybe be %NULL) 6337b23aa676SSamuel Ortiz * @req_ie_len: association request IEs length 6338b23aa676SSamuel Ortiz * @resp_ie: association response IEs (may be %NULL) 6339b23aa676SSamuel Ortiz * @resp_ie_len: assoc response IEs length 6340c88215d7SJouni Malinen * @status: status code, %WLAN_STATUS_SUCCESS for successful connection, use 6341b23aa676SSamuel Ortiz * %WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you 6342b23aa676SSamuel Ortiz * the real status code for failures. 6343b23aa676SSamuel Ortiz * @gfp: allocation flags 6344b23aa676SSamuel Ortiz * 6345c88215d7SJouni Malinen * It should be called by the underlying driver once execution of the connection 6346c88215d7SJouni Malinen * request from connect() has been completed. This is similar to 6347c88215d7SJouni Malinen * cfg80211_connect_bss() which allows the exact bss entry to be specified. Only 63485349a0f7SVidyullatha Kanchanapally * one of the functions among cfg80211_connect_bss(), cfg80211_connect_result(), 63495349a0f7SVidyullatha Kanchanapally * cfg80211_connect_timeout(), and cfg80211_connect_done() should be called. 6350b23aa676SSamuel Ortiz */ 6351e7054989SKanchanapally, Vidyullatha static inline void 6352e7054989SKanchanapally, Vidyullatha cfg80211_connect_result(struct net_device *dev, const u8 *bssid, 6353b23aa676SSamuel Ortiz const u8 *req_ie, size_t req_ie_len, 6354b23aa676SSamuel Ortiz const u8 *resp_ie, size_t resp_ie_len, 6355e7054989SKanchanapally, Vidyullatha u16 status, gfp_t gfp) 6356e7054989SKanchanapally, Vidyullatha { 6357e7054989SKanchanapally, Vidyullatha cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, resp_ie, 63583093ebbeSPurushottam Kushwaha resp_ie_len, status, gfp, 63593093ebbeSPurushottam Kushwaha NL80211_TIMEOUT_UNSPECIFIED); 6360e7054989SKanchanapally, Vidyullatha } 6361b23aa676SSamuel Ortiz 6362b23aa676SSamuel Ortiz /** 6363bf1ecd21SJouni Malinen * cfg80211_connect_timeout - notify cfg80211 of connection timeout 6364bf1ecd21SJouni Malinen * 6365bf1ecd21SJouni Malinen * @dev: network device 6366bf1ecd21SJouni Malinen * @bssid: the BSSID of the AP 6367bf1ecd21SJouni Malinen * @req_ie: association request IEs (maybe be %NULL) 6368bf1ecd21SJouni Malinen * @req_ie_len: association request IEs length 6369bf1ecd21SJouni Malinen * @gfp: allocation flags 63703093ebbeSPurushottam Kushwaha * @timeout_reason: reason for connection timeout. 6371bf1ecd21SJouni Malinen * 6372bf1ecd21SJouni Malinen * It should be called by the underlying driver whenever connect() has failed 6373bf1ecd21SJouni Malinen * in a sequence where no explicit authentication/association rejection was 6374bf1ecd21SJouni Malinen * received from the AP. This could happen, e.g., due to not being able to send 6375bf1ecd21SJouni Malinen * out the Authentication or Association Request frame or timing out while 63765349a0f7SVidyullatha Kanchanapally * waiting for the response. Only one of the functions among 63775349a0f7SVidyullatha Kanchanapally * cfg80211_connect_bss(), cfg80211_connect_result(), 63785349a0f7SVidyullatha Kanchanapally * cfg80211_connect_timeout(), and cfg80211_connect_done() should be called. 6379bf1ecd21SJouni Malinen */ 6380bf1ecd21SJouni Malinen static inline void 6381bf1ecd21SJouni Malinen cfg80211_connect_timeout(struct net_device *dev, const u8 *bssid, 63823093ebbeSPurushottam Kushwaha const u8 *req_ie, size_t req_ie_len, gfp_t gfp, 63833093ebbeSPurushottam Kushwaha enum nl80211_timeout_reason timeout_reason) 6384bf1ecd21SJouni Malinen { 6385bf1ecd21SJouni Malinen cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, NULL, 0, -1, 63863093ebbeSPurushottam Kushwaha gfp, timeout_reason); 6387bf1ecd21SJouni Malinen } 6388bf1ecd21SJouni Malinen 6389bf1ecd21SJouni Malinen /** 639029ce6ecbSAvraham Stern * struct cfg80211_roam_info - driver initiated roaming information 639129ce6ecbSAvraham Stern * 639229ce6ecbSAvraham Stern * @channel: the channel of the new AP 639329ce6ecbSAvraham Stern * @bss: entry of bss to which STA got roamed (may be %NULL if %bssid is set) 639429ce6ecbSAvraham Stern * @bssid: the BSSID of the new AP (may be %NULL if %bss is set) 639529ce6ecbSAvraham Stern * @req_ie: association request IEs (maybe be %NULL) 639629ce6ecbSAvraham Stern * @req_ie_len: association request IEs length 639729ce6ecbSAvraham Stern * @resp_ie: association response IEs (may be %NULL) 639829ce6ecbSAvraham Stern * @resp_ie_len: assoc response IEs length 6399e841b7b1SArend Van Spriel * @fils: FILS related roaming information. 640029ce6ecbSAvraham Stern */ 640129ce6ecbSAvraham Stern struct cfg80211_roam_info { 640229ce6ecbSAvraham Stern struct ieee80211_channel *channel; 640329ce6ecbSAvraham Stern struct cfg80211_bss *bss; 640429ce6ecbSAvraham Stern const u8 *bssid; 640529ce6ecbSAvraham Stern const u8 *req_ie; 640629ce6ecbSAvraham Stern size_t req_ie_len; 640729ce6ecbSAvraham Stern const u8 *resp_ie; 640829ce6ecbSAvraham Stern size_t resp_ie_len; 6409e841b7b1SArend Van Spriel struct cfg80211_fils_resp_params fils; 641029ce6ecbSAvraham Stern }; 641129ce6ecbSAvraham Stern 641229ce6ecbSAvraham Stern /** 6413b23aa676SSamuel Ortiz * cfg80211_roamed - notify cfg80211 of roaming 6414b23aa676SSamuel Ortiz * 6415b23aa676SSamuel Ortiz * @dev: network device 641629ce6ecbSAvraham Stern * @info: information about the new BSS. struct &cfg80211_roam_info. 6417b23aa676SSamuel Ortiz * @gfp: allocation flags 6418b23aa676SSamuel Ortiz * 641929ce6ecbSAvraham Stern * This function may be called with the driver passing either the BSSID of the 642029ce6ecbSAvraham Stern * new AP or passing the bss entry to avoid a race in timeout of the bss entry. 642129ce6ecbSAvraham Stern * It should be called by the underlying driver whenever it roamed from one AP 642229ce6ecbSAvraham Stern * to another while connected. Drivers which have roaming implemented in 642329ce6ecbSAvraham Stern * firmware should pass the bss entry to avoid a race in bss entry timeout where 642429ce6ecbSAvraham Stern * the bss entry of the new AP is seen in the driver, but gets timed out by the 642529ce6ecbSAvraham Stern * time it is accessed in __cfg80211_roamed() due to delay in scheduling 6426adbde344SVasanthakumar Thiagarajan * rdev->event_work. In case of any failures, the reference is released 642729ce6ecbSAvraham Stern * either in cfg80211_roamed() or in __cfg80211_romed(), Otherwise, it will be 642829ce6ecbSAvraham Stern * released while diconneting from the current bss. 6429adbde344SVasanthakumar Thiagarajan */ 643029ce6ecbSAvraham Stern void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info, 643129ce6ecbSAvraham Stern gfp_t gfp); 6432adbde344SVasanthakumar Thiagarajan 6433adbde344SVasanthakumar Thiagarajan /** 6434503c1fb9SAvraham Stern * cfg80211_port_authorized - notify cfg80211 of successful security association 6435503c1fb9SAvraham Stern * 6436503c1fb9SAvraham Stern * @dev: network device 6437503c1fb9SAvraham Stern * @bssid: the BSSID of the AP 6438503c1fb9SAvraham Stern * @gfp: allocation flags 6439503c1fb9SAvraham Stern * 6440503c1fb9SAvraham Stern * This function should be called by a driver that supports 4 way handshake 6441503c1fb9SAvraham Stern * offload after a security association was successfully established (i.e., 6442503c1fb9SAvraham Stern * the 4 way handshake was completed successfully). The call to this function 6443503c1fb9SAvraham Stern * should be preceded with a call to cfg80211_connect_result(), 6444503c1fb9SAvraham Stern * cfg80211_connect_done(), cfg80211_connect_bss() or cfg80211_roamed() to 6445503c1fb9SAvraham Stern * indicate the 802.11 association. 6446503c1fb9SAvraham Stern */ 6447503c1fb9SAvraham Stern void cfg80211_port_authorized(struct net_device *dev, const u8 *bssid, 6448503c1fb9SAvraham Stern gfp_t gfp); 6449503c1fb9SAvraham Stern 6450503c1fb9SAvraham Stern /** 6451b23aa676SSamuel Ortiz * cfg80211_disconnected - notify cfg80211 that connection was dropped 6452b23aa676SSamuel Ortiz * 6453b23aa676SSamuel Ortiz * @dev: network device 6454b23aa676SSamuel Ortiz * @ie: information elements of the deauth/disassoc frame (may be %NULL) 6455b23aa676SSamuel Ortiz * @ie_len: length of IEs 6456b23aa676SSamuel Ortiz * @reason: reason code for the disconnection, set it to 0 if unknown 645780279fb7SJohannes Berg * @locally_generated: disconnection was requested locally 6458b23aa676SSamuel Ortiz * @gfp: allocation flags 6459b23aa676SSamuel Ortiz * 6460b23aa676SSamuel Ortiz * After it calls this function, the driver should enter an idle state 6461b23aa676SSamuel Ortiz * and not try to connect to any AP any more. 6462b23aa676SSamuel Ortiz */ 6463b23aa676SSamuel Ortiz void cfg80211_disconnected(struct net_device *dev, u16 reason, 646480279fb7SJohannes Berg const u8 *ie, size_t ie_len, 646580279fb7SJohannes Berg bool locally_generated, gfp_t gfp); 6466b23aa676SSamuel Ortiz 64679588bbd5SJouni Malinen /** 64689588bbd5SJouni Malinen * cfg80211_ready_on_channel - notification of remain_on_channel start 646971bbc994SJohannes Berg * @wdev: wireless device 64709588bbd5SJouni Malinen * @cookie: the request cookie 64719588bbd5SJouni Malinen * @chan: The current channel (from remain_on_channel request) 64729588bbd5SJouni Malinen * @duration: Duration in milliseconds that the driver intents to remain on the 64739588bbd5SJouni Malinen * channel 64749588bbd5SJouni Malinen * @gfp: allocation flags 64759588bbd5SJouni Malinen */ 647671bbc994SJohannes Berg void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 64779588bbd5SJouni Malinen struct ieee80211_channel *chan, 64789588bbd5SJouni Malinen unsigned int duration, gfp_t gfp); 64799588bbd5SJouni Malinen 64809588bbd5SJouni Malinen /** 64819588bbd5SJouni Malinen * cfg80211_remain_on_channel_expired - remain_on_channel duration expired 648271bbc994SJohannes Berg * @wdev: wireless device 64839588bbd5SJouni Malinen * @cookie: the request cookie 64849588bbd5SJouni Malinen * @chan: The current channel (from remain_on_channel request) 64859588bbd5SJouni Malinen * @gfp: allocation flags 64869588bbd5SJouni Malinen */ 648771bbc994SJohannes Berg void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 64889588bbd5SJouni Malinen struct ieee80211_channel *chan, 64899588bbd5SJouni Malinen gfp_t gfp); 6490b23aa676SSamuel Ortiz 64918689c051SArend van Spriel /** 64928689c051SArend van Spriel * cfg80211_sinfo_alloc_tid_stats - allocate per-tid statistics. 64938689c051SArend van Spriel * 64948689c051SArend van Spriel * @sinfo: the station information 64958689c051SArend van Spriel * @gfp: allocation flags 64968689c051SArend van Spriel */ 64978689c051SArend van Spriel int cfg80211_sinfo_alloc_tid_stats(struct station_info *sinfo, gfp_t gfp); 649898b62183SJohannes Berg 649998b62183SJohannes Berg /** 65007ea3e110SJohannes Berg * cfg80211_sinfo_release_content - release contents of station info 65017ea3e110SJohannes Berg * @sinfo: the station information 65027ea3e110SJohannes Berg * 65037ea3e110SJohannes Berg * Releases any potentially allocated sub-information of the station 65047ea3e110SJohannes Berg * information, but not the struct itself (since it's typically on 65057ea3e110SJohannes Berg * the stack.) 65067ea3e110SJohannes Berg */ 65077ea3e110SJohannes Berg static inline void cfg80211_sinfo_release_content(struct station_info *sinfo) 65087ea3e110SJohannes Berg { 65097ea3e110SJohannes Berg kfree(sinfo->pertid); 65107ea3e110SJohannes Berg } 65117ea3e110SJohannes Berg 65127ea3e110SJohannes Berg /** 651398b62183SJohannes Berg * cfg80211_new_sta - notify userspace about station 651498b62183SJohannes Berg * 651598b62183SJohannes Berg * @dev: the netdev 651698b62183SJohannes Berg * @mac_addr: the station's address 651798b62183SJohannes Berg * @sinfo: the station information 651898b62183SJohannes Berg * @gfp: allocation flags 651998b62183SJohannes Berg */ 652098b62183SJohannes Berg void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, 652198b62183SJohannes Berg struct station_info *sinfo, gfp_t gfp); 652298b62183SJohannes Berg 6523026331c4SJouni Malinen /** 6524cf5ead82SJohannes Berg * cfg80211_del_sta_sinfo - notify userspace about deletion of a station 6525cf5ead82SJohannes Berg * @dev: the netdev 6526cf5ead82SJohannes Berg * @mac_addr: the station's address 6527cf5ead82SJohannes Berg * @sinfo: the station information/statistics 6528cf5ead82SJohannes Berg * @gfp: allocation flags 6529cf5ead82SJohannes Berg */ 6530cf5ead82SJohannes Berg void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr, 6531cf5ead82SJohannes Berg struct station_info *sinfo, gfp_t gfp); 6532cf5ead82SJohannes Berg 6533cf5ead82SJohannes Berg /** 6534ec15e68bSJouni Malinen * cfg80211_del_sta - notify userspace about deletion of a station 6535ec15e68bSJouni Malinen * 6536ec15e68bSJouni Malinen * @dev: the netdev 6537ec15e68bSJouni Malinen * @mac_addr: the station's address 6538ec15e68bSJouni Malinen * @gfp: allocation flags 6539ec15e68bSJouni Malinen */ 6540cf5ead82SJohannes Berg static inline void cfg80211_del_sta(struct net_device *dev, 6541cf5ead82SJohannes Berg const u8 *mac_addr, gfp_t gfp) 6542cf5ead82SJohannes Berg { 6543cf5ead82SJohannes Berg cfg80211_del_sta_sinfo(dev, mac_addr, NULL, gfp); 6544cf5ead82SJohannes Berg } 6545ec15e68bSJouni Malinen 6546ec15e68bSJouni Malinen /** 6547ed44a951SPandiyarajan Pitchaimuthu * cfg80211_conn_failed - connection request failed notification 6548ed44a951SPandiyarajan Pitchaimuthu * 6549ed44a951SPandiyarajan Pitchaimuthu * @dev: the netdev 6550ed44a951SPandiyarajan Pitchaimuthu * @mac_addr: the station's address 6551ed44a951SPandiyarajan Pitchaimuthu * @reason: the reason for connection failure 6552ed44a951SPandiyarajan Pitchaimuthu * @gfp: allocation flags 6553ed44a951SPandiyarajan Pitchaimuthu * 6554ed44a951SPandiyarajan Pitchaimuthu * Whenever a station tries to connect to an AP and if the station 6555ed44a951SPandiyarajan Pitchaimuthu * could not connect to the AP as the AP has rejected the connection 6556ed44a951SPandiyarajan Pitchaimuthu * for some reasons, this function is called. 6557ed44a951SPandiyarajan Pitchaimuthu * 6558ed44a951SPandiyarajan Pitchaimuthu * The reason for connection failure can be any of the value from 6559ed44a951SPandiyarajan Pitchaimuthu * nl80211_connect_failed_reason enum 6560ed44a951SPandiyarajan Pitchaimuthu */ 6561ed44a951SPandiyarajan Pitchaimuthu void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 6562ed44a951SPandiyarajan Pitchaimuthu enum nl80211_connect_failed_reason reason, 6563ed44a951SPandiyarajan Pitchaimuthu gfp_t gfp); 6564ed44a951SPandiyarajan Pitchaimuthu 6565ed44a951SPandiyarajan Pitchaimuthu /** 65662e161f78SJohannes Berg * cfg80211_rx_mgmt - notification of received, unprocessed management frame 656771bbc994SJohannes Berg * @wdev: wireless device receiving the frame 6568026331c4SJouni Malinen * @freq: Frequency on which the frame was received in MHz 65696c2fb1e6SSergey Matyukevich * @sig_dbm: signal strength in dBm, or 0 if unknown 65702e161f78SJohannes Berg * @buf: Management frame (header + body) 6571026331c4SJouni Malinen * @len: length of the frame data 657219504cf5SVladimir Kondratiev * @flags: flags, as defined in enum nl80211_rxmgmt_flags 65732e161f78SJohannes Berg * 65740ae997dcSYacine Belkadi * This function is called whenever an Action frame is received for a station 65750ae997dcSYacine Belkadi * mode interface, but is not processed in kernel. 65760ae997dcSYacine Belkadi * 65770ae997dcSYacine Belkadi * Return: %true if a user space application has registered for this frame. 65782e161f78SJohannes Berg * For action frames, that makes it responsible for rejecting unrecognized 65792e161f78SJohannes Berg * action frames; %false otherwise, in which case for action frames the 65802e161f78SJohannes Berg * driver is responsible for rejecting the frame. 6581026331c4SJouni Malinen */ 658271bbc994SJohannes Berg bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm, 6583970fdfa8SVladimir Kondratiev const u8 *buf, size_t len, u32 flags); 6584026331c4SJouni Malinen 6585026331c4SJouni Malinen /** 65862e161f78SJohannes Berg * cfg80211_mgmt_tx_status - notification of TX status for management frame 658771bbc994SJohannes Berg * @wdev: wireless device receiving the frame 65882e161f78SJohannes Berg * @cookie: Cookie returned by cfg80211_ops::mgmt_tx() 65892e161f78SJohannes Berg * @buf: Management frame (header + body) 6590026331c4SJouni Malinen * @len: length of the frame data 6591026331c4SJouni Malinen * @ack: Whether frame was acknowledged 6592026331c4SJouni Malinen * @gfp: context flags 6593026331c4SJouni Malinen * 65942e161f78SJohannes Berg * This function is called whenever a management frame was requested to be 65952e161f78SJohannes Berg * transmitted with cfg80211_ops::mgmt_tx() to report the TX status of the 6596026331c4SJouni Malinen * transmission attempt. 6597026331c4SJouni Malinen */ 659871bbc994SJohannes Berg void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie, 6599026331c4SJouni Malinen const u8 *buf, size_t len, bool ack, gfp_t gfp); 6600026331c4SJouni Malinen 6601d6dc1a38SJuuso Oikarinen 6602d6dc1a38SJuuso Oikarinen /** 66036a671a50SDenis Kenzior * cfg80211_rx_control_port - notification about a received control port frame 66046a671a50SDenis Kenzior * @dev: The device the frame matched to 6605a948f713SDenis Kenzior * @skb: The skbuf with the control port frame. It is assumed that the skbuf 6606a948f713SDenis Kenzior * is 802.3 formatted (with 802.3 header). The skb can be non-linear. 6607a948f713SDenis Kenzior * This function does not take ownership of the skb, so the caller is 6608a948f713SDenis Kenzior * responsible for any cleanup. The caller must also ensure that 6609a948f713SDenis Kenzior * skb->protocol is set appropriately. 66106a671a50SDenis Kenzior * @unencrypted: Whether the frame was received unencrypted 66116a671a50SDenis Kenzior * 66126a671a50SDenis Kenzior * This function is used to inform userspace about a received control port 66136a671a50SDenis Kenzior * frame. It should only be used if userspace indicated it wants to receive 66146a671a50SDenis Kenzior * control port frames over nl80211. 66156a671a50SDenis Kenzior * 66166a671a50SDenis Kenzior * The frame is the data portion of the 802.3 or 802.11 data frame with all 66176a671a50SDenis Kenzior * network layer headers removed (e.g. the raw EAPoL frame). 66186a671a50SDenis Kenzior * 66196a671a50SDenis Kenzior * Return: %true if the frame was passed to userspace 66206a671a50SDenis Kenzior */ 66216a671a50SDenis Kenzior bool cfg80211_rx_control_port(struct net_device *dev, 6622a948f713SDenis Kenzior struct sk_buff *skb, bool unencrypted); 66236a671a50SDenis Kenzior 66246a671a50SDenis Kenzior /** 6625d6dc1a38SJuuso Oikarinen * cfg80211_cqm_rssi_notify - connection quality monitoring rssi event 6626d6dc1a38SJuuso Oikarinen * @dev: network device 6627d6dc1a38SJuuso Oikarinen * @rssi_event: the triggered RSSI event 6628bee427b8SAndrzej Zaborowski * @rssi_level: new RSSI level value or 0 if not available 6629d6dc1a38SJuuso Oikarinen * @gfp: context flags 6630d6dc1a38SJuuso Oikarinen * 6631d6dc1a38SJuuso Oikarinen * This function is called when a configured connection quality monitoring 6632d6dc1a38SJuuso Oikarinen * rssi threshold reached event occurs. 6633d6dc1a38SJuuso Oikarinen */ 6634d6dc1a38SJuuso Oikarinen void cfg80211_cqm_rssi_notify(struct net_device *dev, 6635d6dc1a38SJuuso Oikarinen enum nl80211_cqm_rssi_threshold_event rssi_event, 6636bee427b8SAndrzej Zaborowski s32 rssi_level, gfp_t gfp); 6637d6dc1a38SJuuso Oikarinen 6638c063dbf5SJohannes Berg /** 6639c063dbf5SJohannes Berg * cfg80211_cqm_pktloss_notify - notify userspace about packetloss to peer 6640c063dbf5SJohannes Berg * @dev: network device 6641c063dbf5SJohannes Berg * @peer: peer's MAC address 6642c063dbf5SJohannes Berg * @num_packets: how many packets were lost -- should be a fixed threshold 6643c063dbf5SJohannes Berg * but probably no less than maybe 50, or maybe a throughput dependent 6644c063dbf5SJohannes Berg * threshold (to account for temporary interference) 6645c063dbf5SJohannes Berg * @gfp: context flags 6646c063dbf5SJohannes Berg */ 6647c063dbf5SJohannes Berg void cfg80211_cqm_pktloss_notify(struct net_device *dev, 6648c063dbf5SJohannes Berg const u8 *peer, u32 num_packets, gfp_t gfp); 6649c063dbf5SJohannes Berg 6650e5497d76SJohannes Berg /** 665184f10708SThomas Pedersen * cfg80211_cqm_txe_notify - TX error rate event 665284f10708SThomas Pedersen * @dev: network device 665384f10708SThomas Pedersen * @peer: peer's MAC address 665484f10708SThomas Pedersen * @num_packets: how many packets were lost 665584f10708SThomas Pedersen * @rate: % of packets which failed transmission 665684f10708SThomas Pedersen * @intvl: interval (in s) over which the TX failure threshold was breached. 665784f10708SThomas Pedersen * @gfp: context flags 665884f10708SThomas Pedersen * 665984f10708SThomas Pedersen * Notify userspace when configured % TX failures over number of packets in a 666084f10708SThomas Pedersen * given interval is exceeded. 666184f10708SThomas Pedersen */ 666284f10708SThomas Pedersen void cfg80211_cqm_txe_notify(struct net_device *dev, const u8 *peer, 666384f10708SThomas Pedersen u32 num_packets, u32 rate, u32 intvl, gfp_t gfp); 666484f10708SThomas Pedersen 666584f10708SThomas Pedersen /** 666698f03342SJohannes Berg * cfg80211_cqm_beacon_loss_notify - beacon loss event 666798f03342SJohannes Berg * @dev: network device 666898f03342SJohannes Berg * @gfp: context flags 666998f03342SJohannes Berg * 667098f03342SJohannes Berg * Notify userspace about beacon loss from the connected AP. 667198f03342SJohannes Berg */ 667298f03342SJohannes Berg void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp); 667398f03342SJohannes Berg 667498f03342SJohannes Berg /** 66755b97f49dSJohannes Berg * cfg80211_radar_event - radar detection event 66765b97f49dSJohannes Berg * @wiphy: the wiphy 66775b97f49dSJohannes Berg * @chandef: chandef for the current channel 66785b97f49dSJohannes Berg * @gfp: context flags 66795b97f49dSJohannes Berg * 66805b97f49dSJohannes Berg * This function is called when a radar is detected on the current chanenl. 66815b97f49dSJohannes Berg */ 66825b97f49dSJohannes Berg void cfg80211_radar_event(struct wiphy *wiphy, 66835b97f49dSJohannes Berg struct cfg80211_chan_def *chandef, gfp_t gfp); 66845b97f49dSJohannes Berg 66855b97f49dSJohannes Berg /** 6686466b9936Stamizhr@codeaurora.org * cfg80211_sta_opmode_change_notify - STA's ht/vht operation mode change event 6687466b9936Stamizhr@codeaurora.org * @dev: network device 6688466b9936Stamizhr@codeaurora.org * @mac: MAC address of a station which opmode got modified 6689466b9936Stamizhr@codeaurora.org * @sta_opmode: station's current opmode value 6690466b9936Stamizhr@codeaurora.org * @gfp: context flags 6691466b9936Stamizhr@codeaurora.org * 6692466b9936Stamizhr@codeaurora.org * Driver should call this function when station's opmode modified via action 6693466b9936Stamizhr@codeaurora.org * frame. 6694466b9936Stamizhr@codeaurora.org */ 6695466b9936Stamizhr@codeaurora.org void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 6696466b9936Stamizhr@codeaurora.org struct sta_opmode_info *sta_opmode, 6697466b9936Stamizhr@codeaurora.org gfp_t gfp); 6698466b9936Stamizhr@codeaurora.org 6699466b9936Stamizhr@codeaurora.org /** 67005b97f49dSJohannes Berg * cfg80211_cac_event - Channel availability check (CAC) event 67015b97f49dSJohannes Berg * @netdev: network device 67025b97f49dSJohannes Berg * @chandef: chandef for the current channel 67035b97f49dSJohannes Berg * @event: type of event 67045b97f49dSJohannes Berg * @gfp: context flags 67055b97f49dSJohannes Berg * 67065b97f49dSJohannes Berg * This function is called when a Channel availability check (CAC) is finished 67075b97f49dSJohannes Berg * or aborted. This must be called to notify the completion of a CAC process, 67085b97f49dSJohannes Berg * also by full-MAC drivers. 67095b97f49dSJohannes Berg */ 67105b97f49dSJohannes Berg void cfg80211_cac_event(struct net_device *netdev, 67115b97f49dSJohannes Berg const struct cfg80211_chan_def *chandef, 67125b97f49dSJohannes Berg enum nl80211_radar_event event, gfp_t gfp); 67135b97f49dSJohannes Berg 67145b97f49dSJohannes Berg 67155b97f49dSJohannes Berg /** 6716e5497d76SJohannes Berg * cfg80211_gtk_rekey_notify - notify userspace about driver rekeying 6717e5497d76SJohannes Berg * @dev: network device 6718e5497d76SJohannes Berg * @bssid: BSSID of AP (to avoid races) 6719e5497d76SJohannes Berg * @replay_ctr: new replay counter 6720af71ff85SJohannes Berg * @gfp: allocation flags 6721e5497d76SJohannes Berg */ 6722e5497d76SJohannes Berg void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 6723e5497d76SJohannes Berg const u8 *replay_ctr, gfp_t gfp); 6724e5497d76SJohannes Berg 6725c9df56b4SJouni Malinen /** 6726c9df56b4SJouni Malinen * cfg80211_pmksa_candidate_notify - notify about PMKSA caching candidate 6727c9df56b4SJouni Malinen * @dev: network device 6728c9df56b4SJouni Malinen * @index: candidate index (the smaller the index, the higher the priority) 6729c9df56b4SJouni Malinen * @bssid: BSSID of AP 6730c9df56b4SJouni Malinen * @preauth: Whether AP advertises support for RSN pre-authentication 6731c9df56b4SJouni Malinen * @gfp: allocation flags 6732c9df56b4SJouni Malinen */ 6733c9df56b4SJouni Malinen void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 6734c9df56b4SJouni Malinen const u8 *bssid, bool preauth, gfp_t gfp); 6735c9df56b4SJouni Malinen 673628946da7SJohannes Berg /** 673728946da7SJohannes Berg * cfg80211_rx_spurious_frame - inform userspace about a spurious frame 673828946da7SJohannes Berg * @dev: The device the frame matched to 673928946da7SJohannes Berg * @addr: the transmitter address 674028946da7SJohannes Berg * @gfp: context flags 674128946da7SJohannes Berg * 674228946da7SJohannes Berg * This function is used in AP mode (only!) to inform userspace that 674328946da7SJohannes Berg * a spurious class 3 frame was received, to be able to deauth the 674428946da7SJohannes Berg * sender. 67450ae997dcSYacine Belkadi * Return: %true if the frame was passed to userspace (or this failed 674628946da7SJohannes Berg * for a reason other than not having a subscription.) 674728946da7SJohannes Berg */ 674828946da7SJohannes Berg bool cfg80211_rx_spurious_frame(struct net_device *dev, 674928946da7SJohannes Berg const u8 *addr, gfp_t gfp); 675028946da7SJohannes Berg 67517f6cf311SJohannes Berg /** 6752b92ab5d8SJohannes Berg * cfg80211_rx_unexpected_4addr_frame - inform about unexpected WDS frame 6753b92ab5d8SJohannes Berg * @dev: The device the frame matched to 6754b92ab5d8SJohannes Berg * @addr: the transmitter address 6755b92ab5d8SJohannes Berg * @gfp: context flags 6756b92ab5d8SJohannes Berg * 6757b92ab5d8SJohannes Berg * This function is used in AP mode (only!) to inform userspace that 6758b92ab5d8SJohannes Berg * an associated station sent a 4addr frame but that wasn't expected. 6759b92ab5d8SJohannes Berg * It is allowed and desirable to send this event only once for each 6760b92ab5d8SJohannes Berg * station to avoid event flooding. 67610ae997dcSYacine Belkadi * Return: %true if the frame was passed to userspace (or this failed 6762b92ab5d8SJohannes Berg * for a reason other than not having a subscription.) 6763b92ab5d8SJohannes Berg */ 6764b92ab5d8SJohannes Berg bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, 6765b92ab5d8SJohannes Berg const u8 *addr, gfp_t gfp); 6766b92ab5d8SJohannes Berg 6767b92ab5d8SJohannes Berg /** 67687f6cf311SJohannes Berg * cfg80211_probe_status - notify userspace about probe status 67697f6cf311SJohannes Berg * @dev: the device the probe was sent on 67707f6cf311SJohannes Berg * @addr: the address of the peer 67717f6cf311SJohannes Berg * @cookie: the cookie filled in @probe_client previously 67727f6cf311SJohannes Berg * @acked: indicates whether probe was acked or not 6773c4b50cd3SVenkateswara Naralasetty * @ack_signal: signal strength (in dBm) of the ACK frame. 6774c4b50cd3SVenkateswara Naralasetty * @is_valid_ack_signal: indicates the ack_signal is valid or not. 67757f6cf311SJohannes Berg * @gfp: allocation flags 67767f6cf311SJohannes Berg */ 67777f6cf311SJohannes Berg void cfg80211_probe_status(struct net_device *dev, const u8 *addr, 6778c4b50cd3SVenkateswara Naralasetty u64 cookie, bool acked, s32 ack_signal, 6779c4b50cd3SVenkateswara Naralasetty bool is_valid_ack_signal, gfp_t gfp); 67807f6cf311SJohannes Berg 67815e760230SJohannes Berg /** 67825e760230SJohannes Berg * cfg80211_report_obss_beacon - report beacon from other APs 67835e760230SJohannes Berg * @wiphy: The wiphy that received the beacon 67845e760230SJohannes Berg * @frame: the frame 67855e760230SJohannes Berg * @len: length of the frame 67865e760230SJohannes Berg * @freq: frequency the frame was received on 67876c2fb1e6SSergey Matyukevich * @sig_dbm: signal strength in dBm, or 0 if unknown 67885e760230SJohannes Berg * 67895e760230SJohannes Berg * Use this function to report to userspace when a beacon was 67905e760230SJohannes Berg * received. It is not useful to call this when there is no 67915e760230SJohannes Berg * netdev that is in AP/GO mode. 67925e760230SJohannes Berg */ 67935e760230SJohannes Berg void cfg80211_report_obss_beacon(struct wiphy *wiphy, 67945e760230SJohannes Berg const u8 *frame, size_t len, 679537c73b5fSBen Greear int freq, int sig_dbm); 67965e760230SJohannes Berg 6797d58e7e37SJohannes Berg /** 6798683b6d3bSJohannes Berg * cfg80211_reg_can_beacon - check if beaconing is allowed 679954858ee5SAlexander Simon * @wiphy: the wiphy 6800683b6d3bSJohannes Berg * @chandef: the channel definition 6801174e0cd2SIlan Peer * @iftype: interface type 6802d58e7e37SJohannes Berg * 68030ae997dcSYacine Belkadi * Return: %true if there is no secondary channel or the secondary channel(s) 68040ae997dcSYacine Belkadi * can be used for beaconing (i.e. is not a radar channel etc.) 680554858ee5SAlexander Simon */ 6806683b6d3bSJohannes Berg bool cfg80211_reg_can_beacon(struct wiphy *wiphy, 6807174e0cd2SIlan Peer struct cfg80211_chan_def *chandef, 6808174e0cd2SIlan Peer enum nl80211_iftype iftype); 680954858ee5SAlexander Simon 6810923b352fSArik Nemtsov /** 6811923b352fSArik Nemtsov * cfg80211_reg_can_beacon_relax - check if beaconing is allowed with relaxation 6812923b352fSArik Nemtsov * @wiphy: the wiphy 6813923b352fSArik Nemtsov * @chandef: the channel definition 6814923b352fSArik Nemtsov * @iftype: interface type 6815923b352fSArik Nemtsov * 6816923b352fSArik Nemtsov * Return: %true if there is no secondary channel or the secondary channel(s) 6817923b352fSArik Nemtsov * can be used for beaconing (i.e. is not a radar channel etc.). This version 6818923b352fSArik Nemtsov * also checks if IR-relaxation conditions apply, to allow beaconing under 6819923b352fSArik Nemtsov * more permissive conditions. 6820923b352fSArik Nemtsov * 6821923b352fSArik Nemtsov * Requires the RTNL to be held. 6822923b352fSArik Nemtsov */ 6823923b352fSArik Nemtsov bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy, 6824923b352fSArik Nemtsov struct cfg80211_chan_def *chandef, 6825923b352fSArik Nemtsov enum nl80211_iftype iftype); 6826923b352fSArik Nemtsov 68278097e149SThomas Pedersen /* 68285314526bSThomas Pedersen * cfg80211_ch_switch_notify - update wdev channel and notify userspace 68295314526bSThomas Pedersen * @dev: the device which switched channels 6830683b6d3bSJohannes Berg * @chandef: the new channel definition 68315314526bSThomas Pedersen * 6832e487eaebSSimon Wunderlich * Caller must acquire wdev_lock, therefore must only be called from sleepable 6833e487eaebSSimon Wunderlich * driver context! 68345314526bSThomas Pedersen */ 6835683b6d3bSJohannes Berg void cfg80211_ch_switch_notify(struct net_device *dev, 6836683b6d3bSJohannes Berg struct cfg80211_chan_def *chandef); 68375314526bSThomas Pedersen 6838f8d7552eSLuciano Coelho /* 6839f8d7552eSLuciano Coelho * cfg80211_ch_switch_started_notify - notify channel switch start 6840f8d7552eSLuciano Coelho * @dev: the device on which the channel switch started 6841f8d7552eSLuciano Coelho * @chandef: the future channel definition 6842f8d7552eSLuciano Coelho * @count: the number of TBTTs until the channel switch happens 6843f8d7552eSLuciano Coelho * 6844f8d7552eSLuciano Coelho * Inform the userspace about the channel switch that has just 6845f8d7552eSLuciano Coelho * started, so that it can take appropriate actions (eg. starting 6846f8d7552eSLuciano Coelho * channel switch on other vifs), if necessary. 6847f8d7552eSLuciano Coelho */ 6848f8d7552eSLuciano Coelho void cfg80211_ch_switch_started_notify(struct net_device *dev, 6849f8d7552eSLuciano Coelho struct cfg80211_chan_def *chandef, 6850f8d7552eSLuciano Coelho u8 count); 6851f8d7552eSLuciano Coelho 68521ce3e82bSJohannes Berg /** 68531ce3e82bSJohannes Berg * ieee80211_operating_class_to_band - convert operating class to band 68541ce3e82bSJohannes Berg * 68551ce3e82bSJohannes Berg * @operating_class: the operating class to convert 68561ce3e82bSJohannes Berg * @band: band pointer to fill 68571ce3e82bSJohannes Berg * 68581ce3e82bSJohannes Berg * Returns %true if the conversion was successful, %false otherwise. 68591ce3e82bSJohannes Berg */ 68601ce3e82bSJohannes Berg bool ieee80211_operating_class_to_band(u8 operating_class, 686157fbcce3SJohannes Berg enum nl80211_band *band); 68621ce3e82bSJohannes Berg 6863a38700ddSArik Nemtsov /** 6864a38700ddSArik Nemtsov * ieee80211_chandef_to_operating_class - convert chandef to operation class 6865a38700ddSArik Nemtsov * 6866a38700ddSArik Nemtsov * @chandef: the chandef to convert 6867a38700ddSArik Nemtsov * @op_class: a pointer to the resulting operating class 6868a38700ddSArik Nemtsov * 6869a38700ddSArik Nemtsov * Returns %true if the conversion was successful, %false otherwise. 6870a38700ddSArik Nemtsov */ 6871a38700ddSArik Nemtsov bool ieee80211_chandef_to_operating_class(struct cfg80211_chan_def *chandef, 6872a38700ddSArik Nemtsov u8 *op_class); 6873a38700ddSArik Nemtsov 68745314526bSThomas Pedersen /* 68753475b094SJouni Malinen * cfg80211_tdls_oper_request - request userspace to perform TDLS operation 68763475b094SJouni Malinen * @dev: the device on which the operation is requested 68773475b094SJouni Malinen * @peer: the MAC address of the peer device 68783475b094SJouni Malinen * @oper: the requested TDLS operation (NL80211_TDLS_SETUP or 68793475b094SJouni Malinen * NL80211_TDLS_TEARDOWN) 68803475b094SJouni Malinen * @reason_code: the reason code for teardown request 68813475b094SJouni Malinen * @gfp: allocation flags 68823475b094SJouni Malinen * 68833475b094SJouni Malinen * This function is used to request userspace to perform TDLS operation that 68843475b094SJouni Malinen * requires knowledge of keys, i.e., link setup or teardown when the AP 68853475b094SJouni Malinen * connection uses encryption. This is optional mechanism for the driver to use 68863475b094SJouni Malinen * if it can automatically determine when a TDLS link could be useful (e.g., 68873475b094SJouni Malinen * based on traffic and signal strength for a peer). 68883475b094SJouni Malinen */ 68893475b094SJouni Malinen void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 68903475b094SJouni Malinen enum nl80211_tdls_operation oper, 68913475b094SJouni Malinen u16 reason_code, gfp_t gfp); 68923475b094SJouni Malinen 68933475b094SJouni Malinen /* 68948097e149SThomas Pedersen * cfg80211_calculate_bitrate - calculate actual bitrate (in 100Kbps units) 68958097e149SThomas Pedersen * @rate: given rate_info to calculate bitrate from 68968097e149SThomas Pedersen * 68978097e149SThomas Pedersen * return 0 if MCS index >= 32 68988097e149SThomas Pedersen */ 68998eb41c8dSVladimir Kondratiev u32 cfg80211_calculate_bitrate(struct rate_info *rate); 69008097e149SThomas Pedersen 690198104fdeSJohannes Berg /** 690298104fdeSJohannes Berg * cfg80211_unregister_wdev - remove the given wdev 690398104fdeSJohannes Berg * @wdev: struct wireless_dev to remove 690498104fdeSJohannes Berg * 690598104fdeSJohannes Berg * Call this function only for wdevs that have no netdev assigned, 690698104fdeSJohannes Berg * e.g. P2P Devices. It removes the device from the list so that 690798104fdeSJohannes Berg * it can no longer be used. It is necessary to call this function 690898104fdeSJohannes Berg * even when cfg80211 requests the removal of the interface by 690998104fdeSJohannes Berg * calling the del_virtual_intf() callback. The function must also 691098104fdeSJohannes Berg * be called when the driver wishes to unregister the wdev, e.g. 691198104fdeSJohannes Berg * when the device is unbound from the driver. 691298104fdeSJohannes Berg * 691398104fdeSJohannes Berg * Requires the RTNL to be held. 691498104fdeSJohannes Berg */ 691598104fdeSJohannes Berg void cfg80211_unregister_wdev(struct wireless_dev *wdev); 691698104fdeSJohannes Berg 69170ee45355SJohannes Berg /** 6918355199e0SJouni Malinen * struct cfg80211_ft_event - FT Information Elements 6919355199e0SJouni Malinen * @ies: FT IEs 6920355199e0SJouni Malinen * @ies_len: length of the FT IE in bytes 6921355199e0SJouni Malinen * @target_ap: target AP's MAC address 6922355199e0SJouni Malinen * @ric_ies: RIC IE 6923355199e0SJouni Malinen * @ric_ies_len: length of the RIC IE in bytes 6924355199e0SJouni Malinen */ 6925355199e0SJouni Malinen struct cfg80211_ft_event_params { 6926355199e0SJouni Malinen const u8 *ies; 6927355199e0SJouni Malinen size_t ies_len; 6928355199e0SJouni Malinen const u8 *target_ap; 6929355199e0SJouni Malinen const u8 *ric_ies; 6930355199e0SJouni Malinen size_t ric_ies_len; 6931355199e0SJouni Malinen }; 6932355199e0SJouni Malinen 6933355199e0SJouni Malinen /** 6934355199e0SJouni Malinen * cfg80211_ft_event - notify userspace about FT IE and RIC IE 6935355199e0SJouni Malinen * @netdev: network device 6936355199e0SJouni Malinen * @ft_event: IE information 6937355199e0SJouni Malinen */ 6938355199e0SJouni Malinen void cfg80211_ft_event(struct net_device *netdev, 6939355199e0SJouni Malinen struct cfg80211_ft_event_params *ft_event); 6940355199e0SJouni Malinen 6941355199e0SJouni Malinen /** 69420ee45355SJohannes Berg * cfg80211_get_p2p_attr - find and copy a P2P attribute from IE buffer 69430ee45355SJohannes Berg * @ies: the input IE buffer 69440ee45355SJohannes Berg * @len: the input length 69450ee45355SJohannes Berg * @attr: the attribute ID to find 69460ee45355SJohannes Berg * @buf: output buffer, can be %NULL if the data isn't needed, e.g. 69470ee45355SJohannes Berg * if the function is only called to get the needed buffer size 69480ee45355SJohannes Berg * @bufsize: size of the output buffer 69490ee45355SJohannes Berg * 69500ee45355SJohannes Berg * The function finds a given P2P attribute in the (vendor) IEs and 69510ee45355SJohannes Berg * copies its contents to the given buffer. 69520ee45355SJohannes Berg * 69530ae997dcSYacine Belkadi * Return: A negative error code (-%EILSEQ or -%ENOENT) if the data is 69540ae997dcSYacine Belkadi * malformed or the attribute can't be found (respectively), or the 69550ae997dcSYacine Belkadi * length of the found attribute (which can be zero). 69560ee45355SJohannes Berg */ 6957c216e641SArend van Spriel int cfg80211_get_p2p_attr(const u8 *ies, unsigned int len, 6958c216e641SArend van Spriel enum ieee80211_p2p_attr_id attr, 6959c216e641SArend van Spriel u8 *buf, unsigned int bufsize); 69600ee45355SJohannes Berg 6961cd8f7cb4SJohannes Berg /** 696229464cccSJohannes Berg * ieee80211_ie_split_ric - split an IE buffer according to ordering (with RIC) 696329464cccSJohannes Berg * @ies: the IE buffer 696429464cccSJohannes Berg * @ielen: the length of the IE buffer 696529464cccSJohannes Berg * @ids: an array with element IDs that are allowed before 69662512b1b1SLiad Kaufman * the split. A WLAN_EID_EXTENSION value means that the next 69672512b1b1SLiad Kaufman * EID in the list is a sub-element of the EXTENSION IE. 696829464cccSJohannes Berg * @n_ids: the size of the element ID array 696929464cccSJohannes Berg * @after_ric: array IE types that come after the RIC element 697029464cccSJohannes Berg * @n_after_ric: size of the @after_ric array 697129464cccSJohannes Berg * @offset: offset where to start splitting in the buffer 697229464cccSJohannes Berg * 697329464cccSJohannes Berg * This function splits an IE buffer by updating the @offset 697429464cccSJohannes Berg * variable to point to the location where the buffer should be 697529464cccSJohannes Berg * split. 697629464cccSJohannes Berg * 697729464cccSJohannes Berg * It assumes that the given IE buffer is well-formed, this 697829464cccSJohannes Berg * has to be guaranteed by the caller! 697929464cccSJohannes Berg * 698029464cccSJohannes Berg * It also assumes that the IEs in the buffer are ordered 698129464cccSJohannes Berg * correctly, if not the result of using this function will not 698229464cccSJohannes Berg * be ordered correctly either, i.e. it does no reordering. 698329464cccSJohannes Berg * 698429464cccSJohannes Berg * The function returns the offset where the next part of the 698529464cccSJohannes Berg * buffer starts, which may be @ielen if the entire (remainder) 698629464cccSJohannes Berg * of the buffer should be used. 698729464cccSJohannes Berg */ 698829464cccSJohannes Berg size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen, 698929464cccSJohannes Berg const u8 *ids, int n_ids, 699029464cccSJohannes Berg const u8 *after_ric, int n_after_ric, 699129464cccSJohannes Berg size_t offset); 699229464cccSJohannes Berg 699329464cccSJohannes Berg /** 699429464cccSJohannes Berg * ieee80211_ie_split - split an IE buffer according to ordering 699529464cccSJohannes Berg * @ies: the IE buffer 699629464cccSJohannes Berg * @ielen: the length of the IE buffer 699729464cccSJohannes Berg * @ids: an array with element IDs that are allowed before 69982512b1b1SLiad Kaufman * the split. A WLAN_EID_EXTENSION value means that the next 69992512b1b1SLiad Kaufman * EID in the list is a sub-element of the EXTENSION IE. 700029464cccSJohannes Berg * @n_ids: the size of the element ID array 700129464cccSJohannes Berg * @offset: offset where to start splitting in the buffer 700229464cccSJohannes Berg * 700329464cccSJohannes Berg * This function splits an IE buffer by updating the @offset 700429464cccSJohannes Berg * variable to point to the location where the buffer should be 700529464cccSJohannes Berg * split. 700629464cccSJohannes Berg * 700729464cccSJohannes Berg * It assumes that the given IE buffer is well-formed, this 700829464cccSJohannes Berg * has to be guaranteed by the caller! 700929464cccSJohannes Berg * 701029464cccSJohannes Berg * It also assumes that the IEs in the buffer are ordered 701129464cccSJohannes Berg * correctly, if not the result of using this function will not 701229464cccSJohannes Berg * be ordered correctly either, i.e. it does no reordering. 701329464cccSJohannes Berg * 701429464cccSJohannes Berg * The function returns the offset where the next part of the 701529464cccSJohannes Berg * buffer starts, which may be @ielen if the entire (remainder) 701629464cccSJohannes Berg * of the buffer should be used. 701729464cccSJohannes Berg */ 70180483eeacSJohannes Berg static inline size_t ieee80211_ie_split(const u8 *ies, size_t ielen, 70190483eeacSJohannes Berg const u8 *ids, int n_ids, size_t offset) 70200483eeacSJohannes Berg { 70210483eeacSJohannes Berg return ieee80211_ie_split_ric(ies, ielen, ids, n_ids, NULL, 0, offset); 70220483eeacSJohannes Berg } 702329464cccSJohannes Berg 702429464cccSJohannes Berg /** 7025cd8f7cb4SJohannes Berg * cfg80211_report_wowlan_wakeup - report wakeup from WoWLAN 7026cd8f7cb4SJohannes Berg * @wdev: the wireless device reporting the wakeup 7027cd8f7cb4SJohannes Berg * @wakeup: the wakeup report 7028cd8f7cb4SJohannes Berg * @gfp: allocation flags 7029cd8f7cb4SJohannes Berg * 7030cd8f7cb4SJohannes Berg * This function reports that the given device woke up. If it 7031cd8f7cb4SJohannes Berg * caused the wakeup, report the reason(s), otherwise you may 7032cd8f7cb4SJohannes Berg * pass %NULL as the @wakeup parameter to advertise that something 7033cd8f7cb4SJohannes Berg * else caused the wakeup. 7034cd8f7cb4SJohannes Berg */ 7035cd8f7cb4SJohannes Berg void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 7036cd8f7cb4SJohannes Berg struct cfg80211_wowlan_wakeup *wakeup, 7037cd8f7cb4SJohannes Berg gfp_t gfp); 7038cd8f7cb4SJohannes Berg 70395de17984SArend van Spriel /** 70405de17984SArend van Spriel * cfg80211_crit_proto_stopped() - indicate critical protocol stopped by driver. 70415de17984SArend van Spriel * 70425de17984SArend van Spriel * @wdev: the wireless device for which critical protocol is stopped. 704303f831a6SRobert P. J. Day * @gfp: allocation flags 70445de17984SArend van Spriel * 70455de17984SArend van Spriel * This function can be called by the driver to indicate it has reverted 70465de17984SArend van Spriel * operation back to normal. One reason could be that the duration given 70475de17984SArend van Spriel * by .crit_proto_start() has expired. 70485de17984SArend van Spriel */ 70495de17984SArend van Spriel void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp); 70505de17984SArend van Spriel 7051bdfbec2dSIlan Peer /** 7052bdfbec2dSIlan Peer * ieee80211_get_num_supported_channels - get number of channels device has 7053bdfbec2dSIlan Peer * @wiphy: the wiphy 7054bdfbec2dSIlan Peer * 7055bdfbec2dSIlan Peer * Return: the number of channels supported by the device. 7056bdfbec2dSIlan Peer */ 7057bdfbec2dSIlan Peer unsigned int ieee80211_get_num_supported_channels(struct wiphy *wiphy); 7058bdfbec2dSIlan Peer 7059cb2d956dSLuciano Coelho /** 7060cb2d956dSLuciano Coelho * cfg80211_check_combinations - check interface combinations 7061cb2d956dSLuciano Coelho * 7062cb2d956dSLuciano Coelho * @wiphy: the wiphy 7063e227300cSPurushottam Kushwaha * @params: the interface combinations parameter 7064cb2d956dSLuciano Coelho * 7065cb2d956dSLuciano Coelho * This function can be called by the driver to check whether a 7066cb2d956dSLuciano Coelho * combination of interfaces and their types are allowed according to 7067cb2d956dSLuciano Coelho * the interface combinations. 7068cb2d956dSLuciano Coelho */ 7069cb2d956dSLuciano Coelho int cfg80211_check_combinations(struct wiphy *wiphy, 7070e227300cSPurushottam Kushwaha struct iface_combination_params *params); 7071cb2d956dSLuciano Coelho 707265a124ddSMichal Kazior /** 707365a124ddSMichal Kazior * cfg80211_iter_combinations - iterate over matching combinations 707465a124ddSMichal Kazior * 707565a124ddSMichal Kazior * @wiphy: the wiphy 7076e227300cSPurushottam Kushwaha * @params: the interface combinations parameter 707765a124ddSMichal Kazior * @iter: function to call for each matching combination 707865a124ddSMichal Kazior * @data: pointer to pass to iter function 707965a124ddSMichal Kazior * 708065a124ddSMichal Kazior * This function can be called by the driver to check what possible 708165a124ddSMichal Kazior * combinations it fits in at a given moment, e.g. for channel switching 708265a124ddSMichal Kazior * purposes. 708365a124ddSMichal Kazior */ 708465a124ddSMichal Kazior int cfg80211_iter_combinations(struct wiphy *wiphy, 7085e227300cSPurushottam Kushwaha struct iface_combination_params *params, 708665a124ddSMichal Kazior void (*iter)(const struct ieee80211_iface_combination *c, 708765a124ddSMichal Kazior void *data), 708865a124ddSMichal Kazior void *data); 708965a124ddSMichal Kazior 7090f04c2203SMichal Kazior /* 7091f04c2203SMichal Kazior * cfg80211_stop_iface - trigger interface disconnection 7092f04c2203SMichal Kazior * 7093f04c2203SMichal Kazior * @wiphy: the wiphy 7094f04c2203SMichal Kazior * @wdev: wireless device 7095f04c2203SMichal Kazior * @gfp: context flags 7096f04c2203SMichal Kazior * 7097f04c2203SMichal Kazior * Trigger interface to be stopped as if AP was stopped, IBSS/mesh left, STA 7098f04c2203SMichal Kazior * disconnected. 7099f04c2203SMichal Kazior * 7100f04c2203SMichal Kazior * Note: This doesn't need any locks and is asynchronous. 7101f04c2203SMichal Kazior */ 7102f04c2203SMichal Kazior void cfg80211_stop_iface(struct wiphy *wiphy, struct wireless_dev *wdev, 7103f04c2203SMichal Kazior gfp_t gfp); 7104f04c2203SMichal Kazior 7105f6837ba8SJohannes Berg /** 7106f6837ba8SJohannes Berg * cfg80211_shutdown_all_interfaces - shut down all interfaces for a wiphy 7107f6837ba8SJohannes Berg * @wiphy: the wiphy to shut down 7108f6837ba8SJohannes Berg * 7109f6837ba8SJohannes Berg * This function shuts down all interfaces belonging to this wiphy by 7110f6837ba8SJohannes Berg * calling dev_close() (and treating non-netdev interfaces as needed). 7111f6837ba8SJohannes Berg * It shouldn't really be used unless there are some fatal device errors 7112f6837ba8SJohannes Berg * that really can't be recovered in any other way. 7113f6837ba8SJohannes Berg * 7114f6837ba8SJohannes Berg * Callers must hold the RTNL and be able to deal with callbacks into 7115f6837ba8SJohannes Berg * the driver while the function is running. 7116f6837ba8SJohannes Berg */ 7117f6837ba8SJohannes Berg void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy); 7118f6837ba8SJohannes Berg 7119d75bb06bSGautam Kumar Shukla /** 7120d75bb06bSGautam Kumar Shukla * wiphy_ext_feature_set - set the extended feature flag 7121d75bb06bSGautam Kumar Shukla * 7122d75bb06bSGautam Kumar Shukla * @wiphy: the wiphy to modify. 7123d75bb06bSGautam Kumar Shukla * @ftidx: extended feature bit index. 7124d75bb06bSGautam Kumar Shukla * 7125d75bb06bSGautam Kumar Shukla * The extended features are flagged in multiple bytes (see 7126d75bb06bSGautam Kumar Shukla * &struct wiphy.@ext_features) 7127d75bb06bSGautam Kumar Shukla */ 7128d75bb06bSGautam Kumar Shukla static inline void wiphy_ext_feature_set(struct wiphy *wiphy, 7129d75bb06bSGautam Kumar Shukla enum nl80211_ext_feature_index ftidx) 7130d75bb06bSGautam Kumar Shukla { 7131d75bb06bSGautam Kumar Shukla u8 *ft_byte; 7132d75bb06bSGautam Kumar Shukla 7133d75bb06bSGautam Kumar Shukla ft_byte = &wiphy->ext_features[ftidx / 8]; 7134d75bb06bSGautam Kumar Shukla *ft_byte |= BIT(ftidx % 8); 7135d75bb06bSGautam Kumar Shukla } 7136d75bb06bSGautam Kumar Shukla 7137d75bb06bSGautam Kumar Shukla /** 7138d75bb06bSGautam Kumar Shukla * wiphy_ext_feature_isset - check the extended feature flag 7139d75bb06bSGautam Kumar Shukla * 7140d75bb06bSGautam Kumar Shukla * @wiphy: the wiphy to modify. 7141d75bb06bSGautam Kumar Shukla * @ftidx: extended feature bit index. 7142d75bb06bSGautam Kumar Shukla * 7143d75bb06bSGautam Kumar Shukla * The extended features are flagged in multiple bytes (see 7144d75bb06bSGautam Kumar Shukla * &struct wiphy.@ext_features) 7145d75bb06bSGautam Kumar Shukla */ 7146d75bb06bSGautam Kumar Shukla static inline bool 7147d75bb06bSGautam Kumar Shukla wiphy_ext_feature_isset(struct wiphy *wiphy, 7148d75bb06bSGautam Kumar Shukla enum nl80211_ext_feature_index ftidx) 7149d75bb06bSGautam Kumar Shukla { 7150d75bb06bSGautam Kumar Shukla u8 ft_byte; 7151d75bb06bSGautam Kumar Shukla 7152d75bb06bSGautam Kumar Shukla ft_byte = wiphy->ext_features[ftidx / 8]; 7153d75bb06bSGautam Kumar Shukla return (ft_byte & BIT(ftidx % 8)) != 0; 7154d75bb06bSGautam Kumar Shukla } 7155b7ffbd7eSJohannes Berg 7156a442b761SAyala Beker /** 7157a442b761SAyala Beker * cfg80211_free_nan_func - free NAN function 7158a442b761SAyala Beker * @f: NAN function that should be freed 7159a442b761SAyala Beker * 7160a442b761SAyala Beker * Frees all the NAN function and all it's allocated members. 7161a442b761SAyala Beker */ 7162a442b761SAyala Beker void cfg80211_free_nan_func(struct cfg80211_nan_func *f); 7163a442b761SAyala Beker 716450bcd31dSAyala Beker /** 716550bcd31dSAyala Beker * struct cfg80211_nan_match_params - NAN match parameters 716650bcd31dSAyala Beker * @type: the type of the function that triggered a match. If it is 716750bcd31dSAyala Beker * %NL80211_NAN_FUNC_SUBSCRIBE it means that we replied to a subscriber. 716850bcd31dSAyala Beker * If it is %NL80211_NAN_FUNC_PUBLISH, it means that we got a discovery 716950bcd31dSAyala Beker * result. 717050bcd31dSAyala Beker * If it is %NL80211_NAN_FUNC_FOLLOW_UP, we received a follow up. 717150bcd31dSAyala Beker * @inst_id: the local instance id 717250bcd31dSAyala Beker * @peer_inst_id: the instance id of the peer's function 717350bcd31dSAyala Beker * @addr: the MAC address of the peer 717450bcd31dSAyala Beker * @info_len: the length of the &info 717550bcd31dSAyala Beker * @info: the Service Specific Info from the peer (if any) 717650bcd31dSAyala Beker * @cookie: unique identifier of the corresponding function 717750bcd31dSAyala Beker */ 717850bcd31dSAyala Beker struct cfg80211_nan_match_params { 717950bcd31dSAyala Beker enum nl80211_nan_function_type type; 718050bcd31dSAyala Beker u8 inst_id; 718150bcd31dSAyala Beker u8 peer_inst_id; 718250bcd31dSAyala Beker const u8 *addr; 718350bcd31dSAyala Beker u8 info_len; 718450bcd31dSAyala Beker const u8 *info; 718550bcd31dSAyala Beker u64 cookie; 718650bcd31dSAyala Beker }; 718750bcd31dSAyala Beker 718850bcd31dSAyala Beker /** 718950bcd31dSAyala Beker * cfg80211_nan_match - report a match for a NAN function. 719050bcd31dSAyala Beker * @wdev: the wireless device reporting the match 719150bcd31dSAyala Beker * @match: match notification parameters 719250bcd31dSAyala Beker * @gfp: allocation flags 719350bcd31dSAyala Beker * 719450bcd31dSAyala Beker * This function reports that the a NAN function had a match. This 719550bcd31dSAyala Beker * can be a subscribe that had a match or a solicited publish that 719650bcd31dSAyala Beker * was sent. It can also be a follow up that was received. 719750bcd31dSAyala Beker */ 719850bcd31dSAyala Beker void cfg80211_nan_match(struct wireless_dev *wdev, 719950bcd31dSAyala Beker struct cfg80211_nan_match_params *match, gfp_t gfp); 720050bcd31dSAyala Beker 7201368e5a7bSAyala Beker /** 7202368e5a7bSAyala Beker * cfg80211_nan_func_terminated - notify about NAN function termination. 7203368e5a7bSAyala Beker * 7204368e5a7bSAyala Beker * @wdev: the wireless device reporting the match 7205368e5a7bSAyala Beker * @inst_id: the local instance id 7206368e5a7bSAyala Beker * @reason: termination reason (one of the NL80211_NAN_FUNC_TERM_REASON_*) 7207368e5a7bSAyala Beker * @cookie: unique NAN function identifier 7208368e5a7bSAyala Beker * @gfp: allocation flags 7209368e5a7bSAyala Beker * 7210368e5a7bSAyala Beker * This function reports that the a NAN function is terminated. 7211368e5a7bSAyala Beker */ 7212368e5a7bSAyala Beker void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 7213368e5a7bSAyala Beker u8 inst_id, 7214368e5a7bSAyala Beker enum nl80211_nan_func_term_reason reason, 7215368e5a7bSAyala Beker u64 cookie, gfp_t gfp); 7216368e5a7bSAyala Beker 7217b7ffbd7eSJohannes Berg /* ethtool helper */ 7218b7ffbd7eSJohannes Berg void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info); 7219b7ffbd7eSJohannes Berg 722040cbfa90SSrinivas Dasari /** 722140cbfa90SSrinivas Dasari * cfg80211_external_auth_request - userspace request for authentication 722240cbfa90SSrinivas Dasari * @netdev: network device 722340cbfa90SSrinivas Dasari * @params: External authentication parameters 722440cbfa90SSrinivas Dasari * @gfp: allocation flags 722540cbfa90SSrinivas Dasari * Returns: 0 on success, < 0 on error 722640cbfa90SSrinivas Dasari */ 722740cbfa90SSrinivas Dasari int cfg80211_external_auth_request(struct net_device *netdev, 722840cbfa90SSrinivas Dasari struct cfg80211_external_auth_params *params, 722940cbfa90SSrinivas Dasari gfp_t gfp); 723040cbfa90SSrinivas Dasari 72319bb7e0f2SJohannes Berg /** 72329bb7e0f2SJohannes Berg * cfg80211_pmsr_report - report peer measurement result data 72339bb7e0f2SJohannes Berg * @wdev: the wireless device reporting the measurement 72349bb7e0f2SJohannes Berg * @req: the original measurement request 72359bb7e0f2SJohannes Berg * @result: the result data 72369bb7e0f2SJohannes Berg * @gfp: allocation flags 72379bb7e0f2SJohannes Berg */ 72389bb7e0f2SJohannes Berg void cfg80211_pmsr_report(struct wireless_dev *wdev, 72399bb7e0f2SJohannes Berg struct cfg80211_pmsr_request *req, 72409bb7e0f2SJohannes Berg struct cfg80211_pmsr_result *result, 72419bb7e0f2SJohannes Berg gfp_t gfp); 72429bb7e0f2SJohannes Berg 72439bb7e0f2SJohannes Berg /** 72449bb7e0f2SJohannes Berg * cfg80211_pmsr_complete - report peer measurement completed 72459bb7e0f2SJohannes Berg * @wdev: the wireless device reporting the measurement 72469bb7e0f2SJohannes Berg * @req: the original measurement request 72479bb7e0f2SJohannes Berg * @gfp: allocation flags 72489bb7e0f2SJohannes Berg * 72499bb7e0f2SJohannes Berg * Report that the entire measurement completed, after this 72509bb7e0f2SJohannes Berg * the request pointer will no longer be valid. 72519bb7e0f2SJohannes Berg */ 72529bb7e0f2SJohannes Berg void cfg80211_pmsr_complete(struct wireless_dev *wdev, 72539bb7e0f2SJohannes Berg struct cfg80211_pmsr_request *req, 72549bb7e0f2SJohannes Berg gfp_t gfp); 72559bb7e0f2SJohannes Berg 7256e1db74fcSJoe Perches /* Logging, debugging and troubleshooting/diagnostic helpers. */ 7257e1db74fcSJoe Perches 7258e1db74fcSJoe Perches /* wiphy_printk helpers, similar to dev_printk */ 7259e1db74fcSJoe Perches 7260e1db74fcSJoe Perches #define wiphy_printk(level, wiphy, format, args...) \ 72619c376639SJoe Perches dev_printk(level, &(wiphy)->dev, format, ##args) 7262e1db74fcSJoe Perches #define wiphy_emerg(wiphy, format, args...) \ 72639c376639SJoe Perches dev_emerg(&(wiphy)->dev, format, ##args) 7264e1db74fcSJoe Perches #define wiphy_alert(wiphy, format, args...) \ 72659c376639SJoe Perches dev_alert(&(wiphy)->dev, format, ##args) 7266e1db74fcSJoe Perches #define wiphy_crit(wiphy, format, args...) \ 72679c376639SJoe Perches dev_crit(&(wiphy)->dev, format, ##args) 7268e1db74fcSJoe Perches #define wiphy_err(wiphy, format, args...) \ 72699c376639SJoe Perches dev_err(&(wiphy)->dev, format, ##args) 7270e1db74fcSJoe Perches #define wiphy_warn(wiphy, format, args...) \ 72719c376639SJoe Perches dev_warn(&(wiphy)->dev, format, ##args) 7272e1db74fcSJoe Perches #define wiphy_notice(wiphy, format, args...) \ 72739c376639SJoe Perches dev_notice(&(wiphy)->dev, format, ##args) 7274e1db74fcSJoe Perches #define wiphy_info(wiphy, format, args...) \ 72759c376639SJoe Perches dev_info(&(wiphy)->dev, format, ##args) 7276073730d7SJoe Perches 7277a58d7525SStanislaw Gruszka #define wiphy_err_ratelimited(wiphy, format, args...) \ 7278a58d7525SStanislaw Gruszka dev_err_ratelimited(&(wiphy)->dev, format, ##args) 7279a58d7525SStanislaw Gruszka #define wiphy_warn_ratelimited(wiphy, format, args...) \ 7280a58d7525SStanislaw Gruszka dev_warn_ratelimited(&(wiphy)->dev, format, ##args) 7281a58d7525SStanislaw Gruszka 72829c376639SJoe Perches #define wiphy_debug(wiphy, format, args...) \ 7283e1db74fcSJoe Perches wiphy_printk(KERN_DEBUG, wiphy, format, ##args) 72849c376639SJoe Perches 7285e1db74fcSJoe Perches #define wiphy_dbg(wiphy, format, args...) \ 72869c376639SJoe Perches dev_dbg(&(wiphy)->dev, format, ##args) 7287e1db74fcSJoe Perches 7288e1db74fcSJoe Perches #if defined(VERBOSE_DEBUG) 7289e1db74fcSJoe Perches #define wiphy_vdbg wiphy_dbg 7290e1db74fcSJoe Perches #else 7291e1db74fcSJoe Perches #define wiphy_vdbg(wiphy, format, args...) \ 7292e1db74fcSJoe Perches ({ \ 7293e1db74fcSJoe Perches if (0) \ 7294e1db74fcSJoe Perches wiphy_printk(KERN_DEBUG, wiphy, format, ##args); \ 7295e1db74fcSJoe Perches 0; \ 7296e1db74fcSJoe Perches }) 7297e1db74fcSJoe Perches #endif 7298e1db74fcSJoe Perches 7299e1db74fcSJoe Perches /* 7300e1db74fcSJoe Perches * wiphy_WARN() acts like wiphy_printk(), but with the key difference 7301e1db74fcSJoe Perches * of using a WARN/WARN_ON to get the message out, including the 7302e1db74fcSJoe Perches * file/line information and a backtrace. 7303e1db74fcSJoe Perches */ 7304e1db74fcSJoe Perches #define wiphy_WARN(wiphy, format, args...) \ 7305e1db74fcSJoe Perches WARN(1, "wiphy: %s\n" format, wiphy_name(wiphy), ##args); 7306e1db74fcSJoe Perches 7307cb74e977SSunil Dutt /** 7308cb74e977SSunil Dutt * cfg80211_update_owe_info_event - Notify the peer's OWE info to user space 7309cb74e977SSunil Dutt * @netdev: network device 7310cb74e977SSunil Dutt * @owe_info: peer's owe info 7311cb74e977SSunil Dutt * @gfp: allocation flags 7312cb74e977SSunil Dutt */ 7313cb74e977SSunil Dutt void cfg80211_update_owe_info_event(struct net_device *netdev, 7314cb74e977SSunil Dutt struct cfg80211_update_owe_info *owe_info, 7315cb74e977SSunil Dutt gfp_t gfp); 7316cb74e977SSunil Dutt 7317704232c2SJohannes Berg #endif /* __NET_CFG80211_H */ 7318