Jelajahi Sumber

qcacld-3.0: Modify interface and mac address

Inorder to send out the tdls management frame properly,
1\ Make sure to use assoc vdev id when transmit frames;
2\ TDLS discovery response is sent to peer directly;
3\ TDLS link identifier IE is using mld mac address.

Change-Id: Ib34b6a5070e0acdf41668f44e5b5250761eb936e
CRs-Fixed: 3439343
Paul Zhang 2 tahun lalu
induk
melakukan
e52c09b92d

+ 107 - 22
core/mac/src/pe/lim/lim_process_tdls.c

@@ -68,6 +68,7 @@
 #include "wma_types.h"
 #include "cds_regdomain.h"
 #include "cds_utils.h"
+#include "wlan_mlo_mgr_sta.h"
 #include "wlan_reg_services_api.h"
 #include "wlan_tdls_tgt_api.h"
 #include "wlan_mlme_public_struct.h"
@@ -336,6 +337,44 @@ static void populate_dot11f_tdls_offchannel_params(
 	return;
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+/**
+ * lim_tdls_copy_self_mac() - copy mac address
+ * @session: pe session
+ * @init_sta_addr: the pointer to save the address
+ *
+ * For MLD device, it needs to copy mld mac address.
+ *
+ * Return: void
+ */
+static void lim_tdls_copy_self_mac(struct pe_session *session,
+				   uint8_t *init_sta_addr)
+{
+	struct wlan_mlo_dev_context *mlo_dev_ctx;
+
+	if (wlan_vdev_mlme_is_mlo_vdev(session->vdev)) {
+		mlo_dev_ctx = session->vdev->mlo_dev_ctx;
+		if (!mlo_dev_ctx) {
+			pe_debug("mlo_dev_ctx is NULL");
+			return;
+		}
+
+		qdf_mem_copy((uint8_t *)init_sta_addr,
+			     mlo_dev_ctx->mld_addr.bytes, QDF_MAC_ADDR_SIZE);
+	} else {
+		qdf_mem_copy((uint8_t *)init_sta_addr,
+			     session->self_mac_addr, QDF_MAC_ADDR_SIZE);
+	}
+}
+#else
+static void lim_tdls_copy_self_mac(struct pe_session *session,
+				   uint8_t *init_sta_addr)
+{
+	qdf_mem_copy((uint8_t *)init_sta_addr,
+		     session->self_mac_addr, QDF_MAC_ADDR_SIZE);
+}
+#endif
+
 /*
  * FUNCTION: Populate Link Identifier element IE
  *
@@ -347,20 +386,19 @@ static void populate_dot11f_link_iden(struct mac_context *mac,
 				      struct qdf_mac_addr peer_mac,
 				      uint8_t reqType)
 {
-	uint8_t *initStaAddr = NULL;
-	uint8_t *respStaAddr = NULL;
+	uint8_t *initaddr = NULL;
+	uint8_t *respaddr = NULL;
 
-	(reqType == TDLS_INITIATOR) ? ((initStaAddr = linkIden->InitStaAddr),
-				       (respStaAddr = linkIden->RespStaAddr))
-	: ((respStaAddr = linkIden->InitStaAddr),
-	   (initStaAddr = linkIden->RespStaAddr));
-	qdf_mem_copy((uint8_t *) linkIden->bssid,
-		     (uint8_t *) pe_session->bssId, QDF_MAC_ADDR_SIZE);
+	(reqType == TDLS_INITIATOR) ? ((initaddr = linkIden->InitStaAddr),
+				       (respaddr = linkIden->RespStaAddr))
+	: ((respaddr = linkIden->InitStaAddr),
+	   (initaddr = linkIden->RespStaAddr));
+	qdf_mem_copy((uint8_t *)linkIden->bssid,
+		     (uint8_t *)pe_session->bssId, QDF_MAC_ADDR_SIZE);
 
-	qdf_mem_copy((uint8_t *) initStaAddr,
-		     pe_session->self_mac_addr, QDF_MAC_ADDR_SIZE);
+	lim_tdls_copy_self_mac(pe_session, initaddr);
 
-	qdf_mem_copy((uint8_t *) respStaAddr, (uint8_t *) peer_mac.bytes,
+	qdf_mem_copy((uint8_t *)respaddr, (uint8_t *)peer_mac.bytes,
 		     QDF_MAC_ADDR_SIZE);
 
 	linkIden->present = 1;
@@ -536,6 +574,36 @@ static QDF_STATUS lim_mgmt_tdls_tx_complete(void *context,
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+/**
+ * lim_get_assoc_link_vdev_id() - get vdev id
+ * @session: pe session
+ *
+ * Since fw only uses assoc link vdev to transmit data packets,
+ * it needs to fetch the right vdev id when transfer tdls management
+ * frame for partner link.
+ *
+ * Return: vdev id
+ */
+static uint8_t lim_get_assoc_link_vdev_id(struct pe_session *session)
+{
+	struct wlan_objmgr_vdev *assoc_vdev;
+
+	if (wlan_vdev_mlme_is_mlo_vdev(session->vdev)) {
+		assoc_vdev = wlan_mlo_get_assoc_link_vdev(session->vdev);
+		if (assoc_vdev)
+			return wlan_vdev_get_id(assoc_vdev);
+	}
+
+	return session->smeSessionId;
+}
+#else
+static uint8_t lim_get_assoc_link_vdev_id(struct pe_session *session)
+{
+	return session->smeSessionId;
+}
+#endif
+
 /*
  * This function can be used for bacst or unicast discovery request
  * We are not differentiating it here, it will all depend on peer MAC address,
@@ -554,6 +622,7 @@ static QDF_STATUS lim_send_tdls_dis_req_frame(struct mac_context *mac,
 	uint32_t header_offset = 0;
 	uint8_t *pFrame;
 	void *pPacket;
+	uint8_t vdev_id;
 	QDF_STATUS qdf_status;
 #ifndef NO_PAD_TDLS_MIN_8023_SIZE
 	uint32_t padLen = 0;
@@ -722,6 +791,8 @@ static QDF_STATUS lim_send_tdls_dis_req_frame(struct mac_context *mac,
 		QDF_MAC_ADDR_REF(peer_mac.bytes));
 
 	mac->lim.tdls_frm_session_id = pe_session->smeSessionId;
+	vdev_id = lim_get_assoc_link_vdev_id(pe_session);
+
 	lim_diag_mgmt_tx_event_report(mac, (tpSirMacMgmtHdr) pFrame,
 				      pe_session, QDF_STATUS_SUCCESS,
 				      QDF_STATUS_SUCCESS);
@@ -734,8 +805,8 @@ static QDF_STATUS lim_send_tdls_dis_req_frame(struct mac_context *mac,
 					lim_mgmt_tdls_tx_complete,
 					HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME |
 					HAL_USE_PEER_STA_REQUESTED_MASK,
-					smeSessionId, false, 0,
-					RATEID_DEFAULT, 0);
+					vdev_id, false, 0,
+					RATEID_DEFAULT, 0, 0);
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		mac->lim.tdls_frm_session_id = NO_SESSION;
 		pe_err("could not send TDLS Discovery Request frame");
@@ -1524,6 +1595,7 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
 	void *pPacket;
 	QDF_STATUS qdf_status;
 	uint32_t selfDot11Mode;
+	uint8_t  selfaddr[QDF_MAC_ADDR_SIZE];
 /*  Placeholder to support different channel bonding mode of TDLS than AP. */
 /*  Today, WNI_CFG_CHANNEL_BONDING_MODE will be overwritten when connecting to AP */
 /*  To support this feature, we need to introduce WNI_CFG_TDLS_CHANNEL_BONDING_MODE */
@@ -1672,10 +1744,10 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
 	 */
 
 	/* Make public Action Frame */
-
+	lim_tdls_copy_self_mac(pe_session, selfaddr);
 	lim_populate_mac_header(mac, pFrame, SIR_MAC_MGMT_FRAME,
 				SIR_MAC_MGMT_ACTION, peer_mac.bytes,
-				pe_session->self_mac_addr);
+				selfaddr);
 
 	{
 		tpSirMacMgmtHdr pMacHdr;
@@ -1756,7 +1828,8 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
 					      lim_mgmt_tdls_tx_complete,
 					      HAL_USE_SELF_STA_REQUESTED_MASK,
 					      smeSessionId, false, 0,
-					      RATEID_DEFAULT, 0);
+					      RATEID_DEFAULT, 0,
+					      TDLS_DISCOVERY_RESPONSE);
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		mac->lim.tdls_frm_session_id = NO_SESSION;
 		pe_err("could not send TDLS Discovery Response frame!");
