qcacmn: Use MLD address of BSS peer for PMKSA operations

If PMKID present in AP expires, AP rejects the PMKID based association.
Current design is to clear the cache using BSSID/MAC address of link
in such cases to let a fresh SAE authentication to happen.
But host driver stores PMKSA with MLD address for ML BSS.
Adapt to the same and update PMKSA cache clear APIs to use
MLD address instead of link address.

Introduce new API which return the legacy address for non-ML
association and MLD address for MLO association of the BSS peer.
Use this API to get the correct entry from PMKSA cache to delete.

Introduce new utility API to fetch the MLD address from scan entry.
Use this API to get the MLD address of the ML candidate.

Change-Id: Id35a3937ba6649e8ba7ae8f849ac1ed2a9cc83f8
CRs-Fixed: 3453839
This commit is contained in:
Vinod Kumar Pirla
2023-04-03 08:34:32 -07:00
کامیت شده توسط Madan Koyyalamudi
والد f5534874df
کامیت 7382a9f799
13فایلهای تغییر یافته به همراه375 افزوده شده و 31 حذف شده

مشاهده پرونده

@@ -2131,6 +2131,24 @@ wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
}
#endif
/**
* wlan_vdev_get_bss_peer_mac_for_pmksa() - To get bss peer mac/mld
* address based on association to cache/retrieve PMK.
* @vdev: Pointer to vdev
* @bss_peer_mac: Pointer to BSS peer MAC address.
*
* The PMKSA entry for an ML candaidate will be present with MLD
* address, whereas for non-ML candidate legacy MAC address is used
* to save the PMKSA. To get the right entry during lookup, this API
* will return MLD address if the VDEV is MLO VDEV else return
* MAC address of BSS peer.
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_vdev_get_bss_peer_mac_for_pmksa(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *bss_peer_mac);
/**
* wlan_vdev_get_bss_peer_mac() - to get bss peer mac address
* @vdev: pointer to vdev
@@ -2173,7 +2191,6 @@ static inline struct wlan_mlo_dev_context *wlan_vdev_get_mlo_dev_ctx(
{
return vdev->mlo_dev_ctx;
}
#endif
/**
* wlan_objmgr_vdev_set_ml_peer_count() - set ml_peer_count value
@@ -2182,7 +2199,6 @@ static inline struct wlan_mlo_dev_context *wlan_vdev_get_mlo_dev_ctx(
*
* Return: void
*/
#ifdef WLAN_FEATURE_11BE_MLO
static inline void
wlan_objmgr_vdev_set_ml_peer_count(struct wlan_objmgr_vdev *vdev,
uint16_t ml_peer_count)
@@ -2190,6 +2206,13 @@ wlan_objmgr_vdev_set_ml_peer_count(struct wlan_objmgr_vdev *vdev,
vdev->vdev_objmgr.wlan_ml_peer_count = ml_peer_count;
}
#else
static inline
QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mld_mac)
{
return QDF_STATUS_E_INVAL;
}
static inline void
wlan_objmgr_vdev_set_ml_peer_count(struct wlan_objmgr_vdev *vdev,
uint16_t ml_peer_count)

مشاهده پرونده

