cfg80211.h 77.9 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>
Johannes Berg's avatar
Johannes Berg committed
7
8
9
10
11
 *
 * 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.
 */
12

Johannes Berg's avatar
Johannes Berg committed
13
14
15
#include <linux/netdevice.h>
#include <linux/debugfs.h>
#include <linux/list.h>
16
17
#include <linux/netlink.h>
#include <linux/skbuff.h>
18
#include <linux/nl80211.h>
19
20
#include <linux/if_ether.h>
#include <linux/ieee80211.h>
Johannes Berg's avatar
Johannes Berg committed
21
22
#include <net/regulatory.h>

Johannes Berg's avatar
Johannes Berg committed
23
/* remove once we remove the wext stuff */
Johannes Berg's avatar
Johannes Berg committed
24
25
26
#include <net/iw_handler.h>
#include <linux/wireless.h>

27
28

/*
Johannes Berg's avatar
Johannes Berg committed
29
30
31
32
33
34
35
36
 * wireless hardware capability structures
 */

/**
 * enum ieee80211_band - supported frequency bands
 *
 * The bands are assigned this way because the supported
 * bitrates differ in these bands.
37
 *
Johannes Berg's avatar
Johannes Berg committed
38
39
 * @IEEE80211_BAND_2GHZ: 2.4GHz ISM band
 * @IEEE80211_BAND_5GHZ: around 5GHz band (4.9-5.7)
40
 */
Johannes Berg's avatar
Johannes Berg committed
41
enum ieee80211_band {
42
43
	IEEE80211_BAND_2GHZ = NL80211_BAND_2GHZ,
	IEEE80211_BAND_5GHZ = NL80211_BAND_5GHZ,
Johannes Berg's avatar
Johannes Berg committed
44
45
46
47

	/* keep last */
	IEEE80211_NUM_BANDS
};
48

49
/**
Johannes Berg's avatar
Johannes Berg committed
50
51
52
53
54
55
56
57
58
 * enum ieee80211_channel_flags - channel flags
 *
 * Channel flags set by the regulatory control code.
 *
 * @IEEE80211_CHAN_DISABLED: This channel is disabled.
 * @IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted
 *	on this channel.
 * @IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
 * @IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
59
 * @IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel
Johannes Berg's avatar
Johannes Berg committed
60
 * 	is not permitted.
61
 * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel
Johannes Berg's avatar
Johannes Berg committed
62
 * 	is not permitted.
63
 */
Johannes Berg's avatar
Johannes Berg committed
64
65
66
67
68
enum ieee80211_channel_flags {
	IEEE80211_CHAN_DISABLED		= 1<<0,
	IEEE80211_CHAN_PASSIVE_SCAN	= 1<<1,
	IEEE80211_CHAN_NO_IBSS		= 1<<2,
	IEEE80211_CHAN_RADAR		= 1<<3,
69
70
	IEEE80211_CHAN_NO_HT40PLUS	= 1<<4,
	IEEE80211_CHAN_NO_HT40MINUS	= 1<<5,
71
72
};

73
#define IEEE80211_CHAN_NO_HT40 \
74
	(IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS)
75

Johannes Berg's avatar
Johannes Berg committed
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/**
 * 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)
 * @beacon_found: helper to regulatory code to indicate when a beacon
 *	has been found on this channel. Use regulatory_hint_found_beacon()
92
 *	to enable this, this is useful only on 5 GHz band.
Johannes Berg's avatar
Johannes Berg committed
93
94
 * @orig_mag: internal use
 * @orig_mpwr: internal use
Andy Green's avatar
Andy Green committed
95
 */
Johannes Berg's avatar
Johannes Berg committed
96
97
98
99
100
101
102
103
104
105
106
107
struct ieee80211_channel {
	enum ieee80211_band band;
	u16 center_freq;
	u16 hw_value;
	u32 flags;
	int max_antenna_gain;
	int max_power;
	bool beacon_found;
	u32 orig_flags;
	int orig_mag, orig_mpwr;
};

Andy Green's avatar
Andy Green committed
108
/**
Johannes Berg's avatar
Johannes Berg committed
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 * 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.
Andy Green's avatar
Andy Green committed
128
 */
Johannes Berg's avatar
Johannes Berg committed
129
130
131
132
133
134
135
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,
};
Andy Green's avatar
Andy Green committed
136

Johannes Berg's avatar
Johannes Berg committed
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/**
 * 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
156

Johannes Berg's avatar
Johannes Berg committed
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/**
 * 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
175
176
};

Johannes Berg's avatar
Johannes Berg committed
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/**
 * 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
 */
struct ieee80211_supported_band {
	struct ieee80211_channel *channels;
	struct ieee80211_rate *bitrates;
	enum ieee80211_band band;
	int n_channels;
	int n_bitrates;
	struct ieee80211_sta_ht_cap ht_cap;
};
Andy Green's avatar
Andy Green committed
200

Johannes Berg's avatar
Johannes Berg committed
201
202
203
/*
 * Wireless hardware/device configuration structures and methods
 */
Andy Green's avatar
Andy Green committed
204

Johannes Berg's avatar
Johannes Berg committed
205
206
207
208
/**
 * struct vif_params - describes virtual interface parameters
 * @mesh_id: mesh ID to use
 * @mesh_id_len: length of the mesh ID
209
 * @use_4addr: use 4-address frames
Johannes Berg's avatar
Johannes Berg committed
210
211
212
213
 */
struct vif_params {
       u8 *mesh_id;
       int mesh_id_len;
214
       int use_4addr;
Johannes Berg's avatar
Johannes Berg committed
215
};
Andy Green's avatar
Andy Green committed
216

Johannes Berg's avatar
Johannes Berg committed
217
/**
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
 * 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.
 */
struct key_params {
	u8 *key;
	u8 *seq;
	int key_len;
	int seq_len;
	u32 cipher;
};

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
262
263
264
265
/**
 * enum survey_info_flags - survey information flags
 *
 * Used by the driver to indicate which info in &struct survey_info
 * it has filled in during the get_survey().
 */
