cfg80211.h 202 KB
Newer Older
1
2
#ifndef __NET_CFG80211_H
#define __NET_CFG80211_H
Johannes Berg's avatar
Johannes Berg committed
3
4
5
/*
 * 802.11 device and configuration interface
 *
6
 * Copyright 2006-2010	Johannes Berg <johannes@sipsolutions.net>
7
 * Copyright 2013-2014 Intel Mobile Communications GmbH
8
 * Copyright 2015-2016	Intel Deutschland GmbH
Johannes Berg's avatar
Johannes Berg committed
9
10
11
12
13
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
14

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>
Johannes Berg's avatar
Johannes Berg committed
25
26
#include <net/regulatory.h>

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

64
65
struct wiphy;

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

70
/**
Johannes Berg's avatar
Johannes Berg committed
71
72
73
74
75
 * enum ieee80211_channel_flags - channel flags
 *
 * Channel flags set by the regulatory control code.
 *
 * @IEEE80211_CHAN_DISABLED: This channel is disabled.
76
77
 * @IEEE80211_CHAN_NO_IR: do not initiate radiation, this includes
 * 	sending probe requests or beaconing.
Johannes Berg's avatar
Johannes Berg committed
78
 * @IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
79
 * @IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel
Johannes Berg's avatar
Johannes Berg committed
80
 * 	is not permitted.
81
 * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel
Johannes Berg's avatar
Johannes Berg committed
82
 * 	is not permitted.
83
 * @IEEE80211_CHAN_NO_OFDM: OFDM is not allowed on this channel.
84
85
86
87
88
89
90
91
92
93
 * @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.
94
 * @IEEE80211_CHAN_INDOOR_ONLY: see %NL80211_FREQUENCY_ATTR_INDOOR_ONLY
95
 * @IEEE80211_CHAN_IR_CONCURRENT: see %NL80211_FREQUENCY_ATTR_IR_CONCURRENT
96
97
98
99
 * @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.
100
 *
101
 */
Johannes Berg's avatar
Johannes Berg committed
102
103
enum ieee80211_channel_flags {
	IEEE80211_CHAN_DISABLED		= 1<<0,
104
105
	IEEE80211_CHAN_NO_IR		= 1<<1,
	/* hole at 1<<2 */
Johannes Berg's avatar
Johannes Berg committed
106
	IEEE80211_CHAN_RADAR		= 1<<3,
107
108
	IEEE80211_CHAN_NO_HT40PLUS	= 1<<4,
	IEEE80211_CHAN_NO_HT40MINUS	= 1<<5,
109
	IEEE80211_CHAN_NO_OFDM		= 1<<6,
110
111
	IEEE80211_CHAN_NO_80MHZ		= 1<<7,
	IEEE80211_CHAN_NO_160MHZ	= 1<<8,
112
	IEEE80211_CHAN_INDOOR_ONLY	= 1<<9,
113
	IEEE80211_CHAN_IR_CONCURRENT	= 1<<10,
114
115
	IEEE80211_CHAN_NO_20MHZ		= 1<<11,
	IEEE80211_CHAN_NO_10MHZ		= 1<<12,
116
117
};

118
#define IEEE80211_CHAN_NO_HT40 \
119
	(IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS)
120

121
122
123
#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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/**
 * struct ieee80211_channel - channel definition
 *
 * This structure describes a single channel for use
 * with cfg80211.
 *
 * @center_freq: center frequency in MHz
 * @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)
138
 * @max_reg_power: maximum regulatory transmission power (in dBm)
Johannes Berg's avatar
Johannes Berg committed
139
140
 * @beacon_found: helper to regulatory code to indicate when a beacon
 *	has been found on this channel. Use regulatory_hint_found_beacon()
141
 *	to enable this, this is useful only on 5 GHz band.
Johannes Berg's avatar
Johannes Berg committed
142
143
 * @orig_mag: internal use
 * @orig_mpwr: internal use
144
145
146
 * @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.
147
 * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
Andy Green's avatar
Andy Green committed
148
 */
