Browse Source

qcacld-3.0: Add legacy changes for TDLS UMAC component

Add changes in hdd and mlme modules to support TDLS UMAC
component.

Change-Id: I9e8514e73cebaef566444c9c89e2db2609962b4c
CRs-Fixed: 2035617
Kabilan Kannan 8 years ago
parent
commit
f56f9d5960

+ 10 - 0
core/hdd/inc/wlan_hdd_wmm.h

@@ -342,6 +342,16 @@ QDF_STATUS hdd_wmm_get_uapsd_mask(hdd_adapter_t *pAdapter,
  */
  */
 bool hdd_wmm_is_active(hdd_adapter_t *pAdapter);
 bool hdd_wmm_is_active(hdd_adapter_t *pAdapter);
 
 
+/**
+ * hdd_wmm_is_acm_allowed() - Function which will determine if WMM is
+ * active on the current connection
+ *
+ * @vdev: vdev object
+ *
+ * Return: true if WMM is enabled, false if WMM is not enabled
+ */
+bool hdd_wmm_is_acm_allowed(struct wlan_objmgr_vdev **vdev);
+
 /**
 /**
  * hdd_wmm_addts() - Function which will add a traffic spec at the
  * hdd_wmm_addts() - Function which will add a traffic spec at the
  * request of an application
  * request of an application

+ 10 - 0
core/hdd/src/wlan_hdd_assoc.c

@@ -1919,6 +1919,7 @@ QDF_STATUS hdd_roam_register_sta(hdd_adapter_t *pAdapter,
 						);
 						);
 
 
 		hdd_conn_set_authenticated(pAdapter, true);
 		hdd_conn_set_authenticated(pAdapter, true);
+		hdd_objmgr_set_peer_mlme_auth_state(pAdapter->hdd_vdev, true);
 	} else {
 	} else {
 		hdd_debug("ULA auth StaId= %d. Changing TL state to CONNECTED at Join time",
 		hdd_debug("ULA auth StaId= %d. Changing TL state to CONNECTED at Join time",
 			 pHddStaCtx->conn_info.staId[0]);
 			 pHddStaCtx->conn_info.staId[0]);
@@ -1932,6 +1933,7 @@ QDF_STATUS hdd_roam_register_sta(hdd_adapter_t *pAdapter,
 #endif
 #endif
 						);
 						);
 		hdd_conn_set_authenticated(pAdapter, false);
 		hdd_conn_set_authenticated(pAdapter, false);
+		hdd_objmgr_set_peer_mlme_auth_state(pAdapter->hdd_vdev, false);
 	}
 	}
 	return qdf_status;
 	return qdf_status;
 }
 }
@@ -2164,6 +2166,8 @@ static int hdd_change_sta_state_authenticated(hdd_adapter_t *adapter,
 	status = hdd_change_peer_state(adapter, staid, OL_TXRX_PEER_STATE_AUTH,
 	status = hdd_change_peer_state(adapter, staid, OL_TXRX_PEER_STATE_AUTH,
 			hdd_is_roam_sync_in_progress(roaminfo));
 			hdd_is_roam_sync_in_progress(roaminfo));
 	hdd_conn_set_authenticated(adapter, true);
 	hdd_conn_set_authenticated(adapter, true);
+	hdd_objmgr_set_peer_mlme_auth_state(adapter->hdd_vdev, true);
+
 	if ((QDF_STA_MODE == adapter->device_mode) ||
 	if ((QDF_STA_MODE == adapter->device_mode) ||
 		(QDF_P2P_CLIENT_MODE == adapter->device_mode)) {
 		(QDF_P2P_CLIENT_MODE == adapter->device_mode)) {
 		sme_ps_enable_auto_ps_timer(
 		sme_ps_enable_auto_ps_timer(
@@ -2814,6 +2818,9 @@ static QDF_STATUS hdd_association_completion_handler(hdd_adapter_t *pAdapter,
 #endif
 #endif
 						);
 						);
 				hdd_conn_set_authenticated(pAdapter, false);
 				hdd_conn_set_authenticated(pAdapter, false);
+				hdd_objmgr_set_peer_mlme_auth_state(
+							pAdapter->hdd_vdev,
+							false);
 			} else {
 			} else {
 				hdd_debug("staId: %d Changing TL state to AUTHENTICATED",
 				hdd_debug("staId: %d Changing TL state to AUTHENTICATED",
 					 pHddStaCtx->conn_info.staId[0]);
 					 pHddStaCtx->conn_info.staId[0]);
@@ -2828,6 +2835,9 @@ static QDF_STATUS hdd_association_completion_handler(hdd_adapter_t *pAdapter,
 #endif
 #endif
 						);
 						);
 				hdd_conn_set_authenticated(pAdapter, true);
 				hdd_conn_set_authenticated(pAdapter, true);
+				hdd_objmgr_set_peer_mlme_auth_state(
+							pAdapter->hdd_vdev,
+							true);
 			}
 			}
 
 
 			if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			if (QDF_IS_STATUS_SUCCESS(qdf_status)) {

+ 4 - 0
core/hdd/src/wlan_hdd_main.c

@@ -11270,6 +11270,10 @@ static int hdd_update_tdls_config(hdd_context_t *hdd_ctx)
 	tdls_cfg.tdls_tl_peer_data = hdd_ctx;
 	tdls_cfg.tdls_tl_peer_data = hdd_ctx;
 	tdls_cfg.tdls_reg_tl_peer = hdd_tdls_register_tdls_peer;
 	tdls_cfg.tdls_reg_tl_peer = hdd_tdls_register_tdls_peer;
 	tdls_cfg.tdls_dereg_tl_peer = hdd_tdls_deregister_tdl_peer;
 	tdls_cfg.tdls_dereg_tl_peer = hdd_tdls_deregister_tdl_peer;
+	tdls_cfg.tdls_wmm_cb = hdd_wmm_is_acm_allowed;
+	tdls_cfg.tdls_wmm_cb_data = psoc;
+	tdls_cfg.tdls_rx_cb = wlan_cfg80211_tdls_rx_callback;
+	tdls_cfg.tdls_rx_cb_data = psoc;
 
 
 	status = ucfg_tdls_update_config(psoc, &tdls_cfg);
 	status = ucfg_tdls_update_config(psoc, &tdls_cfg);
 	if (status != QDF_STATUS_SUCCESS) {
 	if (status != QDF_STATUS_SUCCESS) {

+ 28 - 1
core/hdd/src/wlan_hdd_object_manager.c

@@ -316,8 +316,35 @@ int hdd_objmgr_remove_peer_object(struct wlan_objmgr_vdev *vdev,
 	return -EINVAL;
 	return -EINVAL;
 }
 }
 
 
+int hdd_objmgr_set_peer_mlme_auth_state(struct wlan_objmgr_vdev *vdev,
+					bool is_authenticated)
+{
+	struct wlan_objmgr_peer *peer;
+	QDF_STATUS status;
+
+	wlan_vdev_obj_lock(vdev);
+	peer = wlan_vdev_get_bsspeer(vdev);
+	wlan_vdev_obj_unlock(vdev);
+
+	if (!peer) {
+		hdd_err("peer is null");
+
+		return -EINVAL;
+	}
+	status = wlan_objmgr_peer_try_get_ref(peer, WLAN_TDLS_NB_ID);
+	if (status != QDF_STATUS_SUCCESS)
+		return -EINVAL;
+
+	wlan_peer_obj_lock(peer);
+	wlan_peer_mlme_set_auth_state(peer, is_authenticated);
+	wlan_peer_obj_unlock(peer);
+
+	wlan_objmgr_peer_release_ref(peer, WLAN_TDLS_NB_ID);
+	return 0;
+}
+
 int hdd_objmgr_set_peer_mlme_state(struct wlan_objmgr_vdev *vdev,
 int hdd_objmgr_set_peer_mlme_state(struct wlan_objmgr_vdev *vdev,
-				   enum wlan_peer_state peer_state)
+	enum wlan_peer_state peer_state)
 {
 {
 	struct wlan_objmgr_peer *peer;
 	struct wlan_objmgr_peer *peer;
 
 

+ 12 - 0
core/hdd/src/wlan_hdd_object_manager.h

@@ -182,6 +182,18 @@ int hdd_objmgr_add_peer_object(struct wlan_objmgr_vdev *vdev,
 int hdd_objmgr_remove_peer_object(struct wlan_objmgr_vdev *vdev,
 int hdd_objmgr_remove_peer_object(struct wlan_objmgr_vdev *vdev,
 				  uint8_t *mac_addr);
 				  uint8_t *mac_addr);
 
 
+/**
+ * hdd_objmgr_set_peer_mlme_auth_state() - set the peer mlme auth state
+ * @vdev: vdev pointer
+ * @is_authenticated: Peer mlme auth state true/false
+ *
+ * This API set the peer mlme auth state
+ *
+ * Return: 0 for success, negative error code for failure
+ */
+int hdd_objmgr_set_peer_mlme_auth_state(struct wlan_objmgr_vdev *vdev,
+					bool is_authenticated);
+
 /**
 /**
  * hdd_objmgr_set_peer_mlme_state() - set the peer mlme state
  * hdd_objmgr_set_peer_mlme_state() - set the peer mlme state
  * @vdev: vdev pointer
  * @vdev: vdev pointer

+ 7 - 0
core/hdd/src/wlan_hdd_tdls.c

@@ -4110,6 +4110,13 @@ static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
 
 
 	hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 	hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
 
+#ifdef CONVERGED_TDLS_ENABLE
+	return wlan_cfg80211_tdls_mgmt(pHddCtx->hdd_pdev, dev, peer,
+				       action_code, dialog_token,
+				       status_code, peer_capability,
+				       buf, len);
+#endif
+
 	/*
 	/*
 	 * STA or P2P client should be connected and authenticated before
 	 * STA or P2P client should be connected and authenticated before
 	 *  sending any TDLS frames
 	 *  sending any TDLS frames

+ 19 - 0
core/hdd/src/wlan_hdd_wmm.c

@@ -2065,6 +2065,25 @@ bool hdd_wmm_is_active(hdd_adapter_t *pAdapter)
 	}
 	}
 }
 }
 
 
+bool hdd_wmm_is_acm_allowed(struct wlan_objmgr_vdev **vdev)
+{
+	hdd_adapter_t *adapter;
+	struct hdd_wmm_ac_status *wmm_ac_status;
+
+
+	adapter = container_of(vdev, hdd_adapter_t, hdd_vdev);
+	if (NULL == adapter) {
+		hdd_err("failed, hdd adapter is NULL");
+		return false;
+	}
+	wmm_ac_status = adapter->hddWmmStatus.wmmAcStatus;
+
+	if (hdd_wmm_is_active(adapter) &&
+	    !(wmm_ac_status[OL_TX_WMM_AC_VI].wmmAcAccessAllowed))
+		return false;
+	return true;
+}
+
 /**
 /**
  * hdd_wmm_addts() - Function which will add a traffic spec at the
  * hdd_wmm_addts() - Function which will add a traffic spec at the
  * request of an application
  * request of an application

+ 6 - 0
core/mac/inc/sir_api.h

@@ -427,6 +427,9 @@ typedef struct sSirSmeRsp {
 	uint8_t sessionId;      /* To support BT-AMP */
 	uint8_t sessionId;      /* To support BT-AMP */
 	uint16_t transactionId; /* To support BT-AMP */
 	uint16_t transactionId; /* To support BT-AMP */
 	tSirResultCodes statusCode;
 	tSirResultCodes statusCode;
+#ifdef CONVERGED_TDLS_ENABLE
+	struct wlan_objmgr_psoc *psoc;
+#endif
 } tSirSmeRsp, *tpSirSmeRsp;
 } tSirSmeRsp, *tpSirSmeRsp;
 
 
 /* / Definition for indicating all modules ready on STA */
 /* / Definition for indicating all modules ready on STA */
