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