Johannes Berg's avatar
Johannes Berg committed
149
struct ieee80211_channel {
150
	enum nl80211_band band;
Johannes Berg's avatar
Johannes Berg committed
151
152
153
154
155
	u16 center_freq;
	u16 hw_value;
	u32 flags;
	int max_antenna_gain;
	int max_power;
156
	int max_reg_power;
Johannes Berg's avatar
Johannes Berg committed
157
158
159
	bool beacon_found;
	u32 orig_flags;
	int orig_mag, orig_mpwr;
160
161
	enum nl80211_dfs_state dfs_state;
	unsigned long dfs_state_entered;
162
	unsigned int dfs_cac_ms;
Johannes Berg's avatar
Johannes Berg committed
163
164
};

Andy Green's avatar
Andy Green committed
165
/**
Johannes Berg's avatar
Johannes Berg committed
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
 * 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.
185
186
 * @IEEE80211_RATE_SUPPORTS_5MHZ: Rate can be used in 5 MHz mode
 * @IEEE80211_RATE_SUPPORTS_10MHZ: Rate can be used in 10 MHz mode
Andy Green's avatar
Andy Green committed
187
 */
Johannes Berg's avatar
Johannes Berg committed
188
189
190
191
192
193
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,
194
195
	IEEE80211_RATE_SUPPORTS_5MHZ	= 1<<5,
	IEEE80211_RATE_SUPPORTS_10MHZ	= 1<<6,
Johannes Berg's avatar
Johannes Berg committed
196
};
Andy Green's avatar
Andy Green committed
197

198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/**
 * 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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/**
 * 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.
 *
 * @flags: rate-specific flags
 * @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;
};
Andy Green's avatar
Andy Green committed
250

Johannes Berg's avatar
Johannes Berg committed
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
/**
 * 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;
Andy Green's avatar
Andy Green committed
269
270
};

271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
/**
 * 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;
};

Johannes Berg's avatar
Johannes Berg committed
287
288
289
290
291
292
293
294
295
296
297
298
299
300
/**
 * struct ieee80211_supported_band - frequency band definition
 *
 * This structure describes a frequency band a wiphy
 * is able to operate in.
 *
 * @channels: Array of channels the hardware can operate in
 *	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
301
 * @ht_cap: HT capabilities in this band
302
 * @vht_cap: VHT capabilities in this band
Johannes Berg's avatar
Johannes Berg committed
303
304
305
306
 */
struct ieee80211_supported_band {
	struct ieee80211_channel *channels;
	struct ieee80211_rate *bitrates;
307
	enum nl80211_band band;
Johannes Berg's avatar
Johannes Berg committed
308
309
310
	int n_channels;
	int n_bitrates;
	struct ieee80211_sta_ht_cap ht_cap;
311
	struct ieee80211_sta_vht_cap vht_cap;
Johannes Berg's avatar
Johannes Berg committed
312
};
Andy Green's avatar
Andy Green committed
313

Johannes Berg's avatar
Johannes Berg committed
314
315
316
/*
 * Wireless hardware/device configuration structures and methods
 */
Andy Green's avatar
Andy Green committed
317

318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
/**
 * 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.
 */

333
334
335
#define VHT_MUMIMO_GROUPS_DATA_LEN (WLAN_MEMBERSHIP_LEN +\
				    WLAN_USER_POSITION_LEN)

Johannes Berg's avatar
Johannes Berg committed
336
337
/**
 * struct vif_params - describes virtual interface parameters
338
 * @use_4addr: use 4-address frames
339
340
341
342
343
344
 * @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.
345
346
 * @vht_mumimo_groups: MU-MIMO groupID. used for monitoring only
 *	 packets belonging to that MU-MIMO groupID.
Johannes Berg's avatar
Johannes Berg committed
347
348
 */
struct vif_params {
349
350
351
	int use_4addr;
	u8 macaddr[ETH_ALEN];
	u8 vht_mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN];
Johannes Berg's avatar
Johannes Berg committed
352
};
Andy Green's avatar
Andy Green committed
353

Johannes Berg's avatar
Johannes Berg committed
354
/**
355
356
357
358
359
360
361
362
363
364
 * 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
365
 * @seq_len: length of @seq.
366
367
 */
struct key_params {
368
369
	const u8 *key;
	const u8 *seq;
370
371
372
373
374
	int key_len;
	int seq_len;
	u32 cipher;
};

375
376
377
/**
 * struct cfg80211_chan_def - channel definition
 * @chan: the (control) channel
378
379
380
381
 * @width: channel width
 * @center_freq1: center frequency of first segment
 * @center_freq2: center frequency of second segment
 *	(only with 80+80 MHz)
382
383
384
 */
