Browse Source

qcacld-3.0: Process connect request for connection manager

Process connect request in LIM for connection manager.

Change-Id: I12b2f174751b17271667cba1347a44dd52782420
CRs-Fixed: 2856458
gaurank kathpalia 4 years ago
parent
commit
5b8392f96c

+ 0 - 12
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -4591,12 +4591,6 @@ QDF_STATUS mlme_get_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	if (*len < mlme_priv->opr_rate_set.len) {
-		mlme_legacy_err("Invalid len %zd, opr_rate len %zd",
-				*len, mlme_priv->opr_rate_set.len);
-		return QDF_STATUS_E_INVAL;
-	}
-
 	*len = mlme_priv->opr_rate_set.len;
 	qdf_mem_copy(dst, mlme_priv->opr_rate_set.data, *len);
 
@@ -4647,12 +4641,6 @@ QDF_STATUS mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	if (*len < mlme_priv->ext_opr_rate_set.len) {
-		mlme_legacy_err("Invalid len %zd, ext_opr_rate len %zd",
-				*len, mlme_priv->ext_opr_rate_set.len);
-		return QDF_STATUS_E_INVAL;
-	}
-
 	*len = mlme_priv->ext_opr_rate_set.len;
 	qdf_mem_copy(dst, mlme_priv->ext_opr_rate_set.data, *len);
 

+ 1 - 1
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c

@@ -75,7 +75,7 @@ cm_handle_disconnect_req(struct wlan_objmgr_vdev *vdev,
 
 	pdev = wlan_vdev_get_pdev(vdev);
 	if (!pdev) {
-		mlme_err("vdev_id: %d pdev not found", vdev_id);
+		mlme_err("vdev_id: %d pdev not found", req->req.vdev_id);
 		return QDF_STATUS_E_INVAL;
 	}
 	rso_cfg = wlan_cm_get_rso_config(vdev);

+ 15 - 1
core/hdd/src/wlan_hdd_cm_connect.c

@@ -43,6 +43,7 @@
 #include "wlan_blm_ucfg_api.h"
 #include "wlan_hdd_scan.h"
 #include <enet.h>
+#include <wlan_mlme_twt_ucfg_api.h>
 
 #ifdef FEATURE_CM_ENABLE
 bool hdd_cm_is_vdev_associated(struct hdd_adapter *adapter)
@@ -897,6 +898,7 @@ hdd_cm_connect_success_post_user_update(struct wlan_objmgr_vdev *vdev,
 	struct vdev_mlme_obj *mlme_obj = wlan_vdev_mlme_get_cmpt_obj(vdev);
 	uint8_t uapsd_mask =
 		mlme_obj->ext_vdev_ptr->connect_info.uapsd_per_ac_bitmask;
+	bool is_auth_required = true;
 
 	qdf_runtime_pm_allow_suspend(&hdd_ctx->runtime_context.connect);
 	hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_CONNECT);
@@ -905,7 +907,16 @@ hdd_cm_connect_success_post_user_update(struct wlan_objmgr_vdev *vdev,
 			       sta_ctx->conn_info.chan_freq);
 	hdd_wmm_assoc(adapter, false, uapsd_mask);
 
-	hdd_roam_register_sta(adapter, &rsp->bssid, false);
+	if (sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_NONE ||
+	    sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_OPEN_SYSTEM ||
+	    sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_SHARED_KEY ||
+	    sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_FILS_SHA256 ||
+	    sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_FILS_SHA384 ||
+	    sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_FT_FILS_SHA256 ||
+	    sta_ctx->conn_info.auth_type == eCSR_AUTH_TYPE_FT_FILS_SHA384)
+		is_auth_required = false;
+
+	hdd_roam_register_sta(adapter, &rsp->bssid, is_auth_required);
 
 	hdd_debug("Enabling queues");
 	hdd_cm_netif_queue_enable(adapter);
@@ -916,6 +927,9 @@ hdd_cm_connect_success_post_user_update(struct wlan_objmgr_vdev *vdev,
 		/* Inform FTM TIME SYNC about the connection with AP */
 		hdd_ftm_time_sync_sta_state_notify(adapter,
 						   FTM_TIME_SYNC_STA_CONNECTED);
+		ucfg_mlme_init_twt_context(hdd_ctx->psoc,
+					   &rsp->bssid,
+					   WLAN_ALL_SESSIONS_DIALOG_ID);
 	}
 	hdd_periodic_sta_stats_start(adapter);
 }

