xref: /linux/include/net/cfg80211.h (revision a5766f11cfd3a0c03450d99c8fe548c2940be884)
1 #ifndef __NET_CFG80211_H
2 #define __NET_CFG80211_H
3 
4 #include <linux/netlink.h>
5 #include <linux/skbuff.h>
6 #include <linux/nl80211.h>
7 #include <net/genetlink.h>
8 
9 /*
10  * 802.11 configuration in-kernel interface
11  *
12  * Copyright 2006, 2007	Johannes Berg <johannes@sipsolutions.net>
13  */
14 
15 /**
16  * struct vif_params - describes virtual interface parameters
17  * @mesh_id: mesh ID to use
18  * @mesh_id_len: length of the mesh ID
19  */
20 struct vif_params {
21        u8 *mesh_id;
22        int mesh_id_len;
23 };
24 
25 /* Radiotap header iteration
26  *   implemented in net/wireless/radiotap.c
27  *   docs in Documentation/networking/radiotap-headers.txt
28  */
29 /**
30  * struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args
31  * @rtheader: pointer to the radiotap header we are walking through
32  * @max_length: length of radiotap header in cpu byte ordering
33  * @this_arg_index: IEEE80211_RADIOTAP_... index of current arg
34  * @this_arg: pointer to current radiotap arg
35  * @arg_index: internal next argument index
36  * @arg: internal next argument pointer
37  * @next_bitmap: internal pointer to next present u32
38  * @bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present
39  */
40 
41 struct ieee80211_radiotap_iterator {
42 	struct ieee80211_radiotap_header *rtheader;
43 	int max_length;
44 	int this_arg_index;
45 	u8 *this_arg;
46 
47 	int arg_index;
48 	u8 *arg;
49 	__le32 *next_bitmap;
50 	u32 bitmap_shifter;
51 };
52 
53 extern int ieee80211_radiotap_iterator_init(
54    struct ieee80211_radiotap_iterator *iterator,
55    struct ieee80211_radiotap_header *radiotap_header,
56    int max_length);
57 
58 extern int ieee80211_radiotap_iterator_next(
59    struct ieee80211_radiotap_iterator *iterator);
60 
61 
62  /**
63  * struct key_params - key information
64  *
65  * Information about a key
66  *
67  * @key: key material
68  * @key_len: length of key material
69  * @cipher: cipher suite selector
70  * @seq: sequence counter (IV/PN) for TKIP and CCMP keys, only used
71  *	with the get_key() callback, must be in little endian,
72  *	length given by @seq_len.
73  */
74 struct key_params {
75 	u8 *key;
76 	u8 *seq;
77 	int key_len;
78 	int seq_len;
79 	u32 cipher;
80 };
81 
82 /**
83  * struct beacon_parameters - beacon parameters
84  *
85  * Used to configure the beacon for an interface.
86  *
87  * @head: head portion of beacon (before TIM IE)
88  *     or %NULL if not changed
89  * @tail: tail portion of beacon (after TIM IE)
90  *     or %NULL if not changed
91  * @interval: beacon interval or zero if not changed
92  * @dtim_period: DTIM period or zero if not changed
93  * @head_len: length of @head
94  * @tail_len: length of @tail
95  */
96 struct beacon_parameters {
97 	u8 *head, *tail;
98 	int interval, dtim_period;
99 	int head_len, tail_len;
100 };
101 
102 /**
103  * enum station_flags - station flags
104  *
105  * Station capability flags. Note that these must be the bits
106  * according to the nl80211 flags.
107  *
108  * @STATION_FLAG_CHANGED: station flags were changed
109  * @STATION_FLAG_AUTHORIZED: station is authorized to send frames (802.1X)
110  * @STATION_FLAG_SHORT_PREAMBLE: station is capable of receiving frames
111  *	with short preambles
112  * @STATION_FLAG_WME: station is WME/QoS capable
113  */
114 enum station_flags {
115 	STATION_FLAG_CHANGED		= 1<<0,
116 	STATION_FLAG_AUTHORIZED		= 1<<NL80211_STA_FLAG_AUTHORIZED,
117 	STATION_FLAG_SHORT_PREAMBLE	= 1<<NL80211_STA_FLAG_SHORT_PREAMBLE,
118 	STATION_FLAG_WME		= 1<<NL80211_STA_FLAG_WME,
119 };
120 
121 /**
122  * enum plink_action - actions to perform in mesh peers
123  *
124  * @PLINK_ACTION_INVALID: action 0 is reserved
125  * @PLINK_ACTION_OPEN: start mesh peer link establishment
126  * @PLINK_ACTION_BLOCL: block traffic from this mesh peer
127  */
128 enum plink_actions {
129 	PLINK_ACTION_INVALID,
130 	PLINK_ACTION_OPEN,
131 	PLINK_ACTION_BLOCK,
132 };
133 
134 /**
135  * struct station_parameters - station parameters
136  *
137  * Used to change and create a new station.
138  *
139  * @vlan: vlan interface station should belong to
140  * @supported_rates: supported rates in IEEE 802.11 format
141  *	(or NULL for no change)
142  * @supported_rates_len: number of supported rates
143  * @station_flags: station flags (see &enum station_flags)
144  * @listen_interval: listen interval or -1 for no change
145  * @aid: AID or zero for no change
146  */
147 struct station_parameters {
148 	u8 *supported_rates;
149 	struct net_device *vlan;
150 	u32 station_flags;
151 	int listen_interval;
152 	u16 aid;
153 	u8 supported_rates_len;
154 	u8 plink_action;
155 	struct ieee80211_ht_cap *ht_capa;
156 };
157 
158 /**
159  * enum station_info_flags - station information flags
160  *
161  * Used by the driver to indicate which info in &struct station_info
162  * it has filled in during get_station() or dump_station().
163  *
164  * @STATION_INFO_INACTIVE_TIME: @inactive_time filled
165  * @STATION_INFO_RX_BYTES: @rx_bytes filled
166  * @STATION_INFO_TX_BYTES: @tx_bytes filled
167  * @STATION_INFO_LLID: @llid filled
168  * @STATION_INFO_PLID: @plid filled
169  * @STATION_INFO_PLINK_STATE: @plink_state filled
170  */
171 enum station_info_flags {
172 	STATION_INFO_INACTIVE_TIME	= 1<<0,
173 	STATION_INFO_RX_BYTES		= 1<<1,
174 	STATION_INFO_TX_BYTES		= 1<<2,
175 	STATION_INFO_LLID		= 1<<3,
176 	STATION_INFO_PLID		= 1<<4,
177 	STATION_INFO_PLINK_STATE	= 1<<5,
178 };
179 
180 /**
181  * struct station_info - station information
182  *
183  * Station information filled by driver for get_station() and dump_station.
184  *
185  * @filled: bitflag of flags from &enum station_info_flags
186  * @inactive_time: time since last station activity (tx/rx) in milliseconds
187  * @rx_bytes: bytes received from this station
188  * @tx_bytes: bytes transmitted to this station
189  * @llid: mesh local link id
190  * @plid: mesh peer link id
191  * @plink_state: mesh peer link state
192  */
193 struct station_info {
194 	u32 filled;
195 	u32 inactive_time;
196 	u32 rx_bytes;
197 	u32 tx_bytes;
198 	u16 llid;
199 	u16 plid;
200 	u8 plink_state;
201 };
202 
203 /**
204  * enum monitor_flags - monitor flags
205  *
206  * Monitor interface configuration flags. Note that these must be the bits
207  * according to the nl80211 flags.
208  *
209  * @MONITOR_FLAG_FCSFAIL: pass frames with bad FCS
210  * @MONITOR_FLAG_PLCPFAIL: pass frames with bad PLCP
211  * @MONITOR_FLAG_CONTROL: pass control frames
212  * @MONITOR_FLAG_OTHER_BSS: disable BSSID filtering
213  * @MONITOR_FLAG_COOK_FRAMES: report frames after processing
214  */
215 enum monitor_flags {
216 	MONITOR_FLAG_FCSFAIL		= 1<<NL80211_MNTR_FLAG_FCSFAIL,
217 	MONITOR_FLAG_PLCPFAIL		= 1<<NL80211_MNTR_FLAG_PLCPFAIL,
218 	MONITOR_FLAG_CONTROL		= 1<<NL80211_MNTR_FLAG_CONTROL,
219 	MONITOR_FLAG_OTHER_BSS		= 1<<NL80211_MNTR_FLAG_OTHER_BSS,
220 	MONITOR_FLAG_COOK_FRAMES	= 1<<NL80211_MNTR_FLAG_COOK_FRAMES,
221 };
222 
223 /**
224  * enum mpath_info_flags -  mesh path information flags
225  *
226  * Used by the driver to indicate which info in &struct mpath_info it has filled
227  * in during get_station() or dump_station().
228  *
229  * MPATH_INFO_FRAME_QLEN: @frame_qlen filled
230  * MPATH_INFO_DSN: @dsn filled
231  * MPATH_INFO_METRIC: @metric filled
232  * MPATH_INFO_EXPTIME: @exptime filled
233  * MPATH_INFO_DISCOVERY_TIMEOUT: @discovery_timeout filled
234  * MPATH_INFO_DISCOVERY_RETRIES: @discovery_retries filled
235  * MPATH_INFO_FLAGS: @flags filled
236  */
237 enum mpath_info_flags {
238 	MPATH_INFO_FRAME_QLEN		= BIT(0),
239 	MPATH_INFO_DSN			= BIT(1),
240 	MPATH_INFO_METRIC		= BIT(2),
241 	MPATH_INFO_EXPTIME		= BIT(3),
242 	MPATH_INFO_DISCOVERY_TIMEOUT	= BIT(4),
243 	MPATH_INFO_DISCOVERY_RETRIES	= BIT(5),
244 	MPATH_INFO_FLAGS		= BIT(6),
245 };
246 
247 /**
248  * struct mpath_info - mesh path information
249  *
250  * Mesh path information filled by driver for get_mpath() and dump_mpath().
251  *
252  * @filled: bitfield of flags from &enum mpath_info_flags
253  * @frame_qlen: number of queued frames for this destination
254  * @dsn: destination sequence number
255  * @metric: metric (cost) of this mesh path
256  * @exptime: expiration time for the mesh path from now, in msecs
257  * @flags: mesh path flags
258  * @discovery_timeout: total mesh path discovery timeout, in msecs
259  * @discovery_retries: mesh path discovery retries
260  */
261 struct mpath_info {
262 	u32 filled;
263 	u32 frame_qlen;
264 	u32 dsn;
265 	u32 metric;
266 	u32 exptime;
267 	u32 discovery_timeout;
268 	u8 discovery_retries;
269 	u8 flags;
270 };
271 
272 /**
273  * struct bss_parameters - BSS parameters
274  *
275  * Used to change BSS parameters (mainly for AP mode).
276  *
277  * @use_cts_prot: Whether to use CTS protection
278  *	(0 = no, 1 = yes, -1 = do not change)
279  * @use_short_preamble: Whether the use of short preambles is allowed
280  *	(0 = no, 1 = yes, -1 = do not change)
281  * @use_short_slot_time: Whether the use of short slot time is allowed
282  *	(0 = no, 1 = yes, -1 = do not change)
283  */
284 struct bss_parameters {
285 	int use_cts_prot;
286 	int use_short_preamble;
287 	int use_short_slot_time;
288 };
289 
290 /**
291  * enum reg_set_by - Indicates who is trying to set the regulatory domain
292  * @REGDOM_SET_BY_INIT: regulatory domain was set by initialization. We will be
293  * 	using a static world regulatory domain by default.
294  * @REGDOM_SET_BY_CORE: Core queried CRDA for a dynamic world regulatory domain.
295  * @REGDOM_SET_BY_USER: User asked the wireless core to set the
296  * 	regulatory domain.
297  * @REGDOM_SET_BY_DRIVER: a wireless drivers has hinted to the wireless core
298  *	it thinks its knows the regulatory domain we should be in.
299  * @REGDOM_SET_BY_COUNTRY_IE: the wireless core has received an 802.11 country
300  *	information element with regulatory information it thinks we
301  *	should consider.
302  */
303 enum reg_set_by {
304 	REGDOM_SET_BY_INIT,
305 	REGDOM_SET_BY_CORE,
306 	REGDOM_SET_BY_USER,
307 	REGDOM_SET_BY_DRIVER,
308 	REGDOM_SET_BY_COUNTRY_IE,
309 };
310 
311 struct ieee80211_freq_range {
312 	u32 start_freq_khz;
313 	u32 end_freq_khz;
314 	u32 max_bandwidth_khz;
315 };
316 
317 struct ieee80211_power_rule {
318 	u32 max_antenna_gain;
319 	u32 max_eirp;
320 };
321 
322 struct ieee80211_reg_rule {
323 	struct ieee80211_freq_range freq_range;
324 	struct ieee80211_power_rule power_rule;
325 	u32 flags;
326 };
327 
328 struct ieee80211_regdomain {
329 	u32 n_reg_rules;
330 	char alpha2[2];
331 	struct ieee80211_reg_rule reg_rules[];
332 };
333 
334 #define MHZ_TO_KHZ(freq) (freq * 1000)
335 #define KHZ_TO_MHZ(freq) (freq / 1000)
336 #define DBI_TO_MBI(gain) (gain * 100)
337 #define MBI_TO_DBI(gain) (gain / 100)
338 #define DBM_TO_MBM(gain) (gain * 100)
339 #define MBM_TO_DBM(gain) (gain / 100)
340 
341 #define REG_RULE(start, end, bw, gain, eirp, reg_flags) { \
342 	.freq_range.start_freq_khz = (start) * 1000, \
343 	.freq_range.end_freq_khz = (end) * 1000, \
344 	.freq_range.max_bandwidth_khz = (bw) * 1000, \
345 	.power_rule.max_antenna_gain = (gain) * 100, \
346 	.power_rule.max_eirp = (eirp) * 100, \
347 	.flags = reg_flags, \
348 	}
349 
350 /* from net/wireless.h */
351 struct wiphy;
352 
353 /**
354  * struct cfg80211_ops - backend description for wireless configuration
355  *
356  * This struct is registered by fullmac card drivers and/or wireless stacks
357  * in order to handle configuration requests on their interfaces.
358  *
359  * All callbacks except where otherwise noted should return 0
360  * on success or a negative error code.
361  *
362  * All operations are currently invoked under rtnl for consistency with the
363  * wireless extensions but this is subject to reevaluation as soon as this
364  * code is used more widely and we have a first user without wext.
365  *
366  * @add_virtual_intf: create a new virtual interface with the given name,
367  *	must set the struct wireless_dev's iftype.
368  *
369  * @del_virtual_intf: remove the virtual interface determined by ifindex.
370  *
371  * @change_virtual_intf: change type/configuration of virtual interface,
372  *	keep the struct wireless_dev's iftype updated.
373  *
374  * @add_key: add a key with the given parameters. @mac_addr will be %NULL
375  *	when adding a group key.
376  *
377  * @get_key: get information about the key with the given parameters.
378  *	@mac_addr will be %NULL when requesting information for a group
379  *	key. All pointers given to the @callback function need not be valid
380  *	after it returns.
381  *
382  * @del_key: remove a key given the @mac_addr (%NULL for a group key)
383  *	and @key_index
384  *
385  * @set_default_key: set the default key on an interface
386  *
387  * @add_beacon: Add a beacon with given parameters, @head, @interval
388  *	and @dtim_period will be valid, @tail is optional.
389  * @set_beacon: Change the beacon parameters for an access point mode
390  *	interface. This should reject the call when no beacon has been
391  *	configured.
392  * @del_beacon: Remove beacon configuration and stop sending the beacon.
393  *
394  * @add_station: Add a new station.
395  *
396  * @del_station: Remove a station; @mac may be NULL to remove all stations.
397  *
398  * @change_station: Modify a given station.
399  *
400  * @set_mesh_cfg: set mesh parameters (by now, just mesh id)
401  *
402  * @change_bss: Modify parameters for a given BSS.
403  */
404 struct cfg80211_ops {
405 	int	(*add_virtual_intf)(struct wiphy *wiphy, char *name,
406 				    enum nl80211_iftype type, u32 *flags,
407 				    struct vif_params *params);
408 	int	(*del_virtual_intf)(struct wiphy *wiphy, int ifindex);
409 	int	(*change_virtual_intf)(struct wiphy *wiphy, int ifindex,
410 				       enum nl80211_iftype type, u32 *flags,
411 				       struct vif_params *params);
412 
413 	int	(*add_key)(struct wiphy *wiphy, struct net_device *netdev,
414 			   u8 key_index, u8 *mac_addr,
415 			   struct key_params *params);
416 	int	(*get_key)(struct wiphy *wiphy, struct net_device *netdev,
417 			   u8 key_index, u8 *mac_addr, void *cookie,
418 			   void (*callback)(void *cookie, struct key_params*));
419 	int	(*del_key)(struct wiphy *wiphy, struct net_device *netdev,
420 			   u8 key_index, u8 *mac_addr);
421 	int	(*set_default_key)(struct wiphy *wiphy,
422 				   struct net_device *netdev,
423 				   u8 key_index);
424 
425 	int	(*add_beacon)(struct wiphy *wiphy, struct net_device *dev,
426 			      struct beacon_parameters *info);
427 	int	(*set_beacon)(struct wiphy *wiphy, struct net_device *dev,
428 			      struct beacon_parameters *info);
429 	int	(*del_beacon)(struct wiphy *wiphy, struct net_device *dev);
430 
431 
432 	int	(*add_station)(struct wiphy *wiphy, struct net_device *dev,
433 			       u8 *mac, struct station_parameters *params);
434 	int	(*del_station)(struct wiphy *wiphy, struct net_device *dev,
435 			       u8 *mac);
436 	int	(*change_station)(struct wiphy *wiphy, struct net_device *dev,
437 				  u8 *mac, struct station_parameters *params);
438 	int	(*get_station)(struct wiphy *wiphy, struct net_device *dev,
439 			       u8 *mac, struct station_info *sinfo);
440 	int	(*dump_station)(struct wiphy *wiphy, struct net_device *dev,
441 			       int idx, u8 *mac, struct station_info *sinfo);
442 
443 	int	(*add_mpath)(struct wiphy *wiphy, struct net_device *dev,
444 			       u8 *dst, u8 *next_hop);
445 	int	(*del_mpath)(struct wiphy *wiphy, struct net_device *dev,
446 			       u8 *dst);
447 	int	(*change_mpath)(struct wiphy *wiphy, struct net_device *dev,
448 				  u8 *dst, u8 *next_hop);
449 	int	(*get_mpath)(struct wiphy *wiphy, struct net_device *dev,
450 			       u8 *dst, u8 *next_hop,
451 			       struct mpath_info *pinfo);
452 	int	(*dump_mpath)(struct wiphy *wiphy, struct net_device *dev,
453 			       int idx, u8 *dst, u8 *next_hop,
454 			       struct mpath_info *pinfo);
455 
456 	int	(*change_bss)(struct wiphy *wiphy, struct net_device *dev,
457 			      struct bss_parameters *params);
458 };
459 
460 #endif /* __NET_CFG80211_H */
461