linux/include/linux/ieee80211.h
<<
>>
Prefs
   1/*
   2 * IEEE 802.11 defines
   3 *
   4 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
   5 * <jkmaline@cc.hut.fi>
   6 * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
   7 * Copyright (c) 2005, Devicescape Software, Inc.
   8 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License version 2 as
  12 * published by the Free Software Foundation.
  13 */
  14
  15#ifndef IEEE80211_H
  16#define IEEE80211_H
  17
  18#include <linux/types.h>
  19#include <asm/byteorder.h>
  20
  21#define FCS_LEN 4
  22
  23#define IEEE80211_FCTL_VERS             0x0003
  24#define IEEE80211_FCTL_FTYPE            0x000c
  25#define IEEE80211_FCTL_STYPE            0x00f0
  26#define IEEE80211_FCTL_TODS             0x0100
  27#define IEEE80211_FCTL_FROMDS           0x0200
  28#define IEEE80211_FCTL_MOREFRAGS        0x0400
  29#define IEEE80211_FCTL_RETRY            0x0800
  30#define IEEE80211_FCTL_PM               0x1000
  31#define IEEE80211_FCTL_MOREDATA         0x2000
  32#define IEEE80211_FCTL_PROTECTED        0x4000
  33#define IEEE80211_FCTL_ORDER            0x8000
  34
  35#define IEEE80211_SCTL_FRAG             0x000F
  36#define IEEE80211_SCTL_SEQ              0xFFF0
  37
  38#define IEEE80211_FTYPE_MGMT            0x0000
  39#define IEEE80211_FTYPE_CTL             0x0004
  40#define IEEE80211_FTYPE_DATA            0x0008
  41
  42/* management */
  43#define IEEE80211_STYPE_ASSOC_REQ       0x0000
  44#define IEEE80211_STYPE_ASSOC_RESP      0x0010
  45#define IEEE80211_STYPE_REASSOC_REQ     0x0020
  46#define IEEE80211_STYPE_REASSOC_RESP    0x0030
  47#define IEEE80211_STYPE_PROBE_REQ       0x0040
  48#define IEEE80211_STYPE_PROBE_RESP      0x0050
  49#define IEEE80211_STYPE_BEACON          0x0080
  50#define IEEE80211_STYPE_ATIM            0x0090
  51#define IEEE80211_STYPE_DISASSOC        0x00A0
  52#define IEEE80211_STYPE_AUTH            0x00B0
  53#define IEEE80211_STYPE_DEAUTH          0x00C0
  54#define IEEE80211_STYPE_ACTION          0x00D0
  55
  56/* control */
  57#define IEEE80211_STYPE_PSPOLL          0x00A0
  58#define IEEE80211_STYPE_RTS             0x00B0
  59#define IEEE80211_STYPE_CTS             0x00C0
  60#define IEEE80211_STYPE_ACK             0x00D0
  61#define IEEE80211_STYPE_CFEND           0x00E0
  62#define IEEE80211_STYPE_CFENDACK        0x00F0
  63
  64/* data */
  65#define IEEE80211_STYPE_DATA                    0x0000
  66#define IEEE80211_STYPE_DATA_CFACK              0x0010
  67#define IEEE80211_STYPE_DATA_CFPOLL             0x0020
  68#define IEEE80211_STYPE_DATA_CFACKPOLL          0x0030
  69#define IEEE80211_STYPE_NULLFUNC                0x0040
  70#define IEEE80211_STYPE_CFACK                   0x0050
  71#define IEEE80211_STYPE_CFPOLL                  0x0060
  72#define IEEE80211_STYPE_CFACKPOLL               0x0070
  73#define IEEE80211_STYPE_QOS_DATA                0x0080
  74#define IEEE80211_STYPE_QOS_DATA_CFACK          0x0090
  75#define IEEE80211_STYPE_QOS_DATA_CFPOLL         0x00A0
  76#define IEEE80211_STYPE_QOS_DATA_CFACKPOLL      0x00B0
  77#define IEEE80211_STYPE_QOS_NULLFUNC            0x00C0
  78#define IEEE80211_STYPE_QOS_CFACK               0x00D0
  79#define IEEE80211_STYPE_QOS_CFPOLL              0x00E0
  80#define IEEE80211_STYPE_QOS_CFACKPOLL           0x00F0
  81
  82
  83/* miscellaneous IEEE 802.11 constants */
  84#define IEEE80211_MAX_FRAG_THRESHOLD    2346
  85#define IEEE80211_MAX_RTS_THRESHOLD     2347
  86#define IEEE80211_MAX_AID               2007
  87#define IEEE80211_MAX_TIM_LEN           251
  88#define IEEE80211_MAX_DATA_LEN          2304
  89/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
  90   6.2.1.1.2.
  91
  92   The figure in section 7.1.2 suggests a body size of up to 2312
  93   bytes is allowed, which is a bit confusing, I suspect this
  94   represents the 2304 bytes of real data, plus a possible 8 bytes of
  95   WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */
  96
  97#define IEEE80211_MAX_SSID_LEN          32
  98
  99struct ieee80211_hdr {
 100        __le16 frame_control;
 101        __le16 duration_id;
 102        u8 addr1[6];
 103        u8 addr2[6];
 104        u8 addr3[6];
 105        __le16 seq_ctrl;
 106        u8 addr4[6];
 107} __attribute__ ((packed));
 108
 109
 110struct ieee80211_mgmt {
 111        __le16 frame_control;
 112        __le16 duration;
 113        u8 da[6];
 114        u8 sa[6];
 115        u8 bssid[6];
 116        __le16 seq_ctrl;
 117        union {
 118                struct {
 119                        __le16 auth_alg;
 120                        __le16 auth_transaction;
 121                        __le16 status_code;
 122                        /* possibly followed by Challenge text */
 123                        u8 variable[0];
 124                } __attribute__ ((packed)) auth;
 125                struct {
 126                        __le16 reason_code;
 127                } __attribute__ ((packed)) deauth;
 128                struct {
 129                        __le16 capab_info;
 130                        __le16 listen_interval;
 131                        /* followed by SSID and Supported rates */
 132                        u8 variable[0];
 133                } __attribute__ ((packed)) assoc_req;
 134                struct {
 135                        __le16 capab_info;
 136                        __le16 status_code;
 137                        __le16 aid;
 138                        /* followed by Supported rates */
 139                        u8 variable[0];
 140                } __attribute__ ((packed)) assoc_resp, reassoc_resp;
 141                struct {
 142                        __le16 capab_info;
 143                        __le16 listen_interval;
 144                        u8 current_ap[6];
 145                        /* followed by SSID and Supported rates */
 146                        u8 variable[0];
 147                } __attribute__ ((packed)) reassoc_req;
 148                struct {
 149                        __le16 reason_code;
 150                } __attribute__ ((packed)) disassoc;
 151                struct {
 152                        __le64 timestamp;
 153                        __le16 beacon_int;
 154                        __le16 capab_info;
 155                        /* followed by some of SSID, Supported rates,
 156                         * FH Params, DS Params, CF Params, IBSS Params, TIM */
 157                        u8 variable[0];
 158                } __attribute__ ((packed)) beacon;
 159                struct {
 160                        /* only variable items: SSID, Supported rates */
 161                        u8 variable[0];
 162                } __attribute__ ((packed)) probe_req;
 163                struct {
 164                        __le64 timestamp;
 165                        __le16 beacon_int;
 166                        __le16 capab_info;
 167                        /* followed by some of SSID, Supported rates,
 168                         * FH Params, DS Params, CF Params, IBSS Params */
 169                        u8 variable[0];
 170                } __attribute__ ((packed)) probe_resp;
 171                struct {
 172                        u8 category;
 173                        union {
 174                                struct {
 175                                        u8 action_code;
 176                                        u8 dialog_token;
 177                                        u8 status_code;
 178                                        u8 variable[0];
 179                                } __attribute__ ((packed)) wme_action;
 180                                struct{
 181                                        u8 action_code;
 182                                        u8 element_id;
 183                                        u8 length;
 184                                        u8 switch_mode;
 185                                        u8 new_chan;
 186                                        u8 switch_count;
 187                                } __attribute__((packed)) chan_switch;
 188                        } u;
 189                } __attribute__ ((packed)) action;
 190        } u;
 191} __attribute__ ((packed));
 192
 193
 194/* Control frames */
 195struct ieee80211_rts {
 196        __le16 frame_control;
 197        __le16 duration;
 198        u8 ra[6];
 199        u8 ta[6];
 200} __attribute__ ((packed));
 201
 202struct ieee80211_cts {
 203        __le16 frame_control;
 204        __le16 duration;
 205        u8 ra[6];
 206} __attribute__ ((packed));
 207
 208
 209/* Authentication algorithms */
 210#define WLAN_AUTH_OPEN 0
 211#define WLAN_AUTH_SHARED_KEY 1
 212#define WLAN_AUTH_FAST_BSS_TRANSITION 2
 213#define WLAN_AUTH_LEAP 128
 214
 215#define WLAN_AUTH_CHALLENGE_LEN 128
 216
 217#define WLAN_CAPABILITY_ESS             (1<<0)
 218#define WLAN_CAPABILITY_IBSS            (1<<1)
 219#define WLAN_CAPABILITY_CF_POLLABLE     (1<<2)
 220#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
 221#define WLAN_CAPABILITY_PRIVACY         (1<<4)
 222#define WLAN_CAPABILITY_SHORT_PREAMBLE  (1<<5)
 223#define WLAN_CAPABILITY_PBCC            (1<<6)
 224#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
 225/* 802.11h */
 226#define WLAN_CAPABILITY_SPECTRUM_MGMT   (1<<8)
 227#define WLAN_CAPABILITY_QOS             (1<<9)
 228#define WLAN_CAPABILITY_SHORT_SLOT_TIME (1<<10)
 229#define WLAN_CAPABILITY_DSSS_OFDM       (1<<13)
 230
 231/* 802.11g ERP information element */
 232#define WLAN_ERP_NON_ERP_PRESENT (1<<0)
 233#define WLAN_ERP_USE_PROTECTION (1<<1)
 234#define WLAN_ERP_BARKER_PREAMBLE (1<<2)
 235
 236/* WLAN_ERP_BARKER_PREAMBLE values */
 237enum {
 238        WLAN_ERP_PREAMBLE_SHORT = 0,
 239        WLAN_ERP_PREAMBLE_LONG = 1,
 240};
 241
 242/* Status codes */
 243enum ieee80211_statuscode {
 244        WLAN_STATUS_SUCCESS = 0,
 245        WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
 246        WLAN_STATUS_CAPS_UNSUPPORTED = 10,
 247        WLAN_STATUS_REASSOC_NO_ASSOC = 11,
 248        WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
 249        WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
 250        WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
 251        WLAN_STATUS_CHALLENGE_FAIL = 15,
 252        WLAN_STATUS_AUTH_TIMEOUT = 16,
 253        WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
 254        WLAN_STATUS_ASSOC_DENIED_RATES = 18,
 255        /* 802.11b */
 256        WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
 257        WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
 258        WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
 259        /* 802.11h */
 260        WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
 261        WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
 262        WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
 263        /* 802.11g */
 264        WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
 265        WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
 266        /* 802.11i */
 267        WLAN_STATUS_INVALID_IE = 40,
 268        WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
 269        WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
 270        WLAN_STATUS_INVALID_AKMP = 43,
 271        WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
 272        WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
 273        WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
 274};
 275
 276
 277/* Reason codes */
 278enum ieee80211_reasoncode {
 279        WLAN_REASON_UNSPECIFIED = 1,
 280        WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
 281        WLAN_REASON_DEAUTH_LEAVING = 3,
 282        WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
 283        WLAN_REASON_DISASSOC_AP_BUSY = 5,
 284        WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
 285        WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
 286        WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
 287        WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
 288        /* 802.11h */
 289        WLAN_REASON_DISASSOC_BAD_POWER = 10,
 290        WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
 291        /* 802.11i */
 292        WLAN_REASON_INVALID_IE = 13,
 293        WLAN_REASON_MIC_FAILURE = 14,
 294        WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
 295        WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
 296        WLAN_REASON_IE_DIFFERENT = 17,
 297        WLAN_REASON_INVALID_GROUP_CIPHER = 18,
 298        WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
 299        WLAN_REASON_INVALID_AKMP = 20,
 300        WLAN_REASON_UNSUPP_RSN_VERSION = 21,
 301        WLAN_REASON_INVALID_RSN_IE_CAP = 22,
 302        WLAN_REASON_IEEE8021X_FAILED = 23,
 303        WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
 304};
 305
 306
 307/* Information Element IDs */
 308enum ieee80211_eid {
 309        WLAN_EID_SSID = 0,
 310        WLAN_EID_SUPP_RATES = 1,
 311        WLAN_EID_FH_PARAMS = 2,
 312        WLAN_EID_DS_PARAMS = 3,
 313        WLAN_EID_CF_PARAMS = 4,
 314        WLAN_EID_TIM = 5,
 315        WLAN_EID_IBSS_PARAMS = 6,
 316        WLAN_EID_CHALLENGE = 16,
 317        /* 802.11d */
 318        WLAN_EID_COUNTRY = 7,
 319        WLAN_EID_HP_PARAMS = 8,
 320        WLAN_EID_HP_TABLE = 9,
 321        WLAN_EID_REQUEST = 10,
 322        /* 802.11h */
 323        WLAN_EID_PWR_CONSTRAINT = 32,
 324        WLAN_EID_PWR_CAPABILITY = 33,
 325        WLAN_EID_TPC_REQUEST = 34,
 326        WLAN_EID_TPC_REPORT = 35,
 327        WLAN_EID_SUPPORTED_CHANNELS = 36,
 328        WLAN_EID_CHANNEL_SWITCH = 37,
 329        WLAN_EID_MEASURE_REQUEST = 38,
 330        WLAN_EID_MEASURE_REPORT = 39,
 331        WLAN_EID_QUIET = 40,
 332        WLAN_EID_IBSS_DFS = 41,
 333        /* 802.11g */
 334        WLAN_EID_ERP_INFO = 42,
 335        WLAN_EID_EXT_SUPP_RATES = 50,
 336        /* 802.11i */
 337        WLAN_EID_RSN = 48,
 338        WLAN_EID_WPA = 221,
 339        WLAN_EID_GENERIC = 221,
 340        WLAN_EID_VENDOR_SPECIFIC = 221,
 341        WLAN_EID_QOS_PARAMETER = 222
 342};
 343
 344/* cipher suite selectors */
 345#define WLAN_CIPHER_SUITE_USE_GROUP     0x000FAC00
 346#define WLAN_CIPHER_SUITE_WEP40         0x000FAC01
 347#define WLAN_CIPHER_SUITE_TKIP          0x000FAC02
 348/* reserved:                            0x000FAC03 */
 349#define WLAN_CIPHER_SUITE_CCMP          0x000FAC04
 350#define WLAN_CIPHER_SUITE_WEP104        0x000FAC05
 351
 352#define WLAN_MAX_KEY_LEN                32
 353
 354/**
 355 * ieee80211_get_SA - get pointer to SA
 356 *
 357 * Given an 802.11 frame, this function returns the offset
 358 * to the source address (SA). It does not verify that the
 359 * header is long enough to contain the address, and the
 360 * header must be long enough to contain the frame control
 361 * field.
 362 *
 363 * @hdr: the frame
 364 */
 365static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
 366{
 367        u8 *raw = (u8 *) hdr;
 368        u8 tofrom = (*(raw+1)) & 3; /* get the TODS and FROMDS bits */
 369
 370        switch (tofrom) {
 371                case 2:
 372                        return hdr->addr3;
 373                case 3:
 374                        return hdr->addr4;
 375        }
 376        return hdr->addr2;
 377}
 378
 379/**
 380 * ieee80211_get_DA - get pointer to DA
 381 *
 382 * Given an 802.11 frame, this function returns the offset
 383 * to the destination address (DA). It does not verify that
 384 * the header is long enough to contain the address, and the
 385 * header must be long enough to contain the frame control
 386 * field.
 387 *
 388 * @hdr: the frame
 389 */
 390static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
 391{
 392        u8 *raw = (u8 *) hdr;
 393        u8 to_ds = (*(raw+1)) & 1; /* get the TODS bit */
 394
 395        if (to_ds)
 396                return hdr->addr3;
 397        return hdr->addr1;
 398}
 399
 400/**
 401 * ieee80211_get_morefrag - determine whether the MOREFRAGS bit is set
 402 *
 403 * This function determines whether the "more fragments" bit is set
 404 * in the frame.
 405 *
 406 * @hdr: the frame
 407 */
 408static inline int ieee80211_get_morefrag(struct ieee80211_hdr *hdr)
 409{
 410        return (le16_to_cpu(hdr->frame_control) &
 411                IEEE80211_FCTL_MOREFRAGS) != 0;
 412}
 413
 414#endif /* IEEE80211_H */
 415