Ver Fonte

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
Deeksha Gupta há 2 anos atrás
pai
commit
cd5cb50120

+ 21 - 0
components/mlme/core/inc/wlan_mlme_main.h

@@ -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

+ 49 - 0
components/mlme/core/src/wlan_mlme_main.c

@@ -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;

+ 6 - 0
core/mac/src/pe/lim/lim_send_management_frames.c

@@ -1649,6 +1649,7 @@ lim_send_assoc_rsp_mgmt_frame(struct mac_context *mac_ctx,
 	bool is_band_2g;
 	uint16_t ie_buf_size;
 	uint16_t mlo_ie_len = 0;
+	struct element_info ie;
 
 	if (!pe_session) {
 		pe_err("pe_session is NULL");
@@ -2076,6 +2077,11 @@ lim_send_assoc_rsp_mgmt_frame(struct mac_context *mac_ctx,
 	    pe_session->opmode == QDF_P2P_GO_MODE)
 		tx_flag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
 
+	ie.ptr = frame + sizeof(tSirMacMgmtHdr) + WLAN_ASSOC_RSP_IES_OFFSET;
+	ie.len = payload - WLAN_ASSOC_RSP_IES_OFFSET;
+
+	mlme_set_peer_assoc_rsp_ie(mac_ctx->psoc, peer_addr, &ie);
+
 	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_MGMT,
 			 pe_session->peSessionId, mac_hdr->fc.subType));
 	lim_diag_mgmt_tx_event_report(mac_ctx, mac_hdr,