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:

کامیت شده توسط
Madan Koyyalamudi

والد
f5534874df
کامیت
7382a9f799
@@ -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,
|
||||
|
مرجع در شماره جدید
Block a user