struct cfg80211_chan_def {
	struct ieee80211_channel *chan;
385
386
387
	enum nl80211_chan_width width;
	u32 center_freq1;
	u32 center_freq2;
388
389
};

390
391
392
393
/**
 * cfg80211_get_chandef_type - return old channel type from chandef
 * @chandef: the channel definition
 *
394
 * Return: The old channel type (NOHT, HT20, HT40+/-) from a given
395
396
 * chandef, which must have a bandwidth allowing this conversion.
 */
397
398
399
static inline enum nl80211_channel_type
cfg80211_get_chandef_type(const struct cfg80211_chan_def *chandef)
{
400
401
402
403
404
405
406
407
408
409
410
411
412
	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;
	}
413
414
}

415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
/**
 * 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
 *
432
 * Return: %true if the channels defined by the channel definitions are
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
 * 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 &&
		chandef1->center_freq2 == chandef2->center_freq2);
}

/**
 * cfg80211_chandef_compatible - check if two channel definitions are compatible
 * @chandef1: first channel definition
 * @chandef2: second channel definition
 *
450
 * Return: %NULL if the given channel definitions are incompatible,
451
452
453
454
455
456
 * chandef1 or chandef2 otherwise.
 */
const struct cfg80211_chan_def *
cfg80211_chandef_compatible(const struct cfg80211_chan_def *chandef1,
			    const struct cfg80211_chan_def *chandef2);

457
458
459
/**
 * cfg80211_chandef_valid - check if a channel definition is valid
 * @chandef: the channel definition to check
460
 * Return: %true if the channel definition is valid. %false otherwise.
461
462
463
464
465
466
467
 */
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
468
469
 * @prohibited_flags: the regulatory channel flags that must not be set
 * Return: %true if secondary channels are usable. %false otherwise.
470
471
472
473
474
 */
bool cfg80211_chandef_usable(struct wiphy *wiphy,
			     const struct cfg80211_chan_def *chandef,
			     u32 prohibited_flags);

475
476
477
478
/**
 * cfg80211_chandef_dfs_required - checks if radar detection is required
 * @wiphy: the wiphy to validate against
 * @chandef: the channel definition to check
479
480
481
 * @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
482
483
 */
int cfg80211_chandef_dfs_required(struct wiphy *wiphy,
484
				  const struct cfg80211_chan_def *chandef,
Luciano Coelho's avatar
Luciano Coelho committed
485
				  enum nl80211_iftype iftype);
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
/**
 * ieee80211_chandef_rate_flags - returns rate flags for a channel
 *
 * In some channel types, not all rates may be used - for example CCK
 * rates may not be used in 5/10 MHz channels.
 *
 * @chandef: channel definition for the channel
 *
 * Returns: rate flags which apply for this channel
 */
static inline enum ieee80211_rate_flags
ieee80211_chandef_rate_flags(struct cfg80211_chan_def *chandef)
{
	switch (chandef->width) {
	case NL80211_CHAN_WIDTH_5:
		return IEEE80211_RATE_SUPPORTS_5MHZ;
	case NL80211_CHAN_WIDTH_10:
		return IEEE80211_RATE_SUPPORTS_10MHZ;
	default:
		break;
	}
	return 0;
}

511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
/**
 * 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;
}

538
539
540
/**
 * enum survey_info_flags - survey information flags
 *
Johannes Berg's avatar
Johannes Berg committed
541
 * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in
542
 * @SURVEY_INFO_IN_USE: channel is currently being used
543
544
545
546
547
 * @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
548
 * @SURVEY_INFO_TIME_SCAN: scan time was filled in
Johannes Berg's avatar
Johannes Berg committed
549
 *
550
551
552
553
 * Used by the driver to indicate which info in &struct survey_info
 * it has filled in during the get_survey().
 */
enum survey_info_flags {
554
555
556
557
558
559
560
	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),
561
	SURVEY_INFO_TIME_SCAN		= BIT(7),
562
563
564
565
566
};

