Annotation of sys/net80211/ieee80211.h, Revision 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