enum survey_info_flags {
	SURVEY_INFO_NOISE_DBM = 1<<0,
};

/**
 * struct survey_info - channel survey response
 *
 * Used by dump_survey() to report back per-channel survey information.
 *
 * @channel: the channel this survey record reports, mandatory
 * @filled: bitflag of flags from &enum survey_info_flags
 * @noise: channel noise in dBm. This and all following fields are
 *     optional
 *
 * This structure can later be expanded with things like
 * channel duty cycle etc.
 */
struct survey_info {
	struct ieee80211_channel *channel;
	u32 filled;
	s8 noise;
};

266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
/**
 * struct beacon_parameters - beacon parameters
 *
 * Used to configure the beacon for an interface.
 *
 * @head: head portion of beacon (before TIM IE)
 *     or %NULL if not changed
 * @tail: tail portion of beacon (after TIM IE)
 *     or %NULL if not changed
 * @interval: beacon interval or zero if not changed
 * @dtim_period: DTIM period or zero if not changed
 * @head_len: length of @head
 * @tail_len: length of @tail
 */
struct beacon_parameters {
	u8 *head, *tail;
	int interval, dtim_period;
	int head_len, tail_len;
};

286
287
288
289
290
291
292
293
294
295
296
297
298
/**
 * enum plink_action - actions to perform in mesh peers
 *
 * @PLINK_ACTION_INVALID: action 0 is reserved
 * @PLINK_ACTION_OPEN: start mesh peer link establishment
 * @PLINK_ACTION_BLOCL: block traffic from this mesh peer
 */
enum plink_actions {
	PLINK_ACTION_INVALID,
	PLINK_ACTION_OPEN,
	PLINK_ACTION_BLOCK,
};

299
300
301
302
303
304
305
306
307
/**
 * 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
308
309
310
311
 * @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_...))
312
313
314
315
316
317
 * @listen_interval: listen interval or -1 for no change
 * @aid: AID or zero for no change
 */
struct station_parameters {
	u8 *supported_rates;
	struct net_device *vlan;
318
	u32 sta_flags_mask, sta_flags_set;
319
320
321
	int listen_interval;
	u16 aid;
	u8 supported_rates_len;
322
	u8 plink_action;
323
	struct ieee80211_ht_cap *ht_capa;
324
325
};

326
/**
327
 * enum station_info_flags - station information flags
328
 *
329
330
 * Used by the driver to indicate which info in &struct station_info
 * it has filled in during get_station() or dump_station().
331
 *
332
333
334
335
336
337
 * @STATION_INFO_INACTIVE_TIME: @inactive_time filled
 * @STATION_INFO_RX_BYTES: @rx_bytes filled
 * @STATION_INFO_TX_BYTES: @tx_bytes filled
 * @STATION_INFO_LLID: @llid filled
 * @STATION_INFO_PLID: @plid filled
 * @STATION_INFO_PLINK_STATE: @plink_state filled
338
339
340
 * @STATION_INFO_SIGNAL: @signal filled
 * @STATION_INFO_TX_BITRATE: @tx_bitrate fields are filled
 *  (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs)
341
342
 * @STATION_INFO_RX_PACKETS: @rx_packets filled
 * @STATION_INFO_TX_PACKETS: @tx_packets filled
343
 */
344
345
346
347
348
349
350
enum station_info_flags {
	STATION_INFO_INACTIVE_TIME	= 1<<0,
	STATION_INFO_RX_BYTES		= 1<<1,
	STATION_INFO_TX_BYTES		= 1<<2,
	STATION_INFO_LLID		= 1<<3,
	STATION_INFO_PLID		= 1<<4,
	STATION_INFO_PLINK_STATE	= 1<<5,
351
352
	STATION_INFO_SIGNAL		= 1<<6,
	STATION_INFO_TX_BITRATE		= 1<<7,
353
354
	STATION_INFO_RX_PACKETS		= 1<<8,
	STATION_INFO_TX_PACKETS		= 1<<9,
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
};

/**
 * enum station_info_rate_flags - bitrate info flags
 *
 * Used by the driver to indicate the specific rate transmission
 * type for 802.11n transmissions.
 *
 * @RATE_INFO_FLAGS_MCS: @tx_bitrate_mcs filled
 * @RATE_INFO_FLAGS_40_MHZ_WIDTH: 40 Mhz width transmission
 * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval
 */
enum rate_info_flags {
	RATE_INFO_FLAGS_MCS		= 1<<0,
	RATE_INFO_FLAGS_40_MHZ_WIDTH	= 1<<1,
	RATE_INFO_FLAGS_SHORT_GI	= 1<<2,
};

/**
 * 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
 */
struct rate_info {
	u8 flags;
	u8 mcs;
	u16 legacy;
386
387
388
};

/**
389
 * struct station_info - station information
390
 *
391
 * Station information filled by driver for get_station() and dump_station.
392
 *
393
 * @filled: bitflag of flags from &enum station_info_flags
394
395
396
 * @inactive_time: time since last station activity (tx/rx) in milliseconds
 * @rx_bytes: bytes received from this station
 * @tx_bytes: bytes transmitted to this station
397
398
399
 * @llid: mesh local link id
 * @plid: mesh peer link id
 * @plink_state: mesh peer link state
400
401
 * @signal: signal strength of last received packet in dBm
 * @txrate: current unicast bitrate to this station
402
403
 * @rx_packets: packets received from this station
 * @tx_packets: packets transmitted to this station
404
405
406
407
 * @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.
408
 */
409
struct station_info {
410
411
412
413
	u32 filled;
	u32 inactive_time;
	u32 rx_bytes;
	u32 tx_bytes;
414
415
416
	u16 llid;
	u16 plid;
	u8 plink_state;
417
418
	s8 signal;
	struct rate_info txrate;
419
420
	u32 rx_packets;
	u32 tx_packets;
421
422

	int generation;
423
424
};

425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
/**
 * 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
 */
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,
};

445
446
447
448
449
450
451
/**
 * 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().
 *
 * MPATH_INFO_FRAME_QLEN: @frame_qlen filled
452
 * MPATH_INFO_SN: @sn filled
453
454
455
456
457
458
459
460
 * 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
 */