/**
 * struct survey_info - channel survey response
 *
567
568
 * @channel: the channel this survey record reports, may be %NULL for a single
 *	record to report global statistics
569
570
 * @filled: bitflag of flags from &enum survey_info_flags
 * @noise: channel noise in dBm. This and all following fields are
571
 *	optional
572
573
574
575
576
 * @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
577
 * @time_scan: amount of time the radio spent for scanning
578
 *
Johannes Berg's avatar
Johannes Berg committed
579
580
 * Used by dump_survey() to report back per-channel survey information.
 *
581
582
583
584
585
 * This structure can later be expanded with things like
 * channel duty cycle etc.
 */
struct survey_info {
	struct ieee80211_channel *channel;
586
587
588
589
590
	u64 time;
	u64 time_busy;
	u64 time_ext_busy;
	u64 time_rx;
	u64 time_tx;
591
	u64 time_scan;
592
593
594
595
	u32 filled;
	s8 noise;
};

596
597
#define CFG80211_MAX_WEP_KEYS	4

598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
/**
 * 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.
615
616
617
 * @wep_keys: static WEP keys, if not NULL points to an array of
 *	CFG80211_MAX_WEP_KEYS WEP keys
 * @wep_tx_key: key index (0..3) of the default TX static WEP key
618
619
620
621
622
623
624
625
626
627
628
 */
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;
	u32 akm_suites[NL80211_MAX_NR_AKM_SUITES];
	bool control_port;
	__be16 control_port_ethertype;
	bool control_port_no_encrypt;
629
630
	struct key_params *wep_keys;
	int wep_tx_key;
631
632
};

633
/**
634
 * struct cfg80211_beacon_data - beacon data
635
 * @head: head portion of beacon (before TIM IE)
636
 *	or %NULL if not changed
637
 * @tail: tail portion of beacon (after TIM IE)
638
 *	or %NULL if not changed
639
640
 * @head_len: length of @head
 * @tail_len: length of @tail
641
642
643
644
645
646
647
648
 * @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
649
650
 * @probe_resp_len: length of probe response template (@probe_resp)
 * @probe_resp: probe response template (AP mode only)
651
 */
652
653
654
655
656
657
658
659
660
661
662
663
664
665
struct cfg80211_beacon_data {
	const u8 *head, *tail;
	const u8 *beacon_ies;
	const u8 *proberesp_ies;
	const u8 *assocresp_ies;
	const u8 *probe_resp;

	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;
};

666
667
668
669
struct mac_address {
	u8 addr[ETH_ALEN];
};

670
671
672
673
/**
 * 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
674
 *	entry specified by mac_addr
675
676
677
678
679
680
681
682
683
684
685
 * @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 */
	struct mac_address mac_addrs[];
};

686
687
688
689
690
691
692
693
694
695
696
697
/*
 * 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];
		enum nl80211_txrate_gi gi;
	} control[NUM_NL80211_BANDS];
};

698
699
700
701
702
/**
 * struct cfg80211_ap_settings - AP configuration
 *
 * Used to configure an AP interface.
 *
703
 * @chandef: defines the channel to use
704
705
706
707
708
709
710
711
712
713
 * @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)
714
 * @smps_mode: SMPS mode
715
 * @inactivity_timeout: time in seconds to determine station's inactivity.
716
717
 * @p2p_ctwindow: P2P CT Window
 * @p2p_opp_ps: P2P opportunistic PS
718
719
 * @acl: ACL configuration used by the drivers which has support for
 *	MAC address based access control
720
721
 * @pbss: If set, start as a PCP instead of AP. Relevant for DMG
 *	networks.
722
 * @beacon_rate: bitrate to be used for beacons
723
724
 */
struct cfg80211_ap_settings {
725
	struct cfg80211_chan_def chandef;
726

727
728
729
	struct cfg80211_beacon_data beacon;

	int beacon_interval, dtim_period;
730
731
732
	const u8 *ssid;
	size_t ssid_len;
	enum nl80211_hidden_ssid hidden_ssid;
733
734
735
	struct cfg80211_crypto_settings crypto;
	bool privacy;
	enum nl80211_auth_type auth_type;
736
	enum nl80211_smps_mode smps_mode;
737
	int inactivity_timeout;
738
739
	u8 p2p_ctwindow;
	bool p2p_opp_ps;
740
	const struct cfg80211_acl_data *acl;
741
	bool pbss;
742
	struct cfg80211_bitrate_mask beacon_rate;
743
744
};

