1 /*
2 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 /*
19 * DOC: contains MLO manager containing util public api's
20 */
21 #ifndef _WLAN_UTILS_MLO_H_
22 #define _WLAN_UTILS_MLO_H_
23
24 #include <wlan_cmn_ieee80211.h>
25 #include "wlan_mlo_mgr_public_structs.h"
26 #include <wlan_cm_ucfg_api.h>
27 #include <wlan_objmgr_vdev_obj.h>
28 #include <wlan_mlo_epcs.h>
29
30 #ifdef WLAN_FEATURE_11BE_MLO
31
32 #define MLO_LINKSPECIFIC_ASSOC_REQ_FC0 0x00
33 #define MLO_LINKSPECIFIC_ASSOC_REQ_FC1 0x00
34 #define MLO_LINKSPECIFIC_ASSOC_RESP_FC0 0x10
35 #define MLO_LINKSPECIFIC_ASSOC_RESP_FC1 0x00
36 #define MLO_LINKSPECIFIC_PROBE_RESP_FC0 0x50
37 #define MLO_LINKSPECIFIC_PROBE_RESP_FC1 0x00
38
39 /**
40 * util_gen_link_assoc_req() - Generate link specific assoc request
41 * @frame: Pointer to original association request. This should not contain the
42 * 802.11 header, and must start from the fixed fields in the association
43 * request. This is required due to some caller semantics built into the end to
44 * end design.
45 * @frame_len: Length of original association request
46 * @isreassoc: Whether this is a re-association request
47 * @link_id: Link ID for secondary links
48 * @link_addr: Secondary link's MAC address
49 * @link_frame: Generated secondary link specific association request. Note that
50 * this will start from the 802.11 header (unlike the original association
51 * request). This should be ignored in the case of failure.
52 * @link_frame_maxsize: Maximum size of generated secondary link specific
53 * association request
54 * @link_frame_len: Pointer to location where populated length of generated
55 * secondary link specific association request should be written. This should be
56 * ignored in the case of failure.
57 *
58 * Generate a link specific logically equivalent association request for the
59 * secondary link from the original association request containing a Multi-Link
60 * element. This applies to both association and re-association requests.
61 * Currently, only two link MLO is supported.
62 *
63 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
64 * the reason for error in the case of failure.
65 */
66 QDF_STATUS
67 util_gen_link_assoc_req(uint8_t *frame, qdf_size_t frame_len, bool isreassoc,
68 uint8_t link_id,
69 struct qdf_mac_addr link_addr,
70 uint8_t *link_frame,
71 qdf_size_t link_frame_maxsize,
72 qdf_size_t *link_frame_len);
73
74 /**
75 * util_gen_link_assoc_rsp() - Generate link specific assoc response
76 * @frame: Pointer to original association response. This should not contain the
77 * 802.11 header, and must start from the fixed fields in the association
78 * response. This is required due to some caller semantics built into the end to
79 * end design.
80 * @frame_len: Length of original association response
81 * @isreassoc: Whether this is a re-association response
82 * @link_id: Link ID for secondary links
83 * @link_addr: Secondary link's MAC address
84 * @link_frame: Generated secondary link specific association response. Note
85 * that this will start from the 802.11 header (unlike the original association
86 * response). This should be ignored in the case of failure.
87 * @link_frame_maxsize: Maximum size of generated secondary link specific
88 * association response
89 * @link_frame_len: Pointer to location where populated length of generated
90 * secondary link specific association response should be written. This should
91 * be ignored in the case of failure.
92 *
93 * Generate a link specific logically equivalent association response for the
94 * secondary link from the original association response containing a Multi-Link
95 * element. This applies to both association and re-association responses.
96 * Currently, only two link MLO is supported.
97 *
98 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
99 * the reason for error in the case of failure.
100 */
101 QDF_STATUS
102 util_gen_link_assoc_rsp(uint8_t *frame, qdf_size_t frame_len, bool isreassoc,
103 uint8_t link_id,
104 struct qdf_mac_addr link_addr,
105 uint8_t *link_frame,
106 qdf_size_t link_frame_maxsize,
107 qdf_size_t *link_frame_len);
108
109 /**
110 * util_gen_link_probe_rsp() - Generate link specific probe response
111 * @frame: Pointer to original probe response. This should not contain the
112 * 802.11 header, and must start from the fixed fields in the probe
113 * response. This is required due to some caller semantics built into the end to
114 * end design.
115 * @frame_len: Length of original probe response
116 * @link_addr: Secondary link's MAC address
117 * @link_id: Link ID for secondary links
118 * @link_frame: Generated secondary link specific probe response. Note
119 * that this will start from the 802.11 header (unlike the original probe
120 * response). This should be ignored in the case of failure.
121 * @link_frame_maxsize: Maximum size of generated secondary link specific
122 * probe response
123 * @link_frame_len: Pointer to location where populated length of generated
124 * secondary link specific probe response should be written. This should
125 * be ignored in the case of failure.
126 *
127 * Generate a link specific logically equivalent probe response for the
128 * secondary link from the original probe response containing a Multi-Link
129 * element. This applies to both probe responses.
130 * Currently, only two link MLO is supported.
131 *
132 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
133 * the reason for error in the case of failure.
134 */
135 QDF_STATUS
136 util_gen_link_probe_rsp(uint8_t *frame, qdf_size_t frame_len,
137 uint8_t link_id,
138 struct qdf_mac_addr link_addr,
139 uint8_t *link_frame,
140 qdf_size_t link_frame_maxsize,
141 qdf_size_t *link_frame_len);
142
143 /**
144 * util_find_mlie - Find the first Multi-Link element or the start of the first
145 * Multi-Link element fragment sequence in a given buffer containing elements,
146 * if a Multi-Link element or element fragment sequence exists in the given
147 * buffer.
148 *
149 * @buf: Buffer to be searched for the Multi-Link element or the start of the
150 * Multi-Link element fragment sequence
151 * @buflen: Length of the buffer
152 * @mlieseq: Pointer to location where the starting address of the Multi-Link
153 * element or Multi-Link element fragment sequence should be updated if found
154 * in the given buffer. The value NULL will be updated to this location if the
155 * element or element fragment sequence is not found. This should be ignored by
156 * the caller if the function returns error.
157 * @mlieseqlen: Pointer to location where the total length of the Multi-Link
158 * element or Multi-Link element fragment sequence should be updated if found
159 * in the given buffer. This should be ignored by the caller if the function
160 * returns error, or if the function indicates that the element or element
161 * fragment sequence was not found by providing a starting address of NULL.
162 *
163 * Find the first Multi-Link element or the start of the first Multi-Link
164 * element fragment sequence in a given buffer containing elements, if a
165 * Multi-Link element or element fragment sequence exists in the given buffer.
166 * The buffer should contain only 802.11 Information elements, and thus should
167 * not contain other information like 802.11 header, 802.11 frame body
168 * components like fields that are not elements (e.g. Capability Information
169 * field, Beacon Interval field), etc.
170 *
171 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
172 * the reason for error in the case of failure
173 */
174 QDF_STATUS
175 util_find_mlie(uint8_t *buf, qdf_size_t buflen, uint8_t **mlieseq,
176 qdf_size_t *mlieseqlen);
177
178 /**
179 * util_find_mlie_by_variant - Find the first Multi-Link element or the start of
180 * the first Multi-Link element fragment sequence in a given buffer containing
181 * elements based on variant, if a Multi-Link element or element fragment
182 * sequence exists in the given buffer.
183 *
184 * @buf: Buffer to be searched for the Multi-Link element or the start of the
185 * Multi-Link element fragment sequence
186 * @buflen: Length of the buffer
187 * @mlieseq: Based on the variant, pointer to location where the starting
188 * address of the Multi-Link element or Multi-Link element fragment sequence
189 * should be updated if found in the given buffer. The value NULL will be
190 * updated to this location if the element or element fragment sequence is not
191 * found. This should be ignored by the caller if the function returns error.
192 * @mlieseqlen: Pointer to location where the total length of the Multi-Link
193 * element or Multi-Link element fragment sequence should be updated if found
194 * in the given buffer. This should be ignored by the caller if the function
195 * returns error, or if the function indicates that the element or element
196 * fragment sequence was not found by providing a starting address of NULL.
197 * @variant: Multi-Link element variant. The value should be interpreted by the
198 * caller as a member of enum wlan_ml_variant. (This enum is not directly used
199 * as an argument, so that non-MLO code that happens to call this function does
200 * not need to be aware of the definition of the enum, though such a call would
201 * ultimately result in an error).
202 *
203 * Based on variant, find the Multi-Link element or the start of the Multi-Link
204 * element fragment sequence in a given buffer containing elements, if a
205 * Multi-Link element or element fragment sequence exists in the given buffer.
206 * The buffer should contain only 802.11 Information elements, and thus should
207 * not contain other information like 802.11 header, 802.11 frame body
208 * components like fields that are not elements (e.g. Capability Information
209 * field, Beacon Interval field), etc.
210 *
211 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
212 * the reason for error in the case of failure
213 */
214 QDF_STATUS
215 util_find_mlie_by_variant(uint8_t *buf, qdf_size_t buflen, uint8_t **mlieseq,
216 qdf_size_t *mlieseqlen, int variant);
217
218 /**
219 * util_get_mlie_variant() - Get ML IE variant
220 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
221 * fragment sequence
222 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
223 * fragment sequence
224 * @variant: Pointer to the location where the value of the variant should be
225 * updated. On success, the value should be interpreted by the caller as a
226 * member of enum wlan_ml_variant. (This enum is not directly used as an
227 * argument, so that non-MLO code that happens to call this function does not
228 * need to be aware of the definition of the enum, though such a call would
229 * ultimately result in an error). The value should be ignored by the caller if
230 * the function returns error.
231 *
232 * Get the variant of the given Multi-Link element or element fragment sequence.
233 *
234 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
235 * the reason for error in the case of failure
236 */
237 QDF_STATUS
238 util_get_mlie_variant(uint8_t *mlieseq, qdf_size_t mlieseqlen,
239 int *variant);
240
241 /**
242 * util_get_bvmlie_mldmacaddr() - Get the MLD MAC address
243 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
244 * fragment sequence
245 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
246 * fragment sequence
247 * @mldmacaddr: Pointer to the location where the MLD MAC address should be
248 * updated. This should be ignored by the caller if the function returns error.
249 *
250 * Get the MLD MAC address from a given Basic variant Multi-Link element
251 * or element fragment sequence.
252 *
253 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
254 * the reason for error in the case of failure
255 */
256 QDF_STATUS
257 util_get_bvmlie_mldmacaddr(uint8_t *mlieseq, qdf_size_t mlieseqlen,
258 struct qdf_mac_addr *mldmacaddr);
259
260 /**
261 * util_get_bvmlie_eml_cap() - Get the EML capabilities
262 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
263 * fragment sequence
264 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
265 * fragment sequence
266 * @eml_cap_found: Pointer to the location where a boolean status should be
267 * updated indicating whether the EML cabalility was found or not. This should
268 * be ignored by the caller if the function returns error.
269 * @eml_cap: Pointer to the location where the EML capabilities should be
270 * updated. This should be ignored by the caller if the function indicates
271 * that the EML capability was not found.
272 *
273 * Get the EML capabilities from a given Basic variant Multi-Link element or
274 * element fragment sequence.
275 *
276 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
277 * the reason for error in the case of failure
278 */
279 QDF_STATUS
280 util_get_bvmlie_eml_cap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
281 bool *eml_cap_found,
282 uint16_t *eml_cap);
283
284 /**
285 * util_get_bvmlie_msd_cap() - Get the MSD capabilities for Basic variant
286 * MLO IE
287 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
288 * fragment sequence
289 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
290 * fragment sequence
291 * @msd_cap_found: Pointer to the location where a boolean status should be
292 * updated indicating whether the MSD cabalility was found or not. This should
293 * be ignored by the caller if the function returns error.
294 * @msd_cap: Pointer to the location where the MSD capabilities should be
295 * updated. This should be ignored by the caller if the function indicates
296 * that the MSD capability was not found.
297 *
298 * Get the MSD capabilities from a given Basic variant Multi-Link element or
299 * element fragment sequence.
300 *
301 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
302 * the reason for error in the case of failure
303 */
304 QDF_STATUS
305 util_get_bvmlie_msd_cap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
306 bool *msd_cap_found, uint16_t *msd_cap);
307 /**
308 * util_get_bvmlie_primary_linkid() - Get the link identifier
309 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
310 * fragment sequence
311 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
312 * fragment sequence
313 * @linkidfound: Pointer to the location where a boolean status should be
314 * updated indicating whether the link identifier was found or not. This should
315 * be ignored by the caller if the function returns error.
316 * @linkid: Pointer to the location where the value of the link identifier
317 * should be updated. This should be ignored by the caller if the function
318 * returns error, or if the function indicates that the link identifier was not
319 * found.
320 *
321 * Get the link identifier from a given Basic variant Multi-Link element or
322 * element fragment sequence, of the AP that transmits the Multi-Link
323 * element/element fragment sequence or the nontransmitted BSSID in the same
324 * multiple BSSID set as the AP that transmits the Multi-Link element/element
325 * fragment sequence and that is affiliated with the MLD that is described in
326 * the Multi-Link element.
327 *
328 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
329 * the reason for error in the case of failure
330 */
331 QDF_STATUS
332 util_get_bvmlie_primary_linkid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
333 bool *linkidfound, uint8_t *linkid);
334
335 /**
336 * util_get_mlie_common_info_len() - Get the MLD common info len
337 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
338 * fragment sequence
339 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
340 * fragment sequence
341 * @commoninfo_len: Pointer to the location where the value of the MLD common
342 * info len should be updated. This should be ignored by the caller if the
343 * function returns error.
344 *
345 * Get the MLD common info len from Multi-Link element transmitted by the AP.
346 *
347 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
348 * the reason for error in the case of failure
349 */
350 QDF_STATUS
351 util_get_mlie_common_info_len(uint8_t *mlieseq, qdf_size_t mlieseqlen,
352 uint8_t *commoninfo_len);
353
354 /**
355 * util_get_bvmlie_bssparamchangecnt() - Get the MLD BSS PARAM Change Count
356 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
357 * fragment sequence
358 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
359 * fragment sequence
360 * @bssparamchangecntfound: Pointer to the location where a boolean status
361 * should be updated indicating whether the MLD BSS PARAM Change Count was
362 * found or not. This should be ignored by the caller if the function
363 * returns error.
364 * @bssparamchangecnt: Pointer to the location where the value of the MLD BSS
365 * PARAM Change Count should be updated. This should be ignored by the caller
366 * if the function returns error, or if the function indicates that the MLD
367 * BSS PARAM Change Count was not found.
368 *
369 * Get the MLD BSS PARAM Change Count from Multi-Link element transmitted
370 * by the AP.
371 *
372 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
373 * the reason for error in the case of failure
374 */
375 QDF_STATUS
376 util_get_bvmlie_bssparamchangecnt(uint8_t *mlieseq, qdf_size_t mlieseqlen,
377 bool *bssparamchangecntfound,
378 uint8_t *bssparamchangecnt);
379
380 /**
381 * util_get_bvmlie_mldcap() - Get the MLD capabilities
382 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
383 * fragment sequence
384 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
385 * fragment sequence
386 * @mldcapfound: Pointer to the location where a boolean status should be
387 * updated indicating whether the MLD capabilities was found or not. This should
388 * be ignored by the caller if the function returns error.
389 * @mldcap: Pointer to the location where the value of the MLD capabilities
390 * should be updated. This should be ignored by the caller if the function
391 * returns error, or if the function indicates that the MLD capabilities was not
392 * found.
393 *
394 * Get the MLD capabilities from a given Basic variant Multi-Link element or
395 * element fragment sequence, of the AP that transmits the Multi-Link
396 * element/element fragment sequence or the nontransmitted BSSID in the same
397 * multiple BSSID set as the AP that transmits the Multi-Link element/element
398 * fragment sequence and that is affiliated with the MLD that is described in
399 * the Multi-Link element.
400 *
401 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
402 * the reason for error in the case of failure
403 */
404 QDF_STATUS
405 util_get_bvmlie_mldcap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
406 bool *mldcapfound, uint16_t *mldcap);
407 /**
408 * util_get_bvmlie_ext_mld_cap_op_info() - Get Ext MLD Capabilities and
409 * operation
410 * @mlie_seq: Starting address of the Multi-Link element or Multi-Link element
411 * fragment sequence
412 * @mlie_seqlen: Total length of the Multi-Link element or Multi-Link element
413 * fragment sequence
414 * @ext_mld_cap_found: Pointer to the location where a boolean status should be
415 * updated indicating whether the Ext MLD capabilities was found or not.
416 * This should be ignored by the caller if the function returns error.
417 * @ext_mld_cap: Pointer to the location where the value of the Ext MLD
418 * capabilities should be updated. This should be ignored by the caller if the
419 * function returns error, or if the function indicates that the MLD
420 * capabilities was not found.
421 *
422 * Get the Ext MLD capabilities from a given Basic variant Multi-Link element or
423 * element fragment sequence, of the AP that transmits the Multi-Link element/
424 * element fragment sequence or the non-transmitted BSSID in the same
425 * multiple BSSID set as the AP that transmits the Multi-Link element/element
426 * fragment sequence and that is affiliated with the MLD that is described in
427 * the Multi-Link element.
428 *
429 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
430 * the reason for error in the case of failure
431 */
432 QDF_STATUS
433 util_get_bvmlie_ext_mld_cap_op_info(uint8_t *mlie_seq, qdf_size_t mlie_seqlen,
434 bool *ext_mld_cap_found,
435 uint16_t *ext_mld_cap);
436
437 /**
438 * util_get_bvmlie_persta_partner_info() - Get per-STA partner link information
439 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
440 * fragment sequence
441 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
442 * fragment sequence
443 * @partner_info: Pointer to the location where the partner link information
444 * should be updated. This should be ignored by the caller if the function
445 * returns error. Note that success will be returned and the number of links in
446 * this structure will be reported as 0, if no Link Info is found, or no per-STA
447 * profile is found, or if none of the per-STA profiles includes a MAC address
448 * in the STA Info field (assuming no errors are encountered).
449 *
450 * Get partner link information and NSTR capability information in the
451 * per-STA profiles present in a Basic variant Multi-Link element.
452 * The partner link information is returned only for those per-STA profiles
453 * which have a MAC address in the STA Info field.
454 * The NSTR capability information is returned only for those per-STA profiles
455 * which are Complete per-STA profiles.
456 *
457 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
458 * the reason for error in the case of failure
459 */
460 QDF_STATUS
461 util_get_bvmlie_persta_partner_info(uint8_t *mlieseq,
462 qdf_size_t mlieseqlen,
463 struct mlo_partner_info *partner_info);
464
465 /**
466 * util_get_prvmlie_mldid - Get the MLD ID from a given Probe Request
467 * variant Multi-Link element , of the STA that transmits ML Probe Request
468 * with the Multi-Link element
469 *
470 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
471 * fragment sequence
472 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
473 * fragment sequence
474 * @mldidfound: Pointer to the location where a boolean status should be
475 * updated indicating whether the MLD ID was found or not. This should
476 * be ignored by the caller if the function returns error.
477 * @mldid: Pointer to the location where the value of the MLD ID
478 * should be updated. This should be ignored by the caller if the function
479 * returns error, or if the function indicates that the MLD ID was not
480 * found.
481 *
482 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
483 * the reason for error in the case of failure
484 */
485 QDF_STATUS
486 util_get_prvmlie_mldid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
487 bool *mldidfound, uint8_t *mldid);
488
489 /**
490 * util_get_prvmlie_persta_link_id() - Get per-STA probe req link information
491 *
492 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
493 * fragment sequence
494 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
495 * fragment sequence
496 * @probereq_info: Pointer to the location where the probe req link information
497 * should be updated. This should be ignored by the caller if the function
498 * returns error. Note that success will be returned and the number of links in
499 * this structure will be reported as 0, if no Link Info is found, or no per-STA
500 * profile is found.
501 *
502 * Get probe req link information in the per-STA profiles present in a Probe req
503 * variant Multi-Link element.
504 *
505 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
506 * the reason for error in the case of failure
507 */
508 QDF_STATUS
509 util_get_prvmlie_persta_link_id(uint8_t *mlieseq,
510 qdf_size_t mlieseqlen,
511 struct mlo_probereq_info *probereq_info);
512
513 /**
514 * util_get_rvmlie_mldmacaddr() - Get the MLD MAC address from a given Reconfig
515 * variant Multi-Link element.
516 *
517 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
518 * fragment sequence
519 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
520 * fragment sequence
521 * @mldmacaddr: Pointer to the location where the MLD MAC address should be
522 * updated. This should be ignored by the caller if the function returns error.
523 * @is_mldmacaddr_found: mld address found or not
524 *
525 * Get the MLD MAC address from a given Reconfig variant Multi-Link element
526 * or element fragment sequence.
527 *
528 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
529 * the reason for error in the case of failure
530 */
531 QDF_STATUS
532 util_get_rvmlie_mldmacaddr(uint8_t *mlieseq, qdf_size_t mlieseqlen,
533 struct qdf_mac_addr *mldmacaddr,
534 bool *is_mldmacaddr_found);
535
536 /**
537 * util_get_rvmlie_persta_link_info() - Get per-STA reconfig link information
538 *
539 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
540 * fragment sequence
541 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
542 * fragment sequence
543 * @reconfig_info: Pointer to the location where the reconfig link information
544 * should be updated. This should be ignored by the caller if the function
545 * returns error. Note that success will be returned and the number of links in
546 * this structure will be reported as 0, if no Link Info is found, or no per-STA
547 * profile is found.
548 *
549 * Get reconfig link information in the per-STA profiles present in a Reconfig
550 * variant Multi-Link element.
551 *
552 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
553 * the reason for error in the case of failure.
554 */
555 QDF_STATUS
556 util_get_rvmlie_persta_link_info(uint8_t *mlieseq,
557 qdf_size_t mlieseqlen,
558 struct ml_rv_info *reconfig_info);
559
560 /**
561 * util_get_pav_mlie_link_info() - Get priority access link information
562 *
563 * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
564 * fragment sequence
565 * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
566 * fragment sequence
567 * @pa_info: Pointer to the location where the priority access multi link
568 * information is stored.
569 *
570 * Get EPCS priority access information from Priority Access Multi-Link element.
571 *
572 * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
573 * the reason for error in the case of failure.
574 */
575 QDF_STATUS util_get_pav_mlie_link_info(uint8_t *mlieseq,
576 qdf_size_t mlieseqlen,
577 struct ml_pa_info *pa_info);
578 #else
579 static inline QDF_STATUS
util_gen_link_assoc_req(uint8_t * frame,qdf_size_t frame_len,bool isreassoc,uint8_t link_id,struct qdf_mac_addr link_addr,uint8_t * link_frame,qdf_size_t link_frame_maxsize,qdf_size_t * link_frame_len)580 util_gen_link_assoc_req(uint8_t *frame, qdf_size_t frame_len, bool isreassoc,
581 uint8_t link_id,
582 struct qdf_mac_addr link_addr,
583 uint8_t *link_frame,
584 qdf_size_t link_frame_maxsize,
585 qdf_size_t *link_frame_len)
586 {
587 return QDF_STATUS_E_NOSUPPORT;
588 }
589
590 static inline QDF_STATUS
util_gen_link_assoc_rsp(uint8_t * frame,qdf_size_t frame_len,bool isreassoc,uint8_t link_id,struct qdf_mac_addr link_addr,uint8_t * link_frame,qdf_size_t link_frame_maxsize,qdf_size_t * link_frame_len)591 util_gen_link_assoc_rsp(uint8_t *frame, qdf_size_t frame_len, bool isreassoc,
592 uint8_t link_id,
593 struct qdf_mac_addr link_addr,
594 uint8_t *link_frame,
595 qdf_size_t link_frame_maxsize,
596 qdf_size_t *link_frame_len)
597 {
598 return QDF_STATUS_E_NOSUPPORT;
599 }
600
601 static inline QDF_STATUS
util_find_mlie(uint8_t * buf,qdf_size_t buflen,uint8_t ** mlieseq,qdf_size_t * mlieseqlen)602 util_find_mlie(uint8_t *buf, qdf_size_t buflen, uint8_t **mlieseq,
603 qdf_size_t *mlieseqlen)
604 {
605 return QDF_STATUS_E_NOSUPPORT;
606 }
607
608 static inline QDF_STATUS
util_find_mlie_by_variant(uint8_t * buf,qdf_size_t buflen,uint8_t ** mlieseq,qdf_size_t * mlieseqlen)609 util_find_mlie_by_variant(uint8_t *buf, qdf_size_t buflen, uint8_t **mlieseq,
610 qdf_size_t *mlieseqlen)
611 {
612 return QDF_STATUS_E_FAILURE;
613 }
614
615 static inline QDF_STATUS
util_get_mlie_variant(uint8_t * mlieseq,qdf_size_t mlieseqlen,int * variant)616 util_get_mlie_variant(uint8_t *mlieseq, qdf_size_t mlieseqlen,
617 int *variant)
618 {
619 return QDF_STATUS_E_NOSUPPORT;
620 }
621
622 static inline QDF_STATUS
util_get_mlie_common_info_len(uint8_t * mlieseq,qdf_size_t mlieseqlen,uint8_t * commoninfo_len)623 util_get_mlie_common_info_len(uint8_t *mlieseq, qdf_size_t mlieseqlen,
624 uint8_t *commoninfo_len)
625 {
626 return QDF_STATUS_E_NOSUPPORT;
627 }
628
629 static inline QDF_STATUS
util_get_bvmlie_bssparamchangecnt(uint8_t * mlieseq,qdf_size_t mlieseqlen,bool * bssparamchangecntfound,uint8_t * bssparamchangecnt)630 util_get_bvmlie_bssparamchangecnt(uint8_t *mlieseq, qdf_size_t mlieseqlen,
631 bool *bssparamchangecntfound,
632 uint8_t *bssparamchangecnt)
633 {
634 return QDF_STATUS_E_NOSUPPORT;
635 }
636
637 static inline QDF_STATUS
util_get_bvmlie_mldmacaddr(uint8_t * mlieseq,qdf_size_t mlieseqlen,struct qdf_mac_addr * mldmacaddr)638 util_get_bvmlie_mldmacaddr(uint8_t *mlieseq, qdf_size_t mlieseqlen,
639 struct qdf_mac_addr *mldmacaddr)
640 {
641 return QDF_STATUS_E_NOSUPPORT;
642 }
643
644 static inline QDF_STATUS
util_get_bvmlie_eml_cap(uint8_t * mlieseq,qdf_size_t mlieseqlen,bool * eml_cap_found,uint16_t * eml_cap)645 util_get_bvmlie_eml_cap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
646 bool *eml_cap_found,
647 uint16_t *eml_cap)
648 {
649 return QDF_STATUS_E_NOSUPPORT;
650 }
651
652 static inline QDF_STATUS
util_get_bvmlie_msd_cap(uint8_t * mlieseq,qdf_size_t mlieseqlen,bool * msd_cap_found,uint16_t * msd_cap)653 util_get_bvmlie_msd_cap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
654 bool *msd_cap_found,
655 uint16_t *msd_cap)
656 {
657 return QDF_STATUS_E_NOSUPPORT;
658 }
659
660 static inline QDF_STATUS
util_get_bvmlie_primary_linkid(uint8_t * mlieseq,qdf_size_t mlieseqlen,bool * linkidfound,uint8_t * linkid)661 util_get_bvmlie_primary_linkid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
662 bool *linkidfound, uint8_t *linkid)
663 {
664 return QDF_STATUS_E_NOSUPPORT;
665 }
666
667 static inline QDF_STATUS
util_get_bvmlie_persta_partner_info(uint8_t * mlieseq,qdf_size_t mlieseqlen,struct mlo_partner_info * partner_info)668 util_get_bvmlie_persta_partner_info(uint8_t *mlieseq,
669 qdf_size_t mlieseqlen,
670 struct mlo_partner_info *partner_info)
671 {
672 return QDF_STATUS_E_NOSUPPORT;
673 }
674
675 static inline QDF_STATUS
util_get_prvmlie_persta_link_id(uint8_t * mlieseq,qdf_size_t mlieseqlen,struct mlo_probereq_info * probereq_info)676 util_get_prvmlie_persta_link_id(uint8_t *mlieseq,
677 qdf_size_t mlieseqlen,
678 struct mlo_probereq_info *probereq_info)
679 {
680 return QDF_STATUS_E_NOSUPPORT;
681 }
682
683 static inline QDF_STATUS
util_get_prvmlie_mldid(uint8_t * mlieseq,qdf_size_t mlieseqlen,bool * mldcapfound,uint8_t * mldcap)684 util_get_prvmlie_mldid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
685 bool *mldcapfound, uint8_t *mldcap)
686 {
687 return QDF_STATUS_E_NOSUPPORT;
688 }
689
690 static inline QDF_STATUS
util_get_rvmlie_mldmacaddr(uint8_t * mlieseq,qdf_size_t mlieseqlen,struct qdf_mac_addr * mldmacaddr,bool * is_mldmacaddr_found)691 util_get_rvmlie_mldmacaddr(uint8_t *mlieseq, qdf_size_t mlieseqlen,
692 struct qdf_mac_addr *mldmacaddr,
693 bool *is_mldmacaddr_found)
694 {
695 return QDF_STATUS_E_NOSUPPORT;
696 }
697
698 static inline QDF_STATUS
util_get_rvmlie_persta_link_info(uint8_t * mlieseq,qdf_size_t mlieseqlen,struct ml_rv_info * reconfig_info)699 util_get_rvmlie_persta_link_info(uint8_t *mlieseq,
700 qdf_size_t mlieseqlen,
701 struct ml_rv_info *reconfig_info)
702 {
703 return QDF_STATUS_E_NOSUPPORT;
704 }
705
706 static inline
util_get_pav_mlie_link_info(uint8_t * mlieseq,qdf_size_t mlieseqlen,struct ml_pa_info * pa_info)707 QDF_STATUS util_get_pav_mlie_link_info(uint8_t *mlieseq,
708 qdf_size_t mlieseqlen,
709 struct ml_pa_info *pa_info)
710 {
711 return QDF_STATUS_E_NOSUPPORT;
712 }
713
714 #endif /* WLAN_FEATURE_11BE_MLO */
715 #endif /* _WLAN_UTILS_MLO_H_ */
716