+ 1 - 2
core/mac/src/pe/include/lim_global.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2021 The Linux Foundation. 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
@@ -160,7 +160,6 @@ typedef struct sLimMlmAuthReq {
 } tLimMlmAuthReq, *tpLimMlmAuthReq;
 
 typedef struct sLimMlmJoinReq {
-	tSirMacRateSet operationalRateSet;
 	uint8_t sessionId;
 	struct bss_description bssDescription;
 	/*

File diff suppressed because it is too large
+ 606 - 610
core/mac/src/pe/lim/lim_process_sme_req_messages.c


+ 6 - 6
core/mac/src/pe/lim/lim_send_sme_rsp_messages.c

@@ -426,8 +426,8 @@ void lim_cm_send_connect_rsp(struct mac_context *mac_ctx,
 	msg.flush_callback = lim_cm_flush_connect_rsp;
 
 	status = scheduler_post_message(QDF_MODULE_ID_PE,
-					QDF_MODULE_ID_SME,
-					QDF_MODULE_ID_SME, &msg);
+					QDF_MODULE_ID_OS_IF,
+					QDF_MODULE_ID_OS_IF, &msg);
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 		pe_err("vdev_id: %d cm_id 0x%x : msg post fails",
@@ -1025,8 +1025,8 @@ static void lim_send_sta_disconnect_ind(struct mac_context *mac,
 	ind_msg.type = msg->type;
 	qdf_mem_free(msg->bodyptr);
 
-	status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_SME,
-					QDF_MODULE_ID_SME, &ind_msg);
+	status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_OS_IF,
+					QDF_MODULE_ID_OS_IF, &ind_msg);
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 		pe_err("vdev_id: %d, source %d, reason %d, type %d msg post fails",
@@ -1053,8 +1053,8 @@ void lim_cm_send_disconnect_rsp(struct mac_context *mac_ctx, uint8_t vdev_id)
 	rsp_msg.bodyptr = rsp;
 	rsp_msg.callback = cm_handle_disconnect_resp;
 
-	status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_SME,
-					QDF_MODULE_ID_SME, &rsp_msg);
+	status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_OS_IF,
+					QDF_MODULE_ID_OS_IF, &rsp_msg);
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 		pe_err("Failed to post disconnect rsp to sme vdev_id %d",

+ 90 - 17
core/sme/src/csr/csr_api_roam.c

@@ -4254,18 +4254,13 @@ static QDF_STATUS csr_set_qos_to_cfg(struct mac_context *mac, uint32_t sessionId
 	return status;
 }
 
-#ifndef FEATURE_CM_ENABLE
 static QDF_STATUS csr_get_rate_set(struct mac_context *mac,
-				   struct csr_roam_profile *pProfile,
-				   eCsrPhyMode phyMode,
-				   struct bss_description *bss_desc,
 				   tDot11fBeaconIEs *pIes,
 				   tSirMacRateSet *pOpRateSet,
 				   tSirMacRateSet *pExRateSet)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	int i;
-	enum csr_cfgdot11mode cfgDot11Mode;
 	uint8_t *pDstRate;
 	uint16_t rateBitmap = 0;
 
@@ -4278,8 +4273,6 @@ static QDF_STATUS csr_get_rate_set(struct mac_context *mac,
 		return status;
 	}
 
-	csr_is_phy_mode_match(mac, phyMode, bss_desc, pProfile,
-			      &cfgDot11Mode, pIes);
 	/*
 	 * Originally, we thought that for 11a networks, the 11a rates
 	 * are always in the Operational Rate set & for 11b and 11g
@@ -4329,7 +4322,6 @@ static QDF_STATUS csr_get_rate_set(struct mac_context *mac,
 		status = QDF_STATUS_SUCCESS;
 	return status;
 }
-#endif
 
 static void csr_set_cfg_rate_set(struct mac_context *mac, eCsrPhyMode phyMode,
 				 struct csr_roam_profile *pProfile,
@@ -13821,6 +13813,12 @@ QDF_STATUS cm_csr_handle_connect_req(struct wlan_objmgr_vdev *vdev,
 {
 	struct mac_context *mac_ctx;
 	uint8_t vdev_id = wlan_vdev_get_id(vdev);
+	tSirMacRateSet op_rate_set;
+	tSirMacRateSet ext_rate_set;
+	QDF_STATUS status;
+	tDot11fBeaconIEs *ie_struct;
+	struct bss_description *bss_desc;
+	uint32_t ie_len, bss_len;
 
 	/*
 	 * This API is to update legacy struct and should be removed once
@@ -13832,6 +13830,46 @@ QDF_STATUS cm_csr_handle_connect_req(struct wlan_objmgr_vdev *vdev,
 	if (!mac_ctx)
 		return QDF_STATUS_E_INVAL;
 
+	ie_len = util_scan_entry_ie_len(join_req->entry);
+	bss_len = (uint16_t)(offsetof(struct bss_description,
+			   ieFields[0]) + ie_len);
+
+	bss_desc = qdf_mem_malloc(sizeof(*bss_desc) + bss_len);
+	if (!bss_desc)
+		return QDF_STATUS_E_NOMEM;
+
+	status = wlan_fill_bss_desc_from_scan_entry(mac_ctx, bss_desc,
+						    join_req->entry);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		qdf_mem_free(bss_desc);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	status = wlan_get_parsed_bss_description_ies(mac_ctx, bss_desc,
+						     &ie_struct);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		sme_err("IE parsing failed vdev id %d", wlan_vdev_get_id(vdev));
+		qdf_mem_free(bss_desc);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	status = csr_get_rate_set(mac_ctx, ie_struct, &op_rate_set,
+				  &ext_rate_set);
+
+	if (QDF_IS_STATUS_ERROR(status)) {
+		sme_err("Rates parsing failed vdev id %d",
+			wlan_vdev_get_id(vdev));
+		qdf_mem_free(ie_struct);
+		qdf_mem_free(bss_desc);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	qdf_mem_free(ie_struct);
+	qdf_mem_free(bss_desc);
+
+	mlme_set_opr_rate(vdev, op_rate_set.rate, op_rate_set.numRates);
+	mlme_set_ext_opr_rate(vdev, ext_rate_set.rate, ext_rate_set.numRates);
+
 	/* Fill join_req from legacy */
 	mac_ctx->mlme_cfg->sta.current_rssi = join_req->entry->rssi_raw;
 	csr_roam_state_change(mac_ctx, eCSR_ROAMING_STATE_JOINING, vdev_id);
@@ -14082,6 +14120,18 @@ purge_list:
 
 }
 