745
746
747
748
749
750
751
/**
 * 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
752
753
754
755
 * @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
756
757
758
759
760
761
762
763
 * @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
 */
struct cfg80211_csa_settings {
	struct cfg80211_chan_def chandef;
	struct cfg80211_beacon_data beacon_csa;
764
765
766
767
	const u16 *counter_offsets_beacon;
	const u16 *counter_offsets_presp;
	unsigned int n_counter_offsets_beacon;
	unsigned int n_counter_offsets_presp;
768
769
770
771
772
773
	struct cfg80211_beacon_data beacon_after;
	bool radar_required;
	bool block_tx;
	u8 count;
};

774
775
776
/**
 * enum station_parameters_apply_mask - station parameter values to apply
 * @STATION_PARAM_APPLY_UAPSD: apply new uAPSD parameters (uapsd_queues, max_sp)
777
 * @STATION_PARAM_APPLY_CAPABILITY: apply new capability
778
 * @STATION_PARAM_APPLY_PLINK_STATE: apply new plink state
779
780
781
782
783
784
 *
 * 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),
785
	STATION_PARAM_APPLY_CAPABILITY = BIT(1),
786
	STATION_PARAM_APPLY_PLINK_STATE = BIT(2),
787
788
};

789
790
791
792
793
794
795
796
797
/**
 * struct station_parameters - station parameters
 *
 * Used to change and create a new station.
 *
 * @vlan: vlan interface station should belong to
 * @supported_rates: supported rates in IEEE 802.11 format
 *	(or NULL for no change)
 * @supported_rates_len: number of supported rates
798
799
800
801
 * @sta_flags_mask: station flags that changed
 *	(bitmask of BIT(NL80211_STA_FLAG_...))
 * @sta_flags_set: station flags values
 *	(bitmask of BIT(NL80211_STA_FLAG_...))
802
803
 * @listen_interval: listen interval or -1 for no change
 * @aid: AID or zero for no change
804
 * @peer_aid: mesh peer AID or zero for no change
Johannes Berg's avatar
Johannes Berg committed
805
 * @plink_action: plink action to take
806
 * @plink_state: set the peer link state for a station
Johannes Berg's avatar
Johannes Berg committed
807
 * @ht_capa: HT capabilities of station
808
 * @vht_capa: VHT capabilities of station
809
810
811
812
 * @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)
813
814
815
 * @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
816
817
 * @local_pm: local link-specific mesh power save mode (no change when set
 *	to unknown)
818
819
820
 * @capability: station capability
 * @ext_capab: extended capabilities of the station
 * @ext_capab_len: number of extended capabilities
821
822
823
824
 * @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
825
826
 * @opmode_notif: operating mode field from Operating Mode Notification
 * @opmode_notif_used: information if operating mode field is used
827
 * @support_p2p_ps: information if station supports P2P PS mechanism
828
829
 */
struct station_parameters {
830
	const u8 *supported_rates;
831
	struct net_device *vlan;
832
	u32 sta_flags_mask, sta_flags_set;
833
	u32 sta_modify_mask;
834
835
	int listen_interval;
	u16 aid;
836
	u16 peer_aid;
837
	u8 supported_rates_len;
838
	u8 plink_action;
839
	u8 plink_state;
840
841
	const struct ieee80211_ht_cap *ht_capa;
	const struct ieee80211_vht_cap *vht_capa;
842
843
	u8 uapsd_queues;
	u8 max_sp;
844
	enum nl80211_mesh_power_mode local_pm;
845
	u16 capability;
846
	const u8 *ext_capab;
847
	u8 ext_capab_len;
848
849
850
851
	const u8 *supported_channels;
	u8 supported_channels_len;
	const u8 *supported_oper_classes;
	u8 supported_oper_classes_len;
852
853
	u8 opmode_notif;
	bool opmode_notif_used;
854
	int support_p2p_ps;
855
856
};

857
858
859
860
861
862
/**
 * 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
863
864
865
 * @subtype: Management frame subtype to use for indicating removal
 *	(10 = Disassociation, 12 = Deauthentication)
 * @reason_code: Reason code for the Disassociation/Deauthentication frame
866
867
868
 */
struct station_del_parameters {
	const u8 *mac;
869
870
	u8 subtype;
	u16 reason_code;
871
872
};

