cfg80211.h 327 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0-only */
2 3
#ifndef __NET_CFG80211_H
#define __NET_CFG80211_H
Johannes Berg's avatar
Johannes Berg committed
4 5 6
/*
 * 802.11 device and configuration interface
 *
7
 * Copyright 2006-2010	Johannes Berg <johannes@sipsolutions.net>
8
 * Copyright 2013-2014 Intel Mobile Communications GmbH
9
 * Copyright 2015-2017	Intel Deutschland GmbH
10
 * Copyright (C) 2018-2021, 2023 Intel Corporation
Johannes Berg's avatar
Johannes Berg committed
11
 */
12

13
#include <linux/ethtool.h>
14
#include <uapi/linux/rfkill.h>
Johannes Berg's avatar
Johannes Berg committed
15 16 17
#include <linux/netdevice.h>
#include <linux/debugfs.h>
#include <linux/list.h>
18
#include <linux/bug.h>
19 20
#include <linux/netlink.h>
#include <linux/skbuff.h>
21
#include <linux/nl80211.h>
22 23
#include <linux/if_ether.h>
#include <linux/ieee80211.h>
24
#include <linux/net.h>
25
#include <linux/rfkill.h>
Johannes Berg's avatar
Johannes Berg committed
26 27
#include <net/regulatory.h>

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
/**
 * DOC: Introduction
 *
 * cfg80211 is the configuration API for 802.11 devices in Linux. It bridges
 * userspace and drivers, and offers some utility functionality associated
 * with 802.11. cfg80211 must, directly or indirectly via mac80211, be used
 * by all modern wireless drivers in Linux, so that they offer a consistent
 * API through nl80211. For backward compatibility, cfg80211 also offers
 * wireless extensions to userspace, but hides them from drivers completely.
 *
 * Additionally, cfg80211 contains code to help enforce regulatory spectrum
 * use restrictions.
 */


/**
 * DOC: Device registration
 *
 * In order for a driver to use cfg80211, it must register the hardware device
 * with cfg80211. This happens through a number of hardware capability structs
 * described below.
 *
 * The fundamental structure for each device is the 'wiphy', of which each
 * instance describes a physical wireless device connected to the system. Each
 * such wiphy can have zero, one, or many virtual interfaces associated with
 * it, which need to be identified as such by pointing the network interface's
 * @ieee80211_ptr pointer to a &struct wireless_dev which further describes
 * the wireless part of the interface, normally this struct is embedded in the
 * network interface's private data area. Drivers can optionally allow creating
 * or destroying virtual interfaces on the fly, but without at least one or the
 * ability to create some the wireless device isn't useful.
 *
 * Each wiphy structure contains device capability information, and also has
 * a pointer to the various operations the driver offers. The definitions and
 * structures here describe these capabilities in detail.
 */

65 66
struct wiphy;

67
/*
Johannes Berg's avatar
Johannes Berg committed
68 69 70
 * wireless hardware capability structures
 */

71
/**
Johannes Berg's avatar
Johannes Berg committed
72 73 74 75 76
 * enum ieee80211_channel_flags - channel flags
 *
 * Channel flags set by the regulatory control code.
 *
 * @IEEE80211_CHAN_DISABLED: This channel is disabled.
77
 * @IEEE80211_CHAN_NO_IR: do not initiate radiation, this includes
78
 *	sending probe requests or beaconing.
79 80
 * @IEEE80211_CHAN_PSD: Power spectral density (in dBm) is set for this
 *	channel.
Johannes Berg's avatar
Johannes Berg committed
81
 * @IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
82
 * @IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel
83
 *	is not permitted.
84
 * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel
85
 *	is not permitted.
86
 * @IEEE80211_CHAN_NO_OFDM: OFDM is not allowed on this channel.
87 88 89 90 91 92 93 94 95 96
 * @IEEE80211_CHAN_NO_80MHZ: If the driver supports 80 MHz on the band,
 *	this flag indicates that an 80 MHz channel cannot use this
 *	channel as the control or any of the secondary channels.
 *	This may be due to the driver or due to regulatory bandwidth
 *	restrictions.
 * @IEEE80211_CHAN_NO_160MHZ: If the driver supports 160 MHz on the band,
 *	this flag indicates that an 160 MHz channel cannot use this
 *	channel as the control or any of the secondary channels.
 *	This may be due to the driver or due to regulatory bandwidth
 *	restrictions.
97
 * @IEEE80211_CHAN_INDOOR_ONLY: see %NL80211_FREQUENCY_ATTR_INDOOR_ONLY
98
 * @IEEE80211_CHAN_IR_CONCURRENT: see %NL80211_FREQUENCY_ATTR_IR_CONCURRENT
99 100 101 102
 * @IEEE80211_CHAN_NO_20MHZ: 20 MHz bandwidth is not permitted
 *	on this channel.
 * @IEEE80211_CHAN_NO_10MHZ: 10 MHz bandwidth is not permitted
 *	on this channel.
103
 * @IEEE80211_CHAN_NO_HE: HE operation is not permitted on this channel.
104 105 106 107 108 109 110 111 112 113
 * @IEEE80211_CHAN_1MHZ: 1 MHz bandwidth is permitted
 *	on this channel.
 * @IEEE80211_CHAN_2MHZ: 2 MHz bandwidth is permitted
 *	on this channel.
 * @IEEE80211_CHAN_4MHZ: 4 MHz bandwidth is permitted
 *	on this channel.
 * @IEEE80211_CHAN_8MHZ: 8 MHz bandwidth is permitted
 *	on this channel.
 * @IEEE80211_CHAN_16MHZ: 16 MHz bandwidth is permitted
 *	on this channel.
114 115 116 117 118
 * @IEEE80211_CHAN_NO_320MHZ: If the driver supports 320 MHz on the band,
 *	this flag indicates that a 320 MHz channel cannot use this
 *	channel as the control or any of the secondary channels.
 *	This may be due to the driver or due to regulatory bandwidth
 *	restrictions.
119
 * @IEEE80211_CHAN_NO_EHT: EHT operation is not permitted on this channel.
120
 */
Johannes Berg's avatar
Johannes Berg committed
121 122
enum ieee80211_channel_flags {
	IEEE80211_CHAN_DISABLED		= 1<<0,
123
	IEEE80211_CHAN_NO_IR		= 1<<1,
124
	IEEE80211_CHAN_PSD		= 1<<2,
Johannes Berg's avatar
Johannes Berg committed
125
	IEEE80211_CHAN_RADAR		= 1<<3,
126 127
	IEEE80211_CHAN_NO_HT40PLUS	= 1<<4,
	IEEE80211_CHAN_NO_HT40MINUS	= 1<<5,
128
	IEEE80211_CHAN_NO_OFDM		= 1<<6,
129 130
	IEEE80211_CHAN_NO_80MHZ		= 1<<7,
	IEEE80211_CHAN_NO_160MHZ	= 1<<8,
131
	IEEE80211_CHAN_INDOOR_ONLY	= 1<<9,
132
	IEEE80211_CHAN_IR_CONCURRENT	= 1<<10,
133 134
	IEEE80211_CHAN_NO_20MHZ		= 1<<11,
	IEEE80211_CHAN_NO_10MHZ		= 1<<12,
135
	IEEE80211_CHAN_NO_HE		= 1<<13,
136 137 138 139 140
	IEEE80211_CHAN_1MHZ		= 1<<14,
	IEEE80211_CHAN_2MHZ		= 1<<15,
	IEEE80211_CHAN_4MHZ		= 1<<16,
	IEEE80211_CHAN_8MHZ		= 1<<17,
	IEEE80211_CHAN_16MHZ		= 1<<18,
141
	IEEE80211_CHAN_NO_320MHZ	= 1<<19,
142
	IEEE80211_CHAN_NO_EHT		= 1<<20,
143 144
};

145
#define IEEE80211_CHAN_NO_HT40 \
146
	(IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS)
147

148 149 150
#define IEEE80211_DFS_MIN_CAC_TIME_MS		60000
#define IEEE80211_DFS_MIN_NOP_TIME_MS		(30 * 60 * 1000)

Johannes Berg's avatar
Johannes Berg committed
151 152 153 154 155 156 157
/**
 * struct ieee80211_channel - channel definition
 *
 * This structure describes a single channel for use
 * with cfg80211.
 *
 * @center_freq: center frequency in MHz
158
 * @freq_offset: offset from @center_freq, in KHz
Johannes Berg's avatar
Johannes Berg committed
159 160 161 162 163 164 165
 * @hw_value: hardware-specific value for the channel
 * @flags: channel flags from &enum ieee80211_channel_flags.
 * @orig_flags: channel flags at registration time, used by regulatory
 *	code to support devices with additional restrictions
 * @band: band this channel belongs to.
 * @max_antenna_gain: maximum antenna gain in dBi
 * @max_power: maximum transmission power (in dBm)
166
 * @max_reg_power: maximum regulatory transmission power (in dBm)
Johannes Berg's avatar
Johannes Berg committed
167 168
 * @beacon_found: helper to regulatory code to indicate when a beacon
 *	has been found on this channel. Use regulatory_hint_found_beacon()
169
 *	to enable this, this is useful only on 5 GHz band.
Johannes Berg's avatar
Johannes Berg committed
170 171
 * @orig_mag: internal use
 * @orig_mpwr: internal use
172 173 174
 * @dfs_state: current state of this channel. Only relevant if radar is required
 *	on this channel.
 * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
175
 * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
176
 * @psd: power spectral density (in dBm)
177
 */
Johannes Berg's avatar
Johannes Berg committed
178
struct ieee80211_channel {
179
	enum nl80211_band band;
180
	u32 center_freq;
181
	u16 freq_offset;
Johannes Berg's avatar
Johannes Berg committed
182 183 184 185
	u16 hw_value;
	u32 flags;
	int max_antenna_gain;
	int max_power;
186
	int max_reg_power;
Johannes Berg's avatar
Johannes Berg committed
187 188 189
	bool beacon_found;
	u32 orig_flags;
	int orig_mag, orig_mpwr;
190 191
	enum nl80211_dfs_state dfs_state;
	unsigned long dfs_state_entered;
192
	unsigned int dfs_cac_ms;
193
	s8 psd;
Johannes Berg's avatar
Johannes Berg committed
194 195
};

196
/**
Johannes Berg's avatar
Johannes Berg committed
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
 * enum ieee80211_rate_flags - rate flags
 *
 * Hardware/specification flags for rates. These are structured
 * in a way that allows using the same bitrate structure for
 * different bands/PHY modes.
 *
 * @IEEE80211_RATE_SHORT_PREAMBLE: Hardware can send with short
 *	preamble on this bitrate; only relevant in 2.4GHz band and
 *	with CCK rates.
 * @IEEE80211_RATE_MANDATORY_A: This bitrate is a mandatory rate
 *	when used with 802.11a (on the 5 GHz band); filled by the
 *	core code when registering the wiphy.
 * @IEEE80211_RATE_MANDATORY_B: This bitrate is a mandatory rate
 *	when used with 802.11b (on the 2.4 GHz band); filled by the
 *	core code when registering the wiphy.
 * @IEEE80211_RATE_MANDATORY_G: This bitrate is a mandatory rate
 *	when used with 802.11g (on the 2.4 GHz band); filled by the
 *	core code when registering the wiphy.
 * @IEEE80211_RATE_ERP_G: This is an ERP rate in 802.11g mode.
216 217
 * @IEEE80211_RATE_SUPPORTS_5MHZ: Rate can be used in 5 MHz mode
 * @IEEE80211_RATE_SUPPORTS_10MHZ: Rate can be used in 10 MHz mode
218
 */
Johannes Berg's avatar
Johannes Berg committed
219 220 221 222 223 224
enum ieee80211_rate_flags {
	IEEE80211_RATE_SHORT_PREAMBLE	= 1<<0,
	IEEE80211_RATE_MANDATORY_A	= 1<<1,
	IEEE80211_RATE_MANDATORY_B	= 1<<2,
	IEEE80211_RATE_MANDATORY_G	= 1<<3,
	IEEE80211_RATE_ERP_G		= 1<<4,
225 226
	IEEE80211_RATE_SUPPORTS_5MHZ	= 1<<5,
	IEEE80211_RATE_SUPPORTS_10MHZ	= 1<<6,
Johannes Berg's avatar
Johannes Berg committed
227
};
228

229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
/**
 * enum ieee80211_bss_type - BSS type filter
 *
 * @IEEE80211_BSS_TYPE_ESS: Infrastructure BSS
 * @IEEE80211_BSS_TYPE_PBSS: Personal BSS
 * @IEEE80211_BSS_TYPE_IBSS: Independent BSS
 * @IEEE80211_BSS_TYPE_MBSS: Mesh BSS
 * @IEEE80211_BSS_TYPE_ANY: Wildcard value for matching any BSS type
 */
enum ieee80211_bss_type {
	IEEE80211_BSS_TYPE_ESS,
	IEEE80211_BSS_TYPE_PBSS,
	IEEE80211_BSS_TYPE_IBSS,
	IEEE80211_BSS_TYPE_MBSS,
	IEEE80211_BSS_TYPE_ANY
};

/**
 * enum ieee80211_privacy - BSS privacy filter
 *
 * @IEEE80211_PRIVACY_ON: privacy bit set
 * @IEEE80211_PRIVACY_OFF: privacy bit clear
 * @IEEE80211_PRIVACY_ANY: Wildcard value for matching any privacy setting
 */
enum ieee80211_privacy {
	IEEE80211_PRIVACY_ON,
	IEEE80211_PRIVACY_OFF,
	IEEE80211_PRIVACY_ANY
};

#define IEEE80211_PRIVACY(x)	\
	((x) ? IEEE80211_PRIVACY_ON : IEEE80211_PRIVACY_OFF)

Johannes Berg's avatar
Johannes Berg committed
262 263 264 265 266 267 268 269
/**
 * struct ieee80211_rate - bitrate definition
 *
 * This structure describes a bitrate that an 802.11 PHY can
 * operate with. The two values @hw_value and @hw_value_short
 * are only for driver use when pointers to this structure are
 * passed around.
 *
270
 * @flags: rate-specific flags from &enum ieee80211_rate_flags
Johannes Berg's avatar
Johannes Berg committed
271 272 273 274 275 276 277 278 279 280
 * @bitrate: bitrate in units of 100 Kbps
 * @hw_value: driver/hardware value for this rate
 * @hw_value_short: driver/hardware value for this rate when
 *	short preamble is used
 */
struct ieee80211_rate {
	u32 flags;
	u16 bitrate;
	u16 hw_value, hw_value_short;
};
281

282 283 284 285
/**
 * struct ieee80211_he_obss_pd - AP settings for spatial reuse
 *
 * @enable: is the feature enabled.
286 287
 * @sr_ctrl: The SR Control field of SRP element.
 * @non_srg_max_offset: non-SRG maximum tx power offset
288 289
 * @min_offset: minimal tx power offset an associated station shall use
 * @max_offset: maximum tx power offset an associated station shall use
290 291 292 293
 * @bss_color_bitmap: bitmap that indicates the BSS color values used by
 *	members of the SRG
 * @partial_bssid_bitmap: bitmap that indicates the partial BSSID values
 *	used by members of the SRG
294 295 296
 */
struct ieee80211_he_obss_pd {
	bool enable;
297 298
	u8 sr_ctrl;
	u8 non_srg_max_offset;
299 300
	u8 min_offset;
	u8 max_offset;
301 302
	u8 bss_color_bitmap[8];
	u8 partial_bssid_bitmap[8];
303 304
};

305 306 307 308
/**
 * struct cfg80211_he_bss_color - AP settings for BSS coloring
 *
 * @color: the current color.
309
 * @enabled: HE BSS color is used
310 311 312 313
 * @partial: define the AID equation.
 */
struct cfg80211_he_bss_color {
	u8 color;
314
	bool enabled;
315 316 317
	bool partial;
};

Johannes Berg's avatar
Johannes Berg committed
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
/**
 * struct ieee80211_sta_ht_cap - STA's HT capabilities
 *
 * This structure describes most essential parameters needed
 * to describe 802.11n HT capabilities for an STA.
 *
 * @ht_supported: is HT supported by the STA
 * @cap: HT capabilities map as described in 802.11n spec
 * @ampdu_factor: Maximum A-MPDU length factor
 * @ampdu_density: Minimum A-MPDU spacing
 * @mcs: Supported MCS rates
 */
struct ieee80211_sta_ht_cap {
	u16 cap; /* use IEEE80211_HT_CAP_ */
	bool ht_supported;
	u8 ampdu_factor;
	u8 ampdu_density;
	struct ieee80211_mcs_info mcs;
336 337
};

338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
/**
 * struct ieee80211_sta_vht_cap - STA's VHT capabilities
 *
 * This structure describes most essential parameters needed
 * to describe 802.11ac VHT capabilities for an STA.
 *
 * @vht_supported: is VHT supported by the STA
 * @cap: VHT capabilities map as described in 802.11ac spec
 * @vht_mcs: Supported VHT MCS rates
 */
struct ieee80211_sta_vht_cap {
	bool vht_supported;
	u32 cap; /* use IEEE80211_VHT_CAP_ */
	struct ieee80211_vht_mcs_info vht_mcs;
};

Luca Coelho's avatar
Luca Coelho committed
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
#define IEEE80211_HE_PPE_THRES_MAX_LEN		25

/**
 * struct ieee80211_sta_he_cap - STA's HE capabilities
 *
 * This structure describes most essential parameters needed
 * to describe 802.11ax HE capabilities for a STA.
 *
 * @has_he: true iff HE data is valid.
 * @he_cap_elem: Fixed portion of the HE capabilities element.
 * @he_mcs_nss_supp: The supported NSS/MCS combinations.
 * @ppe_thres: Holds the PPE Thresholds data.
 */
struct ieee80211_sta_he_cap {
	bool has_he;
	struct ieee80211_he_cap_elem he_cap_elem;
	struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp;
	u8 ppe_thres[IEEE80211_HE_PPE_THRES_MAX_LEN];
};

374 375 376 377 378 379 380
/**
 * struct ieee80211_eht_mcs_nss_supp - EHT max supported NSS per MCS
 *
 * See P802.11be_D1.3 Table 9-401k - "Subfields of the Supported EHT-MCS
 * and NSS Set field"
 *
 * @only_20mhz: MCS/NSS support for 20 MHz-only STA.
381
 * @bw: MCS/NSS support for 80, 160 and 320 MHz
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
 * @bw._80: MCS/NSS support for BW <= 80 MHz
 * @bw._160: MCS/NSS support for BW = 160 MHz
 * @bw._320: MCS/NSS support for BW = 320 MHz
 */
struct ieee80211_eht_mcs_nss_supp {
	union {
		struct ieee80211_eht_mcs_nss_supp_20mhz_only only_20mhz;
		struct {
			struct ieee80211_eht_mcs_nss_supp_bw _80;
			struct ieee80211_eht_mcs_nss_supp_bw _160;
			struct ieee80211_eht_mcs_nss_supp_bw _320;
		} __packed bw;
	} __packed;
} __packed;

#define IEEE80211_EHT_PPE_THRES_MAX_LEN		32

/**
 * struct ieee80211_sta_eht_cap - STA's EHT capabilities
 *
 * This structure describes most essential parameters needed
 * to describe 802.11be EHT capabilities for a STA.
 *
 * @has_eht: true iff EHT data is valid.
 * @eht_cap_elem: Fixed portion of the eht capabilities element.
 * @eht_mcs_nss_supp: The supported NSS/MCS combinations.
 * @eht_ppe_thres: Holds the PPE Thresholds data.
 */
struct ieee80211_sta_eht_cap {
	bool has_eht;
	struct ieee80211_eht_cap_elem_fixed eht_cap_elem;
	struct ieee80211_eht_mcs_nss_supp eht_mcs_nss_supp;
	u8 eht_ppe_thres[IEEE80211_EHT_PPE_THRES_MAX_LEN];
};

417 418 419 420 421 422 423 424 425 426 427 428 429
/* sparse defines __CHECKER__; see Documentation/dev-tools/sparse.rst */
#ifdef __CHECKER__
/*
 * This is used to mark the sband->iftype_data pointer which is supposed
 * to be an array with special access semantics (per iftype), but a lot
 * of code got it wrong in the past, so with this marking sparse will be
 * noisy when the pointer is used directly.
 */
# define __iftd		__attribute__((noderef, address_space(__iftype_data)))
#else
# define __iftd
#endif /* __CHECKER__ */

Luca Coelho's avatar
Luca Coelho committed
430
/**
431
 * struct ieee80211_sband_iftype_data - sband data per interface type
Luca Coelho's avatar
Luca Coelho committed
432 433 434 435 436 437 438
 *
 * This structure encapsulates sband data that is relevant for the
 * interface types defined in @types_mask.  Each type in the
 * @types_mask must be unique across all instances of iftype_data.
 *
 * @types_mask: interface types mask
 * @he_cap: holds the HE capabilities
439 440
 * @he_6ghz_capa: HE 6 GHz capabilities, must be filled in for a
 *	6 GHz band channel (and 0 may be valid value).
441
 * @eht_cap: STA's EHT capabilities
442 443 444
 * @vendor_elems: vendor element(s) to advertise
 * @vendor_elems.data: vendor element(s) data
 * @vendor_elems.len: vendor element(s) length
Luca Coelho's avatar
Luca Coelho committed
445 446 447 448
 */
struct ieee80211_sband_iftype_data {
	u16 types_mask;
	struct ieee80211_sta_he_cap he_cap;
449
	struct ieee80211_he_6ghz_capa he_6ghz_capa;
450
	struct ieee80211_sta_eht_cap eht_cap;
451 452 453 454
	struct {
		const u8 *data;
		unsigned int len;
	} vendor_elems;
Luca Coelho's avatar
Luca Coelho committed
455 456
};

457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
/**
 * enum ieee80211_edmg_bw_config - allowed channel bandwidth configurations
 *
 * @IEEE80211_EDMG_BW_CONFIG_4: 2.16GHz
 * @IEEE80211_EDMG_BW_CONFIG_5: 2.16GHz and 4.32GHz
 * @IEEE80211_EDMG_BW_CONFIG_6: 2.16GHz, 4.32GHz and 6.48GHz
 * @IEEE80211_EDMG_BW_CONFIG_7: 2.16GHz, 4.32GHz, 6.48GHz and 8.64GHz
 * @IEEE80211_EDMG_BW_CONFIG_8: 2.16GHz and 2.16GHz + 2.16GHz
 * @IEEE80211_EDMG_BW_CONFIG_9: 2.16GHz, 4.32GHz and 2.16GHz + 2.16GHz
 * @IEEE80211_EDMG_BW_CONFIG_10: 2.16GHz, 4.32GHz, 6.48GHz and 2.16GHz+2.16GHz
 * @IEEE80211_EDMG_BW_CONFIG_11: 2.16GHz, 4.32GHz, 6.48GHz, 8.64GHz and
 *	2.16GHz+2.16GHz
 * @IEEE80211_EDMG_BW_CONFIG_12: 2.16GHz, 2.16GHz + 2.16GHz and
 *	4.32GHz + 4.32GHz
 * @IEEE80211_EDMG_BW_CONFIG_13: 2.16GHz, 4.32GHz, 2.16GHz + 2.16GHz and
 *	4.32GHz + 4.32GHz
 * @IEEE80211_EDMG_BW_CONFIG_14: 2.16GHz, 4.32GHz, 6.48GHz, 2.16GHz + 2.16GHz
 *	and 4.32GHz + 4.32GHz
 * @IEEE80211_EDMG_BW_CONFIG_15: 2.16GHz, 4.32GHz, 6.48GHz, 8.64GHz,
 *	2.16GHz + 2.16GHz and 4.32GHz + 4.32GHz
 */
enum ieee80211_edmg_bw_config {
	IEEE80211_EDMG_BW_CONFIG_4	= 4,
	IEEE80211_EDMG_BW_CONFIG_5	= 5,
	IEEE80211_EDMG_BW_CONFIG_6	= 6,
	IEEE80211_EDMG_BW_CONFIG_7	= 7,
	IEEE80211_EDMG_BW_CONFIG_8	= 8,
	IEEE80211_EDMG_BW_CONFIG_9	= 9,
	IEEE80211_EDMG_BW_CONFIG_10	= 10,
	IEEE80211_EDMG_BW_CONFIG_11	= 11,
	IEEE80211_EDMG_BW_CONFIG_12	= 12,
	IEEE80211_EDMG_BW_CONFIG_13	= 13,
	IEEE80211_EDMG_BW_CONFIG_14	= 14,
	IEEE80211_EDMG_BW_CONFIG_15	= 15,
};

/**
 * struct ieee80211_edmg - EDMG configuration
 *
 * This structure describes most essential parameters needed
 * to describe 802.11ay EDMG configuration
 *
 * @channels: bitmap that indicates the 2.16 GHz channel(s)
 *	that are allowed to be used for transmissions.
 *	Bit 0 indicates channel 1, bit 1 indicates channel 2, etc.
 *	Set to 0 indicate EDMG not supported.
 * @bw_config: Channel BW Configuration subfield encodes
 *	the allowed channel bandwidth configurations
 */
struct ieee80211_edmg {
	u8 channels;
	enum ieee80211_edmg_bw_config bw_config;
};

511 512 513 514 515 516
/**
 * struct ieee80211_sta_s1g_cap - STA's S1G capabilities
 *
 * This structure describes most essential parameters needed
 * to describe 802.11ah S1G capabilities for a STA.
 *
517
 * @s1g: is STA an S1G STA
518 519 520 521 522 523 524 525 526
 * @cap: S1G capabilities information
 * @nss_mcs: Supported NSS MCS set
 */
struct ieee80211_sta_s1g_cap {
	bool s1g;
	u8 cap[10]; /* use S1G_CAPAB_ */
	u8 nss_mcs[5];
};

Johannes Berg's avatar
Johannes Berg committed
527 528 529 530 531 532
/**
 * struct ieee80211_supported_band - frequency band definition
 *
 * This structure describes a frequency band a wiphy
 * is able to operate in.
 *
533
 * @channels: Array of channels the hardware can operate with
Johannes Berg's avatar
Johannes Berg committed
534 535 536 537 538 539 540
 *	in this band.
 * @band: the band this structure represents
 * @n_channels: Number of channels in @channels
 * @bitrates: Array of bitrates the hardware can operate with
 *	in this band. Must be sorted to give a valid "supported
 *	rates" IE, i.e. CCK rates first, then OFDM.
 * @n_bitrates: Number of bitrates in @bitrates
Johannes Berg's avatar
Johannes Berg committed
541
 * @ht_cap: HT capabilities in this band
542
 * @vht_cap: VHT capabilities in this band
543
 * @s1g_cap: S1G capabilities in this band
544
 * @edmg_cap: EDMG capabilities in this band
545
 * @s1g_cap: S1G capabilities in this band (S1B band only, of course)
Luca Coelho's avatar
Luca Coelho committed
546 547 548 549 550
 * @n_iftype_data: number of iftype data entries
 * @iftype_data: interface type data entries.  Note that the bits in
 *	@types_mask inside this structure cannot overlap (i.e. only
 *	one occurrence of each type is allowed across all instances of
 *	iftype_data).
Johannes Berg's avatar
Johannes Berg committed
551 552 553 554
 */
struct ieee80211_supported_band {
	struct ieee80211_channel *channels;
	struct ieee80211_rate *bitrates;
555
	enum nl80211_band band;
Johannes Berg's avatar
Johannes Berg committed
556 557 558
	int n_channels;
	int n_bitrates;
	struct ieee80211_sta_ht_cap ht_cap;
559
	struct ieee80211_sta_vht_cap vht_cap;
560
	struct ieee80211_sta_s1g_cap s1g_cap;
561
	struct ieee80211_edmg edmg_cap;
Luca Coelho's avatar
Luca Coelho committed
562
	u16 n_iftype_data;
563
	const struct ieee80211_sband_iftype_data __iftd *iftype_data;
Johannes Berg's avatar
Johannes Berg committed
564
};
565

566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
/**
 * _ieee80211_set_sband_iftype_data - set sband iftype data array
 * @sband: the sband to initialize
 * @iftd: the iftype data array pointer
 * @n_iftd: the length of the iftype data array
 *
 * Set the sband iftype data array; use this where the length cannot
 * be derived from the ARRAY_SIZE() of the argument, but prefer
 * ieee80211_set_sband_iftype_data() where it can be used.
 */
static inline void
_ieee80211_set_sband_iftype_data(struct ieee80211_supported_band *sband,
				 const struct ieee80211_sband_iftype_data *iftd,
				 u16 n_iftd)
{
	sband->iftype_data = (const void __iftd __force *)iftd;
	sband->n_iftype_data = n_iftd;
}

/**
 * ieee80211_set_sband_iftype_data - set sband iftype data array
 * @sband: the sband to initialize
 * @iftd: the iftype data array
 */
#define ieee80211_set_sband_iftype_data(sband, iftd)	\
	_ieee80211_set_sband_iftype_data(sband, iftd, ARRAY_SIZE(iftd))

/**
 * for_each_sband_iftype_data - iterate sband iftype data entries
 * @sband: the sband whose iftype_data array to iterate
 * @i: iterator counter
 * @iftd: iftype data pointer to set
 */
#define for_each_sband_iftype_data(sband, i, iftd)				\
	for (i = 0, iftd = (const void __force *)&(sband)->iftype_data[i];	\
	     i < (sband)->n_iftype_data;					\
	     i++, iftd = (const void __force *)&(sband)->iftype_data[i])

Luca Coelho's avatar
Luca Coelho committed
604 605 606 607 608 609 610 611 612 613 614
/**
 * ieee80211_get_sband_iftype_data - return sband data for a given iftype
 * @sband: the sband to search for the STA on
 * @iftype: enum nl80211_iftype
 *
 * Return: pointer to struct ieee80211_sband_iftype_data, or NULL is none found
 */
static inline const struct ieee80211_sband_iftype_data *
ieee80211_get_sband_iftype_data(const struct ieee80211_supported_band *sband,
				u8 iftype)
{
615
	const struct ieee80211_sband_iftype_data *data;
Luca Coelho's avatar
Luca Coelho committed
616 617 618 619 620
	int i;

	if (WARN_ON(iftype >= NL80211_IFTYPE_MAX))
		return NULL;

621 622 623
	if (iftype == NL80211_IFTYPE_AP_VLAN)
		iftype = NL80211_IFTYPE_AP;

624
	for_each_sband_iftype_data(sband, i, data) {
Luca Coelho's avatar
Luca Coelho committed
625 626 627 628 629 630 631 632
		if (data->types_mask & BIT(iftype))
			return data;
	}

	return NULL;
}

/**
633 634 635
 * ieee80211_get_he_iftype_cap - return HE capabilities for an sband's iftype
 * @sband: the sband to search for the iftype on
 * @iftype: enum nl80211_iftype
Luca Coelho's avatar
Luca Coelho committed
636 637 638 639
 *
 * Return: pointer to the struct ieee80211_sta_he_cap, or NULL is none found
 */
static inline const struct ieee80211_sta_he_cap *
640 641
ieee80211_get_he_iftype_cap(const struct ieee80211_supported_band *sband,
			    u8 iftype)
Luca Coelho's avatar
Luca Coelho committed
642 643
{
	const struct ieee80211_sband_iftype_data *data =
644
		ieee80211_get_sband_iftype_data(sband, iftype);
Luca Coelho's avatar
Luca Coelho committed
645 646 647 648 649 650 651

	if (data && data->he_cap.has_he)
		return &data->he_cap;

	return NULL;
}

652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
/**
 * ieee80211_get_he_6ghz_capa - return HE 6 GHz capabilities
 * @sband: the sband to search for the STA on
 * @iftype: the iftype to search for
 *
 * Return: the 6GHz capabilities
 */
static inline __le16
ieee80211_get_he_6ghz_capa(const struct ieee80211_supported_band *sband,
			   enum nl80211_iftype iftype)
{
	const struct ieee80211_sband_iftype_data *data =
		ieee80211_get_sband_iftype_data(sband, iftype);

	if (WARN_ON(!data || !data->he_cap.has_he))
		return 0;

	return data->he_6ghz_capa.capa;
}

672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691
/**
 * ieee80211_get_eht_iftype_cap - return ETH capabilities for an sband's iftype
 * @sband: the sband to search for the iftype on
 * @iftype: enum nl80211_iftype
 *
 * Return: pointer to the struct ieee80211_sta_eht_cap, or NULL is none found
 */
static inline const struct ieee80211_sta_eht_cap *
ieee80211_get_eht_iftype_cap(const struct ieee80211_supported_band *sband,
			     enum nl80211_iftype iftype)
{
	const struct ieee80211_sband_iftype_data *data =
		ieee80211_get_sband_iftype_data(sband, iftype);

	if (data && data->eht_cap.has_eht)
		return &data->eht_cap;

	return NULL;
}

692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719
/**
 * wiphy_read_of_freq_limits - read frequency limits from device tree
 *
 * @wiphy: the wireless device to get extra limits for
 *
 * Some devices may have extra limitations specified in DT. This may be useful
 * for chipsets that normally support more bands but are limited due to board
 * design (e.g. by antennas or external power amplifier).
 *
 * This function reads info from DT and uses it to *modify* channels (disable
 * unavailable ones). It's usually a *bad* idea to use it in drivers with
 * shared channel data as DT limitations are device specific. You should make
 * sure to call it only if channels in wiphy are copied and can be modified
 * without affecting other devices.
 *
 * As this function access device node it has to be called after set_wiphy_dev.
 * It also modifies channels so they have to be set first.
 * If using this helper, call it before wiphy_register().
 */
#ifdef CONFIG_OF
void wiphy_read_of_freq_limits(struct wiphy *wiphy);
#else /* CONFIG_OF */
static inline void wiphy_read_of_freq_limits(struct wiphy *wiphy)
{
}
#endif /* !CONFIG_OF */


Johannes Berg's avatar
Johannes Berg committed
720 721 722
/*
 * Wireless hardware/device configuration structures and methods
 */
723

724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
/**
 * DOC: Actions and configuration
 *
 * Each wireless device and each virtual interface offer a set of configuration
 * operations and other actions that are invoked by userspace. Each of these
 * actions is described in the operations structure, and the parameters these
 * operations use are described separately.
 *
 * Additionally, some operations are asynchronous and expect to get status
 * information via some functions that drivers need to call.
 *
 * Scanning and BSS list handling with its associated functionality is described
 * in a separate chapter.
 */

739 740 741
#define VHT_MUMIMO_GROUPS_DATA_LEN (WLAN_MEMBERSHIP_LEN +\
				    WLAN_USER_POSITION_LEN)

Johannes Berg's avatar
Johannes Berg committed
742 743
/**
 * struct vif_params - describes virtual interface parameters
744 745
 * @flags: monitor interface flags, unchanged if 0, otherwise
 *	%MONITOR_FLAG_CHANGED will be set
746
 * @use_4addr: use 4-address frames
747 748 749 750 751 752
 * @macaddr: address to use for this virtual interface.
 *	If this parameter is set to zero address the driver may
 *	determine the address as needed.
 *	This feature is only fully supported by drivers that enable the
 *	%NL80211_FEATURE_MAC_ON_CREATE flag.  Others may support creating
 **	only p2p devices with specified MAC.
753 754 755 756
 * @vht_mumimo_groups: MU-MIMO groupID, used for monitoring MU-MIMO packets
 *	belonging to that MU-MIMO groupID; %NULL if not changed
 * @vht_mumimo_follow_addr: MU-MIMO follow address, used for monitoring
 *	MU-MIMO packets going to the specified station; %NULL if not changed
Johannes Berg's avatar
Johannes Berg committed
757 758
 */
struct vif_params {
759
	u32 flags;
760 761
	int use_4addr;
	u8 macaddr[ETH_ALEN];
762 763
	const u8 *vht_mumimo_groups;
	const u8 *vht_mumimo_follow_addr;
Johannes Berg's avatar
Johannes Berg committed
764
};
765

Johannes Berg's avatar
Johannes Berg committed
766
/**
767 768 769 770 771 772 773 774 775 776
 * struct key_params - key information
 *
 * Information about a key
 *
 * @key: key material
 * @key_len: length of key material
 * @cipher: cipher suite selector
 * @seq: sequence counter (IV/PN) for TKIP and CCMP keys, only used
 *	with the get_key() callback, must be in little endian,
 *	length given by @seq_len.
Johannes Berg's avatar
Johannes Berg committed
777
 * @seq_len: length of @seq.
778
 * @vlan_id: vlan_id for VLAN group key (if nonzero)
779
 * @mode: key install mode (RX_TX, NO_TX or SET_TX)
780 781
 */
struct key_params {
782 783
	const u8 *key;
	const u8 *seq;
784 785
	int key_len;
	int seq_len;
786
	u16 vlan_id;
787
	u32 cipher;
788
	enum nl80211_key_mode mode;
789 790
};

791 792 793
/**
 * struct cfg80211_chan_def - channel definition
 * @chan: the (control) channel
794 795 796 797
 * @width: channel width
 * @center_freq1: center frequency of first segment
 * @center_freq2: center frequency of second segment
 *	(only with 80+80 MHz)
798 799 800 801
 * @edmg: define the EDMG channels configuration.
 *	If edmg is requested (i.e. the .channels member is non-zero),
 *	chan will define the primary channel and all other
 *	parameters are ignored.
802
 * @freq1_offset: offset from @center_freq1, in KHz
803 804 805
 */
struct cfg80211_chan_def {
	struct ieee80211_channel *chan;
806 807 808
	enum nl80211_chan_width width;
	u32 center_freq1;
	u32 center_freq2;
809
	struct ieee80211_edmg edmg;
810
	u16 freq1_offset;
811 812
};

813 814 815 816 817 818 819 820
/*
 * cfg80211_bitrate_mask - masks for bitrate control
 */
struct cfg80211_bitrate_mask {
	struct {
		u32 legacy;
		u8 ht_mcs[IEEE80211_HT_MCS_MASK_LEN];
		u16 vht_mcs[NL80211_VHT_NSS_MAX];
821
		u16 he_mcs[NL80211_HE_NSS_MAX];
822
		enum nl80211_txrate_gi gi;
823 824
		enum nl80211_he_gi he_gi;
		enum nl80211_he_ltf he_ltf;
825 826 827 828
	} control[NUM_NL80211_BANDS];
};


829
/**
830
 * struct cfg80211_tid_cfg - TID specific configuration
831 832
 * @config_override: Flag to notify driver to reset TID configuration
 *	of the peer.
833 834 835
 * @tids: bitmap of TIDs to modify
 * @mask: bitmap of attributes indicating which parameter changed,
 *	similar to &nl80211_tid_config_supp.
836
 * @noack: noack configuration value for the TID
837 838
 * @retry_long: retry count value
 * @retry_short: retry count value
839
 * @ampdu: Enable/Disable MPDU aggregation
840
 * @rtscts: Enable/Disable RTS/CTS
841
 * @amsdu: Enable/Disable MSDU aggregation
842 843
 * @txrate_type: Tx bitrate mask type
 * @txrate_mask: Tx bitrate to be applied for the TID
844
 */
845
struct cfg80211_tid_cfg {
846
	bool config_override;
847
	u8 tids;
848
	u64 mask;
849
	enum nl80211_tid_config noack;
850
	u8 retry_long, retry_short;
851
	enum nl80211_tid_config ampdu;
852
	enum nl80211_tid_config rtscts;
853
	enum nl80211_tid_config amsdu;
854 855
	enum nl80211_tx_rate_setting txrate_type;
	struct cfg80211_bitrate_mask txrate_mask;
856 857 858
};

/**
859
 * struct cfg80211_tid_config - TID configuration
860 861 862 863
 * @peer: Station's MAC address
 * @n_tid_conf: Number of TID specific configurations to be applied
 * @tid_conf: Configuration change info
 */
864
struct cfg80211_tid_config {
865 866
	const u8 *peer;
	u32 n_tid_conf;
867
	struct cfg80211_tid_cfg tid_conf[] __counted_by(n_tid_conf);
868 869
};

870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
/**
 * struct cfg80211_fils_aad - FILS AAD data
 * @macaddr: STA MAC address
 * @kek: FILS KEK
 * @kek_len: FILS KEK length
 * @snonce: STA Nonce
 * @anonce: AP Nonce
 */
struct cfg80211_fils_aad {
	const u8 *macaddr;
	const u8 *kek;
	u8 kek_len;
	const u8 *snonce;
	const u8 *anonce;
};

886 887 888 889 890 891 892 893 894 895 896 897
/**
 * struct cfg80211_set_hw_timestamp - enable/disable HW timestamping
 * @macaddr: peer MAC address. NULL to enable/disable HW timestamping for all
 *	addresses.
 * @enable: if set, enable HW timestamping for the specified MAC address.
 *	Otherwise disable HW timestamping for the specified MAC address.
 */
struct cfg80211_set_hw_timestamp {
	const u8 *macaddr;
	bool enable;
};

898 899 900 901
/**
 * cfg80211_get_chandef_type - return old channel type from chandef
 * @chandef: the channel definition
 *
902
 * Return: The old channel type (NOHT, HT20, HT40+/-) from a given
903 904
 * chandef, which must have a bandwidth allowing this conversion.
 */
905 906 907
static inline enum nl80211_channel_type
cfg80211_get_chandef_type(const struct cfg80211_chan_def *chandef)
{
908 909 910 911 912 913 914 915 916 917 918 919 920
	switch (chandef->width) {
	case NL80211_CHAN_WIDTH_20_NOHT:
		return NL80211_CHAN_NO_HT;
	case NL80211_CHAN_WIDTH_20:
		return NL80211_CHAN_HT20;
	case NL80211_CHAN_WIDTH_40:
		if (chandef->center_freq1 > chandef->chan->center_freq)
			return NL80211_CHAN_HT40PLUS;
		return NL80211_CHAN_HT40MINUS;
	default:
		WARN_ON(1);
		return NL80211_CHAN_NO_HT;
	}
921 922
}

923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939
/**
 * cfg80211_chandef_create - create channel definition using channel type
 * @chandef: the channel definition struct to fill
 * @channel: the control channel
 * @chantype: the channel type
 *
 * Given a channel type, create a channel definition.
 */
void cfg80211_chandef_create(struct cfg80211_chan_def *chandef,
			     struct ieee80211_channel *channel,
			     enum nl80211_channel_type chantype);

/**
 * cfg80211_chandef_identical - check if two channel definitions are identical
 * @chandef1: first channel definition
 * @chandef2: second channel definition
 *
940
 * Return: %true if the channels defined by the channel definitions are
941 942 943 944 945 946 947 948 949
 * identical, %false otherwise.
 */
static inline bool
cfg80211_chandef_identical(const struct cfg80211_chan_def *chandef1,
			   const struct cfg80211_chan_def *chandef2)
{
	return (chandef1->chan == chandef2->chan &&
		chandef1->width == chandef2->width &&
		chandef1->center_freq1 == chandef2->center_freq1 &&
950
		chandef1->freq1_offset == chandef2->freq1_offset &&
951 952 953
		chandef1->center_freq2 == chandef2->center_freq2);
}

954 955 956 957 958 959 960 961 962 963 964 965 966
/**
 * cfg80211_chandef_is_edmg - check if chandef represents an EDMG channel
 *
 * @chandef: the channel definition
 *
 * Return: %true if EDMG defined, %false otherwise.
 */
static inline bool
cfg80211_chandef_is_edmg(const struct cfg80211_chan_def *chandef)
{
	return chandef->edmg.channels || chandef->edmg.bw_config;
}

967 968 969 970 971
/**
 * cfg80211_chandef_compatible - check if two channel definitions are compatible
 * @chandef1: first channel definition
 * @chandef2: second channel definition
 *
972
 * Return: %NULL if the given channel definitions are incompatible,
973 974 975 976 977 978
 * chandef1 or chandef2 otherwise.
 */
const struct cfg80211_chan_def *
cfg80211_chandef_compatible(const struct cfg80211_chan_def *chandef1,
			    const struct cfg80211_chan_def *chandef2);

979 980 981
/**
 * cfg80211_chandef_valid - check if a channel definition is valid
 * @chandef: the channel definition to check
982
 * Return: %true if the channel definition is valid. %false otherwise.
983 984 985 986 987 988 989
 */
bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef);

/**
 * cfg80211_chandef_usable - check if secondary channels can be used
 * @wiphy: the wiphy to validate against
 * @chandef: the channel definition to check
990 991
 * @prohibited_flags: the regulatory channel flags that must not be set
 * Return: %true if secondary channels are usable. %false otherwise.
992 993 994 995 996
 */
bool cfg80211_chandef_usable(struct wiphy *wiphy,
			     const struct cfg80211_chan_def *chandef,
			     u32 prohibited_flags);

997 998 999 1000
/**
 * cfg80211_chandef_dfs_required - checks if radar detection is required
 * @wiphy: the wiphy to validate against
 * @chandef: the channel definition to check
1001 1002 1003
 * @iftype: the interface type as specified in &enum nl80211_iftype
 * Returns:
 *	1 if radar detection is required, 0 if it is not, < 0 on error
1004 1005
 */
int cfg80211_chandef_dfs_required(struct wiphy *wiphy,
1006
				  const struct cfg80211_chan_def *chandef,
1007
				  enum nl80211_iftype iftype);
1008

1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
/**
 * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable and we
 *				 can/need start CAC on such channel
 * @wiphy: the wiphy to validate against
 * @chandef: the channel definition to check
 *
 * Return: true if all channels available and at least
 *	   one channel requires CAC (NL80211_DFS_USABLE)
 */
bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
				 const struct cfg80211_chan_def *chandef);

/**
 * cfg80211_chandef_dfs_cac_time - get the DFS CAC time (in ms) for given
 *				   channel definition
 * @wiphy: the wiphy to validate against
 * @chandef: the channel definition to check
 *
 * Returns: DFS CAC time (in ms) which applies for this channel definition
 */
unsigned int
cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
			      const struct cfg80211_chan_def *chandef);

1033 1034 1035 1036 1037 1038 1039 1040 1041
/**
 * nl80211_send_chandef - sends the channel definition.
 * @msg: the msg to send channel definition
 * @chandef: the channel definition to check
 *
 * Returns: 0 if sent the channel definition to msg, < 0 on error
 **/
int nl80211_send_chandef(struct sk_buff *msg, const struct cfg80211_chan_def *chandef);

1042
/**
1043 1044
 * ieee80211_chanwidth_rate_flags - return rate flags for channel width
 * @width: the channel width of the channel
1045 1046 1047 1048
 *
 * In some channel types, not all rates may be used - for example CCK
 * rates may not be used in 5/10 MHz channels.
 *
1049
 * Returns: rate flags which apply for this channel width
1050 1051
 */
static inline enum ieee80211_rate_flags
1052
ieee80211_chanwidth_rate_flags(enum nl80211_chan_width width)
1053
{
1054
	switch (width) {
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064
	case NL80211_CHAN_WIDTH_5:
		return IEEE80211_RATE_SUPPORTS_5MHZ;
	case NL80211_CHAN_WIDTH_10:
		return IEEE80211_RATE_SUPPORTS_10MHZ;
	default:
		break;
	}
	return 0;
}

1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
/**
 * ieee80211_chandef_rate_flags - returns rate flags for a channel
 * @chandef: channel definition for the channel
 *
 * See ieee80211_chanwidth_rate_flags().
 *
 * Returns: rate flags which apply for this channel
 */
static inline enum ieee80211_rate_flags
ieee80211_chandef_rate_flags(struct cfg80211_chan_def *chandef)
{
	return ieee80211_chanwidth_rate_flags(chandef->width);
}

1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
/**
 * ieee80211_chandef_max_power - maximum transmission power for the chandef
 *
 * In some regulations, the transmit power may depend on the configured channel
 * bandwidth which may be defined as dBm/MHz. This function returns the actual
 * max_power for non-standard (20 MHz) channels.
 *
 * @chandef: channel definition for the channel
 *
 * Returns: maximum allowed transmission power in dBm for the chandef
 */
static inline int
ieee80211_chandef_max_power(struct cfg80211_chan_def *chandef)
{
	switch (chandef->width) {
	case NL80211_CHAN_WIDTH_5:
		return min(chandef->chan->max_reg_power - 6,
			   chandef->chan->max_power);
	case NL80211_CHAN_WIDTH_10:
		return min(chandef->chan->max_reg_power - 3,
			   chandef->chan->max_power);
	default:
		break;
	}
	return chandef->chan->max_power;
}

1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
/**
 * cfg80211_any_usable_channels - check for usable channels
 * @wiphy: the wiphy to check for
 * @band_mask: which bands to check on
 * @prohibited_flags: which channels to not consider usable,
 *	%IEEE80211_CHAN_DISABLED is always taken into account
 */
bool cfg80211_any_usable_channels(struct wiphy *wiphy,
				  unsigned long band_mask,
				  u32 prohibited_flags);

1117 1118 1119
/**
 * enum survey_info_flags - survey information flags
 *
Johannes Berg's avatar
Johannes Berg committed
1120
 * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in
1121
 * @SURVEY_INFO_IN_USE: channel is currently being used
1122 1123 1124 1125 1126
 * @SURVEY_INFO_TIME: active time (in ms) was filled in
 * @SURVEY_INFO_TIME_BUSY: busy time was filled in
 * @SURVEY_INFO_TIME_EXT_BUSY: extension channel busy time was filled in
 * @SURVEY_INFO_TIME_RX: receive time was filled in
 * @SURVEY_INFO_TIME_TX: transmit time was filled in
1127
 * @SURVEY_INFO_TIME_SCAN: scan time was filled in
1128
 * @SURVEY_INFO_TIME_BSS_RX: local BSS receive time was filled in
Johannes Berg's avatar
Johannes Berg committed
1129
 *
1130 1131 1132 1133
 * Used by the driver to indicate which info in &struct survey_info
 * it has filled in during the get_survey().
 */
enum survey_info_flags {
1134 1135 1136 1137 1138 1139 1140
	SURVEY_INFO_NOISE_DBM		= BIT(0),
	SURVEY_INFO_IN_USE		= BIT(1),
	SURVEY_INFO_TIME		= BIT(2),
	SURVEY_INFO_TIME_BUSY		= BIT(3),
	SURVEY_INFO_TIME_EXT_BUSY	= BIT(4),
	SURVEY_INFO_TIME_RX		= BIT(5),
	SURVEY_INFO_TIME_TX		= BIT(6),
1141
	SURVEY_INFO_TIME_SCAN		= BIT(7),
1142
	SURVEY_INFO_TIME_BSS_RX		= BIT(8),
1143 1144 1145 1146 1147
};

/**
 * struct survey_info - channel survey response
 *
1148 1149
 * @channel: the channel this survey record reports, may be %NULL for a single
 *	record to report global statistics
1150 1151
 * @filled: bitflag of flags from &enum survey_info_flags
 * @noise: channel noise in dBm. This and all following fields are
1152
 *	optional
1153 1154 1155 1156 1157
 * @time: amount of time in ms the radio was turn on (on the channel)
 * @time_busy: amount of time the primary channel was sensed busy
 * @time_ext_busy: amount of time the extension channel was sensed busy
 * @time_rx: amount of time the radio spent receiving data
 * @time_tx: amount of time the radio spent transmitting data
1158
 * @time_scan: amount of time the radio spent for scanning
1159
 * @time_bss_rx: amount of time the radio spent receiving data on a local BSS
1160
 *
Johannes Berg's avatar
Johannes Berg committed
1161 1162
 * Used by dump_survey() to report back per-channel survey information.
 *
1163 1164 1165 1166 1167
 * This structure can later be expanded with things like
 * channel duty cycle etc.
 */
struct survey_info {
	struct ieee80211_channel *channel;
1168 1169 1170 1171 1172
	u64 time;
	u64 time_busy;
	u64 time_ext_busy;
	u64 time_rx;
	u64 time_tx;
1173
	u64 time_scan;
1174
	u64 time_bss_rx;
1175 1176 1177 1178
	u32 filled;
	s8 noise;
};

1179
#define CFG80211_MAX_NUM_AKM_SUITES	10
1180

1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197
/**
 * struct cfg80211_crypto_settings - Crypto settings
 * @wpa_versions: indicates which, if any, WPA versions are enabled
 *	(from enum nl80211_wpa_versions)
 * @cipher_group: group key cipher suite (or 0 if unset)
 * @n_ciphers_pairwise: number of AP supported unicast ciphers
 * @ciphers_pairwise: unicast key cipher suites
 * @n_akm_suites: number of AKM suites
 * @akm_suites: AKM suites
 * @control_port: Whether user space controls IEEE 802.1X port, i.e.,
 *	sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is
 *	required to assume that the port is unauthorized until authorized by
 *	user space. Otherwise, port is marked authorized by default.
 * @control_port_ethertype: the control port protocol that should be
 *	allowed through even on unauthorized ports
 * @control_port_no_encrypt: TRUE to prevent encryption of control port
 *	protocol frames.
1198 1199
 * @control_port_over_nl80211: TRUE if userspace expects to exchange control
 *	port frames over NL80211 instead of the network interface.
1200 1201
 * @control_port_no_preauth: disables pre-auth rx over the nl80211 control
 *	port for mac80211
1202
 * @psk: PSK (for devices supporting 4-way-handshake offload)
1203 1204 1205
 * @sae_pwd: password for SAE authentication (for devices supporting SAE
 *	offload)
 * @sae_pwd_len: length of SAE password (for devices supporting SAE offload)
1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220
 * @sae_pwe: The mechanisms allowed for SAE PWE derivation:
 *
 *	NL80211_SAE_PWE_UNSPECIFIED
 *	  Not-specified, used to indicate userspace did not specify any
 *	  preference. The driver should follow its internal policy in
 *	  such a scenario.
 *
 *	NL80211_SAE_PWE_HUNT_AND_PECK
 *	  Allow hunting-and-pecking loop only
 *
 *	NL80211_SAE_PWE_HASH_TO_ELEMENT
 *	  Allow hash-to-element only
 *
 *	NL80211_SAE_PWE_BOTH
 *	  Allow either hunting-and-pecking loop or hash-to-element
1221 1222 1223 1224 1225 1226 1227
 */
struct cfg80211_crypto_settings {
	u32 wpa_versions;
	u32 cipher_group;
	int n_ciphers_pairwise;
	u32 ciphers_pairwise[NL80211_MAX_NR_CIPHER_SUITES];
	int n_akm_suites;
1228
	u32 akm_suites[CFG80211_MAX_NUM_AKM_SUITES];
1229 1230 1231
	bool control_port;
	__be16 control_port_ethertype;
	bool control_port_no_encrypt;
1232
	bool control_port_over_nl80211;
1233
	bool control_port_no_preauth;
1234
	const u8 *psk;
1235 1236
	const u8 *sae_pwd;
	u8 sae_pwd_len;
1237
	enum nl80211_sae_pwe_mechanism sae_pwe;
1238 1239
};

1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266
/**
 * struct cfg80211_mbssid_config - AP settings for multi bssid
 *
 * @tx_wdev: pointer to the transmitted interface in the MBSSID set
 * @index: index of this AP in the multi bssid group.
 * @ema: set to true if the beacons should be sent out in EMA mode.
 */
struct cfg80211_mbssid_config {
	struct wireless_dev *tx_wdev;
	u8 index;
	bool ema;
};

/**
 * struct cfg80211_mbssid_elems - Multiple BSSID elements
 *
 * @cnt: Number of elements in array %elems.
 *
 * @elem: Array of multiple BSSID element(s) to be added into Beacon frames.
 * @elem.data: Data for multiple BSSID elements.
 * @elem.len: Length of data.
 */
struct cfg80211_mbssid_elems {
	u8 cnt;
	struct {
		const u8 *data;
		size_t len;
1267
	} elem[] __counted_by(cnt);
1268 1269
};

1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283
/**
 * struct cfg80211_rnr_elems - Reduced neighbor report (RNR) elements
 *
 * @cnt: Number of elements in array %elems.
 *
 * @elem: Array of RNR element(s) to be added into Beacon frames.
 * @elem.data: Data for RNR elements.
 * @elem.len: Length of data.
 */
struct cfg80211_rnr_elems {
	u8 cnt;
	struct {
		const u8 *data;
		size_t len;
1284
	} elem[] __counted_by(cnt);
1285 1286
};

1287
/**
1288
 * struct cfg80211_beacon_data - beacon data
1289
 * @link_id: the link ID for the AP MLD link sending this beacon
1290
 * @head: head portion of beacon (before TIM IE)
1291
 *	or %NULL if not changed
1292
 * @tail: tail portion of beacon (after TIM IE)
1293
 *	or %NULL if not changed
1294 1295
 * @head_len: length of @head
 * @tail_len: length of @tail
1296 1297 1298 1299 1300 1301 1302 1303
 * @beacon_ies: extra information element(s) to add into Beacon frames or %NULL
 * @beacon_ies_len: length of beacon_ies in octets
 * @proberesp_ies: extra information element(s) to add into Probe Response
 *	frames or %NULL
 * @proberesp_ies_len: length of proberesp_ies in octets
 * @assocresp_ies: extra information element(s) to add into (Re)Association
 *	Response frames or %NULL
 * @assocresp_ies_len: length of assocresp_ies in octets
1304 1305
 * @probe_resp_len: length of probe response template (@probe_resp)
 * @probe_resp: probe response template (AP mode only)
1306
 * @mbssid_ies: multiple BSSID elements
1307
 * @rnr_ies: reduced neighbor report elements
1308 1309
 * @ftm_responder: enable FTM responder functionality; -1 for no change
 *	(which also implies no change in LCI/civic location data)
1310 1311 1312 1313
 * @lci: Measurement Report element content, starting with Measurement Token
 *	(measurement type 8)
 * @civicloc: Measurement Report element content, starting with Measurement
 *	Token (measurement type 11)
1314 1315
 * @lci_len: LCI data length
 * @civicloc_len: Civic location data length
1316 1317
 * @he_bss_color: BSS Color settings
 * @he_bss_color_valid: indicates whether bss color
1318
 *	attribute is present in beacon data or not.
1319
 */
1320
struct cfg80211_beacon_data {
1321 1322
	unsigned int link_id;

1323 1324 1325 1326 1327
	const u8 *head, *tail;
	const u8 *beacon_ies;
	const u8 *proberesp_ies;
	const u8 *assocresp_ies;
	const u8 *probe_resp;
1328 1329
	const u8 *lci;
	const u8 *civicloc;
1330
	struct cfg80211_mbssid_elems *mbssid_ies;
1331
	struct cfg80211_rnr_elems *rnr_ies;
1332
	s8 ftm_responder;
1333 1334 1335 1336 1337 1338

	size_t head_len, tail_len;
	size_t beacon_ies_len;
	size_t proberesp_ies_len;
	size_t assocresp_ies_len;
	size_t probe_resp_len;
1339 1340
	size_t lci_len;
	size_t civicloc_len;
1341 1342
	struct cfg80211_he_bss_color he_bss_color;
	bool he_bss_color_valid;
1343 1344
};

1345 1346 1347 1348
struct mac_address {
	u8 addr[ETH_ALEN];
};

1349 1350 1351 1352
/**
 * struct cfg80211_acl_data - Access control list data
 *
 * @acl_policy: ACL policy to be applied on the station's
Johannes Berg's avatar
Johannes Berg committed
1353
 *	entry specified by mac_addr
1354 1355 1356 1357 1358 1359 1360 1361
 * @n_acl_entries: Number of MAC address entries passed
 * @mac_addrs: List of MAC addresses of stations to be used for ACL
 */
struct cfg80211_acl_data {
	enum nl80211_acl_policy acl_policy;
	int n_acl_entries;

	/* Keep it last */
1362
	struct mac_address mac_addrs[] __counted_by(n_acl_entries);
1363 1364
};

1365 1366 1367 1368
/**
 * struct cfg80211_fils_discovery - FILS discovery parameters from
 * IEEE Std 802.11ai-2016, Annex C.3 MIB detail.
 *
1369
 * @update: Set to true if the feature configuration should be updated.
1370 1371 1372 1373 1374 1375 1376
 * @min_interval: Minimum packet interval in TUs (0 - 10000)
 * @max_interval: Maximum packet interval in TUs (0 - 10000)
 * @tmpl_len: Template length
 * @tmpl: Template data for FILS discovery frame including the action
 *	frame headers.
 */
struct cfg80211_fils_discovery {
1377
	bool update;
1378 1379 1380 1381 1382 1383
	u32 min_interval;
	u32 max_interval;
	size_t tmpl_len;
	const u8 *tmpl;
};

1384 1385 1386 1387
/**
 * struct cfg80211_unsol_bcast_probe_resp - Unsolicited broadcast probe
 *	response parameters in 6GHz.
 *
1388
 * @update: Set to true if the feature configuration should be updated.
1389 1390 1391 1392 1393 1394 1395
 * @interval: Packet interval in TUs. Maximum allowed is 20 TU, as mentioned
 *	in IEEE P802.11ax/D6.0 26.17.2.3.2 - AP behavior for fast passive
 *	scanning
 * @tmpl_len: Template length
 * @tmpl: Template data for probe response
 */
struct cfg80211_unsol_bcast_probe_resp {
1396
	bool update;
1397 1398 1399 1400 1401
	u32 interval;
	size_t tmpl_len;
	const u8 *tmpl;
};

1402 1403 1404 1405 1406
/**
 * struct cfg80211_ap_settings - AP configuration
 *
 * Used to configure an AP interface.
 *
1407
 * @chandef: defines the channel to use
1408 1409 1410 1411 1412 1413 1414 1415 1416 1417
 * @beacon: beacon data
 * @beacon_interval: beacon interval
 * @dtim_period: DTIM period
 * @ssid: SSID to be used in the BSS (note: may be %NULL if not provided from
 *	user space)
 * @ssid_len: length of @ssid
 * @hidden_ssid: whether to hide the SSID in Beacon/Probe Response frames
 * @crypto: crypto settings
 * @privacy: the BSS uses privacy
 * @auth_type: Authentication type (algorithm)
1418
 * @smps_mode: SMPS mode
1419
 * @inactivity_timeout: time in seconds to determine station's inactivity.
1420 1421
 * @p2p_ctwindow: P2P CT Window
 * @p2p_opp_ps: P2P opportunistic PS
1422 1423
 * @acl: ACL configuration used by the drivers which has support for
 *	MAC address based access control
1424 1425
 * @pbss: If set, start as a PCP instead of AP. Relevant for DMG
 *	networks.
1426
 * @beacon_rate: bitrate to be used for beacons
1427 1428
 * @ht_cap: HT capabilities (or %NULL if HT isn't enabled)
 * @vht_cap: VHT capabilities (or %NULL if VHT isn't enabled)
1429
 * @he_cap: HE capabilities (or %NULL if HE isn't enabled)
1430 1431
 * @eht_cap: EHT capabilities (or %NULL if EHT isn't enabled)
 * @eht_oper: EHT operation IE (or %NULL if EHT isn't enabled)
1432 1433
 * @ht_required: stations must support HT
 * @vht_required: stations must support VHT
1434
 * @twt_responder: Enable Target Wait Time
1435
 * @he_required: stations must support HE
1436
 * @sae_h2e_required: stations must support direct H2E technique in SAE
1437
 * @flags: flags, as defined in &enum nl80211_ap_settings_flags
1438
 * @he_obss_pd: OBSS Packet Detection settings
1439
 * @he_oper: HE operation IE (or %NULL if HE isn't enabled)
1440
 * @fils_discovery: FILS discovery transmission parameters
1441
 * @unsol_bcast_probe_resp: Unsolicited broadcast probe response parameters
1442
 * @mbssid_config: AP settings for multiple bssid
1443 1444 1445
 * @punct_bitmap: Preamble puncturing bitmap. Each bit represents
 *	a 20 MHz channel, lowest bit corresponding to the lowest channel.
 *	Bit set to 1 indicates that the channel is punctured.
1446 1447
 */
struct cfg80211_ap_settings {
1448
	struct cfg80211_chan_def chandef;
1449

1450 1451 1452
	struct cfg80211_beacon_data beacon;

	int beacon_interval, dtim_period;
1453 1454 1455
	const u8 *ssid;
	size_t ssid_len;
	enum nl80211_hidden_ssid hidden_ssid;
1456 1457 1458
	struct cfg80211_crypto_settings crypto;
	bool privacy;
	enum nl80211_auth_type auth_type;
1459
	enum nl80211_smps_mode smps_mode;
1460
	int inactivity_timeout;
1461 1462
	u8 p2p_ctwindow;
	bool p2p_opp_ps;
1463
	const struct cfg80211_acl_data *acl;
1464
	bool pbss;
1465
	struct cfg80211_bitrate_mask beacon_rate;
1466 1467 1468

	const struct ieee80211_ht_cap *ht_cap;
	const struct ieee80211_vht_cap *vht_cap;
1469
	const struct ieee80211_he_cap_elem *he_cap;
1470
	const struct ieee80211_he_operation *he_oper;
1471 1472
	const struct ieee80211_eht_cap_elem *eht_cap;
	const struct ieee80211_eht_operation *eht_oper;
1473
	bool ht_required, vht_required, he_required, sae_h2e_required;
1474
	bool twt_responder;
1475
	u32 flags;
1476
	struct ieee80211_he_obss_pd he_obss_pd;
1477
	struct cfg80211_fils_discovery fils_discovery;
1478
	struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp;
1479
	struct cfg80211_mbssid_config mbssid_config;
1480
	u16 punct_bitmap;
1481 1482
};

1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498

/**
 * struct cfg80211_ap_update - AP configuration update
 *
 * Subset of &struct cfg80211_ap_settings, for updating a running AP.
 *
 * @beacon: beacon data
 * @fils_discovery: FILS discovery transmission parameters
 * @unsol_bcast_probe_resp: Unsolicited broadcast probe response parameters
 */
struct cfg80211_ap_update {
	struct cfg80211_beacon_data beacon;
	struct cfg80211_fils_discovery fils_discovery;
	struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp;
};

1499 1500 1501 1502 1503 1504 1505
/**
 * struct cfg80211_csa_settings - channel switch settings
 *
 * Used for channel switch
 *
 * @chandef: defines the channel to use after the switch
 * @beacon_csa: beacon data while performing the switch
1506 1507 1508 1509
 * @counter_offsets_beacon: offsets of the counters within the beacon (tail)
 * @counter_offsets_presp: offsets of the counters within the probe response
 * @n_counter_offsets_beacon: number of csa counters the beacon (tail)
 * @n_counter_offsets_presp: number of csa counters in the probe response
1510 1511 1512 1513
 * @beacon_after: beacon data to be used on the new channel
 * @radar_required: whether radar detection is required on the new channel
 * @block_tx: whether transmissions should be blocked while changing
 * @count: number of beacons until switch
1514 1515 1516
 * @punct_bitmap: Preamble puncturing bitmap. Each bit represents
 *	a 20 MHz channel, lowest bit corresponding to the lowest channel.
 *	Bit set to 1 indicates that the channel is punctured.
1517 1518 1519 1520
 */
struct cfg80211_csa_settings {
	struct cfg80211_chan_def chandef;
	struct cfg80211_beacon_data beacon_csa;
1521 1522 1523 1524
	const u16 *counter_offsets_beacon;
	const u16 *counter_offsets_presp;
	unsigned int n_counter_offsets_beacon;
	unsigned int n_counter_offsets_presp;
1525 1526 1527 1528
	struct cfg80211_beacon_data beacon_after;
	bool radar_required;
	bool block_tx;
	u8 count;
1529
	u16 punct_bitmap;
1530 1531
};

1532 1533 1534 1535 1536 1537
/**
 * struct cfg80211_color_change_settings - color change settings
 *
 * Used for bss color change
 *
 * @beacon_color_change: beacon data while performing the color countdown
1538 1539
 * @counter_offset_beacon: offsets of the counters within the beacon (tail)
 * @counter_offset_presp: offsets of the counters within the probe response
1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552
 * @beacon_next: beacon data to be used after the color change
 * @count: number of beacons until the color change
 * @color: the color used after the change
 */
struct cfg80211_color_change_settings {
	struct cfg80211_beacon_data beacon_color_change;
	u16 counter_offset_beacon;
	u16 counter_offset_presp;
	struct cfg80211_beacon_data beacon_next;
	u8 count;
	u8 color;
};

1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565
/**
 * struct iface_combination_params - input parameters for interface combinations
 *
 * Used to pass interface combination parameters
 *
 * @num_different_channels: the number of different channels we want
 *	to use for verification
 * @radar_detect: a bitmap where each bit corresponds to a channel
 *	width where radar detection is needed, as in the definition of
 *	&struct ieee80211_iface_combination.@radar_detect_widths
 * @iftype_num: array with the number of interfaces of each interface
 *	type.  The index is the interface type as specified in &enum
 *	nl80211_iftype.
1566 1567 1568
 * @new_beacon_int: set this to the beacon interval of a new interface
 *	that's not operating yet, if such is to be checked as part of
 *	the verification
1569 1570 1571 1572 1573
 */
struct iface_combination_params {
	int num_different_channels;
	u8 radar_detect;
	int iftype_num[NUM_NL80211_IFTYPES];
1574
	u32 new_beacon_int;
1575 1576
};

1577 1578 1579
/**
 * enum station_parameters_apply_mask - station parameter values to apply
 * @STATION_PARAM_APPLY_UAPSD: apply new uAPSD parameters (uapsd_queues, max_sp)
1580
 * @STATION_PARAM_APPLY_CAPABILITY: apply new capability
1581
 * @STATION_PARAM_APPLY_PLINK_STATE: apply new plink state
1582 1583 1584 1585 1586 1587
 *
 * Not all station parameters have in-band "no change" signalling,
 * for those that don't these flags will are used.
 */
enum station_parameters_apply_mask {
	STATION_PARAM_APPLY_UAPSD = BIT(0),
1588
	STATION_PARAM_APPLY_CAPABILITY = BIT(1),
1589
	STATION_PARAM_APPLY_PLINK_STATE = BIT(2),
1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609
};

/**
 * struct sta_txpwr - station txpower configuration
 *
 * Used to configure txpower for station.
 *
 * @power: tx power (in dBm) to be used for sending data traffic. If tx power
 *	is not provided, the default per-interface tx power setting will be
 *	overriding. Driver should be picking up the lowest tx power, either tx
 *	power per-interface or per-station.
 * @type: In particular if TPC %type is NL80211_TX_POWER_LIMITED then tx power
 *	will be less than or equal to specified from userspace, whereas if TPC
 *	%type is NL80211_TX_POWER_AUTOMATIC then it indicates default tx power.
 *	NL80211_TX_POWER_FIXED is not a valid configuration option for
 *	per peer TPC.
 */
struct sta_txpwr {
	s16 power;
	enum nl80211_tx_power_setting type;
1610 1611
};

1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666
/**
 * struct link_station_parameters - link station parameters
 *
 * Used to change and create a new link station.
 *
 * @mld_mac: MAC address of the station
 * @link_id: the link id (-1 for non-MLD station)
 * @link_mac: MAC address of the link
 * @supported_rates: supported rates in IEEE 802.11 format
 *	(or NULL for no change)
 * @supported_rates_len: number of supported rates
 * @ht_capa: HT capabilities of station
 * @vht_capa: VHT capabilities of station
 * @opmode_notif: operating mode field from Operating Mode Notification
 * @opmode_notif_used: information if operating mode field is used
 * @he_capa: HE capabilities of station
 * @he_capa_len: the length of the HE capabilities
 * @txpwr: transmit power for an associated station
 * @txpwr_set: txpwr field is set
 * @he_6ghz_capa: HE 6 GHz Band capabilities of station
 * @eht_capa: EHT capabilities of station
 * @eht_capa_len: the length of the EHT capabilities
 */
struct link_station_parameters {
	const u8 *mld_mac;
	int link_id;
	const u8 *link_mac;
	const u8 *supported_rates;
	u8 supported_rates_len;
	const struct ieee80211_ht_cap *ht_capa;
	const struct ieee80211_vht_cap *vht_capa;
	u8 opmode_notif;
	bool opmode_notif_used;
	const struct ieee80211_he_cap_elem *he_capa;
	u8 he_capa_len;
	struct sta_txpwr txpwr;
	bool txpwr_set;
	const struct ieee80211_he_6ghz_capa *he_6ghz_capa;
	const struct ieee80211_eht_cap_elem *eht_capa;
	u8 eht_capa_len;
};

/**
 * struct link_station_del_parameters - link station deletion parameters
 *
 * Used to delete a link station entry (or all stations).
 *
 * @mld_mac: MAC address of the station
 * @link_id: the link id
 */
struct link_station_del_parameters {
	const u8 *mld_mac;
	u32 link_id;
};

1667 1668 1669 1670 1671 1672
/**
 * struct station_parameters - station parameters
 *
 * Used to change and create a new station.
 *
 * @vlan: vlan interface station should belong to
1673
 * @sta_flags_mask: station flags that changed
1674
 *	(bitmask of BIT(%NL80211_STA_FLAG_...))
1675
 * @sta_flags_set: station flags values
1676
 *	(bitmask of BIT(%NL80211_STA_FLAG_...))
1677 1678
 * @listen_interval: listen interval or -1 for no change
 * @aid: AID or zero for no change
1679
 * @vlan_id: VLAN ID for station (if nonzero)
1680
 * @peer_aid: mesh peer AID or zero for no change
Johannes Berg's avatar
Johannes Berg committed
1681
 * @plink_action: plink action to take
1682
 * @plink_state: set the peer link state for a station
1683 1684 1685 1686
 * @uapsd_queues: bitmap of queues configured for uapsd. same format
 *	as the AC bitmap in the QoS info field
 * @max_sp: max Service Period. same format as the MAX_SP in the
 *	QoS info field (but already shifted down)
1687 1688 1689
 * @sta_modify_mask: bitmap indicating which parameters changed
 *	(for those that don't have a natural "no change" value),
 *	see &enum station_parameters_apply_mask
1690 1691
 * @local_pm: local link-specific mesh power save mode (no change when set
 *	to unknown)
1692 1693 1694
 * @capability: station capability
 * @ext_capab: extended capabilities of the station
 * @ext_capab_len: number of extended capabilities
1695 1696 1697 1698
 * @supported_channels: supported channels in IEEE 802.11 format
 * @supported_channels_len: number of supported channels
 * @supported_oper_classes: supported oper classes in IEEE 802.11 format
 * @supported_oper_classes_len: number of supported operating classes
1699
 * @support_p2p_ps: information if station supports P2P PS mechanism
1700
 * @airtime_weight: airtime scheduler weight for this station
1701
 * @link_sta_params: link related params.
1702 1703 1704
 */
struct station_parameters {
	struct net_device *vlan;
1705
	u32 sta_flags_mask, sta_flags_set;
1706
	u32 sta_modify_mask;
1707 1708
	int listen_interval;
	u16 aid;
1709
	u16 vlan_id;
1710
	u16 peer_aid;
1711
	u8 plink_action;
1712
	u8 plink_state;
1713 1714
	u8 uapsd_queues;
	u8 max_sp;
1715
	enum nl80211_mesh_power_mode local_pm;
1716
	u16 capability;
1717
	const u8 *ext_capab;
1718
	u8 ext_capab_len;
1719 1720 1721 1722
	const u8 *supported_channels;
	u8 supported_channels_len;
	const u8 *supported_oper_classes;
	u8 supported_oper_classes_len;
1723
	int support_p2p_ps;
1724
	u16 airtime_weight;
1725
	struct link_station_parameters link_sta_params;
1726 1727
};

1728 1729 1730 1731 1732 1733
/**
 * struct station_del_parameters - station deletion parameters
 *
 * Used to delete a station entry (or all stations).
 *
 * @mac: MAC address of the station to remove or NULL to remove all stations
1734 1735 1736
 * @subtype: Management frame subtype to use for indicating removal
 *	(10 = Disassociation, 12 = Deauthentication)
 * @reason_code: Reason code for the Disassociation/Deauthentication frame
1737 1738 1739
 */
struct station_del_parameters {
	const u8 *mac;
1740 1741
	u8 subtype;
	u16 reason_code;
1742 1743
};

1744 1745 1746
/**
 * enum cfg80211_station_type - the type of station being modified
 * @CFG80211_STA_AP_CLIENT: client of an AP interface
1747 1748
 * @CFG80211_STA_AP_CLIENT_UNASSOC: client of an AP interface that is still
 *	unassociated (update properties for this type of client is permitted)
1749 1750 1751 1752 1753 1754 1755 1756 1757 1758
 * @CFG80211_STA_AP_MLME_CLIENT: client of an AP interface that has
 *	the AP MLME in the device
 * @CFG80211_STA_AP_STA: AP station on managed interface
 * @CFG80211_STA_IBSS: IBSS station
 * @CFG80211_STA_TDLS_PEER_SETUP: TDLS peer on managed interface (dummy entry
 *	while TDLS setup is in progress, it moves out of this state when
 *	being marked authorized; use this only if TDLS with external setup is
 *	supported/used)
 * @CFG80211_STA_TDLS_PEER_ACTIVE: TDLS peer on managed interface (active
 *	entry that is operating, has been marked authorized by userspace)
1759 1760
 * @CFG80211_STA_MESH_PEER_KERNEL: peer on mesh interface (kernel managed)
 * @CFG80211_STA_MESH_PEER_USER: peer on mesh interface (user managed)
1761 1762 1763
 */
enum cfg80211_station_type {
	CFG80211_STA_AP_CLIENT,
1764
	CFG80211_STA_AP_CLIENT_UNASSOC,
1765 1766 1767 1768 1769
	CFG80211_STA_AP_MLME_CLIENT,
	CFG80211_STA_AP_STA,
	CFG80211_STA_IBSS,
	CFG80211_STA_TDLS_PEER_SETUP,
	CFG80211_STA_TDLS_PEER_ACTIVE,
1770 1771
	CFG80211_STA_MESH_PEER_KERNEL,
	CFG80211_STA_MESH_PEER_USER,
1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
};

/**
 * cfg80211_check_station_change - validate parameter changes
 * @wiphy: the wiphy this operates on
 * @params: the new parameters for a station
 * @statype: the type of station being modified
 *
 * Utility function for the @change_station driver method. Call this function
 * with the appropriate station type looking up the station (and checking that
 * it exists). It will verify whether the station change is acceptable, and if
 * not will return an error code. Note that it may modify the parameters for
 * backward compatibility reasons, so don't use them before calling this.
 */
int cfg80211_check_station_change(struct wiphy *wiphy,
				  struct station_parameters *params,
				  enum cfg80211_station_type statype);

1790
/**
1791
 * enum rate_info_flags - bitrate info flags
1792 1793 1794 1795
 *
 * Used by the driver to indicate the specific rate transmission
 * type for 802.11n transmissions.
 *
1796 1797
 * @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS
 * @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS
1798
 * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval
1799
 * @RATE_INFO_FLAGS_DMG: 60GHz MCS
Luca Coelho's avatar
Luca Coelho committed
1800
 * @RATE_INFO_FLAGS_HE_MCS: HE MCS information
1801
 * @RATE_INFO_FLAGS_EDMG: 60GHz MCS in EDMG mode
1802
 * @RATE_INFO_FLAGS_EXTENDED_SC_DMG: 60GHz extended SC MCS
1803
 * @RATE_INFO_FLAGS_EHT_MCS: EHT MCS information
1804
 * @RATE_INFO_FLAGS_S1G_MCS: MCS field filled with S1G MCS
1805 1806
 */
enum rate_info_flags {
1807 1808
	RATE_INFO_FLAGS_MCS			= BIT(0),
	RATE_INFO_FLAGS_VHT_MCS			= BIT(1),
1809
	RATE_INFO_FLAGS_SHORT_GI		= BIT(2),
1810
	RATE_INFO_FLAGS_DMG			= BIT(3),
Luca Coelho's avatar
Luca Coelho committed
1811
	RATE_INFO_FLAGS_HE_MCS			= BIT(4),
1812
	RATE_INFO_FLAGS_EDMG			= BIT(5),
1813
	RATE_INFO_FLAGS_EXTENDED_SC_DMG		= BIT(6),
1814
	RATE_INFO_FLAGS_EHT_MCS			= BIT(7),
1815
	RATE_INFO_FLAGS_S1G_MCS			= BIT(8),
1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828
};

/**
 * enum rate_info_bw - rate bandwidth information
 *
 * Used by the driver to indicate the rate bandwidth.
 *
 * @RATE_INFO_BW_5: 5 MHz bandwidth
 * @RATE_INFO_BW_10: 10 MHz bandwidth
 * @RATE_INFO_BW_20: 20 MHz bandwidth
 * @RATE_INFO_BW_40: 40 MHz bandwidth
 * @RATE_INFO_BW_80: 80 MHz bandwidth
 * @RATE_INFO_BW_160: 160 MHz bandwidth
Luca Coelho's avatar
Luca Coelho committed
1829
 * @RATE_INFO_BW_HE_RU: bandwidth determined by HE RU allocation
1830 1831
 * @RATE_INFO_BW_320: 320 MHz bandwidth
 * @RATE_INFO_BW_EHT_RU: bandwidth determined by EHT RU allocation
1832 1833 1834 1835 1836
 * @RATE_INFO_BW_1: 1 MHz bandwidth
 * @RATE_INFO_BW_2: 2 MHz bandwidth
 * @RATE_INFO_BW_4: 4 MHz bandwidth
 * @RATE_INFO_BW_8: 8 MHz bandwidth
 * @RATE_INFO_BW_16: 16 MHz bandwidth
1837 1838
 */
enum rate_info_bw {
1839
	RATE_INFO_BW_20 = 0,
1840 1841 1842 1843 1844
	RATE_INFO_BW_5,
	RATE_INFO_BW_10,
	RATE_INFO_BW_40,
	RATE_INFO_BW_80,
	RATE_INFO_BW_160,
Luca Coelho's avatar
Luca Coelho committed
1845
	RATE_INFO_BW_HE_RU,
1846 1847
	RATE_INFO_BW_320,
	RATE_INFO_BW_EHT_RU,
1848 1849 1850 1851 1852
	RATE_INFO_BW_1,
	RATE_INFO_BW_2,
	RATE_INFO_BW_4,
	RATE_INFO_BW_8,
	RATE_INFO_BW_16,
1853 1854 1855 1856 1857 1858 1859 1860 1861
};

/**
 * struct rate_info - bitrate information
 *
 * Information about a receiving or transmitting bitrate
 *
 * @flags: bitflag of flags from &enum rate_info_flags
 * @legacy: bitrate in 100kbit/s for 802.11abg
1862
 * @mcs: mcs index if struct describes an HT/VHT/HE/EHT/S1G rate
Luca Coelho's avatar
Luca Coelho committed
1863
 * @nss: number of streams (VHT & HE only)
1864
 * @bw: bandwidth (from &enum rate_info_bw)
Luca Coelho's avatar
Luca Coelho committed
1865 1866 1867 1868
 * @he_gi: HE guard interval (from &enum nl80211_he_gi)
 * @he_dcm: HE DCM value
 * @he_ru_alloc: HE RU allocation (from &enum nl80211_he_ru_alloc,
 *	only valid if bw is %RATE_INFO_BW_HE_RU)
1869
 * @n_bonded_ch: In case of EDMG the number of bonded channels (1-4)
1870 1871 1872
 * @eht_gi: EHT guard interval (from &enum nl80211_eht_gi)
 * @eht_ru_alloc: EHT RU allocation (from &enum nl80211_eht_ru_alloc,
 *	only valid if bw is %RATE_INFO_BW_EHT_RU)
1873 1874
 */
struct rate_info {
1875
	u16 flags;
1876
	u16 legacy;
1877
	u8 mcs;
1878
	u8 nss;
1879
	u8 bw;
Luca Coelho's avatar
Luca Coelho committed
1880 1881 1882
	u8 he_gi;
	u8 he_dcm;
	u8 he_ru_alloc;
1883
	u8 n_bonded_ch;
1884 1885
	u8 eht_gi;
	u8 eht_ru_alloc;
1886 1887
};

1888
/**
1889
 * enum bss_param_flags - bitrate info flags
1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918
 *
 * Used by the driver to indicate the specific rate transmission
 * type for 802.11n transmissions.
 *
 * @BSS_PARAM_FLAGS_CTS_PROT: whether CTS protection is enabled
 * @BSS_PARAM_FLAGS_SHORT_PREAMBLE: whether short preamble is enabled
 * @BSS_PARAM_FLAGS_SHORT_SLOT_TIME: whether short slot time is enabled
 */
enum bss_param_flags {
	BSS_PARAM_FLAGS_CTS_PROT	= 1<<0,
	BSS_PARAM_FLAGS_SHORT_PREAMBLE	= 1<<1,
	BSS_PARAM_FLAGS_SHORT_SLOT_TIME	= 1<<2,
};

/**
 * struct sta_bss_parameters - BSS parameters for the attached station
 *
 * Information about the currently associated BSS
 *
 * @flags: bitflag of flags from &enum bss_param_flags
 * @dtim_period: DTIM period for the BSS
 * @beacon_interval: beacon interval
 */
struct sta_bss_parameters {
	u8 flags;
	u8 dtim_period;
	u16 beacon_interval;
};

1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949
/**
 * struct cfg80211_txq_stats - TXQ statistics for this TID
 * @filled: bitmap of flags using the bits of &enum nl80211_txq_stats to
 *	indicate the relevant values in this struct are filled
 * @backlog_bytes: total number of bytes currently backlogged
 * @backlog_packets: total number of packets currently backlogged
 * @flows: number of new flows seen
 * @drops: total number of packets dropped
 * @ecn_marks: total number of packets marked with ECN CE
 * @overlimit: number of drops due to queue space overflow
 * @overmemory: number of drops due to memory limit overflow
 * @collisions: number of hash collisions
 * @tx_bytes: total number of bytes dequeued
 * @tx_packets: total number of packets dequeued
 * @max_flows: maximum number of flows supported
 */
struct cfg80211_txq_stats {
	u32 filled;
	u32 backlog_bytes;
	u32 backlog_packets;
	u32 flows;
	u32 drops;
	u32 ecn_marks;
	u32 overlimit;
	u32 overmemory;
	u32 collisions;
	u32 tx_bytes;
	u32 tx_packets;
	u32 max_flows;
};

1950 1951 1952 1953 1954 1955 1956 1957 1958
/**
 * struct cfg80211_tid_stats - per-TID statistics
 * @filled: bitmap of flags using the bits of &enum nl80211_tid_stats to
 *	indicate the relevant values in this struct are filled
 * @rx_msdu: number of received MSDUs
 * @tx_msdu: number of (attempted) transmitted MSDUs
 * @tx_msdu_retries: number of retries (not counting the first) for
 *	transmitted MSDUs
 * @tx_msdu_failed: number of failed transmitted MSDUs
1959
 * @txq_stats: TXQ statistics
1960 1961 1962 1963 1964 1965 1966
 */
struct cfg80211_tid_stats {
	u32 filled;
	u64 rx_msdu;
	u64 tx_msdu;
	u64 tx_msdu_retries;
	u64 tx_msdu_failed;
1967
	struct cfg80211_txq_stats txq_stats;
1968 1969
};

1970 1971
#define IEEE80211_MAX_CHAINS	4

1972
/**
1973
 * struct station_info - station information
1974
 *
1975
 * Station information filled by driver for get_station() and dump_station.
1976
 *
1977 1978
 * @filled: bitflag of flags using the bits of &enum nl80211_sta_info to
 *	indicate the relevant values in this struct for them
1979
 * @connected_time: time(in secs) since a station is last connected
1980
 * @inactive_time: time since last station activity (tx/rx) in milliseconds
1981
 * @assoc_at: bootime (ns) of the last association
1982 1983
 * @rx_bytes: bytes (size of MPDUs) received from this station
 * @tx_bytes: bytes (size of MPDUs) transmitted to this station
1984 1985 1986
 * @llid: mesh local link id
 * @plid: mesh peer link id
 * @plink_state: mesh peer link state
1987 1988 1989 1990
 * @signal: The signal strength, type depends on the wiphy's signal_type.
 *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
 * @signal_avg: Average signal strength, type depends on the wiphy's signal_type.
 *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
1991 1992 1993
 * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg
 * @chain_signal: per-chain signal strength of last received packet in dBm
 * @chain_signal_avg: per-chain signal strength average in dBm
1994 1995
 * @txrate: current unicast bitrate from this station
 * @rxrate: current unicast bitrate to this station
1996 1997 1998 1999
 * @rx_packets: packets (MSDUs & MMPDUs) received from this station
 * @tx_packets: packets (MSDUs & MMPDUs) transmitted to this station
 * @tx_retries: cumulative retry counts (MPDUs)
 * @tx_failed: number of failed transmissions (MPDUs) (retries exceeded, no ACK)
2000
 * @rx_dropped_misc:  Dropped for un-specified reason.
2001
 * @bss_param: current BSS parameters
2002 2003 2004 2005
 * @generation: generation number for nl80211 dumps.
 *	This number should increase every time the list of stations
 *	changes, i.e. when a station is added or removed, so that
 *	userspace can tell whether it got a consistent snapshot.
2006 2007 2008 2009 2010
 * @assoc_req_ies: IEs from (Re)Association Request.
 *	This is used only when in AP mode with drivers that do not use
 *	user space MLME/SME implementation. The information is provided for
 *	the cfg80211_new_sta() calls to notify user space of the IEs.
 * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets.
2011
 * @sta_flags: station flags mask & values
2012
 * @beacon_loss_count: Number of times beacon loss event has triggered.
2013
 * @t_offset: Time offset of the station relative to this host.
2014 2015 2016
 * @local_pm: local mesh STA power save mode
 * @peer_pm: peer mesh STA power save mode
 * @nonpeer_pm: non-peer mesh STA power save mode
2017 2018
 * @expected_throughput: expected throughput in kbps (including 802.11 headers)
 *	towards this station.
2019 2020 2021
 * @rx_beacon: number of beacons received from this peer
 * @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received
 *	from this peer
2022
 * @connected_to_gate: true if mesh STA has a path to mesh gate
2023
 * @rx_duration: aggregate PPDU duration(usecs) for all the frames from a peer
2024 2025
 * @tx_duration: aggregate PPDU duration(usecs) for all the frames to a peer
 * @airtime_weight: current airtime scheduling weight
2026 2027
 * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last
 *	(IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs.
2028
 *	Note that this doesn't use the @filled bit, but is used if non-NULL.
2029
 * @ack_signal: signal strength (in dBm) of the last ACK frame.
2030 2031
 * @avg_ack_signal: average rssi value of ack packet for the no of msdu's has
 *	been sent.
2032 2033 2034 2035
 * @rx_mpdu_count: number of MPDUs received from this station
 * @fcs_err_count: number of packets (MPDUs) received from this station with
 *	an FCS error. This counter should be incremented only when TA of the
 *	received packet with an FCS error matches the peer MAC address.
2036
 * @airtime_link_metric: mesh airtime link metric.
2037
 * @connected_to_as: true if mesh STA has a path to authentication server
2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055
 * @mlo_params_valid: Indicates @assoc_link_id and @mld_addr fields are filled
 *	by driver. Drivers use this only in cfg80211_new_sta() calls when AP
 *	MLD's MLME/SME is offload to driver. Drivers won't fill this
 *	information in cfg80211_del_sta_sinfo(), get_station() and
 *	dump_station() callbacks.
 * @assoc_link_id: Indicates MLO link ID of the AP, with which the station
 *	completed (re)association. This information filled for both MLO
 *	and non-MLO STA connections when the AP affiliated with an MLD.
 * @mld_addr: For MLO STA connection, filled with MLD address of the station.
 *	For non-MLO STA connection, filled with all zeros.
 * @assoc_resp_ies: IEs from (Re)Association Response.
 *	This is used only when in AP mode with drivers that do not use user
 *	space MLME/SME implementation. The information is provided only for the
 *	cfg80211_new_sta() calls to notify user space of the IEs. Drivers won't
 *	fill this information in cfg80211_del_sta_sinfo(), get_station() and
 *	dump_station() callbacks. User space needs this information to determine
 *	the accepted and rejected affiliated links of the connected station.
 * @assoc_resp_ies_len: Length of @assoc_resp_ies buffer in octets.
2056
 */
2057
struct station_info {
2058
	u64 filled;
2059
	u32 connected_time;
2060
	u32 inactive_time;
2061
	u64 assoc_at;
2062 2063
	u64 rx_bytes;
	u64 tx_bytes;
2064 2065 2066
	u16 llid;
	u16 plid;
	u8 plink_state;
2067
	s8 signal;
2068
	s8 signal_avg;
2069 2070 2071 2072 2073

	u8 chains;
	s8 chain_signal[IEEE80211_MAX_CHAINS];
	s8 chain_signal_avg[IEEE80211_MAX_CHAINS];

2074
	struct rate_info txrate;
2075
	struct rate_info rxrate;
2076 2077
	u32 rx_packets;
	u32 tx_packets;
2078 2079
	u32 tx_retries;
	u32 tx_failed;
2080
	u32 rx_dropped_misc;
2081
	struct sta_bss_parameters bss_param;
2082
	struct nl80211_sta_flag_update sta_flags;
2083 2084

	int generation;
2085 2086 2087

	const u8 *assoc_req_ies;
	size_t assoc_req_ies_len;
2088

2089
	u32 beacon_loss_count;
2090
	s64 t_offset;
2091 2092 2093
	enum nl80211_mesh_power_mode local_pm;
	enum nl80211_mesh_power_mode peer_pm;
	enum nl80211_mesh_power_mode nonpeer_pm;
2094

2095
	u32 expected_throughput;
2096

2097
	u64 tx_duration;
2098
	u64 rx_duration;
2099
	u64 rx_beacon;
2100
	u8 rx_beacon_signal_avg;
2101 2102
	u8 connected_to_gate;

2103
	struct cfg80211_tid_stats *pertid;
2104
	s8 ack_signal;
2105
	s8 avg_ack_signal;
2106

2107 2108
	u16 airtime_weight;

2109 2110
	u32 rx_mpdu_count;
	u32 fcs_err_count;
2111 2112

	u32 airtime_link_metric;
2113 2114

	u8 connected_to_as;
2115 2116 2117 2118 2119 2120

	bool mlo_params_valid;
	u8 assoc_link_id;
	u8 mld_addr[ETH_ALEN] __aligned(2);
	const u8 *assoc_resp_ies;
	size_t assoc_resp_ies_len;
2121 2122
};

2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146
/**
 * struct cfg80211_sar_sub_specs - sub specs limit
 * @power: power limitation in 0.25dbm
 * @freq_range_index: index the power limitation applies to
 */
struct cfg80211_sar_sub_specs {
	s32 power;
	u32 freq_range_index;
};

/**
 * struct cfg80211_sar_specs - sar limit specs
 * @type: it's set with power in 0.25dbm or other types
 * @num_sub_specs: number of sar sub specs
 * @sub_specs: memory to hold the sar sub specs
 */
struct cfg80211_sar_specs {
	enum nl80211_sar_type type;
	u32 num_sub_specs;
	struct cfg80211_sar_sub_specs sub_specs[];
};


/**
2147
 * struct cfg80211_sar_freq_ranges - sar frequency ranges
2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170
 * @start_freq:  start range edge frequency
 * @end_freq:    end range edge frequency
 */
struct cfg80211_sar_freq_ranges {
	u32 start_freq;
	u32 end_freq;
};

/**
 * struct cfg80211_sar_capa - sar limit capability
 * @type: it's set via power in 0.25dbm or other types
 * @num_freq_ranges: number of frequency ranges
 * @freq_ranges: memory to hold the freq ranges.
 *
 * Note: WLAN driver may append new ranges or split an existing
 * range to small ones and then append them.
 */
struct cfg80211_sar_capa {
	enum nl80211_sar_type type;
	u32 num_freq_ranges;
	const struct cfg80211_sar_freq_ranges *freq_ranges;
};

2171
#if IS_ENABLED(CONFIG_CFG80211)
2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183
/**
 * cfg80211_get_station - retrieve information about a given station
 * @dev: the device where the station is supposed to be connected to
 * @mac_addr: the mac address of the station of interest
 * @sinfo: pointer to the structure to fill with the information
 *
 * Returns 0 on success and sinfo is filled with the available information
 * otherwise returns a negative error code and the content of sinfo has to be
 * considered undefined.
 */
int cfg80211_get_station(struct net_device *dev, const u8 *mac_addr,
			 struct station_info *sinfo);
2184 2185 2186 2187 2188 2189 2190 2191
#else
static inline int cfg80211_get_station(struct net_device *dev,
				       const u8 *mac_addr,
				       struct station_info *sinfo)
{
	return -ENOENT;
}
#endif
2192

2193 2194 2195 2196 2197 2198
/**
 * enum monitor_flags - monitor flags
 *
 * Monitor interface configuration flags. Note that these must be the bits
 * according to the nl80211 flags.
 *
2199
 * @MONITOR_FLAG_CHANGED: set if the flags were changed
2200 2201 2202 2203 2204
 * @MONITOR_FLAG_FCSFAIL: pass frames with bad FCS
 * @MONITOR_FLAG_PLCPFAIL: pass frames with bad PLCP
 * @MONITOR_FLAG_CONTROL: pass control frames
 * @MONITOR_FLAG_OTHER_BSS: disable BSSID filtering
 * @MONITOR_FLAG_COOK_FRAMES: report frames after processing
2205
 * @MONITOR_FLAG_ACTIVE: active monitor, ACKs frames on its MAC address
2206 2207
 */
enum monitor_flags {
2208
	MONITOR_FLAG_CHANGED		= 1<<__NL80211_MNTR_FLAG_INVALID,
2209 2210 2211 2212 2213
	MONITOR_FLAG_FCSFAIL		= 1<<NL80211_MNTR_FLAG_FCSFAIL,
	MONITOR_FLAG_PLCPFAIL		= 1<<NL80211_MNTR_FLAG_PLCPFAIL,
	MONITOR_FLAG_CONTROL		= 1<<NL80211_MNTR_FLAG_CONTROL,
	MONITOR_FLAG_OTHER_BSS		= 1<<NL80211_MNTR_FLAG_OTHER_BSS,
	MONITOR_FLAG_COOK_FRAMES	= 1<<NL80211_MNTR_FLAG_COOK_FRAMES,
2214
	MONITOR_FLAG_ACTIVE		= 1<<NL80211_MNTR_FLAG_ACTIVE,
2215 2216
};

2217 2218 2219 2220 2221 2222
/**
 * enum mpath_info_flags -  mesh path information flags
 *
 * Used by the driver to indicate which info in &struct mpath_info it has filled
 * in during get_station() or dump_station().
 *
Johannes Berg's avatar
Johannes Berg committed
2223 2224 2225 2226 2227 2228 2229
 * @MPATH_INFO_FRAME_QLEN: @frame_qlen filled
 * @MPATH_INFO_SN: @sn filled
 * @MPATH_INFO_METRIC: @metric filled
 * @MPATH_INFO_EXPTIME: @exptime filled
 * @MPATH_INFO_DISCOVERY_TIMEOUT: @discovery_timeout filled
 * @MPATH_INFO_DISCOVERY_RETRIES: @discovery_retries filled
 * @MPATH_INFO_FLAGS: @flags filled
2230
 * @MPATH_INFO_HOP_COUNT: @hop_count filled
2231
 * @MPATH_INFO_PATH_CHANGE: @path_change_count filled
2232 2233 2234
 */
enum mpath_info_flags {
	MPATH_INFO_FRAME_QLEN		= BIT(0),
2235
	MPATH_INFO_SN			= BIT(1),
2236 2237 2238 2239 2240
	MPATH_INFO_METRIC		= BIT(2),
	MPATH_INFO_EXPTIME		= BIT(3),
	MPATH_INFO_DISCOVERY_TIMEOUT	= BIT(4),
	MPATH_INFO_DISCOVERY_RETRIES	= BIT(5),
	MPATH_INFO_FLAGS		= BIT(6),
2241 2242
	MPATH_INFO_HOP_COUNT		= BIT(7),
	MPATH_INFO_PATH_CHANGE		= BIT(8),
2243 2244 2245 2246 2247 2248 2249 2250 2251
};

/**
 * struct mpath_info - mesh path information
 *
 * Mesh path information filled by driver for get_mpath() and dump_mpath().
 *
 * @filled: bitfield of flags from &enum mpath_info_flags
 * @frame_qlen: number of queued frames for this destination
2252
 * @sn: target sequence number
2253 2254
 * @metric: metric (cost) of this mesh path
 * @exptime: expiration time for the mesh path from now, in msecs
2255
 * @flags: mesh path flags from &enum mesh_path_flags
2256 2257
 * @discovery_timeout: total mesh path discovery timeout, in msecs
 * @discovery_retries: mesh path discovery retries
2258 2259 2260 2261
 * @generation: generation number for nl80211 dumps.
 *	This number should increase every time the list of mesh paths
 *	changes, i.e. when a station is added or removed, so that
 *	userspace can tell whether it got a consistent snapshot.
2262
 * @hop_count: hops to destination
2263
 * @path_change_count: total number of path changes to destination
2264 2265 2266 2267
 */
struct mpath_info {
	u32 filled;
	u32 frame_qlen;
2268
	u32 sn;
2269 2270 2271 2272 2273
	u32 metric;
	u32 exptime;
	u32 discovery_timeout;
	u8 discovery_retries;
	u8 flags;
2274
	u8 hop_count;
2275
	u32 path_change_count;
2276 2277

	int generation;
2278 2279
};

2280 2281 2282 2283 2284
/**
 * struct bss_parameters - BSS parameters
 *
 * Used to change BSS parameters (mainly for AP mode).
 *
2285
 * @link_id: link_id or -1 for non-MLD
2286 2287 2288 2289 2290 2291
 * @use_cts_prot: Whether to use CTS protection
 *	(0 = no, 1 = yes, -1 = do not change)
 * @use_short_preamble: Whether the use of short preambles is allowed
 *	(0 = no, 1 = yes, -1 = do not change)
 * @use_short_slot_time: Whether the use of short slot time is allowed
 *	(0 = no, 1 = yes, -1 = do not change)
2292 2293 2294
 * @basic_rates: basic rates in IEEE 802.11 format
 *	(or NULL for no change)
 * @basic_rates_len: number of basic rates
2295
 * @ap_isolate: do not forward packets between connected stations
2296
 *	(0 = no, 1 = yes, -1 = do not change)
2297
 * @ht_opmode: HT Operation mode
2298
 *	(u16 = opmode, -1 = do not change)
2299 2300
 * @p2p_ctwindow: P2P CT Window (-1 = no change)
 * @p2p_opp_ps: P2P opportunistic PS (-1 = no change)
2301 2302
 */
struct bss_parameters {
2303
	int link_id;
2304 2305 2306
	int use_cts_prot;
	int use_short_preamble;
	int use_short_slot_time;
2307
	const u8 *basic_rates;
2308
	u8 basic_rates_len;
2309
	int ap_isolate;
2310
	int ht_opmode;
2311
	s8 p2p_ctwindow, p2p_opp_ps;
2312
};
2313

2314
/**
2315 2316 2317
 * struct mesh_config - 802.11s mesh configuration
 *
 * These parameters can be changed while the mesh is active.
2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365
 *
 * @dot11MeshRetryTimeout: the initial retry timeout in millisecond units used
 *	by the Mesh Peering Open message
 * @dot11MeshConfirmTimeout: the initial retry timeout in millisecond units
 *	used by the Mesh Peering Open message
 * @dot11MeshHoldingTimeout: the confirm timeout in millisecond units used by
 *	the mesh peering management to close a mesh peering
 * @dot11MeshMaxPeerLinks: the maximum number of peer links allowed on this
 *	mesh interface
 * @dot11MeshMaxRetries: the maximum number of peer link open retries that can
 *	be sent to establish a new peer link instance in a mesh
 * @dot11MeshTTL: the value of TTL field set at a source mesh STA
 * @element_ttl: the value of TTL field set at a mesh STA for path selection
 *	elements
 * @auto_open_plinks: whether we should automatically open peer links when we
 *	detect compatible mesh peers
 * @dot11MeshNbrOffsetMaxNeighbor: the maximum number of neighbors to
 *	synchronize to for 11s default synchronization method
 * @dot11MeshHWMPmaxPREQretries: the number of action frames containing a PREQ
 *	that an originator mesh STA can send to a particular path target
 * @path_refresh_time: how frequently to refresh mesh paths in milliseconds
 * @min_discovery_timeout: the minimum length of time to wait until giving up on
 *	a path discovery in milliseconds
 * @dot11MeshHWMPactivePathTimeout: the time (in TUs) for which mesh STAs
 *	receiving a PREQ shall consider the forwarding information from the
 *	root to be valid. (TU = time unit)
 * @dot11MeshHWMPpreqMinInterval: the minimum interval of time (in TUs) during
 *	which a mesh STA can send only one action frame containing a PREQ
 *	element
 * @dot11MeshHWMPperrMinInterval: the minimum interval of time (in TUs) during
 *	which a mesh STA can send only one Action frame containing a PERR
 *	element
 * @dot11MeshHWMPnetDiameterTraversalTime: the interval of time (in TUs) that
 *	it takes for an HWMP information element to propagate across the mesh
 * @dot11MeshHWMPRootMode: the configuration of a mesh STA as root mesh STA
 * @dot11MeshHWMPRannInterval: the interval of time (in TUs) between root
 *	announcements are transmitted
 * @dot11MeshGateAnnouncementProtocol: whether to advertise that this mesh
 *	station has access to a broader network beyond the MBSS. (This is
 *	missnamed in draft 12.0: dot11MeshGateAnnouncementProtocol set to true
 *	only means that the station will announce others it's a mesh gate, but
 *	not necessarily using the gate announcement protocol. Still keeping the
 *	same nomenclature to be in sync with the spec)
 * @dot11MeshForwarding: whether the Mesh STA is forwarding or non-forwarding
 *	entity (default is TRUE - forwarding entity)
 * @rssi_threshold: the threshold for average signal strength of candidate
 *	station to establish a peer link
 * @ht_opmode: mesh HT protection mode
2366 2367 2368 2369 2370 2371 2372
 *
 * @dot11MeshHWMPactivePathToRootTimeout: The time (in TUs) for which mesh STAs
 *	receiving a proactive PREQ shall consider the forwarding information to
 *	the root mesh STA to be valid.
 *
 * @dot11MeshHWMProotInterval: The interval of time (in TUs) between proactive
 *	PREQs are transmitted.
2373 2374 2375
 * @dot11MeshHWMPconfirmationInterval: The minimum interval of time (in TUs)
 *	during which a mesh STA can send only one Action frame containing
 *	a PREQ element for root path confirmation.
2376 2377 2378 2379
 * @power_mode: The default mesh power save mode which will be the initial
 *	setting for new peer links.
 * @dot11MeshAwakeWindowDuration: The duration in TUs the STA will remain awake
 *	after transmitting its beacon.
2380 2381 2382
 * @plink_timeout: If no tx activity is seen from a STA we've established
 *	peering with for longer than this time (in seconds), then remove it
 *	from the STA's list of peers.  Default is 30 minutes.
2383 2384 2385
 * @dot11MeshConnectedToAuthServer: if set to true then this mesh STA
 *	will advertise that it is connected to a authentication server
 *	in the mesh formation field.
2386 2387 2388 2389
 * @dot11MeshConnectedToMeshGate: if set to true, advertise that this STA is
 *      connected to a mesh gate in mesh formation info.  If false, the
 *      value in mesh formation is determined by the presence of root paths
 *      in the mesh path table
2390 2391 2392 2393 2394
 * @dot11MeshNolearn: Try to avoid multi-hop path discovery (e.g. PREQ/PREP
 *      for HWMP) if the destination is a direct neighbor. Note that this might
 *      not be the optimal decision as a multi-hop route might be better. So
 *      if using this setting you will likely also want to disable
 *      dot11MeshForwarding and use another mesh routing protocol on top.
2395
 */
2396 2397 2398 2399 2400
struct mesh_config {
	u16 dot11MeshRetryTimeout;
	u16 dot11MeshConfirmTimeout;
	u16 dot11MeshHoldingTimeout;
	u16 dot11MeshMaxPeerLinks;
2401 2402 2403
	u8 dot11MeshMaxRetries;
	u8 dot11MeshTTL;
	u8 element_ttl;
2404
	bool auto_open_plinks;
2405
	u32 dot11MeshNbrOffsetMaxNeighbor;
2406
	u8 dot11MeshHWMPmaxPREQretries;
2407 2408 2409 2410
	u32 path_refresh_time;
	u16 min_discovery_timeout;
	u32 dot11MeshHWMPactivePathTimeout;
	u16 dot11MeshHWMPpreqMinInterval;
2411
	u16 dot11MeshHWMPperrMinInterval;
2412
	u16 dot11MeshHWMPnetDiameterTraversalTime;
2413
	u8 dot11MeshHWMPRootMode;
2414
	bool dot11MeshConnectedToMeshGate;
2415
	bool dot11MeshConnectedToAuthServer;
2416
	u16 dot11MeshHWMPRannInterval;
2417
	bool dot11MeshGateAnnouncementProtocol;
2418
	bool dot11MeshForwarding;
2419
	s32 rssi_threshold;
2420
	u16 ht_opmode;
2421 2422
	u32 dot11MeshHWMPactivePathToRootTimeout;
	u16 dot11MeshHWMProotInterval;
2423
	u16 dot11MeshHWMPconfirmationInterval;
2424 2425
	enum nl80211_mesh_power_mode power_mode;
	u16 dot11MeshAwakeWindowDuration;
2426
	u32 plink_timeout;
2427
	bool dot11MeshNolearn;
2428 2429
};

2430 2431
/**
 * struct mesh_setup - 802.11s mesh setup configuration
2432
 * @chandef: defines the channel to use
2433 2434
 * @mesh_id: the mesh ID
 * @mesh_id_len: length of the mesh ID, at least 1 and at most 32 bytes
2435
 * @sync_method: which synchronization method to use
2436 2437
 * @path_sel_proto: which path selection protocol to use
 * @path_metric: which metric to use
2438
 * @auth_id: which authentication method this mesh is using
2439 2440
 * @ie: vendor information elements (optional)
 * @ie_len: length of vendor information elements
2441 2442
 * @is_authenticated: this mesh requires authentication
 * @is_secure: this mesh uses security
2443
 * @user_mpm: userspace handles all MPM functions
2444 2445
 * @dtim_period: DTIM period to use
 * @beacon_interval: beacon interval to use
2446
 * @mcast_rate: multicast rate for Mesh Node [6Mbps is the default for 802.11a]
2447
 * @basic_rates: basic rates to use when creating the mesh
2448
 * @beacon_rate: bitrate to be used for beacons
2449 2450 2451
 * @userspace_handles_dfs: whether user space controls DFS operation, i.e.
 *	changes the channel when a radar is detected. This is required
 *	to operate on DFS channels.
2452 2453
 * @control_port_over_nl80211: TRUE if userspace expects to exchange control
 *	port frames over NL80211 instead of the network interface.
2454 2455 2456 2457
 *
 * These parameters are fixed when the mesh is created.
 */
struct mesh_setup {
2458
	struct cfg80211_chan_def chandef;
2459 2460
	const u8 *mesh_id;
	u8 mesh_id_len;
2461 2462 2463
	u8 sync_method;
	u8 path_sel_proto;
	u8 path_metric;
2464
	u8 auth_id;
2465 2466
	const u8 *ie;
	u8 ie_len;
2467
	bool is_authenticated;
2468
	bool is_secure;
2469
	bool user_mpm;
2470 2471
	u8 dtim_period;
	u16 beacon_interval;
2472
	int mcast_rate[NUM_NL80211_BANDS];
2473
	u32 basic_rates;
2474
	struct cfg80211_bitrate_mask beacon_rate;
2475
	bool userspace_handles_dfs;
2476
	bool control_port_over_nl80211;
2477 2478
};

2479 2480 2481 2482 2483 2484 2485 2486 2487 2488
/**
 * struct ocb_setup - 802.11p OCB mode setup configuration
 * @chandef: defines the channel to use
 *
 * These parameters are fixed when connecting to the network
 */
struct ocb_setup {
	struct cfg80211_chan_def chandef;
};

2489 2490
/**
 * struct ieee80211_txq_params - TX queue parameters
2491
 * @ac: AC identifier
2492 2493 2494 2495 2496 2497
 * @txop: Maximum burst time in units of 32 usecs, 0 meaning disabled
 * @cwmin: Minimum contention window [a value of the form 2^n-1 in the range
 *	1..32767]
 * @cwmax: Maximum contention window [a value of the form 2^n-1 in the range
 *	1..32767]
 * @aifs: Arbitration interframe space [0..255]
2498
 * @link_id: link_id or -1 for non-MLD
2499 2500
 */
struct ieee80211_txq_params {
2501
	enum nl80211_ac ac;
2502 2503 2504 2505
	u16 txop;
	u16 cwmin;
	u16 cwmax;
	u8 aifs;
2506
	int link_id;
2507 2508
};

2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530
/**
 * DOC: Scanning and BSS list handling
 *
 * The scanning process itself is fairly simple, but cfg80211 offers quite
 * a bit of helper functionality. To start a scan, the scan operation will
 * be invoked with a scan definition. This scan definition contains the
 * channels to scan, and the SSIDs to send probe requests for (including the
 * wildcard, if desired). A passive scan is indicated by having no SSIDs to
 * probe. Additionally, a scan request may contain extra information elements
 * that should be added to the probe request. The IEs are guaranteed to be
 * well-formed, and will not exceed the maximum length the driver advertised
 * in the wiphy structure.
 *
 * When scanning finds a BSS, cfg80211 needs to be notified of that, because
 * it is responsible for maintaining the BSS list; the driver should not
 * maintain a list itself. For this notification, various functions exist.
 *
 * Since drivers do not maintain a BSS list, there are also a number of
 * functions to search for a BSS and obtain information about it from the
 * BSS structure cfg80211 maintains. The BSS list is also made available
 * to userspace.
 */
2531

2532 2533 2534 2535 2536 2537 2538 2539 2540 2541
/**
 * struct cfg80211_ssid - SSID description
 * @ssid: the SSID
 * @ssid_len: length of the ssid
 */
struct cfg80211_ssid {
	u8 ssid[IEEE80211_MAX_SSID_LEN];
	u8 ssid_len;
};

2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556
/**
 * struct cfg80211_scan_info - information about completed scan
 * @scan_start_tsf: scan start time in terms of the TSF of the BSS that the
 *	wireless device that requested the scan is connected to. If this
 *	information is not available, this field is left zero.
 * @tsf_bssid: the BSSID according to which %scan_start_tsf is set.
 * @aborted: set to true if the scan was aborted for any reason,
 *	userspace will be notified of that
 */
struct cfg80211_scan_info {
	u64 scan_start_tsf;
	u8 tsf_bssid[ETH_ALEN] __aligned(2);
	bool aborted;
};

2557 2558 2559
/**
 * struct cfg80211_scan_6ghz_params - relevant for 6 GHz only
 *
2560
 * @short_ssid: short ssid to scan for
2561 2562 2563 2564
 * @bssid: bssid to scan for
 * @channel_idx: idx of the channel in the channel array in the scan request
 *	 which the above info relvant to
 * @unsolicited_probe: the AP transmits unsolicited probe response every 20 TU
2565
 * @short_ssid_valid: @short_ssid is valid and can be used
2566 2567
 * @psc_no_listen: when set, and the channel is a PSC channel, no need to wait
 *       20 TUs before starting to send probe requests.
2568
 * @psd_20: The AP's 20 MHz PSD value.
2569 2570 2571 2572 2573 2574 2575 2576
 */
struct cfg80211_scan_6ghz_params {
	u32 short_ssid;
	u32 channel_idx;
	u8 bssid[ETH_ALEN];
	bool unsolicited_probe;
	bool short_ssid_valid;
	bool psc_no_listen;
2577
	s8 psd_20;
2578 2579
};

2580 2581 2582 2583 2584 2585
/**
 * struct cfg80211_scan_request - scan request description
 *
 * @ssids: SSIDs to scan for (active scan only)
 * @n_ssids: number of SSIDs
 * @channels: channels to scan on.
2586
 * @n_channels: total number of channels to scan
2587 2588
 * @ie: optional information element(s) to add into Probe Request or %NULL
 * @ie_len: length of ie in octets
2589 2590 2591 2592 2593
 * @duration: how long to listen on each channel, in TUs. If
 *	%duration_mandatory is not set, this is the maximum dwell time and
 *	the actual dwell time may be shorter.
 * @duration_mandatory: if set, the scan duration must be as specified by the
 *	%duration field.
2594
 * @flags: control flags from &enum nl80211_scan_flags
2595
 * @rates: bitmap of rates to advertise for each band
2596
 * @wiphy: the wiphy this was for
2597
 * @scan_start: time (in jiffies) when the scan started
2598
 * @wdev: the wireless device to scan for
2599
 * @info: (internal) information about completed scan
2600
 * @notified: (internal) scan request was notified as done or aborted
2601
 * @no_cck: used to send probe requests at non CCK rate in 2GHz band
2602 2603 2604 2605
 * @mac_addr: MAC address used with randomisation
 * @mac_addr_mask: MAC address mask used with randomisation, bits that
 *	are 0 in the mask should be randomised, bits that are 1 should
 *	be taken from the @mac_addr
2606 2607 2608 2609
 * @scan_6ghz: relevant for split scan request only,
 *	true if this is the second scan request
 * @n_6ghz_params: number of 6 GHz params
 * @scan_6ghz_params: 6 GHz params
2610
 * @bssid: BSSID to scan for (most commonly, the wildcard BSSID)
2611 2612 2613 2614 2615
 */
struct cfg80211_scan_request {
	struct cfg80211_ssid *ssids;
	int n_ssids;
	u32 n_channels;
2616
	const u8 *ie;
2617
	size_t ie_len;
2618 2619
	u16 duration;
	bool duration_mandatory;
2620
	u32 flags;
2621

2622
	u32 rates[NUM_NL80211_BANDS];
2623

2624 2625
	struct wireless_dev *wdev;

2626 2627
	u8 mac_addr[ETH_ALEN] __aligned(2);
	u8 mac_addr_mask[ETH_ALEN] __aligned(2);
2628
	u8 bssid[ETH_ALEN] __aligned(2);
2629

2630 2631
	/* internal */
	struct wiphy *wiphy;
2632
	unsigned long scan_start;
2633 2634
	struct cfg80211_scan_info info;
	bool notified;
2635
	bool no_cck;
2636 2637 2638
	bool scan_6ghz;
	u32 n_6ghz_params;
	struct cfg80211_scan_6ghz_params *scan_6ghz_params;
2639 2640

	/* keep last */
2641
	struct ieee80211_channel *channels[] __counted_by(n_channels);
2642 2643
};

2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654
static inline void get_random_mask_addr(u8 *buf, const u8 *addr, const u8 *mask)
{
	int i;

	get_random_bytes(buf, ETH_ALEN);
	for (i = 0; i < ETH_ALEN; i++) {
		buf[i] &= ~mask[i];
		buf[i] |= addr[i] & mask[i];
	}
}

2655 2656 2657
/**
 * struct cfg80211_match_set - sets of attributes to match
 *
2658 2659 2660 2661
 * @ssid: SSID to be matched; may be zero-length in case of BSSID match
 *	or no match (RSSI only)
 * @bssid: BSSID to be matched; may be all-zero BSSID in case of SSID match
 *	or no match (RSSI only)
2662
 * @rssi_thold: don't report scan results below this threshold (in s32 dBm)
2663
 * @per_band_rssi_thold: Minimum rssi threshold for each band to be applied
2664
 *	for filtering out scan results received. Drivers advertise this support
2665 2666 2667 2668 2669
 *	of band specific rssi based filtering through the feature capability
 *	%NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD. These band
 *	specific rssi thresholds take precedence over rssi_thold, if specified.
 *	If not specified for any band, it will be assigned with rssi_thold of
 *	corresponding matchset.
2670 2671 2672
 */
struct cfg80211_match_set {
	struct cfg80211_ssid ssid;
2673
	u8 bssid[ETH_ALEN];
2674
	s32 rssi_thold;
2675
	s32 per_band_rssi_thold[NUM_NL80211_BANDS];
2676 2677
};

2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691
/**
 * struct cfg80211_sched_scan_plan - scan plan for scheduled scan
 *
 * @interval: interval between scheduled scan iterations. In seconds.
 * @iterations: number of scan iterations in this scan plan. Zero means
 *	infinite loop.
 *	The last scan plan will always have this parameter set to zero,
 *	all other scan plans will have a finite number of iterations.
 */
struct cfg80211_sched_scan_plan {
	u32 interval;
	u32 iterations;
};

2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702
/**
 * struct cfg80211_bss_select_adjust - BSS selection with RSSI adjustment.
 *
 * @band: band of BSS which should match for RSSI level adjustment.
 * @delta: value of RSSI level adjustment.
 */
struct cfg80211_bss_select_adjust {
	enum nl80211_band band;
	s8 delta;
};

2703 2704 2705
/**
 * struct cfg80211_sched_scan_request - scheduled scan request description
 *
2706
 * @reqid: identifies this request.
2707 2708 2709 2710 2711
 * @ssids: SSIDs to scan for (passed in the probe_reqs in active scans)
 * @n_ssids: number of SSIDs
 * @n_channels: total number of channels to scan
 * @ie: optional information element(s) to add into Probe Request or %NULL
 * @ie_len: length of ie in octets
2712
 * @flags: control flags from &enum nl80211_scan_flags
2713
 * @match_sets: sets of parameters to be matched for a scan result
2714 2715
 *	entry to be considered valid and to be passed to the host
 *	(others are filtered out).
2716
 *	If omitted, all results are passed.
2717
 * @n_match_sets: number of match sets
2718
 * @report_results: indicates that results were reported for this request
2719 2720
 * @wiphy: the wiphy this was for
 * @dev: the interface
Johannes Berg's avatar
Johannes Berg committed
2721
 * @scan_start: start time of the scheduled scan
2722
 * @channels: channels to scan
2723 2724
 * @min_rssi_thold: for drivers only supporting a single threshold, this
 *	contains the minimum over all matchsets
2725 2726 2727 2728
 * @mac_addr: MAC address used with randomisation
 * @mac_addr_mask: MAC address mask used with randomisation, bits that
 *	are 0 in the mask should be randomised, bits that are 1 should
 *	be taken from the @mac_addr
2729 2730 2731
 * @scan_plans: scan plans to be executed in this scheduled scan. Lowest
 *	index must be executed first.
 * @n_scan_plans: number of scan plans, at least 1.
2732
 * @rcu_head: RCU callback used to free the struct
2733 2734
 * @owner_nlportid: netlink portid of owner (if this should is a request
 *	owned by a particular socket)
2735 2736
 * @nl_owner_dead: netlink owner socket was closed - this request be freed
 * @list: for keeping list of requests.
2737 2738 2739 2740
 * @delay: delay in seconds to use before starting the first scan
 *	cycle.  The driver may ignore this parameter and start
 *	immediately (or at any other time), if this feature is not
 *	supported.
2741 2742 2743 2744 2745 2746 2747 2748 2749
 * @relative_rssi_set: Indicates whether @relative_rssi is set or not.
 * @relative_rssi: Relative RSSI threshold in dB to restrict scan result
 *	reporting in connected state to cases where a matching BSS is determined
 *	to have better or slightly worse RSSI than the current connected BSS.
 *	The relative RSSI threshold values are ignored in disconnected state.
 * @rssi_adjust: delta dB of RSSI preference to be given to the BSSs that belong
 *	to the specified band while deciding whether a better BSS is reported
 *	using @relative_rssi. If delta is a negative number, the BSSs that
 *	belong to the specified band will be penalized by delta dB in relative
2750
 *	comparisons.
2751 2752
 */
struct cfg80211_sched_scan_request {
2753
	u64 reqid;
2754 2755 2756 2757 2758
	struct cfg80211_ssid *ssids;
	int n_ssids;
	u32 n_channels;
	const u8 *ie;
	size_t ie_len;
2759
	u32 flags;
2760 2761
	struct cfg80211_match_set *match_sets;
	int n_match_sets;
2762
	s32 min_rssi_thold;
2763
	u32 delay;
2764 2765
	struct cfg80211_sched_scan_plan *scan_plans;
	int n_scan_plans;
2766

2767 2768 2769
	u8 mac_addr[ETH_ALEN] __aligned(2);
	u8 mac_addr_mask[ETH_ALEN] __aligned(2);

2770 2771 2772 2773
	bool relative_rssi_set;
	s8 relative_rssi;
	struct cfg80211_bss_select_adjust rssi_adjust;

2774 2775 2776
	/* internal */
	struct wiphy *wiphy;
	struct net_device *dev;
2777
	unsigned long scan_start;
2778
	bool report_results;
2779
	struct rcu_head rcu_head;
2780
	u32 owner_nlportid;
2781 2782
	bool nl_owner_dead;
	struct list_head list;
2783 2784

	/* keep last */
2785
	struct ieee80211_channel *channels[];
2786 2787
};

2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800
/**
 * enum cfg80211_signal_type - signal type
 *
 * @CFG80211_SIGNAL_TYPE_NONE: no signal strength information available
 * @CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm)
 * @CFG80211_SIGNAL_TYPE_UNSPEC: signal strength, increasing from 0 through 100
 */
enum cfg80211_signal_type {
	CFG80211_SIGNAL_TYPE_NONE,
	CFG80211_SIGNAL_TYPE_MBM,
	CFG80211_SIGNAL_TYPE_UNSPEC,
};

2801 2802 2803 2804 2805 2806 2807 2808 2809 2810
/**
 * struct cfg80211_inform_bss - BSS inform data
 * @chan: channel the frame was received on
 * @signal: signal strength value, according to the wiphy's
 *	signal type
 * @boottime_ns: timestamp (CLOCK_BOOTTIME) when the information was
 *	received; should match the time when the frame was actually
 *	received by the device (not just by the host, in case it was
 *	buffered on the device) and be accurate to about 10ms.
 *	If the frame isn't buffered, just passing the return value of
2811
 *	ktime_get_boottime_ns() is likely appropriate.
2812 2813 2814 2815 2816
 * @parent_tsf: the time at the start of reception of the first octet of the
 *	timestamp field of the frame. The time is the TSF of the BSS specified
 *	by %parent_bssid.
 * @parent_bssid: the BSS according to which %parent_tsf is set. This is set to
 *	the BSS that requested the scan in which the beacon/probe was received.
2817 2818
 * @chains: bitmask for filled values in @chain_signal.
 * @chain_signal: per-chain signal strength of last received BSS in dBm.
2819
 * @drv_data: Data to be passed through to @inform_bss
2820 2821 2822 2823 2824
 */
struct cfg80211_inform_bss {
	struct ieee80211_channel *chan;
	s32 signal;
	u64 boottime_ns;
2825 2826
	u64 parent_tsf;
	u8 parent_bssid[ETH_ALEN] __aligned(2);
2827 2828
	u8 chains;
	s8 chain_signal[IEEE80211_MAX_CHAINS];
2829 2830

	void *drv_data;
2831 2832
};

2833
/**
2834
 * struct cfg80211_bss_ies - BSS entry IE data
Johannes Berg's avatar
Johannes Berg committed
2835
 * @tsf: TSF contained in the frame that carried these IEs
2836 2837
 * @rcu_head: internal use, for freeing
 * @len: length of the IEs
2838
 * @from_beacon: these IEs are known to come from a beacon
2839 2840 2841
 * @data: IE data
 */
struct cfg80211_bss_ies {
Johannes Berg's avatar
Johannes Berg committed
2842
	u64 tsf;
2843 2844
	struct rcu_head rcu_head;
	int len;
2845
	bool from_beacon;
2846 2847 2848
	u8 data[];
};

2849 2850 2851 2852 2853 2854
/**
 * struct cfg80211_bss - BSS description
 *
 * This structure describes a BSS (which may also be a mesh network)
 * for use in scan results and similar.
 *
Johannes Berg's avatar
Johannes Berg committed
2855
 * @channel: channel this BSS is on
2856 2857 2858
 * @bssid: BSSID of the BSS
 * @beacon_interval: the beacon interval as from the frame
 * @capability: the capability field in host byte order
2859 2860 2861 2862
 * @ies: the information elements (Note that there is no guarantee that these
 *	are well-formed!); this is a pointer to either the beacon_ies or
 *	proberesp_ies depending on whether Probe Response frame has been
 *	received. It is always non-%NULL.
2863
 * @beacon_ies: the information elements from the last Beacon frame
2864 2865 2866
 *	(implementation note: if @hidden_beacon_bss is set this struct doesn't
 *	own the beacon_ies, but they're just pointers to the ones from the
 *	@hidden_beacon_bss struct)
2867
 * @proberesp_ies: the information elements from the last Probe Response frame
2868 2869 2870 2871
 * @hidden_beacon_bss: in case this BSS struct represents a probe response from
 *	a BSS that hides the SSID in its beacon, this points to the BSS struct
 *	that holds the beacon data. @beacon_ies is still valid, of course, and
 *	points to the same data as hidden_beacon_bss->beacon_ies in that case.
2872 2873 2874 2875
 * @transmitted_bss: pointer to the transmitted BSS, if this is a
 *	non-transmitted one (multi-BSSID support)
 * @nontrans_list: list of non-transmitted BSS, if this is a transmitted one
 *	(multi-BSSID support)
2876
 * @signal: signal strength value (type depends on the wiphy's signal_type)
2877 2878
 * @chains: bitmask for filled values in @chain_signal.
 * @chain_signal: per-chain signal strength of last received BSS in dBm.
2879 2880
 * @bssid_index: index in the multiple BSS set
 * @max_bssid_indicator: max number of members in the BSS set
2881 2882 2883 2884 2885
 * @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
 */
struct cfg80211_bss {
	struct ieee80211_channel *channel;

2886 2887 2888 2889
	const struct cfg80211_bss_ies __rcu *ies;
	const struct cfg80211_bss_ies __rcu *beacon_ies;
	const struct cfg80211_bss_ies __rcu *proberesp_ies;

2890
	struct cfg80211_bss *hidden_beacon_bss;
2891 2892
	struct cfg80211_bss *transmitted_bss;
	struct list_head nontrans_list;
2893 2894 2895

	s32 signal;

2896 2897 2898
	u16 beacon_interval;
	u16 capability;

2899
	u8 bssid[ETH_ALEN];
2900 2901
	u8 chains;
	s8 chain_signal[IEEE80211_MAX_CHAINS];
2902

2903 2904 2905
	u8 bssid_index;
	u8 max_bssid_indicator;

2906
	u8 priv[] __aligned(sizeof(void *));
2907 2908
};

2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919
/**
 * ieee80211_bss_get_elem - find element with given ID
 * @bss: the bss to search
 * @id: the element ID
 *
 * Note that the return value is an RCU-protected pointer, so
 * rcu_read_lock() must be held when calling this function.
 * Return: %NULL if not found.
 */
const struct element *ieee80211_bss_get_elem(struct cfg80211_bss *bss, u8 id);

2920 2921 2922
/**
 * ieee80211_bss_get_ie - find IE with given ID
 * @bss: the bss to search
2923
 * @id: the element ID
2924 2925 2926
 *
 * Note that the return value is an RCU-protected pointer, so
 * rcu_read_lock() must be held when calling this function.
2927
 * Return: %NULL if not found.
2928
 */
2929 2930
static inline const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 id)
{
2931
	return (const void *)ieee80211_bss_get_elem(bss, id);
2932
}
2933 2934


2935 2936 2937 2938 2939
/**
 * struct cfg80211_auth_request - Authentication request data
 *
 * This structure provides information needed to complete IEEE 802.11
 * authentication.
2940
 *
2941 2942
 * @bss: The BSS to authenticate with, the callee must obtain a reference
 *	to it if it needs to keep it.
2943 2944 2945
 * @auth_type: Authentication type (algorithm)
 * @ie: Extra IEs to add to Authentication frame or %NULL
 * @ie_len: Length of ie buffer in octets
2946 2947 2948
 * @key_len: length of WEP key for shared key authentication
 * @key_idx: index of WEP key for shared key authentication
 * @key: WEP key for shared key authentication
2949 2950 2951 2952 2953
 * @auth_data: Fields and elements in Authentication frames. This contains
 *	the authentication frame body (non-IE and IE data), excluding the
 *	Authentication algorithm number, i.e., starting at the Authentication
 *	transaction sequence number field.
 * @auth_data_len: Length of auth_data buffer in octets
2954 2955 2956 2957 2958 2959
 * @link_id: if >= 0, indicates authentication should be done as an MLD,
 *	the interface address is included as the MLD address and the
 *	necessary link (with the given link_id) will be created (and
 *	given an MLD address) by the driver
 * @ap_mld_addr: AP MLD address in case of authentication request with
 *	an AP MLD, valid iff @link_id >= 0
2960 2961
 */
struct cfg80211_auth_request {
2962
	struct cfg80211_bss *bss;
2963 2964
	const u8 *ie;
	size_t ie_len;
2965
	enum nl80211_auth_type auth_type;
2966
	const u8 *key;
2967 2968
	u8 key_len;
	s8 key_idx;
2969 2970
	const u8 *auth_data;
	size_t auth_data_len;
2971 2972 2973 2974 2975 2976 2977 2978 2979 2980
	s8 link_id;
	const u8 *ap_mld_addr;
};

/**
 * struct cfg80211_assoc_link - per-link information for MLO association
 * @bss: the BSS pointer, see also &struct cfg80211_assoc_request::bss;
 *	if this is %NULL for a link, that link is not requested
 * @elems: extra elements for the per-STA profile for this link
 * @elems_len: length of the elements
2981 2982
 * @disabled: If set this link should be included during association etc. but it
 *	should not be used until enabled by the AP MLD.
2983 2984
 * @error: per-link error code, must be <= 0. If there is an error, then the
 *	operation as a whole must fail.
2985 2986 2987 2988 2989
 */
struct cfg80211_assoc_link {
	struct cfg80211_bss *bss;
	const u8 *elems;
	size_t elems_len;
2990
	bool disabled;
2991
	int error;
2992 2993
};

2994 2995 2996 2997
/**
 * enum cfg80211_assoc_req_flags - Over-ride default behaviour in association.
 *
 * @ASSOC_REQ_DISABLE_HT:  Disable HT (802.11n)
2998
 * @ASSOC_REQ_DISABLE_VHT:  Disable VHT
2999
 * @ASSOC_REQ_USE_RRM: Declare RRM capability in this association
3000 3001 3002 3003
 * @CONNECT_REQ_EXTERNAL_AUTH_SUPPORT: User space indicates external
 *	authentication capability. Drivers can offload authentication to
 *	userspace if this flag is set. Only applicable for cfg80211_connect()
 *	request (connect callback).
3004
 * @ASSOC_REQ_DISABLE_HE:  Disable HE
3005
 * @ASSOC_REQ_DISABLE_EHT:  Disable EHT
3006 3007 3008
 * @CONNECT_REQ_MLO_SUPPORT: Userspace indicates support for handling MLD links.
 *	Drivers shall disable MLO features for the current association if this
 *	flag is not set.
3009 3010
 */
enum cfg80211_assoc_req_flags {
3011 3012 3013 3014
	ASSOC_REQ_DISABLE_HT			= BIT(0),
	ASSOC_REQ_DISABLE_VHT			= BIT(1),
	ASSOC_REQ_USE_RRM			= BIT(2),
	CONNECT_REQ_EXTERNAL_AUTH_SUPPORT	= BIT(3),
3015
	ASSOC_REQ_DISABLE_HE			= BIT(4),
3016
	ASSOC_REQ_DISABLE_EHT			= BIT(5),
3017
	CONNECT_REQ_MLO_SUPPORT			= BIT(6),
3018 3019
};

3020 3021 3022 3023 3024
/**
 * struct cfg80211_assoc_request - (Re)Association request data
 *
 * This structure provides information needed to complete IEEE 802.11
 * (re)association.
3025 3026 3027 3028
 * @bss: The BSS to associate with. If the call is successful the driver is
 *	given a reference that it must give back to cfg80211_send_rx_assoc()
 *	or to cfg80211_assoc_timeout(). To ensure proper refcounting, new
 *	association requests while already associating must be rejected.
3029 3030
 *	This also applies to the @links.bss parameter, which is used instead
 *	of this one (it is %NULL) for MLO associations.
3031 3032
 * @ie: Extra IEs to add to (Re)Association Request frame or %NULL
 * @ie_len: Length of ie buffer in octets
3033
 * @use_mfp: Use management frame protection (IEEE 802.11w) in this association
3034
 * @crypto: crypto settings
3035 3036 3037 3038 3039 3040
 * @prev_bssid: previous BSSID, if not %NULL use reassociate frame. This is used
 *	to indicate a request to reassociate within the ESS instead of a request
 *	do the initial association with the ESS. When included, this is set to
 *	the BSSID of the current association, i.e., to the value that is
 *	included in the Current AP address field of the Reassociation Request
 *	frame.
3041 3042
 * @flags:  See &enum cfg80211_assoc_req_flags
 * @ht_capa:  HT Capabilities over-rides.  Values set in ht_capa_mask
3043
 *	will be used in ht_capa.  Un-supported values will be ignored.
3044
 * @ht_capa_mask:  The bits of ht_capa which are to be used.
3045 3046
 * @vht_capa: VHT capability override
 * @vht_capa_mask: VHT capability mask indicating which fields to use
3047 3048 3049 3050 3051 3052
 * @fils_kek: FILS KEK for protecting (Re)Association Request/Response frame or
 *	%NULL if FILS is not used.
 * @fils_kek_len: Length of fils_kek in octets
 * @fils_nonces: FILS nonces (part of AAD) for protecting (Re)Association
 *	Request/Response frame or %NULL if FILS is not used. This field starts
 *	with 16 octets of STA Nonce followed by 16 octets of AP Nonce.
3053 3054
 * @s1g_capa: S1G capability override
 * @s1g_capa_mask: S1G capability override mask
3055 3056 3057 3058 3059
 * @links: per-link information for MLO connections
 * @link_id: >= 0 for MLO connections, where links are given, and indicates
 *	the link on which the association request should be sent
 * @ap_mld_addr: AP MLD address in case of MLO association request,
 *	valid iff @link_id >= 0
3060 3061
 */
struct cfg80211_assoc_request {
3062
	struct cfg80211_bss *bss;
3063
	const u8 *ie, *prev_bssid;
3064
	size_t ie_len;
3065
	struct cfg80211_crypto_settings crypto;
3066
	bool use_mfp;
3067 3068 3069
	u32 flags;
	struct ieee80211_ht_cap ht_capa;
	struct ieee80211_ht_cap ht_capa_mask;
3070
	struct ieee80211_vht_cap vht_capa, vht_capa_mask;
3071 3072 3073
	const u8 *fils_kek;
	size_t fils_kek_len;
	const u8 *fils_nonces;
3074
	struct ieee80211_s1g_cap s1g_capa, s1g_capa_mask;
3075 3076 3077
	struct cfg80211_assoc_link links[IEEE80211_MLD_MAX_NUM_LINKS];
	const u8 *ap_mld_addr;
	s8 link_id;
3078 3079 3080 3081 3082 3083 3084 3085
};

/**
 * struct cfg80211_deauth_request - Deauthentication request data
 *
 * This structure provides information needed to complete IEEE 802.11
 * deauthentication.
 *
3086
 * @bssid: the BSSID or AP MLD address to deauthenticate from
3087 3088
 * @ie: Extra IEs to add to Deauthentication frame or %NULL
 * @ie_len: Length of ie buffer in octets
3089
 * @reason_code: The reason code for the deauthentication
Johannes Berg's avatar
Johannes Berg committed
3090 3091
 * @local_state_change: if set, change local state only and
 *	do not set a deauth frame
3092 3093
 */
struct cfg80211_deauth_request {
3094
	const u8 *bssid;
3095 3096
	const u8 *ie;
	size_t ie_len;
3097
	u16 reason_code;
3098
	bool local_state_change;
3099 3100 3101 3102 3103 3104
};

/**
 * struct cfg80211_disassoc_request - Disassociation request data
 *
 * This structure provides information needed to complete IEEE 802.11
3105
 * disassociation.
3106
 *
3107
 * @ap_addr: the BSSID or AP MLD address to disassociate from
3108 3109
 * @ie: Extra IEs to add to Disassociation frame or %NULL
 * @ie_len: Length of ie buffer in octets
3110
 * @reason_code: The reason code for the disassociation
3111 3112
 * @local_state_change: This is a request for a local state only, i.e., no
 *	Disassociation frame is to be transmitted.
3113 3114
 */
struct cfg80211_disassoc_request {
3115
	const u8 *ap_addr;
3116 3117
	const u8 *ie;
	size_t ie_len;
3118
	u16 reason_code;
3119
	bool local_state_change;
3120 3121
};

3122 3123 3124 3125 3126 3127 3128 3129 3130 3131
/**
 * struct cfg80211_ibss_params - IBSS parameters
 *
 * This structure defines the IBSS parameters for the join_ibss()
 * method.
 *
 * @ssid: The SSID, will always be non-null.
 * @ssid_len: The length of the SSID, will always be non-zero.
 * @bssid: Fixed BSSID requested, maybe be %NULL, if set do not
 *	search for IBSSs with a different BSSID.
3132
 * @chandef: defines the channel to use if no other IBSS to join can be found
3133 3134 3135 3136
 * @channel_fixed: The channel should be fixed -- do not search for
 *	IBSSs to join on other channels.
 * @ie: information element(s) to include in the beacon
 * @ie_len: length of that
3137
 * @beacon_interval: beacon interval to use
3138 3139
 * @privacy: this is a protected network, keys will be configured
 *	after joining
3140 3141 3142 3143
 * @control_port: whether user space controls IEEE 802.1X port, i.e.,
 *	sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is
 *	required to assume that the port is unauthorized until authorized by
 *	user space. Otherwise, port is marked authorized by default.
3144 3145
 * @control_port_over_nl80211: TRUE if userspace expects to exchange control
 *	port frames over NL80211 instead of the network interface.
3146 3147 3148
 * @userspace_handles_dfs: whether user space controls DFS operation, i.e.
 *	changes the channel when a radar is detected. This is required
 *	to operate on DFS channels.
3149
 * @basic_rates: bitmap of basic rates to use when creating the IBSS
3150
 * @mcast_rate: per-band multicast rate index + 1 (0: disabled)
3151
 * @ht_capa:  HT Capabilities over-rides.  Values set in ht_capa_mask
3152
 *	will be used in ht_capa.  Un-supported values will be ignored.
3153
 * @ht_capa_mask:  The bits of ht_capa which are to be used.
3154
 * @wep_keys: static WEP keys, if not NULL points to an array of
3155
 *	CFG80211_MAX_WEP_KEYS WEP keys
3156
 * @wep_tx_key: key index (0..3) of the default TX static WEP key
3157 3158
 */
struct cfg80211_ibss_params {
3159 3160
	const u8 *ssid;
	const u8 *bssid;
3161
	struct cfg80211_chan_def chandef;
3162
	const u8 *ie;
3163
	u8 ssid_len, ie_len;
3164
	u16 beacon_interval;
3165
	u32 basic_rates;
3166
	bool channel_fixed;
3167
	bool privacy;
3168
	bool control_port;
3169
	bool control_port_over_nl80211;
3170
	bool userspace_handles_dfs;
3171
	int mcast_rate[NUM_NL80211_BANDS];
3172 3173
	struct ieee80211_ht_cap ht_capa;
	struct ieee80211_ht_cap ht_capa_mask;
3174 3175
	struct key_params *wep_keys;
	int wep_tx_key;
3176 3177
};

3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188
/**
 * struct cfg80211_bss_selection - connection parameters for BSS selection.
 *
 * @behaviour: requested BSS selection behaviour.
 * @param: parameters for requestion behaviour.
 * @band_pref: preferred band for %NL80211_BSS_SELECT_ATTR_BAND_PREF.
 * @adjust: parameters for %NL80211_BSS_SELECT_ATTR_RSSI_ADJUST.
 */
struct cfg80211_bss_selection {
	enum nl80211_bss_select_attr behaviour;
	union {
3189
		enum nl80211_band band_pref;
3190 3191 3192 3193
		struct cfg80211_bss_select_adjust adjust;
	} param;
};

3194 3195 3196 3197 3198 3199 3200 3201
/**
 * struct cfg80211_connect_params - Connection parameters
 *
 * This structure provides information needed to complete IEEE 802.11
 * authentication and association.
 *
 * @channel: The channel to use or %NULL if not specified (auto-select based
 *	on scan results)
3202 3203
 * @channel_hint: The channel of the recommended BSS for initial connection or
 *	%NULL if not specified
3204 3205
 * @bssid: The AP BSSID or %NULL if not specified (auto-select based on scan
 *	results)
3206 3207 3208 3209
 * @bssid_hint: The recommended AP BSSID for initial connection to the BSS or
 *	%NULL if not specified. Unlike the @bssid parameter, the driver is
 *	allowed to ignore this @bssid_hint if it has knowledge of a better BSS
 *	to use.
3210 3211 3212
 * @ssid: SSID
 * @ssid_len: Length of ssid in octets
 * @auth_type: Authentication type (algorithm)
Johannes Berg's avatar
Johannes Berg committed
3213 3214
 * @ie: IEs for association request
 * @ie_len: Length of assoc_ie in octets
3215
 * @privacy: indicates whether privacy-enabled APs should be used
3216
 * @mfp: indicate whether management frame protection is used
3217
 * @crypto: crypto settings
3218 3219 3220
 * @key_len: length of WEP key for shared key authentication
 * @key_idx: index of WEP key for shared key authentication
 * @key: WEP key for shared key authentication
3221
 * @flags:  See &enum cfg80211_assoc_req_flags
3222
 * @bg_scan_period:  Background scan period in seconds
3223
 *	or -1 to indicate that default value is to be used.
3224
 * @ht_capa:  HT Capabilities over-rides.  Values set in ht_capa_mask
3225
 *	will be used in ht_capa.  Un-supported values will be ignored.
3226
 * @ht_capa_mask:  The bits of ht_capa which are to be used.
3227 3228
 * @vht_capa:  VHT Capability overrides
 * @vht_capa_mask: The bits of vht_capa which are to be used.
3229 3230
 * @pbss: if set, connect to a PCP instead of AP. Valid for DMG
 *	networks.
3231
 * @bss_select: criteria to be used for BSS selection.
3232 3233 3234 3235 3236 3237
 * @prev_bssid: previous BSSID, if not %NULL use reassociate frame. This is used
 *	to indicate a request to reassociate within the ESS instead of a request
 *	do the initial association with the ESS. When included, this is set to
 *	the BSSID of the current association, i.e., to the value that is
 *	included in the Current AP address field of the Reassociation Request
 *	frame.
3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250
 * @fils_erp_username: EAP re-authentication protocol (ERP) username part of the
 *	NAI or %NULL if not specified. This is used to construct FILS wrapped
 *	data IE.
 * @fils_erp_username_len: Length of @fils_erp_username in octets.
 * @fils_erp_realm: EAP re-authentication protocol (ERP) realm part of NAI or
 *	%NULL if not specified. This specifies the domain name of ER server and
 *	is used to construct FILS wrapped data IE.
 * @fils_erp_realm_len: Length of @fils_erp_realm in octets.
 * @fils_erp_next_seq_num: The next sequence number to use in the FILS ERP
 *	messages. This is also used to construct FILS wrapped data IE.
 * @fils_erp_rrk: ERP re-authentication Root Key (rRK) used to derive additional
 *	keys in FILS or %NULL if not specified.
 * @fils_erp_rrk_len: Length of @fils_erp_rrk in octets.
3251 3252
 * @want_1x: indicates user-space supports and wants to use 802.1X driver
 *	offload of 4-way handshake.
3253 3254 3255
 * @edmg: define the EDMG channels.
 *	This may specify multiple channels and bonding options for the driver
 *	to choose from, based on BSS configuration.
3256 3257 3258
 */
struct cfg80211_connect_params {
	struct ieee80211_channel *channel;
3259
	struct ieee80211_channel *channel_hint;
3260
	const u8 *bssid;
3261
	const u8 *bssid_hint;
3262
	const u8 *ssid;
3263 3264
	size_t ssid_len;
	enum nl80211_auth_type auth_type;
3265
	const u8 *ie;
3266 3267
	size_t ie_len;
	bool privacy;
3268
	enum nl80211_mfp mfp;
3269
	struct cfg80211_crypto_settings crypto;
3270 3271
	const u8 *key;
	u8 key_len, key_idx;
3272
	u32 flags;
3273
	int bg_scan_period;
3274 3275
	struct ieee80211_ht_cap ht_capa;
	struct ieee80211_ht_cap ht_capa_mask;
3276 3277
	struct ieee80211_vht_cap vht_capa;
	struct ieee80211_vht_cap vht_capa_mask;
3278
	bool pbss;
3279
	struct cfg80211_bss_selection bss_select;
3280
	const u8 *prev_bssid;
3281 3282 3283 3284 3285 3286 3287
	const u8 *fils_erp_username;
	size_t fils_erp_username_len;
	const u8 *fils_erp_realm;
	size_t fils_erp_realm_len;
	u16 fils_erp_next_seq_num;
	const u8 *fils_erp_rrk;
	size_t fils_erp_rrk_len;
3288
	bool want_1x;
3289
	struct ieee80211_edmg edmg;
3290 3291
};

3292 3293 3294 3295 3296 3297 3298
/**
 * enum cfg80211_connect_params_changed - Connection parameters being updated
 *
 * This enum provides information of all connect parameters that
 * have to be updated as part of update_connect_params() call.
 *
 * @UPDATE_ASSOC_IES: Indicates whether association request IEs are updated
3299 3300 3301
 * @UPDATE_FILS_ERP_INFO: Indicates that FILS connection parameters (realm,
 *	username, erp sequence number and rrk) are updated
 * @UPDATE_AUTH_TYPE: Indicates that authentication type is updated
3302 3303 3304
 */
enum cfg80211_connect_params_changed {
	UPDATE_ASSOC_IES		= BIT(0),
3305 3306
	UPDATE_FILS_ERP_INFO		= BIT(1),
	UPDATE_AUTH_TYPE		= BIT(2),
3307 3308
};

3309 3310
/**
 * enum wiphy_params_flags - set_wiphy_params bitfield values
Johannes Berg's avatar
Johannes Berg committed
3311 3312 3313 3314 3315
 * @WIPHY_PARAM_RETRY_SHORT: wiphy->retry_short has changed
 * @WIPHY_PARAM_RETRY_LONG: wiphy->retry_long has changed
 * @WIPHY_PARAM_FRAG_THRESHOLD: wiphy->frag_threshold has changed
 * @WIPHY_PARAM_RTS_THRESHOLD: wiphy->rts_threshold has changed
 * @WIPHY_PARAM_COVERAGE_CLASS: coverage class changed
3316
 * @WIPHY_PARAM_DYN_ACK: dynack has been enabled
3317 3318 3319
 * @WIPHY_PARAM_TXQ_LIMIT: TXQ packet limit has been changed
 * @WIPHY_PARAM_TXQ_MEMORY_LIMIT: TXQ memory limit has been changed
 * @WIPHY_PARAM_TXQ_QUANTUM: TXQ scheduler quantum
3320 3321 3322 3323 3324 3325
 */
enum wiphy_params_flags {
	WIPHY_PARAM_RETRY_SHORT		= 1 << 0,
	WIPHY_PARAM_RETRY_LONG		= 1 << 1,
	WIPHY_PARAM_FRAG_THRESHOLD	= 1 << 2,
	WIPHY_PARAM_RTS_THRESHOLD	= 1 << 3,
3326
	WIPHY_PARAM_COVERAGE_CLASS	= 1 << 4,
3327
	WIPHY_PARAM_DYN_ACK		= 1 << 5,
3328 3329 3330
	WIPHY_PARAM_TXQ_LIMIT		= 1 << 6,
	WIPHY_PARAM_TXQ_MEMORY_LIMIT	= 1 << 7,
	WIPHY_PARAM_TXQ_QUANTUM		= 1 << 8,
3331 3332
};

3333 3334
#define IEEE80211_DEFAULT_AIRTIME_WEIGHT	256

3335 3336 3337 3338 3339 3340 3341
/* The per TXQ device queue limit in airtime */
#define IEEE80211_DEFAULT_AQL_TXQ_LIMIT_L	5000
#define IEEE80211_DEFAULT_AQL_TXQ_LIMIT_H	12000

/* The per interface airtime threshold to switch to lower queue limit */
#define IEEE80211_AQL_THRESHOLD			24000

3342 3343 3344 3345 3346 3347
/**
 * struct cfg80211_pmksa - PMK Security Association
 *
 * This structure is passed to the set/del_pmksa() method for PMKSA
 * caching.
 *
3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359
 * @bssid: The AP's BSSID (may be %NULL).
 * @pmkid: The identifier to refer a PMKSA.
 * @pmk: The PMK for the PMKSA identified by @pmkid. This is used for key
 *	derivation by a FILS STA. Otherwise, %NULL.
 * @pmk_len: Length of the @pmk. The length of @pmk can differ depending on
 *	the hash algorithm used to generate this.
 * @ssid: SSID to specify the ESS within which a PMKSA is valid when using FILS
 *	cache identifier (may be %NULL).
 * @ssid_len: Length of the @ssid in octets.
 * @cache_id: 2-octet cache identifier advertized by a FILS AP identifying the
 *	scope of PMKSA. This is valid only if @ssid_len is non-zero (may be
 *	%NULL).
3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370
 * @pmk_lifetime: Maximum lifetime for PMKSA in seconds
 *	(dot11RSNAConfigPMKLifetime) or 0 if not specified.
 *	The configured PMKSA must not be used for PMKSA caching after
 *	expiration and any keys derived from this PMK become invalid on
 *	expiration, i.e., the current association must be dropped if the PMK
 *	used for it expires.
 * @pmk_reauth_threshold: Threshold time for reauthentication (percentage of
 *	PMK lifetime, dot11RSNAConfigPMKReauthThreshold) or 0 if not specified.
 *	Drivers are expected to trigger a full authentication instead of using
 *	this PMKSA for caching when reassociating to a new BSS after this
 *	threshold to generate a new PMK before the current one expires.
3371 3372
 */
struct cfg80211_pmksa {
3373 3374
	const u8 *bssid;
	const u8 *pmkid;
3375 3376 3377 3378 3379
	const u8 *pmk;
	size_t pmk_len;
	const u8 *ssid;
	size_t ssid_len;
	const u8 *cache_id;
3380 3381
	u32 pmk_lifetime;
	u8 pmk_reauth_threshold;
3382
};
Johannes Berg's avatar
Johannes Berg committed
3383

3384
/**
3385
 * struct cfg80211_pkt_pattern - packet pattern
3386 3387 3388 3389
 * @mask: bitmask where to match pattern and where to ignore bytes,
 *	one bit per byte, in same format as nl80211
 * @pattern: bytes to match where bitmask is 1
 * @pattern_len: length of pattern (in bytes)
3390
 * @pkt_offset: packet offset (in bytes)
3391 3392 3393 3394
 *
 * Internal note: @mask and @pattern are allocated in one chunk of
 * memory, free @mask only!
 */
3395
struct cfg80211_pkt_pattern {
3396
	const u8 *mask, *pattern;
3397
	int pattern_len;
3398
	int pkt_offset;
3399 3400
};

3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433
/**
 * struct cfg80211_wowlan_tcp - TCP connection parameters
 *
 * @sock: (internal) socket for source port allocation
 * @src: source IP address
 * @dst: destination IP address
 * @dst_mac: destination MAC address
 * @src_port: source port
 * @dst_port: destination port
 * @payload_len: data payload length
 * @payload: data payload buffer
 * @payload_seq: payload sequence stamping configuration
 * @data_interval: interval at which to send data packets
 * @wake_len: wakeup payload match length
 * @wake_data: wakeup payload match data
 * @wake_mask: wakeup payload match mask
 * @tokens_size: length of the tokens buffer
 * @payload_tok: payload token usage configuration
 */
struct cfg80211_wowlan_tcp {
	struct socket *sock;
	__be32 src, dst;
	u16 src_port, dst_port;
	u8 dst_mac[ETH_ALEN];
	int payload_len;
	const u8 *payload;
	struct nl80211_wowlan_tcp_data_seq payload_seq;
	u32 data_interval;
	u32 wake_len;
	const u8 *wake_data, *wake_mask;
	u32 tokens_size;
	/* must be last, variable member */
	struct nl80211_wowlan_tcp_data_token payload_tok;
3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445
};

/**
 * struct cfg80211_wowlan - Wake on Wireless-LAN support info
 *
 * This structure defines the enabled WoWLAN triggers for the device.
 * @any: wake up on any activity -- special trigger if device continues
 *	operating as normal during suspend
 * @disconnect: wake up if getting disconnected
 * @magic_pkt: wake up on receiving magic packet
 * @patterns: wake up on receiving packet matching a pattern
 * @n_patterns: number of patterns
3446 3447 3448 3449
 * @gtk_rekey_failure: wake up on GTK rekey failure
 * @eap_identity_req: wake up on EAP identity request packet
 * @four_way_handshake: wake up on 4-way handshake
 * @rfkill_release: wake up when rfkill is released
3450 3451
 * @tcp: TCP connection establishment/wakeup parameters, see nl80211.h.
 *	NULL if not configured.
3452
 * @nd_config: configuration for the scan to be used for net detect wake.
3453 3454
 */
struct cfg80211_wowlan {
3455 3456 3457
	bool any, disconnect, magic_pkt, gtk_rekey_failure,
	     eap_identity_req, four_way_handshake,
	     rfkill_release;
3458
	struct cfg80211_pkt_pattern *patterns;
3459
	struct cfg80211_wowlan_tcp *tcp;
3460
	int n_patterns;
3461
	struct cfg80211_sched_scan_request *nd_config;
3462 3463
};

3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492
/**
 * struct cfg80211_coalesce_rules - Coalesce rule parameters
 *
 * This structure defines coalesce rule for the device.
 * @delay: maximum coalescing delay in msecs.
 * @condition: condition for packet coalescence.
 *	see &enum nl80211_coalesce_condition.
 * @patterns: array of packet patterns
 * @n_patterns: number of patterns
 */
struct cfg80211_coalesce_rules {
	int delay;
	enum nl80211_coalesce_condition condition;
	struct cfg80211_pkt_pattern *patterns;
	int n_patterns;
};

/**
 * struct cfg80211_coalesce - Packet coalescing settings
 *
 * This structure defines coalescing settings.
 * @rules: array of coalesce rules
 * @n_rules: number of rules
 */
struct cfg80211_coalesce {
	struct cfg80211_coalesce_rules *rules;
	int n_rules;
};

3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521
/**
 * struct cfg80211_wowlan_nd_match - information about the match
 *
 * @ssid: SSID of the match that triggered the wake up
 * @n_channels: Number of channels where the match occurred.  This
 *	value may be zero if the driver can't report the channels.
 * @channels: center frequencies of the channels where a match
 *	occurred (in MHz)
 */
struct cfg80211_wowlan_nd_match {
	struct cfg80211_ssid ssid;
	int n_channels;
	u32 channels[];
};

/**
 * struct cfg80211_wowlan_nd_info - net detect wake up information
 *
 * @n_matches: Number of match information instances provided in
 *	@matches.  This value may be zero if the driver can't provide
 *	match information.
 * @matches: Array of pointers to matches containing information about
 *	the matches that triggered the wake up.
 */
struct cfg80211_wowlan_nd_info {
	int n_matches;
	struct cfg80211_wowlan_nd_match *matches[];
};

3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537
/**
 * struct cfg80211_wowlan_wakeup - wakeup report
 * @disconnect: woke up by getting disconnected
 * @magic_pkt: woke up by receiving magic packet
 * @gtk_rekey_failure: woke up by GTK rekey failure
 * @eap_identity_req: woke up by EAP identity request packet
 * @four_way_handshake: woke up by 4-way handshake
 * @rfkill_release: woke up by rfkill being released
 * @pattern_idx: pattern that caused wakeup, -1 if not due to pattern
 * @packet_present_len: copied wakeup packet data
 * @packet_len: original wakeup packet length
 * @packet: The packet causing the wakeup, if any.
 * @packet_80211:  For pattern match, magic packet and other data
 *	frame triggers an 802.3 frame should be reported, for
 *	disconnect due to deauth 802.11 frame. This indicates which
 *	it is.
3538 3539 3540
 * @tcp_match: TCP wakeup packet received
 * @tcp_connlost: TCP connection lost or failed to establish
 * @tcp_nomoretokens: TCP data ran out of tokens
3541
 * @net_detect: if not %NULL, woke up because of net detect
3542 3543 3544 3545
 */
struct cfg80211_wowlan_wakeup {
	bool disconnect, magic_pkt, gtk_rekey_failure,
	     eap_identity_req, four_way_handshake,
3546 3547
	     rfkill_release, packet_80211,
	     tcp_match, tcp_connlost, tcp_nomoretokens;
3548 3549 3550
	s32 pattern_idx;
	u32 packet_present_len, packet_len;
	const void *packet;
3551
	struct cfg80211_wowlan_nd_info *net_detect;
3552 3553
};

3554 3555
/**
 * struct cfg80211_gtk_rekey_data - rekey data
3556 3557
 * @kek: key encryption key (@kek_len bytes)
 * @kck: key confirmation key (@kck_len bytes)
3558
 * @replay_ctr: replay counter (NL80211_REPLAY_CTR_LEN bytes)
3559
 * @kek_len: length of kek
3560
 * @kck_len: length of kck
3561
 * @akm: akm (oui, id)
3562 3563
 */
struct cfg80211_gtk_rekey_data {
3564
	const u8 *kek, *kck, *replay_ctr;
3565 3566
	u32 akm;
	u8 kek_len, kck_len;
3567 3568
};

3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583
/**
 * struct cfg80211_update_ft_ies_params - FT IE Information
 *
 * This structure provides information needed to update the fast transition IE
 *
 * @md: The Mobility Domain ID, 2 Octet value
 * @ie: Fast Transition IEs
 * @ie_len: Length of ft_ie in octets
 */
struct cfg80211_update_ft_ies_params {
	u16 md;
	const u8 *ie;
	size_t ie_len;
};

3584 3585 3586 3587 3588 3589
/**
 * struct cfg80211_mgmt_tx_params - mgmt tx parameters
 *
 * This structure provides information needed to transmit a mgmt frame
 *
 * @chan: channel to use
3590
 * @offchan: indicates whether off channel operation is required
3591 3592 3593 3594 3595
 * @wait: duration for ROC
 * @buf: buffer to transmit
 * @len: buffer length
 * @no_cck: don't use cck rates for this frame
 * @dont_wait_for_ack: tells the low level not to wait for an ack
3596 3597
 * @n_csa_offsets: length of csa_offsets array
 * @csa_offsets: array of all the csa offsets in the frame
3598 3599 3600
 * @link_id: for MLO, the link ID to transmit on, -1 if not given; note
 *	that the link ID isn't validated (much), it's in range but the
 *	link might not exist (or be used by the receiver STA)
3601 3602 3603 3604 3605 3606 3607 3608 3609
 */
struct cfg80211_mgmt_tx_params {
	struct ieee80211_channel *chan;
	bool offchan;
	unsigned int wait;
	const u8 *buf;
	size_t len;
	bool no_cck;
	bool dont_wait_for_ack;
3610 3611
	int n_csa_offsets;
	const u16 *csa_offsets;
3612
	int link_id;
3613 3614
};

3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658
/**
 * struct cfg80211_dscp_exception - DSCP exception
 *
 * @dscp: DSCP value that does not adhere to the user priority range definition
 * @up: user priority value to which the corresponding DSCP value belongs
 */
struct cfg80211_dscp_exception {
	u8 dscp;
	u8 up;
};

/**
 * struct cfg80211_dscp_range - DSCP range definition for user priority
 *
 * @low: lowest DSCP value of this user priority range, inclusive
 * @high: highest DSCP value of this user priority range, inclusive
 */
struct cfg80211_dscp_range {
	u8 low;
	u8 high;
};

/* QoS Map Set element length defined in IEEE Std 802.11-2012, 8.4.2.97 */
#define IEEE80211_QOS_MAP_MAX_EX	21
#define IEEE80211_QOS_MAP_LEN_MIN	16
#define IEEE80211_QOS_MAP_LEN_MAX \
	(IEEE80211_QOS_MAP_LEN_MIN + 2 * IEEE80211_QOS_MAP_MAX_EX)

/**
 * struct cfg80211_qos_map - QoS Map Information
 *
 * This struct defines the Interworking QoS map setting for DSCP values
 *
 * @num_des: number of DSCP exceptions (0..21)
 * @dscp_exception: optionally up to maximum of 21 DSCP exceptions from
 *	the user priority DSCP range definition
 * @up: DSCP range definition for a particular user priority
 */
struct cfg80211_qos_map {
	u8 num_des;
	struct cfg80211_dscp_exception dscp_exception[IEEE80211_QOS_MAP_MAX_EX];
	struct cfg80211_dscp_range up[8];
};

3659 3660 3661 3662 3663 3664
/**
 * struct cfg80211_nan_conf - NAN configuration
 *
 * This struct defines NAN configuration parameters
 *
 * @master_pref: master preference (1 - 255)
3665 3666 3667
 * @bands: operating bands, a bitmap of &enum nl80211_band values.
 *	For instance, for NL80211_BAND_2GHZ, bit 0 would be set
 *	(i.e. BIT(NL80211_BAND_2GHZ)).
3668 3669 3670
 */
struct cfg80211_nan_conf {
	u8 master_pref;
3671
	u8 bands;
3672 3673
};

3674 3675 3676 3677 3678
/**
 * enum cfg80211_nan_conf_changes - indicates changed fields in NAN
 * configuration
 *
 * @CFG80211_NAN_CONF_CHANGED_PREF: master preference
3679
 * @CFG80211_NAN_CONF_CHANGED_BANDS: operating bands
3680 3681 3682
 */
enum cfg80211_nan_conf_changes {
	CFG80211_NAN_CONF_CHANGED_PREF = BIT(0),
3683
	CFG80211_NAN_CONF_CHANGED_BANDS = BIT(1),
3684 3685
};

3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707
/**
 * struct cfg80211_nan_func_filter - a NAN function Rx / Tx filter
 *
 * @filter: the content of the filter
 * @len: the length of the filter
 */
struct cfg80211_nan_func_filter {
	const u8 *filter;
	u8 len;
};

/**
 * struct cfg80211_nan_func - a NAN function
 *
 * @type: &enum nl80211_nan_function_type
 * @service_id: the service ID of the function
 * @publish_type: &nl80211_nan_publish_type
 * @close_range: if true, the range should be limited. Threshold is
 *	implementation specific.
 * @publish_bcast: if true, the solicited publish should be broadcasted
 * @subscribe_active: if true, the subscribe is active
 * @followup_id: the instance ID for follow up
3708
 * @followup_reqid: the requester instance ID for follow up
3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752
 * @followup_dest: MAC address of the recipient of the follow up
 * @ttl: time to live counter in DW.
 * @serv_spec_info: Service Specific Info
 * @serv_spec_info_len: Service Specific Info length
 * @srf_include: if true, SRF is inclusive
 * @srf_bf: Bloom Filter
 * @srf_bf_len: Bloom Filter length
 * @srf_bf_idx: Bloom Filter index
 * @srf_macs: SRF MAC addresses
 * @srf_num_macs: number of MAC addresses in SRF
 * @rx_filters: rx filters that are matched with corresponding peer's tx_filter
 * @tx_filters: filters that should be transmitted in the SDF.
 * @num_rx_filters: length of &rx_filters.
 * @num_tx_filters: length of &tx_filters.
 * @instance_id: driver allocated id of the function.
 * @cookie: unique NAN function identifier.
 */
struct cfg80211_nan_func {
	enum nl80211_nan_function_type type;
	u8 service_id[NL80211_NAN_FUNC_SERVICE_ID_LEN];
	u8 publish_type;
	bool close_range;
	bool publish_bcast;
	bool subscribe_active;
	u8 followup_id;
	u8 followup_reqid;
	struct mac_address followup_dest;
	u32 ttl;
	const u8 *serv_spec_info;
	u8 serv_spec_info_len;
	bool srf_include;
	const u8 *srf_bf;
	u8 srf_bf_len;
	u8 srf_bf_idx;
	struct mac_address *srf_macs;
	int srf_num_macs;
	struct cfg80211_nan_func_filter *rx_filters;
	struct cfg80211_nan_func_filter *tx_filters;
	u8 num_tx_filters;
	u8 num_rx_filters;
	u8 instance_id;
	u64 cookie;
};

3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769
/**
 * struct cfg80211_pmk_conf - PMK configuration
 *
 * @aa: authenticator address
 * @pmk_len: PMK length in bytes.
 * @pmk: the PMK material
 * @pmk_r0_name: PMK-R0 Name. NULL if not applicable (i.e., the PMK
 *	is not PMK-R0). When pmk_r0_name is not NULL, the pmk field
 *	holds PMK-R0.
 */
struct cfg80211_pmk_conf {
	const u8 *aa;
	u8 pmk_len;
	const u8 *pmk;
	const u8 *pmk_r0_name;
};

3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787
/**
 * struct cfg80211_external_auth_params - Trigger External authentication.
 *
 * Commonly used across the external auth request and event interfaces.
 *
 * @action: action type / trigger for external authentication. Only significant
 *	for the authentication request event interface (driver to user space).
 * @bssid: BSSID of the peer with which the authentication has
 *	to happen. Used by both the authentication request event and
 *	authentication response command interface.
 * @ssid: SSID of the AP.  Used by both the authentication request event and
 *	authentication response command interface.
 * @key_mgmt_suite: AKM suite of the respective authentication. Used by the
 *	authentication request event interface.
 * @status: status code, %WLAN_STATUS_SUCCESS for successful authentication,
 *	use %WLAN_STATUS_UNSPECIFIED_FAILURE if user space cannot give you
 *	the real status code for failures. Used only for the authentication
 *	response command interface (user space to driver).
3788
 * @pmkid: The identifier to refer a PMKSA.
3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799
 * @mld_addr: MLD address of the peer. Used by the authentication request event
 *	interface. Driver indicates this to enable MLO during the authentication
 *	offload to user space. Driver shall look at %NL80211_ATTR_MLO_SUPPORT
 *	flag capability in NL80211_CMD_CONNECT to know whether the user space
 *	supports enabling MLO during the authentication offload.
 *	User space should use the address of the interface (on which the
 *	authentication request event reported) as self MLD address. User space
 *	and driver should use MLD addresses in RA, TA and BSSID fields of
 *	authentication frames sent or received via cfg80211. The driver
 *	translates the MLD addresses to/from link addresses based on the link
 *	chosen for the authentication.
3800 3801 3802 3803 3804 3805 3806
 */
struct cfg80211_external_auth_params {
	enum nl80211_external_auth_action action;
	u8 bssid[ETH_ALEN] __aligned(2);
	struct cfg80211_ssid ssid;
	unsigned int key_mgmt_suite;
	u16 status;
3807
	const u8 *pmkid;
3808
	u8 mld_addr[ETH_ALEN] __aligned(2);
3809 3810
};

3811
/**
3812
 * struct cfg80211_ftm_responder_stats - FTM responder statistics
3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844
 *
 * @filled: bitflag of flags using the bits of &enum nl80211_ftm_stats to
 *	indicate the relevant values in this struct for them
 * @success_num: number of FTM sessions in which all frames were successfully
 *	answered
 * @partial_num: number of FTM sessions in which part of frames were
 *	successfully answered
 * @failed_num: number of failed FTM sessions
 * @asap_num: number of ASAP FTM sessions
 * @non_asap_num: number of  non-ASAP FTM sessions
 * @total_duration_ms: total sessions durations - gives an indication
 *	of how much time the responder was busy
 * @unknown_triggers_num: number of unknown FTM triggers - triggers from
 *	initiators that didn't finish successfully the negotiation phase with
 *	the responder
 * @reschedule_requests_num: number of FTM reschedule requests - initiator asks
 *	for a new scheduling although it already has scheduled FTM slot
 * @out_of_window_triggers_num: total FTM triggers out of scheduled window
 */
struct cfg80211_ftm_responder_stats {
	u32 filled;
	u32 success_num;
	u32 partial_num;
	u32 failed_num;
	u32 asap_num;
	u32 non_asap_num;
	u64 total_duration_ms;
	u32 unknown_triggers_num;
	u32 reschedule_requests_num;
	u32 out_of_window_triggers_num;
};

3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937
/**
 * struct cfg80211_pmsr_ftm_result - FTM result
 * @failure_reason: if this measurement failed (PMSR status is
 *	%NL80211_PMSR_STATUS_FAILURE), this gives a more precise
 *	reason than just "failure"
 * @burst_index: if reporting partial results, this is the index
 *	in [0 .. num_bursts-1] of the burst that's being reported
 * @num_ftmr_attempts: number of FTM request frames transmitted
 * @num_ftmr_successes: number of FTM request frames acked
 * @busy_retry_time: if failure_reason is %NL80211_PMSR_FTM_FAILURE_PEER_BUSY,
 *	fill this to indicate in how many seconds a retry is deemed possible
 *	by the responder
 * @num_bursts_exp: actual number of bursts exponent negotiated
 * @burst_duration: actual burst duration negotiated
 * @ftms_per_burst: actual FTMs per burst negotiated
 * @lci_len: length of LCI information (if present)
 * @civicloc_len: length of civic location information (if present)
 * @lci: LCI data (may be %NULL)
 * @civicloc: civic location data (may be %NULL)
 * @rssi_avg: average RSSI over FTM action frames reported
 * @rssi_spread: spread of the RSSI over FTM action frames reported
 * @tx_rate: bitrate for transmitted FTM action frame response
 * @rx_rate: bitrate of received FTM action frame
 * @rtt_avg: average of RTTs measured (must have either this or @dist_avg)
 * @rtt_variance: variance of RTTs measured (note that standard deviation is
 *	the square root of the variance)
 * @rtt_spread: spread of the RTTs measured
 * @dist_avg: average of distances (mm) measured
 *	(must have either this or @rtt_avg)
 * @dist_variance: variance of distances measured (see also @rtt_variance)
 * @dist_spread: spread of distances measured (see also @rtt_spread)
 * @num_ftmr_attempts_valid: @num_ftmr_attempts is valid
 * @num_ftmr_successes_valid: @num_ftmr_successes is valid
 * @rssi_avg_valid: @rssi_avg is valid
 * @rssi_spread_valid: @rssi_spread is valid
 * @tx_rate_valid: @tx_rate is valid
 * @rx_rate_valid: @rx_rate is valid
 * @rtt_avg_valid: @rtt_avg is valid
 * @rtt_variance_valid: @rtt_variance is valid
 * @rtt_spread_valid: @rtt_spread is valid
 * @dist_avg_valid: @dist_avg is valid
 * @dist_variance_valid: @dist_variance is valid
 * @dist_spread_valid: @dist_spread is valid
 */
struct cfg80211_pmsr_ftm_result {
	const u8 *lci;
	const u8 *civicloc;
	unsigned int lci_len;
	unsigned int civicloc_len;
	enum nl80211_peer_measurement_ftm_failure_reasons failure_reason;
	u32 num_ftmr_attempts, num_ftmr_successes;
	s16 burst_index;
	u8 busy_retry_time;
	u8 num_bursts_exp;
	u8 burst_duration;
	u8 ftms_per_burst;
	s32 rssi_avg;
	s32 rssi_spread;
	struct rate_info tx_rate, rx_rate;
	s64 rtt_avg;
	s64 rtt_variance;
	s64 rtt_spread;
	s64 dist_avg;
	s64 dist_variance;
	s64 dist_spread;

	u16 num_ftmr_attempts_valid:1,
	    num_ftmr_successes_valid:1,
	    rssi_avg_valid:1,
	    rssi_spread_valid:1,
	    tx_rate_valid:1,
	    rx_rate_valid:1,
	    rtt_avg_valid:1,
	    rtt_variance_valid:1,
	    rtt_spread_valid:1,
	    dist_avg_valid:1,
	    dist_variance_valid:1,
	    dist_spread_valid:1;
};

/**
 * struct cfg80211_pmsr_result - peer measurement result
 * @addr: address of the peer
 * @host_time: host time (use ktime_get_boottime() adjust to the time when the
 *	measurement was made)
 * @ap_tsf: AP's TSF at measurement time
 * @status: status of the measurement
 * @final: if reporting partial results, mark this as the last one; if not
 *	reporting partial results always set this flag
 * @ap_tsf_valid: indicates the @ap_tsf value is valid
 * @type: type of the measurement reported, note that we only support reporting
 *	one type at a time, but you can report multiple results separately and
 *	they're all aggregated for userspace.
3938
 * @ftm: FTM result
3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967
 */
struct cfg80211_pmsr_result {
	u64 host_time, ap_tsf;
	enum nl80211_peer_measurement_status status;

	u8 addr[ETH_ALEN];

	u8 final:1,
	   ap_tsf_valid:1;

	enum nl80211_peer_measurement_type type;

	union {
		struct cfg80211_pmsr_ftm_result ftm;
	};
};

/**
 * struct cfg80211_pmsr_ftm_request_peer - FTM request data
 * @requested: indicates FTM is requested
 * @preamble: frame preamble to use
 * @burst_period: burst period to use
 * @asap: indicates to use ASAP mode
 * @num_bursts_exp: number of bursts exponent
 * @burst_duration: burst duration
 * @ftms_per_burst: number of FTMs per burst
 * @ftmr_retries: number of retries for FTM request
 * @request_lci: request LCI information
 * @request_civicloc: request civic location information
3968 3969 3970 3971 3972 3973
 * @trigger_based: use trigger based ranging for the measurement
 *		 If neither @trigger_based nor @non_trigger_based is set,
 *		 EDCA based ranging will be used.
 * @non_trigger_based: use non trigger based ranging for the measurement
 *		 If neither @trigger_based nor @non_trigger_based is set,
 *		 EDCA based ranging will be used.
3974
 * @lmr_feedback: negotiate for I2R LMR feedback. Only valid if either
3975 3976 3977 3978
 *		 @trigger_based or @non_trigger_based is set.
 * @bss_color: the bss color of the responder. Optional. Set to zero to
 *	indicate the driver should set the BSS color. Only valid if
 *	@non_trigger_based or @trigger_based is set.
3979 3980 3981 3982 3983 3984 3985 3986 3987
 *
 * See also nl80211 for the respective attribute documentation.
 */
struct cfg80211_pmsr_ftm_request_peer {
	enum nl80211_preamble preamble;
	u16 burst_period;
	u8 requested:1,
	   asap:1,
	   request_lci:1,
3988 3989
	   request_civicloc:1,
	   trigger_based:1,
3990 3991
	   non_trigger_based:1,
	   lmr_feedback:1;
3992 3993 3994 3995
	u8 num_bursts_exp;
	u8 burst_duration;
	u8 ftms_per_burst;
	u8 ftmr_retries;
3996
	u8 bss_color;
3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041
};

/**
 * struct cfg80211_pmsr_request_peer - peer data for a peer measurement request
 * @addr: MAC address
 * @chandef: channel to use
 * @report_ap_tsf: report the associated AP's TSF
 * @ftm: FTM data, see &struct cfg80211_pmsr_ftm_request_peer
 */
struct cfg80211_pmsr_request_peer {
	u8 addr[ETH_ALEN];
	struct cfg80211_chan_def chandef;
	u8 report_ap_tsf:1;
	struct cfg80211_pmsr_ftm_request_peer ftm;
};

/**
 * struct cfg80211_pmsr_request - peer measurement request
 * @cookie: cookie, set by cfg80211
 * @nl_portid: netlink portid - used by cfg80211
 * @drv_data: driver data for this request, if required for aborting,
 *	not otherwise freed or anything by cfg80211
 * @mac_addr: MAC address used for (randomised) request
 * @mac_addr_mask: MAC address mask used for randomisation, bits that
 *	are 0 in the mask should be randomised, bits that are 1 should
 *	be taken from the @mac_addr
 * @list: used by cfg80211 to hold on to the request
 * @timeout: timeout (in milliseconds) for the whole operation, if
 *	zero it means there's no timeout
 * @n_peers: number of peers to do measurements with
 * @peers: per-peer measurement request data
 */
struct cfg80211_pmsr_request {
	u64 cookie;
	void *drv_data;
	u32 n_peers;
	u32 nl_portid;

	u32 timeout;

	u8 mac_addr[ETH_ALEN] __aligned(2);
	u8 mac_addr_mask[ETH_ALEN] __aligned(2);

	struct list_head list;

4042
	struct cfg80211_pmsr_request_peer peers[] __counted_by(n_peers);
4043 4044
};

4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062
/**
 * struct cfg80211_update_owe_info - OWE Information
 *
 * This structure provides information needed for the drivers to offload OWE
 * (Opportunistic Wireless Encryption) processing to the user space.
 *
 * Commonly used across update_owe_info request and event interfaces.
 *
 * @peer: MAC address of the peer device for which the OWE processing
 *	has to be done.
 * @status: status code, %WLAN_STATUS_SUCCESS for successful OWE info
 *	processing, use %WLAN_STATUS_UNSPECIFIED_FAILURE if user space
 *	cannot give you the real status code for failures. Used only for
 *	OWE update request command interface (user space to driver).
 * @ie: IEs obtained from the peer or constructed by the user space. These are
 *	the IEs of the remote peer in the event from the host driver and
 *	the constructed IEs by the user space in the request interface.
 * @ie_len: Length of IEs in octets.
4063 4064 4065 4066 4067 4068 4069 4070
 * @assoc_link_id: MLO link ID of the AP, with which (re)association requested
 *	by peer. This will be filled by driver for both MLO and non-MLO station
 *	connections when the AP affiliated with an MLD. For non-MLD AP mode, it
 *	will be -1. Used only with OWE update event (driver to user space).
 * @peer_mld_addr: For MLO connection, MLD address of the peer. For non-MLO
 *	connection, it will be all zeros. This is applicable only when
 *	@assoc_link_id is not -1, i.e., the AP affiliated with an MLD. Used only
 *	with OWE update event (driver to user space).
4071 4072 4073 4074 4075 4076
 */
struct cfg80211_update_owe_info {
	u8 peer[ETH_ALEN] __aligned(2);
	u16 status;
	const u8 *ie;
	size_t ie_len;
4077 4078
	int assoc_link_id;
	u8 peer_mld_addr[ETH_ALEN] __aligned(2);
4079 4080
};

4081 4082 4083 4084 4085 4086
/**
 * struct mgmt_frame_regs - management frame registrations data
 * @global_stypes: bitmap of management frame subtypes registered
 *	for the entire device
 * @interface_stypes: bitmap of management frame subtypes registered
 *	for the given interface
4087
 * @global_mcast_stypes: mcast RX is needed globally for these subtypes
4088 4089
 * @interface_mcast_stypes: mcast RX is needed on this interface
 *	for these subtypes
4090 4091 4092
 */
struct mgmt_frame_regs {
	u32 global_stypes, interface_stypes;
4093
	u32 global_mcast_stypes, interface_mcast_stypes;
4094 4095
};

4096 4097 4098 4099 4100 4101 4102 4103 4104
/**
 * struct cfg80211_ops - backend description for wireless configuration
 *
 * This struct is registered by fullmac card drivers and/or wireless stacks
 * in order to handle configuration requests on their interfaces.
 *
 * All callbacks except where otherwise noted should return 0
 * on success or a negative error code.
 *
4105 4106 4107 4108
 * All operations are invoked with the wiphy mutex held. The RTNL may be
 * held in addition (due to wireless extensions) but this cannot be relied
 * upon except in cases where documented below. Note that due to ordering,
 * the RTNL also cannot be acquired in any handlers.
4109
 *
4110 4111 4112
 * @suspend: wiphy device needs to be suspended. The variable @wow will
 *	be %NULL or contain the enabled Wake-on-Wireless triggers that are
 *	configured for the device.
Johannes Berg's avatar
Johannes Berg committed
4113
 * @resume: wiphy device needs to be resumed
4114 4115 4116
 * @set_wakeup: Called when WoWLAN is enabled/disabled, use this callback
 *	to call device_set_wakeup_enable() to enable/disable wakeup from
 *	the device.
Johannes Berg's avatar
Johannes Berg committed
4117
 *
4118
 * @add_virtual_intf: create a new virtual interface with the given name,
4119
 *	must set the struct wireless_dev's iftype. Beware: You must create
4120
 *	the new netdev in the wiphy's network namespace! Returns the struct
4121 4122
 *	wireless_dev, or an ERR_PTR. For P2P device wdevs, the driver must
 *	also set the address member in the wdev.
4123
 *	This additionally holds the RTNL to be able to do netdev changes.
4124
 *
4125
 * @del_virtual_intf: remove the virtual interface
4126
 *	This additionally holds the RTNL to be able to do netdev changes.
4127
 *
4128 4129
 * @change_virtual_intf: change type/configuration of virtual interface,
 *	keep the struct wireless_dev's iftype updated.
4130
 *	This additionally holds the RTNL to be able to do netdev changes.
4131
 *
4132 4133 4134 4135 4136
 * @add_intf_link: Add a new MLO link to the given interface. Note that
 *	the wdev->link[] data structure has been updated, so the new link
 *	address is available.
 * @del_intf_link: Remove an MLO link from the given interface.
 *
4137
 * @add_key: add a key with the given parameters. @mac_addr will be %NULL
4138 4139 4140
 *	when adding a group key. @link_id will be -1 for non-MLO connection.
 *	For MLO connection, @link_id will be >= 0 for group key and -1 for
 *	pairwise key, @mac_addr will be peer's MLD address for MLO pairwise key.
4141 4142 4143 4144
 *
 * @get_key: get information about the key with the given parameters.
 *	@mac_addr will be %NULL when requesting information for a group
 *	key. All pointers given to the @callback function need not be valid
4145 4146
 *	after it returns. This function should return an error if it is
 *	not possible to retrieve the key, -ENOENT if it doesn't exist.
4147 4148 4149
 *	@link_id will be -1 for non-MLO connection. For MLO connection,
 *	@link_id will be >= 0 for group key and -1 for pairwise key, @mac_addr
 *	will be peer's MLD address for MLO pairwise key.
4150 4151
 *
 * @del_key: remove a key given the @mac_addr (%NULL for a group key)
4152 4153 4154 4155
 *	and @key_index, return -ENOENT if the key doesn't exist. @link_id will
 *	be -1 for non-MLO connection. For MLO connection, @link_id will be >= 0
 *	for group key and -1 for pairwise key, @mac_addr will be peer's MLD
 *	address for MLO pairwise key.
4156
 *
4157 4158
 * @set_default_key: set the default key on an interface. @link_id will be >= 0
 *	for MLO connection and -1 for non-MLO connection.
4159
 *
4160 4161
 * @set_default_mgmt_key: set the default management frame key on an interface.
 *	@link_id will be >= 0 for MLO connection and -1 for non-MLO connection.
4162
 *
4163 4164
 * @set_default_beacon_key: set the default Beacon frame key on an interface.
 *	@link_id will be >= 0 for MLO connection and -1 for non-MLO connection.
4165
 *
4166 4167
 * @set_rekey_data: give the data necessary for GTK rekeying to the driver
 *
Johannes Berg's avatar
Johannes Berg committed
4168 4169 4170 4171
 * @start_ap: Start acting in AP mode defined by the parameters.
 * @change_beacon: Change the beacon parameters for an access point mode
 *	interface. This should reject the call when AP mode wasn't started.
 * @stop_ap: Stop being an AP, including stopping beaconing.
4172 4173
 *
 * @add_station: Add a new station.
4174
 * @del_station: Remove a station
4175 4176 4177
 * @change_station: Modify a given station. Note that flags changes are not much
 *	validated in cfg80211, in particular the auth/assoc/authorized flags
 *	might come to the driver in invalid combinations -- make sure to check
4178 4179
 *	them, also against the existing state! Drivers must call
 *	cfg80211_check_station_change() to validate the information.
Johannes Berg's avatar
Johannes Berg committed
4180 4181 4182 4183 4184 4185 4186 4187
 * @get_station: get station information for the station identified by @mac
 * @dump_station: dump station callback -- resume dump at index @idx
 *
 * @add_mpath: add a fixed mesh path
 * @del_mpath: delete a given mesh path
 * @change_mpath: change a given mesh path
 * @get_mpath: get a mesh path for the given parameters
 * @dump_mpath: dump mesh path callback -- resume dump at index @idx
4188 4189
 * @get_mpp: get a mesh proxy path for the given parameters
 * @dump_mpp: dump mesh proxy path callback -- resume dump at index @idx
4190
 * @join_mesh: join the mesh network with the specified parameters
4191
 *	(invoked with the wireless_dev mutex held)
4192
 * @leave_mesh: leave the current mesh network
4193
 *	(invoked with the wireless_dev mutex held)
4194
 *
4195
 * @get_mesh_config: Get the current mesh configuration
4196
 *
4197
 * @update_mesh_config: Update mesh parameters on a running mesh.
4198 4199 4200
 *	The mask is a bitfield which tells us which parameters to
 *	set, and which to leave alone.
 *
4201
 * @change_bss: Modify parameters for a given BSS.
4202
 *
4203 4204 4205 4206 4207 4208 4209
 * @inform_bss: Called by cfg80211 while being informed about new BSS data
 *	for every BSS found within the reported data or frame. This is called
 *	from within the cfg8011 inform_bss handlers while holding the bss_lock.
 *	The data parameter is passed through from drv_data inside
 *	struct cfg80211_inform_bss.
 *	The new IE data for the BSS is explicitly passed.
 *
4210
 * @set_txq_params: Set TX queue parameters
4211
 *
4212 4213 4214 4215 4216 4217 4218 4219
 * @libertas_set_mesh_channel: Only for backward compatibility for libertas,
 *	as it doesn't implement join_mesh and needs to set the channel to
 *	join the mesh instead.
 *
 * @set_monitor_channel: Set the monitor mode channel for the device. If other
 *	interfaces are active this callback should reject the configuration.
 *	If no interfaces are active or the device is down, the channel should
 *	be stored for when a monitor interface becomes active.
4220
 *
4221 4222 4223 4224
 * @scan: Request to do a scan. If returning zero, the scan request is given
 *	the driver, and will be valid until passed to cfg80211_scan_done().
 *	For scan results, call cfg80211_inform_bss(); you can call this outside
 *	the scan/scan_done bracket too.
4225 4226
 * @abort_scan: Tell the driver to abort an ongoing scan. The driver shall
 *	indicate the status of the scan through cfg80211_scan_done().
4227 4228
 *
 * @auth: Request to authenticate with the specified peer
4229
 *	(invoked with the wireless_dev mutex held)
4230
 * @assoc: Request to (re)associate with the specified peer
4231
 *	(invoked with the wireless_dev mutex held)
4232
 * @deauth: Request to deauthenticate from the specified peer
4233
 *	(invoked with the wireless_dev mutex held)
4234
 * @disassoc: Request to disassociate from the specified peer
4235
 *	(invoked with the wireless_dev mutex held)
4236
 *
4237
 * @connect: Connect to the ESS with the specified parameters. When connected,
4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249
 *	call cfg80211_connect_result()/cfg80211_connect_bss() with status code
 *	%WLAN_STATUS_SUCCESS. If the connection fails for some reason, call
 *	cfg80211_connect_result()/cfg80211_connect_bss() with the status code
 *	from the AP or cfg80211_connect_timeout() if no frame with status code
 *	was received.
 *	The driver is allowed to roam to other BSSes within the ESS when the
 *	other BSS matches the connect parameters. When such roaming is initiated
 *	by the driver, the driver is expected to verify that the target matches
 *	the configured security parameters and to use Reassociation Request
 *	frame instead of Association Request frame.
 *	The connect function can also be used to request the driver to perform a
 *	specific roam when connected to an ESS. In that case, the prev_bssid
4250
 *	parameter is set to the BSSID of the currently associated BSS as an
4251 4252 4253
 *	indication of requesting reassociation.
 *	In both the driver-initiated and new connect() call initiated roaming
 *	cases, the result of roaming is indicated with a call to
4254
 *	cfg80211_roamed(). (invoked with the wireless_dev mutex held)
4255 4256 4257 4258 4259 4260 4261 4262
 * @update_connect_params: Update the connect parameters while connected to a
 *	BSS. The updated parameters can be used by driver/firmware for
 *	subsequent BSS selection (roaming) decisions and to form the
 *	Authentication/(Re)Association Request frames. This call does not
 *	request an immediate disassociation or reassociation with the current
 *	BSS, i.e., this impacts only subsequent (re)associations. The bits in
 *	changed are defined in &enum cfg80211_connect_params_changed.
 *	(invoked with the wireless_dev mutex held)
4263 4264 4265 4266
 * @disconnect: Disconnect from the BSS/ESS or stop connection attempts if
 *      connection is in progress. Once done, call cfg80211_disconnected() in
 *      case connection was already established (invoked with the
 *      wireless_dev mutex held), otherwise call cfg80211_connect_timeout().
4267
 *
4268 4269 4270
 * @join_ibss: Join the specified IBSS (or create if necessary). Once done, call
 *	cfg80211_ibss_joined(), also call that function when changing BSSID due
 *	to a merge.
4271
 *	(invoked with the wireless_dev mutex held)
4272
 * @leave_ibss: Leave the IBSS.
4273
 *	(invoked with the wireless_dev mutex held)
4274
 *
4275 4276 4277
 * @set_mcast_rate: Set the specified multicast rate (only if vif is in ADHOC or
 *	MESH mode)
 *
4278 4279 4280 4281
 * @set_wiphy_params: Notify that wiphy parameters have changed;
 *	@changed bitfield (see &enum wiphy_params_flags) describes which values
 *	have changed. The actual parameter values are available in
 *	struct wiphy. If returning an error, no value should be changed.
4282
 *
4283
 * @set_tx_power: set the transmit power according to the parameters,
4284 4285 4286 4287
 *	the power passed is in mBm, to get dBm use MBM_TO_DBM(). The
 *	wdev may be %NULL if power was set for the wiphy, and will
 *	always be %NULL unless the driver supports per-vif TX power
 *	(as advertised by the nl80211 feature flag.)
4288
 * @get_tx_power: store the current TX power into the dbm variable;
Johannes Berg's avatar
Johannes Berg committed
4289 4290 4291 4292
 *	return 0 if successful
 *
 * @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting
 *	functions to adjust rfkill hw state
4293
 *
4294 4295
 * @dump_survey: get site survey information.
 *
4296 4297 4298 4299 4300 4301 4302 4303
 * @remain_on_channel: Request the driver to remain awake on the specified
 *	channel for the specified duration to complete an off-channel
 *	operation (e.g., public action frame exchange). When the driver is
 *	ready on the requested channel, it must indicate this with an event
 *	notification by calling cfg80211_ready_on_channel().
 * @cancel_remain_on_channel: Cancel an on-going remain-on-channel operation.
 *	This allows the operation to be terminated prior to timeout based on
 *	the duration value.
4304 4305 4306
 * @mgmt_tx: Transmit a management frame.
 * @mgmt_tx_cancel_wait: Cancel the wait time from transmitting a management
 *	frame on another channel
4307
 *
4308
 * @testmode_cmd: run a test mode command; @wdev may be %NULL
4309 4310 4311 4312 4313 4314
 * @testmode_dump: Implement a test mode dump. The cb->args[2] and up may be
 *	used by the function, but 0 and 1 must not be touched. Additionally,
 *	return error codes other than -ENOBUFS and -ENOENT will terminate the
 *	dump and return to userspace with an error, so be careful. If any data
 *	was passed in from userspace then the data/len arguments will be present
 *	and point to the data contained in %NL80211_ATTR_TESTDATA.
4315
 *
Johannes Berg's avatar
Johannes Berg committed
4316 4317
 * @set_bitrate_mask: set the bitrate mask configuration
 *
4318 4319 4320 4321 4322
 * @set_pmksa: Cache a PMKID for a BSSID. This is mostly useful for fullmac
 *	devices running firmwares capable of generating the (re) association
 *	RSN IE. It allows for faster roaming between WPA2 BSSIDs.
 * @del_pmksa: Delete a cached PMKID.
 * @flush_pmksa: Flush all cached PMKIDs.
4323 4324
 * @set_power_mgmt: Configure WLAN power management. A timeout value of -1
 *	allows the driver to adjust the dynamic ps timeout value.
4325
 * @set_cqm_rssi_config: Configure connection quality monitor RSSI threshold.
4326 4327 4328 4329
 *	After configuration, the driver should (soon) send an event indicating
 *	the current level is above/below the configured threshold; this may
 *	need some care when the configuration is changed (without first being
 *	disabled.)
4330 4331 4332 4333 4334
 * @set_cqm_rssi_range_config: Configure two RSSI thresholds in the
 *	connection quality monitor.  An event is to be sent only when the
 *	signal level is found to be outside the two values.  The driver should
 *	set %NL80211_EXT_FEATURE_CQM_RSSI_LIST if this method is implemented.
 *	If it is provided then there's no point providing @set_cqm_rssi_config.
4335 4336
 * @set_cqm_txe_config: Configure connection quality monitor TX error
 *	thresholds.
4337
 * @sched_scan_start: Tell the driver to start a scheduled scan.
4338 4339 4340 4341 4342 4343
 * @sched_scan_stop: Tell the driver to stop an ongoing scheduled scan with
 *	given request id. This call must stop the scheduled scan and be ready
 *	for starting a new one before it returns, i.e. @sched_scan_start may be
 *	called immediately after that again and should not fail in that case.
 *	The driver should not call cfg80211_sched_scan_stopped() for a requested
 *	stop (when this method returns 0).
4344
 *
4345 4346
 * @update_mgmt_frame_registrations: Notify the driver that management frame
 *	registrations were updated. The callback is allowed to sleep.
4347 4348 4349 4350 4351 4352 4353
 *
 * @set_antenna: Set antenna configuration (tx_ant, rx_ant) on the device.
 *	Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may
 *	reject TX/RX mask combinations they cannot support by returning -EINVAL
 *	(also see nl80211.h @NL80211_ATTR_WIPHY_ANTENNA_TX).
 *
 * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant).
4354
 *
4355 4356
 * @tdls_mgmt: Transmit a TDLS management frame.
 * @tdls_oper: Perform a high-level TDLS operation (e.g. TDLS link setup).
4357 4358 4359
 *
 * @probe_client: probe an associated client, must return a cookie that it
 *	later passes to cfg80211_probe_status().
4360 4361
 *
 * @set_noack_map: Set the NoAck Map for the TIDs.
4362
 *
4363 4364 4365
 * @get_channel: Get the current operating channel for the virtual interface.
 *	For monitor interfaces, it should return %NULL unless there's a single
 *	current monitoring channel.
4366 4367 4368
 *
 * @start_p2p_device: Start the given P2P device.
 * @stop_p2p_device: Stop the given P2P device.
4369 4370 4371 4372 4373 4374 4375
 *
 * @set_mac_acl: Sets MAC address control list in AP and P2P GO mode.
 *	Parameters include ACL policy, an array of MAC address of stations
 *	and the number of MAC addresses. If there is already a list in driver
 *	this new list replaces the existing one. Driver has to clear its ACL
 *	when number of MAC addresses entries is passed as 0. Drivers which
 *	advertise the support for MAC based ACL have to implement this callback.
4376 4377
 *
 * @start_radar_detection: Start radar detection in the driver.
4378
 *
4379 4380 4381
 * @end_cac: End running CAC, probably because a related CAC
 *	was finished on another phy.
 *
4382 4383 4384
 * @update_ft_ies: Provide updated Fast BSS Transition information to the
 *	driver. If the SME is in the driver/firmware, this information can be
 *	used in building Authentication and Reassociation Request frames.
4385 4386 4387 4388 4389 4390
 *
 * @crit_proto_start: Indicates a critical protocol needs more link reliability
 *	for a given duration (milliseconds). The protocol is provided so the
 *	driver can take the most appropriate actions.
 * @crit_proto_stop: Indicates critical protocol no longer needs increased link
 *	reliability. This operation can not fail.
4391
 * @set_coalesce: Set coalesce parameters.
4392
 *
4393 4394 4395 4396 4397 4398
 * @channel_switch: initiate channel-switch procedure (with CSA). Driver is
 *	responsible for veryfing if the switch is possible. Since this is
 *	inherently tricky driver may decide to disconnect an interface later
 *	with cfg80211_stop_iface(). This doesn't mean driver can accept
 *	everything. It should do it's best to verify requests and reject them
 *	as soon as possible.
4399 4400
 *
 * @set_qos_map: Set QoS mapping information to the driver
4401 4402 4403 4404
 *
 * @set_ap_chanwidth: Set the AP (including P2P GO) mode channel width for the
 *	given interface This is used e.g. for dynamic HT 20/40 MHz channel width
 *	changes during the lifetime of the BSS.
4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415
 *
 * @add_tx_ts: validate (if admitted_time is 0) or add a TX TS to the device
 *	with the given parameters; action frame exchange has been handled by
 *	userspace so this just has to modify the TX path to take the TS into
 *	account.
 *	If the admitted time is 0 just validate the parameters to make sure
 *	the session can be created at all; it is valid to just always return
 *	success for that but that may result in inefficient behaviour (handshake
 *	with the peer followed by immediate teardown when the addition is later
 *	rejected)
 * @del_tx_ts: remove an existing TX TS
4416 4417 4418 4419 4420
 *
 * @join_ocb: join the OCB network with the specified parameters
 *	(invoked with the wireless_dev mutex held)
 * @leave_ocb: leave the current OCB network
 *	(invoked with the wireless_dev mutex held)
4421 4422 4423 4424 4425 4426
 *
 * @tdls_channel_switch: Start channel-switching with a TDLS peer. The driver
 *	is responsible for continually initiating channel-switching operations
 *	and returning to the base channel for communication with the AP.
 * @tdls_cancel_channel_switch: Stop channel-switching with a TDLS peer. Both
 *	peers must be on the base channel when the call completes.
4427 4428
 * @start_nan: Start the NAN interface.
 * @stop_nan: Stop the NAN interface.
4429 4430 4431 4432 4433 4434 4435 4436
 * @add_nan_func: Add a NAN function. Returns negative value on failure.
 *	On success @nan_func ownership is transferred to the driver and
 *	it may access it outside of the scope of this function. The driver
 *	should free the @nan_func when no longer needed by calling
 *	cfg80211_free_nan_func().
 *	On success the driver should assign an instance_id in the
 *	provided @nan_func.
 * @del_nan_func: Delete a NAN function.
4437 4438 4439
 * @nan_change_conf: changes NAN configuration. The changed parameters must
 *	be specified in @changes (using &enum cfg80211_nan_conf_changes);
 *	All other parameters must be ignored.
4440 4441
 *
 * @set_multicast_to_unicast: configure multicast to unicast conversion for BSS
4442
 *
4443 4444 4445
 * @get_txq_stats: Get TXQ stats for interface or phy. If wdev is %NULL, this
 *      function should return phy stats, and interface stats otherwise.
 *
4446 4447 4448 4449 4450 4451
 * @set_pmk: configure the PMK to be used for offloaded 802.1X 4-Way handshake.
 *	If not deleted through @del_pmk the PMK remains valid until disconnect
 *	upon which the driver should clear it.
 *	(invoked with the wireless_dev mutex held)
 * @del_pmk: delete the previously configured PMK for the given authenticator.
 *	(invoked with the wireless_dev mutex held)
4452 4453 4454
 *
 * @external_auth: indicates result of offloaded authentication processing from
 *     user space
4455 4456 4457
 *
 * @tx_control_port: TX a control port frame (EAPoL).  The noencrypt parameter
 *	tells the driver that the frame should not be encrypted.
4458 4459 4460
 *
 * @get_ftm_responder_stats: Retrieve FTM responder statistics, if available.
 *	Statistics should be cumulative, currently no way to reset is provided.
4461 4462
 * @start_pmsr: start peer measurement (e.g. FTM)
 * @abort_pmsr: abort peer measurement
4463 4464 4465 4466
 *
 * @update_owe_info: Provide updated OWE info to driver. Driver implementing SME
 *	but offloading OWE processing to the user space will get the updated
 *	DH IE through this interface.
4467 4468 4469
 *
 * @probe_mesh_link: Probe direct Mesh peer's link quality by sending data frame
 *	and overrule HWMP path selection algorithm.
4470 4471
 * @set_tid_config: TID specific configuration, this can be peer or BSS specific
 *	This callback may sleep.
4472 4473
 * @reset_tid_config: Reset TID specific configuration for the peer, for the
 *	given TIDs. This callback may sleep.
4474 4475
 *
 * @set_sar_specs: Update the SAR (TX power) settings.
4476 4477
 *
 * @color_change: Initiate a color change.
4478 4479 4480 4481
 *
 * @set_fils_aad: Set FILS AAD data to the AP driver so that the driver can use
 *	those to decrypt (Re)Association Request and encrypt (Re)Association
 *	Response frame.
4482
 *
4483
 * @set_radar_background: Configure dedicated offchannel chain available for
4484 4485
 *	radar/CAC detection on some hw. This chain can't be used to transmit
 *	or receive frames and it is bounded to a running wdev.
4486
 *	Background radar/CAC detection allows to avoid the CAC downtime
4487 4488 4489
 *	switching to a different channel during CAC detection on the selected
 *	radar channel.
 *	The caller is expected to set chandef pointer to NULL in order to
4490
 *	disable background CAC/radar detection.
4491 4492 4493
 * @add_link_station: Add a link to a station.
 * @mod_link_station: Modify a link of a station.
 * @del_link_station: Remove a link of a station.
4494 4495
 *
 * @set_hw_timestamp: Enable/disable HW timestamping of TM/FTM frames.
4496 4497
 */
struct cfg80211_ops {
4498
	int	(*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
Johannes Berg's avatar
Johannes Berg committed
4499
	int	(*resume)(struct wiphy *wiphy);
4500
	void	(*set_wakeup)(struct wiphy *wiphy, bool enabled);
Johannes Berg's avatar
Johannes Berg committed
4501

4502
	struct wireless_dev * (*add_virtual_intf)(struct wiphy *wiphy,
4503
						  const char *name,
4504
						  unsigned char name_assign_type,
4505 4506 4507 4508
						  enum nl80211_iftype type,
						  struct vif_params *params);
	int	(*del_virtual_intf)(struct wiphy *wiphy,
				    struct wireless_dev *wdev);
4509 4510
	int	(*change_virtual_intf)(struct wiphy *wiphy,
				       struct net_device *dev,
4511
				       enum nl80211_iftype type,
4512
				       struct vif_params *params);
4513

4514 4515 4516 4517 4518 4519 4520
	int	(*add_intf_link)(struct wiphy *wiphy,
				 struct wireless_dev *wdev,
				 unsigned int link_id);
	void	(*del_intf_link)(struct wiphy *wiphy,
				 struct wireless_dev *wdev,
				 unsigned int link_id);

4521
	int	(*add_key)(struct wiphy *wiphy, struct net_device *netdev,
4522 4523
			   int link_id, u8 key_index, bool pairwise,
			   const u8 *mac_addr, struct key_params *params);
4524
	int	(*get_key)(struct wiphy *wiphy, struct net_device *netdev,
4525 4526
			   int link_id, u8 key_index, bool pairwise,
			   const u8 *mac_addr, void *cookie,
4527 4528
			   void (*callback)(void *cookie, struct key_params*));
	int	(*del_key)(struct wiphy *wiphy, struct net_device *netdev,
4529 4530
			   int link_id, u8 key_index, bool pairwise,
			   const u8 *mac_addr);
4531
	int	(*set_default_key)(struct wiphy *wiphy,
4532
				   struct net_device *netdev, int link_id,
4533
				   u8 key_index, bool unicast, bool multicast);
4534
	int	(*set_default_mgmt_key)(struct wiphy *wiphy,
4535
					struct net_device *netdev, int link_id,
4536
					u8 key_index);
4537 4538
	int	(*set_default_beacon_key)(struct wiphy *wiphy,
					  struct net_device *netdev,
4539
					  int link_id,
4540
					  u8 key_index);
4541

4542 4543 4544
	int	(*start_ap)(struct wiphy *wiphy, struct net_device *dev,
			    struct cfg80211_ap_settings *settings);
	int	(*change_beacon)(struct wiphy *wiphy, struct net_device *dev,
4545
				 struct cfg80211_ap_update *info);
4546 4547
	int	(*stop_ap)(struct wiphy *wiphy, struct net_device *dev,
			   unsigned int link_id);
4548 4549 4550


	int	(*add_station)(struct wiphy *wiphy, struct net_device *dev,
4551 4552
			       const u8 *mac,
			       struct station_parameters *params);
4553
	int	(*del_station)(struct wiphy *wiphy, struct net_device *dev,
4554
			       struct station_del_parameters *params);
4555
	int	(*change_station)(struct wiphy *wiphy, struct net_device *dev,
4556 4557
				  const u8 *mac,
				  struct station_parameters *params);
4558
	int	(*get_station)(struct wiphy *wiphy, struct net_device *dev,
4559
			       const u8 *mac, struct station_info *sinfo);
4560
	int	(*dump_station)(struct wiphy *wiphy, struct net_device *dev,
4561
				int idx, u8 *mac, struct station_info *sinfo);
4562 4563

	int	(*add_mpath)(struct wiphy *wiphy, struct net_device *dev,
4564
			       const u8 *dst, const u8 *next_hop);
4565
	int	(*del_mpath)(struct wiphy *wiphy, struct net_device *dev,
4566
			       const u8 *dst);
4567
	int	(*change_mpath)(struct wiphy *wiphy, struct net_device *dev,
4568
				  const u8 *dst, const u8 *next_hop);
4569
	int	(*get_mpath)(struct wiphy *wiphy, struct net_device *dev,
4570
			     u8 *dst, u8 *next_hop, struct mpath_info *pinfo);
4571
	int	(*dump_mpath)(struct wiphy *wiphy, struct net_device *dev,
4572 4573
			      int idx, u8 *dst, u8 *next_hop,
			      struct mpath_info *pinfo);
4574 4575 4576 4577 4578
	int	(*get_mpp)(struct wiphy *wiphy, struct net_device *dev,
			   u8 *dst, u8 *mpp, struct mpath_info *pinfo);
	int	(*dump_mpp)(struct wiphy *wiphy, struct net_device *dev,
			    int idx, u8 *dst, u8 *mpp,
			    struct mpath_info *pinfo);
4579
	int	(*get_mesh_config)(struct wiphy *wiphy,
4580 4581
				struct net_device *dev,
				struct mesh_config *conf);
4582
	int	(*update_mesh_config)(struct wiphy *wiphy,
4583 4584 4585 4586 4587 4588 4589
				      struct net_device *dev, u32 mask,
				      const struct mesh_config *nconf);
	int	(*join_mesh)(struct wiphy *wiphy, struct net_device *dev,
			     const struct mesh_config *conf,
			     const struct mesh_setup *setup);
	int	(*leave_mesh)(struct wiphy *wiphy, struct net_device *dev);

4590 4591 4592 4593
	int	(*join_ocb)(struct wiphy *wiphy, struct net_device *dev,
			    struct ocb_setup *setup);
	int	(*leave_ocb)(struct wiphy *wiphy, struct net_device *dev);

4594 4595
	int	(*change_bss)(struct wiphy *wiphy, struct net_device *dev,
			      struct bss_parameters *params);
4596

4597 4598 4599
	void	(*inform_bss)(struct wiphy *wiphy, struct cfg80211_bss *bss,
			      const struct cfg80211_bss_ies *ies, void *data);

4600
	int	(*set_txq_params)(struct wiphy *wiphy, struct net_device *dev,
4601
				  struct ieee80211_txq_params *params);
4602

4603 4604 4605 4606 4607
	int	(*libertas_set_mesh_channel)(struct wiphy *wiphy,
					     struct net_device *dev,
					     struct ieee80211_channel *chan);

	int	(*set_monitor_channel)(struct wiphy *wiphy,
4608
				       struct cfg80211_chan_def *chandef);
4609

4610
	int	(*scan)(struct wiphy *wiphy,
4611
			struct cfg80211_scan_request *request);
4612
	void	(*abort_scan)(struct wiphy *wiphy, struct wireless_dev *wdev);
4613 4614 4615 4616 4617 4618

	int	(*auth)(struct wiphy *wiphy, struct net_device *dev,
			struct cfg80211_auth_request *req);
	int	(*assoc)(struct wiphy *wiphy, struct net_device *dev,
			 struct cfg80211_assoc_request *req);
	int	(*deauth)(struct wiphy *wiphy, struct net_device *dev,
4619
			  struct cfg80211_deauth_request *req);
4620
	int	(*disassoc)(struct wiphy *wiphy, struct net_device *dev,
4621
			    struct cfg80211_disassoc_request *req);
4622

4623 4624
	int	(*connect)(struct wiphy *wiphy, struct net_device *dev,
			   struct cfg80211_connect_params *sme);
4625 4626 4627 4628
	int	(*update_connect_params)(struct wiphy *wiphy,
					 struct net_device *dev,
					 struct cfg80211_connect_params *sme,
					 u32 changed);
4629 4630 4631
	int	(*disconnect)(struct wiphy *wiphy, struct net_device *dev,
			      u16 reason_code);

4632 4633 4634
	int	(*join_ibss)(struct wiphy *wiphy, struct net_device *dev,
			     struct cfg80211_ibss_params *params);
	int	(*leave_ibss)(struct wiphy *wiphy, struct net_device *dev);
4635

4636
	int	(*set_mcast_rate)(struct wiphy *wiphy, struct net_device *dev,
4637
				  int rate[NUM_NL80211_BANDS]);
4638

4639
	int	(*set_wiphy_params)(struct wiphy *wiphy, u32 changed);
4640

4641
	int	(*set_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
4642
				enum nl80211_tx_power_setting type, int mbm);
4643 4644
	int	(*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
				int *dbm);
Johannes Berg's avatar
Johannes Berg committed
4645 4646

	void	(*rfkill_poll)(struct wiphy *wiphy);
4647 4648

#ifdef CONFIG_NL80211_TESTMODE
4649 4650
	int	(*testmode_cmd)(struct wiphy *wiphy, struct wireless_dev *wdev,
				void *data, int len);
4651 4652 4653
	int	(*testmode_dump)(struct wiphy *wiphy, struct sk_buff *skb,
				 struct netlink_callback *cb,
				 void *data, int len);
4654
#endif
Johannes Berg's avatar
Johannes Berg committed
4655

Johannes Berg's avatar
Johannes Berg committed
4656 4657
	int	(*set_bitrate_mask)(struct wiphy *wiphy,
				    struct net_device *dev,
4658
				    unsigned int link_id,
Johannes Berg's avatar
Johannes Berg committed
4659 4660 4661
				    const u8 *peer,
				    const struct cfg80211_bitrate_mask *mask);

4662 4663 4664
	int	(*dump_survey)(struct wiphy *wiphy, struct net_device *netdev,
			int idx, struct survey_info *info);

4665 4666 4667 4668 4669 4670
	int	(*set_pmksa)(struct wiphy *wiphy, struct net_device *netdev,
			     struct cfg80211_pmksa *pmksa);
	int	(*del_pmksa)(struct wiphy *wiphy, struct net_device *netdev,
			     struct cfg80211_pmksa *pmksa);
	int	(*flush_pmksa)(struct wiphy *wiphy, struct net_device *netdev);

4671
	int	(*remain_on_channel)(struct wiphy *wiphy,
4672
				     struct wireless_dev *wdev,
4673 4674 4675 4676
				     struct ieee80211_channel *chan,
				     unsigned int duration,
				     u64 *cookie);
	int	(*cancel_remain_on_channel)(struct wiphy *wiphy,
4677
					    struct wireless_dev *wdev,
4678 4679
					    u64 cookie);

4680
	int	(*mgmt_tx)(struct wiphy *wiphy, struct wireless_dev *wdev,
4681 4682
			   struct cfg80211_mgmt_tx_params *params,
			   u64 *cookie);
4683
	int	(*mgmt_tx_cancel_wait)(struct wiphy *wiphy,
4684
				       struct wireless_dev *wdev,
4685
				       u64 cookie);
4686

Johannes Berg's avatar
Johannes Berg committed
4687 4688
	int	(*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev,
				  bool enabled, int timeout);
4689 4690 4691 4692

	int	(*set_cqm_rssi_config)(struct wiphy *wiphy,
				       struct net_device *dev,
				       s32 rssi_thold, u32 rssi_hyst);
4693

4694 4695 4696 4697
	int	(*set_cqm_rssi_range_config)(struct wiphy *wiphy,
					     struct net_device *dev,
					     s32 rssi_low, s32 rssi_high);

4698 4699 4700 4701
	int	(*set_cqm_txe_config)(struct wiphy *wiphy,
				      struct net_device *dev,
				      u32 rate, u32 pkts, u32 intvl);

4702 4703 4704
	void	(*update_mgmt_frame_registrations)(struct wiphy *wiphy,
						   struct wireless_dev *wdev,
						   struct mgmt_frame_regs *upd);
4705 4706 4707

	int	(*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant);
	int	(*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant);
4708

4709 4710 4711
	int	(*sched_scan_start)(struct wiphy *wiphy,
				struct net_device *dev,
				struct cfg80211_sched_scan_request *request);
4712 4713
	int	(*sched_scan_stop)(struct wiphy *wiphy, struct net_device *dev,
				   u64 reqid);
4714 4715 4716

	int	(*set_rekey_data)(struct wiphy *wiphy, struct net_device *dev,
				  struct cfg80211_gtk_rekey_data *data);
4717 4718

	int	(*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev,
4719 4720 4721 4722
			     const u8 *peer, int link_id,
			     u8 action_code, u8 dialog_token, u16 status_code,
			     u32 peer_capability, bool initiator,
			     const u8 *buf, size_t len);
4723
	int	(*tdls_oper)(struct wiphy *wiphy, struct net_device *dev,
4724
			     const u8 *peer, enum nl80211_tdls_operation oper);
4725 4726 4727

	int	(*probe_client)(struct wiphy *wiphy, struct net_device *dev,
				const u8 *peer, u64 *cookie);
4728

4729 4730 4731 4732
	int	(*set_noack_map)(struct wiphy *wiphy,
				  struct net_device *dev,
				  u16 noack_map);

4733
	int	(*get_channel)(struct wiphy *wiphy,
4734
			       struct wireless_dev *wdev,
4735
			       unsigned int link_id,
4736
			       struct cfg80211_chan_def *chandef);
4737 4738 4739 4740 4741

	int	(*start_p2p_device)(struct wiphy *wiphy,
				    struct wireless_dev *wdev);
	void	(*stop_p2p_device)(struct wiphy *wiphy,
				   struct wireless_dev *wdev);
4742 4743 4744

	int	(*set_mac_acl)(struct wiphy *wiphy, struct net_device *dev,
			       const struct cfg80211_acl_data *params);
4745 4746 4747

	int	(*start_radar_detection)(struct wiphy *wiphy,
					 struct net_device *dev,
4748 4749
					 struct cfg80211_chan_def *chandef,
					 u32 cac_time_ms);
4750 4751
	void	(*end_cac)(struct wiphy *wiphy,
				struct net_device *dev);
4752 4753
	int	(*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev,
				 struct cfg80211_update_ft_ies_params *ftie);
4754 4755 4756 4757 4758 4759
	int	(*crit_proto_start)(struct wiphy *wiphy,
				    struct wireless_dev *wdev,
				    enum nl80211_crit_proto_id protocol,
				    u16 duration);
	void	(*crit_proto_stop)(struct wiphy *wiphy,
				   struct wireless_dev *wdev);
4760 4761
	int	(*set_coalesce)(struct wiphy *wiphy,
				struct cfg80211_coalesce *coalesce);
4762 4763 4764 4765

	int	(*channel_switch)(struct wiphy *wiphy,
				  struct net_device *dev,
				  struct cfg80211_csa_settings *params);
4766

4767 4768 4769
	int     (*set_qos_map)(struct wiphy *wiphy,
			       struct net_device *dev,
			       struct cfg80211_qos_map *qos_map);
4770 4771

	int	(*set_ap_chanwidth)(struct wiphy *wiphy, struct net_device *dev,
4772
				    unsigned int link_id,
4773
				    struct cfg80211_chan_def *chandef);
4774 4775 4776 4777 4778 4779

	int	(*add_tx_ts)(struct wiphy *wiphy, struct net_device *dev,
			     u8 tsid, const u8 *peer, u8 user_prio,
			     u16 admitted_time);
	int	(*del_tx_ts)(struct wiphy *wiphy, struct net_device *dev,
			     u8 tsid, const u8 *peer);
4780 4781 4782 4783 4784 4785 4786 4787

	int	(*tdls_channel_switch)(struct wiphy *wiphy,
				       struct net_device *dev,
				       const u8 *addr, u8 oper_class,
				       struct cfg80211_chan_def *chandef);
	void	(*tdls_cancel_channel_switch)(struct wiphy *wiphy,
					      struct net_device *dev,
					      const u8 *addr);
4788 4789 4790
	int	(*start_nan)(struct wiphy *wiphy, struct wireless_dev *wdev,
			     struct cfg80211_nan_conf *conf);
	void	(*stop_nan)(struct wiphy *wiphy, struct wireless_dev *wdev);
4791 4792 4793 4794
	int	(*add_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev,
				struct cfg80211_nan_func *nan_func);
	void	(*del_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev,
			       u64 cookie);
4795 4796 4797 4798
	int	(*nan_change_conf)(struct wiphy *wiphy,
				   struct wireless_dev *wdev,
				   struct cfg80211_nan_conf *conf,
				   u32 changes);
4799 4800 4801 4802

	int	(*set_multicast_to_unicast)(struct wiphy *wiphy,
					    struct net_device *dev,
					    const bool enabled);
4803

4804 4805 4806 4807
	int	(*get_txq_stats)(struct wiphy *wiphy,
				 struct wireless_dev *wdev,
				 struct cfg80211_txq_stats *txqstats);

4808 4809 4810 4811
	int	(*set_pmk)(struct wiphy *wiphy, struct net_device *dev,
			   const struct cfg80211_pmk_conf *conf);
	int	(*del_pmk)(struct wiphy *wiphy, struct net_device *dev,
			   const u8 *aa);
4812 4813
	int     (*external_auth)(struct wiphy *wiphy, struct net_device *dev,
				 struct cfg80211_external_auth_params *params);
4814 4815 4816 4817

	int	(*tx_control_port)(struct wiphy *wiphy,
				   struct net_device *dev,
				   const u8 *buf, size_t len,
4818
				   const u8 *dest, const __be16 proto,
4819
				   const bool noencrypt, int link_id,
4820
				   u64 *cookie);
4821 4822 4823 4824

	int	(*get_ftm_responder_stats)(struct wiphy *wiphy,
				struct net_device *dev,
				struct cfg80211_ftm_responder_stats *ftm_stats);
4825 4826 4827 4828 4829

	int	(*start_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev,
			      struct cfg80211_pmsr_request *request);
	void	(*abort_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev,
			      struct cfg80211_pmsr_request *request);
4830 4831
	int	(*update_owe_info)(struct wiphy *wiphy, struct net_device *dev,
				   struct cfg80211_update_owe_info *owe_info);
4832 4833
	int	(*probe_mesh_link)(struct wiphy *wiphy, struct net_device *dev,
				   const u8 *buf, size_t len);
4834
	int     (*set_tid_config)(struct wiphy *wiphy, struct net_device *dev,
4835
				  struct cfg80211_tid_config *tid_conf);
4836
	int	(*reset_tid_config)(struct wiphy *wiphy, struct net_device *dev,
4837
				    const u8 *peer, u8 tids);
4838 4839
	int	(*set_sar_specs)(struct wiphy *wiphy,
				 struct cfg80211_sar_specs *sar);
4840 4841 4842
	int	(*color_change)(struct wiphy *wiphy,
				struct net_device *dev,
				struct cfg80211_color_change_settings *params);
4843 4844
	int     (*set_fils_aad)(struct wiphy *wiphy, struct net_device *dev,
				struct cfg80211_fils_aad *fils_aad);
4845 4846
	int	(*set_radar_background)(struct wiphy *wiphy,
					struct cfg80211_chan_def *chandef);
4847 4848 4849 4850 4851 4852
	int	(*add_link_station)(struct wiphy *wiphy, struct net_device *dev,
				    struct link_station_parameters *params);
	int	(*mod_link_station)(struct wiphy *wiphy, struct net_device *dev,
				    struct link_station_parameters *params);
	int	(*del_link_station)(struct wiphy *wiphy, struct net_device *dev,
				    struct link_station_del_parameters *params);
4853 4854
	int	(*set_hw_timestamp)(struct wiphy *wiphy, struct net_device *dev,
				    struct cfg80211_set_hw_timestamp *hwts);
4855 4856
};

Johannes Berg's avatar
Johannes Berg committed
4857 4858 4859 4860 4861 4862
/*
 * wireless hardware and networking interfaces structures
 * and registration/helper functions
 */

/**
4863 4864
 * enum wiphy_flags - wiphy capability flags
 *
4865 4866
 * @WIPHY_FLAG_SPLIT_SCAN_6GHZ: if set to true, the scan request will be split
 *	 into two, first for legacy bands and second for UHB.
4867 4868 4869 4870 4871 4872
 * @WIPHY_FLAG_NETNS_OK: if not set, do not allow changing the netns of this
 *	wiphy at all
 * @WIPHY_FLAG_PS_ON_BY_DEFAULT: if set to true, powersave will be enabled
 *	by default -- this flag will be set depending on the kernel's default
 *	on wiphy_new(), but can be changed by the driver if it has a good
 *	reason to override the default
4873
 * @WIPHY_FLAG_4ADDR_AP: supports 4addr mode even on AP (with a single station
4874 4875
 *	on a VLAN interface). This flag also serves an extra purpose of
 *	supporting 4ADDR AP mode on devices which do not support AP/VLAN iftype.
4876
 * @WIPHY_FLAG_4ADDR_STATION: supports 4addr mode even as a station
4877 4878 4879
 * @WIPHY_FLAG_CONTROL_PORT_PROTOCOL: This device supports setting the
 *	control port protocol ethertype. The device also honours the
 *	control_port_no_encrypt flag.
4880
 * @WIPHY_FLAG_IBSS_RSN: The device supports IBSS RSN.
4881 4882
 * @WIPHY_FLAG_MESH_AUTH: The device supports mesh authentication by routing
 *	auth frames to userspace. See @NL80211_MESH_SETUP_USERSPACE_AUTH.
4883 4884
 * @WIPHY_FLAG_SUPPORTS_FW_ROAM: The device supports roaming feature in the
 *	firmware.
4885
 * @WIPHY_FLAG_AP_UAPSD: The device supports uapsd on AP.
4886 4887 4888 4889 4890 4891
 * @WIPHY_FLAG_SUPPORTS_TDLS: The device supports TDLS (802.11z) operation.
 * @WIPHY_FLAG_TDLS_EXTERNAL_SETUP: The device does not handle TDLS (802.11z)
 *	link setup/discovery operations internally. Setup, discovery and
 *	teardown packets should be sent through the @NL80211_CMD_TDLS_MGMT
 *	command. When this flag is not set, @NL80211_CMD_TDLS_OPER should be
 *	used for asking the driver/firmware to perform a TDLS operation.
4892
 * @WIPHY_FLAG_HAVE_AP_SME: device integrates AP SME
4893 4894 4895
 * @WIPHY_FLAG_REPORTS_OBSS: the device will report beacons from other BSSes
 *	when there are virtual interfaces in AP mode by calling
 *	cfg80211_report_obss_beacon().
4896 4897
 * @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD: When operating as an AP, the device
 *	responds to probe-requests in hardware.
4898 4899
 * @WIPHY_FLAG_OFFCHAN_TX: Device supports direct off-channel TX.
 * @WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL: Device supports remain-on-channel call.
4900
 * @WIPHY_FLAG_SUPPORTS_5_10_MHZ: Device supports 5 MHz and 10 MHz channels.
4901 4902
 * @WIPHY_FLAG_HAS_CHANNEL_SWITCH: Device supports channel switch in
 *	beaconing mode (AP, IBSS, Mesh, ...).
4903
 * @WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK: The device supports bigger kek and kck keys
4904 4905 4906 4907
 * @WIPHY_FLAG_SUPPORTS_MLO: This is a temporary flag gating the MLO APIs,
 *	in order to not have them reachable in normal drivers, until we have
 *	complete feature/interface combinations/etc. advertisement. No driver
 *	should set this flag for now.
4908
 * @WIPHY_FLAG_SUPPORTS_EXT_KCK_32: The device supports 32-byte KCK keys.
4909 4910
 * @WIPHY_FLAG_NOTIFY_REGDOM_BY_DRIVER: The device could handle reg notify for
 *	NL80211_REGDOM_SET_BY_DRIVER.
4911 4912
 * @WIPHY_FLAG_CHANNEL_CHANGE_ON_BEACON: reg_call_notifier() is called if driver
 *	set this flag to update channels on beacon hints.
4913 4914
 */
enum wiphy_flags {
4915
	WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK		= BIT(0),
4916
	WIPHY_FLAG_SUPPORTS_MLO			= BIT(1),
4917
	WIPHY_FLAG_SPLIT_SCAN_6GHZ		= BIT(2),
4918 4919 4920 4921 4922
	WIPHY_FLAG_NETNS_OK			= BIT(3),
	WIPHY_FLAG_PS_ON_BY_DEFAULT		= BIT(4),
	WIPHY_FLAG_4ADDR_AP			= BIT(5),
	WIPHY_FLAG_4ADDR_STATION		= BIT(6),
	WIPHY_FLAG_CONTROL_PORT_PROTOCOL	= BIT(7),
4923
	WIPHY_FLAG_IBSS_RSN			= BIT(8),
4924
	WIPHY_FLAG_MESH_AUTH			= BIT(10),
4925
	WIPHY_FLAG_SUPPORTS_EXT_KCK_32          = BIT(11),
4926
	/* use hole at 12 */
4927
	WIPHY_FLAG_SUPPORTS_FW_ROAM		= BIT(13),
4928
	WIPHY_FLAG_AP_UAPSD			= BIT(14),
4929 4930
	WIPHY_FLAG_SUPPORTS_TDLS		= BIT(15),
	WIPHY_FLAG_TDLS_EXTERNAL_SETUP		= BIT(16),
4931
	WIPHY_FLAG_HAVE_AP_SME			= BIT(17),
4932
	WIPHY_FLAG_REPORTS_OBSS			= BIT(18),
4933
	WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD	= BIT(19),
4934 4935
	WIPHY_FLAG_OFFCHAN_TX			= BIT(20),
	WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL	= BIT(21),
4936
	WIPHY_FLAG_SUPPORTS_5_10_MHZ		= BIT(22),
4937
	WIPHY_FLAG_HAS_CHANNEL_SWITCH		= BIT(23),
4938
	WIPHY_FLAG_NOTIFY_REGDOM_BY_DRIVER	= BIT(24),
4939
	WIPHY_FLAG_CHANNEL_CHANGE_ON_BEACON     = BIT(25),
4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954
};

/**
 * struct ieee80211_iface_limit - limit on certain interface types
 * @max: maximum number of interfaces of these types
 * @types: interface types (bits)
 */
struct ieee80211_iface_limit {
	u16 max;
	u16 types;
};

/**
 * struct ieee80211_iface_combination - possible interface combination
 *
4955 4956
 * With this structure the driver can describe which interface
 * combinations it supports concurrently.
4957
 *
4958 4959 4960
 * Examples:
 *
 * 1. Allow #STA <= 1, #AP <= 1, matching BI, channels = 1, 2 total:
4961
 *
4962 4963 4964 4965
 *    .. code-block:: c
 *
 *	struct ieee80211_iface_limit limits1[] = {
 *		{ .max = 1, .types = BIT(NL80211_IFTYPE_STATION), },
4966
 *		{ .max = 1, .types = BIT(NL80211_IFTYPE_AP), },
4967 4968 4969 4970 4971 4972 4973
 *	};
 *	struct ieee80211_iface_combination combination1 = {
 *		.limits = limits1,
 *		.n_limits = ARRAY_SIZE(limits1),
 *		.max_interfaces = 2,
 *		.beacon_int_infra_match = true,
 *	};
4974 4975
 *
 *
4976
 * 2. Allow #{AP, P2P-GO} <= 8, channels = 1, 8 total:
4977
 *
4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989
 *    .. code-block:: c
 *
 *	struct ieee80211_iface_limit limits2[] = {
 *		{ .max = 8, .types = BIT(NL80211_IFTYPE_AP) |
 *				     BIT(NL80211_IFTYPE_P2P_GO), },
 *	};
 *	struct ieee80211_iface_combination combination2 = {
 *		.limits = limits2,
 *		.n_limits = ARRAY_SIZE(limits2),
 *		.max_interfaces = 8,
 *		.num_different_channels = 1,
 *	};
4990 4991
 *
 *
4992 4993
 * 3. Allow #STA <= 1, #{P2P-client,P2P-GO} <= 3 on two channels, 4 total.
 *
4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008
 *    This allows for an infrastructure connection and three P2P connections.
 *
 *    .. code-block:: c
 *
 *	struct ieee80211_iface_limit limits3[] = {
 *		{ .max = 1, .types = BIT(NL80211_IFTYPE_STATION), },
 *		{ .max = 3, .types = BIT(NL80211_IFTYPE_P2P_GO) |
 *				     BIT(NL80211_IFTYPE_P2P_CLIENT), },
 *	};
 *	struct ieee80211_iface_combination combination3 = {
 *		.limits = limits3,
 *		.n_limits = ARRAY_SIZE(limits3),
 *		.max_interfaces = 4,
 *		.num_different_channels = 2,
 *	};
5009 5010 5011
 *
 */
struct ieee80211_iface_combination {
5012 5013 5014 5015
	/**
	 * @limits:
	 * limits for the given interface types
	 */
5016
	const struct ieee80211_iface_limit *limits;
5017 5018 5019 5020 5021

	/**
	 * @num_different_channels:
	 * can use up to this many different channels
	 */
5022
	u32 num_different_channels;
5023 5024 5025 5026 5027

	/**
	 * @max_interfaces:
	 * maximum number of interfaces in total allowed in this group
	 */
5028
	u16 max_interfaces;
5029 5030 5031 5032 5033

	/**
	 * @n_limits:
	 * number of limitations
	 */
5034
	u8 n_limits;
5035 5036 5037 5038 5039 5040

	/**
	 * @beacon_int_infra_match:
	 * In this combination, the beacon intervals between infrastructure
	 * and AP types must match. This is required only in special cases.
	 */
5041
	bool beacon_int_infra_match;
5042 5043 5044 5045 5046

	/**
	 * @radar_detect_widths:
	 * bitmap of channel widths supported for radar detection
	 */
5047
	u8 radar_detect_widths;
5048 5049 5050 5051 5052

	/**
	 * @radar_detect_regions:
	 * bitmap of regions supported for radar detection
	 */
5053
	u8 radar_detect_regions;
5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065

	/**
	 * @beacon_int_min_gcd:
	 * This interface combination supports different beacon intervals.
	 *
	 * = 0
	 *   all beacon intervals for different interface must be same.
	 * > 0
	 *   any beacon interval for the interface part of this combination AND
	 *   GCD of all beacon intervals from beaconing interfaces of this
	 *   combination must be greater or equal to this value.
	 */
5066
	u32 beacon_int_min_gcd;
5067 5068
};

5069 5070 5071 5072
struct ieee80211_txrx_stypes {
	u16 tx, rx;
};

5073 5074 5075 5076 5077 5078 5079 5080 5081 5082
/**
 * enum wiphy_wowlan_support_flags - WoWLAN support flags
 * @WIPHY_WOWLAN_ANY: supports wakeup for the special "any"
 *	trigger that keeps the device operating as-is and
 *	wakes up the host on any activity, for example a
 *	received packet that passed filtering; note that the
 *	packet should be preserved in that case
 * @WIPHY_WOWLAN_MAGIC_PKT: supports wakeup on magic packet
 *	(see nl80211.h)
 * @WIPHY_WOWLAN_DISCONNECT: supports wakeup on disconnect
5083 5084 5085 5086 5087
 * @WIPHY_WOWLAN_SUPPORTS_GTK_REKEY: supports GTK rekeying while asleep
 * @WIPHY_WOWLAN_GTK_REKEY_FAILURE: supports wakeup on GTK rekey failure
 * @WIPHY_WOWLAN_EAP_IDENTITY_REQ: supports wakeup on EAP identity request
 * @WIPHY_WOWLAN_4WAY_HANDSHAKE: supports wakeup on 4-way handshake failure
 * @WIPHY_WOWLAN_RFKILL_RELEASE: supports wakeup on RF-kill release
5088
 * @WIPHY_WOWLAN_NET_DETECT: supports wakeup on network detection
5089 5090
 */
enum wiphy_wowlan_support_flags {
5091 5092 5093 5094 5095 5096 5097 5098
	WIPHY_WOWLAN_ANY		= BIT(0),
	WIPHY_WOWLAN_MAGIC_PKT		= BIT(1),
	WIPHY_WOWLAN_DISCONNECT		= BIT(2),
	WIPHY_WOWLAN_SUPPORTS_GTK_REKEY	= BIT(3),
	WIPHY_WOWLAN_GTK_REKEY_FAILURE	= BIT(4),
	WIPHY_WOWLAN_EAP_IDENTITY_REQ	= BIT(5),
	WIPHY_WOWLAN_4WAY_HANDSHAKE	= BIT(6),
	WIPHY_WOWLAN_RFKILL_RELEASE	= BIT(7),
5099
	WIPHY_WOWLAN_NET_DETECT		= BIT(8),
5100 5101
};

5102 5103 5104 5105 5106 5107 5108 5109
struct wiphy_wowlan_tcp_support {
	const struct nl80211_wowlan_tcp_data_token_feature *tok;
	u32 data_payload_max;
	u32 data_interval_max;
	u32 wake_payload_max;
	bool seq;
};

5110 5111 5112 5113 5114 5115 5116
/**
 * struct wiphy_wowlan_support - WoWLAN support data
 * @flags: see &enum wiphy_wowlan_support_flags
 * @n_patterns: number of supported wakeup patterns
 *	(see nl80211.h for the pattern definition)
 * @pattern_max_len: maximum length of each pattern
 * @pattern_min_len: minimum length of each pattern
5117
 * @max_pkt_offset: maximum Rx packet offset
5118 5119 5120 5121 5122
 * @max_nd_match_sets: maximum number of matchsets for net-detect,
 *	similar, but not necessarily identical, to max_match_sets for
 *	scheduled scans.
 *	See &struct cfg80211_sched_scan_request.@match_sets for more
 *	details.
5123
 * @tcp: TCP wakeup support information
5124 5125 5126 5127 5128 5129
 */
struct wiphy_wowlan_support {
	u32 flags;
	int n_patterns;
	int pattern_max_len;
	int pattern_min_len;
5130
	int max_pkt_offset;
5131
	int max_nd_match_sets;
5132
	const struct wiphy_wowlan_tcp_support *tcp;
5133 5134
};

5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153
/**
 * struct wiphy_coalesce_support - coalesce support data
 * @n_rules: maximum number of coalesce rules
 * @max_delay: maximum supported coalescing delay in msecs
 * @n_patterns: number of supported patterns in a rule
 *	(see nl80211.h for the pattern definition)
 * @pattern_max_len: maximum length of each pattern
 * @pattern_min_len: minimum length of each pattern
 * @max_pkt_offset: maximum Rx packet offset
 */
struct wiphy_coalesce_support {
	int n_rules;
	int max_delay;
	int n_patterns;
	int pattern_max_len;
	int pattern_min_len;
	int max_pkt_offset;
};

5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166
/**
 * enum wiphy_vendor_command_flags - validation flags for vendor commands
 * @WIPHY_VENDOR_CMD_NEED_WDEV: vendor command requires wdev
 * @WIPHY_VENDOR_CMD_NEED_NETDEV: vendor command requires netdev
 * @WIPHY_VENDOR_CMD_NEED_RUNNING: interface/wdev must be up & running
 *	(must be combined with %_WDEV or %_NETDEV)
 */
enum wiphy_vendor_command_flags {
	WIPHY_VENDOR_CMD_NEED_WDEV = BIT(0),
	WIPHY_VENDOR_CMD_NEED_NETDEV = BIT(1),
	WIPHY_VENDOR_CMD_NEED_RUNNING = BIT(2),
};

5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183
/**
 * enum wiphy_opmode_flag - Station's ht/vht operation mode information flags
 *
 * @STA_OPMODE_MAX_BW_CHANGED: Max Bandwidth changed
 * @STA_OPMODE_SMPS_MODE_CHANGED: SMPS mode changed
 * @STA_OPMODE_N_SS_CHANGED: max N_SS (number of spatial streams) changed
 *
 */
enum wiphy_opmode_flag {
	STA_OPMODE_MAX_BW_CHANGED	= BIT(0),
	STA_OPMODE_SMPS_MODE_CHANGED	= BIT(1),
	STA_OPMODE_N_SS_CHANGED		= BIT(2),
};

/**
 * struct sta_opmode_info - Station's ht/vht operation mode information
 * @changed: contains value from &enum wiphy_opmode_flag
5184 5185
 * @smps_mode: New SMPS mode value from &enum nl80211_smps_mode of a station
 * @bw: new max bandwidth value from &enum nl80211_chan_width of a station
5186 5187 5188 5189 5190
 * @rx_nss: new rx_nss value of a station
 */

struct sta_opmode_info {
	u32 changed;
5191 5192
	enum nl80211_smps_mode smps_mode;
	enum nl80211_chan_width bw;
5193 5194 5195
	u8 rx_nss;
};

5196
#define VENDOR_CMD_RAW_DATA ((const struct nla_policy *)(long)(-ENODATA))
5197

5198 5199 5200 5201 5202 5203 5204
/**
 * struct wiphy_vendor_command - vendor command definition
 * @info: vendor command identifying information, as used in nl80211
 * @flags: flags, see &enum wiphy_vendor_command_flags
 * @doit: callback for the operation, note that wdev is %NULL if the
 *	flags didn't ask for a wdev and non-%NULL otherwise; the data
 *	pointer may be %NULL if userspace provided no data at all
5205 5206 5207
 * @dumpit: dump callback, for transferring bigger/multiple items. The
 *	@storage points to cb->args[5], ie. is preserved over the multiple
 *	dumpit calls.
5208 5209 5210 5211
 * @policy: policy pointer for attributes within %NL80211_ATTR_VENDOR_DATA.
 *	Set this to %VENDOR_CMD_RAW_DATA if no policy can be given and the
 *	attribute is just raw data (e.g. a firmware command).
 * @maxattr: highest attribute number in policy
5212 5213 5214
 * It's recommended to not have the same sub command with both @doit and
 * @dumpit, so that userspace can assume certain ones are get and others
 * are used with dump requests.
5215 5216 5217 5218 5219 5220
 */
struct wiphy_vendor_command {
	struct nl80211_vendor_cmd_info info;
	u32 flags;
	int (*doit)(struct wiphy *wiphy, struct wireless_dev *wdev,
		    const void *data, int data_len);
5221 5222 5223
	int (*dumpit)(struct wiphy *wiphy, struct wireless_dev *wdev,
		      struct sk_buff *skb, const void *data, int data_len,
		      unsigned long *storage);
5224 5225
	const struct nla_policy *policy;
	unsigned int maxattr;
5226 5227
};

5228 5229 5230 5231 5232 5233 5234 5235 5236 5237
/**
 * struct wiphy_iftype_ext_capab - extended capabilities per interface type
 * @iftype: interface type
 * @extended_capabilities: extended capabilities supported by the driver,
 *	additional capabilities might be supported by userspace; these are the
 *	802.11 extended capabilities ("Extended Capabilities element") and are
 *	in the same format as in the information element. See IEEE Std
 *	802.11-2012 8.4.2.29 for the defined fields.
 * @extended_capabilities_mask: mask of the valid values
 * @extended_capabilities_len: length of the extended capabilities
5238 5239
 * @eml_capabilities: EML capabilities (for MLO)
 * @mld_capa_and_ops: MLD capabilities and operations (for MLO)
5240 5241 5242 5243 5244 5245
 */
struct wiphy_iftype_ext_capab {
	enum nl80211_iftype iftype;
	const u8 *extended_capabilities;
	const u8 *extended_capabilities_mask;
	u8 extended_capabilities_len;
5246 5247
	u16 eml_capabilities;
	u16 mld_capa_and_ops;
5248 5249
};

5250 5251 5252 5253 5254 5255 5256 5257
/**
 * cfg80211_get_iftype_ext_capa - lookup interface type extended capability
 * @wiphy: the wiphy to look up from
 * @type: the interface type to look up
 */
const struct wiphy_iftype_ext_capab *
cfg80211_get_iftype_ext_capa(struct wiphy *wiphy, enum nl80211_iftype type);

5258 5259 5260 5261 5262
/**
 * struct cfg80211_pmsr_capabilities - cfg80211 peer measurement capabilities
 * @max_peers: maximum number of peers in a single measurement
 * @report_ap_tsf: can report assoc AP's TSF for radio resource measurement
 * @randomize_mac_addr: can randomize MAC address for measurement
5263
 * @ftm: FTM measurement data
5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275
 * @ftm.supported: FTM measurement is supported
 * @ftm.asap: ASAP-mode is supported
 * @ftm.non_asap: non-ASAP-mode is supported
 * @ftm.request_lci: can request LCI data
 * @ftm.request_civicloc: can request civic location data
 * @ftm.preambles: bitmap of preambles supported (&enum nl80211_preamble)
 * @ftm.bandwidths: bitmap of bandwidths supported (&enum nl80211_chan_width)
 * @ftm.max_bursts_exponent: maximum burst exponent supported
 *	(set to -1 if not limited; note that setting this will necessarily
 *	forbid using the value 15 to let the responder pick)
 * @ftm.max_ftms_per_burst: maximum FTMs per burst supported (set to 0 if
 *	not limited)
5276 5277
 * @ftm.trigger_based: trigger based ranging measurement is supported
 * @ftm.non_trigger_based: non trigger based ranging measurement is supported
5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292
 */
struct cfg80211_pmsr_capabilities {
	unsigned int max_peers;
	u8 report_ap_tsf:1,
	   randomize_mac_addr:1;

	struct {
		u32 preambles;
		u32 bandwidths;
		s8 max_bursts_exponent;
		u8 max_ftms_per_burst;
		u8 supported:1,
		   asap:1,
		   non_asap:1,
		   request_lci:1,
5293 5294 5295
		   request_civicloc:1,
		   trigger_based:1,
		   non_trigger_based:1;
5296 5297 5298
	} ftm;
};

5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313
/**
 * struct wiphy_iftype_akm_suites - This structure encapsulates supported akm
 * suites for interface types defined in @iftypes_mask. Each type in the
 * @iftypes_mask must be unique across all instances of iftype_akm_suites.
 *
 * @iftypes_mask: bitmask of interfaces types
 * @akm_suites: points to an array of supported akm suites
 * @n_akm_suites: number of supported AKM suites
 */
struct wiphy_iftype_akm_suites {
	u16 iftypes_mask;
	const u32 *akm_suites;
	int n_akm_suites;
};

5314 5315
#define CFG80211_HW_TIMESTAMP_ALL_PEERS	0xffff

5316 5317
/**
 * struct wiphy - wireless hardware description
5318
 * @mtx: mutex for the data (structures) of this device
5319 5320 5321
 * @reg_notifier: the driver's regulatory notification callback,
 *	note that if your driver uses wiphy_apply_custom_regulatory()
 *	the reg_notifier's request can be passed as NULL
Johannes Berg's avatar
Johannes Berg committed
5322
 * @regd: the driver's regulatory domain, if one was requested via
5323
 *	the regulatory_hint() API. This can be used by the driver
Johannes Berg's avatar
Johannes Berg committed
5324 5325 5326 5327 5328
 *	on the reg_notifier() if it chooses to ignore future
 *	regulatory domain changes caused by other drivers.
 * @signal_type: signal type reported in &struct cfg80211_bss.
 * @cipher_suites: supported cipher suites
 * @n_cipher_suites: number of supported cipher suites
5329 5330 5331
 * @akm_suites: supported AKM suites. These are the default AKMs supported if
 *	the supported AKMs not advertized for a specific interface type in
 *	iftype_akm_suites.
5332
 * @n_akm_suites: number of supported AKM suites
5333 5334 5335 5336 5337 5338
 * @iftype_akm_suites: array of supported akm suites info per interface type.
 *	Note that the bits in @iftypes_mask inside this structure cannot
 *	overlap (i.e. only one occurrence of each type is allowed across all
 *	instances of iftype_akm_suites).
 * @num_iftype_akm_suites: number of interface types for which supported akm
 *	suites are specified separately.
5339 5340 5341 5342 5343
 * @retry_short: Retry limit for short frames (dot11ShortRetryLimit)
 * @retry_long: Retry limit for long frames (dot11LongRetryLimit)
 * @frag_threshold: Fragmentation threshold (dot11FragmentationThreshold);
 *	-1 = fragmentation disabled, only odd values >= 256 used
 * @rts_threshold: RTS threshold (dot11RTSThreshold); -1 = RTS/CTS disabled
Johannes Berg's avatar
Johannes Berg committed
5344
 * @_net: the network namespace this wiphy currently lives in
5345 5346 5347
 * @perm_addr: permanent MAC address of this device
 * @addr_mask: If the device supports multiple MAC addresses by masking,
 *	set this to a mask with variable bits set to 1, e.g. if the last
5348
 *	four bits are variable then set it to 00-00-00-00-00-0f. The actual
5349 5350 5351 5352 5353 5354 5355 5356
 *	variable bits shall be determined by the interfaces added, with
 *	interfaces not matching the mask being rejected to be brought up.
 * @n_addresses: number of addresses in @addresses.
 * @addresses: If the device has more than one address, set this pointer
 *	to a list of addresses (6 bytes each). The first one will be used
 *	by default for perm_addr. In this case, the mask should be set to
 *	all-zeroes. In this case it is assumed that the device can handle
 *	the same number of arbitrary MAC addresses.
5357 5358
 * @registered: protects ->resume and ->suspend sysfs callbacks against
 *	unregister hardware
5359 5360
 * @debugfsdir: debugfs directory used for this wiphy (ieee80211/<wiphyname>).
 *	It will be renamed automatically on wiphy renames
5361 5362 5363
 * @dev: (virtual) struct device for this wiphy. The item in
 *	/sys/class/ieee80211/ points to this. You need use set_wiphy_dev()
 *	(see below).
Johannes Berg's avatar
Johannes Berg committed
5364 5365 5366 5367
 * @wext: wireless extension handlers
 * @priv: driver private data (sized according to wiphy_new() parameter)
 * @interface_modes: bitmask of interfaces types valid for this wiphy,
 *	must be set by driver
5368 5369 5370 5371 5372
 * @iface_combinations: Valid interface combinations array, should not
 *	list single interface types.
 * @n_iface_combinations: number of entries in @iface_combinations array.
 * @software_iftypes: bitmask of software interface types, these are not
 *	subject to any restrictions since they are purely managed in SW.
Johannes Berg's avatar
Johannes Berg committed
5373
 * @flags: wiphy flags, see &enum wiphy_flags
5374 5375
 * @regulatory_flags: wiphy regulatory flags, see
 *	&enum ieee80211_regulatory_flags
5376
 * @features: features advertised to nl80211, see &enum nl80211_feature_flags.
5377 5378
 * @ext_features: extended features advertised to nl80211, see
 *	&enum nl80211_ext_feature_index.
Johannes Berg's avatar
Johannes Berg committed
5379 5380 5381 5382
 * @bss_priv_size: each BSS struct has private data allocated with it,
 *	this variable determines its size
 * @max_scan_ssids: maximum number of SSIDs the device can scan for in
 *	any given scan
5383 5384
 * @max_sched_scan_reqs: maximum number of scheduled scan requests that
 *	the device can run concurrently.
5385 5386
 * @max_sched_scan_ssids: maximum number of SSIDs the device can scan
 *	for in any given scheduled scan
5387 5388 5389
 * @max_match_sets: maximum number of match sets the device can handle
 *	when performing a scheduled scan, 0 if filtering is not
 *	supported.
Johannes Berg's avatar
Johannes Berg committed
5390 5391 5392
 * @max_scan_ie_len: maximum length of user-controlled IEs device can
 *	add to probe request frames transmitted during a scan, must not
 *	include fixed IEs like supported rates
5393 5394
 * @max_sched_scan_ie_len: same as max_scan_ie_len, but for scheduled
 *	scans
5395 5396 5397 5398 5399 5400
 * @max_sched_scan_plans: maximum number of scan plans (scan interval and number
 *	of iterations) for scheduled scan supported by the device.
 * @max_sched_scan_plan_interval: maximum interval (in seconds) for a
 *	single scan plan supported by the device.
 * @max_sched_scan_plan_iterations: maximum number of iterations for a single
 *	scan plan supported by the device.
Johannes Berg's avatar
Johannes Berg committed
5401 5402 5403 5404 5405 5406 5407
 * @coverage_class: current coverage class
 * @fw_version: firmware version for ethtool reporting
 * @hw_version: hardware version for ethtool reporting
 * @max_num_pmkids: maximum number of PMKIDs supported by device
 * @privid: a pointer that drivers can use to identify if an arbitrary
 *	wiphy is theirs, e.g. in global notifiers
 * @bands: information about bands/channels supported by this device
5408 5409 5410 5411
 *
 * @mgmt_stypes: bitmasks of frame subtypes that can be subscribed to or
 *	transmitted through nl80211, points to an array indexed by interface
 *	type
5412
 *
5413 5414 5415 5416 5417 5418 5419
 * @available_antennas_tx: bitmap of antennas which are available to be
 *	configured as TX antennas. Antenna configuration commands will be
 *	rejected unless this or @available_antennas_rx is set.
 *
 * @available_antennas_rx: bitmap of antennas which are available to be
 *	configured as RX antennas. Antenna configuration commands will be
 *	rejected unless this or @available_antennas_tx is set.
5420
 *
5421 5422 5423 5424 5425
 * @probe_resp_offload:
 *	 Bitmap of supported protocols for probe response offloading.
 *	 See &enum nl80211_probe_resp_offload_support_attr. Only valid
 *	 when the wiphy flag @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD is set.
 *
5426 5427
 * @max_remain_on_channel_duration: Maximum time a remain-on-channel operation
 *	may request, if implemented.
5428 5429
 *
 * @wowlan: WoWLAN support information
5430 5431 5432
 * @wowlan_config: current WoWLAN configuration; this should usually not be
 *	used since access to it is necessarily racy, use the parameter passed
 *	to the suspend() operation instead.
5433 5434
 *
 * @ap_sme_capa: AP SME capabilities, flags from &enum nl80211_ap_sme_features.
5435 5436
 * @ht_capa_mod_mask:  Specify what ht_cap values can be over-ridden.
 *	If null, then none can be over-ridden.
5437 5438
 * @vht_capa_mod_mask:  Specify what VHT capabilities can be over-ridden.
 *	If null, then none can be over-ridden.
5439
 *
5440 5441 5442
 * @wdev_list: the list of associated (virtual) interfaces; this list must
 *	not be modified by the driver, but can be read with RTNL/RCU protection.
 *
5443 5444
 * @max_acl_mac_addrs: Maximum number of MAC addresses that the device
 *	supports for ACL.
5445 5446 5447 5448 5449
 *
 * @extended_capabilities: extended capabilities supported by the driver,
 *	additional capabilities might be supported by userspace; these are
 *	the 802.11 extended capabilities ("Extended Capabilities element")
 *	and are in the same format as in the information element. See
5450 5451 5452
 *	802.11-2012 8.4.2.29 for the defined fields. These are the default
 *	extended capabilities to be used if the capabilities are not specified
 *	for a specific interface type in iftype_ext_capab.
5453 5454
 * @extended_capabilities_mask: mask of the valid values
 * @extended_capabilities_len: length of the extended capabilities
5455 5456 5457
 * @iftype_ext_capab: array of extended capabilities per interface type
 * @num_iftype_ext_capab: number of interface types for which extended
 *	capabilities are specified separately.
5458
 * @coalesce: packet coalescing support information
5459 5460 5461
 *
 * @vendor_commands: array of vendor commands supported by the hardware
 * @n_vendor_commands: number of vendor commands
5462 5463
 * @vendor_events: array of vendor events supported by the hardware
 * @n_vendor_events: number of vendor events
5464 5465 5466 5467 5468
 *
 * @max_ap_assoc_sta: maximum number of associated stations supported in AP mode
 *	(including P2P GO) or 0 to indicate no such limit is advertised. The
 *	driver is allowed to advertise a theoretical limit that it can reach in
 *	some cases, but may not always reach.
5469 5470 5471 5472 5473
 *
 * @max_num_csa_counters: Number of supported csa_counters in beacons
 *	and probe responses.  This value should be set if the driver
 *	wishes to limit the number of csa counters. Default (0) means
 *	infinite.
5474 5475 5476
 * @bss_select_support: bitmask indicating the BSS selection criteria supported
 *	by the driver in the .connect() callback. The bit position maps to the
 *	attribute indices defined in &enum nl80211_bss_select_attr.
5477
 *
5478 5479 5480 5481
 * @nan_supported_bands: bands supported by the device in NAN mode, a
 *	bitmap of &enum nl80211_band values.  For instance, for
 *	NL80211_BAND_2GHZ, bit 0 would be set
 *	(i.e. BIT(NL80211_BAND_2GHZ)).
5482 5483 5484 5485
 *
 * @txq_limit: configuration of internal TX queue frame limit
 * @txq_memory_limit: configuration internal TX queue memory limit
 * @txq_quantum: configuration of internal TX queue scheduler quantum
5486
 *
5487 5488 5489
 * @tx_queue_len: allow setting transmit queue len for drivers not using
 *	wake_tx_queue
 *
5490 5491 5492 5493 5494
 * @support_mbssid: can HW support association with nontransmitted AP
 * @support_only_he_mbssid: don't parse MBSSID elements if it is not
 *	HE AP, in order to avoid compatibility issues.
 *	@support_mbssid must be set for this to have any effect.
 *
5495
 * @pmsr_capa: peer measurement capabilities
5496 5497 5498 5499 5500 5501 5502
 *
 * @tid_config_support: describes the per-TID config support that the
 *	device has
 * @tid_config_support.vif: bitmap of attributes (configurations)
 *	supported by the driver for each vif
 * @tid_config_support.peer: bitmap of attributes (configurations)
 *	supported by the driver for each peer
5503 5504
 * @tid_config_support.max_retry: maximum supported retry count for
 *	long/short retry configuration
5505 5506 5507 5508
 *
 * @max_data_retry_count: maximum supported per TID retry count for
 *	configuration through the %NL80211_TID_CONFIG_ATTR_RETRY_SHORT and
 *	%NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes
5509
 * @sar_capa: SAR control capabilities
5510
 * @rfkill: a pointer to the rfkill structure
5511 5512 5513 5514
 *
 * @mbssid_max_interfaces: maximum number of interfaces supported by the driver
 *	in a multiple BSSID set. This field must be set to a non-zero value
 *	by the driver to advertise MBSSID support.
5515
 * @ema_max_profile_periodicity: maximum profile periodicity supported by
5516 5517
 *	the driver. Setting this field to a non-zero value indicates that the
 *	driver supports enhanced multi-BSSID advertisements (EMA AP).
5518 5519 5520 5521 5522 5523 5524
 * @max_num_akm_suites: maximum number of AKM suites allowed for
 *	configuration through %NL80211_CMD_CONNECT, %NL80211_CMD_ASSOCIATE and
 *	%NL80211_CMD_START_AP. Set to NL80211_MAX_NR_AKM_SUITES if not set by
 *	driver. If set by driver minimum allowed value is
 *	NL80211_MAX_NR_AKM_SUITES in order to avoid compatibility issues with
 *	legacy userspace and maximum allowed value is
 *	CFG80211_MAX_NUM_AKM_SUITES.
5525 5526 5527 5528 5529 5530 5531
 *
 * @hw_timestamp_max_peers: maximum number of peers that the driver supports
 *	enabling HW timestamping for concurrently. Setting this field to a
 *	non-zero value indicates that the driver supports HW timestamping.
 *	A value of %CFG80211_HW_TIMESTAMP_ALL_PEERS indicates the driver
 *	supports enabling HW timestamping for all peers (i.e. no need to
 *	specify a mac address).
Johannes Berg's avatar
Johannes Berg committed
5532 5533
 */
struct wiphy {
5534 5535
	struct mutex mtx;

Johannes Berg's avatar
Johannes Berg committed
5536 5537 5538
	/* assign these fields before you register the wiphy */

	u8 perm_addr[ETH_ALEN];
5539 5540 5541
	u8 addr_mask[ETH_ALEN];

	struct mac_address *addresses;
Johannes Berg's avatar
Johannes Berg committed
5542

5543 5544
	const struct ieee80211_txrx_stypes *mgmt_stypes;

5545 5546 5547 5548
	const struct ieee80211_iface_combination *iface_combinations;
	int n_iface_combinations;
	u16 software_iftypes;

5549 5550
	u16 n_addresses;

Johannes Berg's avatar
Johannes Berg committed
5551 5552 5553
	/* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */
	u16 interface_modes;

5554 5555
	u16 max_acl_mac_addrs;

5556
	u32 flags, regulatory_flags, features;
5557
	u8 ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES, 8)];
5558

5559 5560
	u32 ap_sme_capa;

Johannes Berg's avatar
Johannes Berg committed
5561 5562 5563 5564
	enum cfg80211_signal_type signal_type;

	int bss_priv_size;
	u8 max_scan_ssids;
5565
	u8 max_sched_scan_reqs;
5566
	u8 max_sched_scan_ssids;
5567
	u8 max_match_sets;
Johannes Berg's avatar
Johannes Berg committed
5568
	u16 max_scan_ie_len;
5569
	u16 max_sched_scan_ie_len;
5570 5571 5572
	u32 max_sched_scan_plans;
	u32 max_sched_scan_plan_interval;
	u32 max_sched_scan_plan_iterations;
Johannes Berg's avatar
Johannes Berg committed
5573 5574 5575 5576

	int n_cipher_suites;
	const u32 *cipher_suites;

5577 5578 5579
	int n_akm_suites;
	const u32 *akm_suites;

5580 5581 5582
	const struct wiphy_iftype_akm_suites *iftype_akm_suites;
	unsigned int num_iftype_akm_suites;

5583 5584 5585 5586
	u8 retry_short;
	u8 retry_long;
	u32 frag_threshold;
	u32 rts_threshold;
5587
	u8 coverage_class;
5588

5589
	char fw_version[ETHTOOL_FWVERS_LEN];
5590 5591
	u32 hw_version;

5592
#ifdef CONFIG_PM
5593
	const struct wiphy_wowlan_support *wowlan;
5594
	struct cfg80211_wowlan *wowlan_config;
5595
#endif
5596

5597 5598
	u16 max_remain_on_channel_duration;

5599 5600
	u8 max_num_pmkids;

5601 5602
	u32 available_antennas_tx;
	u32 available_antennas_rx;
5603

5604 5605
	u32 probe_resp_offload;

5606 5607 5608
	const u8 *extended_capabilities, *extended_capabilities_mask;
	u8 extended_capabilities_len;

5609 5610 5611
	const struct wiphy_iftype_ext_capab *iftype_ext_capab;
	unsigned int num_iftype_ext_capab;

5612
	const void *privid;
Johannes Berg's avatar
Johannes Berg committed
5613

5614
	struct ieee80211_supported_band *bands[NUM_NL80211_BANDS];
Johannes Berg's avatar
Johannes Berg committed
5615

5616 5617
	void (*reg_notifier)(struct wiphy *wiphy,
			     struct regulatory_request *request);
Johannes Berg's avatar
Johannes Berg committed
5618 5619 5620

	/* fields below are read-only, assigned by cfg80211 */

5621
	const struct ieee80211_regdomain __rcu *regd;
Johannes Berg's avatar
Johannes Berg committed
5622 5623 5624

	struct device dev;

5625 5626
	bool registered;

Johannes Berg's avatar
Johannes Berg committed
5627 5628
	struct dentry *debugfsdir;

5629
	const struct ieee80211_ht_cap *ht_capa_mod_mask;
5630
	const struct ieee80211_vht_cap *vht_capa_mod_mask;
5631

5632 5633
	struct list_head wdev_list;

5634
	possible_net_t _net;
5635

Johannes Berg's avatar
Johannes Berg committed
5636 5637 5638 5639
#ifdef CONFIG_CFG80211_WEXT
	const struct iw_handler_def *wext;
#endif

5640 5641
	const struct wiphy_coalesce_support *coalesce;

5642
	const struct wiphy_vendor_command *vendor_commands;
5643 5644
	const struct nl80211_vendor_cmd_info *vendor_events;
	int n_vendor_commands, n_vendor_events;
5645

5646 5647
	u16 max_ap_assoc_sta;

5648 5649
	u8 max_num_csa_counters;

5650 5651
	u32 bss_select_support;

5652 5653
	u8 nan_supported_bands;

5654 5655 5656 5657
	u32 txq_limit;
	u32 txq_memory_limit;
	u32 txq_quantum;

5658 5659
	unsigned long tx_queue_len;

5660 5661 5662
	u8 support_mbssid:1,
	   support_only_he_mbssid:1;

5663 5664
	const struct cfg80211_pmsr_capabilities *pmsr_capa;

5665 5666
	struct {
		u64 peer, vif;
5667
		u8 max_retry;
5668 5669
	} tid_config_support;

5670 5671
	u8 max_data_retry_count;

5672 5673
	const struct cfg80211_sar_capa *sar_capa;

5674 5675
	struct rfkill *rfkill;

5676 5677
	u8 mbssid_max_interfaces;
	u8 ema_max_profile_periodicity;
5678
	u16 max_num_akm_suites;
5679

5680 5681
	u16 hw_timestamp_max_peers;

5682
	char priv[] __aligned(NETDEV_ALIGN);
Johannes Berg's avatar
Johannes Berg committed
5683 5684
};

5685 5686
static inline struct net *wiphy_net(struct wiphy *wiphy)
{
Eric Dumazet's avatar
Eric Dumazet committed
5687
	return read_pnet(&wiphy->_net);
5688 5689 5690 5691
}

static inline void wiphy_net_set(struct wiphy *wiphy, struct net *net)
{
Eric Dumazet's avatar
Eric Dumazet committed
5692
	write_pnet(&wiphy->_net, net);
5693 5694
}

Johannes Berg's avatar
Johannes Berg committed
5695 5696 5697 5698
/**
 * wiphy_priv - return priv from wiphy
 *
 * @wiphy: the wiphy whose priv pointer to return
5699
 * Return: The priv of @wiphy.
Johannes Berg's avatar
Johannes Berg committed
5700 5701 5702 5703 5704 5705 5706
 */
static inline void *wiphy_priv(struct wiphy *wiphy)
{
	BUG_ON(!wiphy);
	return &wiphy->priv;
}

5707 5708 5709 5710
/**
 * priv_to_wiphy - return the wiphy containing the priv
 *
 * @priv: a pointer previously returned by wiphy_priv
5711
 * Return: The wiphy of @priv.
5712 5713 5714 5715 5716 5717 5718
 */
static inline struct wiphy *priv_to_wiphy(void *priv)
{
	BUG_ON(!priv);
	return container_of(priv, struct wiphy, priv);
}

Johannes Berg's avatar
Johannes Berg committed
5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733
/**
 * set_wiphy_dev - set device pointer for wiphy
 *
 * @wiphy: The wiphy whose device to bind
 * @dev: The device to parent it to
 */
static inline void set_wiphy_dev(struct wiphy *wiphy, struct device *dev)
{
	wiphy->dev.parent = dev;
}

/**
 * wiphy_dev - get wiphy dev pointer
 *
 * @wiphy: The wiphy whose device struct to look up
5734
 * Return: The dev of @wiphy.
Johannes Berg's avatar
Johannes Berg committed
5735 5736 5737 5738 5739 5740 5741 5742 5743 5744
 */
static inline struct device *wiphy_dev(struct wiphy *wiphy)
{
	return wiphy->dev.parent;
}

/**
 * wiphy_name - get wiphy name
 *
 * @wiphy: The wiphy whose name to return
5745
 * Return: The name of @wiphy.
Johannes Berg's avatar
Johannes Berg committed
5746
 */
5747
static inline const char *wiphy_name(const struct wiphy *wiphy)
Johannes Berg's avatar
Johannes Berg committed
5748 5749 5750 5751
{
	return dev_name(&wiphy->dev);
}

5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768
/**
 * wiphy_new_nm - create a new wiphy for use with cfg80211
 *
 * @ops: The configuration operations for this device
 * @sizeof_priv: The size of the private area to allocate
 * @requested_name: Request a particular name.
 *	NULL is valid value, and means use the default phy%d naming.
 *
 * Create a new wiphy and associate the given operations with it.
 * @sizeof_priv bytes are allocated for private use.
 *
 * Return: A pointer to the new wiphy. This pointer must be
 * assigned to each netdev's ieee80211_ptr for proper operation.
 */
struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
			   const char *requested_name);

Johannes Berg's avatar
Johannes Berg committed
5769 5770 5771 5772 5773 5774 5775 5776 5777
/**
 * wiphy_new - create a new wiphy for use with cfg80211
 *
 * @ops: The configuration operations for this device
 * @sizeof_priv: The size of the private area to allocate
 *
 * Create a new wiphy and associate the given operations with it.
 * @sizeof_priv bytes are allocated for private use.
 *
5778 5779
 * Return: A pointer to the new wiphy. This pointer must be
 * assigned to each netdev's ieee80211_ptr for proper operation.
Johannes Berg's avatar
Johannes Berg committed
5780
 */
5781 5782 5783 5784 5785
static inline struct wiphy *wiphy_new(const struct cfg80211_ops *ops,
				      int sizeof_priv)
{
	return wiphy_new_nm(ops, sizeof_priv, NULL);
}
Johannes Berg's avatar
Johannes Berg committed
5786 5787 5788 5789 5790 5791

/**
 * wiphy_register - register a wiphy with cfg80211
 *
 * @wiphy: The wiphy to register.
 *
5792
 * Return: A non-negative wiphy index or a negative error code.
Johannes Berg's avatar
Johannes Berg committed
5793
 */
5794
int wiphy_register(struct wiphy *wiphy);
Johannes Berg's avatar
Johannes Berg committed
5795

5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826
/* this is a define for better error reporting (file/line) */
#define lockdep_assert_wiphy(wiphy) lockdep_assert_held(&(wiphy)->mtx)

/**
 * rcu_dereference_wiphy - rcu_dereference with debug checking
 * @wiphy: the wiphy to check the locking on
 * @p: The pointer to read, prior to dereferencing
 *
 * Do an rcu_dereference(p), but check caller either holds rcu_read_lock()
 * or RTNL. Note: Please prefer wiphy_dereference() or rcu_dereference().
 */
#define rcu_dereference_wiphy(wiphy, p)				\
        rcu_dereference_check(p, lockdep_is_held(&wiphy->mtx))

/**
 * wiphy_dereference - fetch RCU pointer when updates are prevented by wiphy mtx
 * @wiphy: the wiphy to check the locking on
 * @p: The pointer to read, prior to dereferencing
 *
 * Return the value of the specified RCU-protected pointer, but omit the
 * READ_ONCE(), because caller holds the wiphy mutex used for updates.
 */
#define wiphy_dereference(wiphy, p)				\
        rcu_dereference_protected(p, lockdep_is_held(&wiphy->mtx))

/**
 * get_wiphy_regdom - get custom regdomain for the given wiphy
 * @wiphy: the wiphy to get the regdomain from
 */
const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy);

Johannes Berg's avatar
Johannes Berg committed
5827 5828 5829 5830 5831 5832 5833 5834 5835
/**
 * wiphy_unregister - deregister a wiphy from cfg80211
 *
 * @wiphy: The wiphy to unregister.
 *
 * After this call, no more requests can be made with this priv
 * pointer, but the call may sleep to wait for an outstanding
 * request that is being handled.
 */
5836
void wiphy_unregister(struct wiphy *wiphy);
Johannes Berg's avatar
Johannes Berg committed
5837 5838 5839 5840 5841 5842

/**
 * wiphy_free - free wiphy
 *
 * @wiphy: The wiphy to free
 */
5843
void wiphy_free(struct wiphy *wiphy);
Johannes Berg's avatar
Johannes Berg committed
5844

5845
/* internal structs */
5846
struct cfg80211_conn;
5847
struct cfg80211_internal_bss;
5848
struct cfg80211_cached_keys;
5849
struct cfg80211_cqm_config;
5850

5851 5852 5853 5854
/**
 * wiphy_lock - lock the wiphy
 * @wiphy: the wiphy to lock
 *
5855 5856 5857 5858 5859 5860
 * This is needed around registering and unregistering netdevs that
 * aren't created through cfg80211 calls, since that requires locking
 * in cfg80211 when the notifiers is called, but that cannot
 * differentiate which way it's called.
 *
 * It can also be used by drivers for their own purposes.
5861 5862
 *
 * When cfg80211 ops are called, the wiphy is already locked.
5863 5864 5865
 *
 * Note that this makes sure that no workers that have been queued
 * with wiphy_queue_work() are running.
5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884
 */
static inline void wiphy_lock(struct wiphy *wiphy)
	__acquires(&wiphy->mtx)
{
	mutex_lock(&wiphy->mtx);
	__acquire(&wiphy->mtx);
}

/**
 * wiphy_unlock - unlock the wiphy again
 * @wiphy: the wiphy to unlock
 */
static inline void wiphy_unlock(struct wiphy *wiphy)
	__releases(&wiphy->mtx)
{
	__release(&wiphy->mtx);
	mutex_unlock(&wiphy->mtx);
}

5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923
struct wiphy_work;
typedef void (*wiphy_work_func_t)(struct wiphy *, struct wiphy_work *);

struct wiphy_work {
	struct list_head entry;
	wiphy_work_func_t func;
};

static inline void wiphy_work_init(struct wiphy_work *work,
				   wiphy_work_func_t func)
{
	INIT_LIST_HEAD(&work->entry);
	work->func = func;
}

/**
 * wiphy_work_queue - queue work for the wiphy
 * @wiphy: the wiphy to queue for
 * @work: the work item
 *
 * This is useful for work that must be done asynchronously, and work
 * queued here has the special property that the wiphy mutex will be
 * held as if wiphy_lock() was called, and that it cannot be running
 * after wiphy_lock() was called. Therefore, wiphy_cancel_work() can
 * use just cancel_work() instead of cancel_work_sync(), it requires
 * being in a section protected by wiphy_lock().
 */
void wiphy_work_queue(struct wiphy *wiphy, struct wiphy_work *work);

/**
 * wiphy_work_cancel - cancel previously queued work
 * @wiphy: the wiphy, for debug purposes
 * @work: the work to cancel
 *
 * Cancel the work *without* waiting for it, this assumes being
 * called under the wiphy mutex acquired by wiphy_lock().
 */
void wiphy_work_cancel(struct wiphy *wiphy, struct wiphy_work *work);

5924 5925 5926 5927 5928 5929 5930 5931 5932 5933
/**
 * wiphy_work_flush - flush previously queued work
 * @wiphy: the wiphy, for debug purposes
 * @work: the work to flush, this can be %NULL to flush all work
 *
 * Flush the work (i.e. run it if pending). This must be called
 * under the wiphy mutex acquired by wiphy_lock().
 */
void wiphy_work_flush(struct wiphy *wiphy, struct wiphy_work *work);

5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976
struct wiphy_delayed_work {
	struct wiphy_work work;
	struct wiphy *wiphy;
	struct timer_list timer;
};

void wiphy_delayed_work_timer(struct timer_list *t);

static inline void wiphy_delayed_work_init(struct wiphy_delayed_work *dwork,
					   wiphy_work_func_t func)
{
	timer_setup(&dwork->timer, wiphy_delayed_work_timer, 0);
	wiphy_work_init(&dwork->work, func);
}

/**
 * wiphy_delayed_work_queue - queue delayed work for the wiphy
 * @wiphy: the wiphy to queue for
 * @dwork: the delayable worker
 * @delay: number of jiffies to wait before queueing
 *
 * This is useful for work that must be done asynchronously, and work
 * queued here has the special property that the wiphy mutex will be
 * held as if wiphy_lock() was called, and that it cannot be running
 * after wiphy_lock() was called. Therefore, wiphy_cancel_work() can
 * use just cancel_work() instead of cancel_work_sync(), it requires
 * being in a section protected by wiphy_lock().
 */
void wiphy_delayed_work_queue(struct wiphy *wiphy,
			      struct wiphy_delayed_work *dwork,
			      unsigned long delay);

/**
 * wiphy_delayed_work_cancel - cancel previously queued delayed work
 * @wiphy: the wiphy, for debug purposes
 * @dwork: the delayed work to cancel
 *
 * Cancel the work *without* waiting for it, this assumes being
 * called under the wiphy mutex acquired by wiphy_lock().
 */
void wiphy_delayed_work_cancel(struct wiphy *wiphy,
			       struct wiphy_delayed_work *dwork);

5977
/**
5978
 * wiphy_delayed_work_flush - flush previously queued delayed work
5979
 * @wiphy: the wiphy, for debug purposes
5980
 * @dwork: the delayed work to flush
5981 5982 5983 5984 5985 5986 5987
 *
 * Flush the work (i.e. run it if pending). This must be called
 * under the wiphy mutex acquired by wiphy_lock().
 */
void wiphy_delayed_work_flush(struct wiphy *wiphy,
			      struct wiphy_delayed_work *dwork);

Johannes Berg's avatar
Johannes Berg committed
5988
/**
5989
 * struct wireless_dev - wireless device state
Johannes Berg's avatar
Johannes Berg committed
5990
 *
5991 5992 5993 5994
 * For netdevs, this structure must be allocated by the driver
 * that uses the ieee80211_ptr field in struct net_device (this
 * is intentional so it can be allocated along with the netdev.)
 * It need not be registered then as netdev registration will
5995 5996 5997 5998
 * be intercepted by cfg80211 to see the new wireless device,
 * however, drivers must lock the wiphy before registering or
 * unregistering netdevs if they pre-create any netdevs (in ops
 * called from cfg80211, the wiphy is already locked.)
5999 6000 6001 6002 6003
 *
 * For non-netdev uses, it must also be allocated by the driver
 * in response to the cfg80211 callbacks that require it, as
 * there's no netdev registration in that case it may not be
 * allocated outside of callback operations that return it.
Johannes Berg's avatar
Johannes Berg committed
6004 6005 6006
 *
 * @wiphy: pointer to hardware description
 * @iftype: interface type
6007
 * @registered: is this wdev already registered with cfg80211
6008 6009
 * @registering: indicates we're doing registration under wiphy lock
 *	for the notifier
Johannes Berg's avatar
Johannes Berg committed
6010
 * @list: (private) Used to collect the interfaces
6011 6012 6013
 * @netdev: (private) Used to reference back to the netdev, may be %NULL
 * @identifier: (private) Identifier used in nl80211 to identify this
 *	wireless device if it has no netdev
6014
 * @u: union containing data specific to @iftype
6015
 * @connected: indicates if connected or not (STA mode)
Johannes Berg's avatar
Johannes Berg committed
6016 6017
 * @bssid: (private) Used by the internal configuration code
 * @wext: (private) Used by the internal wireless extensions compat code
6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028
 * @wext.ibss: (private) IBSS data part of wext handling
 * @wext.connect: (private) connection handling data
 * @wext.keys: (private) (WEP) key data
 * @wext.ie: (private) extra elements for association
 * @wext.ie_len: (private) length of extra elements
 * @wext.bssid: (private) selected network BSSID
 * @wext.ssid: (private) selected network SSID
 * @wext.default_key: (private) selected default key index
 * @wext.default_mgmt_key: (private) selected default management key index
 * @wext.prev_bssid: (private) previous BSSID for reassociation
 * @wext.prev_bssid_valid: (private) previous BSSID validity
6029 6030 6031 6032
 * @use_4addr: indicates 4addr mode is used on this interface, must be
 *	set by driver (if supported) on add_interface BEFORE registering the
 *	netdev and may otherwise be used by driver read-only, will be update
 *	by cfg80211 on change_interface
6033
 * @mgmt_registrations: list of registrations for management frames
6034 6035
 * @mgmt_registrations_need_update: mgmt registrations were updated,
 *	need to propagate the update to the driver
6036 6037
 * @beacon_interval: beacon interval used on this device for transmitting
 *	beacons, 0 when not valid
6038
 * @address: The address for this device, valid only if @netdev is %NULL
6039 6040
 * @is_running: true if this is a non-netdev device that has been started, e.g.
 *	the P2P Device.
6041 6042
 * @cac_started: true if DFS channel availability check has been started
 * @cac_start_time: timestamp (jiffies) when the dfs state was entered.
6043
 * @cac_time_ms: CAC time in ms
Johannes Berg's avatar
Johannes Berg committed
6044 6045 6046 6047 6048 6049
 * @ps: powersave mode is enabled
 * @ps_timeout: dynamic powersave timeout
 * @ap_unexpected_nlportid: (private) netlink port ID of application
 *	registered for unexpected class 3 frames (AP mode)
 * @conn: (private) cfg80211 software SME connection state machine data
 * @connect_keys: (private) keys to set after connection is established
6050
 * @conn_bss_type: connecting/connected BSS type
6051 6052 6053
 * @conn_owner_nlportid: (private) connection owner socket port ID
 * @disconnect_wk: (private) auto-disconnect work
 * @disconnect_bssid: (private) the BSSID to use for auto-disconnect
Johannes Berg's avatar
Johannes Berg committed
6054 6055
 * @event_list: (private) list for internal event processing
 * @event_lock: (private) lock for event list
6056
 * @owner_nlportid: (private) owner socket port ID
6057
 * @nl_owner_dead: (private) owner socket went away
6058
 * @cqm_rssi_work: (private) CQM RSSI reporting work
6059
 * @cqm_config: (private) nl80211 RSSI monitor state
6060 6061 6062
 * @pmsr_list: (private) peer measurement requests
 * @pmsr_lock: (private) peer measurements requests/results lock
 * @pmsr_free_wk: (private) peer measurements cleanup work
6063 6064
 * @unprot_beacon_reported: (private) timestamp of last
 *	unprotected beacon report
6065 6066 6067
 * @links: array of %IEEE80211_MLD_MAX_NUM_LINKS elements containing @addr
 *	@ap and @client for each link
 * @valid_links: bitmap describing what elements of @links are valid
Johannes Berg's avatar
Johannes Berg committed
6068 6069 6070 6071 6072
 */
struct wireless_dev {
	struct wiphy *wiphy;
	enum nl80211_iftype iftype;

Johannes Berg's avatar
Johannes Berg committed
6073
	/* the remainder of this struct should be private to cfg80211 */
Johannes Berg's avatar
Johannes Berg committed
6074 6075 6076
	struct list_head list;
	struct net_device *netdev;

6077 6078
	u32 identifier;

6079
	struct list_head mgmt_registrations;
6080
	u8 mgmt_registrations_need_update:1;
6081

6082
	bool use_4addr, is_running, registered, registering;
6083 6084

	u8 address[ETH_ALEN] __aligned(sizeof(u16));
6085

6086
	/* currently used for IBSS and SME - might be rearranged later */
6087
	struct cfg80211_conn *conn;
6088
	struct cfg80211_cached_keys *connect_keys;
6089
	enum ieee80211_bss_type conn_bss_type;
6090 6091 6092 6093
	u32 conn_owner_nlportid;

	struct work_struct disconnect_wk;
	u8 disconnect_bssid[ETH_ALEN];
Johannes Berg's avatar
Johannes Berg committed
6094

Johannes Berg's avatar
Johannes Berg committed
6095 6096 6097
	struct list_head event_list;
	spinlock_t event_lock;

6098
	u8 connected:1;
6099

6100 6101 6102
	bool ps;
	int ps_timeout;

6103
	u32 ap_unexpected_nlportid;
6104

6105 6106 6107
	u32 owner_nlportid;
	bool nl_owner_dead;

6108
	/* FIXME: need to rework radar detection for MLO */
6109 6110
	bool cac_started;
	unsigned long cac_start_time;
6111
	unsigned int cac_time_ms;
6112

Johannes Berg's avatar
Johannes Berg committed
6113
#ifdef CONFIG_CFG80211_WEXT
Johannes Berg's avatar
Johannes Berg committed
6114
	/* wext data */
6115
	struct {
6116 6117
		struct cfg80211_ibss_params ibss;
		struct cfg80211_connect_params connect;
6118
		struct cfg80211_cached_keys *keys;
6119
		const u8 *ie;
6120
		size_t ie_len;
6121 6122
		u8 bssid[ETH_ALEN];
		u8 prev_bssid[ETH_ALEN];
6123
		u8 ssid[IEEE80211_MAX_SSID_LEN];
6124
		s8 default_key, default_mgmt_key;
6125
		bool prev_bssid_valid;
6126
	} wext;
Johannes Berg's avatar
Johannes Berg committed
6127
#endif
6128

6129 6130
	struct wiphy_work cqm_rssi_work;
	struct cfg80211_cqm_config __rcu *cqm_config;
6131 6132 6133 6134

	struct list_head pmsr_list;
	spinlock_t pmsr_lock;
	struct work_struct pmsr_free_wk;
6135 6136

	unsigned long unprot_beacon_reported;
6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180

	union {
		struct {
			u8 connected_addr[ETH_ALEN] __aligned(2);
			u8 ssid[IEEE80211_MAX_SSID_LEN];
			u8 ssid_len;
		} client;
		struct {
			int beacon_interval;
			struct cfg80211_chan_def preset_chandef;
			struct cfg80211_chan_def chandef;
			u8 id[IEEE80211_MAX_SSID_LEN];
			u8 id_len, id_up_len;
		} mesh;
		struct {
			struct cfg80211_chan_def preset_chandef;
			u8 ssid[IEEE80211_MAX_SSID_LEN];
			u8 ssid_len;
		} ap;
		struct {
			struct cfg80211_internal_bss *current_bss;
			struct cfg80211_chan_def chandef;
			int beacon_interval;
			u8 ssid[IEEE80211_MAX_SSID_LEN];
			u8 ssid_len;
		} ibss;
		struct {
			struct cfg80211_chan_def chandef;
		} ocb;
	} u;

	struct {
		u8 addr[ETH_ALEN] __aligned(2);
		union {
			struct {
				unsigned int beacon_interval;
				struct cfg80211_chan_def chandef;
			} ap;
			struct {
				struct cfg80211_internal_bss *current_bss;
			} client;
		};
	} links[IEEE80211_MLD_MAX_NUM_LINKS];
	u16 valid_links;
Johannes Berg's avatar
Johannes Berg committed
6181 6182
};

6183
static inline const u8 *wdev_address(struct wireless_dev *wdev)
6184 6185 6186 6187 6188 6189
{
	if (wdev->netdev)
		return wdev->netdev->dev_addr;
	return wdev->address;
}

6190 6191 6192 6193 6194 6195 6196
static inline bool wdev_running(struct wireless_dev *wdev)
{
	if (wdev->netdev)
		return netif_running(wdev->netdev);
	return wdev->is_running;
}

Johannes Berg's avatar
Johannes Berg committed
6197 6198 6199 6200
/**
 * wdev_priv - return wiphy priv from wireless_dev
 *
 * @wdev: The wireless device whose wiphy's priv pointer to return
6201
 * Return: The wiphy priv of @wdev.
Johannes Berg's avatar
Johannes Berg committed
6202 6203 6204 6205 6206 6207 6208
 */
static inline void *wdev_priv(struct wireless_dev *wdev)
{
	BUG_ON(!wdev);
	return wiphy_priv(wdev->wiphy);
}

6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226
/**
 * wdev_chandef - return chandef pointer from wireless_dev
 * @wdev: the wdev
 * @link_id: the link ID for MLO
 *
 * Return: The chandef depending on the mode, or %NULL.
 */
struct cfg80211_chan_def *wdev_chandef(struct wireless_dev *wdev,
				       unsigned int link_id);

static inline void WARN_INVALID_LINK_ID(struct wireless_dev *wdev,
					unsigned int link_id)
{
	WARN_ON(link_id && !wdev->valid_links);
	WARN_ON(wdev->valid_links &&
		!(wdev->valid_links & BIT(link_id)));
}

6227 6228 6229 6230 6231 6232 6233
#define for_each_valid_link(link_info, link_id)			\
	for (link_id = 0;					\
	     link_id < ((link_info)->valid_links ?		\
			ARRAY_SIZE((link_info)->links) : 1);	\
	     link_id++)						\
		if (!(link_info)->valid_links ||		\
		    ((link_info)->valid_links & BIT(link_id)))
6234

6235 6236 6237 6238
/**
 * DOC: Utility functions
 *
 * cfg80211 offers a number of utility functions that can be useful.
Johannes Berg's avatar
Johannes Berg committed
6239 6240
 */

6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266
/**
 * ieee80211_channel_equal - compare two struct ieee80211_channel
 *
 * @a: 1st struct ieee80211_channel
 * @b: 2nd struct ieee80211_channel
 * Return: true if center frequency of @a == @b
 */
static inline bool
ieee80211_channel_equal(struct ieee80211_channel *a,
			struct ieee80211_channel *b)
{
	return (a->center_freq == b->center_freq &&
		a->freq_offset == b->freq_offset);
}

/**
 * ieee80211_channel_to_khz - convert ieee80211_channel to frequency in KHz
 * @chan: struct ieee80211_channel to convert
 * Return: The corresponding frequency (in KHz)
 */
static inline u32
ieee80211_channel_to_khz(const struct ieee80211_channel *chan)
{
	return MHZ_TO_KHZ(chan->center_freq) + chan->freq_offset;
}

6267 6268 6269 6270 6271 6272 6273 6274 6275 6276
/**
 * ieee80211_s1g_channel_width - get allowed channel width from @chan
 *
 * Only allowed for band NL80211_BAND_S1GHZ
 * @chan: channel
 * Return: The allowed channel width for this center_freq
 */
enum nl80211_chan_width
ieee80211_s1g_channel_width(const struct ieee80211_channel *chan);

6277 6278 6279 6280 6281 6282 6283 6284
/**
 * ieee80211_channel_to_freq_khz - convert channel number to frequency
 * @chan: channel number
 * @band: band, necessary due to channel number overlap
 * Return: The corresponding frequency (in KHz), or 0 if the conversion failed.
 */
u32 ieee80211_channel_to_freq_khz(int chan, enum nl80211_band band);

Johannes Berg's avatar
Johannes Berg committed
6285 6286
/**
 * ieee80211_channel_to_frequency - convert channel number to frequency
Johannes Berg's avatar
Johannes Berg committed
6287
 * @chan: channel number
6288
 * @band: band, necessary due to channel number overlap
6289
 * Return: The corresponding frequency (in MHz), or 0 if the conversion failed.
Johannes Berg's avatar
Johannes Berg committed
6290
 */
6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302
static inline int
ieee80211_channel_to_frequency(int chan, enum nl80211_band band)
{
	return KHZ_TO_MHZ(ieee80211_channel_to_freq_khz(chan, band));
}

/**
 * ieee80211_freq_khz_to_channel - convert frequency to channel number
 * @freq: center frequency in KHz
 * Return: The corresponding channel, or 0 if the conversion failed.
 */
int ieee80211_freq_khz_to_channel(u32 freq);
Johannes Berg's avatar
Johannes Berg committed
6303 6304 6305

/**
 * ieee80211_frequency_to_channel - convert frequency to channel number
6306
 * @freq: center frequency in MHz
6307
 * Return: The corresponding channel, or 0 if the conversion failed.
Johannes Berg's avatar
Johannes Berg committed
6308
 */
6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323
static inline int
ieee80211_frequency_to_channel(int freq)
{
	return ieee80211_freq_khz_to_channel(MHZ_TO_KHZ(freq));
}

/**
 * ieee80211_get_channel_khz - get channel struct from wiphy for specified
 * frequency
 * @wiphy: the struct wiphy to get the channel for
 * @freq: the center frequency (in KHz) of the channel
 * Return: The channel struct from @wiphy at @freq.
 */
struct ieee80211_channel *
ieee80211_get_channel_khz(struct wiphy *wiphy, u32 freq);
Johannes Berg's avatar
Johannes Berg committed
6324 6325 6326

/**
 * ieee80211_get_channel - get channel struct from wiphy for specified frequency
6327
 *
Johannes Berg's avatar
Johannes Berg committed
6328
 * @wiphy: the struct wiphy to get the channel for
6329
 * @freq: the center frequency (in MHz) of the channel
6330
 * Return: The channel struct from @wiphy at @freq.
Johannes Berg's avatar
Johannes Berg committed
6331
 */
6332 6333 6334 6335 6336
static inline struct ieee80211_channel *
ieee80211_get_channel(struct wiphy *wiphy, int freq)
{
	return ieee80211_get_channel_khz(wiphy, MHZ_TO_KHZ(freq));
}
Johannes Berg's avatar
Johannes Berg committed
6337

6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352
/**
 * cfg80211_channel_is_psc - Check if the channel is a 6 GHz PSC
 * @chan: control channel to check
 *
 * The Preferred Scanning Channels (PSC) are defined in
 * Draft IEEE P802.11ax/D5.0, 26.17.2.3.3
 */
static inline bool cfg80211_channel_is_psc(struct ieee80211_channel *chan)
{
	if (chan->band != NL80211_BAND_6GHZ)
		return false;

	return ieee80211_frequency_to_channel(chan->center_freq) % 16 == 5;
}

Johannes Berg's avatar
Johannes Berg committed
6353 6354 6355 6356 6357 6358 6359
/**
 * ieee80211_get_response_rate - get basic rate for a given rate
 *
 * @sband: the band to look for rates in
 * @basic_rates: bitmap of basic rates
 * @bitrate: the bitrate for which to find the basic rate
 *
6360 6361 6362 6363
 * Return: The basic rate corresponding to a given bitrate, that
 * is the next lower bitrate contained in the basic rate map,
 * which is, for this function, given as a bitmap of indices of
 * rates in the band's bitrate table.
Johannes Berg's avatar
Johannes Berg committed
6364
 */
6365
const struct ieee80211_rate *
Johannes Berg's avatar
Johannes Berg committed
6366 6367 6368
ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
			    u32 basic_rates, int bitrate);

6369 6370 6371 6372 6373 6374 6375
/**
 * ieee80211_mandatory_rates - get mandatory rates for a given band
 * @sband: the band to look for rates in
 *
 * This function returns a bitmap of the mandatory rates for the given
 * band, bits are set according to the rate position in the bitrates array.
 */
6376
u32 ieee80211_mandatory_rates(struct ieee80211_supported_band *sband);
6377

Johannes Berg's avatar
Johannes Berg committed
6378 6379 6380 6381
/*
 * Radiotap parsing functions -- for controlled injection support
 *
 * Implemented in net/wireless/radiotap.c
6382
 * Documentation in Documentation/networking/radiotap-headers.rst
Johannes Berg's avatar
Johannes Berg committed
6383 6384
 */

6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400
struct radiotap_align_size {
	uint8_t align:4, size:4;
};

struct ieee80211_radiotap_namespace {
	const struct radiotap_align_size *align_size;
	int n_bits;
	uint32_t oui;
	uint8_t subns;
};

struct ieee80211_radiotap_vendor_namespaces {
	const struct ieee80211_radiotap_namespace *ns;
	int n_ns;
};

Johannes Berg's avatar
Johannes Berg committed
6401 6402
/**
 * struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args
6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427
 * @this_arg_index: index of current arg, valid after each successful call
 *	to ieee80211_radiotap_iterator_next()
 * @this_arg: pointer to current radiotap arg; it is valid after each
 *	call to ieee80211_radiotap_iterator_next() but also after
 *	ieee80211_radiotap_iterator_init() where it will point to
 *	the beginning of the actual data portion
 * @this_arg_size: length of the current arg, for convenience
 * @current_namespace: pointer to the current namespace definition
 *	(or internally %NULL if the current namespace is unknown)
 * @is_radiotap_ns: indicates whether the current namespace is the default
 *	radiotap namespace or not
 *
 * @_rtheader: pointer to the radiotap header we are walking through
 * @_max_length: length of radiotap header in cpu byte ordering
 * @_arg_index: next argument index
 * @_arg: next argument pointer
 * @_next_bitmap: internal pointer to next present u32
 * @_bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present
 * @_vns: vendor namespace definitions
 * @_next_ns_data: beginning of the next namespace's data
 * @_reset_on_ext: internal; reset the arg index to 0 when going to the
 *	next bitmap word
 *
 * Describes the radiotap parser state. Fields prefixed with an underscore
 * must not be used by users of the parser, only by the parser internally.
Johannes Berg's avatar
Johannes Berg committed
6428 6429 6430
 */

struct ieee80211_radiotap_iterator {
6431 6432 6433 6434 6435
	struct ieee80211_radiotap_header *_rtheader;
	const struct ieee80211_radiotap_vendor_namespaces *_vns;
	const struct ieee80211_radiotap_namespace *current_namespace;

	unsigned char *_arg, *_next_ns_data;
6436
	__le32 *_next_bitmap;
6437 6438

	unsigned char *this_arg;
Johannes Berg's avatar
Johannes Berg committed
6439
	int this_arg_index;
6440
	int this_arg_size;
Johannes Berg's avatar
Johannes Berg committed
6441

6442 6443 6444 6445 6446 6447
	int is_radiotap_ns;

	int _max_length;
	int _arg_index;
	uint32_t _bitmap_shifter;
	int _reset_on_ext;
Johannes Berg's avatar
Johannes Berg committed
6448 6449
};

6450 6451 6452 6453 6454
int
ieee80211_radiotap_iterator_init(struct ieee80211_radiotap_iterator *iterator,
				 struct ieee80211_radiotap_header *radiotap_header,
				 int max_length,
				 const struct ieee80211_radiotap_vendor_namespaces *vns);
Johannes Berg's avatar
Johannes Berg committed
6455

6456 6457
int
ieee80211_radiotap_iterator_next(struct ieee80211_radiotap_iterator *iterator);
6458

Johannes Berg's avatar
Johannes Berg committed
6459

6460 6461 6462 6463 6464 6465
extern const unsigned char rfc1042_header[6];
extern const unsigned char bridge_tunnel_header[6];

/**
 * ieee80211_get_hdrlen_from_skb - get header length from data
 *
6466 6467
 * @skb: the frame
 *
6468
 * Given an skb with a raw 802.11 header at the data pointer this function
6469
 * returns the 802.11 header length.
6470
 *
6471 6472 6473
 * Return: The 802.11 header length in bytes (not including encryption
 * headers). Or 0 if the data in the sk_buff is too short to contain a valid
 * 802.11 header.
6474 6475 6476 6477 6478 6479
 */
unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb);

/**
 * ieee80211_hdrlen - get header length in bytes from frame control
 * @fc: frame control field in little-endian format
6480
 * Return: The header length in bytes.
6481
 */
6482
unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc);
6483

6484 6485 6486 6487
/**
 * ieee80211_get_mesh_hdrlen - get mesh extension header length
 * @meshhdr: the mesh extension header, only the flags field
 *	(first byte) will be accessed
6488
 * Return: The length of the extension header, which is always at
6489 6490 6491 6492
 * least 6 bytes and at most 18 if address 5 and 6 are present.
 */
unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr);

6493 6494 6495 6496 6497 6498 6499 6500
/**
 * DOC: Data path helpers
 *
 * In addition to generic utilities, cfg80211 also offers
 * functions that help implement the data path for devices
 * that do not do the 802.11/802.3 conversion on the device.
 */

6501 6502 6503 6504 6505 6506 6507
/**
 * ieee80211_data_to_8023_exthdr - convert an 802.11 data frame to 802.3
 * @skb: the 802.11 data frame
 * @ehdr: pointer to a &struct ethhdr that will get the header, instead
 *	of it being pushed into the SKB
 * @addr: the device MAC address
 * @iftype: the virtual interface type
6508
 * @data_offset: offset of payload after the 802.11 header
6509
 * @is_amsdu: true if the 802.11 header is A-MSDU
6510 6511 6512
 * Return: 0 on success. Non-zero on error.
 */
int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr,
6513
				  const u8 *addr, enum nl80211_iftype iftype,
6514
				  u8 data_offset, bool is_amsdu);
6515

6516 6517 6518 6519 6520
/**
 * ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3
 * @skb: the 802.11 data frame
 * @addr: the device MAC address
 * @iftype: the virtual interface type
6521
 * Return: 0 on success. Non-zero on error.
6522
 */
6523 6524 6525
static inline int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,
					 enum nl80211_iftype iftype)
{
6526
	return ieee80211_data_to_8023_exthdr(skb, NULL, addr, iftype, 0, false);
6527
}
6528

6529 6530 6531 6532 6533 6534 6535 6536
/**
 * ieee80211_is_valid_amsdu - check if subframe lengths of an A-MSDU are valid
 *
 * This is used to detect non-standard A-MSDU frames, e.g. the ones generated
 * by ath10k and ath11k, where the subframe length includes the length of the
 * mesh control field.
 *
 * @skb: The input A-MSDU frame without any headers.
6537 6538 6539 6540
 * @mesh_hdr: the type of mesh header to test
 *	0: non-mesh A-MSDU length field
 *	1: big-endian mesh A-MSDU length field
 *	2: little-endian mesh A-MSDU length field
6541 6542
 * Returns: true if subframe header lengths are valid for the @mesh_hdr mode
 */
6543
bool ieee80211_is_valid_amsdu(struct sk_buff *skb, u8 mesh_hdr);
6544

6545 6546 6547
/**
 * ieee80211_amsdu_to_8023s - decode an IEEE 802.11n A-MSDU frame
 *
6548 6549 6550
 * Decode an IEEE 802.11 A-MSDU and convert it to a list of 802.3 frames.
 * The @list will be empty if the decode fails. The @skb must be fully
 * header-less before being passed in here; it is freed in this function.
6551
 *
6552
 * @skb: The input A-MSDU frame without any headers.
6553
 * @list: The output list of 802.3 frames. It must be allocated and
6554
 *	initialized by the caller.
6555 6556 6557
 * @addr: The device MAC address.
 * @iftype: The device interface type.
 * @extra_headroom: The hardware extra headroom for SKBs in the @list.
6558 6559
 * @check_da: DA to check in the inner ethernet header, or NULL
 * @check_sa: SA to check in the inner ethernet header, or NULL
6560
 * @mesh_control: see mesh_hdr in ieee80211_is_valid_amsdu
6561 6562 6563
 */
void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
			      const u8 *addr, enum nl80211_iftype iftype,
6564
			      const unsigned int extra_headroom,
6565
			      const u8 *check_da, const u8 *check_sa,
6566
			      u8 mesh_control);
6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589

/**
 * ieee80211_get_8023_tunnel_proto - get RFC1042 or bridge tunnel encap protocol
 *
 * Check for RFC1042 or bridge tunnel header and fetch the encapsulated
 * protocol.
 *
 * @hdr: pointer to the MSDU payload
 * @proto: destination pointer to store the protocol
 * Return: true if encapsulation was found
 */
bool ieee80211_get_8023_tunnel_proto(const void *hdr, __be16 *proto);

/**
 * ieee80211_strip_8023_mesh_hdr - strip mesh header from converted 802.3 frames
 *
 * Strip the mesh header, which was left in by ieee80211_data_to_8023 as part
 * of the MSDU data. Also move any source/destination addresses from the mesh
 * header to the ethernet header (if present).
 *
 * @skb: The 802.3 frame with embedded mesh header
 */
int ieee80211_strip_8023_mesh_hdr(struct sk_buff *skb);
6590

6591 6592 6593
/**
 * cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame
 * @skb: the data frame
6594
 * @qos_map: Interworking QoS mapping or %NULL if not in use
6595
 * Return: The 802.1p/1d tag.
6596
 */
6597 6598
unsigned int cfg80211_classify8021d(struct sk_buff *skb,
				    struct cfg80211_qos_map *qos_map);
6599

6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626
/**
 * cfg80211_find_elem_match - match information element and byte array in data
 *
 * @eid: element ID
 * @ies: data consisting of IEs
 * @len: length of data
 * @match: byte array to match
 * @match_len: number of bytes in the match array
 * @match_offset: offset in the IE data where the byte array should match.
 *	Note the difference to cfg80211_find_ie_match() which considers
 *	the offset to start from the element ID byte, but here we take
 *	the data portion instead.
 *
 * Return: %NULL if the element ID could not be found or if
 * the element is invalid (claims to be longer than the given
 * data) or if the byte array doesn't match; otherwise return the
 * requested element struct.
 *
 * Note: There are no checks on the element length other than
 * having to fit into the given data and being large enough for the
 * byte array to match.
 */
const struct element *
cfg80211_find_elem_match(u8 eid, const u8 *ies, unsigned int len,
			 const u8 *match, unsigned int match_len,
			 unsigned int match_offset);

6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650
/**
 * cfg80211_find_ie_match - match information element and byte array in data
 *
 * @eid: element ID
 * @ies: data consisting of IEs
 * @len: length of data
 * @match: byte array to match
 * @match_len: number of bytes in the match array
 * @match_offset: offset in the IE where the byte array should match.
 *	If match_len is zero, this must also be set to zero.
 *	Otherwise this must be set to 2 or more, because the first
 *	byte is the element id, which is already compared to eid, and
 *	the second byte is the IE length.
 *
 * Return: %NULL if the element ID could not be found or if
 * the element is invalid (claims to be longer than the given
 * data) or if the byte array doesn't match, or a pointer to the first
 * byte of the requested element, that is the byte containing the
 * element ID.
 *
 * Note: There are no checks on the element length other than
 * having to fit into the given data and being large enough for the
 * byte array to match.
 */
6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662
static inline const u8 *
cfg80211_find_ie_match(u8 eid, const u8 *ies, unsigned int len,
		       const u8 *match, unsigned int match_len,
		       unsigned int match_offset)
{
	/* match_offset can't be smaller than 2, unless match_len is
	 * zero, in which case match_offset must be zero as well.
	 */
	if (WARN_ON((match_len && match_offset < 2) ||
		    (!match_len && match_offset)))
		return NULL;

6663 6664 6665
	return (const void *)cfg80211_find_elem_match(eid, ies, len,
						      match, match_len,
						      match_offset ?
6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688
							match_offset - 2 : 0);
}

/**
 * cfg80211_find_elem - find information element in data
 *
 * @eid: element ID
 * @ies: data consisting of IEs
 * @len: length of data
 *
 * Return: %NULL if the element ID could not be found or if
 * the element is invalid (claims to be longer than the given
 * data) or if the byte array doesn't match; otherwise return the
 * requested element struct.
 *
 * Note: There are no checks on the element length other than
 * having to fit into the given data.
 */
static inline const struct element *
cfg80211_find_elem(u8 eid, const u8 *ies, int len)
{
	return cfg80211_find_elem_match(eid, ies, len, NULL, 0, 0);
}
6689

6690 6691 6692 6693 6694 6695 6696
/**
 * cfg80211_find_ie - find information element in data
 *
 * @eid: element ID
 * @ies: data consisting of IEs
 * @len: length of data
 *
6697 6698 6699 6700 6701 6702 6703
 * Return: %NULL if the element ID could not be found or if
 * the element is invalid (claims to be longer than the given
 * data), or a pointer to the first byte of the requested
 * element, that is the byte containing the element ID.
 *
 * Note: There are no checks on the element length other than
 * having to fit into the given data.
6704
 */
6705 6706 6707 6708
static inline const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len)
{
	return cfg80211_find_ie_match(eid, ies, len, NULL, 0, 0);
}
6709

6710 6711 6712 6713 6714 6715 6716
/**
 * cfg80211_find_ext_elem - find information element with EID Extension in data
 *
 * @ext_eid: element ID Extension
 * @ies: data consisting of IEs
 * @len: length of data
 *
6717
 * Return: %NULL if the extended element could not be found or if
6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731
 * the element is invalid (claims to be longer than the given
 * data) or if the byte array doesn't match; otherwise return the
 * requested element struct.
 *
 * Note: There are no checks on the element length other than
 * having to fit into the given data.
 */
static inline const struct element *
cfg80211_find_ext_elem(u8 ext_eid, const u8 *ies, int len)
{
	return cfg80211_find_elem_match(WLAN_EID_EXTENSION, ies, len,
					&ext_eid, 1, 0);
}

6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752
/**
 * cfg80211_find_ext_ie - find information element with EID Extension in data
 *
 * @ext_eid: element ID Extension
 * @ies: data consisting of IEs
 * @len: length of data
 *
 * Return: %NULL if the extended element ID could not be found or if
 * the element is invalid (claims to be longer than the given
 * data), or a pointer to the first byte of the requested
 * element, that is the byte containing the element ID.
 *
 * Note: There are no checks on the element length other than
 * having to fit into the given data.
 */
static inline const u8 *cfg80211_find_ext_ie(u8 ext_eid, const u8 *ies, int len)
{
	return cfg80211_find_ie_match(WLAN_EID_EXTENSION, ies, len,
				      &ext_eid, 1, 2);
}

6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771
/**
 * cfg80211_find_vendor_elem - find vendor specific information element in data
 *
 * @oui: vendor OUI
 * @oui_type: vendor-specific OUI type (must be < 0xff), negative means any
 * @ies: data consisting of IEs
 * @len: length of data
 *
 * Return: %NULL if the vendor specific element ID could not be found or if the
 * element is invalid (claims to be longer than the given data); otherwise
 * return the element structure for the requested element.
 *
 * Note: There are no checks on the element length other than having to fit into
 * the given data.
 */
const struct element *cfg80211_find_vendor_elem(unsigned int oui, int oui_type,
						const u8 *ies,
						unsigned int len);

6772 6773 6774 6775
/**
 * cfg80211_find_vendor_ie - find vendor specific information element in data
 *
 * @oui: vendor OUI
6776
 * @oui_type: vendor-specific OUI type (must be < 0xff), negative means any
6777 6778 6779
 * @ies: data consisting of IEs
 * @len: length of data
 *
6780 6781 6782 6783 6784 6785 6786
 * Return: %NULL if the vendor specific element ID could not be found or if the
 * element is invalid (claims to be longer than the given data), or a pointer to
 * the first byte of the requested element, that is the byte containing the
 * element ID.
 *
 * Note: There are no checks on the element length other than having to fit into
 * the given data.
6787
 */
6788 6789 6790 6791
static inline const u8 *
cfg80211_find_vendor_ie(unsigned int oui, int oui_type,
			const u8 *ies, unsigned int len)
{
6792
	return (const void *)cfg80211_find_vendor_elem(oui, oui_type, ies, len);
6793
}
6794

6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816
/**
 * cfg80211_defragment_element - Defrag the given element data into a buffer
 *
 * @elem: the element to defragment
 * @ies: elements where @elem is contained
 * @ieslen: length of @ies
 * @data: buffer to store element data
 * @data_len: length of @data
 * @frag_id: the element ID of fragments
 *
 * Return: length of @data, or -EINVAL on error
 *
 * Copy out all data from an element that may be fragmented into @data, while
 * skipping all headers.
 *
 * The function uses memmove() internally. It is acceptable to defragment an
 * element in-place.
 */
ssize_t cfg80211_defragment_element(const struct element *elem, const u8 *ies,
				    size_t ieslen, u8 *data, size_t data_len,
				    u8 frag_id);

6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827
/**
 * cfg80211_send_layer2_update - send layer 2 update frame
 *
 * @dev: network device
 * @addr: STA MAC address
 *
 * Wireless drivers can use this function to update forwarding tables in bridge
 * devices upon STA association.
 */
void cfg80211_send_layer2_update(struct net_device *dev, const u8 *addr);

6828 6829 6830 6831
/**
 * DOC: Regulatory enforcement infrastructure
 *
 * TODO
Johannes Berg's avatar
Johannes Berg committed
6832 6833 6834 6835 6836 6837 6838
 */

/**
 * regulatory_hint - driver hint to the wireless core a regulatory domain
 * @wiphy: the wireless device giving the hint (used only for reporting
 *	conflicts)
 * @alpha2: the ISO/IEC 3166 alpha2 the driver claims its regulatory domain
6839 6840 6841
 *	should be in. If @rd is set this should be NULL. Note that if you
 *	set this to NULL you should still set rd->alpha2 to some accepted
 *	alpha2.
Johannes Berg's avatar
Johannes Berg committed
6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855
 *
 * Wireless drivers can use this function to hint to the wireless core
 * what it believes should be the current regulatory domain by
 * giving it an ISO/IEC 3166 alpha2 country code it knows its regulatory
 * domain should be in or by providing a completely build regulatory domain.
 * If the driver provides an ISO/IEC 3166 alpha2 userspace will be queried
 * for a regulatory domain structure for the respective country.
 *
 * The wiphy must have been registered to cfg80211 prior to this call.
 * For cfg80211 drivers this means you must first use wiphy_register(),
 * for mac80211 drivers you must first use ieee80211_register_hw().
 *
 * Drivers should check the return value, its possible you can get
 * an -ENOMEM.
6856 6857
 *
 * Return: 0 on success. -ENOMEM.
Johannes Berg's avatar
Johannes Berg committed
6858
 */
6859
int regulatory_hint(struct wiphy *wiphy, const char *alpha2);
Johannes Berg's avatar
Johannes Berg committed
6860

6861 6862 6863
/**
 * regulatory_set_wiphy_regd - set regdom info for self managed drivers
 * @wiphy: the wireless device we want to process the regulatory domain on
6864
 * @rd: the regulatory domain information to use for this wiphy
6865 6866 6867 6868 6869 6870 6871 6872 6873 6874
 *
 * Set the regulatory domain information for self-managed wiphys, only they
 * may use this function. See %REGULATORY_WIPHY_SELF_MANAGED for more
 * information.
 *
 * Return: 0 on success. -EINVAL, -EPERM
 */
int regulatory_set_wiphy_regd(struct wiphy *wiphy,
			      struct ieee80211_regdomain *rd);

6875
/**
6876
 * regulatory_set_wiphy_regd_sync - set regdom for self-managed drivers
6877 6878 6879
 * @wiphy: the wireless device we want to process the regulatory domain on
 * @rd: the regulatory domain information to use for this wiphy
 *
6880 6881 6882
 * This functions requires the RTNL and the wiphy mutex to be held and
 * applies the new regdomain synchronously to this wiphy. For more details
 * see regulatory_set_wiphy_regd().
6883 6884 6885
 *
 * Return: 0 on success. -EINVAL, -EPERM
 */
6886 6887
int regulatory_set_wiphy_regd_sync(struct wiphy *wiphy,
				   struct ieee80211_regdomain *rd);
6888

Johannes Berg's avatar
Johannes Berg committed
6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899
/**
 * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain
 * @wiphy: the wireless device we want to process the regulatory domain on
 * @regd: the custom regulatory domain to use for this wiphy
 *
 * Drivers can sometimes have custom regulatory domains which do not apply
 * to a specific country. Drivers can use this to apply such custom regulatory
 * domains. This routine must be called prior to wiphy registration. The
 * custom regulatory domain will be trusted completely and as such previous
 * default channel settings will be disregarded. If no rule is found for a
 * channel on the regulatory domain the channel will be disabled.
6900
 * Drivers using this for a wiphy should also set the wiphy flag
6901
 * REGULATORY_CUSTOM_REG or cfg80211 will set it for the wiphy
6902
 * that called this helper.
Johannes Berg's avatar
Johannes Berg committed
6903
 */
6904 6905
void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
				   const struct ieee80211_regdomain *regd);
Johannes Berg's avatar
Johannes Berg committed
6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916

/**
 * freq_reg_info - get regulatory information for the given frequency
 * @wiphy: the wiphy for which we want to process this rule for
 * @center_freq: Frequency in KHz for which we want regulatory information for
 *
 * Use this function to get the regulatory rule for a specific frequency on
 * a given wireless device. If the device has a specific regulatory domain
 * it wants to follow we respect that unless a country IE has been received
 * and processed already.
 *
6917 6918 6919 6920 6921 6922 6923
 * Return: A valid pointer, or, when an error occurs, for example if no rule
 * can be found, the return value is encoded using ERR_PTR(). Use IS_ERR() to
 * check and PTR_ERR() to obtain the numeric return value. The numeric return
 * value will be -ERANGE if we determine the given center_freq does not even
 * have a regulatory rule for a frequency range in the center_freq's band.
 * See freq_in_rule_band() for our current definition of a band -- this is
 * purely subjective and right now it's 802.11 specific.
Johannes Berg's avatar
Johannes Berg committed
6924
 */
6925 6926
const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
					       u32 center_freq);
Johannes Berg's avatar
Johannes Berg committed
6927

6928 6929 6930 6931 6932 6933 6934 6935 6936
/**
 * reg_initiator_name - map regulatory request initiator enum to name
 * @initiator: the regulatory request initiator
 *
 * You can use this to map the regulatory request initiator enum to a
 * proper string representation.
 */
const char *reg_initiator_name(enum nl80211_reg_initiator initiator);

6937 6938 6939 6940 6941 6942 6943 6944
/**
 * regulatory_pre_cac_allowed - check if pre-CAC allowed in the current regdom
 * @wiphy: wiphy for which pre-CAC capability is checked.
 *
 * Pre-CAC is allowed only in some regdomains (notable ETSI).
 */
bool regulatory_pre_cac_allowed(struct wiphy *wiphy);

6945 6946 6947 6948 6949 6950 6951 6952 6953 6954
/**
 * DOC: Internal regulatory db functions
 *
 */

/**
 * reg_query_regdb_wmm -  Query internal regulatory db for wmm rule
 * Regulatory self-managed driver can use it to proactively
 *
 * @alpha2: the ISO/IEC 3166 alpha2 wmm rule to be queried.
6955
 * @freq: the frequency (in MHz) to be queried.
6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966
 * @rule: pointer to store the wmm rule from the regulatory db.
 *
 * Self-managed wireless drivers can use this function to  query
 * the internal regulatory database to check whether the given
 * ISO/IEC 3166 alpha2 country and freq have wmm rule limitations.
 *
 * Drivers should check the return value, its possible you can get
 * an -ENODATA.
 *
 * Return: 0 on success. -ENODATA.
 */
6967 6968
int reg_query_regdb_wmm(char *alpha2, int freq,
			struct ieee80211_reg_rule *rule);
6969

Johannes Berg's avatar
Johannes Berg committed
6970 6971 6972 6973 6974
/*
 * callbacks for asynchronous cfg80211 methods, notification
 * functions and BSS handling helpers
 */

6975 6976 6977 6978
/**
 * cfg80211_scan_done - notify that scan finished
 *
 * @request: the corresponding scan request
6979
 * @info: information about the completed scan
6980
 */
6981 6982
void cfg80211_scan_done(struct cfg80211_scan_request *request,
			struct cfg80211_scan_info *info);
6983

6984 6985 6986 6987
/**
 * cfg80211_sched_scan_results - notify that new scan results are available
 *
 * @wiphy: the wiphy which got scheduled scan results
6988
 * @reqid: identifier for the related scheduled scan request
6989
 */
6990
void cfg80211_sched_scan_results(struct wiphy *wiphy, u64 reqid);
6991 6992 6993 6994 6995

/**
 * cfg80211_sched_scan_stopped - notify that the scheduled scan has stopped
 *
 * @wiphy: the wiphy on which the scheduled scan stopped
6996
 * @reqid: identifier for the related scheduled scan request
6997 6998 6999 7000 7001
 *
 * The driver can call this function to inform cfg80211 that the
 * scheduled scan had to be stopped, for whatever reason.  The driver
 * is then called back via the sched_scan_stop operation when done.
 */
7002
void cfg80211_sched_scan_stopped(struct wiphy *wiphy, u64 reqid);
7003

7004
/**
7005
 * cfg80211_sched_scan_stopped_locked - notify that the scheduled scan has stopped
7006 7007
 *
 * @wiphy: the wiphy on which the scheduled scan stopped
7008
 * @reqid: identifier for the related scheduled scan request
7009 7010 7011 7012
 *
 * The driver can call this function to inform cfg80211 that the
 * scheduled scan had to be stopped, for whatever reason.  The driver
 * is then called back via the sched_scan_stop operation when done.
7013
 * This function should be called with the wiphy mutex held.
7014
 */
7015
void cfg80211_sched_scan_stopped_locked(struct wiphy *wiphy, u64 reqid);
7016

7017
/**
7018
 * cfg80211_inform_bss_frame_data - inform cfg80211 of a received BSS frame
7019
 * @wiphy: the wiphy reporting the BSS
7020
 * @data: the BSS metadata
Johannes Berg's avatar
Johannes Berg committed
7021 7022
 * @mgmt: the management frame (probe response or beacon)
 * @len: length of the management frame
7023 7024 7025 7026
 * @gfp: context flags
 *
 * This informs cfg80211 that BSS information was found and
 * the BSS should be updated/added.
7027
 *
7028 7029
 * Return: A referenced struct, must be released with cfg80211_put_bss()!
 * Or %NULL on error.
7030
 */
7031
struct cfg80211_bss * __must_check
7032 7033 7034 7035 7036
cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
			       struct cfg80211_inform_bss *data,
			       struct ieee80211_mgmt *mgmt, size_t len,
			       gfp_t gfp);

7037
static inline struct cfg80211_bss * __must_check
7038
cfg80211_inform_bss_frame(struct wiphy *wiphy,
7039
			  struct ieee80211_channel *rx_channel,
7040
			  struct ieee80211_mgmt *mgmt, size_t len,
7041 7042
			  s32 signal, gfp_t gfp)
{
7043 7044 7045 7046 7047 7048
	struct cfg80211_inform_bss data = {
		.chan = rx_channel,
		.signal = signal,
	};

	return cfg80211_inform_bss_frame_data(wiphy, &data, mgmt, len, gfp);
7049
}
7050

7051 7052 7053 7054 7055
/**
 * cfg80211_gen_new_bssid - generate a nontransmitted BSSID for multi-BSSID
 * @bssid: transmitter BSSID
 * @max_bssid: max BSSID indicator, taken from Multiple BSSID element
 * @mbssid_index: BSSID index, taken from Multiple BSSID index element
7056
 * @new_bssid: calculated nontransmitted BSSID
7057 7058
 */
static inline void cfg80211_gen_new_bssid(const u8 *bssid, u8 max_bssid,
7059
					  u8 mbssid_index, u8 *new_bssid)
7060
{
7061 7062 7063
	u64 bssid_u64 = ether_addr_to_u64(bssid);
	u64 mask = GENMASK_ULL(max_bssid - 1, 0);
	u64 new_bssid_u64;
7064

7065
	new_bssid_u64 = bssid_u64 & ~mask;
7066

7067
	new_bssid_u64 |= ((bssid_u64 & mask) + mbssid_index) & mask;
7068

7069
	u64_to_ether_addr(new_bssid_u64, new_bssid);
7070 7071
}

7072 7073 7074 7075 7076 7077 7078 7079
/**
 * cfg80211_is_element_inherited - returns if element ID should be inherited
 * @element: element to check
 * @non_inherit_element: non inheritance element
 */
bool cfg80211_is_element_inherited(const struct element *element,
				   const struct element *non_inherit_element);

7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091
/**
 * cfg80211_merge_profile - merges a MBSSID profile if it is split between IEs
 * @ie: ies
 * @ielen: length of IEs
 * @mbssid_elem: current MBSSID element
 * @sub_elem: current MBSSID subelement (profile)
 * @merged_ie: location of the merged profile
 * @max_copy_len: max merged profile length
 */
size_t cfg80211_merge_profile(const u8 *ie, size_t ielen,
			      const struct element *mbssid_elem,
			      const struct element *sub_elem,
7092
			      u8 *merged_ie, size_t max_copy_len);
7093

Johannes Berg's avatar
Johannes Berg committed
7094
/**
7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106
 * enum cfg80211_bss_frame_type - frame type that the BSS data came from
 * @CFG80211_BSS_FTYPE_UNKNOWN: driver doesn't know whether the data is
 *	from a beacon or probe response
 * @CFG80211_BSS_FTYPE_BEACON: data comes from a beacon
 * @CFG80211_BSS_FTYPE_PRESP: data comes from a probe response
 */
enum cfg80211_bss_frame_type {
	CFG80211_BSS_FTYPE_UNKNOWN,
	CFG80211_BSS_FTYPE_BEACON,
	CFG80211_BSS_FTYPE_PRESP,
};

7107 7108 7109 7110 7111 7112 7113 7114 7115
/**
 * cfg80211_get_ies_channel_number - returns the channel number from ies
 * @ie: IEs
 * @ielen: length of IEs
 * @band: enum nl80211_band of the channel
 *
 * Returns the channel number, or -1 if none could be determined.
 */
int cfg80211_get_ies_channel_number(const u8 *ie, size_t ielen,
7116
				    enum nl80211_band band);
7117

7118
/**
7119
 * cfg80211_inform_bss_data - inform cfg80211 of a new BSS
Johannes Berg's avatar
Johannes Berg committed
7120 7121
 *
 * @wiphy: the wiphy reporting the BSS
7122
 * @data: the BSS metadata
7123
 * @ftype: frame type (if known)
Johannes Berg's avatar
Johannes Berg committed
7124
 * @bssid: the BSSID of the BSS
7125
 * @tsf: the TSF sent by the peer in the beacon/probe response (or 0)
Johannes Berg's avatar
Johannes Berg committed
7126 7127 7128 7129 7130 7131 7132 7133
 * @capability: the capability field sent by the peer
 * @beacon_interval: the beacon interval announced by the peer
 * @ie: additional IEs sent by the peer
 * @ielen: length of the additional IEs
 * @gfp: context flags
 *
 * This informs cfg80211 that BSS information was found and
 * the BSS should be updated/added.
7134
 *
7135 7136
 * Return: A referenced struct, must be released with cfg80211_put_bss()!
 * Or %NULL on error.
Johannes Berg's avatar
Johannes Berg committed
7137
 */
7138
struct cfg80211_bss * __must_check
7139 7140 7141 7142 7143 7144 7145
cfg80211_inform_bss_data(struct wiphy *wiphy,
			 struct cfg80211_inform_bss *data,
			 enum cfg80211_bss_frame_type ftype,
			 const u8 *bssid, u64 tsf, u16 capability,
			 u16 beacon_interval, const u8 *ie, size_t ielen,
			 gfp_t gfp);

7146
static inline struct cfg80211_bss * __must_check
7147
cfg80211_inform_bss(struct wiphy *wiphy,
7148
		    struct ieee80211_channel *rx_channel,
7149
		    enum cfg80211_bss_frame_type ftype,
7150 7151
		    const u8 *bssid, u64 tsf, u16 capability,
		    u16 beacon_interval, const u8 *ie, size_t ielen,
7152 7153
		    s32 signal, gfp_t gfp)
{
7154 7155 7156 7157 7158 7159 7160 7161
	struct cfg80211_inform_bss data = {
		.chan = rx_channel,
		.signal = signal,
	};

	return cfg80211_inform_bss_data(wiphy, &data, ftype, bssid, tsf,
					capability, beacon_interval, ie, ielen,
					gfp);
7162
}
7163

7164 7165 7166 7167 7168 7169 7170 7171 7172 7173
/**
 * cfg80211_get_bss - get a BSS reference
 * @wiphy: the wiphy this BSS struct belongs to
 * @channel: the channel to search on (or %NULL)
 * @bssid: the desired BSSID (or %NULL)
 * @ssid: the desired SSID (or %NULL)
 * @ssid_len: length of the SSID (or 0)
 * @bss_type: type of BSS, see &enum ieee80211_bss_type
 * @privacy: privacy filter, see &enum ieee80211_privacy
 */
7174 7175 7176
struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
				      struct ieee80211_channel *channel,
				      const u8 *bssid,
7177
				      const u8 *ssid, size_t ssid_len,
7178
				      enum ieee80211_bss_type bss_type,
7179
				      enum ieee80211_privacy privacy);
7180 7181 7182 7183 7184 7185
static inline struct cfg80211_bss *
cfg80211_get_ibss(struct wiphy *wiphy,
		  struct ieee80211_channel *channel,
		  const u8 *ssid, size_t ssid_len)
{
	return cfg80211_get_bss(wiphy, channel, NULL, ssid, ssid_len,
7186 7187
				IEEE80211_BSS_TYPE_IBSS,
				IEEE80211_PRIVACY_ANY);
7188 7189
}

7190 7191
/**
 * cfg80211_ref_bss - reference BSS struct
7192
 * @wiphy: the wiphy this BSS struct belongs to
7193 7194 7195 7196
 * @bss: the BSS struct to reference
 *
 * Increments the refcount of the given BSS struct.
 */
7197
void cfg80211_ref_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);
7198 7199 7200

/**
 * cfg80211_put_bss - unref BSS struct
7201
 * @wiphy: the wiphy this BSS struct belongs to
7202 7203 7204 7205
 * @bss: the BSS struct
 *
 * Decrements the refcount of the given BSS struct.
 */
7206
void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);
Johannes Berg's avatar
Johannes Berg committed
7207

7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218
/**
 * cfg80211_unlink_bss - unlink BSS from internal data structures
 * @wiphy: the wiphy
 * @bss: the bss to remove
 *
 * This function removes the given BSS from the internal data structures
 * thereby making it no longer show up in scan results etc. Use this
 * function when you detect a BSS is gone. Normally BSSes will also time
 * out, so it is not necessary to use this function at all.
 */
void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);
Johannes Berg's avatar
Johannes Berg committed
7219

7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239
/**
 * cfg80211_bss_iter - iterate all BSS entries
 *
 * This function iterates over the BSS entries associated with the given wiphy
 * and calls the callback for the iterated BSS. The iterator function is not
 * allowed to call functions that might modify the internal state of the BSS DB.
 *
 * @wiphy: the wiphy
 * @chandef: if given, the iterator function will be called only if the channel
 *     of the currently iterated BSS is a subset of the given channel.
 * @iter: the iterator function to call
 * @iter_data: an argument to the iterator function
 */
void cfg80211_bss_iter(struct wiphy *wiphy,
		       struct cfg80211_chan_def *chandef,
		       void (*iter)(struct wiphy *wiphy,
				    struct cfg80211_bss *bss,
				    void *data),
		       void *iter_data);

7240
/**
7241
 * cfg80211_rx_mlme_mgmt - notification of processed MLME management frame
7242 7243 7244 7245
 * @dev: network device
 * @buf: authentication frame (header + body)
 * @len: length of the frame data
 *
7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257
 * This function is called whenever an authentication, disassociation or
 * deauthentication frame has been received and processed in station mode.
 * After being asked to authenticate via cfg80211_ops::auth() the driver must
 * call either this function or cfg80211_auth_timeout().
 * After being asked to associate via cfg80211_ops::assoc() the driver must
 * call either this function or cfg80211_auth_timeout().
 * While connected, the driver must calls this for received and processed
 * disassociation and deauthentication frames. If the frame couldn't be used
 * because it was unprotected, the driver must call the function
 * cfg80211_rx_unprot_mlme_mgmt() instead.
 *
 * This function may sleep. The caller must hold the corresponding wdev's mutex.
7258
 */
7259
void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len);
7260

7261
/**
7262
 * cfg80211_auth_timeout - notification of timed out authentication
7263 7264
 * @dev: network device
 * @addr: The MAC address of the device with which the authentication timed out
7265
 *
7266 7267
 * This function may sleep. The caller must hold the corresponding wdev's
 * mutex.
7268
 */
7269
void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr);
7270

7271
/**
7272
 * struct cfg80211_rx_assoc_resp - association response data
7273
 * @bss: the BSS that association was requested with, ownership of the pointer
7274
 *	moves to cfg80211 in the call to cfg80211_rx_assoc_resp()
7275
 * @buf: (Re)Association Response frame (header + body)
7276
 * @len: length of the frame data
7277 7278
 * @uapsd_queues: bitmap of queues configured for uapsd. Same format
 *	as the AC bitmap in the QoS info field
7279 7280
 * @req_ies: information elements from the (Re)Association Request frame
 * @req_ies_len: length of req_ies data
7281 7282 7283
 * @ap_mld_addr: AP MLD address (in case of MLO)
 * @links: per-link information indexed by link ID, use links[0] for
 *	non-MLO connections
7284 7285
 * @links.status: Set this (along with a BSS pointer) for links that
 *	were rejected by the AP.
7286 7287 7288 7289 7290 7291 7292
 */
struct cfg80211_rx_assoc_resp {
	const u8 *buf;
	size_t len;
	const u8 *req_ies;
	size_t req_ies_len;
	int uapsd_queues;
7293 7294
	const u8 *ap_mld_addr;
	struct {
7295
		u8 addr[ETH_ALEN] __aligned(2);
7296
		struct cfg80211_bss *bss;
7297
		u16 status;
7298
	} links[IEEE80211_MLD_MAX_NUM_LINKS];
7299 7300 7301 7302 7303 7304
};

/**
 * cfg80211_rx_assoc_resp - notification of processed association response
 * @dev: network device
 * @data: association response data, &struct cfg80211_rx_assoc_resp
7305
 *
7306 7307 7308 7309
 * After being asked to associate via cfg80211_ops::assoc() the driver must
 * call either this function or cfg80211_auth_timeout().
 *
 * This function may sleep. The caller must hold the corresponding wdev's mutex.
7310
 */
7311
void cfg80211_rx_assoc_resp(struct net_device *dev,
7312
			    struct cfg80211_rx_assoc_resp *data);
7313

7314
/**
7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327
 * struct cfg80211_assoc_failure - association failure data
 * @ap_mld_addr: AP MLD address, or %NULL
 * @bss: list of BSSes, must use entry 0 for non-MLO connections
 *	(@ap_mld_addr is %NULL)
 * @timeout: indicates the association failed due to timeout, otherwise
 *	the association was abandoned for a reason reported through some
 *	other API (e.g. deauth RX)
 */
struct cfg80211_assoc_failure {
	const u8 *ap_mld_addr;
	struct cfg80211_bss *bss[IEEE80211_MLD_MAX_NUM_LINKS];
	bool timeout;
};
7328

7329
/**
7330
 * cfg80211_assoc_failure - notification of association failure
7331
 * @dev: network device
7332
 * @data: data describing the association failure
7333 7334 7335
 *
 * This function may sleep. The caller must hold the corresponding wdev's mutex.
 */
7336 7337
void cfg80211_assoc_failure(struct net_device *dev,
			    struct cfg80211_assoc_failure *data);
7338

7339
/**
7340
 * cfg80211_tx_mlme_mgmt - notification of transmitted deauth/disassoc frame
7341
 * @dev: network device
7342
 * @buf: 802.11 frame (header + body)
7343
 * @len: length of the frame data
7344
 * @reconnect: immediate reconnect is desired (include the nl80211 attribute)
7345 7346
 *
 * This function is called whenever deauthentication has been processed in
7347
 * station mode. This includes both received deauthentication frames and
7348 7349
 * locally generated ones. This function may sleep. The caller must hold the
 * corresponding wdev's mutex.
7350
 */
7351 7352
void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len,
			   bool reconnect);
7353

7354
/**
7355
 * cfg80211_rx_unprot_mlme_mgmt - notification of unprotected mlme mgmt frame
7356
 * @dev: network device
7357
 * @buf: received management frame (header + body)
7358 7359
 * @len: length of the frame data
 *
7360 7361
 * This function is called whenever a received deauthentication or dissassoc
 * frame has been dropped in station mode because of MFP being used but the
7362 7363 7364 7365 7366
 * frame was not protected. This is also used to notify reception of a Beacon
 * frame that was dropped because it did not include a valid MME MIC while
 * beacon protection was enabled (BIGTK configured in station mode).
 *
 * This function may sleep.
7367
 */
7368 7369
void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev,
				  const u8 *buf, size_t len);
7370

7371 7372 7373 7374 7375
/**
 * cfg80211_michael_mic_failure - notification of Michael MIC failure (TKIP)
 * @dev: network device
 * @addr: The source MAC address of the frame
 * @key_type: The key type that the received frame used
7376
 * @key_id: Key identifier (0..3). Can be -1 if missing.
7377
 * @tsc: The TSC value of the frame that generated the MIC failure (6 octets)
7378
 * @gfp: allocation flags
7379 7380 7381 7382 7383 7384 7385
 *
 * This function is called whenever the local MAC detects a MIC failure in a
 * received frame. This matches with MLME-MICHAELMICFAILURE.indication()
 * primitive.
 */
void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr,
				  enum nl80211_key_type key_type, int key_id,
7386
				  const u8 *tsc, gfp_t gfp);
7387

7388 7389 7390 7391 7392
/**
 * cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS
 *
 * @dev: network device
 * @bssid: the BSSID of the IBSS joined
7393
 * @channel: the channel of the IBSS joined
7394 7395 7396 7397 7398 7399 7400 7401 7402
 * @gfp: allocation flags
 *
 * This function notifies cfg80211 that the device joined an IBSS or
 * switched to a different BSSID. Before this function can be called,
 * either a beacon has to have been received from the IBSS, or one of
 * the cfg80211_inform_bss{,_frame} functions must have been called
 * with the locally generated beacon -- this guarantees that there is
 * always a scan result for this IBSS. cfg80211 will handle the rest.
 */
7403 7404
void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
			  struct ieee80211_channel *channel, gfp_t gfp);
7405

7406
/**
7407 7408
 * cfg80211_notify_new_peer_candidate - notify cfg80211 of a new mesh peer
 * 					candidate
7409 7410 7411 7412
 *
 * @dev: network device
 * @macaddr: the MAC address of the new candidate
 * @ie: information elements advertised by the peer candidate
Matteo Croce's avatar
Matteo Croce committed
7413
 * @ie_len: length of the information elements buffer
7414
 * @sig_dbm: signal level in dBm
7415 7416 7417 7418 7419 7420 7421
 * @gfp: allocation flags
 *
 * This function notifies cfg80211 that the mesh peer candidate has been
 * detected, most likely via a beacon or, less likely, via a probe response.
 * cfg80211 then sends a notification to userspace.
 */
void cfg80211_notify_new_peer_candidate(struct net_device *dev,
7422 7423
		const u8 *macaddr, const u8 *ie, u8 ie_len,
		int sig_dbm, gfp_t gfp);
7424

7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438
/**
 * DOC: RFkill integration
 *
 * RFkill integration in cfg80211 is almost invisible to drivers,
 * as cfg80211 automatically registers an rfkill instance for each
 * wireless device it knows about. Soft kill is also translated
 * into disconnecting and turning all interfaces off, drivers are
 * expected to turn off the device when all interfaces are down.
 *
 * However, devices may have a hard RFkill line, in which case they
 * also need to interact with the rfkill subsystem, via cfg80211.
 * They can do this with a few helper functions documented here.
 */

Johannes Berg's avatar
Johannes Berg committed
7439
/**
7440
 * wiphy_rfkill_set_hw_state_reason - notify cfg80211 about hw block state
Johannes Berg's avatar
Johannes Berg committed
7441 7442
 * @wiphy: the wiphy
 * @blocked: block status
7443
 * @reason: one of reasons in &enum rfkill_hard_block_reasons
Johannes Berg's avatar
Johannes Berg committed
7444
 */
7445 7446 7447 7448 7449 7450 7451 7452
void wiphy_rfkill_set_hw_state_reason(struct wiphy *wiphy, bool blocked,
				      enum rfkill_hard_block_reasons reason);

static inline void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
{
	wiphy_rfkill_set_hw_state_reason(wiphy, blocked,
					 RFKILL_HARD_BLOCK_SIGNAL);
}
Johannes Berg's avatar
Johannes Berg committed
7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463

/**
 * wiphy_rfkill_start_polling - start polling rfkill
 * @wiphy: the wiphy
 */
void wiphy_rfkill_start_polling(struct wiphy *wiphy);

/**
 * wiphy_rfkill_stop_polling - stop polling rfkill
 * @wiphy: the wiphy
 */
7464 7465 7466 7467
static inline void wiphy_rfkill_stop_polling(struct wiphy *wiphy)
{
	rfkill_pause_polling(wiphy->rfkill);
}
Johannes Berg's avatar
Johannes Berg committed
7468

7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493
/**
 * DOC: Vendor commands
 *
 * Occasionally, there are special protocol or firmware features that
 * can't be implemented very openly. For this and similar cases, the
 * vendor command functionality allows implementing the features with
 * (typically closed-source) userspace and firmware, using nl80211 as
 * the configuration mechanism.
 *
 * A driver supporting vendor commands must register them as an array
 * in struct wiphy, with handlers for each one, each command has an
 * OUI and sub command ID to identify it.
 *
 * Note that this feature should not be (ab)used to implement protocol
 * features that could openly be shared across drivers. In particular,
 * it must never be required to use vendor commands to implement any
 * "normal" functionality that higher-level userspace like connection
 * managers etc. need.
 */

struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
					   enum nl80211_commands cmd,
					   enum nl80211_attrs attr,
					   int approxlen);

7494
struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
7495
					   struct wireless_dev *wdev,
7496 7497
					   enum nl80211_commands cmd,
					   enum nl80211_attrs attr,
7498
					   unsigned int portid,
7499 7500 7501 7502 7503
					   int vendor_event_idx,
					   int approxlen, gfp_t gfp);

void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp);

7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547
/**
 * cfg80211_vendor_cmd_alloc_reply_skb - allocate vendor command reply
 * @wiphy: the wiphy
 * @approxlen: an upper bound of the length of the data that will
 *	be put into the skb
 *
 * This function allocates and pre-fills an skb for a reply to
 * a vendor command. Since it is intended for a reply, calling
 * it outside of a vendor command's doit() operation is invalid.
 *
 * The returned skb is pre-filled with some identifying data in
 * a way that any data that is put into the skb (with skb_put(),
 * nla_put() or similar) will end up being within the
 * %NL80211_ATTR_VENDOR_DATA attribute, so all that needs to be done
 * with the skb is adding data for the corresponding userspace tool
 * which can then read that data out of the vendor data attribute.
 * You must not modify the skb in any other way.
 *
 * When done, call cfg80211_vendor_cmd_reply() with the skb and return
 * its error code as the result of the doit() operation.
 *
 * Return: An allocated and pre-filled skb. %NULL if any errors happen.
 */
static inline struct sk_buff *
cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int approxlen)
{
	return __cfg80211_alloc_reply_skb(wiphy, NL80211_CMD_VENDOR,
					  NL80211_ATTR_VENDOR_DATA, approxlen);
}

/**
 * cfg80211_vendor_cmd_reply - send the reply skb
 * @skb: The skb, must have been allocated with
 *	cfg80211_vendor_cmd_alloc_reply_skb()
 *
 * Since calling this function will usually be the last thing
 * before returning from the vendor command doit() you should
 * return the error code.  Note that this function consumes the
 * skb regardless of the return value.
 *
 * Return: An error code or 0 on success.
 */
int cfg80211_vendor_cmd_reply(struct sk_buff *skb);

7548
/**
7549
 * cfg80211_vendor_cmd_get_sender - get the current sender netlink ID
7550 7551 7552 7553 7554 7555 7556
 * @wiphy: the wiphy
 *
 * Return the current netlink port ID in a vendor command handler.
 * Valid to call only there.
 */
unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy);

7557 7558 7559
/**
 * cfg80211_vendor_event_alloc - allocate vendor-specific event skb
 * @wiphy: the wiphy
7560
 * @wdev: the wireless device
7561 7562 7563 7564 7565 7566 7567 7568
 * @event_idx: index of the vendor event in the wiphy's vendor_events
 * @approxlen: an upper bound of the length of the data that will
 *	be put into the skb
 * @gfp: allocation flags
 *
 * This function allocates and pre-fills an skb for an event on the
 * vendor-specific multicast group.
 *
7569 7570 7571 7572
 * If wdev != NULL, both the ifindex and identifier of the specified
 * wireless device are added to the event message before the vendor data
 * attribute.
 *
7573 7574 7575 7576 7577 7578
 * When done filling the skb, call cfg80211_vendor_event() with the
 * skb to send the event.
 *
 * Return: An allocated and pre-filled skb. %NULL if any errors happen.
 */
static inline struct sk_buff *
7579 7580
cfg80211_vendor_event_alloc(struct wiphy *wiphy, struct wireless_dev *wdev,
			     int approxlen, int event_idx, gfp_t gfp)
7581
{
7582
	return __cfg80211_alloc_event_skb(wiphy, wdev, NL80211_CMD_VENDOR,
7583
					  NL80211_ATTR_VENDOR_DATA,
7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619
					  0, event_idx, approxlen, gfp);
}

/**
 * cfg80211_vendor_event_alloc_ucast - alloc unicast vendor-specific event skb
 * @wiphy: the wiphy
 * @wdev: the wireless device
 * @event_idx: index of the vendor event in the wiphy's vendor_events
 * @portid: port ID of the receiver
 * @approxlen: an upper bound of the length of the data that will
 *	be put into the skb
 * @gfp: allocation flags
 *
 * This function allocates and pre-fills an skb for an event to send to
 * a specific (userland) socket. This socket would previously have been
 * obtained by cfg80211_vendor_cmd_get_sender(), and the caller MUST take
 * care to register a netlink notifier to see when the socket closes.
 *
 * If wdev != NULL, both the ifindex and identifier of the specified
 * wireless device are added to the event message before the vendor data
 * attribute.
 *
 * When done filling the skb, call cfg80211_vendor_event() with the
 * skb to send the event.
 *
 * Return: An allocated and pre-filled skb. %NULL if any errors happen.
 */
static inline struct sk_buff *
cfg80211_vendor_event_alloc_ucast(struct wiphy *wiphy,
				  struct wireless_dev *wdev,
				  unsigned int portid, int approxlen,
				  int event_idx, gfp_t gfp)
{
	return __cfg80211_alloc_event_skb(wiphy, wdev, NL80211_CMD_VENDOR,
					  NL80211_ATTR_VENDOR_DATA,
					  portid, event_idx, approxlen, gfp);
7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634
}

/**
 * cfg80211_vendor_event - send the event
 * @skb: The skb, must have been allocated with cfg80211_vendor_event_alloc()
 * @gfp: allocation flags
 *
 * This function sends the given @skb, which must have been allocated
 * by cfg80211_vendor_event_alloc(), as an event. It always consumes it.
 */
static inline void cfg80211_vendor_event(struct sk_buff *skb, gfp_t gfp)
{
	__cfg80211_send_event_skb(skb, gfp);
}

7635
#ifdef CONFIG_NL80211_TESTMODE
7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646
/**
 * DOC: Test mode
 *
 * Test mode is a set of utility functions to allow drivers to
 * interact with driver-specific tools to aid, for instance,
 * factory programming.
 *
 * This chapter describes how drivers interact with it, for more
 * information see the nl80211 book's chapter on it.
 */

7647 7648 7649 7650 7651 7652 7653 7654 7655 7656
/**
 * cfg80211_testmode_alloc_reply_skb - allocate testmode reply
 * @wiphy: the wiphy
 * @approxlen: an upper bound of the length of the data that will
 *	be put into the skb
 *
 * This function allocates and pre-fills an skb for a reply to
 * the testmode command. Since it is intended for a reply, calling
 * it outside of the @testmode_cmd operation is invalid.
 *
7657 7658 7659 7660 7661 7662 7663
 * The returned skb is pre-filled with the wiphy index and set up in
 * a way that any data that is put into the skb (with skb_put(),
 * nla_put() or similar) will end up being within the
 * %NL80211_ATTR_TESTDATA attribute, so all that needs to be done
 * with the skb is adding data for the corresponding userspace tool
 * which can then read that data out of the testdata attribute. You
 * must not modify the skb in any other way.
7664 7665 7666
 *
 * When done, call cfg80211_testmode_reply() with the skb and return
 * its error code as the result of the @testmode_cmd operation.
7667 7668
 *
 * Return: An allocated and pre-filled skb. %NULL if any errors happen.
7669
 */
7670 7671 7672 7673 7674 7675
static inline struct sk_buff *
cfg80211_testmode_alloc_reply_skb(struct wiphy *wiphy, int approxlen)
{
	return __cfg80211_alloc_reply_skb(wiphy, NL80211_CMD_TESTMODE,
					  NL80211_ATTR_TESTDATA, approxlen);
}
7676 7677 7678 7679 7680 7681

/**
 * cfg80211_testmode_reply - send the reply skb
 * @skb: The skb, must have been allocated with
 *	cfg80211_testmode_alloc_reply_skb()
 *
7682 7683 7684 7685 7686 7687
 * Since calling this function will usually be the last thing
 * before returning from the @testmode_cmd you should return
 * the error code.  Note that this function consumes the skb
 * regardless of the return value.
 *
 * Return: An error code or 0 on success.
7688
 */
7689 7690 7691 7692
static inline int cfg80211_testmode_reply(struct sk_buff *skb)
{
	return cfg80211_vendor_cmd_reply(skb);
}
7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703

/**
 * cfg80211_testmode_alloc_event_skb - allocate testmode event
 * @wiphy: the wiphy
 * @approxlen: an upper bound of the length of the data that will
 *	be put into the skb
 * @gfp: allocation flags
 *
 * This function allocates and pre-fills an skb for an event on the
 * testmode multicast group.
 *
7704 7705 7706 7707 7708
 * The returned skb is set up in the same way as with
 * cfg80211_testmode_alloc_reply_skb() but prepared for an event. As
 * there, you should simply add data to it that will then end up in the
 * %NL80211_ATTR_TESTDATA attribute. Again, you must not modify the skb
 * in any other way.
7709 7710 7711
 *
 * When done filling the skb, call cfg80211_testmode_event() with the
 * skb to send the event.
7712 7713
 *
 * Return: An allocated and pre-filled skb. %NULL if any errors happen.
7714
 */
7715 7716 7717
static inline struct sk_buff *
cfg80211_testmode_alloc_event_skb(struct wiphy *wiphy, int approxlen, gfp_t gfp)
{
7718
	return __cfg80211_alloc_event_skb(wiphy, NULL, NL80211_CMD_TESTMODE,
7719
					  NL80211_ATTR_TESTDATA, 0, -1,
7720 7721
					  approxlen, gfp);
}
7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732

/**
 * cfg80211_testmode_event - send the event
 * @skb: The skb, must have been allocated with
 *	cfg80211_testmode_alloc_event_skb()
 * @gfp: allocation flags
 *
 * This function sends the given @skb, which must have been allocated
 * by cfg80211_testmode_alloc_event_skb(), as an event. It always
 * consumes it.
 */
7733 7734 7735 7736
static inline void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
{
	__cfg80211_send_event_skb(skb, gfp);
}
7737 7738

#define CFG80211_TESTMODE_CMD(cmd)	.testmode_cmd = (cmd),
7739
#define CFG80211_TESTMODE_DUMP(cmd)	.testmode_dump = (cmd),
7740 7741
#else
#define CFG80211_TESTMODE_CMD(cmd)
7742
#define CFG80211_TESTMODE_DUMP(cmd)
7743 7744
#endif

7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768
/**
 * struct cfg80211_fils_resp_params - FILS connection response params
 * @kek: KEK derived from a successful FILS connection (may be %NULL)
 * @kek_len: Length of @fils_kek in octets
 * @update_erp_next_seq_num: Boolean value to specify whether the value in
 *	@erp_next_seq_num is valid.
 * @erp_next_seq_num: The next sequence number to use in ERP message in
 *	FILS Authentication. This value should be specified irrespective of the
 *	status for a FILS connection.
 * @pmk: A new PMK if derived from a successful FILS connection (may be %NULL).
 * @pmk_len: Length of @pmk in octets
 * @pmkid: A new PMKID if derived from a successful FILS connection or the PMKID
 *	used for this FILS connection (may be %NULL).
 */
struct cfg80211_fils_resp_params {
	const u8 *kek;
	size_t kek_len;
	bool update_erp_next_seq_num;
	u16 erp_next_seq_num;
	const u8 *pmk;
	size_t pmk_len;
	const u8 *pmkid;
};

7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782
/**
 * struct cfg80211_connect_resp_params - Connection response params
 * @status: Status code, %WLAN_STATUS_SUCCESS for successful connection, use
 *	%WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you
 *	the real status code for failures. If this call is used to report a
 *	failure due to a timeout (e.g., not receiving an Authentication frame
 *	from the AP) instead of an explicit rejection by the AP, -1 is used to
 *	indicate that this is a failure, but without a status code.
 *	@timeout_reason is used to report the reason for the timeout in that
 *	case.
 * @req_ie: Association request IEs (may be %NULL)
 * @req_ie_len: Association request IEs length
 * @resp_ie: Association response IEs (may be %NULL)
 * @resp_ie_len: Association response IEs length
7783
 * @fils: FILS connection response parameters.
7784 7785 7786 7787 7788 7789
 * @timeout_reason: Reason for connection timeout. This is used when the
 *	connection fails due to a timeout instead of an explicit rejection from
 *	the AP. %NL80211_TIMEOUT_UNSPECIFIED is used when the timeout reason is
 *	not known. This value is used only if @status < 0 to indicate that the
 *	failure is due to a timeout and not due to explicit rejection by the AP.
 *	This value is ignored in other cases (@status >= 0).
7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807
 * @valid_links: For MLO connection, BIT mask of the valid link ids. Otherwise
 *	zero.
 * @ap_mld_addr: For MLO connection, MLD address of the AP. Otherwise %NULL.
 * @links : For MLO connection, contains link info for the valid links indicated
 *	using @valid_links. For non-MLO connection, links[0] contains the
 *	connected AP info.
 * @links.addr: For MLO connection, MAC address of the STA link. Otherwise
 *	%NULL.
 * @links.bssid: For MLO connection, MAC address of the AP link. For non-MLO
 *	connection, links[0].bssid points to the BSSID of the AP (may be %NULL).
 * @links.bss: For MLO connection, entry of bss to which STA link is connected.
 *	For non-MLO connection, links[0].bss points to entry of bss to which STA
 *	is connected. It can be obtained through cfg80211_get_bss() (may be
 *	%NULL). It is recommended to store the bss from the connect_request and
 *	hold a reference to it and return through this param to avoid a warning
 *	if the bss is expired during the connection, esp. for those drivers
 *	implementing connect op. Only one parameter among @bssid and @bss needs
 *	to be specified.
7808 7809 7810
 * @links.status: per-link status code, to report a status code that's not
 *	%WLAN_STATUS_SUCCESS for a given link, it must also be in the
 *	@valid_links bitmap and may have a BSS pointer (which is then released)
7811 7812 7813 7814 7815 7816 7817
 */
struct cfg80211_connect_resp_params {
	int status;
	const u8 *req_ie;
	size_t req_ie_len;
	const u8 *resp_ie;
	size_t resp_ie_len;
7818
	struct cfg80211_fils_resp_params fils;
7819
	enum nl80211_timeout_reason timeout_reason;
7820 7821 7822 7823 7824 7825 7826

	const u8 *ap_mld_addr;
	u16 valid_links;
	struct {
		const u8 *addr;
		const u8 *bssid;
		struct cfg80211_bss *bss;
7827
		u16 status;
7828
	} links[IEEE80211_MLD_MAX_NUM_LINKS];
7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848
};

/**
 * cfg80211_connect_done - notify cfg80211 of connection result
 *
 * @dev: network device
 * @params: connection response parameters
 * @gfp: allocation flags
 *
 * It should be called by the underlying driver once execution of the connection
 * request from connect() has been completed. This is similar to
 * cfg80211_connect_bss(), but takes a structure pointer for connection response
 * parameters. Only one of the functions among cfg80211_connect_bss(),
 * cfg80211_connect_result(), cfg80211_connect_timeout(),
 * and cfg80211_connect_done() should be called.
 */
void cfg80211_connect_done(struct net_device *dev,
			   struct cfg80211_connect_resp_params *params,
			   gfp_t gfp);

7849 7850 7851 7852 7853
/**
 * cfg80211_connect_bss - notify cfg80211 of connection result
 *
 * @dev: network device
 * @bssid: the BSSID of the AP
7854 7855 7856 7857 7858 7859
 * @bss: Entry of bss to which STA got connected to, can be obtained through
 *	cfg80211_get_bss() (may be %NULL). But it is recommended to store the
 *	bss from the connect_request and hold a reference to it and return
 *	through this param to avoid a warning if the bss is expired during the
 *	connection, esp. for those drivers implementing connect op.
 *	Only one parameter among @bssid and @bss needs to be specified.
7860 7861 7862 7863
 * @req_ie: association request IEs (maybe be %NULL)
 * @req_ie_len: association request IEs length
 * @resp_ie: association response IEs (may be %NULL)
 * @resp_ie_len: assoc response IEs length
7864 7865 7866 7867 7868 7869 7870 7871
 * @status: status code, %WLAN_STATUS_SUCCESS for successful connection, use
 *	%WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you
 *	the real status code for failures. If this call is used to report a
 *	failure due to a timeout (e.g., not receiving an Authentication frame
 *	from the AP) instead of an explicit rejection by the AP, -1 is used to
 *	indicate that this is a failure, but without a status code.
 *	@timeout_reason is used to report the reason for the timeout in that
 *	case.
7872
 * @gfp: allocation flags
7873 7874 7875 7876 7877 7878
 * @timeout_reason: reason for connection timeout. This is used when the
 *	connection fails due to a timeout instead of an explicit rejection from
 *	the AP. %NL80211_TIMEOUT_UNSPECIFIED is used when the timeout reason is
 *	not known. This value is used only if @status < 0 to indicate that the
 *	failure is due to a timeout and not due to explicit rejection by the AP.
 *	This value is ignored in other cases (@status >= 0).
7879
 *
7880 7881 7882
 * It should be called by the underlying driver once execution of the connection
 * request from connect() has been completed. This is similar to
 * cfg80211_connect_result(), but with the option of identifying the exact bss
7883 7884 7885
 * entry for the connection. Only one of the functions among
 * cfg80211_connect_bss(), cfg80211_connect_result(),
 * cfg80211_connect_timeout(), and cfg80211_connect_done() should be called.
7886
 */
7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897
static inline void
cfg80211_connect_bss(struct net_device *dev, const u8 *bssid,
		     struct cfg80211_bss *bss, const u8 *req_ie,
		     size_t req_ie_len, const u8 *resp_ie,
		     size_t resp_ie_len, int status, gfp_t gfp,
		     enum nl80211_timeout_reason timeout_reason)
{
	struct cfg80211_connect_resp_params params;

	memset(&params, 0, sizeof(params));
	params.status = status;
7898 7899
	params.links[0].bssid = bssid;
	params.links[0].bss = bss;
7900 7901 7902 7903 7904 7905 7906 7907
	params.req_ie = req_ie;
	params.req_ie_len = req_ie_len;
	params.resp_ie = resp_ie;
	params.resp_ie_len = resp_ie_len;
	params.timeout_reason = timeout_reason;

	cfg80211_connect_done(dev, &params, gfp);
}
7908

7909 7910 7911 7912 7913 7914 7915 7916 7917
/**
 * cfg80211_connect_result - notify cfg80211 of connection result
 *
 * @dev: network device
 * @bssid: the BSSID of the AP
 * @req_ie: association request IEs (maybe be %NULL)
 * @req_ie_len: association request IEs length
 * @resp_ie: association response IEs (may be %NULL)
 * @resp_ie_len: assoc response IEs length
7918
 * @status: status code, %WLAN_STATUS_SUCCESS for successful connection, use
7919 7920 7921 7922
 *	%WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you
 *	the real status code for failures.
 * @gfp: allocation flags
 *
7923 7924 7925
 * It should be called by the underlying driver once execution of the connection
 * request from connect() has been completed. This is similar to
 * cfg80211_connect_bss() which allows the exact bss entry to be specified. Only
7926 7927
 * one of the functions among cfg80211_connect_bss(), cfg80211_connect_result(),
 * cfg80211_connect_timeout(), and cfg80211_connect_done() should be called.
7928
 */
7929 7930 7931 7932 7933 7934 7935
static inline void
cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
			const u8 *req_ie, size_t req_ie_len,
			const u8 *resp_ie, size_t resp_ie_len,
			u16 status, gfp_t gfp)
{
	cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, resp_ie,
7936 7937
			     resp_ie_len, status, gfp,
			     NL80211_TIMEOUT_UNSPECIFIED);
7938 7939 7940 7941 7942 7943 7944 7945 7946 7947
}

/**
 * cfg80211_connect_timeout - notify cfg80211 of connection timeout
 *
 * @dev: network device
 * @bssid: the BSSID of the AP
 * @req_ie: association request IEs (maybe be %NULL)
 * @req_ie_len: association request IEs length
 * @gfp: allocation flags
7948
 * @timeout_reason: reason for connection timeout.
7949 7950 7951 7952 7953
 *
 * It should be called by the underlying driver whenever connect() has failed
 * in a sequence where no explicit authentication/association rejection was
 * received from the AP. This could happen, e.g., due to not being able to send
 * out the Authentication or Association Request frame or timing out while
7954 7955 7956
 * waiting for the response. Only one of the functions among
 * cfg80211_connect_bss(), cfg80211_connect_result(),
 * cfg80211_connect_timeout(), and cfg80211_connect_done() should be called.
7957 7958 7959
 */
static inline void
cfg80211_connect_timeout(struct net_device *dev, const u8 *bssid,
7960 7961
			 const u8 *req_ie, size_t req_ie_len, gfp_t gfp,
			 enum nl80211_timeout_reason timeout_reason)
7962 7963
{
	cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, NULL, 0, -1,
7964
			     gfp, timeout_reason);
7965
}
7966 7967

/**
7968
 * struct cfg80211_roam_info - driver initiated roaming information
7969 7970 7971 7972 7973
 *
 * @req_ie: association request IEs (maybe be %NULL)
 * @req_ie_len: association request IEs length
 * @resp_ie: association response IEs (may be %NULL)
 * @resp_ie_len: assoc response IEs length
7974
 * @fils: FILS related roaming information.
7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987
 * @valid_links: For MLO roaming, BIT mask of the new valid links is set.
 *	Otherwise zero.
 * @ap_mld_addr: For MLO roaming, MLD address of the new AP. Otherwise %NULL.
 * @links : For MLO roaming, contains new link info for the valid links set in
 *	@valid_links. For non-MLO roaming, links[0] contains the new AP info.
 * @links.addr: For MLO roaming, MAC address of the STA link. Otherwise %NULL.
 * @links.bssid: For MLO roaming, MAC address of the new AP link. For non-MLO
 *	roaming, links[0].bssid points to the BSSID of the new AP. May be
 *	%NULL if %links.bss is set.
 * @links.channel: the channel of the new AP.
 * @links.bss: For MLO roaming, entry of new bss to which STA link got
 *	roamed. For non-MLO roaming, links[0].bss points to entry of bss to
 *	which STA got roamed (may be %NULL if %links.bssid is set)
7988
 */
7989 7990 7991 7992 7993
struct cfg80211_roam_info {
	const u8 *req_ie;
	size_t req_ie_len;
	const u8 *resp_ie;
	size_t resp_ie_len;
7994
	struct cfg80211_fils_resp_params fils;
7995 7996 7997 7998 7999 8000 8001 8002 8003

	const u8 *ap_mld_addr;
	u16 valid_links;
	struct {
		const u8 *addr;
		const u8 *bssid;
		struct ieee80211_channel *channel;
		struct cfg80211_bss *bss;
	} links[IEEE80211_MLD_MAX_NUM_LINKS];
8004
};
8005

8006
/**
8007
 * cfg80211_roamed - notify cfg80211 of roaming
8008 8009
 *
 * @dev: network device
8010
 * @info: information about the new BSS. struct &cfg80211_roam_info.
8011 8012
 * @gfp: allocation flags
 *
8013 8014 8015 8016 8017 8018 8019
 * This function may be called with the driver passing either the BSSID of the
 * new AP or passing the bss entry to avoid a race in timeout of the bss entry.
 * It should be called by the underlying driver whenever it roamed from one AP
 * to another while connected. Drivers which have roaming implemented in
 * firmware should pass the bss entry to avoid a race in bss entry timeout where
 * the bss entry of the new AP is seen in the driver, but gets timed out by the
 * time it is accessed in __cfg80211_roamed() due to delay in scheduling
8020
 * rdev->event_work. In case of any failures, the reference is released
8021
 * either in cfg80211_roamed() or in __cfg80211_romed(), Otherwise, it will be
8022
 * released while disconnecting from the current bss.
8023
 */
8024 8025
void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
		     gfp_t gfp);
8026

8027 8028 8029 8030 8031
/**
 * cfg80211_port_authorized - notify cfg80211 of successful security association
 *
 * @dev: network device
 * @bssid: the BSSID of the AP
8032 8033
 * @td_bitmap: transition disable policy
 * @td_bitmap_len: Length of transition disable policy
8034 8035 8036 8037 8038 8039 8040 8041 8042 8043
 * @gfp: allocation flags
 *
 * This function should be called by a driver that supports 4 way handshake
 * offload after a security association was successfully established (i.e.,
 * the 4 way handshake was completed successfully). The call to this function
 * should be preceded with a call to cfg80211_connect_result(),
 * cfg80211_connect_done(), cfg80211_connect_bss() or cfg80211_roamed() to
 * indicate the 802.11 association.
 */
void cfg80211_port_authorized(struct net_device *dev, const u8 *bssid,
8044
			      const u8* td_bitmap, u8 td_bitmap_len, gfp_t gfp);
8045

8046 8047 8048 8049 8050 8051 8052
/**
 * cfg80211_disconnected - notify cfg80211 that connection was dropped
 *
 * @dev: network device
 * @ie: information elements of the deauth/disassoc frame (may be %NULL)
 * @ie_len: length of IEs
 * @reason: reason code for the disconnection, set it to 0 if unknown
8053
 * @locally_generated: disconnection was requested locally
8054 8055 8056 8057 8058 8059
 * @gfp: allocation flags
 *
 * After it calls this function, the driver should enter an idle state
 * and not try to connect to any AP any more.
 */
void cfg80211_disconnected(struct net_device *dev, u16 reason,
8060 8061
			   const u8 *ie, size_t ie_len,
			   bool locally_generated, gfp_t gfp);
8062

8063 8064
/**
 * cfg80211_ready_on_channel - notification of remain_on_channel start
8065
 * @wdev: wireless device
8066 8067 8068 8069 8070 8071
 * @cookie: the request cookie
 * @chan: The current channel (from remain_on_channel request)
 * @duration: Duration in milliseconds that the driver intents to remain on the
 *	channel
 * @gfp: allocation flags
 */
8072
void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
8073 8074 8075 8076 8077
			       struct ieee80211_channel *chan,
			       unsigned int duration, gfp_t gfp);

/**
 * cfg80211_remain_on_channel_expired - remain_on_channel duration expired
8078
 * @wdev: wireless device
8079 8080 8081 8082
 * @cookie: the request cookie
 * @chan: The current channel (from remain_on_channel request)
 * @gfp: allocation flags
 */
8083
void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
8084 8085
					struct ieee80211_channel *chan,
					gfp_t gfp);
8086

8087 8088 8089 8090 8091 8092 8093 8094 8095 8096
/**
 * cfg80211_tx_mgmt_expired - tx_mgmt duration expired
 * @wdev: wireless device
 * @cookie: the requested cookie
 * @chan: The current channel (from tx_mgmt request)
 * @gfp: allocation flags
 */
void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie,
			      struct ieee80211_channel *chan, gfp_t gfp);

8097 8098 8099 8100 8101 8102 8103
/**
 * cfg80211_sinfo_alloc_tid_stats - allocate per-tid statistics.
 *
 * @sinfo: the station information
 * @gfp: allocation flags
 */
int cfg80211_sinfo_alloc_tid_stats(struct station_info *sinfo, gfp_t gfp);
8104

8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117
/**
 * cfg80211_sinfo_release_content - release contents of station info
 * @sinfo: the station information
 *
 * Releases any potentially allocated sub-information of the station
 * information, but not the struct itself (since it's typically on
 * the stack.)
 */
static inline void cfg80211_sinfo_release_content(struct station_info *sinfo)
{
	kfree(sinfo->pertid);
}

8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128
/**
 * cfg80211_new_sta - notify userspace about station
 *
 * @dev: the netdev
 * @mac_addr: the station's address
 * @sinfo: the station information
 * @gfp: allocation flags
 */
void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
		      struct station_info *sinfo, gfp_t gfp);

8129 8130 8131
/**
 * cfg80211_del_sta_sinfo - notify userspace about deletion of a station
 * @dev: the netdev
8132
 * @mac_addr: the station's address. For MLD station, MLD address is used.
8133 8134 8135 8136 8137 8138
 * @sinfo: the station information/statistics
 * @gfp: allocation flags
 */
void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
			    struct station_info *sinfo, gfp_t gfp);

8139 8140 8141 8142
/**
 * cfg80211_del_sta - notify userspace about deletion of a station
 *
 * @dev: the netdev
8143
 * @mac_addr: the station's address. For MLD station, MLD address is used.
8144 8145
 * @gfp: allocation flags
 */
8146 8147 8148 8149 8150
static inline void cfg80211_del_sta(struct net_device *dev,
				    const u8 *mac_addr, gfp_t gfp)
{
	cfg80211_del_sta_sinfo(dev, mac_addr, NULL, gfp);
}
8151

8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170
/**
 * cfg80211_conn_failed - connection request failed notification
 *
 * @dev: the netdev
 * @mac_addr: the station's address
 * @reason: the reason for connection failure
 * @gfp: allocation flags
 *
 * Whenever a station tries to connect to an AP and if the station
 * could not connect to the AP as the AP has rejected the connection
 * for some reasons, this function is called.
 *
 * The reason for connection failure can be any of the value from
 * nl80211_connect_failed_reason enum
 */
void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
			  enum nl80211_connect_failed_reason reason,
			  gfp_t gfp);

8171 8172 8173 8174 8175
/**
 * struct cfg80211_rx_info - received management frame info
 *
 * @freq: Frequency on which the frame was received in kHz
 * @sig_dbm: signal strength in dBm, or 0 if unknown
8176 8177 8178
 * @have_link_id: indicates the frame was received on a link of
 *	an MLD, i.e. the @link_id field is valid
 * @link_id: the ID of the link the frame was received	on
8179 8180
 * @buf: Management frame (header + body)
 * @len: length of the frame data
8181
 * @flags: flags, as defined in &enum nl80211_rxmgmt_flags
8182 8183
 * @rx_tstamp: Hardware timestamp of frame RX in nanoseconds
 * @ack_tstamp: Hardware timestamp of ack TX in nanoseconds
8184 8185 8186 8187
 */
struct cfg80211_rx_info {
	int freq;
	int sig_dbm;
8188 8189
	bool have_link_id;
	u8 link_id;
8190 8191 8192
	const u8 *buf;
	size_t len;
	u32 flags;
8193 8194
	u64 rx_tstamp;
	u64 ack_tstamp;
8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212
};

/**
 * cfg80211_rx_mgmt_ext - management frame notification with extended info
 * @wdev: wireless device receiving the frame
 * @info: RX info as defined in struct cfg80211_rx_info
 *
 * This function is called whenever an Action frame is received for a station
 * mode interface, but is not processed in kernel.
 *
 * Return: %true if a user space application has registered for this frame.
 * For action frames, that makes it responsible for rejecting unrecognized
 * action frames; %false otherwise, in which case for action frames the
 * driver is responsible for rejecting the frame.
 */
bool cfg80211_rx_mgmt_ext(struct wireless_dev *wdev,
			  struct cfg80211_rx_info *info);

8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229
/**
 * cfg80211_rx_mgmt_khz - notification of received, unprocessed management frame
 * @wdev: wireless device receiving the frame
 * @freq: Frequency on which the frame was received in KHz
 * @sig_dbm: signal strength in dBm, or 0 if unknown
 * @buf: Management frame (header + body)
 * @len: length of the frame data
 * @flags: flags, as defined in enum nl80211_rxmgmt_flags
 *
 * This function is called whenever an Action frame is received for a station
 * mode interface, but is not processed in kernel.
 *
 * Return: %true if a user space application has registered for this frame.
 * For action frames, that makes it responsible for rejecting unrecognized
 * action frames; %false otherwise, in which case for action frames the
 * driver is responsible for rejecting the frame.
 */
8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243
static inline bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq,
					int sig_dbm, const u8 *buf, size_t len,
					u32 flags)
{
	struct cfg80211_rx_info info = {
		.freq = freq,
		.sig_dbm = sig_dbm,
		.buf = buf,
		.len = len,
		.flags = flags
	};

	return cfg80211_rx_mgmt_ext(wdev, &info);
}
8244

8245
/**
8246
 * cfg80211_rx_mgmt - notification of received, unprocessed management frame
8247
 * @wdev: wireless device receiving the frame
8248
 * @freq: Frequency on which the frame was received in MHz
8249
 * @sig_dbm: signal strength in dBm, or 0 if unknown
8250
 * @buf: Management frame (header + body)
8251
 * @len: length of the frame data
8252
 * @flags: flags, as defined in enum nl80211_rxmgmt_flags
8253
 *
8254 8255 8256 8257
 * This function is called whenever an Action frame is received for a station
 * mode interface, but is not processed in kernel.
 *
 * Return: %true if a user space application has registered for this frame.
8258 8259 8260
 * For action frames, that makes it responsible for rejecting unrecognized
 * action frames; %false otherwise, in which case for action frames the
 * driver is responsible for rejecting the frame.
8261
 */
8262 8263 8264 8265
static inline bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq,
				    int sig_dbm, const u8 *buf, size_t len,
				    u32 flags)
{
8266 8267 8268 8269 8270 8271 8272 8273 8274
	struct cfg80211_rx_info info = {
		.freq = MHZ_TO_KHZ(freq),
		.sig_dbm = sig_dbm,
		.buf = buf,
		.len = len,
		.flags = flags
	};

	return cfg80211_rx_mgmt_ext(wdev, &info);
8275
}
8276

8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308
/**
 * struct cfg80211_tx_status - TX status for management frame information
 *
 * @cookie: Cookie returned by cfg80211_ops::mgmt_tx()
 * @tx_tstamp: hardware TX timestamp in nanoseconds
 * @ack_tstamp: hardware ack RX timestamp in nanoseconds
 * @buf: Management frame (header + body)
 * @len: length of the frame data
 * @ack: Whether frame was acknowledged
 */
struct cfg80211_tx_status {
	u64 cookie;
	u64 tx_tstamp;
	u64 ack_tstamp;
	const u8 *buf;
	size_t len;
	bool ack;
};

/**
 * cfg80211_mgmt_tx_status_ext - TX status notification with extended info
 * @wdev: wireless device receiving the frame
 * @status: TX status data
 * @gfp: context flags
 *
 * This function is called whenever a management frame was requested to be
 * transmitted with cfg80211_ops::mgmt_tx() to report the TX status of the
 * transmission attempt with extended info.
 */
void cfg80211_mgmt_tx_status_ext(struct wireless_dev *wdev,
				 struct cfg80211_tx_status *status, gfp_t gfp);

8309
/**
8310
 * cfg80211_mgmt_tx_status - notification of TX status for management frame
8311
 * @wdev: wireless device receiving the frame
8312 8313
 * @cookie: Cookie returned by cfg80211_ops::mgmt_tx()
 * @buf: Management frame (header + body)
8314 8315 8316 8317
 * @len: length of the frame data
 * @ack: Whether frame was acknowledged
 * @gfp: context flags
 *
8318 8319
 * This function is called whenever a management frame was requested to be
 * transmitted with cfg80211_ops::mgmt_tx() to report the TX status of the
8320 8321
 * transmission attempt.
 */
8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334
static inline void cfg80211_mgmt_tx_status(struct wireless_dev *wdev,
					   u64 cookie, const u8 *buf,
					   size_t len, bool ack, gfp_t gfp)
{
	struct cfg80211_tx_status status = {
		.cookie = cookie,
		.buf = buf,
		.len = len,
		.ack = ack
	};

	cfg80211_mgmt_tx_status_ext(wdev, &status, gfp);
}
8335

8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352
/**
 * cfg80211_control_port_tx_status - notification of TX status for control
 *                                   port frames
 * @wdev: wireless device receiving the frame
 * @cookie: Cookie returned by cfg80211_ops::tx_control_port()
 * @buf: Data frame (header + body)
 * @len: length of the frame data
 * @ack: Whether frame was acknowledged
 * @gfp: context flags
 *
 * This function is called whenever a control port frame was requested to be
 * transmitted with cfg80211_ops::tx_control_port() to report the TX status of
 * the transmission attempt.
 */
void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie,
				     const u8 *buf, size_t len, bool ack,
				     gfp_t gfp);
8353

8354 8355 8356
/**
 * cfg80211_rx_control_port - notification about a received control port frame
 * @dev: The device the frame matched to
8357 8358 8359 8360 8361
 * @skb: The skbuf with the control port frame.  It is assumed that the skbuf
 *	is 802.3 formatted (with 802.3 header).  The skb can be non-linear.
 *	This function does not take ownership of the skb, so the caller is
 *	responsible for any cleanup.  The caller must also ensure that
 *	skb->protocol is set appropriately.
8362
 * @unencrypted: Whether the frame was received unencrypted
8363
 * @link_id: the link the frame was received on, -1 if not applicable or unknown
8364 8365 8366 8367 8368 8369 8370 8371 8372 8373
 *
 * This function is used to inform userspace about a received control port
 * frame.  It should only be used if userspace indicated it wants to receive
 * control port frames over nl80211.
 *
 * The frame is the data portion of the 802.3 or 802.11 data frame with all
 * network layer headers removed (e.g. the raw EAPoL frame).
 *
 * Return: %true if the frame was passed to userspace
 */
8374 8375
bool cfg80211_rx_control_port(struct net_device *dev, struct sk_buff *skb,
			      bool unencrypted, int link_id);
8376

8377 8378 8379 8380
/**
 * cfg80211_cqm_rssi_notify - connection quality monitoring rssi event
 * @dev: network device
 * @rssi_event: the triggered RSSI event
8381
 * @rssi_level: new RSSI level value or 0 if not available
8382 8383 8384 8385 8386 8387 8388
 * @gfp: context flags
 *
 * This function is called when a configured connection quality monitoring
 * rssi threshold reached event occurs.
 */
void cfg80211_cqm_rssi_notify(struct net_device *dev,
			      enum nl80211_cqm_rssi_threshold_event rssi_event,
8389
			      s32 rssi_level, gfp_t gfp);
8390

8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402
/**
 * cfg80211_cqm_pktloss_notify - notify userspace about packetloss to peer
 * @dev: network device
 * @peer: peer's MAC address
 * @num_packets: how many packets were lost -- should be a fixed threshold
 *	but probably no less than maybe 50, or maybe a throughput dependent
 *	threshold (to account for temporary interference)
 * @gfp: context flags
 */
void cfg80211_cqm_pktloss_notify(struct net_device *dev,
				 const u8 *peer, u32 num_packets, gfp_t gfp);

8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417
/**
 * cfg80211_cqm_txe_notify - TX error rate event
 * @dev: network device
 * @peer: peer's MAC address
 * @num_packets: how many packets were lost
 * @rate: % of packets which failed transmission
 * @intvl: interval (in s) over which the TX failure threshold was breached.
 * @gfp: context flags
 *
 * Notify userspace when configured % TX failures over number of packets in a
 * given interval is exceeded.
 */
void cfg80211_cqm_txe_notify(struct net_device *dev, const u8 *peer,
			     u32 num_packets, u32 rate, u32 intvl, gfp_t gfp);

8418 8419 8420 8421 8422 8423 8424 8425 8426
/**
 * cfg80211_cqm_beacon_loss_notify - beacon loss event
 * @dev: network device
 * @gfp: context flags
 *
 * Notify userspace about beacon loss from the connected AP.
 */
void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp);

8427
/**
8428
 * __cfg80211_radar_event - radar detection event
8429 8430
 * @wiphy: the wiphy
 * @chandef: chandef for the current channel
8431
 * @offchan: the radar has been detected on the offchannel chain
8432 8433 8434 8435
 * @gfp: context flags
 *
 * This function is called when a radar is detected on the current chanenl.
 */
8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448
void __cfg80211_radar_event(struct wiphy *wiphy,
			    struct cfg80211_chan_def *chandef,
			    bool offchan, gfp_t gfp);

static inline void
cfg80211_radar_event(struct wiphy *wiphy,
		     struct cfg80211_chan_def *chandef,
		     gfp_t gfp)
{
	__cfg80211_radar_event(wiphy, chandef, false, gfp);
}

static inline void
8449 8450 8451
cfg80211_background_radar_event(struct wiphy *wiphy,
				struct cfg80211_chan_def *chandef,
				gfp_t gfp)
8452 8453 8454
{
	__cfg80211_radar_event(wiphy, chandef, true, gfp);
}
8455

8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466 8467 8468 8469
/**
 * cfg80211_sta_opmode_change_notify - STA's ht/vht operation mode change event
 * @dev: network device
 * @mac: MAC address of a station which opmode got modified
 * @sta_opmode: station's current opmode value
 * @gfp: context flags
 *
 * Driver should call this function when station's opmode modified via action
 * frame.
 */
void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac,
				       struct sta_opmode_info *sta_opmode,
				       gfp_t gfp);

8470 8471 8472 8473 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484
/**
 * cfg80211_cac_event - Channel availability check (CAC) event
 * @netdev: network device
 * @chandef: chandef for the current channel
 * @event: type of event
 * @gfp: context flags
 *
 * This function is called when a Channel availability check (CAC) is finished
 * or aborted. This must be called to notify the completion of a CAC process,
 * also by full-MAC drivers.
 */
void cfg80211_cac_event(struct net_device *netdev,
			const struct cfg80211_chan_def *chandef,
			enum nl80211_radar_event event, gfp_t gfp);

8485
/**
8486
 * cfg80211_background_cac_abort - Channel Availability Check offchan abort event
8487 8488
 * @wiphy: the wiphy
 *
8489 8490
 * This function is called by the driver when a Channel Availability Check
 * (CAC) is aborted by a offchannel dedicated chain.
8491
 */
8492
void cfg80211_background_cac_abort(struct wiphy *wiphy);
8493

8494 8495 8496 8497 8498
/**
 * cfg80211_gtk_rekey_notify - notify userspace about driver rekeying
 * @dev: network device
 * @bssid: BSSID of AP (to avoid races)
 * @replay_ctr: new replay counter
Johannes Berg's avatar
Johannes Berg committed
8499
 * @gfp: allocation flags
8500 8501 8502 8503
 */
void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
			       const u8 *replay_ctr, gfp_t gfp);

8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514
/**
 * cfg80211_pmksa_candidate_notify - notify about PMKSA caching candidate
 * @dev: network device
 * @index: candidate index (the smaller the index, the higher the priority)
 * @bssid: BSSID of AP
 * @preauth: Whether AP advertises support for RSN pre-authentication
 * @gfp: allocation flags
 */
void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
				     const u8 *bssid, bool preauth, gfp_t gfp);

8515 8516 8517 8518 8519 8520 8521 8522 8523
/**
 * cfg80211_rx_spurious_frame - inform userspace about a spurious frame
 * @dev: The device the frame matched to
 * @addr: the transmitter address
 * @gfp: context flags
 *
 * This function is used in AP mode (only!) to inform userspace that
 * a spurious class 3 frame was received, to be able to deauth the
 * sender.
8524
 * Return: %true if the frame was passed to userspace (or this failed
8525 8526 8527 8528 8529
 * for a reason other than not having a subscription.)
 */
bool cfg80211_rx_spurious_frame(struct net_device *dev,
				const u8 *addr, gfp_t gfp);

8530 8531 8532 8533 8534 8535 8536 8537 8538 8539
/**
 * cfg80211_rx_unexpected_4addr_frame - inform about unexpected WDS frame
 * @dev: The device the frame matched to
 * @addr: the transmitter address
 * @gfp: context flags
 *
 * This function is used in AP mode (only!) to inform userspace that
 * an associated station sent a 4addr frame but that wasn't expected.
 * It is allowed and desirable to send this event only once for each
 * station to avoid event flooding.
8540
 * Return: %true if the frame was passed to userspace (or this failed
8541 8542 8543 8544 8545
 * for a reason other than not having a subscription.)
 */
bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
					const u8 *addr, gfp_t gfp);

8546 8547 8548 8549 8550 8551
/**
 * cfg80211_probe_status - notify userspace about probe status
 * @dev: the device the probe was sent on
 * @addr: the address of the peer
 * @cookie: the cookie filled in @probe_client previously
 * @acked: indicates whether probe was acked or not
8552 8553
 * @ack_signal: signal strength (in dBm) of the ACK frame.
 * @is_valid_ack_signal: indicates the ack_signal is valid or not.
8554 8555 8556
 * @gfp: allocation flags
 */
void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
8557 8558
			   u64 cookie, bool acked, s32 ack_signal,
			   bool is_valid_ack_signal, gfp_t gfp);
8559

8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574
/**
 * cfg80211_report_obss_beacon_khz - report beacon from other APs
 * @wiphy: The wiphy that received the beacon
 * @frame: the frame
 * @len: length of the frame
 * @freq: frequency the frame was received on in KHz
 * @sig_dbm: signal strength in dBm, or 0 if unknown
 *
 * Use this function to report to userspace when a beacon was
 * received. It is not useful to call this when there is no
 * netdev that is in AP/GO mode.
 */
void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame,
				     size_t len, int freq, int sig_dbm);

8575 8576 8577 8578 8579 8580
/**
 * cfg80211_report_obss_beacon - report beacon from other APs
 * @wiphy: The wiphy that received the beacon
 * @frame: the frame
 * @len: length of the frame
 * @freq: frequency the frame was received on
8581
 * @sig_dbm: signal strength in dBm, or 0 if unknown
8582 8583 8584 8585 8586
 *
 * Use this function to report to userspace when a beacon was
 * received. It is not useful to call this when there is no
 * netdev that is in AP/GO mode.
 */
8587 8588 8589 8590 8591 8592 8593
static inline void cfg80211_report_obss_beacon(struct wiphy *wiphy,
					       const u8 *frame, size_t len,
					       int freq, int sig_dbm)
{
	cfg80211_report_obss_beacon_khz(wiphy, frame, len, MHZ_TO_KHZ(freq),
					sig_dbm);
}
8594

8595
/**
8596
 * cfg80211_reg_can_beacon - check if beaconing is allowed
8597
 * @wiphy: the wiphy
8598
 * @chandef: the channel definition
8599
 * @iftype: interface type
8600
 *
8601 8602
 * Return: %true if there is no secondary channel or the secondary channel(s)
 * can be used for beaconing (i.e. is not a radar channel etc.)
8603
 */
8604
bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
8605 8606
			     struct cfg80211_chan_def *chandef,
			     enum nl80211_iftype iftype);
8607

8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618
/**
 * cfg80211_reg_can_beacon_relax - check if beaconing is allowed with relaxation
 * @wiphy: the wiphy
 * @chandef: the channel definition
 * @iftype: interface type
 *
 * Return: %true if there is no secondary channel or the secondary channel(s)
 * can be used for beaconing (i.e. is not a radar channel etc.). This version
 * also checks if IR-relaxation conditions apply, to allow beaconing under
 * more permissive conditions.
 *
8619
 * Requires the wiphy mutex to be held.
8620 8621 8622 8623 8624
 */
bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
				   struct cfg80211_chan_def *chandef,
				   enum nl80211_iftype iftype);

8625 8626 8627
/*
 * cfg80211_ch_switch_notify - update wdev channel and notify userspace
 * @dev: the device which switched channels
8628
 * @chandef: the new channel definition
8629
 * @link_id: the link ID for MLO, must be 0 for non-MLO
8630
 * @punct_bitmap: the new puncturing bitmap
8631
 *
8632
 * Caller must hold wiphy mutex, therefore must only be called from sleepable
8633
 * driver context!
8634
 */
8635
void cfg80211_ch_switch_notify(struct net_device *dev,
8636
			       struct cfg80211_chan_def *chandef,
8637
			       unsigned int link_id, u16 punct_bitmap);
8638

8639 8640 8641 8642
/*
 * cfg80211_ch_switch_started_notify - notify channel switch start
 * @dev: the device on which the channel switch started
 * @chandef: the future channel definition
8643
 * @link_id: the link ID for MLO, must be 0 for non-MLO
8644
 * @count: the number of TBTTs until the channel switch happens
8645
 * @quiet: whether or not immediate quiet was requested by the AP
8646
 * @punct_bitmap: the future puncturing bitmap
8647 8648 8649 8650 8651 8652 8653
 *
 * Inform the userspace about the channel switch that has just
 * started, so that it can take appropriate actions (eg. starting
 * channel switch on other vifs), if necessary.
 */
void cfg80211_ch_switch_started_notify(struct net_device *dev,
				       struct cfg80211_chan_def *chandef,
8654
				       unsigned int link_id, u8 count,
8655
				       bool quiet, u16 punct_bitmap);
8656

8657 8658 8659 8660 8661 8662 8663 8664 8665
/**
 * ieee80211_operating_class_to_band - convert operating class to band
 *
 * @operating_class: the operating class to convert
 * @band: band pointer to fill
 *
 * Returns %true if the conversion was successful, %false otherwise.
 */
bool ieee80211_operating_class_to_band(u8 operating_class,
8666
				       enum nl80211_band *band);
8667

8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678
/**
 * ieee80211_chandef_to_operating_class - convert chandef to operation class
 *
 * @chandef: the chandef to convert
 * @op_class: a pointer to the resulting operating class
 *
 * Returns %true if the conversion was successful, %false otherwise.
 */
bool ieee80211_chandef_to_operating_class(struct cfg80211_chan_def *chandef,
					  u8 *op_class);

8679 8680 8681 8682 8683 8684 8685 8686 8687 8688 8689 8690 8691
/**
 * ieee80211_chandef_to_khz - convert chandef to frequency in KHz
 *
 * @chandef: the chandef to convert
 *
 * Returns the center frequency of chandef (1st segment) in KHz.
 */
static inline u32
ieee80211_chandef_to_khz(const struct cfg80211_chan_def *chandef)
{
	return MHZ_TO_KHZ(chandef->center_freq1) + chandef->freq1_offset;
}

8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 8704 8705 8706 8707 8708 8709 8710
/*
 * cfg80211_tdls_oper_request - request userspace to perform TDLS operation
 * @dev: the device on which the operation is requested
 * @peer: the MAC address of the peer device
 * @oper: the requested TDLS operation (NL80211_TDLS_SETUP or
 *	NL80211_TDLS_TEARDOWN)
 * @reason_code: the reason code for teardown request
 * @gfp: allocation flags
 *
 * This function is used to request userspace to perform TDLS operation that
 * requires knowledge of keys, i.e., link setup or teardown when the AP
 * connection uses encryption. This is optional mechanism for the driver to use
 * if it can automatically determine when a TDLS link could be useful (e.g.,
 * based on traffic and signal strength for a peer).
 */
void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
				enum nl80211_tdls_operation oper,
				u16 reason_code, gfp_t gfp);

8711 8712 8713 8714 8715 8716
/*
 * cfg80211_calculate_bitrate - calculate actual bitrate (in 100Kbps units)
 * @rate: given rate_info to calculate bitrate from
 *
 * return 0 if MCS index >= 32
 */
8717
u32 cfg80211_calculate_bitrate(struct rate_info *rate);
8718

8719 8720 8721 8722
/**
 * cfg80211_unregister_wdev - remove the given wdev
 * @wdev: struct wireless_dev to remove
 *
8723 8724 8725 8726 8727
 * This function removes the device so it can no longer be used. It is necessary
 * to call this function even when cfg80211 requests the removal of the device
 * by calling the del_virtual_intf() callback. The function must also be called
 * when the driver wishes to unregister the wdev, e.g. when the hardware device
 * is unbound from the driver.
8728
 *
8729
 * Requires the RTNL and wiphy mutex to be held.
8730 8731 8732
 */
void cfg80211_unregister_wdev(struct wireless_dev *wdev);

8733 8734 8735 8736 8737 8738 8739 8740
/**
 * cfg80211_register_netdevice - register the given netdev
 * @dev: the netdev to register
 *
 * Note: In contexts coming from cfg80211 callbacks, you must call this rather
 * than register_netdevice(), unregister_netdev() is impossible as the RTNL is
 * held. Otherwise, both register_netdevice() and register_netdev() are usable
 * instead as well.
8741 8742
 *
 * Requires the RTNL and wiphy mutex to be held.
8743 8744 8745 8746 8747 8748 8749 8750 8751 8752 8753
 */
int cfg80211_register_netdevice(struct net_device *dev);

/**
 * cfg80211_unregister_netdevice - unregister the given netdev
 * @dev: the netdev to register
 *
 * Note: In contexts coming from cfg80211 callbacks, you must call this rather
 * than unregister_netdevice(), unregister_netdev() is impossible as the RTNL
 * is held. Otherwise, both unregister_netdevice() and unregister_netdev() are
 * usable instead as well.
8754 8755
 *
 * Requires the RTNL and wiphy mutex to be held.
8756 8757 8758
 */
static inline void cfg80211_unregister_netdevice(struct net_device *dev)
{
8759
#if IS_ENABLED(CONFIG_CFG80211)
8760
	cfg80211_unregister_wdev(dev->ieee80211_ptr);
8761
#endif
8762 8763
}

8764
/**
8765
 * struct cfg80211_ft_event_params - FT Information Elements
8766 8767 8768 8769 8770 8771 8772 8773 8774 8775 8776 8777 8778 8779 8780 8781 8782 8783 8784 8785 8786 8787
 * @ies: FT IEs
 * @ies_len: length of the FT IE in bytes
 * @target_ap: target AP's MAC address
 * @ric_ies: RIC IE
 * @ric_ies_len: length of the RIC IE in bytes
 */
struct cfg80211_ft_event_params {
	const u8 *ies;
	size_t ies_len;
	const u8 *target_ap;
	const u8 *ric_ies;
	size_t ric_ies_len;
};

/**
 * cfg80211_ft_event - notify userspace about FT IE and RIC IE
 * @netdev: network device
 * @ft_event: IE information
 */
void cfg80211_ft_event(struct net_device *netdev,
		       struct cfg80211_ft_event_params *ft_event);

8788 8789 8790 8791 8792 8793 8794 8795 8796 8797 8798 8799
/**
 * cfg80211_get_p2p_attr - find and copy a P2P attribute from IE buffer
 * @ies: the input IE buffer
 * @len: the input length
 * @attr: the attribute ID to find
 * @buf: output buffer, can be %NULL if the data isn't needed, e.g.
 *	if the function is only called to get the needed buffer size
 * @bufsize: size of the output buffer
 *
 * The function finds a given P2P attribute in the (vendor) IEs and
 * copies its contents to the given buffer.
 *
8800 8801 8802
 * Return: A negative error code (-%EILSEQ or -%ENOENT) if the data is
 * malformed or the attribute can't be found (respectively), or the
 * length of the found attribute (which can be zero).
8803
 */
8804 8805 8806
int cfg80211_get_p2p_attr(const u8 *ies, unsigned int len,
			  enum ieee80211_p2p_attr_id attr,
			  u8 *buf, unsigned int bufsize);
8807

8808 8809 8810 8811 8812
/**
 * ieee80211_ie_split_ric - split an IE buffer according to ordering (with RIC)
 * @ies: the IE buffer
 * @ielen: the length of the IE buffer
 * @ids: an array with element IDs that are allowed before
8813 8814
 *	the split. A WLAN_EID_EXTENSION value means that the next
 *	EID in the list is a sub-element of the EXTENSION IE.
8815 8816 8817 8818 8819 8820 8821 8822 8823 8824 8825 8826 8827 8828 8829 8830 8831 8832 8833 8834 8835 8836 8837 8838 8839 8840 8841 8842 8843 8844
 * @n_ids: the size of the element ID array
 * @after_ric: array IE types that come after the RIC element
 * @n_after_ric: size of the @after_ric array
 * @offset: offset where to start splitting in the buffer
 *
 * This function splits an IE buffer by updating the @offset
 * variable to point to the location where the buffer should be
 * split.
 *
 * It assumes that the given IE buffer is well-formed, this
 * has to be guaranteed by the caller!
 *
 * It also assumes that the IEs in the buffer are ordered
 * correctly, if not the result of using this function will not
 * be ordered correctly either, i.e. it does no reordering.
 *
 * The function returns the offset where the next part of the
 * buffer starts, which may be @ielen if the entire (remainder)
 * of the buffer should be used.
 */
size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
			      const u8 *ids, int n_ids,
			      const u8 *after_ric, int n_after_ric,
			      size_t offset);

/**
 * ieee80211_ie_split - split an IE buffer according to ordering
 * @ies: the IE buffer
 * @ielen: the length of the IE buffer
 * @ids: an array with element IDs that are allowed before
8845 8846
 *	the split. A WLAN_EID_EXTENSION value means that the next
 *	EID in the list is a sub-element of the EXTENSION IE.
8847 8848 8849 8850 8851 8852 8853 8854 8855 8856 8857 8858 8859 8860 8861 8862 8863 8864
 * @n_ids: the size of the element ID array
 * @offset: offset where to start splitting in the buffer
 *
 * This function splits an IE buffer by updating the @offset
 * variable to point to the location where the buffer should be
 * split.
 *
 * It assumes that the given IE buffer is well-formed, this
 * has to be guaranteed by the caller!
 *
 * It also assumes that the IEs in the buffer are ordered
 * correctly, if not the result of using this function will not
 * be ordered correctly either, i.e. it does no reordering.
 *
 * The function returns the offset where the next part of the
 * buffer starts, which may be @ielen if the entire (remainder)
 * of the buffer should be used.
 */
8865 8866 8867 8868 8869
static inline size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
					const u8 *ids, int n_ids, size_t offset)
{
	return ieee80211_ie_split_ric(ies, ielen, ids, n_ids, NULL, 0, offset);
}
8870

8871 8872 8873 8874 8875 8876 8877 8878 8879 8880 8881 8882
/**
 * ieee80211_fragment_element - fragment the last element in skb
 * @skb: The skbuf that the element was added to
 * @len_pos: Pointer to length of the element to fragment
 * @frag_id: The element ID to use for fragments
 *
 * This function fragments all data after @len_pos, adding fragmentation
 * elements with the given ID as appropriate. The SKB will grow in size
 * accordingly.
 */
void ieee80211_fragment_element(struct sk_buff *skb, u8 *len_pos, u8 frag_id);

8883 8884 8885 8886 8887 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897
/**
 * cfg80211_report_wowlan_wakeup - report wakeup from WoWLAN
 * @wdev: the wireless device reporting the wakeup
 * @wakeup: the wakeup report
 * @gfp: allocation flags
 *
 * This function reports that the given device woke up. If it
 * caused the wakeup, report the reason(s), otherwise you may
 * pass %NULL as the @wakeup parameter to advertise that something
 * else caused the wakeup.
 */
void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
				   struct cfg80211_wowlan_wakeup *wakeup,
				   gfp_t gfp);

8898 8899 8900 8901
/**
 * cfg80211_crit_proto_stopped() - indicate critical protocol stopped by driver.
 *
 * @wdev: the wireless device for which critical protocol is stopped.
8902
 * @gfp: allocation flags
8903 8904 8905 8906 8907 8908 8909
 *
 * This function can be called by the driver to indicate it has reverted
 * operation back to normal. One reason could be that the duration given
 * by .crit_proto_start() has expired.
 */
void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp);

8910 8911 8912 8913 8914 8915 8916 8917
/**
 * ieee80211_get_num_supported_channels - get number of channels device has
 * @wiphy: the wiphy
 *
 * Return: the number of channels supported by the device.
 */
unsigned int ieee80211_get_num_supported_channels(struct wiphy *wiphy);

8918 8919 8920 8921
/**
 * cfg80211_check_combinations - check interface combinations
 *
 * @wiphy: the wiphy
8922
 * @params: the interface combinations parameter
8923 8924 8925 8926 8927 8928
 *
 * This function can be called by the driver to check whether a
 * combination of interfaces and their types are allowed according to
 * the interface combinations.
 */
int cfg80211_check_combinations(struct wiphy *wiphy,
8929
				struct iface_combination_params *params);
8930

8931 8932 8933 8934
/**
 * cfg80211_iter_combinations - iterate over matching combinations
 *
 * @wiphy: the wiphy
8935
 * @params: the interface combinations parameter
8936 8937 8938 8939 8940 8941 8942 8943
 * @iter: function to call for each matching combination
 * @data: pointer to pass to iter function
 *
 * This function can be called by the driver to check what possible
 * combinations it fits in at a given moment, e.g. for channel switching
 * purposes.
 */
int cfg80211_iter_combinations(struct wiphy *wiphy,
8944
			       struct iface_combination_params *params,
8945 8946 8947 8948
			       void (*iter)(const struct ieee80211_iface_combination *c,
					    void *data),
			       void *data);

8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963
/*
 * cfg80211_stop_iface - trigger interface disconnection
 *
 * @wiphy: the wiphy
 * @wdev: wireless device
 * @gfp: context flags
 *
 * Trigger interface to be stopped as if AP was stopped, IBSS/mesh left, STA
 * disconnected.
 *
 * Note: This doesn't need any locks and is asynchronous.
 */
void cfg80211_stop_iface(struct wiphy *wiphy, struct wireless_dev *wdev,
			 gfp_t gfp);

8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977
/**
 * cfg80211_shutdown_all_interfaces - shut down all interfaces for a wiphy
 * @wiphy: the wiphy to shut down
 *
 * This function shuts down all interfaces belonging to this wiphy by
 * calling dev_close() (and treating non-netdev interfaces as needed).
 * It shouldn't really be used unless there are some fatal device errors
 * that really can't be recovered in any other way.
 *
 * Callers must hold the RTNL and be able to deal with callbacks into
 * the driver while the function is running.
 */
void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy);

8978 8979 8980 8981 8982 8983 8984 8985 8986 8987 8988 8989 8990 8991 8992 8993 8994 8995 8996 8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013
/**
 * wiphy_ext_feature_set - set the extended feature flag
 *
 * @wiphy: the wiphy to modify.
 * @ftidx: extended feature bit index.
 *
 * The extended features are flagged in multiple bytes (see
 * &struct wiphy.@ext_features)
 */
static inline void wiphy_ext_feature_set(struct wiphy *wiphy,
					 enum nl80211_ext_feature_index ftidx)
{
	u8 *ft_byte;

	ft_byte = &wiphy->ext_features[ftidx / 8];
	*ft_byte |= BIT(ftidx % 8);
}

/**
 * wiphy_ext_feature_isset - check the extended feature flag
 *
 * @wiphy: the wiphy to modify.
 * @ftidx: extended feature bit index.
 *
 * The extended features are flagged in multiple bytes (see
 * &struct wiphy.@ext_features)
 */
static inline bool
wiphy_ext_feature_isset(struct wiphy *wiphy,
			enum nl80211_ext_feature_index ftidx)
{
	u8 ft_byte;

	ft_byte = wiphy->ext_features[ftidx / 8];
	return (ft_byte & BIT(ftidx % 8)) != 0;
}
9014

9015 9016 9017 9018 9019 9020 9021 9022
/**
 * cfg80211_free_nan_func - free NAN function
 * @f: NAN function that should be freed
 *
 * Frees all the NAN function and all it's allocated members.
 */
void cfg80211_free_nan_func(struct cfg80211_nan_func *f);

9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 9059
/**
 * struct cfg80211_nan_match_params - NAN match parameters
 * @type: the type of the function that triggered a match. If it is
 *	 %NL80211_NAN_FUNC_SUBSCRIBE it means that we replied to a subscriber.
 *	 If it is %NL80211_NAN_FUNC_PUBLISH, it means that we got a discovery
 *	 result.
 *	 If it is %NL80211_NAN_FUNC_FOLLOW_UP, we received a follow up.
 * @inst_id: the local instance id
 * @peer_inst_id: the instance id of the peer's function
 * @addr: the MAC address of the peer
 * @info_len: the length of the &info
 * @info: the Service Specific Info from the peer (if any)
 * @cookie: unique identifier of the corresponding function
 */
struct cfg80211_nan_match_params {
	enum nl80211_nan_function_type type;
	u8 inst_id;
	u8 peer_inst_id;
	const u8 *addr;
	u8 info_len;
	const u8 *info;
	u64 cookie;
};

/**
 * cfg80211_nan_match - report a match for a NAN function.
 * @wdev: the wireless device reporting the match
 * @match: match notification parameters
 * @gfp: allocation flags
 *
 * This function reports that the a NAN function had a match. This
 * can be a subscribe that had a match or a solicited publish that
 * was sent. It can also be a follow up that was received.
 */
void cfg80211_nan_match(struct wireless_dev *wdev,
			struct cfg80211_nan_match_params *match, gfp_t gfp);

9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075
/**
 * cfg80211_nan_func_terminated - notify about NAN function termination.
 *
 * @wdev: the wireless device reporting the match
 * @inst_id: the local instance id
 * @reason: termination reason (one of the NL80211_NAN_FUNC_TERM_REASON_*)
 * @cookie: unique NAN function identifier
 * @gfp: allocation flags
 *
 * This function reports that the a NAN function is terminated.
 */
void cfg80211_nan_func_terminated(struct wireless_dev *wdev,
				  u8 inst_id,
				  enum nl80211_nan_func_term_reason reason,
				  u64 cookie, gfp_t gfp);

9076 9077 9078
/* ethtool helper */
void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info);

9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089
/**
 * cfg80211_external_auth_request - userspace request for authentication
 * @netdev: network device
 * @params: External authentication parameters
 * @gfp: allocation flags
 * Returns: 0 on success, < 0 on error
 */
int cfg80211_external_auth_request(struct net_device *netdev,
				   struct cfg80211_external_auth_params *params,
				   gfp_t gfp);

9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114
/**
 * cfg80211_pmsr_report - report peer measurement result data
 * @wdev: the wireless device reporting the measurement
 * @req: the original measurement request
 * @result: the result data
 * @gfp: allocation flags
 */
void cfg80211_pmsr_report(struct wireless_dev *wdev,
			  struct cfg80211_pmsr_request *req,
			  struct cfg80211_pmsr_result *result,
			  gfp_t gfp);

/**
 * cfg80211_pmsr_complete - report peer measurement completed
 * @wdev: the wireless device reporting the measurement
 * @req: the original measurement request
 * @gfp: allocation flags
 *
 * Report that the entire measurement completed, after this
 * the request pointer will no longer be valid.
 */
void cfg80211_pmsr_complete(struct wireless_dev *wdev,
			    struct cfg80211_pmsr_request *req,
			    gfp_t gfp);

9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129
/**
 * cfg80211_iftype_allowed - check whether the interface can be allowed
 * @wiphy: the wiphy
 * @iftype: interface type
 * @is_4addr: use_4addr flag, must be '0' when check_swif is '1'
 * @check_swif: check iftype against software interfaces
 *
 * Check whether the interface is allowed to operate; additionally, this API
 * can be used to check iftype against the software interfaces when
 * check_swif is '1'.
 */
bool cfg80211_iftype_allowed(struct wiphy *wiphy, enum nl80211_iftype iftype,
			     bool is_4addr, u8 check_swif);


9130 9131
/**
 * cfg80211_assoc_comeback - notification of association that was
9132
 * temporarily rejected with a comeback
9133
 * @netdev: network device
9134
 * @ap_addr: AP (MLD) address that rejected the association
9135 9136 9137 9138 9139
 * @timeout: timeout interval value TUs.
 *
 * this function may sleep. the caller must hold the corresponding wdev's mutex.
 */
void cfg80211_assoc_comeback(struct net_device *netdev,
9140
			     const u8 *ap_addr, u32 timeout);
9141

9142 9143 9144 9145 9146
/* Logging, debugging and troubleshooting/diagnostic helpers. */

/* wiphy_printk helpers, similar to dev_printk */

#define wiphy_printk(level, wiphy, format, args...)		\
9147
	dev_printk(level, &(wiphy)->dev, format, ##args)
9148
#define wiphy_emerg(wiphy, format, args...)			\
9149
	dev_emerg(&(wiphy)->dev, format, ##args)
9150
#define wiphy_alert(wiphy, format, args...)			\
9151
	dev_alert(&(wiphy)->dev, format, ##args)
9152
#define wiphy_crit(wiphy, format, args...)			\
9153
	dev_crit(&(wiphy)->dev, format, ##args)
9154
#define wiphy_err(wiphy, format, args...)			\
9155
	dev_err(&(wiphy)->dev, format, ##args)
9156
#define wiphy_warn(wiphy, format, args...)			\
9157
	dev_warn(&(wiphy)->dev, format, ##args)
9158
#define wiphy_notice(wiphy, format, args...)			\
9159
	dev_notice(&(wiphy)->dev, format, ##args)
9160
#define wiphy_info(wiphy, format, args...)			\
9161
	dev_info(&(wiphy)->dev, format, ##args)
9162 9163
#define wiphy_info_once(wiphy, format, args...)			\
	dev_info_once(&(wiphy)->dev, format, ##args)
9164

9165 9166 9167 9168 9169
#define wiphy_err_ratelimited(wiphy, format, args...)		\
	dev_err_ratelimited(&(wiphy)->dev, format, ##args)
#define wiphy_warn_ratelimited(wiphy, format, args...)		\
	dev_warn_ratelimited(&(wiphy)->dev, format, ##args)

9170
#define wiphy_debug(wiphy, format, args...)			\
9171
	wiphy_printk(KERN_DEBUG, wiphy, format, ##args)
9172

9173
#define wiphy_dbg(wiphy, format, args...)			\
9174
	dev_dbg(&(wiphy)->dev, format, ##args)
9175 9176 9177 9178 9179 9180 9181 9182

#if defined(VERBOSE_DEBUG)
#define wiphy_vdbg	wiphy_dbg
#else
#define wiphy_vdbg(wiphy, format, args...)				\
({									\
	if (0)								\
		wiphy_printk(KERN_DEBUG, wiphy, format, ##args);	\
9183
	0;								\
9184 9185 9186 9187 9188 9189 9190 9191 9192 9193 9194
})
#endif

/*
 * wiphy_WARN() acts like wiphy_printk(), but with the key difference
 * of using a WARN/WARN_ON to get the message out, including the
 * file/line information and a backtrace.
 */
#define wiphy_WARN(wiphy, format, args...)			\
	WARN(1, "wiphy: %s\n" format, wiphy_name(wiphy), ##args);

9195 9196 9197 9198 9199 9200 9201 9202 9203 9204
/**
 * cfg80211_update_owe_info_event - Notify the peer's OWE info to user space
 * @netdev: network device
 * @owe_info: peer's owe info
 * @gfp: allocation flags
 */
void cfg80211_update_owe_info_event(struct net_device *netdev,
				    struct cfg80211_update_owe_info *owe_info,
				    gfp_t gfp);

9205 9206 9207 9208 9209 9210
/**
 * cfg80211_bss_flush - resets all the scan entries
 * @wiphy: the wiphy
 */
void cfg80211_bss_flush(struct wiphy *wiphy);

9211 9212 9213 9214 9215 9216 9217
/**
 * cfg80211_bss_color_notify - notify about bss color event
 * @dev: network device
 * @cmd: the actual event we want to notify
 * @count: the number of TBTTs until the color change happens
 * @color_bitmap: representations of the colors that the local BSS is aware of
 */
9218
int cfg80211_bss_color_notify(struct net_device *dev,
9219 9220 9221 9222 9223 9224 9225 9226 9227
			      enum nl80211_commands cmd, u8 count,
			      u64 color_bitmap);

/**
 * cfg80211_obss_color_collision_notify - notify about bss color collision
 * @dev: network device
 * @color_bitmap: representations of the colors that the local BSS is aware of
 */
static inline int cfg80211_obss_color_collision_notify(struct net_device *dev,
9228
						       u64 color_bitmap)
9229
{
9230
	return cfg80211_bss_color_notify(dev, NL80211_CMD_OBSS_COLOR_COLLISION,
9231 9232 9233 9234 9235 9236 9237 9238 9239 9240 9241 9242 9243
					 0, color_bitmap);
}

/**
 * cfg80211_color_change_started_notify - notify color change start
 * @dev: the device on which the color is switched
 * @count: the number of TBTTs until the color change happens
 *
 * Inform the userspace about the color change that has started.
 */
static inline int cfg80211_color_change_started_notify(struct net_device *dev,
						       u8 count)
{
9244
	return cfg80211_bss_color_notify(dev, NL80211_CMD_COLOR_CHANGE_STARTED,
9245 9246 9247 9248 9249 9250 9251 9252 9253 9254 9255
					 count, 0);
}

/**
 * cfg80211_color_change_aborted_notify - notify color change abort
 * @dev: the device on which the color is switched
 *
 * Inform the userspace about the color change that has aborted.
 */
static inline int cfg80211_color_change_aborted_notify(struct net_device *dev)
{
9256
	return cfg80211_bss_color_notify(dev, NL80211_CMD_COLOR_CHANGE_ABORTED,
9257 9258 9259 9260 9261 9262 9263 9264 9265 9266 9267
					 0, 0);
}

/**
 * cfg80211_color_change_notify - notify color change completion
 * @dev: the device on which the color was switched
 *
 * Inform the userspace about the color change that has completed.
 */
static inline int cfg80211_color_change_notify(struct net_device *dev)
{
9268
	return cfg80211_bss_color_notify(dev,
9269 9270 9271 9272
					 NL80211_CMD_COLOR_CHANGE_COMPLETED,
					 0, 0);
}

9273 9274 9275 9276 9277 9278 9279 9280 9281 9282 9283 9284
/**
 * cfg80211_valid_disable_subchannel_bitmap - validate puncturing bitmap
 * @bitmap: bitmap to be validated
 * @chandef: channel definition
 *
 * Validate the puncturing bitmap.
 *
 * Return: %true if the bitmap is valid. %false otherwise.
 */
bool cfg80211_valid_disable_subchannel_bitmap(u16 *bitmap,
					      const struct cfg80211_chan_def *chandef);

9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 9295 9296 9297
/**
 * cfg80211_links_removed - Notify about removed STA MLD setup links.
 * @dev: network device.
 * @link_mask: BIT mask of removed STA MLD setup link IDs.
 *
 * Inform cfg80211 and the userspace about removed STA MLD setup links due to
 * AP MLD removing the corresponding affiliated APs with Multi-Link
 * reconfiguration. Note that it's not valid to remove all links, in this
 * case disconnect instead.
 * Also note that the wdev mutex must be held.
 */
void cfg80211_links_removed(struct net_device *dev, u16 link_mask);

9298
#endif /* __NET_CFG80211_H */