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