+#ifdef WLAN_FEATURE_FILS_SK
+static inline bool csr_cm_is_fils_connection(struct wlan_cm_connect_resp *resp)
+{
+	return resp->is_fils_connection;
+}
+#else
+static inline bool csr_cm_is_fils_connection(struct wlan_cm_connect_resp *resp)
+{
+	return false;
+}
+#endif
+
 QDF_STATUS cm_csr_connect_rsp(struct wlan_objmgr_vdev *vdev,
 			      struct cm_vdev_join_rsp *rsp)
 {
@@ -14103,7 +14153,7 @@ QDF_STATUS cm_csr_connect_rsp(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_INVAL;
 
 	session = CSR_GET_SESSION(mac_ctx, vdev_id);
-	if (!session || CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
+	if (!session || !CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
 		sme_err("session not found for vdev_id %d", vdev_id);
 		return QDF_STATUS_E_INVAL;
 	}
@@ -14119,6 +14169,11 @@ QDF_STATUS cm_csr_connect_rsp(struct wlan_objmgr_vdev *vdev,
 	return QDF_STATUS_SUCCESS;
 }
 
+static inline bool cm_is_fils_connection(struct wlan_cm_connect_resp *resp)
+{
+	return resp->is_fils_connection;
+}
+
 QDF_STATUS
 cm_csr_connect_done_ind(struct wlan_objmgr_vdev *vdev,
 			struct wlan_cm_connect_resp *rsp)
@@ -14141,7 +14196,7 @@ cm_csr_connect_done_ind(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_INVAL;
 
 	session = CSR_GET_SESSION(mac_ctx, vdev_id);
-	if (!session || CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
+	if (!session || !CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
 		sme_err("session not found for vdev_id %d", vdev_id);
 		return QDF_STATUS_E_INVAL;
 	}
@@ -14156,7 +14211,6 @@ cm_csr_connect_done_ind(struct wlan_objmgr_vdev *vdev,
 
 		return QDF_STATUS_SUCCESS;
 	}
-	/* start wait for key timer */
 	/*
 	 * For open mode authentication, send dummy install key response to
 	 * send OBSS scan and QOS event.
@@ -14187,6 +14241,21 @@ cm_csr_connect_done_ind(struct wlan_objmgr_vdev *vdev,
 				vdev_id);
 	}
 	csr_roam_state_change(mac_ctx, eCSR_ROAMING_STATE_JOINED, vdev_id);
+
+	if (csr_cm_is_fils_connection(rsp) || !ucast_cipher ||
+	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_NONE) ==
+			  ucast_cipher ||
+	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP_40) ||
+	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP_104) ||
+	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP)) {
+		csr_roam_substate_change(mac_ctx, eCSR_ROAM_SUBSTATE_NONE,
+					 vdev_id);
+	} else {
+		csr_roam_substate_change(mac_ctx,
+					 eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY,
+					 vdev_id);
+		/* start wait for key timer. */
+	}
 	/* Fill legacy structures from resp for success */
 
 	return QDF_STATUS_SUCCESS;
@@ -14209,13 +14278,19 @@ QDF_STATUS cm_csr_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_INVAL;
 
 	session = CSR_GET_SESSION(mac_ctx, vdev_id);
-	if (!session || CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
+	if (!session || !CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
 		sme_err("session not found for vdev_id %d", vdev_id);
 		return QDF_STATUS_E_INVAL;
 	}
 
+	if (CSR_IS_WAIT_FOR_KEY(mac_ctx, vdev_id)) {
+		sme_debug("Stop Wait for key timer and change substate to eCSR_ROAM_SUBSTATE_NONE");
+		/* stop wait for key timer */
+		csr_roam_substate_change(mac_ctx, eCSR_ROAM_SUBSTATE_NONE,
+					 vdev_id);
+	}
+
 	/* Fill join_req from legacy */
-	/* stop wait for key timer */
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -14237,7 +14312,7 @@ QDF_STATUS cm_csr_handle_diconnect_req(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_INVAL;
 
 	session = CSR_GET_SESSION(mac_ctx, vdev_id);
-	if (!session || CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
+	if (!session || !CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
 		sme_err("session not found for vdev_id %d", vdev_id);
 		return QDF_STATUS_E_INVAL;
 	}
@@ -14718,9 +14793,7 @@ QDF_STATUS csr_send_join_req_msg(struct mac_context *mac, uint32_t sessionId,
 			pProfile->force_24ghz_in_ht20;
 		pSession->uapsd_mask = pProfile->uapsd_mask;
 		status =
-			csr_get_rate_set(mac, pProfile,
-					 (eCsrPhyMode) pProfile->phyMode,
-					 pBssDescription, pIes, &OpRateSet,
+			csr_get_rate_set(mac, pIes, &OpRateSet,
 					 &ExRateSet);
 		if (!csr_enable_twt(mac, pIes))
 			ps_param->uapsd_per_ac_bit_mask = pProfile->uapsd_mask;

Some files were not shown because too many files changed in this diff