@@ -1840,7 +1913,7 @@ wma_tx_frame_with_tx_complete_send(struct mac_context *mac, void *pPacket,
 					  HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME
 					  | HAL_USE_PEER_STA_REQUESTED_MASK,
 					  smeSessionId, flag, 0,
-					  RATEID_DEFAULT, 0);
+					  RATEID_DEFAULT, 0, 0);
 }
 #else
 
@@ -1861,7 +1934,7 @@ wma_tx_frame_with_tx_complete_send(struct mac_context *mac, void *pPacket,
 					  HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME
 					  | HAL_USE_PEER_STA_REQUESTED_MASK,
 					  smeSessionId, false, 0,
-					  RATEID_DEFAULT, 0);
+					  RATEID_DEFAULT, 0, 0);
 }
 #endif
 
@@ -1895,6 +1968,7 @@ QDF_STATUS lim_send_tdls_link_setup_req_frame(struct mac_context *mac,
 	uint32_t payload = 0;
 	uint32_t nbytes = 0;
 	uint32_t header_offset = 0;
+	uint8_t vdev_id;
 	uint8_t *frame;
 	void *packet;
 	QDF_STATUS qdf_status;
@@ -2175,6 +2249,9 @@ QDF_STATUS lim_send_tdls_link_setup_req_frame(struct mac_context *mac,
 		QDF_MAC_ADDR_REF(peer_mac.bytes));
 
 	mac->lim.tdls_frm_session_id = pe_session->smeSessionId;
+
+	vdev_id = lim_get_assoc_link_vdev_id(pe_session);
+
 	lim_diag_mgmt_tx_event_report(mac, (tpSirMacMgmtHdr) frame,
 				      pe_session, QDF_STATUS_SUCCESS,
 				      QDF_STATUS_SUCCESS);
@@ -2183,7 +2260,7 @@ QDF_STATUS lim_send_tdls_link_setup_req_frame(struct mac_context *mac,
 							(uint16_t)nbytes,
 							TID_AC_VI,
 							frame,
-							smeSessionId, true);
+							vdev_id, true);
 
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		mac->lim.tdls_frm_session_id = NO_SESSION;
@@ -2214,6 +2291,7 @@ QDF_STATUS lim_send_tdls_teardown_frame(struct mac_context *mac,
 	uint32_t header_offset = 0;
 	uint8_t *frame;
 	void *packet;
+	uint8_t vdev_id;
 	QDF_STATUS qdf_status;
 #ifndef NO_PAD_TDLS_MIN_8023_SIZE
 	uint32_t padlen = 0;
@@ -2382,6 +2460,9 @@ QDF_STATUS lim_send_tdls_teardown_frame(struct mac_context *mac,
 		QDF_MAC_ADDR_REF(peer_mac.bytes));
 
 	mac->lim.tdls_frm_session_id = pe_session->smeSessionId;
+
+	vdev_id = lim_get_assoc_link_vdev_id(pe_session);
+
 	lim_diag_mgmt_tx_event_report(mac, (tpSirMacMgmtHdr)frame,
 				      pe_session, QDF_STATUS_SUCCESS,
 				      QDF_STATUS_SUCCESS);
@@ -2390,7 +2471,7 @@ QDF_STATUS lim_send_tdls_teardown_frame(struct mac_context *mac,
 					(uint16_t)nbytes,
 					TID_AC_VI,
 					frame,
-					smeSessionId,
+					vdev_id,
 					(reason == REASON_TDLS_PEER_UNREACHABLE)
 					? true : false);
 
@@ -2428,6 +2509,7 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
 	QDF_STATUS qdf_status;
 	uint32_t selfDot11Mode;
 	uint8_t max_sp_length = 0;
+	uint8_t vdev_id;
 /*  Placeholder to support different channel bonding mode of TDLS than AP. */
 /*  Today, WNI_CFG_CHANNEL_BONDING_MODE will be overwritten when connecting to AP */
 /*  To support this feature, we need to introduce WNI_CFG_TDLS_CHANNEL_BONDING_MODE */
@@ -2695,6 +2777,7 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
 		QDF_MAC_ADDR_REF(peer_mac.bytes));
 
 	mac->lim.tdls_frm_session_id = pe_session->smeSessionId;
