1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2007 - 2017 Realtek Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as 7*4882a593Smuzhiyun * published by the Free Software Foundation. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT 10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*4882a593Smuzhiyun * more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun *****************************************************************************/ 15*4882a593Smuzhiyun #ifndef __IEEE80211_EXT_H 16*4882a593Smuzhiyun #define __IEEE80211_EXT_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include <drv_conf.h> 19*4882a593Smuzhiyun #include <osdep_service.h> 20*4882a593Smuzhiyun #include <drv_types.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define WMM_OUI_TYPE 2 23*4882a593Smuzhiyun #define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 24*4882a593Smuzhiyun #define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 25*4882a593Smuzhiyun #define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 26*4882a593Smuzhiyun #define WMM_VERSION 1 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define WPA_PROTO_WPA BIT(0) 29*4882a593Smuzhiyun #define WPA_PROTO_RSN BIT(1) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define WPA_KEY_MGMT_IEEE8021X BIT(0) 32*4882a593Smuzhiyun #define WPA_KEY_MGMT_PSK BIT(1) 33*4882a593Smuzhiyun #define WPA_KEY_MGMT_NONE BIT(2) 34*4882a593Smuzhiyun #define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3) 35*4882a593Smuzhiyun #define WPA_KEY_MGMT_WPA_NONE BIT(4) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define WPA_CAPABILITY_PREAUTH BIT(0) 39*4882a593Smuzhiyun #define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6) 40*4882a593Smuzhiyun #define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define PMKID_LEN 16 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #ifdef PLATFORM_LINUX 47*4882a593Smuzhiyun struct wpa_ie_hdr { 48*4882a593Smuzhiyun u8 elem_id; 49*4882a593Smuzhiyun u8 len; 50*4882a593Smuzhiyun u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ 51*4882a593Smuzhiyun u8 version[2]; /* little endian */ 52*4882a593Smuzhiyun } __attribute__((packed)); 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun struct rsn_ie_hdr { 55*4882a593Smuzhiyun u8 elem_id; /* WLAN_EID_RSN */ 56*4882a593Smuzhiyun u8 len; 57*4882a593Smuzhiyun u8 version[2]; /* little endian */ 58*4882a593Smuzhiyun } __attribute__((packed)); 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun struct wme_ac_parameter { 61*4882a593Smuzhiyun #if defined(CONFIG_LITTLE_ENDIAN) 62*4882a593Smuzhiyun /* byte 1 */ 63*4882a593Smuzhiyun u8 aifsn:4, 64*4882a593Smuzhiyun acm:1, 65*4882a593Smuzhiyun aci:2, 66*4882a593Smuzhiyun reserved:1; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* byte 2 */ 69*4882a593Smuzhiyun u8 eCWmin:4, 70*4882a593Smuzhiyun eCWmax:4; 71*4882a593Smuzhiyun #elif defined(CONFIG_BIG_ENDIAN) 72*4882a593Smuzhiyun /* byte 1 */ 73*4882a593Smuzhiyun u8 reserved:1, 74*4882a593Smuzhiyun aci:2, 75*4882a593Smuzhiyun acm:1, 76*4882a593Smuzhiyun aifsn:4; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* byte 2 */ 79*4882a593Smuzhiyun u8 eCWmax:4, 80*4882a593Smuzhiyun eCWmin:4; 81*4882a593Smuzhiyun #else 82*4882a593Smuzhiyun #error "Please fix <endian.h>" 83*4882a593Smuzhiyun #endif 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* bytes 3 & 4 */ 86*4882a593Smuzhiyun u16 txopLimit; 87*4882a593Smuzhiyun } __attribute__((packed)); 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct wme_parameter_element { 90*4882a593Smuzhiyun /* required fields for WME version 1 */ 91*4882a593Smuzhiyun u8 oui[3]; 92*4882a593Smuzhiyun u8 oui_type; 93*4882a593Smuzhiyun u8 oui_subtype; 94*4882a593Smuzhiyun u8 version; 95*4882a593Smuzhiyun u8 acInfo; 96*4882a593Smuzhiyun u8 reserved; 97*4882a593Smuzhiyun struct wme_ac_parameter ac[4]; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun } __attribute__((packed)); 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #endif 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #define WPA_PUT_LE16(a, val) \ 104*4882a593Smuzhiyun do { \ 105*4882a593Smuzhiyun (a)[1] = ((u16) (val)) >> 8; \ 106*4882a593Smuzhiyun (a)[0] = ((u16) (val)) & 0xff; \ 107*4882a593Smuzhiyun } while (0) 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun #define WPA_PUT_BE32(a, val) \ 110*4882a593Smuzhiyun do { \ 111*4882a593Smuzhiyun (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ 112*4882a593Smuzhiyun (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ 113*4882a593Smuzhiyun (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ 114*4882a593Smuzhiyun (a)[3] = (u8) (((u32) (val)) & 0xff); \ 115*4882a593Smuzhiyun } while (0) 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun #define WPA_PUT_LE32(a, val) \ 118*4882a593Smuzhiyun do { \ 119*4882a593Smuzhiyun (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ 120*4882a593Smuzhiyun (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ 121*4882a593Smuzhiyun (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ 122*4882a593Smuzhiyun (a)[0] = (u8) (((u32) (val)) & 0xff); \ 123*4882a593Smuzhiyun } while (0) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun #define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val)) 126*4882a593Smuzhiyun /* #define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val)) */ 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* Action category code */ 131*4882a593Smuzhiyun enum ieee80211_category { 132*4882a593Smuzhiyun WLAN_CATEGORY_SPECTRUM_MGMT = 0, 133*4882a593Smuzhiyun WLAN_CATEGORY_QOS = 1, 134*4882a593Smuzhiyun WLAN_CATEGORY_DLS = 2, 135*4882a593Smuzhiyun WLAN_CATEGORY_BACK = 3, 136*4882a593Smuzhiyun WLAN_CATEGORY_HT = 7, 137*4882a593Smuzhiyun WLAN_CATEGORY_WMM = 17, 138*4882a593Smuzhiyun }; 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /* SPECTRUM_MGMT action code */ 141*4882a593Smuzhiyun enum ieee80211_spectrum_mgmt_actioncode { 142*4882a593Smuzhiyun WLAN_ACTION_SPCT_MSR_REQ = 0, 143*4882a593Smuzhiyun WLAN_ACTION_SPCT_MSR_RPRT = 1, 144*4882a593Smuzhiyun WLAN_ACTION_SPCT_TPC_REQ = 2, 145*4882a593Smuzhiyun WLAN_ACTION_SPCT_TPC_RPRT = 3, 146*4882a593Smuzhiyun WLAN_ACTION_SPCT_CHL_SWITCH = 4, 147*4882a593Smuzhiyun WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* BACK action code */ 151*4882a593Smuzhiyun enum ieee80211_back_actioncode { 152*4882a593Smuzhiyun WLAN_ACTION_ADDBA_REQ = 0, 153*4882a593Smuzhiyun WLAN_ACTION_ADDBA_RESP = 1, 154*4882a593Smuzhiyun WLAN_ACTION_DELBA = 2, 155*4882a593Smuzhiyun }; 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* HT features action code */ 158*4882a593Smuzhiyun enum ieee80211_ht_actioncode { 159*4882a593Smuzhiyun WLAN_ACTION_NOTIFY_CH_WIDTH = 0, 160*4882a593Smuzhiyun WLAN_ACTION_SM_PS = 1, 161*4882a593Smuzhiyun WLAN_ACTION_PSPM = 2, 162*4882a593Smuzhiyun WLAN_ACTION_PCO_PHASE = 3, 163*4882a593Smuzhiyun WLAN_ACTION_MIMO_CSI_MX = 4, 164*4882a593Smuzhiyun WLAN_ACTION_MIMO_NONCP_BF = 5, 165*4882a593Smuzhiyun WLAN_ACTION_MIMP_CP_BF = 6, 166*4882a593Smuzhiyun WLAN_ACTION_ASEL_INDICATES_FB = 7, 167*4882a593Smuzhiyun WLAN_ACTION_HI_INFO_EXCHG = 8, 168*4882a593Smuzhiyun }; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* BACK (block-ack) parties */ 171*4882a593Smuzhiyun enum ieee80211_back_parties { 172*4882a593Smuzhiyun WLAN_BACK_RECIPIENT = 0, 173*4882a593Smuzhiyun WLAN_BACK_INITIATOR = 1, 174*4882a593Smuzhiyun WLAN_BACK_TIMER = 2, 175*4882a593Smuzhiyun }; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #ifdef PLATFORM_LINUX 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun struct ieee80211_mgmt { 180*4882a593Smuzhiyun u16 frame_control; 181*4882a593Smuzhiyun u16 duration; 182*4882a593Smuzhiyun u8 da[6]; 183*4882a593Smuzhiyun u8 sa[6]; 184*4882a593Smuzhiyun u8 bssid[6]; 185*4882a593Smuzhiyun u16 seq_ctrl; 186*4882a593Smuzhiyun union { 187*4882a593Smuzhiyun struct { 188*4882a593Smuzhiyun u16 auth_alg; 189*4882a593Smuzhiyun u16 auth_transaction; 190*4882a593Smuzhiyun u16 status_code; 191*4882a593Smuzhiyun /* possibly followed by Challenge text */ 192*4882a593Smuzhiyun u8 variable[0]; 193*4882a593Smuzhiyun } __attribute__((packed)) auth; 194*4882a593Smuzhiyun struct { 195*4882a593Smuzhiyun u16 reason_code; 196*4882a593Smuzhiyun } __attribute__((packed)) deauth; 197*4882a593Smuzhiyun struct { 198*4882a593Smuzhiyun u16 capab_info; 199*4882a593Smuzhiyun u16 listen_interval; 200*4882a593Smuzhiyun /* followed by SSID and Supported rates */ 201*4882a593Smuzhiyun u8 variable[0]; 202*4882a593Smuzhiyun } __attribute__((packed)) assoc_req; 203*4882a593Smuzhiyun struct { 204*4882a593Smuzhiyun u16 capab_info; 205*4882a593Smuzhiyun u16 status_code; 206*4882a593Smuzhiyun u16 aid; 207*4882a593Smuzhiyun /* followed by Supported rates */ 208*4882a593Smuzhiyun u8 variable[0]; 209*4882a593Smuzhiyun } __attribute__((packed)) assoc_resp, reassoc_resp; 210*4882a593Smuzhiyun struct { 211*4882a593Smuzhiyun u16 capab_info; 212*4882a593Smuzhiyun u16 listen_interval; 213*4882a593Smuzhiyun u8 current_ap[6]; 214*4882a593Smuzhiyun /* followed by SSID and Supported rates */ 215*4882a593Smuzhiyun u8 variable[0]; 216*4882a593Smuzhiyun } __attribute__((packed)) reassoc_req; 217*4882a593Smuzhiyun struct { 218*4882a593Smuzhiyun u16 reason_code; 219*4882a593Smuzhiyun } __attribute__((packed)) disassoc; 220*4882a593Smuzhiyun struct { 221*4882a593Smuzhiyun __le64 timestamp; 222*4882a593Smuzhiyun u16 beacon_int; 223*4882a593Smuzhiyun u16 capab_info; 224*4882a593Smuzhiyun /* followed by some of SSID, Supported rates, 225*4882a593Smuzhiyun * FH Params, DS Params, CF Params, IBSS Params, TIM */ 226*4882a593Smuzhiyun u8 variable[0]; 227*4882a593Smuzhiyun } __attribute__((packed)) beacon; 228*4882a593Smuzhiyun struct { 229*4882a593Smuzhiyun /* only variable items: SSID, Supported rates */ 230*4882a593Smuzhiyun u8 variable[0]; 231*4882a593Smuzhiyun } __attribute__((packed)) probe_req; 232*4882a593Smuzhiyun struct { 233*4882a593Smuzhiyun __le64 timestamp; 234*4882a593Smuzhiyun u16 beacon_int; 235*4882a593Smuzhiyun u16 capab_info; 236*4882a593Smuzhiyun /* followed by some of SSID, Supported rates, 237*4882a593Smuzhiyun * FH Params, DS Params, CF Params, IBSS Params */ 238*4882a593Smuzhiyun u8 variable[0]; 239*4882a593Smuzhiyun } __attribute__((packed)) probe_resp; 240*4882a593Smuzhiyun struct { 241*4882a593Smuzhiyun u8 category; 242*4882a593Smuzhiyun union { 243*4882a593Smuzhiyun struct { 244*4882a593Smuzhiyun u8 action_code; 245*4882a593Smuzhiyun u8 dialog_token; 246*4882a593Smuzhiyun u8 status_code; 247*4882a593Smuzhiyun u8 variable[0]; 248*4882a593Smuzhiyun } __attribute__((packed)) wme_action; 249*4882a593Smuzhiyun #if 0 250*4882a593Smuzhiyun struct { 251*4882a593Smuzhiyun u8 action_code; 252*4882a593Smuzhiyun u8 element_id; 253*4882a593Smuzhiyun u8 length; 254*4882a593Smuzhiyun struct ieee80211_channel_sw_ie sw_elem; 255*4882a593Smuzhiyun } __attribute__((packed)) chan_switch; 256*4882a593Smuzhiyun struct { 257*4882a593Smuzhiyun u8 action_code; 258*4882a593Smuzhiyun u8 dialog_token; 259*4882a593Smuzhiyun u8 element_id; 260*4882a593Smuzhiyun u8 length; 261*4882a593Smuzhiyun struct ieee80211_msrment_ie msr_elem; 262*4882a593Smuzhiyun } __attribute__((packed)) measurement; 263*4882a593Smuzhiyun #endif 264*4882a593Smuzhiyun struct { 265*4882a593Smuzhiyun u8 action_code; 266*4882a593Smuzhiyun u8 dialog_token; 267*4882a593Smuzhiyun u16 capab; 268*4882a593Smuzhiyun u16 timeout; 269*4882a593Smuzhiyun u16 start_seq_num; 270*4882a593Smuzhiyun } __attribute__((packed)) addba_req; 271*4882a593Smuzhiyun struct { 272*4882a593Smuzhiyun u8 action_code; 273*4882a593Smuzhiyun u8 dialog_token; 274*4882a593Smuzhiyun u16 status; 275*4882a593Smuzhiyun u16 capab; 276*4882a593Smuzhiyun u16 timeout; 277*4882a593Smuzhiyun } __attribute__((packed)) addba_resp; 278*4882a593Smuzhiyun struct { 279*4882a593Smuzhiyun u8 action_code; 280*4882a593Smuzhiyun u16 params; 281*4882a593Smuzhiyun u16 reason_code; 282*4882a593Smuzhiyun } __attribute__((packed)) delba; 283*4882a593Smuzhiyun struct { 284*4882a593Smuzhiyun u8 action_code; 285*4882a593Smuzhiyun /* capab_info for open and confirm, 286*4882a593Smuzhiyun * reason for close 287*4882a593Smuzhiyun */ 288*4882a593Smuzhiyun u16 aux; 289*4882a593Smuzhiyun /* Followed in plink_confirm by status 290*4882a593Smuzhiyun * code, AID and supported rates, 291*4882a593Smuzhiyun * and directly by supported rates in 292*4882a593Smuzhiyun * plink_open and plink_close 293*4882a593Smuzhiyun */ 294*4882a593Smuzhiyun u8 variable[0]; 295*4882a593Smuzhiyun } __attribute__((packed)) plink_action; 296*4882a593Smuzhiyun struct { 297*4882a593Smuzhiyun u8 action_code; 298*4882a593Smuzhiyun u8 variable[0]; 299*4882a593Smuzhiyun } __attribute__((packed)) mesh_action; 300*4882a593Smuzhiyun } __attribute__((packed)) u; 301*4882a593Smuzhiyun } __attribute__((packed)) action; 302*4882a593Smuzhiyun } __attribute__((packed)) u; 303*4882a593Smuzhiyun } __attribute__((packed)); 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun #endif 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun /* mgmt header + 1 byte category code */ 308*4882a593Smuzhiyun #define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun #endif 313