enum mpath_info_flags {
	MPATH_INFO_FRAME_QLEN		= BIT(0),
461
	MPATH_INFO_SN			= BIT(1),
462
463
464
465
466
467
468
469
470
471
472
473
474
475
	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
476
 * @sn: target sequence number
477
478
479
480
481
 * @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
482
483
484
485
 * @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.
486
487
488
489
 */
struct mpath_info {
	u32 filled;
	u32 frame_qlen;
490
	u32 sn;
491
492
493
494
495
	u32 metric;
	u32 exptime;
	u32 discovery_timeout;
	u8 discovery_retries;
	u8 flags;
496
497

	int generation;
498
499
};

500
501
502
503
504
505
506
507
508
509
510
/**
 * 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)
511
512
513
 * @basic_rates: basic rates in IEEE 802.11 format
 *	(or NULL for no change)
 * @basic_rates_len: number of basic rates
514
 * @ap_isolate: do not forward packets between connected stations
515
516
517
518
519
 */
struct bss_parameters {
	int use_cts_prot;
	int use_short_preamble;
	int use_short_slot_time;
520
521
	u8 *basic_rates;
	u8 basic_rates_len;
522
	int ap_isolate;
523
};
524

525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
struct mesh_config {
	/* Timeouts in ms */
	/* Mesh plink management parameters */
	u16 dot11MeshRetryTimeout;
	u16 dot11MeshConfirmTimeout;
	u16 dot11MeshHoldingTimeout;
	u16 dot11MeshMaxPeerLinks;
	u8  dot11MeshMaxRetries;
	u8  dot11MeshTTL;
	bool auto_open_plinks;
	/* HWMP parameters */
	u8  dot11MeshHWMPmaxPREQretries;
	u32 path_refresh_time;
	u16 min_discovery_timeout;
	u32 dot11MeshHWMPactivePathTimeout;
	u16 dot11MeshHWMPpreqMinInterval;
	u16 dot11MeshHWMPnetDiameterTraversalTime;
542
	u8  dot11MeshHWMPRootMode;
543
544
};

545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
/**
 * struct ieee80211_txq_params - TX queue parameters
 * @queue: TX queue identifier (NL80211_TXQ_Q_*)
 * @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]
 */
struct ieee80211_txq_params {
	enum nl80211_txq_q queue;
	u16 txop;
	u16 cwmin;
	u16 cwmax;
	u8 aifs;
};

563
564
565
/* from net/wireless.h */
struct wiphy;

566
567
568
/* from net/ieee80211.h */
struct ieee80211_channel;

569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
/**
 * 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;
};

/**
 * 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.
585
 * @n_channels: total number of channels to scan
586
587
 * @ie: optional information element(s) to add into Probe Request or %NULL
 * @ie_len: length of ie in octets
588
 * @wiphy: the wiphy this was for
589
 * @dev: the interface
590
591
592
593
594
 */
struct cfg80211_scan_request {
	struct cfg80211_ssid *ssids;
	int n_ssids;
	u32 n_channels;
595
	const u8 *ie;
596
	size_t ie_len;
597
598
599

	/* internal */
	struct wiphy *wiphy;
600
	struct net_device *dev;
Johannes Berg's avatar
Johannes Berg committed
601
	bool aborted;
602
603
604

	/* keep last */
	struct ieee80211_channel *channels[0];
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
};

/**
 * 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,
};

/**
 * struct cfg80211_bss - BSS description
 *
 * This structure describes a BSS (which may also be a mesh network)
 * for use in scan results and similar.
 *
 * @bssid: BSSID of the BSS
 * @tsf: timestamp of last received update
 * @beacon_interval: the beacon interval as from the frame
 * @capability: the capability field in host byte order
 * @information_elements: the information elements (Note that there
631
632
633
 *	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
634
 * @len_information_elements: total length of the information elements
635
636
637
638
 * @beacon_ies: the information elements from the last Beacon frame
 * @len_beacon_ies: total length of the beacon_ies
 * @proberesp_ies: the information elements from the last Probe Response frame
 * @len_proberesp_ies: total length of the proberesp_ies
Johannes Berg's avatar
Johannes Berg committed
639
 * @signal: signal strength value (type depends on the wiphy's signal_type)
640
 * @free_priv: function pointer to free private data
641
642
643
644
645
646
647
648
649
650
651
 * @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
 */
struct cfg80211_bss {
	struct ieee80211_channel *channel;

	u8 bssid[ETH_ALEN];
	u64 tsf;
	u16 beacon_interval;
	u16 capability;
	u8 *information_elements;
	size_t len_information_elements;
652
653
654
655
	u8 *beacon_ies;
	size_t len_beacon_ies;
	u8 *proberesp_ies;
	size_t len_proberesp_ies;
656
657
658

	s32 signal;

659
	void (*free_priv)(struct cfg80211_bss *bss);
660
661
662
	u8 priv[0] __attribute__((__aligned__(sizeof(void *))));
};

663
664
665
666
667
668
669
670
671
/**
 * ieee80211_bss_get_ie - find IE with given ID
 * @bss: the bss to search
 * @ie: the IE ID
 * Returns %NULL if not found.
 */
const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 ie);


672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
/**
 * 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.
 */
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;
};

696
697
698
699
700
/**
 * struct cfg80211_auth_request - Authentication request data
 *
 * This structure provides information needed to complete IEEE 802.11
 * authentication.
Johannes Berg's avatar
Johannes Berg committed
701
702
 *
 * @bss: The BSS to authenticate with.
703
704
705
 * @auth_type: Authentication type (algorithm)
 * @ie: Extra IEs to add to Authentication frame or %NULL
 * @ie_len: Length of ie buffer in octets
Johannes Berg's avatar
Johannes Berg committed
706
707
708
 * @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
709
710
711
712
 * @local_state_change: This is a request for a local state only, i.e., no
 *	Authentication frame is to be transmitted and authentication state is
 *	to be changed without having to wait for a response from the peer STA
 *	(AP).
713
714
 */