+	vdev_id = lim_get_assoc_link_vdev_id(pe_session);
 	lim_diag_mgmt_tx_event_report(mac, (tpSirMacMgmtHdr) pFrame,
 				      pe_session, QDF_STATUS_SUCCESS,
 				      QDF_STATUS_SUCCESS);
@@ -2703,7 +2786,7 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
 						     (uint16_t) nBytes,
 						     TID_AC_VI,
 						     pFrame,
-						     smeSessionId, true);
+						     vdev_id, true);
 
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		mac->lim.tdls_frm_session_id = NO_SESSION;
@@ -2735,6 +2818,7 @@ QDF_STATUS lim_send_tdls_link_setup_cnf_frame(struct mac_context *mac,
 	uint8_t *pFrame;
 	void *pPacket;
 	QDF_STATUS qdf_status;
+	uint8_t vdev_id;
 #ifndef NO_PAD_TDLS_MIN_8023_SIZE
 	uint32_t padLen = 0;
 #endif
@@ -2958,6 +3042,7 @@ QDF_STATUS lim_send_tdls_link_setup_cnf_frame(struct mac_context *mac,
 	       QDF_MAC_ADDR_REF(peer_mac.bytes));
 
 	mac->lim.tdls_frm_session_id = pe_session->smeSessionId;
+	vdev_id = lim_get_assoc_link_vdev_id(pe_session);
 	lim_diag_mgmt_tx_event_report(mac, (tpSirMacMgmtHdr) pFrame,
 				      pe_session, QDF_STATUS_SUCCESS,
 				      QDF_STATUS_SUCCESS);
@@ -2966,7 +3051,7 @@ QDF_STATUS lim_send_tdls_link_setup_cnf_frame(struct mac_context *mac,
 						     (uint16_t) nBytes,
 						     TID_AC_VI,
 						     pFrame,
-						     smeSessionId, true);
+						     vdev_id, true);
 
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		mac->lim.tdls_frm_session_id = NO_SESSION;

