[BACK]Return to ieee80211.h CVS log [TXT][DIR] Up to [local] / sys / net80211

Annotation of sys/net80211/ieee80211.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ieee80211.h,v 1.33 2007/08/01 12:23:26 damien Exp $   */
                      2: /*     $NetBSD: ieee80211.h,v 1.6 2004/04/30 23:51:53 dyoung Exp $     */
                      3:
                      4: /*-
                      5:  * Copyright (c) 2001 Atsushi Onoe
                      6:  * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. The name of the author may not be used to endorse or promote products
                     18:  *    derived from this software without specific prior written permission.
                     19:  *
                     20:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     21:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     22:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     23:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     24:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     25:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     26:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     27:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     28:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     29:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     30:  *
                     31:  * $FreeBSD: src/sys/net80211/ieee80211.h,v 1.5 2004/04/05 17:47:40 sam Exp $
                     32:  */
                     33: #ifndef _NET80211_IEEE80211_H_
                     34: #define _NET80211_IEEE80211_H_
                     35:
                     36: /*
                     37:  * 802.11 protocol definitions.
                     38:  */
                     39:
                     40: #define        IEEE80211_ADDR_LEN      6               /* size of 802.11 address */
                     41: /* is 802.11 address multicast/broadcast? */
                     42: #define        IEEE80211_IS_MULTICAST(_a)      (*(_a) & 0x01)
                     43:
                     44: /* IEEE 802.11 PLCP header */
                     45: struct ieee80211_plcp_hdr {
                     46:        u_int16_t       i_sfd;
                     47:        u_int8_t        i_signal;
                     48:        u_int8_t        i_service;
                     49:        u_int16_t       i_length;
                     50:        u_int16_t       i_crc;
                     51: } __packed;
                     52:
                     53: #define IEEE80211_PLCP_SFD      0xF3A0
                     54: #define IEEE80211_PLCP_SERVICE  0x00
                     55: #define IEEE80211_PLCP_SERVICE_PBCC  0x08      /* PBCC encoded */
                     56: #define IEEE80211_PLCP_SERVICE_LENEXT  0x80    /* length extension bit */
                     57:
                     58: /*
                     59:  * generic definitions for IEEE 802.11 frames
                     60:  */
                     61: struct ieee80211_frame {
                     62:        u_int8_t        i_fc[2];
                     63:        u_int8_t        i_dur[2];
                     64:        u_int8_t        i_addr1[IEEE80211_ADDR_LEN];
                     65:        u_int8_t        i_addr2[IEEE80211_ADDR_LEN];
                     66:        u_int8_t        i_addr3[IEEE80211_ADDR_LEN];
                     67:        u_int8_t        i_seq[2];
                     68: } __packed;
                     69:
                     70: struct ieee80211_qosframe {
                     71:        u_int8_t        i_fc[2];
                     72:        u_int8_t        i_dur[2];
                     73:        u_int8_t        i_addr1[IEEE80211_ADDR_LEN];
                     74:        u_int8_t        i_addr2[IEEE80211_ADDR_LEN];
                     75:        u_int8_t        i_addr3[IEEE80211_ADDR_LEN];
                     76:        u_int8_t        i_seq[2];
                     77:        u_int8_t        i_qos[2];
                     78: } __packed;
                     79:
                     80: /* 802.11n/D2.02 */
                     81: struct ieee80211_htframe {
                     82:        u_int8_t        i_fc[2];
                     83:        u_int8_t        i_dur[2];
                     84:        u_int8_t        i_addr1[IEEE80211_ADDR_LEN];
                     85:        u_int8_t        i_addr2[IEEE80211_ADDR_LEN];
                     86:        u_int8_t        i_addr3[IEEE80211_ADDR_LEN];
                     87:        u_int8_t        i_seq[2];
                     88:        u_int8_t        i_qos[2];
                     89:        u_int8_t        i_ht[4];
                     90: } __packed;
                     91:
                     92: struct ieee80211_frame_addr4 {
                     93:        u_int8_t        i_fc[2];
                     94:        u_int8_t        i_dur[2];
                     95:        u_int8_t        i_addr1[IEEE80211_ADDR_LEN];
                     96:        u_int8_t        i_addr2[IEEE80211_ADDR_LEN];
                     97:        u_int8_t        i_addr3[IEEE80211_ADDR_LEN];
                     98:        u_int8_t        i_seq[2];
                     99:        u_int8_t        i_addr4[IEEE80211_ADDR_LEN];
                    100: } __packed;
                    101:
                    102: struct ieee80211_qosframe_addr4 {
                    103:        u_int8_t        i_fc[2];
                    104:        u_int8_t        i_dur[2];
                    105:        u_int8_t        i_addr1[IEEE80211_ADDR_LEN];
                    106:        u_int8_t        i_addr2[IEEE80211_ADDR_LEN];
                    107:        u_int8_t        i_addr3[IEEE80211_ADDR_LEN];
                    108:        u_int8_t        i_seq[2];
                    109:        u_int8_t        i_addr4[IEEE80211_ADDR_LEN];
                    110:        u_int8_t        i_qos[2];
                    111: } __packed;
                    112:
                    113: /* 802.11n/D2.02 */
                    114: struct ieee80211_htframe_addr4 {
                    115:        u_int8_t        i_fc[2];
                    116:        u_int8_t        i_dur[2];
                    117:        u_int8_t        i_addr1[IEEE80211_ADDR_LEN];
                    118:        u_int8_t        i_addr2[IEEE80211_ADDR_LEN];
                    119:        u_int8_t        i_addr3[IEEE80211_ADDR_LEN];
                    120:        u_int8_t        i_seq[2];
                    121:        u_int8_t        i_addr4[IEEE80211_ADDR_LEN];
                    122:        u_int8_t        i_qos[2];
                    123:        u_int8_t        i_ht[4];
                    124: } __packed;
                    125:
                    126: /*
                    127:  * Management Notification Frame
                    128:  */
                    129: struct ieee80211_mnf {
                    130:        u_int8_t        mnf_category;
                    131:        u_int8_t        mnf_action;
                    132:        u_int8_t        mnf_dialog;
                    133:        u_int8_t        mnf_status;
                    134: } __packed;
                    135: #define        MNF_SETUP_REQ   0
                    136: #define        MNF_SETUP_RESP  1
                    137: #define        MNF_TEARDOWN    2
                    138:
                    139:
                    140: #define        IEEE80211_FC0_VERSION_MASK              0x03
                    141: #define        IEEE80211_FC0_VERSION_SHIFT             0
                    142: #define        IEEE80211_FC0_VERSION_0                 0x00
                    143: #define        IEEE80211_FC0_TYPE_MASK                 0x0c
                    144: #define        IEEE80211_FC0_TYPE_SHIFT                2
                    145: #define        IEEE80211_FC0_TYPE_MGT                  0x00
                    146: #define        IEEE80211_FC0_TYPE_CTL                  0x04
                    147: #define        IEEE80211_FC0_TYPE_DATA                 0x08
                    148:
                    149: #define        IEEE80211_FC0_SUBTYPE_MASK              0xf0
                    150: #define        IEEE80211_FC0_SUBTYPE_SHIFT             4
                    151: /* for TYPE_MGT */
                    152: #define        IEEE80211_FC0_SUBTYPE_ASSOC_REQ         0x00
                    153: #define        IEEE80211_FC0_SUBTYPE_ASSOC_RESP        0x10
                    154: #define        IEEE80211_FC0_SUBTYPE_REASSOC_REQ       0x20
                    155: #define        IEEE80211_FC0_SUBTYPE_REASSOC_RESP      0x30
                    156: #define        IEEE80211_FC0_SUBTYPE_PROBE_REQ         0x40
                    157: #define        IEEE80211_FC0_SUBTYPE_PROBE_RESP        0x50
                    158: #define        IEEE80211_FC0_SUBTYPE_BEACON            0x80
                    159: #define        IEEE80211_FC0_SUBTYPE_ATIM              0x90
                    160: #define        IEEE80211_FC0_SUBTYPE_DISASSOC          0xa0
                    161: #define        IEEE80211_FC0_SUBTYPE_AUTH              0xb0
                    162: #define        IEEE80211_FC0_SUBTYPE_DEAUTH            0xc0
                    163: #define IEEE80211_FC0_SUBTYPE_ACTION           0xd0
                    164: #define IEEE80211_FC0_SUBTYPE_ACTION_NOACK     0xe0    /* 802.11n/D2.00 */
                    165: /* for TYPE_CTL */
                    166: #define        IEEE80211_FC0_SUBTYPE_PS_POLL           0xa0
                    167: #define        IEEE80211_FC0_SUBTYPE_RTS               0xb0
                    168: #define        IEEE80211_FC0_SUBTYPE_CTS               0xc0
                    169: #define        IEEE80211_FC0_SUBTYPE_ACK               0xd0
                    170: #define        IEEE80211_FC0_SUBTYPE_CF_END            0xe0
                    171: #define        IEEE80211_FC0_SUBTYPE_CF_END_ACK        0xf0
                    172: /* for TYPE_DATA (bit combination) */
                    173: #define        IEEE80211_FC0_SUBTYPE_DATA              0x00
                    174: #define        IEEE80211_FC0_SUBTYPE_CF_ACK            0x10
                    175: #define        IEEE80211_FC0_SUBTYPE_CF_POLL           0x20
                    176: #define        IEEE80211_FC0_SUBTYPE_CF_ACPL           0x30
                    177: #define        IEEE80211_FC0_SUBTYPE_NODATA            0x40
                    178: #define        IEEE80211_FC0_SUBTYPE_CFACK             0x50
                    179: #define        IEEE80211_FC0_SUBTYPE_CFPOLL            0x60
                    180: #define        IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK     0x70
                    181: #define        IEEE80211_FC0_SUBTYPE_QOS               0x80
                    182:
                    183: #define        IEEE80211_FC1_DIR_MASK                  0x03
                    184: #define        IEEE80211_FC1_DIR_NODS                  0x00    /* STA->STA */
                    185: #define        IEEE80211_FC1_DIR_TODS                  0x01    /* STA->AP  */
                    186: #define        IEEE80211_FC1_DIR_FROMDS                0x02    /* AP ->STA */
                    187: #define        IEEE80211_FC1_DIR_DSTODS                0x03    /* AP ->AP  */
                    188:
                    189: #define        IEEE80211_FC1_MORE_FRAG                 0x04
                    190: #define        IEEE80211_FC1_RETRY                     0x08
                    191: #define        IEEE80211_FC1_PWR_MGT                   0x10
                    192: #define        IEEE80211_FC1_MORE_DATA                 0x20
                    193: #define        IEEE80211_FC1_PROTECTED                 0x40
                    194: #define        IEEE80211_FC1_WEP                       0x40    /* pre-RSNA compat */
                    195: #define        IEEE80211_FC1_ORDER                     0x80
                    196:
                    197: #define        IEEE80211_SEQ_FRAG_MASK                 0x000f
                    198: #define        IEEE80211_SEQ_FRAG_SHIFT                0
                    199: #define        IEEE80211_SEQ_SEQ_MASK                  0xfff0
                    200: #define        IEEE80211_SEQ_SEQ_SHIFT                 4
                    201:
                    202: #define        IEEE80211_NWID_LEN                      32
                    203:
                    204: #define        IEEE80211_QOS_TXOP                      0x00ff
                    205: /* bit 8 is reserved */
                    206: #define        IEEE80211_QOS_ACKPOLICY                 0x0600
                    207: #define        IEEE80211_QOS_ESOP                      0x0800
                    208: #define        IEEE80211_QOS_TID                       0xf000
                    209:
                    210: /*
                    211:  * Control frames.
                    212:  */
                    213: struct ieee80211_frame_min {
                    214:        u_int8_t        i_fc[2];
                    215:        u_int8_t        i_dur[2];
                    216:        u_int8_t        i_addr1[IEEE80211_ADDR_LEN];
                    217:        u_int8_t        i_addr2[IEEE80211_ADDR_LEN];
                    218:        /* FCS */
                    219: } __packed;
                    220:
                    221: struct ieee80211_frame_rts {
                    222:        u_int8_t        i_fc[2];
                    223:        u_int8_t        i_dur[2];
                    224:        u_int8_t        i_ra[IEEE80211_ADDR_LEN];
                    225:        u_int8_t        i_ta[IEEE80211_ADDR_LEN];
                    226:        /* FCS */
                    227: } __packed;
                    228:
                    229: struct ieee80211_frame_cts {
                    230:        u_int8_t        i_fc[2];
                    231:        u_int8_t        i_dur[2];
                    232:        u_int8_t        i_ra[IEEE80211_ADDR_LEN];
                    233:        /* FCS */
                    234: } __packed;
                    235:
                    236: struct ieee80211_frame_ack {
                    237:        u_int8_t        i_fc[2];
                    238:        u_int8_t        i_dur[2];
                    239:        u_int8_t        i_ra[IEEE80211_ADDR_LEN];
                    240:        /* FCS */
                    241: } __packed;
                    242:
                    243: struct ieee80211_frame_pspoll {
                    244:        u_int8_t        i_fc[2];
                    245:        u_int8_t        i_aid[2];
                    246:        u_int8_t        i_bssid[IEEE80211_ADDR_LEN];
                    247:        u_int8_t        i_ta[IEEE80211_ADDR_LEN];
                    248:        /* FCS */
                    249: } __packed;
                    250:
                    251: struct ieee80211_frame_cfend {         /* NB: also CF-End+CF-Ack */
                    252:        u_int8_t        i_fc[2];
                    253:        u_int8_t        i_dur[2];       /* should be zero */
                    254:        u_int8_t        i_ra[IEEE80211_ADDR_LEN];
                    255:        u_int8_t        i_bssid[IEEE80211_ADDR_LEN];
                    256:        /* FCS */
                    257: } __packed;
                    258:
                    259: #define        IEEE80211_CAPINFO_ESS                   0x0001
                    260: #define        IEEE80211_CAPINFO_IBSS                  0x0002
                    261: #define        IEEE80211_CAPINFO_CF_POLLABLE           0x0004
                    262: #define        IEEE80211_CAPINFO_CF_POLLREQ            0x0008
                    263: #define        IEEE80211_CAPINFO_PRIVACY               0x0010
                    264: #define        IEEE80211_CAPINFO_SHORT_PREAMBLE        0x0020
                    265: #define        IEEE80211_CAPINFO_PBCC                  0x0040
                    266: #define        IEEE80211_CAPINFO_CHNL_AGILITY          0x0080
                    267: #define IEEE80211_CAPINFO_SPECTRUM_MGMT                0x0100
                    268: #define IEEE80211_CAPINFO_QOS                  0x0200
                    269: #define        IEEE80211_CAPINFO_SHORT_SLOTTIME        0x0400
                    270: #define        IEEE80211_CAPINFO_APSD                  0x0800
                    271: /* bit 12 is reserved */
                    272: #define        IEEE80211_CAPINFO_DSSSOFDM              0x2000
                    273: #define IEEE80211_CAPINFO_DELAYED_B_ACK                0x4000
                    274: #define IEEE80211_CAPINFO_IMMEDIATE_B_ACK      0x8000
                    275: #define IEEE80211_CAPINFO_BITS                                 \
                    276:        "\10\01ESS\02IBSS\03CF_POLLABLE\04CF_POLLREQ"           \
                    277:        "\05PRIVACY\06SHORT_PREAMBLE\07PBCC\10CHNL_AGILITY"     \
                    278:        "\11SPECTRUM_MGMT\12QOS\13SHORT_SLOTTIME\14APSD"        \
                    279:        "\16DSSSOFDM\17DELAYED_B_ACK\20IMMEDIATE_B_ACK"
                    280:
                    281: /*
                    282:  * Channel attributes
                    283:  */
                    284: #define        IEEE80211_CHAN_TURBO    0x0010  /* Turbo channel */
                    285: #define        IEEE80211_CHAN_CCK      0x0020  /* CCK channel */
                    286: #define        IEEE80211_CHAN_OFDM     0x0040  /* OFDM channel */
                    287: #define        IEEE80211_CHAN_2GHZ     0x0080  /* 2 GHz spectrum channel. */
                    288: #define        IEEE80211_CHAN_5GHZ     0x0100  /* 5 GHz spectrum channel */
                    289: #define        IEEE80211_CHAN_PASSIVE  0x0200  /* Only passive scan allowed */
                    290: #define        IEEE80211_CHAN_DYN      0x0400  /* Dynamic CCK-OFDM channel */
                    291: #define        IEEE80211_CHAN_GFSK     0x0800  /* GFSK channel (FHSS PHY) */
                    292: #define        IEEE80211_CHAN_XR       0x1000  /* Extended range OFDM channel */
                    293:
                    294: /*
                    295:  * Useful combinations of channel characteristics.
                    296:  */
                    297: #define        IEEE80211_CHAN_FHSS \
                    298:        (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_GFSK)
                    299: #define        IEEE80211_CHAN_A \
                    300:        (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM)
                    301: #define        IEEE80211_CHAN_B \
                    302:        (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK)
                    303: #define        IEEE80211_CHAN_PUREG \
                    304:        (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM)
                    305: #define        IEEE80211_CHAN_G \
                    306:        (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN)
                    307: #define        IEEE80211_CHAN_T \
                    308:        (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO)
                    309: #define        IEEE80211_CHAN_TG \
                    310:        (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO)
                    311:
                    312: /*
                    313:  * Management information element payloads
                    314:  */
                    315: union ieee80211_information {
                    316:        char    ssid[IEEE80211_NWID_LEN+1];
                    317:        struct rates {
                    318:                u_int8_t        *p;
                    319:        } rates;
                    320:        struct fh {
                    321:                u_int16_t       dwell;
                    322:                u_int8_t        set;
                    323:                u_int8_t        pattern;
                    324:                u_int8_t        index;
                    325:        } fh;
                    326:        struct ds {
                    327:                u_int8_t        channel;
                    328:        } ds;
                    329:        struct cf {
                    330:                u_int8_t        count;
                    331:                u_int8_t        period;
                    332:                u_int8_t        maxdur[2];
                    333:                u_int8_t        dur[2];
                    334:        } cf;
                    335:        struct tim {
                    336:                u_int8_t        count;
                    337:                u_int8_t        period;
                    338:                u_int8_t        bitctl;
                    339:                /* u_int8_t     pvt[251]; The driver needs to use this. */
                    340:        } tim;
                    341:        struct ibss {
                    342:                u_int16_t       atim;
                    343:        } ibss;
                    344:        struct challenge {
                    345:                u_int8_t        *p;
                    346:                u_int8_t        len;
                    347:        } challenge;
                    348:        struct erp {
                    349:                u_int8_t        flags;
                    350:        } erp;
                    351:        struct country {
                    352:                u_int8_t        cc[3];          /* ISO CC+(I)ndoor/(O)utdoor */
                    353:                struct {
                    354:                        u_int8_t schan;         /* starting channel */
                    355:                        u_int8_t nchan;         /* number channels */
                    356:                        u_int8_t maxtxpwr;
                    357:                } band[4];                      /* up to 4 sub bands */
                    358:        } country;
                    359:        struct ath {
                    360:                u_int8_t        flags;
                    361:        } ath;
                    362: };
                    363:
                    364: enum {
                    365:        IEEE80211_ELEMID_SSID                   = 0,
                    366:        IEEE80211_ELEMID_RATES                  = 1,
                    367:        IEEE80211_ELEMID_FHPARMS                = 2,
                    368:        IEEE80211_ELEMID_DSPARMS                = 3,
                    369:        IEEE80211_ELEMID_CFPARMS                = 4,
                    370:        IEEE80211_ELEMID_TIM                    = 5,
                    371:        IEEE80211_ELEMID_IBSSPARMS              = 6,
                    372:        IEEE80211_ELEMID_COUNTRY                = 7,
                    373:        IEEE80211_ELEMID_QBSS_LOAD              = 11,
                    374:        IEEE80211_ELEMID_EDCAPARMS              = 12,
                    375:        IEEE80211_ELEMID_CHALLENGE              = 16,
                    376:        /* 17-31 reserved for challenge text extension */
                    377:        IEEE80211_ELEMID_ERP                    = 42,
                    378:        IEEE80211_ELEMID_QOS_CAP                = 46,
                    379:        IEEE80211_ELEMID_RSN                    = 48,
                    380:        IEEE80211_ELEMID_XRATES                 = 50,
                    381:        IEEE80211_ELEMID_TPC                    = 150,
                    382:        IEEE80211_ELEMID_CCKM                   = 156,
                    383:        IEEE80211_ELEMID_VENDOR                 = 221   /* vendor private */
                    384: };
                    385:
                    386: #define IEEE80211_CHALLENGE_LEN                        128
                    387:
                    388: #define        IEEE80211_RATE_BASIC                    0x80
                    389: #define        IEEE80211_RATE_VAL                      0x7f
                    390: #define        IEEE80211_RATE_SIZE                     8       /* 802.11 standard */
                    391: #define        IEEE80211_RATE_MAXSIZE                  15      /* max rates we'll handle */
                    392:
                    393: /* ERP information element flags */
                    394: #define        IEEE80211_ERP_NON_ERP_PRESENT           0x01
                    395: #define        IEEE80211_ERP_USE_PROTECTION            0x02
                    396: #define        IEEE80211_ERP_BARKER_MODE               0x04
                    397:
                    398: /*
                    399:  * 802.11e EDCA Access Categories.
                    400:  */
                    401: enum ieee80211_edca_ac {
                    402:        EDCA_AC_BK  = 1,        /* Background */
                    403:        EDCA_AC_BE  = 0,        /* Best Effort */
                    404:        EDCA_AC_VI  = 2,        /* Video */
                    405:        EDCA_AC_VO  = 3         /* Voice */
                    406: };
                    407: #define EDCA_NUM_AC    4
                    408:
                    409: /* number of TID values (traffic identifier) */
                    410: #define IEEE80211_NUM_TID      16
                    411:
                    412: /* Atheros private advanced capabilities info */
                    413: #define        ATHEROS_CAP_TURBO_PRIME                 0x01
                    414: #define        ATHEROS_CAP_COMPRESSION                 0x02
                    415: #define        ATHEROS_CAP_FAST_FRAME                  0x04
                    416: /* bits 3-6 reserved */
                    417: #define        ATHEROS_CAP_BOOST                       0x80
                    418:
                    419: /* Organizationally Unique Identifiers */
                    420: /* See http://standards.ieee.org/regauth/oui/oui.txt for a list */
                    421: #define ATHEROS_OUI    ((const u_int8_t[]){ 0x00, 0x03, 0x7f })
                    422: #define BROADCOM_OUI   ((const u_int8_t[]){ 0c00, 0x90, 0x4c })
                    423: #define IEEE80211_OUI  ((const u_int8_t[]){ 0x00, 0x0f, 0xac })
                    424: #define MICROSOFT_OUI  ((const u_int8_t[]){ 0x00, 0x50, 0xf2 })
                    425:
                    426: #define        IEEE80211_AUTH_ALGORITHM(auth) \
                    427:        ((auth)[0] | ((auth)[1] << 8))
                    428: #define        IEEE80211_AUTH_TRANSACTION(auth) \
                    429:        ((auth)[2] | ((auth)[3] << 8))
                    430: #define        IEEE80211_AUTH_STATUS(auth) \
                    431:        ((auth)[4] | ((auth)[5] << 8))
                    432:
                    433: #define        IEEE80211_AUTH_ALG_OPEN                 0x0000
                    434: #define        IEEE80211_AUTH_ALG_SHARED               0x0001
                    435: #define        IEEE80211_AUTH_ALG_LEAP                 0x0080
                    436:
                    437: enum {
                    438:        IEEE80211_AUTH_OPEN_REQUEST             = 1,
                    439:        IEEE80211_AUTH_OPEN_RESPONSE            = 2
                    440: };
                    441:
                    442: enum {
                    443:        IEEE80211_AUTH_SHARED_REQUEST           = 1,
                    444:        IEEE80211_AUTH_SHARED_CHALLENGE         = 2,
                    445:        IEEE80211_AUTH_SHARED_RESPONSE          = 3,
                    446:        IEEE80211_AUTH_SHARED_PASS              = 4
                    447: };
                    448:
                    449: /*
                    450:  * Reason codes (see Table 22).
                    451:  */
                    452: enum {
                    453:        IEEE80211_REASON_UNSPECIFIED            = 1,
                    454:        IEEE80211_REASON_AUTH_EXPIRE            = 2,
                    455:        IEEE80211_REASON_AUTH_LEAVE             = 3,
                    456:        IEEE80211_REASON_ASSOC_EXPIRE           = 4,
                    457:        IEEE80211_REASON_ASSOC_TOOMANY          = 5,
                    458:        IEEE80211_REASON_NOT_AUTHED             = 6,
                    459:        IEEE80211_REASON_NOT_ASSOCED            = 7,
                    460:        IEEE80211_REASON_ASSOC_LEAVE            = 8,
                    461:        IEEE80211_REASON_ASSOC_NOT_AUTHED       = 9,
                    462:
                    463:        /* XXX the following two reason codes are not correct */
                    464:        IEEE80211_REASON_RSN_REQUIRED           = 11,
                    465:        IEEE80211_REASON_RSN_INCONSISTENT       = 12,
                    466:
                    467:        IEEE80211_REASON_IE_INVALID             = 13,
                    468:        IEEE80211_REASON_MIC_FAILURE            = 14,
                    469:
                    470:        IEEE80211_REASON_BAD_GROUP_CIPHER       = 18,
                    471:        IEEE80211_REASON_BAD_PAIRWISE_CIPHER    = 19,
                    472:        IEEE80211_REASON_BAD_AKMP               = 20,
                    473:        IEEE80211_REASON_RSN_IE_VER_UNSUP       = 21,
                    474:        IEEE80211_REASON_RSN_IE_BAD_CAP         = 22,
                    475:
                    476:        IEEE80211_REASON_CIPHER_REJ             = 24
                    477: };
                    478:
                    479: /*
                    480:  * Status codes (see Table 23).
                    481:  */
                    482: enum {
                    483:        IEEE80211_STATUS_SUCCESS                = 0,
                    484:        IEEE80211_STATUS_UNSPECIFIED            = 1,
                    485:        IEEE80211_STATUS_CAPINFO                = 10,
                    486:        IEEE80211_STATUS_NOT_ASSOCED            = 11,
                    487:        IEEE80211_STATUS_OTHER                  = 12,
                    488:        IEEE80211_STATUS_ALG                    = 13,
                    489:        IEEE80211_STATUS_SEQUENCE               = 14,
                    490:        IEEE80211_STATUS_CHALLENGE              = 15,
                    491:        IEEE80211_STATUS_TIMEOUT                = 16,
                    492:        IEEE80211_STATUS_TOOMANY                = 17,
                    493:        IEEE80211_STATUS_BASIC_RATE             = 18,
                    494:        IEEE80211_STATUS_SP_REQUIRED            = 19,
                    495:        IEEE80211_STATUS_PBCC_REQUIRED          = 20,
                    496:        IEEE80211_STATUS_CA_REQUIRED            = 21,
                    497:        IEEE80211_STATUS_TOO_MANY_STATIONS      = 22,
                    498:        IEEE80211_STATUS_RATES                  = 23,
                    499:        IEEE80211_STATUS_SHORTSLOT_REQUIRED     = 25,
                    500:        IEEE80211_STATUS_DSSSOFDM_REQUIRED      = 26
                    501: };
                    502:
                    503: #define        IEEE80211_WEP_KEYLEN                    5       /* 40bit */
                    504: #define        IEEE80211_WEP_NKID                      4       /* number of key ids */
                    505:
                    506: /* WEP header constants */
                    507: #define        IEEE80211_WEP_IVLEN                     3       /* 24bit */
                    508: #define        IEEE80211_WEP_KIDLEN                    1       /* 1 octet */
                    509: #define        IEEE80211_WEP_CRCLEN                    4       /* CRC-32 */
                    510: #define        IEEE80211_CRC_LEN                       4
                    511: #define        IEEE80211_WEP_TOTLEN            (IEEE80211_WEP_IVLEN + \
                    512:                                         IEEE80211_WEP_KIDLEN + \
                    513:                                         IEEE80211_WEP_CRCLEN)
                    514:
                    515: /*
                    516:  * 802.11i defines an extended IV for use with non-WEP ciphers.
                    517:  * When the EXTIV bit is set in the key id byte an additional
                    518:  * 4 bytes immediately follow the IV for TKIP.  For CCMP the
                    519:  * EXTIV bit is likewise set but the 8 bytes represent the
                    520:  * CCMP header rather than IV+extended-IV.
                    521:  */
                    522: #define        IEEE80211_WEP_EXTIV             0x20
                    523: #define        IEEE80211_WEP_EXTIVLEN          4       /* extended IV length */
                    524: #define        IEEE80211_WEP_MICLEN            8       /* trailing MIC */
                    525:
                    526: /*
                    527:  * Maximum acceptable MTU is:
                    528:  *     IEEE80211_MAX_LEN - WEP overhead - CRC -
                    529:  *             QoS overhead - RSN/WPA overhead
                    530:  * Min is arbitrarily chosen > IEEE80211_MIN_LEN.  The default
                    531:  * mtu is Ethernet-compatible; it's set by ether_ifattach.
                    532:  */
                    533: #define        IEEE80211_MTU_MAX                       2290
                    534: #define        IEEE80211_MTU_MIN                       32
                    535:
                    536: #define        IEEE80211_MAX_LEN                       (2300 + IEEE80211_CRC_LEN + \
                    537:     (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
                    538: #define        IEEE80211_ACK_LEN \
                    539:        (sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN)
                    540: #define        IEEE80211_MIN_LEN \
                    541:        (sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN)
                    542:
                    543: /*
                    544:  * The 802.11 spec says at most 2007 stations may be
                    545:  * associated at once.  For most AP's this is way more
                    546:  * than is feasible so we use a default of 1800. This
                    547:  * number may be overridden by the driver and/or by
                    548:  * user configuration.
                    549:  */
                    550: #define        IEEE80211_AID_MAX               2007
                    551: #define        IEEE80211_AID_DEF               1800
                    552:
                    553: #define        IEEE80211_AID(b)                ((b) &~ 0xc000)
                    554: #define        IEEE80211_AID_SET(b, w) \
                    555:        ((w)[IEEE80211_AID(b) / 32] |= (1 << (IEEE80211_AID(b) % 32)))
                    556: #define        IEEE80211_AID_CLR(b, w) \
                    557:        ((w)[IEEE80211_AID(b) / 32] &= ~(1 << (IEEE80211_AID(b) % 32)))
                    558: #define        IEEE80211_AID_ISSET(b, w) \
                    559:        ((w)[IEEE80211_AID(b) / 32] & (1 << (IEEE80211_AID(b) % 32)))
                    560:
                    561: /*
                    562:  * RTS frame length parameters.  The default is specified in
                    563:  * the 802.11 spec.  The max may be wrong for jumbo frames.
                    564:  */
                    565: #define        IEEE80211_RTS_DEFAULT                   512
                    566: #define        IEEE80211_RTS_MIN                       1
                    567: #define        IEEE80211_RTS_MAX                       IEEE80211_MAX_LEN
                    568:
                    569: /* One Time Unit (TU) is 1Kus = 1024 microseconds. */
                    570: #define IEEE80211_DUR_TU               1024
                    571:
                    572: /* IEEE 802.11b durations for DSSS PHY in microseconds */
                    573: #define IEEE80211_DUR_DS_LONG_PREAMBLE 144
                    574: #define IEEE80211_DUR_DS_SHORT_PREAMBLE        72
                    575: #define        IEEE80211_DUR_DS_PREAMBLE_DIFFERENCE    \
                    576:     (IEEE80211_DUR_DS_LONG_PREAMBLE - IEEE80211_DUR_DS_SHORT_PREAMBLE)
                    577: #define IEEE80211_DUR_DS_FAST_PLCPHDR  24
                    578: #define IEEE80211_DUR_DS_SLOW_PLCPHDR  48
                    579: #define        IEEE80211_DUR_DS_PLCPHDR_DIFFERENCE     \
                    580:     (IEEE80211_DUR_DS_SLOW_PLCPHDR - IEEE80211_DUR_DS_FAST_PLCPHDR)
                    581: #define IEEE80211_DUR_DS_SLOW_ACK      112
                    582: #define IEEE80211_DUR_DS_FAST_ACK      56
                    583: #define IEEE80211_DUR_DS_SLOW_CTS      112
                    584: #define IEEE80211_DUR_DS_FAST_CTS      56
                    585: #define IEEE80211_DUR_DS_SLOT          20
                    586: #define IEEE80211_DUR_DS_SIFS          10
                    587: #define IEEE80211_DUR_DS_PIFS  (IEEE80211_DUR_DS_SIFS + IEEE80211_DUR_DS_SLOT)
                    588: #define IEEE80211_DUR_DS_DIFS  (IEEE80211_DUR_DS_SIFS + \
                    589:                                 2 * IEEE80211_DUR_DS_SLOT)
                    590: #define IEEE80211_DUR_DS_EIFS  (IEEE80211_DUR_DS_SIFS + \
                    591:                                 IEEE80211_DUR_DS_SLOW_ACK + \
                    592:                                 IEEE80211_DUR_DS_LONG_PREAMBLE + \
                    593:                                 IEEE80211_DUR_DS_SLOW_PLCPHDR + \
                    594:                                 IEEE80211_DUR_DIFS)
                    595:
                    596: enum {
                    597:        IEEE80211_AUTH_NONE     = 0,
                    598:        IEEE80211_AUTH_OPEN     = 1,            /* open */
                    599:        IEEE80211_AUTH_SHARED   = 2,            /* shared-key */
                    600:        IEEE80211_AUTH_8021X    = 3,            /* 802.1x */
                    601:        IEEE80211_AUTH_AUTO     = 4,            /* auto-select/accept */
                    602:        IEEE80211_AUTH_WPA      = 5,            /* WPA w/ 802.1x */
                    603:        IEEE80211_AUTH_WPA_PSK  = 6,            /* WPA w/ preshared key */
                    604:        IEEE80211_AUTH_WPA2     = 7,            /* WPA2 w/ 802.1x */
                    605:        IEEE80211_AUTH_WPA2_PSK = 8             /* WPA2 w/ preshared key */
                    606: };
                    607:
                    608: /*
                    609:  * The RSNA key descriptor used by IEEE 802.11 does not use the IEEE 802.1X
                    610:  * key descriptor.  Instead, it uses the key descriptor described in 8.5.2.
                    611:  */
                    612: #define EAPOL_VERSION  1
                    613:
                    614: #define EAPOL_KEY_NONCE_LEN    32
                    615: #define EAPOL_KEY_IV_LEN       16
                    616: #define EAPOL_KEY_MIC_LEN      16
                    617:
                    618: struct ieee80211_eapol_key {
                    619:        u_int8_t        version;
                    620:        u_int8_t        type;
                    621: /* IEEE Std 802.1X-2004, 7.5.4 (only type EAPOL-Key is used here) */
                    622: #define EAP_PACKET     0
                    623: #define EAPOL_START    1
                    624: #define EAPOL_LOGOFF   2
                    625: #define EAPOL_KEY      3
                    626: #define EAPOL_ASF_ALERT        4
                    627:
                    628:        u_int8_t        len[2];
                    629:        u_int8_t        desc;
                    630: /* IEEE Std 802.1X-2004, 7.6.1 */
                    631: #define EAPOL_KEY_DESC_RC4               1     /* deprecated */
                    632: #define EAPOL_KEY_DESC_IEEE80211         2
                    633: #define EAPOL_KEY_DESC_WPA1            254     /* non-standard WPA1 */
                    634:
                    635:        u_int8_t        info[2];
                    636: #define EAPOL_KEY_VERSION_MASK 0x7
                    637: #define EAPOL_KEY_DESC_V1      1
                    638: #define EAPOL_KEY_DESC_V2      2
                    639: #define EAPOL_KEY_PAIRWISE     (1 <<  3)
                    640: #define EAPOL_KEY_INSTALL      (1 <<  6)       /* I */
                    641: #define EAPOL_KEY_KEYACK       (1 <<  7)       /* A */
                    642: #define EAPOL_KEY_KEYMIC       (1 <<  8)       /* M */
                    643: #define EAPOL_KEY_SECURE       (1 <<  9)       /* S */
                    644: #define EAPOL_KEY_ERROR                (1 << 10)
                    645: #define EAPOL_KEY_REQUEST      (1 << 11)
                    646: #define EAPOL_KEY_ENCRYPTED    (1 << 12)
                    647: #define EAPOL_KEY_SMK          (1 << 13)
                    648: /* WPA1 compatibility */
                    649: #define EAPOL_KEY_WPA_KID_MASK 0x3
                    650: #define EAPOL_KEY_WPA_KID_SHIFT        4
                    651: #define EAPOL_KEY_WPA_TX       EAPOL_KEY_INSTALL
                    652:
                    653:        u_int8_t        keylen[2];
                    654:        u_int8_t        replaycnt[8];
                    655:        u_int8_t        nonce[EAPOL_KEY_NONCE_LEN];
                    656:        u_int8_t        iv[EAPOL_KEY_IV_LEN];
                    657:        u_int8_t        rsc[8];
                    658:        u_int8_t        reserved[8];
                    659:        u_int8_t        mic[EAPOL_KEY_MIC_LEN];
                    660:        u_int8_t        paylen[2];
                    661: } __packed;
                    662:
                    663: /* Pairwise Transient Key (see 8.5.1.2) */
                    664: struct ieee80211_ptk {
                    665:        u_int8_t        kck[16];        /* Key Confirmation Key */
                    666:        u_int8_t        kek[16];        /* Key Encryption Key */
                    667:        u_int8_t        tk[32];         /* Temporal Key */
                    668: } __packed;
                    669:
                    670: #define IEEE80211_PMKID_LEN    16
                    671: #define IEEE80211_SMKID_LEN    16
                    672:
                    673: /*
                    674:  * Key Data Encapsulation (see Table 62).
                    675:  */
                    676: enum {
                    677:        IEEE80211_KDE_GTK       = 1,
                    678:        IEEE80211_KDE_MACADDR   = 3,
                    679:        IEEE80211_KDE_PMKID     = 4,
                    680:        IEEE80211_KDE_SMK       = 5,
                    681:        IEEE80211_KDE_NONCE     = 6,
                    682:        IEEE80211_KDE_LIFETIME  = 7,
                    683:        IEEE80211_KDE_ERROR     = 8
                    684: };
                    685:
                    686: #endif /* _NET80211_IEEE80211_H_ */

CVSweb