struct cfg80211_auth_request {
Johannes Berg's avatar
Johannes Berg committed
715
	struct cfg80211_bss *bss;
716
717
	const u8 *ie;
	size_t ie_len;
Johannes Berg's avatar
Johannes Berg committed
718
	enum nl80211_auth_type auth_type;
Johannes Berg's avatar
Johannes Berg committed
719
720
	const u8 *key;
	u8 key_len, key_idx;
721
	bool local_state_change;
722
723
724
725
726
727
728
};

/**
 * struct cfg80211_assoc_request - (Re)Association request data
 *
 * This structure provides information needed to complete IEEE 802.11
 * (re)association.
Johannes Berg's avatar
Johannes Berg committed
729
 * @bss: The BSS to associate with.
730
731
 * @ie: Extra IEs to add to (Re)Association Request frame or %NULL
 * @ie_len: Length of ie buffer in octets
732
 * @use_mfp: Use management frame protection (IEEE 802.11w) in this association
733
 * @crypto: crypto settings
734
 * @prev_bssid: previous BSSID, if not %NULL use reassociate frame
735
736
 */
struct cfg80211_assoc_request {
Johannes Berg's avatar
Johannes Berg committed
737
	struct cfg80211_bss *bss;
738
	const u8 *ie, *prev_bssid;
739
	size_t ie_len;
740
	struct cfg80211_crypto_settings crypto;
Johannes Berg's avatar
Johannes Berg committed
741
	bool use_mfp;
742
743
744
745
746
747
748
749
};

/**
 * struct cfg80211_deauth_request - Deauthentication request data
 *
 * This structure provides information needed to complete IEEE 802.11
 * deauthentication.
 *
Johannes Berg's avatar
Johannes Berg committed
750
 * @bss: the BSS to deauthenticate from
751
752
 * @ie: Extra IEs to add to Deauthentication frame or %NULL
 * @ie_len: Length of ie buffer in octets
Johannes Berg's avatar
Johannes Berg committed
753
 * @reason_code: The reason code for the deauthentication
754
755
 * @local_state_change: This is a request for a local state only, i.e., no
 *	Deauthentication frame is to be transmitted.
756
757
 */
struct cfg80211_deauth_request {
Johannes Berg's avatar
Johannes Berg committed
758
	struct cfg80211_bss *bss;
759
760
	const u8 *ie;
	size_t ie_len;
Johannes Berg's avatar
Johannes Berg committed
761
	u16 reason_code;
762
	bool local_state_change;
763
764
765
766
767
768
769
770
};

/**
 * struct cfg80211_disassoc_request - Disassociation request data
 *
 * This structure provides information needed to complete IEEE 802.11
 * disassocation.
 *
Johannes Berg's avatar
Johannes Berg committed
771
 * @bss: the BSS to disassociate from
772
773
 * @ie: Extra IEs to add to Disassociation frame or %NULL
 * @ie_len: Length of ie buffer in octets
Johannes Berg's avatar
Johannes Berg committed
774
 * @reason_code: The reason code for the disassociation
775
776
 * @local_state_change: This is a request for a local state only, i.e., no
 *	Disassociation frame is to be transmitted.
777
778
 */
struct cfg80211_disassoc_request {
Johannes Berg's avatar
Johannes Berg committed
779
	struct cfg80211_bss *bss;
780
781
	const u8 *ie;
	size_t ie_len;
Johannes Berg's avatar
Johannes Berg committed
782
	u16 reason_code;
783
	bool local_state_change;
784
785
};

Johannes Berg's avatar
Johannes Berg committed
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
/**
 * 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.
 * @channel: The channel to use if no IBSS can be found to join.
 * @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
801
 * @beacon_interval: beacon interval to use
Johannes Berg's avatar
Johannes Berg committed
802
803
 * @privacy: this is a protected network, keys will be configured
 *	after joining
Johannes Berg's avatar
Johannes Berg committed
804
805
806
807
808
809
810
 */
struct cfg80211_ibss_params {
	u8 *ssid;
	u8 *bssid;
	struct ieee80211_channel *channel;
	u8 *ie;
	u8 ssid_len, ie_len;
811
	u16 beacon_interval;
Johannes Berg's avatar
Johannes Berg committed
812
	bool channel_fixed;
Johannes Berg's avatar
Johannes Berg committed
813
	bool privacy;
Johannes Berg's avatar
Johannes Berg committed
814
815
};

816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
/**
 * 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)
 * @bssid: The AP BSSID or %NULL if not specified (auto-select based on scan
 *	results)
 * @ssid: SSID
 * @ssid_len: Length of ssid in octets
 * @auth_type: Authentication type (algorithm)
 * @assoc_ie: IEs for association request
 * @assoc_ie_len: Length of assoc_ie in octets
 * @privacy: indicates whether privacy-enabled APs should be used
 * @crypto: crypto settings
Johannes Berg's avatar
Johannes Berg committed
833
834
835
 * @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
836
837
838
839
840
841
842
843
844
845
846
 */
struct cfg80211_connect_params {
	struct ieee80211_channel *channel;
	u8 *bssid;
	u8 *ssid;
	size_t ssid_len;
	enum nl80211_auth_type auth_type;
	u8 *ie;
	size_t ie_len;
	bool privacy;
	struct cfg80211_crypto_settings crypto;
Johannes Berg's avatar
Johannes Berg committed
847
848
	const u8 *key;
	u8 key_len, key_idx;
849
850
};

851
852
853
854
855
856
857
858
859
860
861
862
/**
 * enum wiphy_params_flags - set_wiphy_params bitfield values
 * 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
 */
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,
863
	WIPHY_PARAM_COVERAGE_CLASS	= 1 << 4,
864
865
};

866
867
868
869
870
871
872
873
874
875
876
877
878
/**
 * enum tx_power_setting - TX power adjustment
 *
 * @TX_POWER_AUTOMATIC: the dbm parameter is ignored
 * @TX_POWER_LIMITED: limit TX power by the dbm parameter
 * @TX_POWER_FIXED: fix TX power to the dbm parameter
 */
enum tx_power_setting {
	TX_POWER_AUTOMATIC,
	TX_POWER_LIMITED,
	TX_POWER_FIXED,
};