+ 10 - 10
core/mac/src/pe/lim/lim_send_management_frames.c

@@ -1320,7 +1320,7 @@ void lim_send_mscs_req_action_frame(struct mac_context *mac,
 			   TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7,
 			   lim_tx_complete, frame, lim_mscs_req_tx_complete_cnf,
 			   HAL_USE_PEER_STA_REQUESTED_MASK,
-			   pe_session->vdev_id, false, 0, RATEID_DEFAULT, 0);
+			   pe_session->vdev_id, false, 0, RATEID_DEFAULT, 0, 0);
 	if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		mlme_set_is_mscs_req_sent(pe_session->vdev, true);
 	} else {
@@ -1968,7 +1968,7 @@ lim_send_assoc_rsp_mgmt_frame(struct mac_context *mac_ctx,
 				ANI_TXDIR_TODS,
 				7, lim_tx_complete, frame,
 				lim_assoc_rsp_tx_complete, tx_flag,
-				sme_session, false, 0, RATEID_DEFAULT, 0);
+				sme_session, false, 0, RATEID_DEFAULT, 0, 0);
 	else
 		qdf_status = wma_tx_frame(
 				mac_ctx, packet, (uint16_t)bytes,
@@ -3090,7 +3090,7 @@ lim_send_assoc_req_mgmt_frame(struct mac_context *mac_ctx,
 			   TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7,
 			   lim_tx_complete, frame, lim_assoc_tx_complete_cnf,
 			   tx_flag, vdev_id, false, 0,
-			   min_rid, peer_rssi);
+			   min_rid, peer_rssi, 0);
 	MTRACE(qdf_trace
 		       (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE,
 		       pe_session->peSessionId, qdf_status));