@@ -3446,6 +3449,9 @@ typedef struct sSirMgmtTxCompletionInd {
 	uint16_t length;
 	uint16_t length;
 	uint8_t sessionId;      /* Session ID */
 	uint8_t sessionId;      /* Session ID */
 	uint32_t txCompleteStatus;
 	uint32_t txCompleteStatus;
+#ifdef CONVERGED_TDLS_ENABLE
+	struct wlan_objmgr_psoc *psoc;
+#endif
 } tSirMgmtTxCompletionInd, *tpSirMgmtTxCompletionInd;
 } tSirMgmtTxCompletionInd, *tpSirMgmtTxCompletionInd;
 
 
 typedef struct sSirTdlsEventnotify {
 typedef struct sSirTdlsEventnotify {

+ 58 - 2
core/mac/src/pe/lim/lim_process_tdls.c

@@ -2889,6 +2889,56 @@ add_sta_error:
 	return status;
 	return status;
 }
 }
 
 
+#ifdef CONVERGED_TDLS_ENABLE
+/**
+ * lim_send_tdls_comp_mgmt_rsp() - Send Response to upper layers
+ * @mac_ctx:          Pointer to Global MAC structure
+ * @msg_type:         Indicates message type
+ * @result_code:       Indicates the result of previously issued
+ *                    eWNI_SME_msg_type_REQ message
+ *
+ * This function is called by lim_process_sme_req_messages() to send
+ * eWNI_SME_START_RSP, eWNI_SME_STOP_BSS_RSP
+ * or eWNI_SME_SWITCH_CHL_RSP messages to applications above MAC
+ * Software.
+ *
+ * Return: None
+ */
+
+static void
+lim_send_tdls_comp_mgmt_rsp(tpAniSirGlobal mac_ctx, uint16_t msg_type,
+	 tSirResultCodes result_code, uint8_t sme_session_id,
+	 uint16_t sme_transaction_id)
+{
+	struct scheduler_msg msg;
+	tSirSmeRsp *sme_rsp;
+
+	lim_log(mac_ctx, LOG1, FL("Sending message %s with reasonCode %s"),
+		lim_msg_str(msg_type), lim_result_code_str(result_code));
+
+	sme_rsp = qdf_mem_malloc(sizeof(tSirSmeRsp));
+	if (NULL == sme_rsp) {
+		/* Buffer not available. Log error */
+		QDF_TRACE(QDF_MODULE_ID_PE, LOGP,
+			FL("call to AllocateMemory failed for eWNI_SME_*_RSP"));
+		return;
+	}
+
+	sme_rsp->messageType = msg_type;
+	sme_rsp->length = sizeof(tSirSmeRsp);
+	sme_rsp->statusCode = result_code;
+
+	sme_rsp->sessionId = sme_session_id;
+	sme_rsp->transactionId = sme_transaction_id;
+
+	msg.type = msg_type;
+	sme_rsp->psoc = mac_ctx->psoc;
+	msg.bodyptr = sme_rsp;
+	msg.callback = tgt_tdls_send_mgmt_rsp;
+	scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg);
+
+}
+#endif
 /**
 /**
  * lim_process_sme_tdls_mgmt_send_req() - send out tdls management frames
  * lim_process_sme_tdls_mgmt_send_req() - send out tdls management frames
  *
  *
@@ -3005,9 +3055,15 @@ tSirRetStatus lim_process_sme_tdls_mgmt_send_req(tpAniSirGlobal mac_ctx,
 	}
 	}
 
 
 lim_tdls_send_mgmt_error:
 lim_tdls_send_mgmt_error:
+#ifdef CONVERGED_TDLS_ENABLE
+	lim_send_tdls_comp_mgmt_rsp(mac_ctx, eWNI_SME_TDLS_SEND_MGMT_RSP,
+		 result_code, send_req->sessionId,
+		 send_req->transactionId);
+#else
 	lim_send_sme_rsp(mac_ctx, eWNI_SME_TDLS_SEND_MGMT_RSP,
 	lim_send_sme_rsp(mac_ctx, eWNI_SME_TDLS_SEND_MGMT_RSP,
-			 result_code, send_req->sessionId,
-			 send_req->transactionId);
+		 result_code, send_req->sessionId,
+		 send_req->transactionId);
+#endif
 
 
 	return eSIR_SUCCESS;
 	return eSIR_SUCCESS;
 }
 }

+ 10 - 0
core/mac/src/pe/lim/lim_send_sme_rsp_messages.c

@@ -60,6 +60,9 @@
 #include "nan_datapath.h"
 #include "nan_datapath.h"
 #include "lim_assoc_utils.h"
 #include "lim_assoc_utils.h"
 
 
+#include "wlan_tdls_tgt_api.h"
+
+
 static void lim_handle_join_rsp_status(tpAniSirGlobal mac_ctx,
 static void lim_handle_join_rsp_status(tpAniSirGlobal mac_ctx,
 	tpPESession session_entry, tSirResultCodes result_code,
 	tpPESession session_entry, tSirResultCodes result_code,
 	tpSirSmeJoinRsp sme_join_rsp);
 	tpSirSmeJoinRsp sme_join_rsp);
@@ -1305,8 +1308,15 @@ lim_send_sme_mgmt_tx_completion(tpAniSirGlobal pMac,
 	mmhMsg.bodyptr = pSirMgmtTxCompletionInd;
 	mmhMsg.bodyptr = pSirMgmtTxCompletionInd;
 	mmhMsg.bodyval = 0;
 	mmhMsg.bodyval = 0;
 
 
+#ifdef CONVERGED_TDLS_ENABLE
+	pSirMgmtTxCompletionInd->psoc = pMac->psoc;
+	mmhMsg.callback = tgt_tdls_send_mgmt_tx_completion;
+	scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &mmhMsg);
+	return;
+#else
 	lim_sys_process_mmh_msg_api(pMac, &mmhMsg, ePROT);
 	lim_sys_process_mmh_msg_api(pMac, &mmhMsg, ePROT);
 	return;
 	return;
+#endif
 } /*** end lim_send_sme_tdls_delete_all_peer_ind() ***/
 } /*** end lim_send_sme_tdls_delete_all_peer_ind() ***/
 
 
 void lim_send_sme_tdls_event_notify(tpAniSirGlobal pMac, uint16_t msgType,
 void lim_send_sme_tdls_event_notify(tpAniSirGlobal pMac, uint16_t msgType,