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