Johannes Berg's avatar
Johannes Berg committed
879
880
881
882
883
884
/*
 * cfg80211_bitrate_mask - masks for bitrate control
 */
struct cfg80211_bitrate_mask {
	struct {
		u32 legacy;
885
886
		/* TODO: add support for masking MCS rates; e.g.: */
		/* u8 mcs[IEEE80211_HT_MCS_MASK_LEN]; */
Johannes Berg's avatar
Johannes Berg committed
887
888
	} control[IEEE80211_NUM_BANDS];
};
Samuel Ortiz's avatar
Samuel Ortiz committed
889
890
891
892
893
894
895
896
897
898
899
900
901
/**
 * struct cfg80211_pmksa - PMK Security Association
 *
 * This structure is passed to the set/del_pmksa() method for PMKSA
 * caching.
 *
 * @bssid: The AP's BSSID.
 * @pmkid: The PMK material itself.
 */
struct cfg80211_pmksa {
	u8 *bssid;
	u8 *pmkid;
};
Johannes Berg's avatar
Johannes Berg committed
902

903
904
905
906
907
908
909
910
911
/**
 * 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.
 *
912
913
914
915
 * All operations are currently invoked under rtnl for consistency with the
 * wireless extensions but this is subject to reevaluation as soon as this
 * code is used more widely and we have a first user without wext.
 *
Johannes Berg's avatar
Johannes Berg committed
916
917
918
 * @suspend: wiphy device needs to be suspended
 * @resume: wiphy device needs to be resumed
 *
Johannes Berg's avatar
Johannes Berg committed
919
 * @add_virtual_intf: create a new virtual interface with the given name,
920
921
 *	must set the struct wireless_dev's iftype. Beware: You must create
 *	the new netdev in the wiphy's network namespace!
922
923
 *
 * @del_virtual_intf: remove the virtual interface determined by ifindex.
924
 *
Johannes Berg's avatar
Johannes Berg committed
925
926
 * @change_virtual_intf: change type/configuration of virtual interface,
 *	keep the struct wireless_dev's iftype updated.
927
 *
928
929
930
931
932
933
 * @add_key: add a key with the given parameters. @mac_addr will be %NULL
 *	when adding a group key.
 *
 * @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
934
935
 *	after it returns. This function should return an error if it is
 *	not possible to retrieve the key, -ENOENT if it doesn't exist.
936
937
 *
 * @del_key: remove a key given the @mac_addr (%NULL for a group key)
938
 *	and @key_index, return -ENOENT if the key doesn't exist.
939
940
 *
 * @set_default_key: set the default key on an interface
941
 *
942
943
 * @set_default_mgmt_key: set the default management frame key on an interface
 *
944
945
946
947
948
949
 * @add_beacon: Add a beacon with given parameters, @head, @interval
 *	and @dtim_period will be valid, @tail is optional.
 * @set_beacon: Change the beacon parameters for an access point mode
 *	interface. This should reject the call when no beacon has been
 *	configured.
 * @del_beacon: Remove beacon configuration and stop sending the beacon.
950
951
952
953
954
955
 *
 * @add_station: Add a new station.
 *
 * @del_station: Remove a station; @mac may be NULL to remove all stations.
 *
 * @change_station: Modify a given station.
956
 *
957
958
959
960
961
962
 * @get_mesh_params: Put the current mesh parameters into *params
 *
 * @set_mesh_params: Set mesh parameters.
 *	The mask is a bitfield which tells us which parameters to
 *	set, and which to leave alone.
 *
963
 * @set_mesh_cfg: set mesh parameters (by now, just mesh id)
964
965
 *
 * @change_bss: Modify parameters for a given BSS.
966
967
 *
 * @set_txq_params: Set TX queue parameters
968
 *
969
970
971
972
973
 * @set_channel: Set channel for a given wireless interface. Some devices
 *	may support multi-channel operation (by channel hopping) so cfg80211
 *	doesn't verify much. Note, however, that the passed netdev may be
 *	%NULL as well if the user requested changing the channel for the
 *	device itself, or for a monitor interface.
974
 *
975
976
977
978
 * @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.
979
980
981
982
983
 *
 * @auth: Request to authenticate with the specified peer
 * @assoc: Request to (re)associate with the specified peer
 * @deauth: Request to deauthenticate from the specified peer
 * @disassoc: Request to disassociate from the specified peer
Johannes Berg's avatar
Johannes Berg committed
984
 *
985
986
987
988
989
990
 * @connect: Connect to the ESS with the specified parameters. When connected,
 *	call cfg80211_connect_result() with status code %WLAN_STATUS_SUCCESS.
 *	If the connection fails for some reason, call cfg80211_connect_result()
 *	with the status from the AP.
 * @disconnect: Disconnect from the BSS/ESS.
 *
Johannes Berg's avatar
Johannes Berg committed
991
992
993
994
 * @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.
 * @leave_ibss: Leave the IBSS.
995
996
997
998
999
 *
 * @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.
1000
1001
1002
 *
 * @set_tx_power: set the transmit power according to the parameters
 * @get_tx_power: store the current TX power into the dbm variable;
Johannes Berg's avatar
Johannes Berg committed
1003
1004
1005
1006
 *	return 0 if successful
 *
 * @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting
 *	functions to adjust rfkill hw state
1007
 *
1008
1009
 * @dump_survey: get site survey information.
 *
1010
1011
1012
1013
1014
1015
1016
1017
 * @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.
1018
 * @action: Transmit an action frame
1019
 *
1020
 * @testmode_cmd: run a test mode command
Samuel Ortiz's avatar
Samuel Ortiz committed
1021
1022
1023
1024
1025
1026
 *
 * @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.
1027
1028
 * @set_power_mgmt: Configure WLAN power management. A timeout value of -1
 *	allows the driver to adjust the dynamic ps timeout value.
1029
 * @set_cqm_rssi_config: Configure connection quality monitor RSSI threshold.
Samuel Ortiz's avatar
Samuel Ortiz committed
1030
 *
1031
1032
 */