873
874
875
/**
 * enum cfg80211_station_type - the type of station being modified
 * @CFG80211_STA_AP_CLIENT: client of an AP interface
876
877
 * @CFG80211_STA_AP_CLIENT_UNASSOC: client of an AP interface that is still
 *	unassociated (update properties for this type of client is permitted)
878
879
880
881
882
883
884
885
886
887
 * @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)
888
889
 * @CFG80211_STA_MESH_PEER_KERNEL: peer on mesh interface (kernel managed)
 * @CFG80211_STA_MESH_PEER_USER: peer on mesh interface (user managed)
890
891
892
 */
enum cfg80211_station_type {
	CFG80211_STA_AP_CLIENT,
893
	CFG80211_STA_AP_CLIENT_UNASSOC,
894
895
896
897
898
	CFG80211_STA_AP_MLME_CLIENT,
	CFG80211_STA_AP_STA,
	CFG80211_STA_IBSS,
	CFG80211_STA_TDLS_PEER_SETUP,
	CFG80211_STA_TDLS_PEER_ACTIVE,
899
900
	CFG80211_STA_MESH_PEER_KERNEL,
	CFG80211_STA_MESH_PEER_USER,
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
};

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

919
920
921
922
923
924
/**
 * enum station_info_rate_flags - bitrate info flags
 *
 * Used by the driver to indicate the specific rate transmission
 * type for 802.11n transmissions.
 *
925
926
 * @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS
 * @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS
927
 * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval
928
 * @RATE_INFO_FLAGS_60G: 60GHz MCS
929
930
 */
enum rate_info_flags {
931
932
	RATE_INFO_FLAGS_MCS			= BIT(0),
	RATE_INFO_FLAGS_VHT_MCS			= BIT(1),
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
	RATE_INFO_FLAGS_SHORT_GI		= BIT(2),
	RATE_INFO_FLAGS_60G			= BIT(3),
};

/**
 * 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
 */
enum rate_info_bw {
	RATE_INFO_BW_5,
	RATE_INFO_BW_10,
	RATE_INFO_BW_20,
	RATE_INFO_BW_40,
	RATE_INFO_BW_80,
	RATE_INFO_BW_160,
956
957
958
959
960
961
962
963
964
965
};

/**
 * struct rate_info - bitrate information
 *
 * Information about a receiving or transmitting bitrate
 *
 * @flags: bitflag of flags from &enum rate_info_flags
 * @mcs: mcs index if struct describes a 802.11n bitrate
 * @legacy: bitrate in 100kbit/s for 802.11abg
966
 * @nss: number of streams (VHT only)
967
 * @bw: bandwidth (from &enum rate_info_bw)
968
969
970
971
972
 */
struct rate_info {
	u8 flags;
	u8 mcs;
	u16 legacy;
973
	u8 nss;
974
	u8 bw;
975
976
};

977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
/**
 * enum station_info_rate_flags - bitrate info flags
 *
 * 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;
};

1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
/**
 * 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
 */
struct cfg80211_tid_stats {
	u32 filled;
	u64 rx_msdu;
	u64 tx_msdu;
	u64 tx_msdu_retries;
	u64 tx_msdu_failed;
};

1026
1027
#define IEEE80211_MAX_CHAINS	4

1028
/**
1029
 * struct station_info - station information
1030
 *
1031
 * Station information filled by driver for get_station() and dump_station.
1032
 *
1033
1034
 * @filled: bitflag of flags using the bits of &enum nl80211_sta_info to
 *	indicate the relevant values in this struct for them
1035
 * @connected_time: time(in secs) since a station is last connected
1036
 * @inactive_time: time since last station activity (tx/rx) in milliseconds
1037
1038
 * @rx_bytes: bytes (size of MPDUs) received from this station
 * @tx_bytes: bytes (size of MPDUs) transmitted to this station
1039
1040
1041
 * @llid: mesh local link id
 * @plid: mesh peer link id
 * @plink_state: mesh peer link state
1042
1043
1044
1045
 * @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_.
1046
1047
1048
 * @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
1049
1050
 * @txrate: current unicast bitrate from this station
 * @rxrate: current unicast bitrate to this station
1051
1052
1053
1054
 * @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)
1055
 * @rx_dropped_misc:  Dropped for un-specified reason.
1056
 * @bss_param: current BSS parameters
1057
1058
1059
1060
 * @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.
1061
1062
1063
1064
1065
 * @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.
1066
 * @sta_flags: station flags mask & values
1067
 * @beacon_loss_count: Number of times beacon loss event has triggered.
1068
 * @t_offset: Time offset of the station relative to this host.
1069
1070
1071
 * @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
1072
1073
 * @expected_throughput: expected throughput in kbps (including 802.11 headers)
 *	towards this station.
1074
1075
1076
 * @rx_beacon: number of beacons received from this peer
 * @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received
 *	from this peer
1077
 * @rx_duration: aggregate PPDU duration(usecs) for all the frames from a peer
1078
1079
 * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last
 *	(IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs.
1080
 */
