]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/net80211/ieee80211_ioctl.h
MIMO power save support; still needs callbacks for notifying drivers
[FreeBSD/FreeBSD.git] / sys / net80211 / ieee80211_ioctl.h
1 /*-
2  * Copyright (c) 2001 Atsushi Onoe
3  * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28 #ifndef _NET80211_IEEE80211_IOCTL_H_
29 #define _NET80211_IEEE80211_IOCTL_H_
30
31 /*
32  * IEEE 802.11 ioctls.
33  */
34 #include <net80211/_ieee80211.h>
35 #include <net80211/ieee80211.h>
36 #include <net80211/ieee80211_crypto.h>
37
38 /*
39  * Per/node (station) statistics.
40  */
41 struct ieee80211_nodestats {
42         uint32_t        ns_rx_data;             /* rx data frames */
43         uint32_t        ns_rx_mgmt;             /* rx management frames */
44         uint32_t        ns_rx_ctrl;             /* rx control frames */
45         uint32_t        ns_rx_ucast;            /* rx unicast frames */
46         uint32_t        ns_rx_mcast;            /* rx multi/broadcast frames */
47         uint64_t        ns_rx_bytes;            /* rx data count (bytes) */
48         uint64_t        ns_rx_beacons;          /* rx beacon frames */
49         uint32_t        ns_rx_proberesp;        /* rx probe response frames */
50
51         uint32_t        ns_rx_dup;              /* rx discard 'cuz dup */
52         uint32_t        ns_rx_noprivacy;        /* rx w/ wep but privacy off */
53         uint32_t        ns_rx_wepfail;          /* rx wep processing failed */
54         uint32_t        ns_rx_demicfail;        /* rx demic failed */
55         uint32_t        ns_rx_decap;            /* rx decapsulation failed */
56         uint32_t        ns_rx_defrag;           /* rx defragmentation failed */
57         uint32_t        ns_rx_disassoc;         /* rx disassociation */
58         uint32_t        ns_rx_deauth;           /* rx deauthentication */
59         uint32_t        ns_rx_action;           /* rx action */
60         uint32_t        ns_rx_decryptcrc;       /* rx decrypt failed on crc */
61         uint32_t        ns_rx_unauth;           /* rx on unauthorized port */
62         uint32_t        ns_rx_unencrypted;      /* rx unecrypted w/ privacy */
63         uint32_t        ns_rx_drop;             /* rx discard other reason */
64
65         uint32_t        ns_tx_data;             /* tx data frames */
66         uint32_t        ns_tx_mgmt;             /* tx management frames */
67         uint32_t        ns_tx_ucast;            /* tx unicast frames */
68         uint32_t        ns_tx_mcast;            /* tx multi/broadcast frames */
69         uint64_t        ns_tx_bytes;            /* tx data count (bytes) */
70         uint32_t        ns_tx_probereq;         /* tx probe request frames */
71
72         uint32_t        ns_tx_novlantag;        /* tx discard 'cuz no tag */
73         uint32_t        ns_tx_vlanmismatch;     /* tx discard 'cuz bad tag */
74
75         uint32_t        ns_ps_discard;          /* ps discard 'cuz of age */
76
77         /* MIB-related state */
78         uint32_t        ns_tx_assoc;            /* [re]associations */
79         uint32_t        ns_tx_assoc_fail;       /* [re]association failures */
80         uint32_t        ns_tx_auth;             /* [re]authentications */
81         uint32_t        ns_tx_auth_fail;        /* [re]authentication failures*/
82         uint32_t        ns_tx_deauth;           /* deauthentications */
83         uint32_t        ns_tx_deauth_code;      /* last deauth reason */
84         uint32_t        ns_tx_disassoc;         /* disassociations */
85         uint32_t        ns_tx_disassoc_code;    /* last disassociation reason */
86 };
87
88 /*
89  * Summary statistics.
90  */
91 struct ieee80211_stats {
92         uint32_t        is_rx_badversion;       /* rx frame with bad version */
93         uint32_t        is_rx_tooshort;         /* rx frame too short */
94         uint32_t        is_rx_wrongbss;         /* rx from wrong bssid */
95         uint32_t        is_rx_dup;              /* rx discard 'cuz dup */
96         uint32_t        is_rx_wrongdir;         /* rx w/ wrong direction */
97         uint32_t        is_rx_mcastecho;        /* rx discard 'cuz mcast echo */
98         uint32_t        is_rx_notassoc;         /* rx discard 'cuz sta !assoc */
99         uint32_t        is_rx_noprivacy;        /* rx w/ wep but privacy off */
100         uint32_t        is_rx_unencrypted;      /* rx w/o wep and privacy on */
101         uint32_t        is_rx_wepfail;          /* rx wep processing failed */
102         uint32_t        is_rx_decap;            /* rx decapsulation failed */
103         uint32_t        is_rx_mgtdiscard;       /* rx discard mgt frames */
104         uint32_t        is_rx_ctl;              /* rx discard ctrl frames */
105         uint32_t        is_rx_beacon;           /* rx beacon frames */
106         uint32_t        is_rx_rstoobig;         /* rx rate set truncated */
107         uint32_t        is_rx_elem_missing;     /* rx required element missing*/
108         uint32_t        is_rx_elem_toobig;      /* rx element too big */
109         uint32_t        is_rx_elem_toosmall;    /* rx element too small */
110         uint32_t        is_rx_elem_unknown;     /* rx element unknown */
111         uint32_t        is_rx_badchan;          /* rx frame w/ invalid chan */
112         uint32_t        is_rx_chanmismatch;     /* rx frame chan mismatch */
113         uint32_t        is_rx_nodealloc;        /* rx frame dropped */
114         uint32_t        is_rx_ssidmismatch;     /* rx frame ssid mismatch  */
115         uint32_t        is_rx_auth_unsupported; /* rx w/ unsupported auth alg */
116         uint32_t        is_rx_auth_fail;        /* rx sta auth failure */
117         uint32_t        is_rx_auth_countermeasures;/* rx auth discard 'cuz CM */
118         uint32_t        is_rx_assoc_bss;        /* rx assoc from wrong bssid */
119         uint32_t        is_rx_assoc_notauth;    /* rx assoc w/o auth */
120         uint32_t        is_rx_assoc_capmismatch;/* rx assoc w/ cap mismatch */
121         uint32_t        is_rx_assoc_norate;     /* rx assoc w/ no rate match */
122         uint32_t        is_rx_assoc_badwpaie;   /* rx assoc w/ bad WPA IE */
123         uint32_t        is_rx_deauth;           /* rx deauthentication */
124         uint32_t        is_rx_disassoc;         /* rx disassociation */
125         uint32_t        is_rx_badsubtype;       /* rx frame w/ unknown subtype*/
126         uint32_t        is_rx_nobuf;            /* rx failed for lack of buf */
127         uint32_t        is_rx_decryptcrc;       /* rx decrypt failed on crc */
128         uint32_t        is_rx_ahdemo_mgt;       /* rx discard ahdemo mgt frame*/
129         uint32_t        is_rx_bad_auth;         /* rx bad auth request */
130         uint32_t        is_rx_unauth;           /* rx on unauthorized port */
131         uint32_t        is_rx_badkeyid;         /* rx w/ incorrect keyid */
132         uint32_t        is_rx_ccmpreplay;       /* rx seq# violation (CCMP) */
133         uint32_t        is_rx_ccmpformat;       /* rx format bad (CCMP) */
134         uint32_t        is_rx_ccmpmic;          /* rx MIC check failed (CCMP) */
135         uint32_t        is_rx_tkipreplay;       /* rx seq# violation (TKIP) */
136         uint32_t        is_rx_tkipformat;       /* rx format bad (TKIP) */
137         uint32_t        is_rx_tkipmic;          /* rx MIC check failed (TKIP) */
138         uint32_t        is_rx_tkipicv;          /* rx ICV check failed (TKIP) */
139         uint32_t        is_rx_badcipher;        /* rx failed 'cuz key type */
140         uint32_t        is_rx_nocipherctx;      /* rx failed 'cuz key !setup */
141         uint32_t        is_rx_acl;              /* rx discard 'cuz acl policy */
142         uint32_t        is_tx_nobuf;            /* tx failed for lack of buf */
143         uint32_t        is_tx_nonode;           /* tx failed for no node */
144         uint32_t        is_tx_unknownmgt;       /* tx of unknown mgt frame */
145         uint32_t        is_tx_badcipher;        /* tx failed 'cuz key type */
146         uint32_t        is_tx_nodefkey;         /* tx failed 'cuz no defkey */
147         uint32_t        is_tx_noheadroom;       /* tx failed 'cuz no space */
148         uint32_t        is_tx_fragframes;       /* tx frames fragmented */
149         uint32_t        is_tx_frags;            /* tx fragments created */
150         uint32_t        is_scan_active;         /* active scans started */
151         uint32_t        is_scan_passive;        /* passive scans started */
152         uint32_t        is_node_timeout;        /* nodes timed out inactivity */
153         uint32_t        is_crypto_nomem;        /* no memory for crypto ctx */
154         uint32_t        is_crypto_tkip;         /* tkip crypto done in s/w */
155         uint32_t        is_crypto_tkipenmic;    /* tkip en-MIC done in s/w */
156         uint32_t        is_crypto_tkipdemic;    /* tkip de-MIC done in s/w */
157         uint32_t        is_crypto_tkipcm;       /* tkip counter measures */
158         uint32_t        is_crypto_ccmp;         /* ccmp crypto done in s/w */
159         uint32_t        is_crypto_wep;          /* wep crypto done in s/w */
160         uint32_t        is_crypto_setkey_cipher;/* cipher rejected key */
161         uint32_t        is_crypto_setkey_nokey; /* no key index for setkey */
162         uint32_t        is_crypto_delkey;       /* driver key delete failed */
163         uint32_t        is_crypto_badcipher;    /* unknown cipher */
164         uint32_t        is_crypto_nocipher;     /* cipher not available */
165         uint32_t        is_crypto_attachfail;   /* cipher attach failed */
166         uint32_t        is_crypto_swfallback;   /* cipher fallback to s/w */
167         uint32_t        is_crypto_keyfail;      /* driver key alloc failed */
168         uint32_t        is_crypto_enmicfail;    /* en-MIC failed */
169         uint32_t        is_ibss_capmismatch;    /* merge failed-cap mismatch */
170         uint32_t        is_ibss_norate;         /* merge failed-rate mismatch */
171         uint32_t        is_ps_unassoc;          /* ps-poll for unassoc. sta */
172         uint32_t        is_ps_badaid;           /* ps-poll w/ incorrect aid */
173         uint32_t        is_ps_qempty;           /* ps-poll w/ nothing to send */
174         uint32_t        is_ff_badhdr;           /* fast frame rx'd w/ bad hdr */
175         uint32_t        is_ff_tooshort;         /* fast frame rx decap error */
176         uint32_t        is_ff_split;            /* fast frame rx split error */
177         uint32_t        is_ff_decap;            /* fast frames decap'd */
178         uint32_t        is_ff_encap;            /* fast frames encap'd for tx */
179         uint32_t        is_rx_badbintval;       /* rx frame w/ bogus bintval */
180         uint32_t        is_rx_demicfail;        /* rx demic failed */
181         uint32_t        is_rx_defrag;           /* rx defragmentation failed */
182         uint32_t        is_rx_mgmt;             /* rx management frames */
183         uint32_t        is_rx_action;           /* rx action mgt frames */
184         uint32_t        is_amsdu_tooshort;      /* A-MSDU rx decap error */
185         uint32_t        is_amsdu_split;         /* A-MSDU rx split error */
186         uint32_t        is_amsdu_decap;         /* A-MSDU decap'd */
187         uint32_t        is_amsdu_encap;         /* A-MSDU encap'd for tx */
188         uint32_t        is_ampdu_bar_bad;       /* A-MPDU BAR out of window */
189         uint32_t        is_ampdu_bar_oow;       /* A-MPDU BAR before ADDBA */
190         uint32_t        is_ampdu_bar_move;      /* A-MPDU BAR moved window */
191         uint32_t        is_ampdu_bar_rx;        /* A-MPDU BAR frames handled */
192         uint32_t        is_ampdu_rx_flush;      /* A-MPDU frames flushed */
193         uint32_t        is_ampdu_rx_oor;        /* A-MPDU frames out-of-order */
194         uint32_t        is_ampdu_rx_copy;       /* A-MPDU frames copied down */
195         uint32_t        is_ampdu_rx_drop;       /* A-MPDU frames dropped */
196         uint32_t        is_tx_badstate;         /* tx discard state != RUN */
197         uint32_t        is_tx_notassoc;         /* tx failed, sta not assoc */
198         uint32_t        is_tx_classify;         /* tx classification failed */
199         uint32_t        is_dwds_mcast;          /* discard mcast over dwds */
200         uint32_t        is_dwds_qdrop;          /* dwds pending frame q full */
201         uint32_t        is_ht_assoc_nohtcap;    /* non-HT sta rejected */
202         uint32_t        is_ht_assoc_downgrade;  /* HT sta forced to legacy */
203         uint32_t        is_ht_assoc_norate;     /* HT assoc w/ rate mismatch */
204         uint32_t        is_ampdu_rx_age;        /* A-MPDU sent up 'cuz of age */
205         uint32_t        is_ampdu_rx_move;       /* A-MPDU MSDU moved window */
206         uint32_t        is_addba_reject;        /* ADDBA reject 'cuz disabled */
207         uint32_t        is_addba_norequest;     /* ADDBA response w/o ADDBA */
208         uint32_t        is_addba_badtoken;      /* ADDBA response w/ wrong
209                                                    dialogtoken */
210         uint32_t        is_addba_badpolicy;     /* ADDBA resp w/ wrong policy */
211         uint32_t        is_ampdu_stop;          /* A-MPDU stream stopped */
212         uint32_t        is_ampdu_stop_failed;   /* A-MPDU stream not running */
213         uint32_t        is_ampdu_rx_reorder;    /* A-MPDU held for rx reorder */
214         uint32_t        is_scan_bg;             /* background scans started */
215         uint8_t         is_rx_deauth_code;      /* last rx'd deauth reason */
216         uint8_t         is_rx_disassoc_code;    /* last rx'd disassoc reason */
217         uint8_t         is_rx_authfail_code;    /* last rx'd auth fail reason */
218         uint32_t        is_beacon_miss;         /* beacon miss notification */
219         uint32_t        is_spare[13];
220 };
221
222 /*
223  * Max size of optional information elements.  We artificially
224  * constrain this; it's limited only by the max frame size (and
225  * the max parameter size of the wireless extensions).
226  */
227 #define IEEE80211_MAX_OPT_IE    256
228
229 /*
230  * WPA/RSN get/set key request.  Specify the key/cipher
231  * type and whether the key is to be used for sending and/or
232  * receiving.  The key index should be set only when working
233  * with global keys (use IEEE80211_KEYIX_NONE for ``no index'').
234  * Otherwise a unicast/pairwise key is specified by the bssid
235  * (on a station) or mac address (on an ap).  They key length
236  * must include any MIC key data; otherwise it should be no
237  * more than IEEE80211_KEYBUF_SIZE.
238  */
239 struct ieee80211req_key {
240         uint8_t         ik_type;        /* key/cipher type */
241         uint8_t         ik_pad;
242         uint16_t        ik_keyix;       /* key index */
243         uint8_t         ik_keylen;      /* key length in bytes */
244         uint8_t         ik_flags;
245 /* NB: IEEE80211_KEY_XMIT and IEEE80211_KEY_RECV defined elsewhere */
246 #define IEEE80211_KEY_DEFAULT   0x80    /* default xmit key */
247         uint8_t         ik_macaddr[IEEE80211_ADDR_LEN];
248         uint64_t        ik_keyrsc;      /* key receive sequence counter */
249         uint64_t        ik_keytsc;      /* key transmit sequence counter */
250         uint8_t         ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE];
251 };
252
253 /*
254  * Delete a key either by index or address.  Set the index
255  * to IEEE80211_KEYIX_NONE when deleting a unicast key.
256  */
257 struct ieee80211req_del_key {
258         uint8_t         idk_keyix;      /* key index */
259         uint8_t         idk_macaddr[IEEE80211_ADDR_LEN];
260 };
261
262 /*
263  * MLME state manipulation request.  IEEE80211_MLME_ASSOC
264  * only makes sense when operating as a station.  The other
265  * requests can be used when operating as a station or an
266  * ap (to effect a station).
267  */
268 struct ieee80211req_mlme {
269         uint8_t         im_op;          /* operation to perform */
270 #define IEEE80211_MLME_ASSOC            1       /* associate station */
271 #define IEEE80211_MLME_DISASSOC         2       /* disassociate station */
272 #define IEEE80211_MLME_DEAUTH           3       /* deauthenticate station */
273 #define IEEE80211_MLME_AUTHORIZE        4       /* authorize station */
274 #define IEEE80211_MLME_UNAUTHORIZE      5       /* unauthorize station */
275 #define IEEE80211_MLME_AUTH             6       /* authenticate station */
276         uint8_t         im_ssid_len;    /* length of optional ssid */
277         uint16_t        im_reason;      /* 802.11 reason code */
278         uint8_t         im_macaddr[IEEE80211_ADDR_LEN];
279         uint8_t         im_ssid[IEEE80211_NWID_LEN];
280 };
281
282 /* 
283  * MAC ACL operations.
284  */
285 enum {
286         IEEE80211_MACCMD_POLICY_OPEN    = 0,    /* set policy: no ACL's */
287         IEEE80211_MACCMD_POLICY_ALLOW   = 1,    /* set policy: allow traffic */
288         IEEE80211_MACCMD_POLICY_DENY    = 2,    /* set policy: deny traffic */
289         IEEE80211_MACCMD_FLUSH          = 3,    /* flush ACL database */
290         IEEE80211_MACCMD_DETACH         = 4,    /* detach ACL policy */
291         IEEE80211_MACCMD_POLICY         = 5,    /* get ACL policy */
292         IEEE80211_MACCMD_LIST           = 6,    /* get ACL database */
293         IEEE80211_MACCMD_POLICY_RADIUS  = 7,    /* set policy: RADIUS managed */
294 };
295
296 struct ieee80211req_maclist {
297         uint8_t         ml_macaddr[IEEE80211_ADDR_LEN];
298 };
299
300 /*
301  * Set the active channel list.  Note this list is
302  * intersected with the available channel list in
303  * calculating the set of channels actually used in
304  * scanning.
305  */
306 struct ieee80211req_chanlist {
307         uint8_t         ic_channels[IEEE80211_CHAN_BYTES];
308 };
309
310 /*
311  * Get the active channel list info.
312  */
313 struct ieee80211req_chaninfo {
314         u_int   ic_nchans;
315         struct ieee80211_channel ic_chans[IEEE80211_CHAN_MAX];
316 };
317
318 /*
319  * Retrieve the WPA/RSN information element for an associated station.
320  */
321 struct ieee80211req_wpaie {     /* old version w/ only one ie */
322         uint8_t         wpa_macaddr[IEEE80211_ADDR_LEN];
323         uint8_t         wpa_ie[IEEE80211_MAX_OPT_IE];
324 };
325 struct ieee80211req_wpaie2 {
326         uint8_t         wpa_macaddr[IEEE80211_ADDR_LEN];
327         uint8_t         wpa_ie[IEEE80211_MAX_OPT_IE];
328         uint8_t         rsn_ie[IEEE80211_MAX_OPT_IE];
329 };
330
331 /*
332  * Retrieve per-node statistics.
333  */
334 struct ieee80211req_sta_stats {
335         union {
336                 /* NB: explicitly force 64-bit alignment */
337                 uint8_t         macaddr[IEEE80211_ADDR_LEN];
338                 uint64_t        pad;
339         } is_u;
340         struct ieee80211_nodestats is_stats;
341 };
342
343 /*
344  * Station information block; the mac address is used
345  * to retrieve other data like stats, unicast key, etc.
346  */
347 struct ieee80211req_sta_info {
348         uint16_t        isi_len;                /* total length (mult of 4) */
349         uint16_t        isi_ie_off;             /* offset to IE data */
350         uint16_t        isi_ie_len;             /* IE length */
351         uint16_t        isi_freq;               /* MHz */
352         uint32_t        isi_flags;              /* channel flags */
353         uint16_t        isi_state;              /* state flags */
354         uint8_t         isi_authmode;           /* authentication algorithm */
355         int8_t          isi_rssi;               /* receive signal strength */
356         int8_t          isi_noise;              /* noise floor */
357         uint8_t         isi_capinfo;            /* capabilities */
358         uint8_t         isi_erp;                /* ERP element */
359         uint8_t         isi_macaddr[IEEE80211_ADDR_LEN];
360         uint8_t         isi_nrates;
361                                                 /* negotiated rates */
362         uint8_t         isi_rates[IEEE80211_RATE_MAXSIZE];
363         uint8_t         isi_txrate;             /* legacy/IEEE rate or MCS */
364         uint16_t        isi_associd;            /* assoc response */
365         uint16_t        isi_txpower;            /* current tx power */
366         uint16_t        isi_vlan;               /* vlan tag */
367         /* NB: [IEEE80211_NONQOS_TID] holds seq#'s for non-QoS stations */
368         uint16_t        isi_txseqs[IEEE80211_TID_SIZE];/* tx seq #/TID */
369         uint16_t        isi_rxseqs[IEEE80211_TID_SIZE];/* rx seq#/TID */
370         uint16_t        isi_inact;              /* inactivity timer */
371         uint16_t        isi_txmbps;             /* current tx rate in .5 Mb/s */
372         uint32_t        isi_jointime;           /* time of assoc/join */
373         struct ieee80211_mimo_info isi_mimo;    /* MIMO info for 11n sta's */
374         /* XXX frag state? */
375         /* variable length IE data */
376 };
377
378 /*
379  * Retrieve per-station information; to retrieve all
380  * specify a mac address of ff:ff:ff:ff:ff:ff.
381  */
382 struct ieee80211req_sta_req {
383         union {
384                 /* NB: explicitly force 64-bit alignment */
385                 uint8_t         macaddr[IEEE80211_ADDR_LEN];
386                 uint64_t        pad;
387         } is_u;
388         struct ieee80211req_sta_info info[1];   /* variable length */
389 };
390
391 /*
392  * Get/set per-station tx power cap.
393  */
394 struct ieee80211req_sta_txpow {
395         uint8_t         it_macaddr[IEEE80211_ADDR_LEN];
396         uint8_t         it_txpow;
397 };
398
399 /*
400  * WME parameters manipulated with IEEE80211_IOC_WME_CWMIN
401  * through IEEE80211_IOC_WME_ACKPOLICY are set and return
402  * using i_val and i_len.  i_val holds the value itself.
403  * i_len specifies the AC and, as appropriate, then high bit
404  * specifies whether the operation is to be applied to the
405  * BSS or ourself.
406  */
407 #define IEEE80211_WMEPARAM_SELF 0x0000          /* parameter applies to self */
408 #define IEEE80211_WMEPARAM_BSS  0x8000          /* parameter applies to BSS */
409 #define IEEE80211_WMEPARAM_VAL  0x7fff          /* parameter value */
410
411 /*
412  * Application Information Elements can be appended to a variety
413  * of frames with the IEE80211_IOC_APPIE request.  This request
414  * piggybacks on a normal ieee80211req; the frame type is passed
415  * in i_val as the 802.11 FC0 bytes and the length of the IE data
416  * is passed in i_len.  The data is referenced in i_data.  If i_len
417  * is zero then any previously configured IE data is removed.  At
418  * most IEEE80211_MAX_APPIE data be appened.  Note that multiple
419  * IE's can be supplied; the data is treated opaquely.
420  */
421 #define IEEE80211_MAX_APPIE     1024            /* max app IE data */
422 /*
423  * Hack: the WPA authenticator uses this mechanism to specify WPA
424  * ie's that are used instead of the ones normally constructed using
425  * the cipher state setup with separate ioctls.  This avoids issues
426  * like the authenticator ordering ie data differently than the
427  * net80211 layer and needing to keep separate state for WPA and RSN.
428  */
429 #define IEEE80211_APPIE_WPA \
430         (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_BEACON | \
431          IEEE80211_FC0_SUBTYPE_PROBE_RESP)
432
433 /*
434  * Station mode roaming parameters.  These are maintained
435  * per band/mode and control the roaming algorithm.
436  */
437 struct ieee80211_roamparams_req {
438         struct ieee80211_roamparam params[IEEE80211_MODE_MAX];
439 };
440
441 /*
442  * Transmit parameters.  These can be used to set fixed transmit
443  * rate for each operating mode when operating as client or on a
444  * per-client basis according to the capabilities of the client
445  * (e.g. an 11b client associated to an 11g ap) when operating as
446  * an ap.
447  *
448  * MCS are distinguished from legacy rates by or'ing in 0x80.
449  */
450 struct ieee80211_txparams_req {
451         struct ieee80211_txparam params[IEEE80211_MODE_MAX];
452 };
453
454 /*
455  * Set regulatory domain state with IEEE80211_IOC_REGDOMAIN.
456  * Note this is both the regulatory description and the channel
457  * list.  The get request for IEEE80211_IOC_REGDOMAIN returns
458  * only the regdomain info; the channel list is obtained
459  * separately with IEEE80211_IOC_CHANINFO.
460  */
461 struct ieee80211_regdomain_req {
462         struct ieee80211_regdomain      rd;
463         struct ieee80211req_chaninfo    chaninfo;
464 };
465
466 /*
467  * Get driver capabilities.  Driver, hardware crypto, and
468  * HT/802.11n capabilities, and a table that describes what
469  * the radio can do.
470  */
471 struct ieee80211_devcaps_req {
472         uint32_t        dc_drivercaps;          /* general driver caps */
473         uint32_t        dc_cryptocaps;          /* hardware crypto support */
474         uint32_t        dc_htcaps;              /* HT/802.11n support */
475         struct ieee80211req_chaninfo dc_chaninfo;
476 };
477
478 struct ieee80211_chanswitch_req {
479         struct ieee80211_channel csa_chan;      /* new channel */
480         int             csa_mode;               /* CSA mode */
481         int             csa_count;              /* beacon count to switch */
482 };
483
484 /*
485  * Get/set per-station vlan tag.
486  */
487 struct ieee80211req_sta_vlan {
488         uint8_t         sv_macaddr[IEEE80211_ADDR_LEN];
489         uint16_t        sv_vlan;
490 };
491
492 #ifdef __FreeBSD__
493 /*
494  * FreeBSD-style ioctls.
495  */
496 /* the first member must be matched with struct ifreq */
497 struct ieee80211req {
498         char            i_name[IFNAMSIZ];       /* if_name, e.g. "wi0" */
499         uint16_t        i_type;                 /* req type */
500         int16_t         i_val;                  /* Index or simple value */
501         int16_t         i_len;                  /* Index or simple value */
502         void            *i_data;                /* Extra data */
503 };
504 #define SIOCS80211               _IOW('i', 234, struct ieee80211req)
505 #define SIOCG80211              _IOWR('i', 235, struct ieee80211req)
506 #define SIOCG80211STATS         _IOWR('i', 236, struct ifreq)
507
508 #define IEEE80211_IOC_SSID              1
509 #define IEEE80211_IOC_NUMSSIDS          2
510 #define IEEE80211_IOC_WEP               3
511 #define         IEEE80211_WEP_NOSUP     -1
512 #define         IEEE80211_WEP_OFF       0
513 #define         IEEE80211_WEP_ON        1
514 #define         IEEE80211_WEP_MIXED     2
515 #define IEEE80211_IOC_WEPKEY            4
516 #define IEEE80211_IOC_NUMWEPKEYS        5
517 #define IEEE80211_IOC_WEPTXKEY          6
518 #define IEEE80211_IOC_AUTHMODE          7
519 #define IEEE80211_IOC_STATIONNAME       8
520 #define IEEE80211_IOC_CHANNEL           9
521 #define IEEE80211_IOC_POWERSAVE         10
522 #define         IEEE80211_POWERSAVE_NOSUP       -1
523 #define         IEEE80211_POWERSAVE_OFF         0
524 #define         IEEE80211_POWERSAVE_CAM         1
525 #define         IEEE80211_POWERSAVE_PSP         2
526 #define         IEEE80211_POWERSAVE_PSP_CAM     3
527 #define         IEEE80211_POWERSAVE_ON          IEEE80211_POWERSAVE_CAM
528 #define IEEE80211_IOC_POWERSAVESLEEP    11
529 #define IEEE80211_IOC_RTSTHRESHOLD      12
530 #define IEEE80211_IOC_PROTMODE          13
531 #define         IEEE80211_PROTMODE_OFF          0
532 #define         IEEE80211_PROTMODE_CTS          1
533 #define         IEEE80211_PROTMODE_RTSCTS       2
534 #define IEEE80211_IOC_TXPOWER           14      /* global tx power limit */
535 #define IEEE80211_IOC_BSSID             15
536 #define IEEE80211_IOC_ROAMING           16      /* roaming mode */
537 #define IEEE80211_IOC_PRIVACY           17      /* privacy invoked */
538 #define IEEE80211_IOC_DROPUNENCRYPTED   18      /* discard unencrypted frames */
539 #define IEEE80211_IOC_WPAKEY            19
540 #define IEEE80211_IOC_DELKEY            20
541 #define IEEE80211_IOC_MLME              21
542 /* 22 was IEEE80211_IOC_OPTIE, replaced by IEEE80211_IOC_APPIE */
543 /* 23 was IEEE80211_IOC_SCAN_REQ */
544 /* 24 was IEEE80211_IOC_SCAN_RESULTS */
545 #define IEEE80211_IOC_COUNTERMEASURES   25      /* WPA/TKIP countermeasures */
546 #define IEEE80211_IOC_WPA               26      /* WPA mode (0,1,2) */
547 #define IEEE80211_IOC_CHANLIST          27      /* channel list */
548 #define IEEE80211_IOC_WME               28      /* WME mode (on, off) */
549 #define IEEE80211_IOC_HIDESSID          29      /* hide SSID mode (on, off) */
550 #define IEEE80211_IOC_APBRIDGE          30      /* AP inter-sta bridging */
551 /* 31-35,37-38 were for WPA authenticator settings */
552 /* 36 was IEEE80211_IOC_DRIVER_CAPS */
553 #define IEEE80211_IOC_WPAIE             39      /* WPA information element */
554 #define IEEE80211_IOC_STA_STATS         40      /* per-station statistics */
555 #define IEEE80211_IOC_MACCMD            41      /* MAC ACL operation */
556 #define IEEE80211_IOC_CHANINFO          42      /* channel info list */
557 #define IEEE80211_IOC_TXPOWMAX          43      /* max tx power for channel */
558 #define IEEE80211_IOC_STA_TXPOW         44      /* per-station tx power limit */
559 /* 45 was IEEE80211_IOC_STA_INFO */
560 #define IEEE80211_IOC_WME_CWMIN         46      /* WME: ECWmin */
561 #define IEEE80211_IOC_WME_CWMAX         47      /* WME: ECWmax */
562 #define IEEE80211_IOC_WME_AIFS          48      /* WME: AIFSN */
563 #define IEEE80211_IOC_WME_TXOPLIMIT     49      /* WME: txops limit */
564 #define IEEE80211_IOC_WME_ACM           50      /* WME: ACM (bss only) */
565 #define IEEE80211_IOC_WME_ACKPOLICY     51      /* WME: ACK policy (!bss only)*/
566 #define IEEE80211_IOC_DTIM_PERIOD       52      /* DTIM period (beacons) */
567 #define IEEE80211_IOC_BEACON_INTERVAL   53      /* beacon interval (ms) */
568 #define IEEE80211_IOC_ADDMAC            54      /* add sta to MAC ACL table */
569 #define IEEE80211_IOC_DELMAC            55      /* del sta from MAC ACL table */
570 #define IEEE80211_IOC_PUREG             56      /* pure 11g (no 11b stations) */
571 #define IEEE80211_IOC_FF                57      /* ATH fast frames (on, off) */
572 #define IEEE80211_IOC_TURBOP            58      /* ATH turbo' (on, off) */
573 #define IEEE80211_IOC_BGSCAN            59      /* bg scanning (on, off) */
574 #define IEEE80211_IOC_BGSCAN_IDLE       60      /* bg scan idle threshold */
575 #define IEEE80211_IOC_BGSCAN_INTERVAL   61      /* bg scan interval */
576 #define IEEE80211_IOC_SCANVALID         65      /* scan cache valid threshold */
577 /* 66-72 were IEEE80211_IOC_ROAM_* and IEEE80211_IOC_MCAST_RATE */
578 #define IEEE80211_IOC_FRAGTHRESHOLD     73      /* tx fragmentation threshold */
579 #define IEEE80211_IOC_BURST             75      /* packet bursting */
580 #define IEEE80211_IOC_SCAN_RESULTS      76      /* get scan results */
581 #define IEEE80211_IOC_BMISSTHRESHOLD    77      /* beacon miss threshold */
582 #define IEEE80211_IOC_STA_INFO          78      /* station/neighbor info */
583 #define IEEE80211_IOC_WPAIE2            79      /* WPA+RSN info elements */
584 #define IEEE80211_IOC_CURCHAN           80      /* current channel */
585 #define IEEE80211_IOC_SHORTGI           81      /* 802.11n half GI */
586 #define IEEE80211_IOC_AMPDU             82      /* 802.11n A-MPDU (on, off) */
587 #define IEEE80211_IOC_AMPDU_LIMIT       83      /* A-MPDU length limit */
588 #define IEEE80211_IOC_AMPDU_DENSITY     84      /* A-MPDU density */
589 #define IEEE80211_IOC_AMSDU             85      /* 802.11n A-MSDU (on, off) */
590 #define IEEE80211_IOC_AMSDU_LIMIT       86      /* A-MSDU length limit */
591 #define IEEE80211_IOC_PUREN             87      /* pure 11n (no legacy sta's) */
592 #define IEEE80211_IOC_DOTH              88      /* 802.11h (on, off) */
593 /* 89-91 were regulatory items */
594 #define IEEE80211_IOC_HTCOMPAT          92      /* support pre-D1.10 HT ie's */
595 #define IEEE80211_IOC_DWDS              93      /* DWDS/4-address handling */
596 #define IEEE80211_IOC_INACTIVITY        94      /* sta inactivity handling */
597 #define IEEE80211_IOC_APPIE             95      /* application IE's */
598 #define IEEE80211_IOC_WPS               96      /* WPS operation */
599 #define IEEE80211_IOC_TSN               97      /* TSN operation */
600 #define IEEE80211_IOC_DEVCAPS           98      /* driver+device capabilities */
601 #define IEEE80211_IOC_CHANSWITCH        99      /* start 11h channel switch */
602 #define IEEE80211_IOC_DFS               100     /* DFS (on, off) */
603 #define IEEE80211_IOC_DOTD              101     /* 802.11d (on, off) */
604 #define IEEE80211_IOC_HTPROTMODE        102     /* HT protection (off, rts) */
605 #define IEEE80211_IOC_SCAN_REQ          103     /* scan w/ specified params */
606 #define IEEE80211_IOC_SCAN_CANCEL       104     /* cancel ongoing scan */
607 #define IEEE80211_IOC_HTCONF            105     /* HT config (off, HT20, HT40)*/
608 #define IEEE80211_IOC_REGDOMAIN         106     /* regulatory domain info */
609 #define IEEE80211_IOC_ROAM              107     /* roaming params en masse */
610 #define IEEE80211_IOC_TXPARAMS          108     /* tx parameters */
611 #define IEEE80211_IOC_STA_VLAN          109     /* per-station vlan tag */
612 #define IEEE80211_IOC_SMPS              110     /* MIMO power save */
613
614 /*
615  * Parameters for controlling a scan requested with
616  * IEEE80211_IOC_SCAN_REQ.
617  *
618  * Active scans cause ProbeRequest frames to be issued for each
619  * specified ssid and, by default, a broadcast ProbeRequest frame.
620  * The set of ssid's is specified in the request.
621  *
622  * By default the scan will cause a BSS to be joined (in station/adhoc
623  * mode) or a channel to be selected for operation (hostap mode).
624  * To disable that specify IEEE80211_IOC_SCAN_NOPICK and if the
625  *
626  * If the station is currently associated to an AP then a scan request
627  * will cause the station to leave the current channel and potentially
628  * miss frames from the AP.  Alternatively the station may notify the
629  * AP that it is going into power save mode before it leaves the channel.
630  * This ensures frames for the station are buffered by the AP.  This is
631  * termed a ``bg scan'' and is requested with the IEEE80211_IOC_SCAN_BGSCAN
632  * flag.  Background scans may take longer than foreground scans and may
633  * be preempted by traffic.  If a station is not associated to an AP
634  * then a request for a background scan is automatically done in the
635  * foreground.
636  *
637  * The results of the scan request are cached by the system.  This
638  * information is aged out and/or invalidated based on events like not
639  * being able to associated to an AP.  To flush the current cache
640  * contents before doing a scan the IEEE80211_IOC_SCAN_FLUSH flag may
641  * be specified.
642  *
643  * By default the scan will be done until a suitable AP is located
644  * or a channel is found for use.  A scan can also be constrained
645  * to be done once (IEEE80211_IOC_SCAN_ONCE) or to last for no more
646  * than a specified duration.
647  */
648 struct ieee80211_scan_req {
649         int             sr_flags;
650 #define IEEE80211_IOC_SCAN_NOPICK       0x00001 /* scan only, no selection */
651 #define IEEE80211_IOC_SCAN_ACTIVE       0x00002 /* active scan (probe req) */
652 #define IEEE80211_IOC_SCAN_PICK1ST      0x00004 /* ``hey sailor'' mode */
653 #define IEEE80211_IOC_SCAN_BGSCAN       0x00008 /* bg scan, exit ps at end */
654 #define IEEE80211_IOC_SCAN_ONCE         0x00010 /* do one complete pass */
655 #define IEEE80211_IOC_SCAN_NOBCAST      0x00020 /* don't send bcast probe req */
656 #define IEEE80211_IOC_SCAN_NOJOIN       0x00040 /* no auto-sequencing */
657 #define IEEE80211_IOC_SCAN_FLUSH        0x10000 /* flush scan cache first */
658 #define IEEE80211_IOC_SCAN_CHECK        0x20000 /* check scan cache first */
659         u_int           sr_duration;            /* duration (ms) */
660 #define IEEE80211_IOC_SCAN_DURATION_MIN 1
661 #define IEEE80211_IOC_SCAN_DURATION_MAX 0x7fffffff
662 #define IEEE80211_IOC_SCAN_FOREVER      IEEE80211_IOC_SCAN_DURATION_MAX
663         u_int           sr_mindwell;            /* min channel dwelltime (ms) */
664         u_int           sr_maxdwell;            /* max channel dwelltime (ms) */
665         int             sr_nssid;
666 #define IEEE80211_IOC_SCAN_MAX_SSID     3
667         struct {
668                 int      len;                           /* length in bytes */
669                 uint8_t ssid[IEEE80211_NWID_LEN];       /* ssid contents */
670         } sr_ssid[IEEE80211_IOC_SCAN_MAX_SSID];
671 };
672
673 /*
674  * Scan result data returned for IEEE80211_IOC_SCAN_RESULTS.
675  * Each result is a fixed size structure followed by a variable
676  * length SSID and one or more variable length information elements.
677  * The size of each variable length item is found in the fixed
678  * size structure and the entire length of the record is specified
679  * in isr_len.  Result records are rounded to a multiple of 4 bytes.
680  */
681 struct ieee80211req_scan_result {
682         uint16_t        isr_len;                /* total length (mult of 4) */
683         uint16_t        isr_ie_off;             /* offset to SSID+IE data */
684         uint16_t        isr_ie_len;             /* IE length */
685         uint16_t        isr_freq;               /* MHz */
686         uint16_t        isr_flags;              /* channel flags */
687         int8_t          isr_noise;
688         int8_t          isr_rssi;
689         uint8_t         isr_intval;             /* beacon interval */
690         uint8_t         isr_capinfo;            /* capabilities */
691         uint8_t         isr_erp;                /* ERP element */
692         uint8_t         isr_bssid[IEEE80211_ADDR_LEN];
693         uint8_t         isr_nrates;
694         uint8_t         isr_rates[IEEE80211_RATE_MAXSIZE];
695         uint8_t         isr_ssid_len;           /* SSID length */
696         /* variable length SSID followed by IE data */
697 };
698
699 /*
700  * Virtual AP cloning parameters.  The parent device must
701  * be a vap-capable device.  All parameters specified with
702  * the clone request are fixed for the lifetime of the vap.
703  *
704  * There are two flavors of WDS vaps: legacy and dynamic.
705  * Legacy WDS operation implements a static binding between
706  * two stations encapsulating traffic in 4-address frames.
707  * Dynamic WDS vaps are created when a station associates to
708  * an AP and sends a 4-address frame.  If the AP vap is
709  * configured to support WDS then this will generate an
710  * event to user programs listening on the routing socket
711  * and a Dynamic WDS vap will be created to handle traffic
712  * to/from that station.  In both cases the bssid of the
713  * peer must be specified when creating the vap.
714  *
715  * By default a vap will inherit the mac address/bssid of
716  * the underlying device.  To request a unique address the
717  * IEEE80211_CLONE_BSSID flag should be supplied.  This is
718  * meaningless for WDS vaps as they share the bssid of an
719  * AP vap that must otherwise exist.  Note that some devices
720  * may not be able to support multiple addresses.
721  *
722  * Station mode vap's normally depend on the device to notice
723  * when the AP stops sending beacon frames.  If IEEE80211_CLONE_NOBEACONS
724  * is specified the net80211 layer will do this in s/w.  This
725  * is mostly useful when setting up a WDS repeater/extender where
726  * an AP vap is combined with a sta vap and the device isn't able
727  * to track beacon frames in hardware.
728  */
729 struct ieee80211_clone_params {
730         char    icp_parent[IFNAMSIZ];           /* parent device */
731         uint16_t icp_opmode;                    /* operating mode */
732         uint16_t icp_flags;                     /* see below */
733         uint8_t icp_bssid[IEEE80211_ADDR_LEN];  /* for WDS links */
734         uint8_t icp_macaddr[IEEE80211_ADDR_LEN];/* local address */
735 };
736 #define IEEE80211_CLONE_BSSID           0x0001  /* allocate unique mac/bssid */
737 #define IEEE80211_CLONE_NOBEACONS       0x0002  /* don't setup beacon timers */
738 #define IEEE80211_CLONE_WDSLEGACY       0x0004  /* legacy WDS processing */
739 #define IEEE80211_CLONE_MACADDR         0x0008  /* use specified mac addr */
740 #endif /* __FreeBSD__ */
741
742 #endif /* _NET80211_IEEE80211_IOCTL_H_ */