@@ -1422,6 +1422,16 @@ void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev)
}
}
QDF_STATUS
wlan_vdev_get_bss_peer_mac_for_pmksa(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *bss_peer_mac)
{
if (wlan_vdev_mlme_is_mlo_vdev(vdev))
return wlan_vdev_get_bss_peer_mld_mac(vdev, bss_peer_mac);
return wlan_vdev_get_bss_peer_mac(vdev, bss_peer_mac);
}
QDF_STATUS wlan_vdev_get_bss_peer_mac(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *bss_peer_mac)
{

مشاهده پرونده

@@ -1733,6 +1733,7 @@ static QDF_STATUS cm_get_valid_candidate(struct cnx_mgr *cm_ctx,
uint8_t vdev_id = wlan_vdev_get_id(cm_ctx->vdev);
bool use_same_candidate = false;
int32_t akm;
struct qdf_mac_addr *pmksa_mac;
psoc = wlan_vdev_get_psoc(cm_ctx->vdev);
if (!psoc) {
@@ -1858,9 +1859,19 @@ flush_single_pmk:
*/
if (prev_candidate && !use_same_candidate &&
util_scan_entry_single_pmk(psoc, prev_candidate->entry) &&
QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_SAE))
cm_delete_pmksa_for_single_pmk_bssid(cm_ctx,
&prev_candidate->entry->bssid);
QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_SAE)) {
pmksa_mac = &prev_candidate->entry->bssid;
cm_delete_pmksa_for_single_pmk_bssid(cm_ctx, pmksa_mac);
/* If the candidate is ML capable, the PMKSA entry might
* exist with it's MLD address, so check and purge the
* PMKSA entry with MLD address for ML candidate.
*/
pmksa_mac = (struct qdf_mac_addr *)
util_scan_entry_mldaddr(prev_candidate->entry);
if (pmksa_mac)
cm_delete_pmksa_for_single_pmk_bssid(cm_ctx, pmksa_mac);
}
if (same_candidate_used)
*same_candidate_used = use_same_candidate;
@@ -2680,6 +2691,7 @@ QDF_STATUS cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
QDF_STATUS qdf_status;
wlan_cm_id cm_id;
uint32_t prefix;
struct qdf_mac_addr pmksa_mac = QDF_MAC_ADDR_ZERO_INIT;
cm_ctx = cm_get_cm_ctx(vdev);
if (!cm_ctx)
@@ -2696,6 +2708,8 @@ QDF_STATUS cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
goto post_err;
}
cm_connect_rsp_get_mld_addr_or_bssid(resp, &pmksa_mac);
if (QDF_IS_STATUS_SUCCESS(resp->connect_status)) {
/*
* On successful connection to sae single pmk AP,
@@ -2703,7 +2717,7 @@ QDF_STATUS cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
*/
if (cm_is_cm_id_current_candidate_single_pmk(cm_ctx, cm_id))
wlan_crypto_selective_clear_sae_single_pmk_entries(vdev,
&resp->bssid);
&pmksa_mac);
qdf_status =
cm_sm_deliver_event(vdev,
WLAN_CM_SM_EV_CONNECT_SUCCESS,
@@ -2724,7 +2738,7 @@ QDF_STATUS cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
* the same stale PMKID. when connection is tried again with this AP.
*/
if (resp->status_code == STATUS_INVALID_PMKID)
cm_delete_pmksa_for_bssid(cm_ctx, &resp->bssid);
cm_delete_pmksa_for_bssid(cm_ctx, &pmksa_mac);
/* In case of failure try with next candidate */
qdf_status =
@@ -2739,7 +2753,7 @@ QDF_STATUS cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
* entry in case of post failure.
*/
if (cm_is_cm_id_current_candidate_single_pmk(cm_ctx, cm_id))
cm_delete_pmksa_for_single_pmk_bssid(cm_ctx, &resp->bssid);
cm_delete_pmksa_for_single_pmk_bssid(cm_ctx, &pmksa_mac);
post_err:
/*
* If there is a event posting error it means the SM state is not in

مشاهده پرونده

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 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
@@ -863,6 +863,7 @@ QDF_STATUS cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
wlan_cm_id cm_id;
uint32_t prefix;
enum wlan_cm_sm_evt event;
struct qdf_mac_addr pmksa_mac = QDF_MAC_ADDR_ZERO_INIT;
cm_ctx = cm_get_cm_ctx(vdev);
if (!cm_ctx)
@@ -880,6 +881,8 @@ QDF_STATUS cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
goto post_err;
}
cm_connect_rsp_get_mld_addr_or_bssid(resp, &pmksa_mac);
if (QDF_IS_STATUS_SUCCESS(resp->connect_status)) {
/*
* On successful connection to sae single pmk AP,
@@ -887,7 +890,7 @@ QDF_STATUS cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
*/
if (cm_is_cm_id_current_candidate_single_pmk(cm_ctx, cm_id))
wlan_crypto_selective_clear_sae_single_pmk_entries(
vdev, &resp->bssid);
vdev, &pmksa_mac);
event = WLAN_CM_SM_EV_REASSOC_DONE;
} else {
event = WLAN_CM_SM_EV_REASSOC_FAILURE;

مشاهده پرونده

@@ -1068,6 +1068,72 @@ cm_connect_handle_event_post_fail(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
struct cm_req *cm_get_req_by_scan_id(struct cnx_mgr *cm_ctx,
wlan_scan_id scan_id);
#ifdef WLAN_FEATURE_11BE_MLO
/**
* cm_connect_resp_fill_mld_addr_from_candidate() - API to fill MLD
* address in connect resp from scan entry.
* @vdev: VDEV objmgr pointer.
* @entry: Scan entry.
* @resp: connect response pointer.
*
* If the MLO VDEV flag is set, get the MLD address from the scan
* entry and fill in MLD address field in @resp.
*
* Return: void
*/
void
cm_connect_resp_fill_mld_addr_from_candidate(struct wlan_objmgr_vdev *vdev,
struct scan_cache_entry *entry,
struct wlan_cm_connect_resp *resp);
/**
* cm_connect_resp_fill_mld_addr_from_cm_id() - API to fill MLD address
* in connect resp from connect request ID.
* @vdev: VDEV objmgr pointer.
* @cm_id: connect request ID.
* @rsp: connect resp pointer.
*
* The API gets scan entry from the connect request using the connect request
* ID and fills MLD address from the scan entry into the connect response.
*
* Return: void
*/
void
cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev,
wlan_cm_id cm_id,
struct wlan_cm_connect_resp *rsp);
static inline void
cm_connect_rsp_get_mld_addr_or_bssid(struct wlan_cm_connect_resp *resp,
struct qdf_mac_addr *bssid)
{
if (!qdf_is_macaddr_zero(&resp->mld_addr))
qdf_copy_macaddr(bssid, &resp->mld_addr);
else
qdf_copy_macaddr(bssid, &resp->bssid);
}
#else
static inline void
cm_connect_resp_fill_mld_addr_from_candidate(struct wlan_objmgr_vdev *vdev,
struct scan_cache_entry *entry,
struct wlan_cm_connect_resp *resp)
{
}
static inline void
cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev,
wlan_cm_id cm_id,
struct wlan_cm_connect_resp *rsp)
{
}
static inline void
cm_connect_rsp_get_mld_addr_or_bssid(struct wlan_cm_connect_resp *resp,
struct qdf_mac_addr *bssid)
{
qdf_copy_macaddr(bssid, &resp->bssid);
}
#endif
/**
* cm_get_cm_id_by_scan_id() - Get cm id by matching the scan id
* @cm_ctx: connection manager context

مشاهده پرونده

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 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
@@ -149,6 +149,9 @@ cm_fill_bss_info_in_roam_rsp_by_cm_id(struct cnx_mgr *cm_ctx,
struct cm_req *cm_req;
uint32_t prefix = CM_ID_GET_PREFIX(cm_id);
struct wlan_cm_roam_req *req;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct scan_cache_node *candidate;
struct scan_cache_entry *entry;
if (prefix != ROAM_REQ_PREFIX)
return QDF_STATUS_E_INVAL;
@@ -159,25 +162,34 @@ cm_fill_bss_info_in_roam_rsp_by_cm_id(struct cnx_mgr *cm_ctx,
qdf_list_peek_next(&cm_ctx->req_list, cur_node, &next_node);
cm_req = qdf_container_of(cur_node, struct cm_req, node);
if (cm_req->cm_id == cm_id) {
req = &cm_req->roam_req.req;
resp->freq = req->chan_freq;
wlan_vdev_mlme_get_ssid(cm_ctx->vdev, resp->ssid.ssid,
&resp->ssid.length);
if (!qdf_is_macaddr_zero(&req->bssid))
qdf_copy_macaddr(&resp->bssid, &req->bssid);
cm_req_lock_release(cm_ctx);
return QDF_STATUS_SUCCESS;
if (cm_req->cm_id != cm_id) {
cur_node = next_node;
next_node = NULL;
continue;
}
cur_node = next_node;
next_node = NULL;
status = QDF_STATUS_SUCCESS;
req = &cm_req->roam_req.req;
resp->freq = req->chan_freq;
wlan_vdev_mlme_get_ssid(cm_ctx->vdev, resp->ssid.ssid,
&resp->ssid.length);
if (qdf_is_macaddr_zero(&req->bssid))
break;
candidate = cm_req->roam_req.cur_candidate;
qdf_copy_macaddr(&resp->bssid, &req->bssid);
if (candidate) {
entry = candidate->entry;
cm_connect_resp_fill_mld_addr_from_candidate(cm_ctx->vdev,
entry, resp);
}
break;
}
cm_req_lock_release(cm_ctx);
return QDF_STATUS_E_FAILURE;
return status;
}
bool cm_is_roam_enabled(struct wlan_objmgr_psoc *psoc)

مشاهده پرونده

@@ -439,8 +439,87 @@ struct cm_req *cm_get_req_by_cm_id_fl(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id,
return NULL;
}
#ifdef WLAN_FEATURE_11BE_MLO
void
cm_connect_resp_fill_mld_addr_from_candidate(struct wlan_objmgr_vdev *vdev,
struct scan_cache_entry *entry,
struct wlan_cm_connect_resp *resp)
{
struct qdf_mac_addr *mld_addr;
if (!entry || !vdev || !wlan_vdev_mlme_is_mlo_vdev(vdev))
return;
mld_addr = util_scan_entry_mldaddr(entry);
if (!mld_addr)
return;
qdf_copy_macaddr(&resp->mld_addr, mld_addr);
}
void
cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev,
wlan_cm_id cm_id,
struct wlan_cm_connect_resp *rsp)
{
struct cm_req *cm_req;
struct cnx_mgr *cm_ctx;
qdf_list_node_t *cur_node = NULL, *next_node = NULL;
struct scan_cache_entry *entry;
if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
return;
cm_ctx = cm_get_cm_ctx(vdev);
if (!cm_ctx)
return;
cm_req_lock_acquire(cm_ctx);
qdf_list_peek_front(&cm_ctx->req_list, &cur_node);
while (cur_node) {
qdf_list_peek_next(&cm_ctx->req_list, cur_node, &next_node);
cm_req = qdf_container_of(cur_node, struct cm_req, node);
if (cm_req->cm_id != cm_id) {
cur_node = next_node;
next_node = NULL;
continue;
}
if (!cm_req->connect_req.cur_candidate ||
!cm_req->connect_req.cur_candidate->entry)
break;
entry = cm_req->connect_req.cur_candidate->entry;
cm_connect_resp_fill_mld_addr_from_candidate(vdev, entry, rsp);
break;
}
cm_req_lock_release(cm_ctx);
}
static void
cm_connect_resp_fill_mld_addr_from_scan_db(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *bssid,
struct wlan_cm_connect_resp *resp)
{
if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
return;
wlan_scan_get_mld_addr_by_link_addr(wlan_vdev_get_pdev(vdev), bssid,
&resp->mld_addr);
}
#else
static inline void
cm_connect_resp_fill_mld_addr_from_scan_db(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *bssid,
struct wlan_cm_connect_resp *resp)
{
}
#endif
/**
* cm_fill_connect_resp_from_req() - Fill connect resp from connect request
* @vdev: VDEV objmgr pointer
* @resp: cm connect response
* @cm_req: cm request
*
@@ -449,7 +528,8 @@ struct cm_req *cm_get_req_by_cm_id_fl(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id,
* Return: void
*/
static void
cm_fill_connect_resp_from_req(struct wlan_cm_connect_resp *resp,
cm_fill_connect_resp_from_req(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_connect_resp *resp,
struct cm_req *cm_req)
{
struct scan_cache_node *candidate;
@@ -457,12 +537,20 @@ cm_fill_connect_resp_from_req(struct wlan_cm_connect_resp *resp,
req = &cm_req->connect_req.req;
candidate = cm_req->connect_req.cur_candidate;
if (candidate)
if (candidate) {
qdf_copy_macaddr(&resp->bssid, &candidate->entry->bssid);
else if (!qdf_is_macaddr_zero(&req->bssid))
cm_connect_resp_fill_mld_addr_from_candidate(vdev,
candidate->entry,
resp);
} else if (!qdf_is_macaddr_zero(&req->bssid)) {
qdf_copy_macaddr(&resp->bssid, &req->bssid);
else
cm_connect_resp_fill_mld_addr_from_scan_db(vdev, &req->bssid,
resp);
} else {
qdf_copy_macaddr(&resp->bssid, &req->bssid_hint);
cm_connect_resp_fill_mld_addr_from_scan_db(vdev, &req->bssid,
resp);
}
if (candidate)
resp->freq = candidate->entry->channel.chan_freq;
@@ -503,7 +591,7 @@ cm_handle_connect_flush(struct cnx_mgr *cm_ctx, struct cm_req *cm_req)
resp->reason = CM_ABORT_DUE_TO_NEW_REQ_RECVD;
/* Get bssid and ssid and freq for the cm id from the req list */
cm_fill_connect_resp_from_req(resp, cm_req);
cm_fill_connect_resp_from_req(cm_ctx->vdev, resp, cm_req);
cm_notify_connect_complete(cm_ctx, resp, 0);
qdf_mem_free(resp);
@@ -681,7 +769,8 @@ cm_fill_bss_info_in_connect_rsp_by_cm_id(struct cnx_mgr *cm_ctx,
cm_req = qdf_container_of(cur_node, struct cm_req, node);
if (cm_req->cm_id == cm_id) {
cm_fill_connect_resp_from_req(resp, cm_req);
cm_fill_connect_resp_from_req(cm_ctx->vdev,
resp, cm_req);
cm_req_lock_release(cm_ctx);
return QDF_STATUS_SUCCESS;
}

مشاهده پرونده

@@ -268,6 +268,51 @@ bool wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev *vdev)
}
#endif
/**
* wlan_cm_connect_resp_fill_mld_addr_from_cm_id() - API to get MLD of
* current candidate from connect request ID.
* @vdev: VDEV objmgr pointer.
* @cm_id: connect request ID.
* @rsp: connect resp pointer.
*
* This wrapper API fills MLD address in @rsp from connect request ID.
*
* Return: void
*/
void
wlan_cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev,
wlan_cm_id cm_id,
struct wlan_cm_connect_resp *rsp);
/**
* wlan_cm_connect_resp_fill_mld_addr_from_vdev_id() - API to get MLD
* from scan entry in join request.
* @psoc: PSOC objmgr pointer.
* @vdev_id: session ID.
* @entry: Scan entry of the candidate.
* @rsp: connect response pointer.
*
* This wrapper API gets VDEV from join request and fills MLD address
* in @rsp from the scan entry in join request.
*
* Return: void
*/
#ifdef WLAN_FEATURE_11BE_MLO
void
wlan_cm_connect_resp_fill_mld_addr_from_vdev_id(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct scan_cache_entry *entry,
struct wlan_cm_connect_resp *rsp);
#else
static inline void
wlan_cm_connect_resp_fill_mld_addr_from_vdev_id(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct scan_cache_entry *entry,
struct wlan_cm_connect_resp *rsp)
{
}
#endif
/**
* wlan_cm_get_active_connect_req() - Get copy of active connect request
* @vdev: vdev pointer

مشاهده پرونده

@@ -514,6 +514,7 @@ struct wlan_roam_sync_info {
* @connect_ies: connect related IE required by osif to send to kernel
* @roaming_info: roam sync info received
* @is_fils_connection: is fils connection
* @mld_addr: MLD address of the ML AP
* @ml_parnter_info: ml partner link info
*/
struct wlan_cm_connect_resp {
@@ -540,6 +541,7 @@ struct wlan_cm_connect_resp {
bool is_fils_connection;
#endif
#ifdef WLAN_FEATURE_11BE_MLO
struct qdf_mac_addr mld_addr;
struct mlo_partner_info ml_parnter_info;
#endif
};

مشاهده پرونده

@@ -378,6 +378,33 @@ struct reduced_neighbor_report *wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev,
return NULL;
}
void
wlan_cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev,
wlan_cm_id cm_id,
struct wlan_cm_connect_resp *rsp)
{
return cm_connect_resp_fill_mld_addr_from_cm_id(vdev, cm_id, rsp);
}
#ifdef WLAN_FEATURE_11BE_MLO
void
wlan_cm_connect_resp_fill_mld_addr_from_vdev_id(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct scan_cache_entry *entry,
struct wlan_cm_connect_resp *rsp)
{
struct wlan_objmgr_vdev *vdev;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
WLAN_MLME_CM_ID);
if (!vdev)
return;
cm_connect_resp_fill_mld_addr_from_candidate(vdev, entry, rsp);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
}
#endif
QDF_STATUS
wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_vdev_discon_req *req)