struct cfg80211_ops {
Johannes Berg's avatar
Johannes Berg committed
1033
1034
1035
	int	(*suspend)(struct wiphy *wiphy);
	int	(*resume)(struct wiphy *wiphy);

1036
	int	(*add_virtual_intf)(struct wiphy *wiphy, char *name,
1037
1038
				    enum nl80211_iftype type, u32 *flags,
				    struct vif_params *params);
1039
	int	(*del_virtual_intf)(struct wiphy *wiphy, struct net_device *dev);
1040
1041
	int	(*change_virtual_intf)(struct wiphy *wiphy,
				       struct net_device *dev,
1042
1043
				       enum nl80211_iftype type, u32 *flags,
				       struct vif_params *params);
1044
1045

	int	(*add_key)(struct wiphy *wiphy, struct net_device *netdev,
1046
			   u8 key_index, const u8 *mac_addr,
1047
1048
			   struct key_params *params);
	int	(*get_key)(struct wiphy *wiphy, struct net_device *netdev,
1049
			   u8 key_index, const u8 *mac_addr, void *cookie,
1050
1051
			   void (*callback)(void *cookie, struct key_params*));
	int	(*del_key)(struct wiphy *wiphy, struct net_device *netdev,
1052
			   u8 key_index, const u8 *mac_addr);
1053
1054
1055
	int	(*set_default_key)(struct wiphy *wiphy,
				   struct net_device *netdev,
				   u8 key_index);
1056
1057
1058
	int	(*set_default_mgmt_key)(struct wiphy *wiphy,
					struct net_device *netdev,
					u8 key_index);
1059
1060
1061
1062
1063
1064

	int	(*add_beacon)(struct wiphy *wiphy, struct net_device *dev,
			      struct beacon_parameters *info);
	int	(*set_beacon)(struct wiphy *wiphy, struct net_device *dev,
			      struct beacon_parameters *info);
	int	(*del_beacon)(struct wiphy *wiphy, struct net_device *dev);
1065
1066
1067
1068
1069
1070
1071
1072


	int	(*add_station)(struct wiphy *wiphy, struct net_device *dev,
			       u8 *mac, struct station_parameters *params);
	int	(*del_station)(struct wiphy *wiphy, struct net_device *dev,
			       u8 *mac);
	int	(*change_station)(struct wiphy *wiphy, struct net_device *dev,
				  u8 *mac, struct station_parameters *params);
1073
	int	(*get_station)(struct wiphy *wiphy, struct net_device *dev,
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
			       u8 *mac, struct station_info *sinfo);
	int	(*dump_station)(struct wiphy *wiphy, struct net_device *dev,
			       int idx, u8 *mac, struct station_info *sinfo);

	int	(*add_mpath)(struct wiphy *wiphy, struct net_device *dev,
			       u8 *dst, u8 *next_hop);
	int	(*del_mpath)(struct wiphy *wiphy, struct net_device *dev,
			       u8 *dst);
	int	(*change_mpath)(struct wiphy *wiphy, struct net_device *dev,
				  u8 *dst, u8 *next_hop);
	int	(*get_mpath)(struct wiphy *wiphy, struct net_device *dev,
			       u8 *dst, u8 *next_hop,
			       struct mpath_info *pinfo);
	int	(*dump_mpath)(struct wiphy *wiphy, struct net_device *dev,
			       int idx, u8 *dst, u8 *next_hop,
			       struct mpath_info *pinfo);
1090
1091
1092
1093
1094
1095
	int	(*get_mesh_params)(struct wiphy *wiphy,
				struct net_device *dev,
				struct mesh_config *conf);
	int	(*set_mesh_params)(struct wiphy *wiphy,
				struct net_device *dev,
				const struct mesh_config *nconf, u32 mask);
1096
1097
	int	(*change_bss)(struct wiphy *wiphy, struct net_device *dev,
			      struct bss_parameters *params);
1098
1099
1100

	int	(*set_txq_params)(struct wiphy *wiphy,
				  struct ieee80211_txq_params *params);
1101

1102
	int	(*set_channel)(struct wiphy *wiphy, struct net_device *dev,
1103
			       struct ieee80211_channel *chan,
Sujith's avatar
Sujith committed
1104
			       enum nl80211_channel_type channel_type);
1105

1106
1107
	int	(*scan)(struct wiphy *wiphy, struct net_device *dev,
			struct cfg80211_scan_request *request);
1108
1109
1110
1111
1112
1113

	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,
Johannes Berg's avatar
Johannes Berg committed
1114
1115
			  struct cfg80211_deauth_request *req,
			  void *cookie);
1116
	int	(*disassoc)(struct wiphy *wiphy, struct net_device *dev,
Johannes Berg's avatar
Johannes Berg committed
1117
1118
			    struct cfg80211_disassoc_request *req,
			    void *cookie);
Johannes Berg's avatar
Johannes Berg committed
1119

1120
1121
1122
1123
1124
	int	(*connect)(struct wiphy *wiphy, struct net_device *dev,
			   struct cfg80211_connect_params *sme);
	int	(*disconnect)(struct wiphy *wiphy, struct net_device *dev,
			      u16 reason_code);

Johannes Berg's avatar
Johannes Berg committed
1125
1126
1127
	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);
1128
1129

	int	(*set_wiphy_params)(struct wiphy *wiphy, u32 changed);
1130
1131
1132
1133

	int	(*set_tx_power)(struct wiphy *wiphy,
				enum tx_power_setting type, int dbm);
	int	(*get_tx_power)(struct wiphy *wiphy, int *dbm);
Johannes Berg's avatar
Johannes Berg committed
1134

1135
1136
1137
	int	(*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev,
				u8 *addr);

Johannes Berg's avatar
Johannes Berg committed
1138
	void	(*rfkill_poll)(struct wiphy *wiphy);
1139
1140
1141
1142

#ifdef CONFIG_NL80211_TESTMODE
	int	(*testmode_cmd)(struct wiphy *wiphy, void *data, int len);
#endif
Johannes Berg's avatar
Johannes Berg committed
1143