1081
struct station_info {
1082
	u64 filled;
1083
	u32 connected_time;
1084
	u32 inactive_time;
1085
1086
	u64 rx_bytes;
	u64 tx_bytes;
1087
1088
1089
	u16 llid;
	u16 plid;
	u8 plink_state;
1090
	s8 signal;
1091
	s8 signal_avg;
1092
1093
1094
1095
1096

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

1097
	struct rate_info txrate;
1098
	struct rate_info rxrate;
1099
1100
	u32 rx_packets;
	u32 tx_packets;
1101
1102
	u32 tx_retries;
	u32 tx_failed;
1103
	u32 rx_dropped_misc;
1104
	struct sta_bss_parameters bss_param;
1105
	struct nl80211_sta_flag_update sta_flags;
1106
1107

	int generation;
1108
1109
1110

	const u8 *assoc_req_ies;
	size_t assoc_req_ies_len;
1111

1112
	u32 beacon_loss_count;
1113
	s64 t_offset;
1114
1115
1116
	enum nl80211_mesh_power_mode local_pm;
	enum nl80211_mesh_power_mode peer_pm;
	enum nl80211_mesh_power_mode nonpeer_pm;
1117

1118
	u32 expected_throughput;
1119
1120

	u64 rx_beacon;
1121
	u64 rx_duration;
1122
	u8 rx_beacon_signal_avg;
1123
	struct cfg80211_tid_stats pertid[IEEE80211_NUM_TIDS + 1];
1124
1125
};

1126
#if IS_ENABLED(CONFIG_CFG80211)
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
/**
 * 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);
1139
1140
1141
1142
1143
1144
1145
1146
#else
static inline int cfg80211_get_station(struct net_device *dev,
				       const u8 *mac_addr,
				       struct station_info *sinfo)
{
	return -ENOENT;
}
#endif
1147

1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
/**
 * enum monitor_flags - monitor flags
 *
 * Monitor interface configuration flags. Note that these must be the bits
 * according to the nl80211 flags.
 *
 * @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
1159
 * @MONITOR_FLAG_ACTIVE: active monitor, ACKs frames on its MAC address
1160
1161
1162
1163
1164
1165
1166
 */
enum monitor_flags {
	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,
1167
	MONITOR_FLAG_ACTIVE		= 1<<NL80211_MNTR_FLAG_ACTIVE,
1168
1169
};

1170
1171
1172
1173
1174
1175
/**
 * 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
1176
1177
1178
1179
1180
1181
1182
 * @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
1183
1184
1185
 */
enum mpath_info_flags {
	MPATH_INFO_FRAME_QLEN		= BIT(0),
1186
	MPATH_INFO_SN			= BIT(1),
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
	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),
};

/**
 * 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
1201
 * @sn: target sequence number
1202
1203
1204
1205
1206
 * @metric: metric (cost) of this mesh path
 * @exptime: expiration time for the mesh path from now, in msecs
 * @flags: mesh path flags
 * @discovery_timeout: total mesh path discovery timeout, in msecs
 * @discovery_retries: mesh path discovery retries
1207
1208
1209
1210
 * @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.
1211
1212
1213
1214
 */
struct mpath_info {
	u32 filled;
	u32 frame_qlen;
1215
	u32 sn;
1216
1217
1218
1219
1220
	u32 metric;
	u32 exptime;
	u32 discovery_timeout;
	u8 discovery_retries;
	u8 flags;
1221
1222

	int generation;
1223
1224
};