مشاهده پرونده

@@ -527,4 +527,21 @@ wlan_scan_get_last_scan_ageout_time(struct wlan_objmgr_psoc *psoc,
struct scan_cache_entry *
wlan_scan_get_entry_by_bssid(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr *bssid);
/**
* wlan_scan_get_mld_addr_by_link_addr() - Function to get MLD address
* in the scan entry from the link BSSID.
* @pdev: pdev object
* @link_addr: Link BSSID to match the scan filter
* @mld_mac_addr: Pointer to fill the MLD address.
*
* A wrapper API which fills @mld_mac_addr with MLD address of scan entry
* whose bssid field matches @link_addr.
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_scan_get_mld_addr_by_link_addr(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr *link_addr,
struct qdf_mac_addr *mld_mac_addr);
#endif

مشاهده پرونده

@@ -121,6 +121,34 @@ util_scan_entry_macaddr(struct scan_cache_entry *scan_entry)
return &(scan_entry->mac_addr.bytes[0]);
}
#ifdef WLAN_FEATURE_11BE_MLO
/**
* util_scan_entry_mldaddr() - Function to get MLD address
* @scan_entry: Scan entry
*
* API will return the MLD address of the scan entry.
*
* Return: Pointer to MLD address.
*/
static inline struct qdf_mac_addr *
util_scan_entry_mldaddr(struct scan_cache_entry *scan_entry)
{
struct qdf_mac_addr *mld_addr = &scan_entry->ml_info.mld_mac_addr;
if (qdf_is_macaddr_zero(mld_addr))
return NULL;
return mld_addr;
}
#else
static inline struct qdf_mac_addr *
util_scan_entry_mldaddr(struct scan_cache_entry *scan_entry)
{
return NULL;
}
#endif
/**
* util_scan_entry_bssid() - function to read bssid
* @scan_entry: scan entry

مشاهده پرونده

@@ -877,6 +877,14 @@ wlan_scan_get_entry_by_bssid(struct wlan_objmgr_pdev *pdev,
return scm_scan_get_entry_by_bssid(pdev, bssid);
}
QDF_STATUS
wlan_scan_get_mld_addr_by_link_addr(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr *link_addr,
struct qdf_mac_addr *mld_mac_addr)
{
return scm_get_mld_addr_by_link_addr(pdev, link_addr, mld_mac_addr);
}
QDF_STATUS
wlan_scan_get_scan_entry_by_mac_freq(struct wlan_objmgr_pdev *pdev,
struct qdf_mac_addr *bssid,