@@ -3706,7 +3706,7 @@ alloc_packet:
 				 7, lim_tx_complete, frame,
 				 lim_auth_tx_complete_cnf,
 				 tx_flag, vdev_id, false,
-				 ch_freq_tx_frame, min_rid, peer_rssi);
+				 ch_freq_tx_frame, min_rid, peer_rssi, 0);
 	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE,
 		session->peSessionId, qdf_status));
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
@@ -4219,7 +4219,7 @@ lim_send_disassoc_mgmt_frame(struct mac_context *mac,
 					 ANI_TXDIR_TODS, 7, lim_tx_complete,
 					 pFrame, lim_disassoc_tx_complete_cnf_handler,
 					 txFlag, smeSessionId, false, 0,
-					 RATEID_DEFAULT, 0);
+					 RATEID_DEFAULT, 0, 0);
 		MTRACE(qdf_trace
 			       (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE,
 			       pe_session->peSessionId, qdf_status));
@@ -4455,7 +4455,7 @@ lim_send_deauth_mgmt_frame(struct mac_context *mac,
 					 ANI_TXDIR_TODS, 7, lim_tx_complete,
 					 pFrame, lim_deauth_tx_complete_cnf_handler,
 					 txFlag, smeSessionId, false, 0,
-					 RATEID_DEFAULT, 0);
+					 RATEID_DEFAULT, 0, 0);
 		MTRACE(qdf_trace
 			       (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE,
 			       pe_session->peSessionId, qdf_status));
@@ -5179,7 +5179,7 @@ lim_p2p_oper_chan_change_confirm_action_frame(struct mac_context *mac_ctx,
 			TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS,
 			7, lim_tx_complete, frame,
 			lim_oper_chan_change_confirm_tx_complete_cnf,
-			tx_flag, vdev_id, false, 0, RATEID_DEFAULT, 0);
+			tx_flag, vdev_id, false, 0, RATEID_DEFAULT, 0, 0);
 
 	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE,
 			session_entry->peSessionId, qdf_status));
