linux/drivers/staging/wlan-ng/p80211mgmt.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0 OR MPL-1.1) */
   2/* p80211mgmt.h
   3 *
   4 * Macros, types, and functions to handle 802.11 mgmt frames
   5 *
   6 * Copyright (C) 1999 AbsoluteValue Systems, Inc.  All Rights Reserved.
   7 * --------------------------------------------------------------------
   8 *
   9 * linux-wlan
  10 *
  11 *   The contents of this file are subject to the Mozilla Public
  12 *   License Version 1.1 (the "License"); you may not use this file
  13 *   except in compliance with the License. You may obtain a copy of
  14 *   the License at http://www.mozilla.org/MPL/
  15 *
  16 *   Software distributed under the License is distributed on an "AS
  17 *   IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  18 *   implied. See the License for the specific language governing
  19 *   rights and limitations under the License.
  20 *
  21 *   Alternatively, the contents of this file may be used under the
  22 *   terms of the GNU Public License version 2 (the "GPL"), in which
  23 *   case the provisions of the GPL are applicable instead of the
  24 *   above.  If you wish to allow the use of your version of this file
  25 *   only under the terms of the GPL and not to allow others to use
  26 *   your version of this file under the MPL, indicate your decision
  27 *   by deleting the provisions above and replace them with the notice
  28 *   and other provisions required by the GPL.  If you do not delete
  29 *   the provisions above, a recipient may use your version of this
  30 *   file under either the MPL or the GPL.
  31 *
  32 * --------------------------------------------------------------------
  33 *
  34 * Inquiries regarding the linux-wlan Open Source project can be
  35 * made directly to:
  36 *
  37 * AbsoluteValue Systems Inc.
  38 * info@linux-wlan.com
  39 * http://www.linux-wlan.com
  40 *
  41 * --------------------------------------------------------------------
  42 *
  43 * Portions of the development of this software were funded by
  44 * Intersil Corporation as part of PRISM(R) chipset product development.
  45 *
  46 * --------------------------------------------------------------------
  47 *
  48 * This file declares the constants and types used in the interface
  49 * between a wlan driver and the user mode utilities.
  50 *
  51 * Notes:
  52 *  - Constant values are always in HOST byte order.  To assign
  53 *    values to multi-byte fields they _must_ be converted to
  54 *    ieee byte order.  To retrieve multi-byte values from incoming
  55 *    frames, they must be converted to host order.
  56 *
  57 *  - The len member of the frame structure does NOT!!! include
  58 *    the MAC CRC.  Therefore, the len field on rx'd frames should
  59 *    have 4 subtracted from it.
  60 *
  61 * All functions declared here are implemented in p80211.c
  62 *
  63 * The types, macros, and functions defined here are primarily
  64 * used for encoding and decoding management frames.  They are
  65 * designed to follow these patterns of use:
  66 *
  67 * DECODE:
  68 * 1) a frame of length len is received into buffer b
  69 * 2) using the hdr structure and macros, we determine the type
  70 * 3) an appropriate mgmt frame structure, mf, is allocated and zeroed
  71 * 4) mf.hdr = b
  72 *    mf.buf = b
  73 *    mf.len = len
  74 * 5) call mgmt_decode( mf )
  75 * 6) the frame field pointers in mf are now set.  Note that any
  76 *    multi-byte frame field values accessed using the frame field
  77 *    pointers are in ieee byte order and will have to be converted
  78 *    to host order.
  79 *
  80 * ENCODE:
  81 * 1) Library client allocates buffer space for maximum length
  82 *    frame of the desired type
  83 * 2) Library client allocates a mgmt frame structure, called mf,
  84 *    of the desired type
  85 * 3) Set the following:
  86 *    mf.type = <desired type>
  87 *    mf.buf = <allocated buffer address>
  88 * 4) call mgmt_encode( mf )
  89 * 5) all of the fixed field pointers and fixed length information element
  90 *    pointers in mf are now set to their respective locations in the
  91 *    allocated space (fortunately, all variable length information elements
  92 *    fall at the end of their respective frames).
  93 * 5a) The length field is set to include the last of the fixed and fixed
  94 *     length fields.  It may have to be updated for optional or variable
  95 *      length information elements.
  96 * 6) Optional and variable length information elements are special cases
  97 *    and must be handled individually by the client code.
  98 * --------------------------------------------------------------------
  99 */
 100
 101#ifndef _P80211MGMT_H
 102#define _P80211MGMT_H
 103
 104#ifndef _P80211HDR_H
 105#include "p80211hdr.h"
 106#endif
 107
 108/*-- Information Element IDs --------------------*/
 109#define WLAN_EID_SSID           0
 110#define WLAN_EID_SUPP_RATES     1
 111#define WLAN_EID_FH_PARMS       2
 112#define WLAN_EID_DS_PARMS       3
 113#define WLAN_EID_CF_PARMS       4
 114#define WLAN_EID_TIM            5
 115#define WLAN_EID_IBSS_PARMS     6
 116/*-- values 7-15 reserved --*/
 117#define WLAN_EID_CHALLENGE      16
 118/*-- values 17-31 reserved for challenge text extension --*/
 119/*-- values 32-255 reserved --*/
 120
 121/*-- Reason Codes -------------------------------*/
 122#define WLAN_MGMT_REASON_RSVD                   0
 123#define WLAN_MGMT_REASON_UNSPEC                 1
 124#define WLAN_MGMT_REASON_PRIOR_AUTH_INVALID     2
 125#define WLAN_MGMT_REASON_DEAUTH_LEAVING         3
 126#define WLAN_MGMT_REASON_DISASSOC_INACTIVE      4
 127#define WLAN_MGMT_REASON_DISASSOC_AP_BUSY       5
 128#define WLAN_MGMT_REASON_CLASS2_NONAUTH         6
 129#define WLAN_MGMT_REASON_CLASS3_NONASSOC        7
 130#define WLAN_MGMT_REASON_DISASSOC_STA_HASLEFT   8
 131#define WLAN_MGMT_REASON_CANT_ASSOC_NONAUTH     9
 132
 133/*-- Status Codes -------------------------------*/
 134#define WLAN_MGMT_STATUS_SUCCESS                0
 135#define WLAN_MGMT_STATUS_UNSPEC_FAILURE         1
 136#define WLAN_MGMT_STATUS_CAPS_UNSUPPORTED       10
 137#define WLAN_MGMT_STATUS_REASSOC_NO_ASSOC       11
 138#define WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC    12
 139#define WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG    13
 140#define WLAN_MGMT_STATUS_RX_AUTH_NOSEQ          14
 141#define WLAN_MGMT_STATUS_CHALLENGE_FAIL         15
 142#define WLAN_MGMT_STATUS_AUTH_TIMEOUT           16
 143#define WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY      17
 144#define WLAN_MGMT_STATUS_ASSOC_DENIED_RATES     18
 145  /* p80211b additions */
 146#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOSHORT   19
 147#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOPBCC    20
 148#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOAGILITY 21
 149
 150/*-- Auth Algorithm Field ---------------------------*/
 151#define WLAN_AUTH_ALG_OPENSYSTEM                0
 152#define WLAN_AUTH_ALG_SHAREDKEY                 1
 153
 154/*-- Management Frame Field Offsets -------------*/
 155/* Note: Not all fields are listed because of variable lengths,   */
 156/*       see the code in p80211.c to see how we search for fields */
 157/* Note: These offsets are from the start of the frame data       */
 158
 159#define WLAN_BEACON_OFF_TS                      0
 160#define WLAN_BEACON_OFF_BCN_int                 8
 161#define WLAN_BEACON_OFF_CAPINFO                 10
 162#define WLAN_BEACON_OFF_SSID                    12
 163
 164#define WLAN_DISASSOC_OFF_REASON                0
 165
 166#define WLAN_ASSOCREQ_OFF_CAP_INFO              0
 167#define WLAN_ASSOCREQ_OFF_LISTEN_int            2
 168#define WLAN_ASSOCREQ_OFF_SSID                  4
 169
 170#define WLAN_ASSOCRESP_OFF_CAP_INFO             0
 171#define WLAN_ASSOCRESP_OFF_STATUS               2
 172#define WLAN_ASSOCRESP_OFF_AID                  4
 173#define WLAN_ASSOCRESP_OFF_SUPP_RATES           6
 174
 175#define WLAN_REASSOCREQ_OFF_CAP_INFO            0
 176#define WLAN_REASSOCREQ_OFF_LISTEN_int          2
 177#define WLAN_REASSOCREQ_OFF_CURR_AP             4
 178#define WLAN_REASSOCREQ_OFF_SSID                10
 179
 180#define WLAN_REASSOCRESP_OFF_CAP_INFO           0
 181#define WLAN_REASSOCRESP_OFF_STATUS             2
 182#define WLAN_REASSOCRESP_OFF_AID                4
 183#define WLAN_REASSOCRESP_OFF_SUPP_RATES         6
 184
 185#define WLAN_PROBEREQ_OFF_SSID                  0
 186
 187#define WLAN_PROBERESP_OFF_TS                   0
 188#define WLAN_PROBERESP_OFF_BCN_int              8
 189#define WLAN_PROBERESP_OFF_CAP_INFO             10
 190#define WLAN_PROBERESP_OFF_SSID                 12
 191
 192#define WLAN_AUTHEN_OFF_AUTH_ALG                0
 193#define WLAN_AUTHEN_OFF_AUTH_SEQ                2
 194#define WLAN_AUTHEN_OFF_STATUS                  4
 195#define WLAN_AUTHEN_OFF_CHALLENGE               6
 196
 197#define WLAN_DEAUTHEN_OFF_REASON                0
 198
 199/*-- Capability Field ---------------------------*/
 200#define WLAN_GET_MGMT_CAP_INFO_ESS(n)           ((n) & BIT(0))
 201#define WLAN_GET_MGMT_CAP_INFO_IBSS(n)          (((n) & BIT(1)) >> 1)
 202#define WLAN_GET_MGMT_CAP_INFO_CFPOLLABLE(n)    (((n) & BIT(2)) >> 2)
 203#define WLAN_GET_MGMT_CAP_INFO_CFPOLLREQ(n)     (((n) & BIT(3)) >> 3)
 204#define WLAN_GET_MGMT_CAP_INFO_PRIVACY(n)       (((n) & BIT(4)) >> 4)
 205  /* p80211b additions */
 206#define WLAN_GET_MGMT_CAP_INFO_SHORT(n)         (((n) & BIT(5)) >> 5)
 207#define WLAN_GET_MGMT_CAP_INFO_PBCC(n)          (((n) & BIT(6)) >> 6)
 208#define WLAN_GET_MGMT_CAP_INFO_AGILITY(n)       (((n) & BIT(7)) >> 7)
 209
 210#define WLAN_SET_MGMT_CAP_INFO_ESS(n)           (n)
 211#define WLAN_SET_MGMT_CAP_INFO_IBSS(n)          ((n) << 1)
 212#define WLAN_SET_MGMT_CAP_INFO_CFPOLLABLE(n)    ((n) << 2)
 213#define WLAN_SET_MGMT_CAP_INFO_CFPOLLREQ(n)     ((n) << 3)
 214#define WLAN_SET_MGMT_CAP_INFO_PRIVACY(n)       ((n) << 4)
 215  /* p80211b additions */
 216#define WLAN_SET_MGMT_CAP_INFO_SHORT(n)         ((n) << 5)
 217#define WLAN_SET_MGMT_CAP_INFO_PBCC(n)          ((n) << 6)
 218#define WLAN_SET_MGMT_CAP_INFO_AGILITY(n)       ((n) << 7)
 219
 220/*-- Information Element Types --------------------*/
 221/* prototype structure, all IEs start with these members */
 222
 223struct wlan_ie {
 224        u8 eid;
 225        u8 len;
 226} __packed;
 227
 228/*-- Service Set Identity (SSID)  -----------------*/
 229struct wlan_ie_ssid {
 230        u8 eid;
 231        u8 len;
 232        u8 ssid[1];             /* may be zero, ptrs may overlap */
 233} __packed;
 234
 235/*-- Supported Rates  -----------------------------*/
 236struct wlan_ie_supp_rates {
 237        u8 eid;
 238        u8 len;
 239        u8 rates[1];            /* had better be at LEAST one! */
 240} __packed;
 241
 242/*-- FH Parameter Set  ----------------------------*/
 243struct wlan_ie_fh_parms {
 244        u8 eid;
 245        u8 len;
 246        u16 dwell;
 247        u8 hopset;
 248        u8 hoppattern;
 249        u8 hopindex;
 250} __packed;
 251
 252/*-- DS Parameter Set  ----------------------------*/
 253struct wlan_ie_ds_parms {
 254        u8 eid;
 255        u8 len;
 256        u8 curr_ch;
 257} __packed;
 258
 259/*-- CF Parameter Set  ----------------------------*/
 260
 261struct wlan_ie_cf_parms {
 262        u8 eid;
 263        u8 len;
 264        u8 cfp_cnt;
 265        u8 cfp_period;
 266        u16 cfp_maxdur;
 267        u16 cfp_durremaining;
 268} __packed;
 269
 270/*-- TIM ------------------------------------------*/
 271struct wlan_ie_tim {
 272        u8 eid;
 273        u8 len;
 274        u8 dtim_cnt;
 275        u8 dtim_period;
 276        u8 bitmap_ctl;
 277        u8 virt_bm[1];
 278} __packed;
 279
 280/*-- IBSS Parameter Set ---------------------------*/
 281struct wlan_ie_ibss_parms {
 282        u8 eid;
 283        u8 len;
 284        u16 atim_win;
 285} __packed;
 286
 287/*-- Challenge Text  ------------------------------*/
 288struct wlan_ie_challenge {
 289        u8 eid;
 290        u8 len;
 291        u8 challenge[1];
 292} __packed;
 293
 294/*-------------------------------------------------*/
 295/*  Frame Types  */
 296
 297/* prototype structure, all mgmt frame types will start with these members */
 298struct wlan_fr_mgmt {
 299        u16 type;
 300        u16 len;                /* DOES NOT include CRC !!!! */
 301        u8 *buf;
 302        struct p80211_hdr *hdr;
 303        /* used for target specific data, skb in Linux */
 304        void *priv;
 305        /*-- fixed fields -----------*/
 306        /*-- info elements ----------*/
 307};
 308
 309/*-- Beacon ---------------------------------------*/
 310struct wlan_fr_beacon {
 311        u16 type;
 312        u16 len;
 313        u8 *buf;
 314        struct p80211_hdr *hdr;
 315        /* used for target specific data, skb in Linux */
 316        void *priv;
 317        /*-- fixed fields -----------*/
 318        u64 *ts;
 319        u16 *bcn_int;
 320        u16 *cap_info;
 321        /*-- info elements ----------*/
 322        struct wlan_ie_ssid *ssid;
 323        struct wlan_ie_supp_rates *supp_rates;
 324        struct wlan_ie_fh_parms *fh_parms;
 325        struct wlan_ie_ds_parms *ds_parms;
 326        struct wlan_ie_cf_parms *cf_parms;
 327        struct wlan_ie_ibss_parms *ibss_parms;
 328        struct wlan_ie_tim *tim;
 329
 330};
 331
 332/*-- IBSS ATIM ------------------------------------*/
 333struct wlan_fr_ibssatim {
 334        u16 type;
 335        u16 len;
 336        u8 *buf;
 337        struct p80211_hdr *hdr;
 338        /* used for target specific data, skb in Linux */
 339        void *priv;
 340
 341        /*-- fixed fields -----------*/
 342        /*-- info elements ----------*/
 343
 344        /* this frame type has a null body */
 345
 346};
 347
 348/*-- Disassociation -------------------------------*/
 349struct wlan_fr_disassoc {
 350        u16 type;
 351        u16 len;
 352        u8 *buf;
 353        struct p80211_hdr *hdr;
 354        /* used for target specific data, skb in Linux */
 355        void *priv;
 356        /*-- fixed fields -----------*/
 357        u16 *reason;
 358
 359        /*-- info elements ----------*/
 360
 361};
 362
 363/*-- Association Request --------------------------*/
 364struct wlan_fr_assocreq {
 365        u16 type;
 366        u16 len;
 367        u8 *buf;
 368        struct p80211_hdr *hdr;
 369        /* used for target specific data, skb in Linux */
 370        void *priv;
 371        /*-- fixed fields -----------*/
 372        u16 *cap_info;
 373        u16 *listen_int;
 374        /*-- info elements ----------*/
 375        struct wlan_ie_ssid *ssid;
 376        struct wlan_ie_supp_rates *supp_rates;
 377
 378};
 379
 380/*-- Association Response -------------------------*/
 381struct wlan_fr_assocresp {
 382        u16 type;
 383        u16 len;
 384        u8 *buf;
 385        struct p80211_hdr *hdr;
 386        /* used for target specific data, skb in Linux */
 387        void *priv;
 388        /*-- fixed fields -----------*/
 389        u16 *cap_info;
 390        u16 *status;
 391        u16 *aid;
 392        /*-- info elements ----------*/
 393        struct wlan_ie_supp_rates *supp_rates;
 394
 395};
 396
 397/*-- Reassociation Request ------------------------*/
 398struct wlan_fr_reassocreq {
 399        u16 type;
 400        u16 len;
 401        u8 *buf;
 402        struct p80211_hdr *hdr;
 403        /* used for target specific data, skb in Linux */
 404        void *priv;
 405        /*-- fixed fields -----------*/
 406        u16 *cap_info;
 407        u16 *listen_int;
 408        u8 *curr_ap;
 409        /*-- info elements ----------*/
 410        struct wlan_ie_ssid *ssid;
 411        struct wlan_ie_supp_rates *supp_rates;
 412
 413};
 414
 415/*-- Reassociation Response -----------------------*/
 416struct wlan_fr_reassocresp {
 417        u16 type;
 418        u16 len;
 419        u8 *buf;
 420        struct p80211_hdr *hdr;
 421        /* used for target specific data, skb in Linux */
 422        void *priv;
 423        /*-- fixed fields -----------*/
 424        u16 *cap_info;
 425        u16 *status;
 426        u16 *aid;
 427        /*-- info elements ----------*/
 428        struct wlan_ie_supp_rates *supp_rates;
 429
 430};
 431
 432/*-- Probe Request --------------------------------*/
 433struct wlan_fr_probereq {
 434        u16 type;
 435        u16 len;
 436        u8 *buf;
 437        struct p80211_hdr *hdr;
 438        /* used for target specific data, skb in Linux */
 439        void *priv;
 440        /*-- fixed fields -----------*/
 441        /*-- info elements ----------*/
 442        struct wlan_ie_ssid *ssid;
 443        struct wlan_ie_supp_rates *supp_rates;
 444
 445};
 446
 447/*-- Probe Response -------------------------------*/
 448struct wlan_fr_proberesp {
 449        u16 type;
 450        u16 len;
 451        u8 *buf;
 452        struct p80211_hdr *hdr;
 453        /* used for target specific data, skb in Linux */
 454        void *priv;
 455        /*-- fixed fields -----------*/
 456        u64 *ts;
 457        u16 *bcn_int;
 458        u16 *cap_info;
 459        /*-- info elements ----------*/
 460        struct wlan_ie_ssid *ssid;
 461        struct wlan_ie_supp_rates *supp_rates;
 462        struct wlan_ie_fh_parms *fh_parms;
 463        struct wlan_ie_ds_parms *ds_parms;
 464        struct wlan_ie_cf_parms *cf_parms;
 465        struct wlan_ie_ibss_parms *ibss_parms;
 466};
 467
 468/*-- Authentication -------------------------------*/
 469struct wlan_fr_authen {
 470        u16 type;
 471        u16 len;
 472        u8 *buf;
 473        struct p80211_hdr *hdr;
 474        /* used for target specific data, skb in Linux */
 475        void *priv;
 476        /*-- fixed fields -----------*/
 477        u16 *auth_alg;
 478        u16 *auth_seq;
 479        u16 *status;
 480        /*-- info elements ----------*/
 481        struct wlan_ie_challenge *challenge;
 482
 483};
 484
 485/*-- Deauthenication -----------------------------*/
 486struct wlan_fr_deauthen {
 487        u16 type;
 488        u16 len;
 489        u8 *buf;
 490        struct p80211_hdr *hdr;
 491        /* used for target specific data, skb in Linux */
 492        void *priv;
 493        /*-- fixed fields -----------*/
 494        u16 *reason;
 495
 496        /*-- info elements ----------*/
 497
 498};
 499
 500void wlan_mgmt_encode_beacon(struct wlan_fr_beacon *f);
 501void wlan_mgmt_decode_beacon(struct wlan_fr_beacon *f);
 502void wlan_mgmt_encode_disassoc(struct wlan_fr_disassoc *f);
 503void wlan_mgmt_decode_disassoc(struct wlan_fr_disassoc *f);
 504void wlan_mgmt_encode_assocreq(struct wlan_fr_assocreq *f);
 505void wlan_mgmt_decode_assocreq(struct wlan_fr_assocreq *f);
 506void wlan_mgmt_encode_assocresp(struct wlan_fr_assocresp *f);
 507void wlan_mgmt_decode_assocresp(struct wlan_fr_assocresp *f);
 508void wlan_mgmt_encode_reassocreq(struct wlan_fr_reassocreq *f);
 509void wlan_mgmt_decode_reassocreq(struct wlan_fr_reassocreq *f);
 510void wlan_mgmt_encode_reassocresp(struct wlan_fr_reassocresp *f);
 511void wlan_mgmt_decode_reassocresp(struct wlan_fr_reassocresp *f);
 512void wlan_mgmt_encode_probereq(struct wlan_fr_probereq *f);
 513void wlan_mgmt_decode_probereq(struct wlan_fr_probereq *f);
 514void wlan_mgmt_encode_proberesp(struct wlan_fr_proberesp *f);
 515void wlan_mgmt_decode_proberesp(struct wlan_fr_proberesp *f);
 516void wlan_mgmt_encode_authen(struct wlan_fr_authen *f);
 517void wlan_mgmt_decode_authen(struct wlan_fr_authen *f);
 518void wlan_mgmt_encode_deauthen(struct wlan_fr_deauthen *f);
 519void wlan_mgmt_decode_deauthen(struct wlan_fr_deauthen *f);
 520
 521#endif /* _P80211MGMT_H */
 522