1*5113495bSYour Name /* 2*5113495bSYour Name * Copyright (c) 2011,2014-2020 The Linux Foundation. All rights reserved. 3*5113495bSYour Name * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. 4*5113495bSYour Name * 5*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for 6*5113495bSYour Name * any purpose with or without fee is hereby granted, provided that the 7*5113495bSYour Name * above copyright notice and this permission notice appear in all 8*5113495bSYour Name * copies. 9*5113495bSYour Name * 10*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11*5113495bSYour Name * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12*5113495bSYour Name * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13*5113495bSYour Name * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14*5113495bSYour Name * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15*5113495bSYour Name * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16*5113495bSYour Name * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17*5113495bSYour Name * PERFORMANCE OF THIS SOFTWARE. 18*5113495bSYour Name */ 19*5113495bSYour Name 20*5113495bSYour Name #ifndef EXTERNAL_USE_ONLY 21*5113495bSYour Name #include "osdep.h" 22*5113495bSYour Name #endif /* EXTERNAL_USE_ONLY */ 23*5113495bSYour Name #include "cds_ieee80211_common_i.h" 24*5113495bSYour Name #include "cdp_txrx_mob_def.h" 25*5113495bSYour Name 26*5113495bSYour Name #ifndef CDS_COMMON_IEEE80211_H_ 27*5113495bSYour Name #define CDS_COMMON_IEEE80211_H_ 28*5113495bSYour Name 29*5113495bSYour Name /* 30*5113495bSYour Name * generic definitions for IEEE 802.11 frames 31*5113495bSYour Name */ 32*5113495bSYour Name struct ieee80211_frame { 33*5113495bSYour Name uint8_t i_fc[2]; 34*5113495bSYour Name uint8_t i_dur[2]; 35*5113495bSYour Name union { 36*5113495bSYour Name struct { 37*5113495bSYour Name uint8_t i_addr1[QDF_MAC_ADDR_SIZE]; 38*5113495bSYour Name uint8_t i_addr2[QDF_MAC_ADDR_SIZE]; 39*5113495bSYour Name uint8_t i_addr3[QDF_MAC_ADDR_SIZE]; 40*5113495bSYour Name }; 41*5113495bSYour Name uint8_t i_addr_all[3 * QDF_MAC_ADDR_SIZE]; 42*5113495bSYour Name }; 43*5113495bSYour Name uint8_t i_seq[2]; 44*5113495bSYour Name /* possibly followed by addr4[QDF_MAC_ADDR_SIZE]; */ 45*5113495bSYour Name /* see below */ 46*5113495bSYour Name } __packed; 47*5113495bSYour Name 48*5113495bSYour Name struct ieee80211_qosframe { 49*5113495bSYour Name uint8_t i_fc[2]; 50*5113495bSYour Name uint8_t i_dur[2]; 51*5113495bSYour Name uint8_t i_addr1[QDF_MAC_ADDR_SIZE]; 52*5113495bSYour Name uint8_t i_addr2[QDF_MAC_ADDR_SIZE]; 53*5113495bSYour Name uint8_t i_addr3[QDF_MAC_ADDR_SIZE]; 54*5113495bSYour Name uint8_t i_seq[2]; 55*5113495bSYour Name uint8_t i_qos[2]; 56*5113495bSYour Name /* possibly followed by addr4[QDF_MAC_ADDR_SIZE]; */ 57*5113495bSYour Name /* see below */ 58*5113495bSYour Name } __packed; 59*5113495bSYour Name 60*5113495bSYour Name struct ieee80211_frame_bar { 61*5113495bSYour Name uint8_t i_fc[2]; 62*5113495bSYour Name uint8_t i_dur[2]; 63*5113495bSYour Name uint8_t i_ra[QDF_MAC_ADDR_SIZE]; 64*5113495bSYour Name uint8_t i_ta[QDF_MAC_ADDR_SIZE]; 65*5113495bSYour Name uint16_t i_ctl; 66*5113495bSYour Name uint16_t i_seq; 67*5113495bSYour Name /* FCS */ 68*5113495bSYour Name } __packed; 69*5113495bSYour Name 70*5113495bSYour Name struct ieee80211_qoscntl { 71*5113495bSYour Name uint8_t i_qos[2]; 72*5113495bSYour Name }; 73*5113495bSYour Name 74*5113495bSYour Name struct ieee80211_frame_addr4 { 75*5113495bSYour Name uint8_t i_fc[2]; 76*5113495bSYour Name uint8_t i_dur[2]; 77*5113495bSYour Name uint8_t i_addr1[QDF_MAC_ADDR_SIZE]; 78*5113495bSYour Name uint8_t i_addr2[QDF_MAC_ADDR_SIZE]; 79*5113495bSYour Name uint8_t i_addr3[QDF_MAC_ADDR_SIZE]; 80*5113495bSYour Name uint8_t i_seq[2]; 81*5113495bSYour Name uint8_t i_addr4[QDF_MAC_ADDR_SIZE]; 82*5113495bSYour Name } __packed; 83*5113495bSYour Name 84*5113495bSYour Name struct ieee80211_qosframe_addr4 { 85*5113495bSYour Name uint8_t i_fc[2]; 86*5113495bSYour Name uint8_t i_dur[2]; 87*5113495bSYour Name uint8_t i_addr1[QDF_MAC_ADDR_SIZE]; 88*5113495bSYour Name uint8_t i_addr2[QDF_MAC_ADDR_SIZE]; 89*5113495bSYour Name uint8_t i_addr3[QDF_MAC_ADDR_SIZE]; 90*5113495bSYour Name uint8_t i_seq[2]; 91*5113495bSYour Name uint8_t i_addr4[QDF_MAC_ADDR_SIZE]; 92*5113495bSYour Name uint8_t i_qos[2]; 93*5113495bSYour Name } __packed; 94*5113495bSYour Name 95*5113495bSYour Name /* HTC frame for TxBF*/ 96*5113495bSYour Name /* for TxBF RC */ 97*5113495bSYour Name struct ieee80211_frame_min_one { 98*5113495bSYour Name uint8_t i_fc[2]; 99*5113495bSYour Name uint8_t i_dur[2]; 100*5113495bSYour Name uint8_t i_addr1[QDF_MAC_ADDR_SIZE]; 101*5113495bSYour Name } __packed; /* For TxBF RC */ 102*5113495bSYour Name 103*5113495bSYour Name struct ieee80211_qosframe_htc_addr4 { 104*5113495bSYour Name uint8_t i_fc[2]; 105*5113495bSYour Name uint8_t i_dur[2]; 106*5113495bSYour Name uint8_t i_addr1[QDF_MAC_ADDR_SIZE]; 107*5113495bSYour Name uint8_t i_addr2[QDF_MAC_ADDR_SIZE]; 108*5113495bSYour Name uint8_t i_addr3[QDF_MAC_ADDR_SIZE]; 109*5113495bSYour Name uint8_t i_seq[2]; 110*5113495bSYour Name uint8_t i_addr4[QDF_MAC_ADDR_SIZE]; 111*5113495bSYour Name uint8_t i_qos[2]; 112*5113495bSYour Name uint8_t i_htc[4]; 113*5113495bSYour Name } __packed; 114*5113495bSYour Name 115*5113495bSYour Name struct ieee80211_htc { 116*5113495bSYour Name uint8_t i_htc[4]; 117*5113495bSYour Name }; 118*5113495bSYour Name 119*5113495bSYour Name #define IEEE80211_FC0_VERSION_0 0x00 120*5113495bSYour Name #define IEEE80211_FC0_TYPE_MASK 0x0c 121*5113495bSYour Name #define IEEE80211_FC0_TYPE_MGT 0x00 122*5113495bSYour Name #define IEEE80211_FC0_TYPE_CTL 0x04 123*5113495bSYour Name #define IEEE80211_FC0_TYPE_DATA 0x08 124*5113495bSYour Name 125*5113495bSYour Name #define IEEE80211_FC0_SUBTYPE_MASK 0xf0 126*5113495bSYour Name #define IEEE80211_FC0_SUBTYPE_SHIFT 4 127*5113495bSYour Name 128*5113495bSYour Name #define IEEE80211_FC1_DIR_MASK 0x03 129*5113495bSYour Name #define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */ 130*5113495bSYour Name #define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */ 131*5113495bSYour Name #define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */ 132*5113495bSYour Name #define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */ 133*5113495bSYour Name 134*5113495bSYour Name #define IEEE80211_FC1_MORE_FRAG 0x04 135*5113495bSYour Name #define IEEE80211_FC1_RETRY 0x08 136*5113495bSYour Name #define IEEE80211_FC1_PWR_MGT 0x10 137*5113495bSYour Name #define IEEE80211_FC1_MORE_DATA 0x20 138*5113495bSYour Name #define IEEE80211_FC1_ORDER 0x80 139*5113495bSYour Name 140*5113495bSYour Name #define IEEE80211_SEQ_FRAG_MASK 0x000f 141*5113495bSYour Name #define IEEE80211_SEQ_FRAG_SHIFT 0 142*5113495bSYour Name #define IEEE80211_SEQ_SEQ_MASK 0xfff0 143*5113495bSYour Name #define IEEE80211_SEQ_SEQ_SHIFT 4 144*5113495bSYour Name #define IEEE80211_SEQ_MAX 4096 145*5113495bSYour Name 146*5113495bSYour Name #define IEEE80211_QOS_AMSDU 0x80 147*5113495bSYour Name #define IEEE80211_QOS_ACKPOLICY_S 5 148*5113495bSYour Name #define IEEE80211_QOS_TID 0x0f 149*5113495bSYour Name 150*5113495bSYour Name #define IEEE80211_IS_DATA(_frame) (((_frame)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) 151*5113495bSYour Name 152*5113495bSYour Name /* does frame have QoS sequence control data */ 153*5113495bSYour Name #define IEEE80211_QOS_HAS_SEQ(wh) \ 154*5113495bSYour Name (((wh)->i_fc[0] & \ 155*5113495bSYour Name (IEEE80211_FC0_TYPE_MASK | QDF_IEEE80211_FC0_SUBTYPE_QOS)) == \ 156*5113495bSYour Name (IEEE80211_FC0_TYPE_DATA | QDF_IEEE80211_FC0_SUBTYPE_QOS)) 157*5113495bSYour Name 158*5113495bSYour Name #define IEEE80211_HTCAP_MAXRXAMPDU_FACTOR 13 159*5113495bSYour Name 160*5113495bSYour Name struct ieee80211_channelswitch_ie { 161*5113495bSYour Name uint8_t ie; /* IEEE80211_ELEMID_CHANSWITCHANN */ 162*5113495bSYour Name uint8_t len; 163*5113495bSYour Name uint8_t switchmode; 164*5113495bSYour Name uint8_t newchannel; 165*5113495bSYour Name uint8_t tbttcount; 166*5113495bSYour Name } __packed; 167*5113495bSYour Name 168*5113495bSYour Name struct ieee80211_extendedchannelswitch_ie { 169*5113495bSYour Name uint8_t ie; /* IEEE80211_ELEMID_EXTCHANSWITCHANN */ 170*5113495bSYour Name uint8_t len; 171*5113495bSYour Name uint8_t switchmode; 172*5113495bSYour Name uint8_t newClass; 173*5113495bSYour Name uint8_t newchannel; 174*5113495bSYour Name uint8_t tbttcount; 175*5113495bSYour Name } __packed; 176*5113495bSYour Name 177*5113495bSYour Name /* 178*5113495bSYour Name * Reason codes 179*5113495bSYour Name * 180*5113495bSYour Name * Unlisted codes are reserved 181*5113495bSYour Name */ 182*5113495bSYour Name enum { 183*5113495bSYour Name IEEE80211_REASON_UNSPECIFIED = 1, 184*5113495bSYour Name IEEE80211_REASON_AUTH_EXPIRE = 2, 185*5113495bSYour Name IEEE80211_REASON_AUTH_LEAVE = 3, 186*5113495bSYour Name IEEE80211_REASON_ASSOC_EXPIRE = 4, 187*5113495bSYour Name IEEE80211_REASON_ASSOC_TOOMANY = 5, 188*5113495bSYour Name IEEE80211_REASON_NOT_AUTHED = 6, 189*5113495bSYour Name IEEE80211_REASON_NOT_ASSOCED = 7, 190*5113495bSYour Name IEEE80211_REASON_ASSOC_LEAVE = 8, 191*5113495bSYour Name IEEE80211_REASON_ASSOC_NOT_AUTHED = 9, 192*5113495bSYour Name 193*5113495bSYour Name IEEE80211_REASON_RSN_REQUIRED = 11, 194*5113495bSYour Name IEEE80211_REASON_RSN_INCONSISTENT = 12, 195*5113495bSYour Name IEEE80211_REASON_IE_INVALID = 13, 196*5113495bSYour Name IEEE80211_REASON_MIC_FAILURE = 14, 197*5113495bSYour Name 198*5113495bSYour Name IEEE80211_REASON_QOS = 32, 199*5113495bSYour Name IEEE80211_REASON_QOS_BANDWITDH = 33, 200*5113495bSYour Name IEEE80211_REASON_QOS_CH_CONDITIONS = 34, 201*5113495bSYour Name IEEE80211_REASON_QOS_TXOP = 35, 202*5113495bSYour Name IEEE80211_REASON_QOS_LEAVE = 36, 203*5113495bSYour Name IEEE80211_REASON_QOS_DECLINED = 37, 204*5113495bSYour Name IEEE80211_REASON_QOS_SETUP_REQUIRED = 38, 205*5113495bSYour Name IEEE80211_REASON_QOS_TIMEOUT = 39, 206*5113495bSYour Name IEEE80211_REASON_QOS_CIPHER = 45, 207*5113495bSYour Name 208*5113495bSYour Name IEEE80211_STATUS_SUCCESS = 0, 209*5113495bSYour Name IEEE80211_STATUS_UNSPECIFIED = 1, 210*5113495bSYour Name IEEE80211_STATUS_CAPINFO = 10, 211*5113495bSYour Name IEEE80211_STATUS_NOT_ASSOCED = 11, 212*5113495bSYour Name IEEE80211_STATUS_OTHER = 12, 213*5113495bSYour Name IEEE80211_STATUS_ALG = 13, 214*5113495bSYour Name IEEE80211_STATUS_SEQUENCE = 14, 215*5113495bSYour Name IEEE80211_STATUS_CHALLENGE = 15, 216*5113495bSYour Name IEEE80211_STATUS_TIMEOUT = 16, 217*5113495bSYour Name IEEE80211_STATUS_TOOMANY = 17, 218*5113495bSYour Name IEEE80211_STATUS_BASIC_RATE = 18, 219*5113495bSYour Name IEEE80211_STATUS_SP_REQUIRED = 19, 220*5113495bSYour Name IEEE80211_STATUS_PBCC_REQUIRED = 20, 221*5113495bSYour Name IEEE80211_STATUS_CA_REQUIRED = 21, 222*5113495bSYour Name IEEE80211_STATUS_TOO_MANY_STATIONS = 22, 223*5113495bSYour Name IEEE80211_STATUS_RATES = 23, 224*5113495bSYour Name IEEE80211_STATUS_SHORTSLOT_REQUIRED = 25, 225*5113495bSYour Name IEEE80211_STATUS_DSSSOFDM_REQUIRED = 26, 226*5113495bSYour Name IEEE80211_STATUS_NO_HT = 27, 227*5113495bSYour Name IEEE80211_STATUS_REJECT_TEMP = 30, 228*5113495bSYour Name IEEE80211_STATUS_MFP_VIOLATION = 31, 229*5113495bSYour Name IEEE80211_STATUS_REFUSED = 37, 230*5113495bSYour Name IEEE80211_STATUS_INVALID_PARAM = 38, 231*5113495bSYour Name 232*5113495bSYour Name IEEE80211_STATUS_DLS_NOT_ALLOWED = 48, 233*5113495bSYour Name }; 234*5113495bSYour Name 235*5113495bSYour Name #define IEEE80211_WEP_IVLEN 3 /* 24bit */ 236*5113495bSYour Name #define IEEE80211_WEP_KIDLEN 1 /* 1 octet */ 237*5113495bSYour Name #define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */ 238*5113495bSYour Name 239*5113495bSYour Name /* 240*5113495bSYour Name * 802.11i defines an extended IV for use with non-WEP ciphers. 241*5113495bSYour Name * When the EXTIV bit is set in the key id byte an additional 242*5113495bSYour Name * 4 bytes immediately follow the IV for TKIP. For CCMP the 243*5113495bSYour Name * EXTIV bit is likewise set but the 8 bytes represent the 244*5113495bSYour Name * CCMP header rather than IV+extended-IV. 245*5113495bSYour Name */ 246*5113495bSYour Name #define IEEE80211_WEP_EXTIV 0x20 247*5113495bSYour Name #define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */ 248*5113495bSYour Name #define IEEE80211_WEP_MICLEN 8 /* trailing MIC */ 249*5113495bSYour Name 250*5113495bSYour Name /* 251*5113495bSYour Name * 802.11w defines a MMIE chunk to be attached at the end of 252*5113495bSYour Name * any outgoing broadcast or multicast robust management frame. 253*5113495bSYour Name * MMIE field is total 18 bytes in size. Following the diagram of MMIE 254*5113495bSYour Name * 255*5113495bSYour Name * <------------ 18 Bytes MMIE -----------------------> 256*5113495bSYour Name * +--------+---------+---------+-----------+---------+ 257*5113495bSYour Name * |Element | Length | Key id | IPN | MIC | 258*5113495bSYour Name * | id | | | | | 259*5113495bSYour Name * +--------+---------+---------+-----------+---------+ 260*5113495bSYour Name * bytes 1 1 2 6 8 261*5113495bSYour Name * 262*5113495bSYour Name */ 263*5113495bSYour Name #define IEEE80211_MMIE_LEN 18 264*5113495bSYour Name #define IEEE80211_MMIE_IPNLEN 6 265*5113495bSYour Name #define IEEE80211_MMIE_MICLEN 8 266*5113495bSYour Name 267*5113495bSYour Name /* 268*5113495bSYour Name * 802.11ac Wide Bandwidth Channel Switch Element 269*5113495bSYour Name */ 270*5113495bSYour Name 271*5113495bSYour Name struct ieee80211_ie_wide_bw_switch { 272*5113495bSYour Name uint8_t elem_id; 273*5113495bSYour Name uint8_t elem_len; 274*5113495bSYour Name uint8_t new_ch_width; /* New channel width */ 275*5113495bSYour Name uint8_t new_ch_freq_seg1; /* Channel Center frequency 1 */ 276*5113495bSYour Name uint8_t new_ch_freq_seg2; /* Channel Center frequency 2 */ 277*5113495bSYour Name } __packed; 278*5113495bSYour Name 279*5113495bSYour Name #endif /* CDS_COMMON_IEEE80211_H_ */ 280