qcacld-3.0: Save assoc_resp ie in peer common object structure

In case of ML SAP, userspace needs assoc resp IE to get all
the ML link info.
So, Add support to save assoc_resp ie pointer in peer common object
which will send to userspace.

Change-Id: If19857ecce62092b1aa4e7fef17c09e819822f5f
CRs-Fixed: 3325938
This commit is contained in:
Deeksha Gupta
2022-11-03 21:31:50 +05:30
committed by Madan Koyyalamudi
parent 536cb3b381
commit cd5cb50120
3 changed files with 76 additions and 0 deletions

View File

@@ -160,6 +160,7 @@ struct sae_auth_retry {
* @peer_set_key_wakelock: wakelock to protect peer set key op with firmware
* @peer_set_key_runtime_wakelock: runtime pm wakelock for set key
* @is_key_wakelock_set: flag to check if key wakelock is pending to release
* @assoc_rsp: assoc rsp IE received during connection
*/
struct peer_mlme_priv_obj {
uint8_t last_pn_valid;
@@ -178,6 +179,7 @@ struct peer_mlme_priv_obj {
qdf_wake_lock_t peer_set_key_wakelock;
qdf_runtime_lock_t peer_set_key_runtime_wakelock;
bool is_key_wakelock_set;
struct element_info assoc_rsp;
};
/**
@@ -755,6 +757,25 @@ bool mlme_get_reconn_after_assoc_timeout_flag(struct wlan_objmgr_psoc *psoc,
*/
struct element_info *mlme_get_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev);
/**
* mlme_free_peer_assoc_rsp_ie() - Free the peer Assoc resp IE
* @peer_priv: Peer priv object
*
* Return: None
*/
void mlme_free_peer_assoc_rsp_ie(struct peer_mlme_priv_obj *peer_priv);
/**
* mlme_set_peer_assoc_rsp_ie() - Cache Assoc resp IE send to peer
* @psoc: soc object
* @peer_addr: Mac address of requesting peer
* @ie: pointer for assoc resp IEs
*
* Return: None
*/
void mlme_set_peer_assoc_rsp_ie(struct wlan_objmgr_psoc *psoc,
uint8_t *peer_addr, struct element_info *ie);
/**
* mlme_set_peer_pmf_status() - set pmf status of peer
* @peer: PEER object

View File

@@ -325,6 +325,7 @@ mlme_peer_object_destroyed_notification(struct wlan_objmgr_peer *peer,
if (QDF_IS_STATUS_ERROR(status))
mlme_legacy_err("unable to detach peer_priv obj to peer obj");
mlme_free_peer_assoc_rsp_ie(peer_priv);
qdf_mem_free(peer_priv);
return status;
@@ -3198,6 +3199,54 @@ struct element_info *mlme_get_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev)
return &mlme_priv->disconnect_info.peer_discon_ies;
}
void mlme_free_peer_assoc_rsp_ie(struct peer_mlme_priv_obj *peer_priv)
{
if (!peer_priv) {
mlme_legacy_debug("peer priv is NULL");
return;
}
if (peer_priv->assoc_rsp.ptr) {
qdf_mem_free(peer_priv->assoc_rsp.ptr);
peer_priv->assoc_rsp.ptr = NULL;
peer_priv->assoc_rsp.len = 0;
}
}
void mlme_set_peer_assoc_rsp_ie(struct wlan_objmgr_psoc *psoc,
uint8_t *peer_addr, struct element_info *ie)
{
struct wlan_objmgr_peer *peer;
struct peer_mlme_priv_obj *peer_priv;
if (!ie || !ie->len || !ie->ptr || !peer_addr) {
mlme_legacy_debug("Assoc IE is NULL");
return;
}
peer = wlan_objmgr_get_peer_by_mac(psoc, peer_addr, WLAN_LEGACY_MAC_ID);
if (!peer)
return;
peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
WLAN_UMAC_COMP_MLME);
if (!peer_priv)
goto end;
/* Free existing assoc_rsp */
mlme_free_peer_assoc_rsp_ie(peer_priv);
peer_priv->assoc_rsp.ptr = qdf_mem_malloc(ie->len);
if (!peer_priv->assoc_rsp.ptr)
goto end;
qdf_mem_copy(peer_priv->assoc_rsp.ptr, ie->ptr, ie->len);
peer_priv->assoc_rsp.len = ie->len;
end:
wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
}
void mlme_set_follow_ap_edca_flag(struct wlan_objmgr_vdev *vdev, bool flag)
{
struct mlme_legacy_priv *mlme_priv;