1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
/**
 * struct bss_parameters - BSS parameters
 *
 * Used to change BSS parameters (mainly for AP mode).
 *
 * @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)
1236
1237
1238
 * @basic_rates: basic rates in IEEE 802.11 format
 *	(or NULL for no change)
 * @basic_rates_len: number of basic rates
1239
 * @ap_isolate: do not forward packets between connected stations
1240
1241
 * @ht_opmode: HT Operation mode
 * 	(u16 = opmode, -1 = do not change)
1242
1243
 * @p2p_ctwindow: P2P CT Window (-1 = no change)
 * @p2p_opp_ps: P2P opportunistic PS (-1 = no change)
1244
1245
1246
1247
1248
 */
struct bss_parameters {
	int use_cts_prot;
	int use_short_preamble;
	int use_short_slot_time;
1249
	const u8 *basic_rates;
1250
	u8 basic_rates_len;
1251
	int ap_isolate;
1252
	int ht_opmode;
1253
	s8 p2p_ctwindow, p2p_opp_ps;
1254
};
1255

1256
/**
1257
1258
1259
 * struct mesh_config - 802.11s mesh configuration
 *
 * These parameters can be changed while the mesh is active.
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
 *
 * @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
1308
1309
1310
1311
1312
1313
1314
 *
 * @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.
1315
1316
1317
 * @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.
1318
1319
1320
1321
 * @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.
1322
1323
1324
 * @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.
1325
 */
1326
1327
1328
1329
1330
struct mesh_config {
	u16 dot11MeshRetryTimeout;
	u16 dot11MeshConfirmTimeout;
	u16 dot11MeshHoldingTimeout;
	u16 dot11MeshMaxPeerLinks;
1331
1332
1333
	u8 dot11MeshMaxRetries;
	u8 dot11MeshTTL;
	u8 element_ttl;
1334
	bool auto_open_plinks;
1335
	u32 dot11MeshNbrOffsetMaxNeighbor;
1336
	u8 dot11MeshHWMPmaxPREQretries;
1337
1338
1339
1340
	u32 path_refresh_time;
	u16 min_discovery_timeout;
	u32 dot11MeshHWMPactivePathTimeout;
	u16 dot11MeshHWMPpreqMinInterval;
1341
	u16 dot11MeshHWMPperrMinInterval;
1342
	u16 dot11MeshHWMPnetDiameterTraversalTime;
1343
	u8 dot11MeshHWMPRootMode;
1344
	u16 dot11MeshHWMPRannInterval;
1345
	bool dot11MeshGateAnnouncementProtocol;
1346
	bool dot11MeshForwarding;
1347
	s32 rssi_threshold;
1348
	u16 ht_opmode;
1349
1350
	u32 dot11MeshHWMPactivePathToRootTimeout;
	u16 dot11MeshHWMProotInterval;
1351
	u16 dot11MeshHWMPconfirmationInterval;
1352
1353
	enum nl80211_mesh_power_mode power_mode;
	u16 dot11MeshAwakeWindowDuration;
1354
	u32 plink_timeout;
1355
1356
};

1357
1358
/**
 * struct mesh_setup - 802.11s mesh setup configuration
1359
 * @chandef: defines the channel to use
1360
1361
 * @mesh_id: the mesh ID
 * @mesh_id_len: length of the mesh ID, at least 1 and at most 32 bytes
1362
 * @sync_method: which synchronization method to use
1363
1364
 * @path_sel_proto: which path selection protocol to use
 * @path_metric: which metric to use
1365
 * @auth_id: which authentication method this mesh is using
1366
1367
 * @ie: vendor information elements (optional)
 * @ie_len: length of vendor information elements
1368
1369
 * @is_authenticated: this mesh requires authentication
 * @is_secure: this mesh uses security
1370
 * @user_mpm: userspace handles all MPM functions
1371
1372
 * @dtim_period: DTIM period to use
 * @beacon_interval: beacon interval to use
1373
 * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a]
1374
 * @basic_rates: basic rates to use when creating the mesh
1375
 * @beacon_rate: bitrate to be used for beacons
1376
1377
1378
1379
 *
 * These parameters are fixed when the mesh is created.
 */
struct mesh_setup {
1380
	struct cfg80211_chan_def chandef;
1381
1382
	const u8 *mesh_id;
	u8 mesh_id_len;
1383
1384
1385
	u8 sync_method;
	u8 path_sel_proto;
	u8 path_metric;