@@ -6261,7 +6261,7 @@ QDF_STATUS lim_send_addba_response_frame(struct mac_context *mac_ctx,
 						NULL, frame_ptr,
 						lim_addba_rsp_tx_complete_cnf,
 						tx_flag, vdev_id,
-						false, 0, RATEID_DEFAULT, 0);
+						false, 0, RATEID_DEFAULT, 0, 0);
 	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE,
 			 session->peSessionId, qdf_status));
 	if (QDF_STATUS_SUCCESS != qdf_status) {
@@ -6524,7 +6524,7 @@ QDF_STATUS lim_send_delba_action_frame(struct mac_context *mac_ctx,
 						NULL, frame_ptr,
 						lim_delba_tx_complete_cnf,
 						tx_flag, vdev_id,
-						false, 0, RATEID_DEFAULT, 0);
+						false, 0, RATEID_DEFAULT, 0, 0);
 	if (qdf_status != QDF_STATUS_SUCCESS) {
 		pe_err("delba wma_tx_frame FAILED! Status [%d]", qdf_status);
 		return qdf_status;
@@ -6608,7 +6608,7 @@ static void lim_tx_mgmt_frame(struct mac_context *mac_ctx, uint8_t vdev_id,
 					 7, lim_tx_complete, frame,
 					 lim_auth_tx_complete_cnf,
 					 0, vdev_id, false, channel_freq,
-					 min_rid, 0);
+					 min_rid, 0, 0);
 	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE,
 		session_id, qdf_status));
 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {

+ 7 - 4
core/wma/inc/wma_types.h

@@ -462,11 +462,12 @@ enum wmamsgtype {
 		      (false), \
 		      (channel_freq), \
 		      (rid), \
-		      (peer_rssi)))
+		      (peer_rssi), \
+		      (0)))
 
 #define wma_tx_frameWithTxComplete(hHal, pFrmBuf, frmLen, frmType, txDir, tid, \
 	 pCompFunc, pData, pCBackFnTxComp, txFlag, sessionid, \
-	 tdlsflag, channel_freq, rid, peer_rssi) \
+	 tdlsflag, channel_freq, rid, peer_rssi, action) \
 	(QDF_STATUS)( wma_tx_packet( \
 		      cds_get_context(QDF_MODULE_ID_WMA), \
 		      (pFrmBuf), \
@@ -482,7 +483,8 @@ enum wmamsgtype {
 		      (tdlsflag), \
 		      (channel_freq), \
 		      (rid), \
-		      (peer_rssi)))
+		      (peer_rssi), \
+		      (action)))
 
 /**
  * struct sUapsd_Params - Powersave Offload Changes
@@ -683,6 +685,7 @@ void wma_tx_abort(uint8_t vdev_id);
  * @channel_freq: channel frequency
  * @rid: rate id
  * @peer_rssi: peer RSSI value
+ * @action: TDLS action code
  *
  * This function sends the frame corresponding to the
  * given vdev id.
@@ -697,7 +700,7 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 			 wma_tx_ota_comp_callback tx_frm_ota_comp_cb,
 			 uint8_t tx_flag, uint8_t vdev_id, bool tdls_flag,
 			 uint16_t channel_freq, enum rateid rid,
-			 int8_t peer_rssi);
+			 int8_t peer_rssi, enum tdls_actioncode action);
 
 /**
  * wma_open() - Allocate wma context and initialize it.

+ 3 - 2
core/wma/src/wma_data.c

@@ -2279,7 +2279,7 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 			 wma_tx_ota_comp_callback tx_frm_ota_comp_cb,
 			 uint8_t tx_flag, uint8_t vdev_id, bool tdls_flag,
 			 uint16_t channel_freq, enum rateid rid,
-			 int8_t peer_rssi)
+			 int8_t peer_rssi, enum tdls_actioncode action)
 {
 	tp_wma_handle wma_handle = (tp_wma_handle) (wma_context);
 	int32_t status;
@@ -2697,7 +2697,8 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 	    frmType == TXRX_FRM_802_11_MGMT &&
 	    pFc->subType != SIR_MAC_MGMT_PROBE_REQ &&
 	    pFc->subType != SIR_MAC_MGMT_AUTH &&
-	    pFc->subType != SIR_MAC_MGMT_ASSOC_REQ)
+	    pFc->subType != SIR_MAC_MGMT_ASSOC_REQ &&
+	    action != TDLS_DISCOVERY_RESPONSE)
 		mgmt_param.mlo_link_agnostic = true;
 
 	if (tx_flag & HAL_USE_INCORRECT_KEY_PMF)