Files
android_kernel_samsung_sm86…/umac/mlo_mgr/inc/utils_mlo.h
Gururaj Pandurangi 9fa8fc8b46 qcacmn: Add API to extract MSD caps from cmn info field
Add API to extract MLD AP MSD capabilities from MLO IE
common info field if present. This will be shared with FW
via peer assoc cmd.

Change-Id: I0ebcd5408a40f3314932d4a2a7e586c208af2ee5
CRs-Fixed: 3271118
2022-09-02 21:00:31 -07:00

529 строки
21 KiB
C

/*
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* DOC: contains MLO manager containing util public api's
*/
#ifndef _WLAN_UTILS_MLO_H_
#define _WLAN_UTILS_MLO_H_
#include <wlan_cmn_ieee80211.h>
#include "wlan_mlo_mgr_public_structs.h"
#include <wlan_cm_ucfg_api.h>
#include <wlan_objmgr_vdev_obj.h>
#ifdef WLAN_FEATURE_11BE_MLO
/**
* util_gen_link_assoc_req() - Generate link specific assoc request
* @frame: Pointer to original association request. This should not contain the
* 802.11 header, and must start from the fixed fields in the association
* request. This is required due to some caller semantics built into the end to
* end design.
* @frame_len: Length of original association request
* @isreassoc: Whether this is a re-association request
* @link_addr: Secondary link's MAC address
* @link_frame: Generated secondary link specific association request. Note that
* this will start from the 802.11 header (unlike the original association
* request). This should be ignored in the case of failure.
* @link_frame_maxsize: Maximum size of generated secondary link specific
* association request
* @link_frame_len: Pointer to location where populated length of generated
* secondary link specific association request should be written. This should be
* ignored in the case of failure.
*
* Generate a link specific logically equivalent association request for the
* secondary link from the original association request containing a Multi-Link
* element. This applies to both association and re-association requests.
* Currently, only two link MLO is supported.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure.
*/
QDF_STATUS
util_gen_link_assoc_req(uint8_t *frame, qdf_size_t frame_len, bool isreassoc,
struct qdf_mac_addr link_addr,
uint8_t *link_frame,
qdf_size_t link_frame_maxsize,
qdf_size_t *link_frame_len);
/**
* util_gen_link_assoc_rsp() - Generate link specific assoc response
* @frame: Pointer to original association response. This should not contain the
* 802.11 header, and must start from the fixed fields in the association
* response. This is required due to some caller semantics built into the end to
* end design.
* @frame_len: Length of original association response
* @isreassoc: Whether this is a re-association response
* @link_addr: Secondary link's MAC address
* @link_frame: Generated secondary link specific association response. Note
* that this will start from the 802.11 header (unlike the original association
* response). This should be ignored in the case of failure.
* @link_frame_maxsize: Maximum size of generated secondary link specific
* association response
* @link_frame_len: Pointer to location where populated length of generated
* secondary link specific association response should be written. This should
* be ignored in the case of failure.
*
* Generate a link specific logically equivalent association response for the
* secondary link from the original association response containing a Multi-Link
* element. This applies to both association and re-association responses.
* Currently, only two link MLO is supported.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure.
*/
QDF_STATUS
util_gen_link_assoc_rsp(uint8_t *frame, qdf_size_t frame_len, bool isreassoc,
struct qdf_mac_addr link_addr,
uint8_t *link_frame,
qdf_size_t link_frame_maxsize,
qdf_size_t *link_frame_len);
/**
* util_gen_link_probe_rsp() - Generate link specific probe response
* @frame: Pointer to original probe response. This should not contain the
* 802.11 header, and must start from the fixed fields in the probe
* response. This is required due to some caller semantics built into the end to
* end design.
* @frame_len: Length of original probe response
* @link_addr: Secondary link's MAC address
* @link_frame: Generated secondary link specific probe response. Note
* that this will start from the 802.11 header (unlike the original probe
* response). This should be ignored in the case of failure.
* @link_frame_maxsize: Maximum size of generated secondary link specific
* probe response
* @link_frame_len: Pointer to location where populated length of generated
* secondary link specific probe response should be written. This should
* be ignored in the case of failure.
*
* Generate a link specific logically equivalent probe response for the
* secondary link from the original probe response containing a Multi-Link
* element. This applies to both probe responses.
* Currently, only two link MLO is supported.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure.
*/
QDF_STATUS
util_gen_link_probe_rsp(uint8_t *frame, qdf_size_t frame_len,
struct qdf_mac_addr link_addr,
uint8_t *link_frame,
qdf_size_t link_frame_maxsize,
qdf_size_t *link_frame_len);
/**
* util_find_mlie - Find the first Multi-Link element or the start of the first
* Multi-Link element fragment sequence in a given buffer containing elements,
* if a Multi-Link element or element fragment sequence exists in the given
* buffer.
*
* @buf: Buffer to be searched for the Multi-Link element or the start of the
* Multi-Link element fragment sequence
* @buflen: Length of the buffer
* @mlieseq: Pointer to location where the starting address of the Multi-Link
* element or Multi-Link element fragment sequence should be updated if found
* in the given buffer. The value NULL will be updated to this location if the
* element or element fragment sequence is not found. This should be ignored by
* the caller if the function returns error.
* @mlieseqlen: Pointer to location where the total length of the Multi-Link
* element or Multi-Link element fragment sequence should be updated if found
* in the given buffer. This should be ignored by the caller if the function
* returns error, or if the function indicates that the element or element
* fragment sequence was not found by providing a starting address of NULL.
*
* Find the first Multi-Link element or the start of the first
* Multi-Link element fragment sequence in a given buffer containing elements,
* if a Multi-Link element or element fragment sequence exists in the given
* buffer.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_find_mlie(uint8_t *buf, qdf_size_t buflen, uint8_t **mlieseq,
qdf_size_t *mlieseqlen);
/**
* util_get_mlie_variant() - Get ML IE variant
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @variant: Pointer to the location where the value of the variant should be
* updated. On success, the value should be interpreted by the caller as a
* member of enum wlan_ml_variant. (This enum is not directly used as an
* argument, so that non-MLO code that happens to call this function does not
* need to be aware of the definition of the enum, though such a call would
* ultimately result in an error). The value should be ignored by the caller if
* the function returns error.
*
* Get the variant of the given Multi-Link element or element fragment sequence.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_mlie_variant(uint8_t *mlieseq, qdf_size_t mlieseqlen,
int *variant);
/**
* util_get_bvmlie_mldmacaddr() - Get the MLD MAC address
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @linkid: Pointer to the location where the MLD MAC address should be updated.
* This should be ignored by the caller if the function returns error.
*
* Get the MLD MAC address from a given Basic variant Multi-Link element
* or element fragment sequence.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_bvmlie_mldmacaddr(uint8_t *mlieseq, qdf_size_t mlieseqlen,
struct qdf_mac_addr *mldmacaddr);
/**
* util_get_bvmlie_eml_cap() - Get the EML capabilities
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @eml_cap_found: Pointer to the location where a boolean status should be
* updated indicating whether the EML cabalility was found or not. This should
* be ignored by the caller if the function returns error.
* @eml_cap: Pointer to the location where the EML capabilities should be
* updated. This should be ignored by the caller if the function indicates
* that the EML capability was not found.
*
* Get the EML capabilities from a given Basic variant Multi-Link element or
* element fragment sequence.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_bvmlie_eml_cap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *eml_cap_found,
uint16_t *eml_cap);
/**
* util_get_bvmlie_msd_cap() - Get the MSD capabilities for Basic variant
* MLO IE
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @msd_cap_found: Pointer to the location where a boolean status should be
* updated indicating whether the MSD cabalility was found or not. This should
* be ignored by the caller if the function returns error.
* @msd_cap: Pointer to the location where the MSD capabilities should be
* updated. This should be ignored by the caller if the function indicates
* that the MSD capability was not found.
*
* Get the MSD capabilities from a given Basic variant Multi-Link element or
* element fragment sequence.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_bvmlie_msd_cap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *msd_cap_found, uint16_t *msd_cap);
/**
* util_get_bvmlie_primary_linkid() - Get the link identifier
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @linkidfound: Pointer to the location where a boolean status should be
* updated indicating whether the link identifier was found or not. This should
* be ignored by the caller if the function returns error.
* @linkid: Pointer to the location where the value of the link identifier
* should be updated. This should be ignored by the caller if the function
* returns error, or if the function indicates that the link identifier was not
* found.
*
* Get the link identifier from a given Basic variant Multi-Link element or
* element fragment sequence, of the AP that transmits the Multi-Link
* element/element fragment sequence or the nontransmitted BSSID in the same
* multiple BSSID set as the AP that transmits the Multi-Link element/element
* fragment sequence and that is affiliated with the MLD that is described in
* the Multi-Link element.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_bvmlie_primary_linkid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *linkidfound, uint8_t *linkid);
/**
* util_get_mlie_common_info_len() - Get the MLD common info len
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @commoninfo_len: Pointer to the location where the value of the MLD common
* info len should be updated. This should be ignored by the caller if the
* function returns error.
*
* Get the MLD common info len from Multi-Link element transmitted by the AP.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_mlie_common_info_len(uint8_t *mlieseq, qdf_size_t mlieseqlen,
uint8_t *commoninfo_len);
/**
* util_get_bvmlie_bssparamchangecnt() - Get the MLD BSS PARAM Change Count
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @bssparamchangecntfound: Pointer to the location where a boolean status
* should be updated indicating whether the MLD BSS PARAM Change Count was
* found or not. This should be ignored by the caller if the function
* returns error.
* @bssparamchangecnt: Pointer to the location where the value of the MLD BSS
* PARAM Change Count should be updated. This should be ignored by the caller
* if the function returns error, or if the function indicates that the MLD
* BSS PARAM Change Count was not found.
*
* Get the MLD BSS PARAM Change Count from Multi-Link element transmitted
* by the AP.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_bvmlie_bssparamchangecnt(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *bssparamchangecntfound,
uint8_t *bssparamchangecnt);
/**
* util_get_bvmlie_mldcap() - Get the MLD capabilities
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @mldcapfound: Pointer to the location where a boolean status should be
* updated indicating whether the MLD capabilities was found or not. This should
* be ignored by the caller if the function returns error.
* @mldcap: Pointer to the location where the value of the MLD capabilities
* should be updated. This should be ignored by the caller if the function
* returns error, or if the function indicates that the MLD capabilities was not
* found.
*
* Get the MLD capabilities from a given Basic variant Multi-Link element or
* element fragment sequence, of the AP that transmits the Multi-Link
* element/element fragment sequence or the nontransmitted BSSID in the same
* multiple BSSID set as the AP that transmits the Multi-Link element/element
* fragment sequence and that is affiliated with the MLD that is described in
* the Multi-Link element.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_bvmlie_mldcap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *mldcapfound, uint16_t *mldcap);
/**
* util_get_bvmlie_persta_partner_info() - Get per-STA partner link information
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @partner_info: Pointer to the location where the partner link information
* should be updated. This should be ignored by the caller if the function
* returns error. Note that success will be returned and the number of links in
* this structure will be reported as 0, if no Link Info is found, or no per-STA
* profile is found, or if none of the per-STA profiles includes a MAC address
* in the STA Info field (assuming no errors are encountered).
*
* Get partner link information in the per-STA profiles present in a Basic
* variant Multi-Link element. The partner link information is returned only for
* those per-STA profiles which have a MAC address in the STA Info field.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_bvmlie_persta_partner_info(uint8_t *mlieseq,
qdf_size_t mlieseqlen,
struct mlo_partner_info *partner_info);
/**
* util_get_prvmlie_mldid - Get the MLD ID from a given Probe Request
* variant Multi-Link element , of the STA that transmits ML Probe Request
* with the Multi-Link element
*
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @mldidfound: Pointer to the location where a boolean status should be
* updated indicating whether the MLD ID was found or not. This should
* be ignored by the caller if the function returns error.
* @mldid: Pointer to the location where the value of the MLD ID
* should be updated. This should be ignored by the caller if the function
* returns error, or if the function indicates that the MLD ID was not
* found.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_prvmlie_mldid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *mldidfound, uint8_t *mldid);
/**
* util_get_prvmlie_persta_link_id() - Get per-STA probe req link information
*
* @mlieseq: Starting address of the Multi-Link element or Multi-Link element
* fragment sequence
* @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
* fragment sequence
* @probereq_info: Pointer to the location where the probe req link information
* should be updated. This should be ignored by the caller if the function
* returns error. Note that success will be returned and the number of links in
* this structure will be reported as 0, if no Link Info is found, or no per-STA
* profile is found.
*
* Get probe req link information in the per-STA profiles present in a Probe req
* variant Multi-Link element.
*
* Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
* the reason for error in the case of failure
*/
QDF_STATUS
util_get_prvmlie_persta_link_id(uint8_t *mlieseq,
qdf_size_t mlieseqlen,
struct mlo_probereq_info *probereq_info);
#else
static inline QDF_STATUS
util_gen_link_assoc_req(uint8_t *frame, qdf_size_t frame_len, bool isreassoc,
struct qdf_mac_addr link_addr,
uint8_t *link_frame,
qdf_size_t link_frame_maxsize,
qdf_size_t *link_frame_len)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_gen_link_assoc_rsp(uint8_t *frame, qdf_size_t frame_len, bool isreassoc,
struct qdf_mac_addr link_addr,
uint8_t *link_frame,
qdf_size_t link_frame_maxsize,
qdf_size_t *link_frame_len)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_find_mlie(uint8_t *buf, qdf_size_t buflen, uint8_t **mlieseq,
qdf_size_t *mlieseqlen)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_mlie_variant(uint8_t *mlieseq, qdf_size_t mlieseqlen,
int *variant)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_mlie_common_info_len(uint8_t *mlieseq, qdf_size_t mlieseqlen,
uint8_t *commoninfo_len)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_bvmlie_bssparamchangecnt(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *bssparamchangecntfound,
uint8_t *bssparamchangecnt)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_bvmlie_mldmacaddr(uint8_t *mlieseq, qdf_size_t mlieseqlen,
struct qdf_mac_addr *mldmacaddr)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_bvmlie_eml_cap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *eml_cap_found,
uint16_t *eml_cap)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_bvmlie_msd_cap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *msd_cap_found,
uint16_t *msd_cap)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_bvmlie_primary_linkid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *linkidfound, uint8_t *linkid)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_bvmlie_persta_partner_info(uint8_t *mlieseq,
qdf_size_t mlieseqlen,
struct mlo_partner_info *partner_info)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_prvmlie_persta_link_id(uint8_t *mlieseq,
qdf_size_t mlieseqlen,
struct mlo_probereq_info *probereq_info)
{
return QDF_STATUS_E_NOSUPPORT;
}
static inline QDF_STATUS
util_get_prvmlie_mldid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
bool *mldcapfound, uint8_t *mldcap)
{
return QDF_STATUS_E_NOSUPPORT;
}
#endif /* WLAN_FEATURE_11BE_MLO */
#endif /* _WLAN_UTILS_MLO_H_ */