Home | History | Annotate | Line # | Download | only in net80211
ieee80211.h revision 1.1.1.3
      1      1.1  dyoung /*-
      2      1.1  dyoung  * Copyright (c) 2001 Atsushi Onoe
      3      1.1  dyoung  * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
      4      1.1  dyoung  * All rights reserved.
      5      1.1  dyoung  *
      6      1.1  dyoung  * Redistribution and use in source and binary forms, with or without
      7      1.1  dyoung  * modification, are permitted provided that the following conditions
      8      1.1  dyoung  * are met:
      9      1.1  dyoung  * 1. Redistributions of source code must retain the above copyright
     10      1.1  dyoung  *    notice, this list of conditions and the following disclaimer.
     11      1.1  dyoung  * 2. Redistributions in binary form must reproduce the above copyright
     12      1.1  dyoung  *    notice, this list of conditions and the following disclaimer in the
     13      1.1  dyoung  *    documentation and/or other materials provided with the distribution.
     14      1.1  dyoung  * 3. The name of the author may not be used to endorse or promote products
     15      1.1  dyoung  *    derived from this software without specific prior written permission.
     16      1.1  dyoung  *
     17      1.1  dyoung  * Alternatively, this software may be distributed under the terms of the
     18      1.1  dyoung  * GNU General Public License ("GPL") version 2 as published by the Free
     19      1.1  dyoung  * Software Foundation.
     20      1.1  dyoung  *
     21      1.1  dyoung  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22      1.1  dyoung  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23      1.1  dyoung  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24      1.1  dyoung  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25      1.1  dyoung  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26      1.1  dyoung  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27      1.1  dyoung  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28      1.1  dyoung  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29      1.1  dyoung  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30      1.1  dyoung  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31      1.1  dyoung  *
     32  1.1.1.3  dyoung  * $FreeBSD: src/sys/net80211/ieee80211.h,v 1.5 2004/04/05 17:47:40 sam Exp $
     33      1.1  dyoung  */
     34      1.1  dyoung #ifndef _NET80211_IEEE80211_H_
     35      1.1  dyoung #define _NET80211_IEEE80211_H_
     36      1.1  dyoung 
     37      1.1  dyoung /*
     38      1.1  dyoung  * 802.11 protocol definitions.
     39      1.1  dyoung  */
     40      1.1  dyoung 
     41      1.1  dyoung #define	IEEE80211_ADDR_LEN	6		/* size of 802.11 address */
     42      1.1  dyoung /* is 802.11 address multicast/broadcast? */
     43      1.1  dyoung #define	IEEE80211_IS_MULTICAST(_a)	(*(_a) & 0x01)
     44      1.1  dyoung 
     45      1.1  dyoung /* IEEE 802.11 PLCP header */
     46      1.1  dyoung struct ieee80211_plcp_hdr {
     47      1.1  dyoung 	u_int16_t	i_sfd;
     48      1.1  dyoung 	u_int8_t	i_signal;
     49      1.1  dyoung 	u_int8_t	i_service;
     50      1.1  dyoung 	u_int16_t	i_length;
     51      1.1  dyoung 	u_int16_t	i_crc;
     52      1.1  dyoung } __attribute__((__packed__));
     53      1.1  dyoung 
     54  1.1.1.3  dyoung #define IEEE80211_PLCP_SFD      0xF3A0
     55  1.1.1.3  dyoung #define IEEE80211_PLCP_SERVICE  0x00
     56  1.1.1.3  dyoung 
     57      1.1  dyoung /*
     58      1.1  dyoung  * generic definitions for IEEE 802.11 frames
     59      1.1  dyoung  */
     60      1.1  dyoung struct ieee80211_frame {
     61      1.1  dyoung 	u_int8_t	i_fc[2];
     62      1.1  dyoung 	u_int8_t	i_dur[2];
     63      1.1  dyoung 	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
     64      1.1  dyoung 	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
     65      1.1  dyoung 	u_int8_t	i_addr3[IEEE80211_ADDR_LEN];
     66      1.1  dyoung 	u_int8_t	i_seq[2];
     67      1.1  dyoung 	/* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
     68      1.1  dyoung 	/* see below */
     69      1.1  dyoung } __attribute__((__packed__));
     70      1.1  dyoung 
     71  1.1.1.3  dyoung struct ieee80211_qosframe {
     72  1.1.1.3  dyoung 	u_int8_t	i_fc[2];
     73  1.1.1.3  dyoung 	u_int8_t	i_dur[2];
     74  1.1.1.3  dyoung 	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
     75  1.1.1.3  dyoung 	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
     76  1.1.1.3  dyoung 	u_int8_t	i_addr3[IEEE80211_ADDR_LEN];
     77  1.1.1.3  dyoung 	u_int8_t	i_seq[2];
     78  1.1.1.3  dyoung 	u_int8_t	i_qos[2];
     79  1.1.1.3  dyoung 	/* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
     80  1.1.1.3  dyoung 	/* see below */
     81  1.1.1.3  dyoung } __attribute__((__packed__));
     82  1.1.1.3  dyoung 
     83  1.1.1.3  dyoung struct ieee80211_qoscntl {
     84  1.1.1.3  dyoung 	u_int8_t	i_qos[2];
     85  1.1.1.3  dyoung };
     86  1.1.1.3  dyoung 
     87      1.1  dyoung struct ieee80211_frame_addr4 {
     88      1.1  dyoung 	u_int8_t	i_fc[2];
     89      1.1  dyoung 	u_int8_t	i_dur[2];
     90      1.1  dyoung 	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
     91      1.1  dyoung 	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
     92      1.1  dyoung 	u_int8_t	i_addr3[IEEE80211_ADDR_LEN];
     93      1.1  dyoung 	u_int8_t	i_seq[2];
     94      1.1  dyoung 	u_int8_t	i_addr4[IEEE80211_ADDR_LEN];
     95      1.1  dyoung } __attribute__((__packed__));
     96      1.1  dyoung 
     97  1.1.1.3  dyoung 
     98  1.1.1.3  dyoung struct ieee80211_qosframe_addr4 {
     99  1.1.1.3  dyoung 	u_int8_t	i_fc[2];
    100  1.1.1.3  dyoung 	u_int8_t	i_dur[2];
    101  1.1.1.3  dyoung 	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
    102  1.1.1.3  dyoung 	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
    103  1.1.1.3  dyoung 	u_int8_t	i_addr3[IEEE80211_ADDR_LEN];
    104  1.1.1.3  dyoung 	u_int8_t	i_seq[2];
    105  1.1.1.3  dyoung 	u_int8_t	i_addr4[IEEE80211_ADDR_LEN];
    106  1.1.1.3  dyoung 	u_int8_t	i_qos[2];
    107  1.1.1.3  dyoung } __attribute__((__packed__));
    108  1.1.1.3  dyoung 
    109  1.1.1.3  dyoung /*
    110  1.1.1.3  dyoung  * Management Notification Frame
    111  1.1.1.3  dyoung  */
    112  1.1.1.3  dyoung struct ieee80211_mnf {
    113  1.1.1.3  dyoung 	u_int8_t	mnf_category;
    114  1.1.1.3  dyoung 	u_int8_t	mnf_action;
    115  1.1.1.3  dyoung 	u_int8_t	mnf_dialog;
    116  1.1.1.3  dyoung 	u_int8_t	mnf_status;
    117  1.1.1.3  dyoung } __attribute__((__packed__));
    118  1.1.1.3  dyoung #define	MNF_SETUP_REQ	0
    119  1.1.1.3  dyoung #define	MNF_SETUP_RESP	1
    120  1.1.1.3  dyoung #define	MNF_TEARDOWN	2
    121  1.1.1.3  dyoung 
    122  1.1.1.3  dyoung /*
    123  1.1.1.3  dyoung  * WME/802.11e Tspec Element
    124  1.1.1.3  dyoung  */
    125  1.1.1.3  dyoung struct ieee80211_wme_tspec {
    126  1.1.1.3  dyoung 	u_int8_t	ts_id;
    127  1.1.1.3  dyoung 	u_int8_t	ts_len;
    128  1.1.1.3  dyoung 	u_int8_t	ts_oui[3];
    129  1.1.1.3  dyoung 	u_int8_t	ts_oui_type;
    130  1.1.1.3  dyoung 	u_int8_t	ts_oui_subtype;
    131  1.1.1.3  dyoung 	u_int8_t	ts_version;
    132  1.1.1.3  dyoung 	u_int8_t	ts_tsinfo[3];
    133  1.1.1.3  dyoung 	u_int8_t	ts_nom_msdu[2];
    134  1.1.1.3  dyoung 	u_int8_t	ts_max_msdu[2];
    135  1.1.1.3  dyoung 	u_int8_t	ts_min_svc[4];
    136  1.1.1.3  dyoung 	u_int8_t	ts_max_svc[4];
    137  1.1.1.3  dyoung 	u_int8_t	ts_inactv_intv[4];
    138  1.1.1.3  dyoung 	u_int8_t	ts_susp_intv[4];
    139  1.1.1.3  dyoung 	u_int8_t	ts_start_svc[4];
    140  1.1.1.3  dyoung 	u_int8_t	ts_min_rate[4];
    141  1.1.1.3  dyoung 	u_int8_t	ts_mean_rate[4];
    142  1.1.1.3  dyoung 	u_int8_t	ts_max_burst[4];
    143  1.1.1.3  dyoung 	u_int8_t	ts_min_phy[4];
    144  1.1.1.3  dyoung 	u_int8_t	ts_peak_rate[4];
    145  1.1.1.3  dyoung 	u_int8_t	ts_delay[4];
    146  1.1.1.3  dyoung 	u_int8_t	ts_surplus[2];
    147  1.1.1.3  dyoung 	u_int8_t	ts_medium_time[2];
    148  1.1.1.3  dyoung } __attribute__((__packed__));
    149  1.1.1.3  dyoung 
    150      1.1  dyoung #define	IEEE80211_FC0_VERSION_MASK		0x03
    151      1.1  dyoung #define	IEEE80211_FC0_VERSION_SHIFT		0
    152      1.1  dyoung #define	IEEE80211_FC0_VERSION_0			0x00
    153      1.1  dyoung #define	IEEE80211_FC0_TYPE_MASK			0x0c
    154      1.1  dyoung #define	IEEE80211_FC0_TYPE_SHIFT		2
    155      1.1  dyoung #define	IEEE80211_FC0_TYPE_MGT			0x00
    156      1.1  dyoung #define	IEEE80211_FC0_TYPE_CTL			0x04
    157      1.1  dyoung #define	IEEE80211_FC0_TYPE_DATA			0x08
    158      1.1  dyoung 
    159      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_MASK		0xf0
    160      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_SHIFT		4
    161      1.1  dyoung /* for TYPE_MGT */
    162      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_ASSOC_REQ		0x00
    163      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_ASSOC_RESP	0x10
    164      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_REASSOC_REQ	0x20
    165      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_REASSOC_RESP	0x30
    166      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_PROBE_REQ		0x40
    167      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_PROBE_RESP	0x50
    168      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_BEACON		0x80
    169      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_ATIM		0x90
    170      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_DISASSOC		0xa0
    171      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_AUTH		0xb0
    172      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_DEAUTH		0xc0
    173      1.1  dyoung /* for TYPE_CTL */
    174      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_PS_POLL		0xa0
    175      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_RTS		0xb0
    176      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_CTS		0xc0
    177      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_ACK		0xd0
    178      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_CF_END		0xe0
    179      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_CF_END_ACK	0xf0
    180      1.1  dyoung /* for TYPE_DATA (bit combination) */
    181      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_DATA		0x00
    182      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_CF_ACK		0x10
    183      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_CF_POLL		0x20
    184      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_CF_ACPL		0x30
    185      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_NODATA		0x40
    186      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_CFACK		0x50
    187      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_CFPOLL		0x60
    188      1.1  dyoung #define	IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK	0x70
    189  1.1.1.3  dyoung #define	IEEE80211_FC0_SUBTYPE_QOS		0x80
    190      1.1  dyoung 
    191      1.1  dyoung #define	IEEE80211_FC1_DIR_MASK			0x03
    192      1.1  dyoung #define	IEEE80211_FC1_DIR_NODS			0x00	/* STA->STA */
    193      1.1  dyoung #define	IEEE80211_FC1_DIR_TODS			0x01	/* STA->AP  */
    194      1.1  dyoung #define	IEEE80211_FC1_DIR_FROMDS		0x02	/* AP ->STA */
    195      1.1  dyoung #define	IEEE80211_FC1_DIR_DSTODS		0x03	/* AP ->AP  */
    196      1.1  dyoung 
    197      1.1  dyoung #define	IEEE80211_FC1_MORE_FRAG			0x04
    198      1.1  dyoung #define	IEEE80211_FC1_RETRY			0x08
    199      1.1  dyoung #define	IEEE80211_FC1_PWR_MGT			0x10
    200      1.1  dyoung #define	IEEE80211_FC1_MORE_DATA			0x20
    201      1.1  dyoung #define	IEEE80211_FC1_WEP			0x40
    202      1.1  dyoung #define	IEEE80211_FC1_ORDER			0x80
    203      1.1  dyoung 
    204      1.1  dyoung #define	IEEE80211_SEQ_FRAG_MASK			0x000f
    205      1.1  dyoung #define	IEEE80211_SEQ_FRAG_SHIFT		0
    206      1.1  dyoung #define	IEEE80211_SEQ_SEQ_MASK			0xfff0
    207      1.1  dyoung #define	IEEE80211_SEQ_SEQ_SHIFT			4
    208      1.1  dyoung 
    209      1.1  dyoung #define	IEEE80211_NWID_LEN			32
    210      1.1  dyoung 
    211  1.1.1.3  dyoung #define	IEEE80211_QOS_TXOP			0x00ff
    212  1.1.1.3  dyoung /* bit 8 is reserved */
    213  1.1.1.3  dyoung #define	IEEE80211_QOS_ACKPOLICY			0x0600
    214  1.1.1.3  dyoung #define	IEEE80211_QOS_ESOP			0x0800
    215  1.1.1.3  dyoung #define	IEEE80211_QOS_TID			0xf000
    216  1.1.1.3  dyoung 
    217      1.1  dyoung /*
    218  1.1.1.2  dyoung  * Control frames.
    219  1.1.1.2  dyoung  */
    220  1.1.1.2  dyoung struct ieee80211_frame_min {
    221  1.1.1.2  dyoung 	u_int8_t	i_fc[2];
    222  1.1.1.2  dyoung 	u_int8_t	i_dur[2];
    223  1.1.1.2  dyoung 	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
    224  1.1.1.2  dyoung 	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
    225  1.1.1.2  dyoung 	/* FCS */
    226  1.1.1.2  dyoung } __attribute__((__packed__));
    227  1.1.1.2  dyoung 
    228  1.1.1.2  dyoung struct ieee80211_frame_rts {
    229  1.1.1.2  dyoung 	u_int8_t	i_fc[2];
    230  1.1.1.2  dyoung 	u_int8_t	i_dur[2];
    231  1.1.1.2  dyoung 	u_int8_t	i_ra[IEEE80211_ADDR_LEN];
    232  1.1.1.2  dyoung 	u_int8_t	i_ta[IEEE80211_ADDR_LEN];
    233  1.1.1.2  dyoung 	/* FCS */
    234  1.1.1.2  dyoung } __attribute__((__packed__));
    235  1.1.1.2  dyoung 
    236  1.1.1.2  dyoung struct ieee80211_frame_cts {
    237  1.1.1.2  dyoung 	u_int8_t	i_fc[2];
    238  1.1.1.2  dyoung 	u_int8_t	i_dur[2];
    239  1.1.1.2  dyoung 	u_int8_t	i_ra[IEEE80211_ADDR_LEN];
    240  1.1.1.2  dyoung 	/* FCS */
    241  1.1.1.2  dyoung } __attribute__((__packed__));
    242  1.1.1.2  dyoung 
    243  1.1.1.2  dyoung struct ieee80211_frame_ack {
    244  1.1.1.2  dyoung 	u_int8_t	i_fc[2];
    245  1.1.1.2  dyoung 	u_int8_t	i_dur[2];
    246  1.1.1.2  dyoung 	u_int8_t	i_ra[IEEE80211_ADDR_LEN];
    247  1.1.1.2  dyoung 	/* FCS */
    248  1.1.1.2  dyoung } __attribute__((__packed__));
    249  1.1.1.2  dyoung 
    250  1.1.1.2  dyoung struct ieee80211_frame_pspoll {
    251  1.1.1.2  dyoung 	u_int8_t	i_fc[2];
    252  1.1.1.2  dyoung 	u_int8_t	i_aid[2];
    253  1.1.1.2  dyoung 	u_int8_t	i_bssid[IEEE80211_ADDR_LEN];
    254  1.1.1.2  dyoung 	u_int8_t	i_ta[IEEE80211_ADDR_LEN];
    255  1.1.1.2  dyoung 	/* FCS */
    256  1.1.1.2  dyoung } __attribute__((__packed__));
    257  1.1.1.2  dyoung 
    258  1.1.1.2  dyoung struct ieee80211_frame_cfend {		/* NB: also CF-End+CF-Ack */
    259  1.1.1.2  dyoung 	u_int8_t	i_fc[2];
    260  1.1.1.2  dyoung 	u_int8_t	i_dur[2];	/* should be zero */
    261  1.1.1.2  dyoung 	u_int8_t	i_ra[IEEE80211_ADDR_LEN];
    262  1.1.1.2  dyoung 	u_int8_t	i_bssid[IEEE80211_ADDR_LEN];
    263  1.1.1.2  dyoung 	/* FCS */
    264  1.1.1.2  dyoung } __attribute__((__packed__));
    265  1.1.1.2  dyoung 
    266  1.1.1.2  dyoung /*
    267      1.1  dyoung  * BEACON management packets
    268      1.1  dyoung  *
    269      1.1  dyoung  *	octet timestamp[8]
    270      1.1  dyoung  *	octet beacon interval[2]
    271      1.1  dyoung  *	octet capability information[2]
    272      1.1  dyoung  *	information element
    273      1.1  dyoung  *		octet elemid
    274      1.1  dyoung  *		octet length
    275      1.1  dyoung  *		octet information[length]
    276      1.1  dyoung  */
    277      1.1  dyoung 
    278      1.1  dyoung typedef uint8_t *ieee80211_mgt_beacon_t;
    279      1.1  dyoung 
    280      1.1  dyoung #define	IEEE80211_BEACON_INTERVAL(beacon) \
    281      1.1  dyoung 	((beacon)[8] | ((beacon)[9] << 8))
    282      1.1  dyoung #define	IEEE80211_BEACON_CAPABILITY(beacon) \
    283      1.1  dyoung 	((beacon)[10] | ((beacon)[11] << 8))
    284      1.1  dyoung 
    285      1.1  dyoung #define	IEEE80211_CAPINFO_ESS			0x0001
    286      1.1  dyoung #define	IEEE80211_CAPINFO_IBSS			0x0002
    287      1.1  dyoung #define	IEEE80211_CAPINFO_CF_POLLABLE		0x0004
    288      1.1  dyoung #define	IEEE80211_CAPINFO_CF_POLLREQ		0x0008
    289      1.1  dyoung #define	IEEE80211_CAPINFO_PRIVACY		0x0010
    290      1.1  dyoung #define	IEEE80211_CAPINFO_SHORT_PREAMBLE	0x0020
    291      1.1  dyoung #define	IEEE80211_CAPINFO_PBCC			0x0040
    292      1.1  dyoung #define	IEEE80211_CAPINFO_CHNL_AGILITY		0x0080
    293      1.1  dyoung /* bits 8-9 are reserved */
    294      1.1  dyoung #define	IEEE80211_CAPINFO_SHORT_SLOTTIME	0x0400
    295  1.1.1.3  dyoung #define	IEEE80211_CAPINFO_RSN			0x0800
    296  1.1.1.3  dyoung /* bit 12 is reserved */
    297      1.1  dyoung #define	IEEE80211_CAPINFO_DSSSOFDM		0x2000
    298      1.1  dyoung /* bits 14-15 are reserved */
    299      1.1  dyoung 
    300      1.1  dyoung /*
    301  1.1.1.3  dyoung  * 802.11i/WPA information element (maximally sized).
    302  1.1.1.3  dyoung  */
    303  1.1.1.3  dyoung struct ieee80211_ie_wpa {
    304  1.1.1.3  dyoung 	u_int8_t	wpa_oui[3];	/* 0x00, 0x50, 0xf2 */
    305  1.1.1.3  dyoung 	u_int8_t	wpa_type;	/* OUI type */
    306  1.1.1.3  dyoung 	u_int16_t	wpa_version;	/* spec revision */
    307  1.1.1.3  dyoung 	u_int32_t	wpa_mcipher[1];	/* multicast/group key cipher */
    308  1.1.1.3  dyoung 	u_int16_t	wpa_uciphercnt;	/* # pairwise key ciphers */
    309  1.1.1.3  dyoung 	u_int32_t	wpa_uciphers[8];/* ciphers */
    310  1.1.1.3  dyoung 	u_int16_t	wpa_authselcnt;	/* authentication selector cnt*/
    311  1.1.1.3  dyoung 	u_int32_t	wpa_authsels[8];/* selectors */
    312  1.1.1.3  dyoung } __attribute__((__packed__));
    313  1.1.1.3  dyoung 
    314  1.1.1.3  dyoung /*
    315      1.1  dyoung  * Management information elements
    316      1.1  dyoung  */
    317      1.1  dyoung struct ieee80211_information {
    318      1.1  dyoung 	char	ssid[IEEE80211_NWID_LEN+1];
    319      1.1  dyoung 	struct rates {
    320      1.1  dyoung 		u_int8_t	*p;
    321      1.1  dyoung 	} rates;
    322      1.1  dyoung 	struct fh {
    323      1.1  dyoung 		u_int16_t	dwell;
    324      1.1  dyoung 		u_int8_t	set;
    325      1.1  dyoung 		u_int8_t	pattern;
    326      1.1  dyoung 		u_int8_t	index;
    327      1.1  dyoung 	} fh;
    328      1.1  dyoung 	struct ds {
    329      1.1  dyoung 		u_int8_t	channel;
    330      1.1  dyoung 	} ds;
    331      1.1  dyoung 	struct cf {
    332      1.1  dyoung 		u_int8_t	count;
    333      1.1  dyoung 		u_int8_t	period;
    334      1.1  dyoung 		u_int8_t	maxdur[2];
    335      1.1  dyoung 		u_int8_t	dur[2];
    336      1.1  dyoung 	} cf;
    337      1.1  dyoung 	struct tim {
    338      1.1  dyoung 		u_int8_t	count;
    339      1.1  dyoung 		u_int8_t	period;
    340      1.1  dyoung 		u_int8_t	bitctl;
    341      1.1  dyoung 		/* u_int8_t	pvt[251]; The driver needs to use this. */
    342      1.1  dyoung 	} tim;
    343      1.1  dyoung 	struct ibss {
    344      1.1  dyoung 		u_int16_t	atim;
    345      1.1  dyoung 	} ibss;
    346      1.1  dyoung 	struct challenge {
    347      1.1  dyoung 		u_int8_t	*p;
    348      1.1  dyoung 		u_int8_t	len;
    349      1.1  dyoung 	} challenge;
    350      1.1  dyoung 	struct erp {
    351      1.1  dyoung 		u_int8_t	flags;
    352      1.1  dyoung 	} erp;
    353  1.1.1.3  dyoung 	struct country {
    354  1.1.1.3  dyoung 		u_int8_t	cc[3];		/* ISO CC+(I)ndoor/(O)utdoor */
    355  1.1.1.3  dyoung 		struct {
    356  1.1.1.3  dyoung 			u_int8_t schan;		/* starting channel */
    357  1.1.1.3  dyoung 			u_int8_t nchan;		/* number channels */
    358  1.1.1.3  dyoung 			u_int8_t maxtxpwr;
    359  1.1.1.3  dyoung 		} band[4];			/* up to 4 sub bands */
    360  1.1.1.3  dyoung 	} country;
    361  1.1.1.3  dyoung 	struct ath {
    362  1.1.1.3  dyoung 		u_int8_t	flags;
    363  1.1.1.3  dyoung 	} ath;
    364  1.1.1.3  dyoung 	struct ieee80211_ie_wpa	wpa;
    365      1.1  dyoung };
    366      1.1  dyoung 
    367      1.1  dyoung enum {
    368      1.1  dyoung 	IEEE80211_ELEMID_SSID			= 0,
    369      1.1  dyoung 	IEEE80211_ELEMID_RATES			= 1,
    370      1.1  dyoung 	IEEE80211_ELEMID_FHPARMS		= 2,
    371      1.1  dyoung 	IEEE80211_ELEMID_DSPARMS		= 3,
    372      1.1  dyoung 	IEEE80211_ELEMID_CFPARMS		= 4,
    373      1.1  dyoung 	IEEE80211_ELEMID_TIM			= 5,
    374      1.1  dyoung 	IEEE80211_ELEMID_IBSSPARMS		= 6,
    375      1.1  dyoung 	IEEE80211_ELEMID_COUNTRY		= 7,
    376      1.1  dyoung 	IEEE80211_ELEMID_CHALLENGE		= 16,
    377  1.1.1.3  dyoung 	/* 17-31 reserved for challenge text extension */
    378      1.1  dyoung 	IEEE80211_ELEMID_ERP			= 42,
    379      1.1  dyoung 	IEEE80211_ELEMID_XRATES			= 50,
    380  1.1.1.3  dyoung 	IEEE80211_ELEMID_TPC			= 150,
    381  1.1.1.3  dyoung 	IEEE80211_ELEMID_CCKM			= 156,
    382  1.1.1.3  dyoung 	IEEE80211_ELEMID_VENDOR			= 221,	/* vendor private */
    383      1.1  dyoung };
    384      1.1  dyoung 
    385  1.1.1.3  dyoung #define IEEE80211_CHALLENGE_LEN			128
    386  1.1.1.3  dyoung 
    387      1.1  dyoung #define	IEEE80211_RATE_BASIC			0x80
    388      1.1  dyoung #define	IEEE80211_RATE_VAL			0x7f
    389      1.1  dyoung 
    390      1.1  dyoung /* EPR information element flags */
    391      1.1  dyoung #define	IEEE80211_ERP_NON_ERP_PRESENT		0x01
    392      1.1  dyoung #define	IEEE80211_ERP_USE_PROTECTION		0x02
    393      1.1  dyoung #define	IEEE80211_ERP_BARKER_MODE		0x04
    394      1.1  dyoung 
    395  1.1.1.3  dyoung /* Atheros private advanced capabilities info */
    396  1.1.1.3  dyoung #define	ATHEROS_CAP_TURBO_PRIME			0x01
    397  1.1.1.3  dyoung #define	ATHEROS_CAP_COMPRESSION			0x02
    398  1.1.1.3  dyoung #define	ATHEROS_CAP_FAST_FRAME			0x04
    399  1.1.1.3  dyoung /* bits 3-6 reserved */
    400  1.1.1.3  dyoung #define	ATHEROS_CAP_BOOST			0x80
    401  1.1.1.3  dyoung 
    402  1.1.1.3  dyoung #define	ATH_OUI			0x7f0300		/* Atheros OUI */
    403  1.1.1.3  dyoung #define	ATH_OUI_TYPE		0x01
    404  1.1.1.3  dyoung #define	ATH_OUI_VERSION		0x01
    405  1.1.1.3  dyoung 
    406  1.1.1.3  dyoung #define	WPA_OUI			0xf25000
    407  1.1.1.3  dyoung #define	WPA_OUI_TYPE		0x01
    408  1.1.1.3  dyoung #define	WPA_OUI_VERSION		1		/* current supported version */
    409  1.1.1.3  dyoung 
    410  1.1.1.3  dyoung #define	WPA_CSE_NULL		0x00
    411  1.1.1.3  dyoung #define	WPA_CSE_WEP40		0x01
    412  1.1.1.3  dyoung #define	WPA_CSE_TKIP		0x02
    413  1.1.1.3  dyoung #define	WPA_CSE_WRAP		0x03		/* WPA2/802.11i */
    414  1.1.1.3  dyoung #define	WPA_CSE_CCMP		0x04
    415  1.1.1.3  dyoung #define	WPA_CSE_WEP104		0x05
    416  1.1.1.3  dyoung 
    417  1.1.1.3  dyoung #define	WPA_ASE_NONE		0x00
    418  1.1.1.3  dyoung #define	WPA_ASE_8021X_UNSPEC	0x01
    419  1.1.1.3  dyoung #define	WPA_ASE_8021X_PSK	0x02
    420  1.1.1.3  dyoung 
    421      1.1  dyoung /*
    422      1.1  dyoung  * AUTH management packets
    423      1.1  dyoung  *
    424      1.1  dyoung  *	octet algo[2]
    425      1.1  dyoung  *	octet seq[2]
    426      1.1  dyoung  *	octet status[2]
    427      1.1  dyoung  *	octet chal.id
    428      1.1  dyoung  *	octet chal.length
    429      1.1  dyoung  *	octet chal.text[253]
    430      1.1  dyoung  */
    431      1.1  dyoung 
    432      1.1  dyoung typedef u_int8_t *ieee80211_mgt_auth_t;
    433      1.1  dyoung 
    434      1.1  dyoung #define	IEEE80211_AUTH_ALGORITHM(auth) \
    435      1.1  dyoung 	((auth)[0] | ((auth)[1] << 8))
    436      1.1  dyoung #define	IEEE80211_AUTH_TRANSACTION(auth) \
    437      1.1  dyoung 	((auth)[2] | ((auth)[3] << 8))
    438      1.1  dyoung #define	IEEE80211_AUTH_STATUS(auth) \
    439      1.1  dyoung 	((auth)[4] | ((auth)[5] << 8))
    440      1.1  dyoung 
    441      1.1  dyoung #define	IEEE80211_AUTH_ALG_OPEN			0x0000
    442      1.1  dyoung #define	IEEE80211_AUTH_ALG_SHARED		0x0001
    443  1.1.1.3  dyoung #define	IEEE80211_AUTH_ALG_LEAP			0x0080
    444      1.1  dyoung 
    445      1.1  dyoung enum {
    446      1.1  dyoung 	IEEE80211_AUTH_OPEN_REQUEST		= 1,
    447      1.1  dyoung 	IEEE80211_AUTH_OPEN_RESPONSE		= 2,
    448      1.1  dyoung };
    449      1.1  dyoung 
    450      1.1  dyoung enum {
    451      1.1  dyoung 	IEEE80211_AUTH_SHARED_REQUEST		= 1,
    452      1.1  dyoung 	IEEE80211_AUTH_SHARED_CHALLENGE		= 2,
    453      1.1  dyoung 	IEEE80211_AUTH_SHARED_RESPONSE		= 3,
    454      1.1  dyoung 	IEEE80211_AUTH_SHARED_PASS		= 4,
    455      1.1  dyoung };
    456      1.1  dyoung 
    457      1.1  dyoung /*
    458      1.1  dyoung  * Reason codes
    459      1.1  dyoung  *
    460      1.1  dyoung  * Unlisted codes are reserved
    461      1.1  dyoung  */
    462      1.1  dyoung 
    463      1.1  dyoung enum {
    464      1.1  dyoung 	IEEE80211_REASON_UNSPECIFIED		= 1,
    465      1.1  dyoung 	IEEE80211_REASON_AUTH_EXPIRE		= 2,
    466      1.1  dyoung 	IEEE80211_REASON_AUTH_LEAVE		= 3,
    467      1.1  dyoung 	IEEE80211_REASON_ASSOC_EXPIRE		= 4,
    468      1.1  dyoung 	IEEE80211_REASON_ASSOC_TOOMANY		= 5,
    469      1.1  dyoung 	IEEE80211_REASON_NOT_AUTHED		= 6,
    470      1.1  dyoung 	IEEE80211_REASON_NOT_ASSOCED		= 7,
    471      1.1  dyoung 	IEEE80211_REASON_ASSOC_LEAVE		= 8,
    472      1.1  dyoung 	IEEE80211_REASON_ASSOC_NOT_AUTHED	= 9,
    473      1.1  dyoung 
    474  1.1.1.3  dyoung 	IEEE80211_REASON_RSN_REQUIRED		= 11,
    475  1.1.1.3  dyoung 	IEEE80211_REASON_RSN_INCONSISTENT	= 12,
    476  1.1.1.3  dyoung 	IEEE80211_REASON_IE_INVALID		= 13,
    477  1.1.1.3  dyoung 	IEEE80211_REASON_MIC_FAILURE		= 14,
    478  1.1.1.3  dyoung 
    479      1.1  dyoung 	IEEE80211_STATUS_SUCCESS		= 0,
    480      1.1  dyoung 	IEEE80211_STATUS_UNSPECIFIED		= 1,
    481      1.1  dyoung 	IEEE80211_STATUS_CAPINFO		= 10,
    482      1.1  dyoung 	IEEE80211_STATUS_NOT_ASSOCED		= 11,
    483      1.1  dyoung 	IEEE80211_STATUS_OTHER			= 12,
    484      1.1  dyoung 	IEEE80211_STATUS_ALG			= 13,
    485      1.1  dyoung 	IEEE80211_STATUS_SEQUENCE		= 14,
    486      1.1  dyoung 	IEEE80211_STATUS_CHALLENGE		= 15,
    487      1.1  dyoung 	IEEE80211_STATUS_TIMEOUT		= 16,
    488      1.1  dyoung 	IEEE80211_STATUS_TOOMANY		= 17,
    489      1.1  dyoung 	IEEE80211_STATUS_BASIC_RATE		= 18,
    490      1.1  dyoung 	IEEE80211_STATUS_SP_REQUIRED		= 19,
    491      1.1  dyoung 	IEEE80211_STATUS_PBCC_REQUIRED		= 20,
    492      1.1  dyoung 	IEEE80211_STATUS_CA_REQUIRED		= 21,
    493      1.1  dyoung 	IEEE80211_STATUS_TOO_MANY_STATIONS	= 22,
    494      1.1  dyoung 	IEEE80211_STATUS_RATES			= 23,
    495      1.1  dyoung 	IEEE80211_STATUS_SHORTSLOT_REQUIRED	= 25,
    496      1.1  dyoung 	IEEE80211_STATUS_DSSSOFDM_REQUIRED	= 26,
    497      1.1  dyoung };
    498      1.1  dyoung 
    499      1.1  dyoung #define	IEEE80211_WEP_KEYLEN			5	/* 40bit */
    500      1.1  dyoung #define	IEEE80211_WEP_IVLEN			3	/* 24bit */
    501      1.1  dyoung #define	IEEE80211_WEP_KIDLEN			1	/* 1 octet */
    502      1.1  dyoung #define	IEEE80211_WEP_CRCLEN			4	/* CRC-32 */
    503      1.1  dyoung #define	IEEE80211_WEP_NKID			4	/* number of key ids */
    504      1.1  dyoung 
    505      1.1  dyoung #define	IEEE80211_CRC_LEN			4
    506      1.1  dyoung 
    507  1.1.1.3  dyoung /*
    508  1.1.1.3  dyoung  * Maximum acceptable MTU is:
    509  1.1.1.3  dyoung  *	IEEE80211_MAX_LEN - WEP overhead - CRC -
    510  1.1.1.3  dyoung  *		QoS overhead - RSN/WPA overhead
    511  1.1.1.3  dyoung  * Min is arbitrarily chosen > IEEE80211_MIN_LEN.  The default
    512  1.1.1.3  dyoung  * mtu is Ethernet-compatible; it's set by ether_ifattach.
    513  1.1.1.3  dyoung  */
    514  1.1.1.3  dyoung #define	IEEE80211_MTU_MAX			2290
    515  1.1.1.3  dyoung #define	IEEE80211_MTU_MIN			32
    516  1.1.1.3  dyoung 
    517      1.1  dyoung #define	IEEE80211_MAX_LEN			(2300 + IEEE80211_CRC_LEN + \
    518      1.1  dyoung     (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
    519  1.1.1.2  dyoung #define	IEEE80211_MIN_LEN \
    520  1.1.1.2  dyoung 	(sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN)
    521      1.1  dyoung 
    522      1.1  dyoung /*
    523      1.1  dyoung  * RTS frame length parameters.  The default is specified in
    524      1.1  dyoung  * the 802.11 spec.  The max may be wrong for jumbo frames.
    525      1.1  dyoung  */
    526      1.1  dyoung #define	IEEE80211_RTS_DEFAULT			512
    527      1.1  dyoung #define	IEEE80211_RTS_MIN			1
    528      1.1  dyoung #define	IEEE80211_RTS_MAX			IEEE80211_MAX_LEN
    529      1.1  dyoung 
    530      1.1  dyoung enum {
    531      1.1  dyoung 	IEEE80211_AUTH_NONE	= 0,
    532      1.1  dyoung 	IEEE80211_AUTH_OPEN	= 1,
    533      1.1  dyoung 	IEEE80211_AUTH_SHARED	= 2,
    534      1.1  dyoung };
    535      1.1  dyoung 
    536      1.1  dyoung #endif /* _NET80211_IEEE80211_H_ */
    537