Johannes Berg's avatar
Johannes Berg committed
1144
1145
1146
1147
1148
	int	(*set_bitrate_mask)(struct wiphy *wiphy,
				    struct net_device *dev,
				    const u8 *peer,
				    const struct cfg80211_bitrate_mask *mask);

1149
1150
1151
	int	(*dump_survey)(struct wiphy *wiphy, struct net_device *netdev,
			int idx, struct survey_info *info);

Samuel Ortiz's avatar
Samuel Ortiz committed
1152
1153
1154
1155
1156
1157
	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);

1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
	int	(*remain_on_channel)(struct wiphy *wiphy,
				     struct net_device *dev,
				     struct ieee80211_channel *chan,
				     enum nl80211_channel_type channel_type,
				     unsigned int duration,
				     u64 *cookie);
	int	(*cancel_remain_on_channel)(struct wiphy *wiphy,
					    struct net_device *dev,
					    u64 cookie);

1168
1169
1170
1171
1172
	int	(*action)(struct wiphy *wiphy, struct net_device *dev,
			  struct ieee80211_channel *chan,
			  enum nl80211_channel_type channel_type,
			  const u8 *buf, size_t len, u64 *cookie);

Johannes Berg's avatar
Johannes Berg committed
1173
1174
	int	(*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev,
				  bool enabled, int timeout);
1175
1176
1177
1178

	int	(*set_cqm_rssi_config)(struct wiphy *wiphy,
				       struct net_device *dev,
				       s32 rssi_thold, u32 rssi_hyst);
1179
1180
};

Johannes Berg's avatar
Johannes Berg committed
1181
1182
1183
1184
1185
1186
/*
 * wireless hardware and networking interfaces structures
 * and registration/helper functions
 */

/**
1187
1188
1189
 * enum wiphy_flags - wiphy capability flags
 *
 * @WIPHY_FLAG_CUSTOM_REGULATORY:  tells us the driver for this device
Johannes Berg's avatar
Johannes Berg committed
1190
1191
1192
1193
 * 	has its own custom regulatory domain and cannot identify the
 * 	ISO / IEC 3166 alpha2 it belongs to. When this is enabled
 * 	we will disregard the first regulatory hint (when the
 * 	initiator is %REGDOM_SET_BY_CORE).
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
 * @WIPHY_FLAG_STRICT_REGULATORY: tells us the driver for this device will
 *	ignore regulatory domain settings until it gets its own regulatory
 *	domain via its regulatory_hint(). After its gets its own regulatory
 *	domain it will only allow further regulatory domain settings to
 *	further enhance compliance. For example if channel 13 and 14 are
 *	disabled by this regulatory domain no user regulatory domain can
 *	enable these channels at a later time. This can be used for devices
 *	which do not have calibration information gauranteed for frequencies
 *	or settings outside of its regulatory domain.
 * @WIPHY_FLAG_DISABLE_BEACON_HINTS: enable this if your driver needs to ensure
 *	that passive scan flags and beaconing flags may not be lifted by
 *	cfg80211 due to regulatory beacon hints. For more information on beacon
1206
 *	hints read the documenation for regulatory_hint_found_beacon()
1207
1208
1209
1210
1211
1212
 * @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
1213
1214
1215
 * @WIPHY_FLAG_4ADDR_AP: supports 4addr mode even on AP (with a single station
 *	on a VLAN interface)
 * @WIPHY_FLAG_4ADDR_STATION: supports 4addr mode even as a station
1216
1217
1218
1219
1220
1221
1222
 */
enum wiphy_flags {
	WIPHY_FLAG_CUSTOM_REGULATORY	= BIT(0),
	WIPHY_FLAG_STRICT_REGULATORY	= BIT(1),
	WIPHY_FLAG_DISABLE_BEACON_HINTS	= BIT(2),
	WIPHY_FLAG_NETNS_OK		= BIT(3),
	WIPHY_FLAG_PS_ON_BY_DEFAULT	= BIT(4),
1223
1224
	WIPHY_FLAG_4ADDR_AP		= BIT(5),
	WIPHY_FLAG_4ADDR_STATION	= BIT(6),
1225
1226
};

1227
1228
1229
1230
struct mac_address {
	u8 addr[ETH_ALEN];
};

1231
1232
1233
1234
/**
 * struct wiphy - wireless hardware description
 * @idx: the wiphy index assigned to this item
 * @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name>
Johannes Berg's avatar
Johannes Berg committed
1235
1236
1237
1238
1239
1240
1241
1242
 * @reg_notifier: the driver's regulatory notification callback
 * @regd: the driver's regulatory domain, if one was requested via
 * 	the regulatory_hint() API. This can be used by the driver
 *	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
1243
1244
1245
1246
1247
 * @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
1248
 * @net: the network namespace this wiphy currently lives in
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
 * @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
 *	four bits are variable then set it to 00:...:00:0f. The actual
 *	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.
Johannes Berg's avatar
Johannes Berg committed
1261
1262
1263
1264
 */
struct wiphy {
	/* assign these fields before you register the wiphy */

1265
	/* permanent MAC address(es) */
Johannes Berg's avatar
Johannes Berg committed
1266
	u8 perm_addr[ETH_ALEN];
1267
1268
1269
1270
	u8 addr_mask[ETH_ALEN];

	u16 n_addresses;
	struct mac_address *addresses;
Johannes Berg's avatar
Johannes Berg committed
1271
1272
1273
1274

	/* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */
	u16 interface_modes;

1275
	u32 flags;
1276

Johannes Berg's avatar
Johannes Berg committed
1277
1278
1279
1280
1281
1282
1283
1284
1285
	enum cfg80211_signal_type signal_type;

	int bss_priv_size;
	u8 max_scan_ssids;
	u16 max_scan_ie_len;

	int n_cipher_suites;
	const u32 *cipher_suites;

1286
1287
1288
1289
	u8 retry_short;
	u8 retry_long;
	u32 frag_threshold;
	u32 rts_threshold;
1290
	u8 coverage_class;
1291

1292
1293
1294
	char fw_version[ETHTOOL_BUSINFO_LEN];
	u32 hw_version;

Samuel Ortiz's avatar
Samuel Ortiz committed
1295
1296
	u8 max_num_pmkids;

Johannes Berg's avatar
Johannes Berg committed
1297
1298
1299
1300
1301
	/* If multiple wiphys are registered and you're handed e.g.
	 * a regular netdev with assigned ieee80211_ptr, you won't
	 * know whether it points to a wiphy your driver has registered
	 * or not. Assign this to something global to your driver to
	 * help determine whether you own this wiphy or not. */
1302
	const void *privid;
Johannes Berg's avatar
Johannes Berg committed
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320

	struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS];

	/* Lets us get back the wiphy on the callback */
	int (*reg_notifier)(struct wiphy *wiphy,
			    struct regulatory_request *request);

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

	const struct ieee80211_regdomain *regd;

	/* the item in /sys/class/ieee80211/ points to this,
	 * you need use set_wiphy_dev() (see below) */
	struct device dev;

	/* dir in debugfs: ieee80211/<wiphyname> */
	struct dentry *debugfsdir;

1321
1322
1323
1324
1325
#ifdef CONFIG_NET_NS
	/* the network namespace this phy lives in currently */
	struct net *_net;
#endif

Johannes Berg's avatar
Johannes Berg committed
1326
1327
1328
1329
#ifdef CONFIG_CFG80211_WEXT
	const struct iw_handler_def *wext;
#endif

Johannes Berg's avatar
Johannes Berg committed
1330
1331
1332
	char priv[0] __attribute__((__aligned__(NETDEV_ALIGN)));
};

1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
#ifdef CONFIG_NET_NS
static inline struct net *wiphy_net(struct wiphy *wiphy)
{
	return wiphy->_net;
}

static inline void wiphy_net_set(struct wiphy *wiphy, struct net *net)
{
	wiphy->_net = net;
}
#else
static inline struct net *wiphy_net(struct wiphy *wiphy)
{
	return &init_net;
}

static inline void wiphy_net_set(struct wiphy *wiphy, struct net *net)
{
}
#endif

Johannes Berg's avatar
Johannes Berg committed
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
/**
 * wiphy_priv - return priv from wiphy
 *
 * @wiphy: the wiphy whose priv pointer to return
 */
static inline void *wiphy_priv(struct wiphy *wiphy)
{
	BUG_ON(!wiphy);
	return &wiphy->priv;
}

1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
/**
 * priv_to_wiphy - return the wiphy containing the priv
 *
 * @priv: a pointer previously returned by wiphy_priv
 */
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
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
/**
 * 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
 */
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
 */
static inline const char *wiphy_name(struct wiphy *wiphy)
{
	return dev_name(&wiphy->dev);
}

/**
 * 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.
 *
 * The returned pointer must be assigned to each netdev's
 * ieee80211_ptr for proper operation.
 */
1419
struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv);
Johannes Berg's avatar
Johannes Berg committed
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447

/**
 * wiphy_register - register a wiphy with cfg80211
 *
 * @wiphy: The wiphy to register.
 *
 * Returns a non-negative wiphy index or a negative error code.
 */
extern int wiphy_register(struct wiphy *wiphy);

/**
 * 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.
 */
extern void wiphy_unregister(struct wiphy *wiphy);

/**
 * wiphy_free - free wiphy
 *
 * @wiphy: The wiphy to free
 */
extern void wiphy_free(struct wiphy *wiphy);

Johannes Berg's avatar
Johannes Berg committed
1448
/* internal structs */
1449
struct cfg80211_conn;
Johannes Berg's avatar
Johannes Berg committed
1450
struct cfg80211_internal_bss;
Johannes Berg's avatar
Johannes Berg committed
1451
struct cfg80211_cached_keys;
Johannes Berg's avatar
Johannes Berg committed
1452
1453

#define MAX_AUTH_BSSES		4
1454

Johannes Berg's avatar
Johannes Berg committed
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
/**
 * struct wireless_dev - wireless per-netdev state
 *
 * This structure must be allocated by the driver/stack
 * that uses the ieee80211_ptr field in struct net_device
 * (this is intentional so it can be allocated along with
 * the netdev.)
 *
 * @wiphy: pointer to hardware description
 * @iftype: interface type
 * @list: (private) Used to collect the interfaces
 * @netdev: (private) Used to reference back to the netdev
 * @current_bss: (private) Used by the internal configuration code
1468
1469
 * @channel: (private) Used by the internal configuration code to track
 *	user-set AP, monitor and WDS channels for wireless extensions
Johannes Berg's avatar
Johannes Berg committed
1470
1471
1472
1473
1474
 * @bssid: (private) Used by the internal configuration code
 * @ssid: (private) Used by the internal configuration code
 * @ssid_len: (private) Used by the internal configuration code
 * @wext: (private) Used by the internal wireless extensions compat code
 * @wext_bssid: (private) Used by the internal wireless extensions compat code
1475
1476
1477
1478
 * @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
1479
1480
 * @action_registrations: list of registrations for action frames
 * @action_registrations_lock: lock for the list
Johannes Berg's avatar
Johannes Berg committed
1481
1482
1483
1484
1485
 */
struct wireless_dev {
	struct wiphy *wiphy;
	enum nl80211_iftype iftype;

Johannes Berg's avatar
Johannes Berg committed
1486
	/* the remainder of this struct should be private to cfg80211 */
Johannes Berg's avatar
Johannes Berg committed
1487
1488
1489
	struct list_head list;
	struct net_device *netdev;

1490
1491
1492
	struct list_head action_registrations;
	spinlock_t action_registrations_lock;

Johannes Berg's avatar
Johannes Berg committed
1493
1494
	struct mutex mtx;

1495
1496
	struct work_struct cleanup_work;

1497
1498
	bool use_4addr;

1499
	/* currently used for IBSS and SME - might be rearranged later */
Johannes Berg's avatar
Johannes Berg committed
1500
1501
	u8 ssid[IEEE80211_MAX_SSID_LEN];
	u8 ssid_len;
1502
1503
	enum {
		CFG80211_SME_IDLE,
1504
		CFG80211_SME_CONNECTING,