Parcourir la source

qcacmn: Replace wlan_cm_roam_resp struct with wlan_cm_connect_resp

Structure wlan_cm_roam_resp and wlan_cm_connect_resp are identical
structures and in current code these structures are used for connect
and reassoc functionalities with different functions as these are
identical structures and only one structure can be used to reduce
the duplication of the code.

To address this code duplication issue replace wlan_cm_roam_resp
structure with wlan_cm_connect_resp.

Change-Id: I90949c25f46acd2fa78cebb70c9a04f0718b90c4
CRs-Fixed: 2875232
Ashish Kumar Dhanotiya il y a 4 ans
Parent
commit
ad9b0c99d0

+ 5 - 38
os_if/linux/mlme/inc/osif_cm_util.h

@@ -183,22 +183,6 @@ typedef QDF_STATUS (*osif_cm_set_hlp_data_cb)(struct net_device *dev,
 					      struct wlan_cm_connect_resp *rsp);
 #endif
 
-/**
- * typedef osif_cm_reassoc_comp_cb  - Reassoc complete callback
- * @vdev: vdev pointer
- * @rsp: Reassoc response
- * @type: indicates update type
- *
- * This callback indicates reassoc complete to the legacy module
- *
- * Context: Any context.
- * Return: QDF_STATUS
- */
-typedef QDF_STATUS
-	(*osif_cm_reassoc_comp_cb)(struct wlan_objmgr_vdev *vdev,
-				   struct wlan_cm_roam_resp *rsp,
-				   enum osif_cb_type type);
-
 /**
  * typedef  osif_cm_disconnect_comp_cb: Disonnect complete callback
  * @vdev: vdev pointer
@@ -261,19 +245,18 @@ void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev,
 
 /**
  * osif_cm_ops: connection manager legacy callbacks
- * osif_cm_connect_comp_cb: callback for connect complete to legacy
+ * @osif_cm_connect_comp_cb: callback for connect complete to legacy
  * modules
- *  osif_cm_disconnect_comp_cb: callback for disconnect complete to
+ * @osif_cm_disconnect_comp_cb: callback for disconnect complete to
  * legacy modules
- * osif_cm_reassoc_comp_cb: callback for reassoc complete to legacy
- * modules
- * osif_cm_netif_queue_ctrl_cb: callback to legacy module to take
+ * @osif_cm_netif_queue_ctrl_cb: callback to legacy module to take
  * actions on netif queue
+ * @save_gtk_cb : callback to legacy module to save gtk
+ * @set_hlp_data_cb: callback to legacy module to save hlp data
  */
 struct osif_cm_ops {
 	osif_cm_connect_comp_cb connect_complete_cb;
 	osif_cm_disconnect_comp_cb disconnect_complete_cb;
-	osif_cm_reassoc_comp_cb reassoc_complete_cb;
 #ifdef CONN_MGR_ADV_FEATURE
 	osif_cm_netif_queue_ctrl_cb netif_queue_control_cb;
 #endif
@@ -299,22 +282,6 @@ QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
 				    struct wlan_cm_connect_resp *rsp,
 				    enum osif_cb_type type);
 
-/**
- * osif_cm_reassoc_comp_ind() - Function to indicate reassoc
- * complete to legacy module
- * @vdev: vdev pointer
- * @rsp: Roam response
- * @type: indicates update type
- *
- * This function indicates connect complete to the legacy module
- *
- * Context: Any context.
- * Return: QDF_STATUS
- */
-QDF_STATUS osif_cm_reassoc_comp_ind(struct wlan_objmgr_vdev *vdev,
-				    struct wlan_cm_roam_resp *rsp,
-				    enum osif_cb_type type);
-
 /**
  * osif_cm_disconnect_comp_ind() - Function to indicate disconnect
  * complete to legacy module

+ 27 - 41
os_if/linux/mlme/src/osif_cm_connect_rsp.c

@@ -30,18 +30,9 @@
 #include "wlan_cfg80211_scan.h"
 
 #ifdef CONN_MGR_ADV_FEATURE
-/**
- * osif_cm_get_assoc_req_ie_data() - Get the assoc req IE offset and length
- * if valid assoc req is present
- * @assoc_req: assoc req info
- * @ie_data_len: IE date length to be calculated
- * @ie_data_ptr: IE data pointer to be calculated
- *
- * Return: void
- */
-static void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
-					  size_t *ie_data_len,
-					  const uint8_t **ie_data_ptr)
+void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
+				   size_t *ie_data_len,
+				   const uint8_t **ie_data_ptr)
 {
 	/* Validate IE and length */
 	if (!assoc_req->len || !assoc_req->ptr ||
@@ -52,18 +43,9 @@ static void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
 	*ie_data_ptr = assoc_req->ptr + WLAN_ASSOC_REQ_IES_OFFSET;
 }
 
-/**
- * osif_cm_get_assoc_rsp_ie_data() - Get the assoc resp IE offset and length
- * if valid assoc req is present
- * @assoc_req: assoc req info
- * @ie_data_len: IE date length to be calculated
- * @ie_data_ptr: IE data pointer to be calculated
- *
- * Return: void
- */
-static void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
-					  size_t *ie_data_len,
-					  const uint8_t **ie_data_ptr)
+void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
+				   size_t *ie_data_len,
+				   const uint8_t **ie_data_ptr)
 {
 	/* Validate IE and length */
 	if (!assoc_rsp->len || !assoc_rsp->ptr ||
@@ -76,17 +58,17 @@ static void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
 
 #else
 
-static void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
-					  size_t *ie_data_len,
-					  const uint8_t **ie_data_ptr)
+void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
+				   size_t *ie_data_len,
+				   const uint8_t **ie_data_ptr)
 {
 	*ie_data_len = assoc_req->len;
 	*ie_data_ptr = assoc_req->ptr;
 }
 
-static void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
-					  size_t *ie_data_len,
-					  const uint8_t **ie_data_ptr)
+void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
+				   size_t *ie_data_len,
+				   const uint8_t **ie_data_ptr)
 {
 	*ie_data_len = assoc_rsp->len;
 	*ie_data_ptr = assoc_rsp->ptr;
@@ -111,20 +93,21 @@ osif_validate_connect_and_reset_src_id(struct vdev_osif_priv *osif_priv,
 				       struct wlan_cm_connect_resp *rsp)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
 	/*
-	 * Send to kernel only if last osif cookie match and
-	 * source is CM_OSIF_CONNECT or CM_OSIF_CFG_CONNECT with failure
-	 * else drop. If cookie match reset the cookie and source.
+	 * Do not send to kernel if last osif cookie doesnt match or
+	 * or source is CM_OSIF_CFG_CONNECT with success status.
+	 * If cookie matches reset the cookie and source.
 	 */
 	qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
 	if (rsp->cm_id != osif_priv->cm_info.last_id ||
-	    (osif_priv->cm_info.last_source != CM_OSIF_CONNECT &&
-	    !(osif_priv->cm_info.last_source == CM_OSIF_CFG_CONNECT &&
-	    QDF_IS_STATUS_ERROR(rsp->connect_status)))) {
-		osif_debug("Ignore as cm_id(0x%x)/src(%d) didn't match stored cm_id(0x%x)/src(%d)",
+	    (osif_priv->cm_info.last_source == CM_OSIF_CFG_CONNECT &&
+	     QDF_IS_STATUS_SUCCESS(rsp->connect_status))) {
+		osif_debug("Ignore as cm_id(0x%x)/src(%d) != cm_id(0x%x)/src(%d) OR source is CFG connect with status %d",
 			   rsp->cm_id, CM_OSIF_CONNECT,
 			   osif_priv->cm_info.last_id,
-			   osif_priv->cm_info.last_source);
+			   osif_priv->cm_info.last_source,
+			   rsp->connect_status);
 		status = QDF_STATUS_E_INVAL;
 		goto rel_lock;
 	}
@@ -567,13 +550,13 @@ QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
 	struct vdev_osif_priv *osif_priv  = wlan_vdev_get_ospriv(vdev);
 	QDF_STATUS status;
 
-	osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Connect with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id 0x%x cm_reason %d status_code %d",
+	osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Connect with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id 0x%x cm_reason %d status_code %d is_reassoc %d",
 		       osif_priv->wdev->netdev->name, rsp->vdev_id,
 		       QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)),
 		       QDF_MAC_ADDR_REF(rsp->bssid.bytes),
 		       rsp->ssid.length, rsp->ssid.ssid,
 		       rsp->connect_status ? "FAILURE" : "SUCCESS", rsp->cm_id,
-		       rsp->reason, rsp->status_code);
+		       rsp->reason, rsp->status_code, rsp->is_reassoc);
 
 	osif_check_and_unlink_bss(vdev, osif_priv, rsp);
 
@@ -584,7 +567,10 @@ QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
 	}
 
 	osif_cm_connect_comp_ind(vdev, rsp, OSIF_PRE_USERSPACE_UPDATE);
-	osif_indcate_connect_results(vdev, osif_priv, rsp);
+	if (rsp->is_reassoc)
+		osif_indicate_reassoc_results(vdev, osif_priv, rsp);
+	else
+		osif_indcate_connect_results(vdev, osif_priv, rsp);
 	osif_cm_connect_comp_ind(vdev, rsp, OSIF_POST_USERSPACE_UPDATE);
 
 	return QDF_STATUS_SUCCESS;

+ 78 - 51
os_if/linux/mlme/src/osif_cm_roam_rsp.c

@@ -29,67 +29,94 @@
 #include <wlan_cfg80211.h>
 #include <wlan_cfg80211_scan.h>
 
-static QDF_STATUS
-osif_validate_reassoc_and_reset_src_id(struct vdev_osif_priv *osif_priv,
-				       wlan_cm_id cm_id)
+#ifdef CONN_MGR_ADV_FEATURE
+#ifdef WLAN_FEATURE_FILS_SK
+static inline void osif_update_fils_hlp_data(struct net_device *dev,
+					     struct wlan_objmgr_vdev *vdev,
+					     struct wlan_cm_connect_resp *rsp)
 {
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
-
-	qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
-	if (cm_id != osif_priv->cm_info.last_id) {
-		osif_debug("Ignore as cm_id(%d) didn't match stored cm_id(%d)",
-			   cm_id, osif_priv->cm_info.last_id);
-		status = QDF_STATUS_E_INVAL;
-		goto rel_lock;
-	}
-	osif_cm_reset_id_and_src_no_lock(osif_priv);
-
-rel_lock:
-	qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock);
-
-	return status;
+	if (rsp->connect_ies.fils_ie && rsp->connect_ies.fils_ie->hlp_data_len)
+		osif_cm_set_hlp_data(dev, vdev, rsp);
 }
+#else
+static inline void osif_update_fils_hlp_data(struct net_device *dev,
+					     struct wlan_objmgr_vdev *vdev,
+					     struct wlan_cm_connect_resp *rsp)
+{
+}
+#endif
 
-#ifdef CONN_MGR_ADV_FEATURE
-static void osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
-					  struct vdev_osif_priv *osif_priv,
-					  struct wlan_cm_roam_resp *rsp)
+/**
+ * osif_roamed_ind() - send roamed indication to cfg80211
+ * @dev: network device
+ * @bss: cfg80211 roamed bss pointer
+ * @req_ie: IEs used in reassociation request
+ * @req_ie_len: Length of the @req_ie
+ * @resp_ie: IEs received in successful reassociation response
+ * @resp_ie_len: Length of @resp_ie
+ *
+ * Return: none
+ */
+#if defined CFG80211_ROAMED_API_UNIFIED || \
+	(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))
+static void osif_roamed_ind(struct net_device *dev, struct cfg80211_bss *bss,
+			    const uint8_t *req_ie,
+			    size_t req_ie_len, const uint8_t *resp_ie,
+			    size_t resp_ie_len)
 {
-	/*
-	 * To notify kernel on connection completion
-	 */
+	struct cfg80211_roam_info info = {0};
+
+	info.bss = bss;
+	info.req_ie = req_ie;
+	info.req_ie_len = req_ie_len;
+	info.resp_ie = resp_ie;
+	info.resp_ie_len = resp_ie_len;
+	cfg80211_roamed(dev, &info, GFP_KERNEL);
 }
 #else
-static void osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
-					  struct vdev_osif_priv *osif_priv,
-					  struct wlan_cm_roam_resp *rsp)
-{}
+static inline void osif_roamed_ind(struct net_device *dev,
+				   struct cfg80211_bss *bss,
+				   const uint8_t *req_ie, size_t req_ie_len,
+				   const uint8_t *resp_ie,
+				   size_t resp_ie_len)
+{
+	cfg80211_roamed_bss(dev, bss, req_ie, req_ie_len, resp_ie, resp_ie_len,
+			    GFP_KERNEL);
+}
 #endif
 
-QDF_STATUS osif_reassoc_handler(struct wlan_objmgr_vdev *vdev,
-				struct wlan_cm_roam_resp *rsp)
+void osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
+				   struct vdev_osif_priv *osif_priv,
+				   struct wlan_cm_connect_resp *rsp)
 {
-	struct vdev_osif_priv *osif_priv  = wlan_vdev_get_ospriv(vdev);
-	QDF_STATUS status;
-	enum wlan_cm_source source;
+	struct net_device *dev = osif_priv->wdev->netdev;
+	size_t req_len = 0;
+	const uint8_t *req_ie = NULL;
+	size_t rsp_len = 0;
+	const uint8_t *rsp_ie = NULL;
+	struct cfg80211_bss *bss;
+	struct ieee80211_channel *chan;
+
+	if (QDF_IS_STATUS_ERROR(rsp->connect_status))
+		return;
 
-	osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Roam with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id %d cm_reason %d status_code %d",
-		       osif_priv->wdev->netdev->name, rsp->vdev_id,
-		       QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)),
-		       QDF_MAC_ADDR_REF(rsp->bssid.bytes),
-		       rsp->ssid.length, rsp->ssid.ssid,
-		       rsp->reassoc_status ? "FAILURE" : "SUCCESS", rsp->cm_id,
-		       rsp->reason, rsp->status_code);
-	source = osif_priv->cm_info.last_source;
-	status = osif_validate_reassoc_and_reset_src_id(osif_priv, rsp->cm_id);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		osif_cm_reassoc_comp_ind(vdev, rsp, OSIF_NOT_HANDLED);
-		return status;
-	}
+	chan = ieee80211_get_channel(osif_priv->wdev->wiphy,
+				     rsp->freq);
+	bss = wlan_cfg80211_get_bss(osif_priv->wdev->wiphy, chan,
+				    rsp->bssid.bytes, rsp->ssid.ssid,
+				    rsp->ssid.length);
+	if (!bss)
+		osif_warn("not able to find bss");
+	osif_cm_get_assoc_req_ie_data(&rsp->connect_ies.assoc_req,
+				      &req_len, &req_ie);
+	osif_cm_get_assoc_rsp_ie_data(&rsp->connect_ies.assoc_rsp,
+				      &rsp_len, &rsp_ie);
+	osif_roamed_ind(dev, bss, req_ie, req_len, rsp_ie, rsp_len);
 
-	osif_cm_reassoc_comp_ind(vdev, rsp, OSIF_PRE_USERSPACE_UPDATE);
-	osif_indicate_reassoc_results(vdev, osif_priv, rsp);
-	osif_cm_reassoc_comp_ind(vdev, rsp, OSIF_POST_USERSPACE_UPDATE);
+	osif_cm_save_gtk(vdev, rsp);
 
-	return QDF_STATUS_SUCCESS;
+	/* Add osif_send_roam_auth_event (wlan_hdd_send_roam_auth_event) */
+
+	osif_update_fils_hlp_data(dev, vdev, rsp);
 }
+#endif

+ 40 - 4
os_if/linux/mlme/src/osif_cm_rsp.h

@@ -43,6 +43,32 @@
 QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
 				   struct wlan_cm_discon_rsp *rsp);
 
+/**
+ * osif_cm_get_assoc_req_ie_data() - Get the assoc req IE offset and length
+ * if valid assoc req is present
+ * @assoc_req: assoc req info
+ * @ie_data_len: IE date length to be calculated
+ * @ie_data_ptr: IE data pointer to be calculated
+ *
+ * Return: void
+ */
+void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
+				   size_t *ie_data_len,
+				   const uint8_t **ie_data_ptr);
+
+/**
+ * osif_cm_get_assoc_rsp_ie_data() - Get the assoc resp IE offset and length
+ * if valid assoc req is present
+ * @assoc_req: assoc req info
+ * @ie_data_len: IE date length to be calculated
+ * @ie_data_ptr: IE data pointer to be calculated
+ *
+ * Return: void
+ */
+void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
+				   size_t *ie_data_len,
+				   const uint8_t **ie_data_ptr);
+
 /**
  * osif_connect_handler() - API to send connect response to kernel
  * @vdev: vdev pointer
@@ -56,18 +82,28 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
 				struct wlan_cm_connect_resp *rsp);
 
+#ifdef CONN_MGR_ADV_FEATURE
 /**
- * osif_reassoc_handler() - API to send reassoc response to kernel
+ * osif_indicate_reassoc_results() - API to send reassoc response to kernel
  * @vdev: vdev pointer
- * @rsp: Connection manager reassoc response
+ * @osif_priv: OS private structure of vdev
+ * @rsp: Connection manager response
  *
  * The API is used to send reassoc response to kernel
  *
  * Context: Any context.
  * Return: QDF_STATUS
  */
-QDF_STATUS osif_reassoc_handler(struct wlan_objmgr_vdev *vdev,
-				struct wlan_cm_roam_resp *rsp);
+void osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
+				   struct vdev_osif_priv *osif_priv,
+				   struct wlan_cm_connect_resp *rsp);
+#else
+static inline void
+osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
+			      struct vdev_osif_priv *osif_priv,
+			      struct wlan_cm_connect_resp *rsp)
+{}
+#endif
 
 /**
  * osif_failed_candidate_handler() - API to indicate individual candidate

+ 0 - 30
os_if/linux/mlme/src/osif_cm_util.c

@@ -198,20 +198,6 @@ osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev,
 	return osif_connect_handler(vdev, rsp);
 }
 
-/**
- * osif_cm_reassoc_complete_cb() - Reassoc complete callback
- * @vdev: vdev pointer
- * @rsp: Reassoc response
- *
- * Return: QDF_STATUS
- */
-static QDF_STATUS
-osif_cm_reassoc_complete_cb(struct wlan_objmgr_vdev *vdev,
-			    struct wlan_cm_roam_resp *rsp)
-{
-	return osif_reassoc_handler(vdev, rsp);
-}
-
 /**
  * osif_cm_failed_candidate_cb() - Callback to indicate failed candidate
  * @vdev: vdev pointer
@@ -332,7 +318,6 @@ static struct mlme_cm_ops cm_ops = {
 	.mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb,
 	.mlme_cm_disconnect_complete_cb = osif_cm_disconnect_complete_cb,
 	.mlme_cm_disconnect_start_cb = osif_cm_disconnect_start_cb,
-	.mlme_cm_reassoc_complete_cb = osif_cm_reassoc_complete_cb,
 };
 
 /**
@@ -402,21 +387,6 @@ QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
 	return ret;
 }
 
-QDF_STATUS osif_cm_reassoc_comp_ind(struct wlan_objmgr_vdev *vdev,
-				    struct wlan_cm_roam_resp *rsp,
-				    enum osif_cb_type type)
-{
-	osif_cm_reassoc_comp_cb cb = NULL;
-	QDF_STATUS ret = QDF_STATUS_SUCCESS;
-
-	if (osif_cm_legacy_ops)
-		cb = osif_cm_legacy_ops->reassoc_complete_cb;
-	if (cb)
-		ret = cb(vdev, rsp, type);
-
-	return ret;
-}
-
 QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev,
 				       struct wlan_cm_discon_rsp *rsp,
 				       enum osif_cb_type type)

+ 3 - 0
umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h

@@ -857,6 +857,9 @@ enum wlan_status_code {
 #define PMKID_LEN 16
 #define MAX_PMK_LEN 64
 #define MAX_PMKID 4
+#define MAX_KEK_LENGTH 64
+#define MAX_KCK_LEN 32
+#define REPLAY_CTR_LEN 8
 
 #define WLAN_WPA_OUI 0xf25000
 #define WLAN_WPA_OUI_TYPE 0x01

+ 12 - 4
umac/mlme/connection_mgr/core/src/wlan_cm_connect.c

@@ -1562,6 +1562,7 @@ QDF_STATUS cm_connect_complete(struct cnx_mgr *cm_ctx,
 	enum wlan_cm_sm_state sm_state;
 	struct bss_info bss_info;
 	struct mlme_info mlme_info;
+	bool send_ind = true;
 
 	/*
 	 * If the entry is not present in the list, it must have been cleared
@@ -1579,10 +1580,17 @@ QDF_STATUS cm_connect_complete(struct cnx_mgr *cm_ctx,
 		cm_set_fils_wep_key(cm_ctx, resp);
 	}
 
-	mlme_cm_connect_complete_ind(cm_ctx->vdev, resp);
-	mlme_cm_osif_connect_complete(cm_ctx->vdev, resp);
-	cm_if_mgr_inform_connect_complete(cm_ctx->vdev, resp->connect_status);
-	cm_inform_blm_connect_complete(cm_ctx->vdev, resp);
+	/* In case of reassoc failure no need to inform osif/legacy/ifmanager */
+	if (resp->is_reassoc && QDF_IS_STATUS_ERROR(resp->connect_status))
+		send_ind = false;
+
+	if (send_ind) {
+		mlme_cm_connect_complete_ind(cm_ctx->vdev, resp);
+		mlme_cm_osif_connect_complete(cm_ctx->vdev, resp);
+		cm_if_mgr_inform_connect_complete(cm_ctx->vdev,
+						  resp->connect_status);
+		cm_inform_blm_connect_complete(cm_ctx->vdev, resp);
+	}
 
 	/* Update scan entry in case connect is success or fails with bssid */
 	if (!qdf_is_macaddr_zero(&resp->bssid)) {

+ 13 - 99
umac/mlme/connection_mgr/core/src/wlan_cm_host_roam.c

@@ -26,11 +26,11 @@
 
 static void
 cm_fill_roam_fail_resp_from_cm_id(struct cnx_mgr *cm_ctx,
-				  struct wlan_cm_roam_resp *resp,
+				  struct wlan_cm_connect_resp *resp,
 				  wlan_cm_id cm_id,
 				  enum wlan_cm_connect_fail_reason reason)
 {
-	resp->reassoc_status = QDF_STATUS_E_FAILURE;
+	resp->connect_status = QDF_STATUS_E_FAILURE;
 	resp->cm_id = cm_id;
 	resp->vdev_id = wlan_vdev_get_id(cm_ctx->vdev);
 	resp->reason = reason;
@@ -85,7 +85,7 @@ cm_send_reassoc_start_fail(struct cnx_mgr *cm_ctx,
 			   enum wlan_cm_connect_fail_reason reason,
 			   bool sync)
 {
-	struct wlan_cm_roam_resp *resp;
+	struct wlan_cm_connect_resp *resp;
 	QDF_STATUS status;
 
 	resp = qdf_mem_malloc(sizeof(*resp));
@@ -266,25 +266,11 @@ roam_err:
 }
 
 bool cm_roam_resp_cmid_match_list_head(struct cnx_mgr *cm_ctx,
-				       struct wlan_cm_roam_resp *resp)
+				       struct wlan_cm_connect_resp *resp)
 {
 	return cm_check_cmid_match_list_head(cm_ctx, &resp->cm_id);
 }
 
-static QDF_STATUS
-cm_inform_if_mgr_reassoc_complete(struct wlan_objmgr_vdev *vdev,
-				  QDF_STATUS status)
-{
-	return QDF_STATUS_SUCCESS;
-}
-
-static inline QDF_STATUS
-cm_inform_blm_reassoc_complete(struct wlan_objmgr_vdev *vdev,
-			       struct wlan_cm_roam_resp *resp)
-{
-	return QDF_STATUS_SUCCESS;
-}
-
 QDF_STATUS cm_reassoc_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
 {
 	struct cm_req *cm_req;
@@ -376,50 +362,9 @@ cm_resume_reassoc_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
 	return status;
 }
 
-static void
-cm_update_scan_db_on_reassoc_success(struct cnx_mgr *cm_ctx,
-				     struct wlan_cm_roam_resp *resp)
-{
-	struct element_info *bcn_probe_rsp;
-	struct cm_req *cm_req;
-	int32_t rssi;
-
-	if (!cm_is_vdev_connected(cm_ctx->vdev))
-		return;
-
-	cm_req = cm_get_req_by_cm_id(cm_ctx, resp->cm_id);
-	if (!cm_req || !cm_req->roam_req.cur_candidate)
-		return;
-
-	/*
-	 * Get beacon or probe resp from connect response, and if not present
-	 * use cur candidate to get beacon or probe resp
-	 */
-	if (resp->connect_ies.bcn_probe_rsp.ptr)
-		bcn_probe_rsp = &resp->connect_ies.bcn_probe_rsp;
-	else
-		bcn_probe_rsp =
-			&cm_req->roam_req.cur_candidate->entry->raw_frame;
-
-	rssi = cm_req->roam_req.cur_candidate->entry->rssi_raw;
-
-	cm_inform_bcn_probe(cm_ctx, bcn_probe_rsp->ptr, bcn_probe_rsp->len,
-			    resp->freq, rssi, resp->cm_id);
-}
-
-inline void cm_set_fils_wep_key_on_reassoc(struct cnx_mgr *cm_ctx,
-					   struct wlan_cm_roam_resp *resp)
-{
-}
-
 QDF_STATUS cm_reassoc_complete(struct cnx_mgr *cm_ctx,
-			       struct wlan_cm_roam_resp *resp)
+			       struct wlan_cm_connect_resp *resp)
 {
-	enum wlan_cm_sm_state sm_state;
-	struct bss_info bss_info;
-	struct mlme_info mlme_info;
-	struct wlan_objmgr_vdev *vdev = cm_ctx->vdev;
-
 	/*
 	 * If the entry is not present in the list, it must have been cleared
 	 * already.
@@ -427,45 +372,14 @@ QDF_STATUS cm_reassoc_complete(struct cnx_mgr *cm_ctx,
 	if (!cm_get_req_by_cm_id(cm_ctx, resp->cm_id))
 		return QDF_STATUS_SUCCESS;
 
-	sm_state = cm_get_state(cm_ctx);
-	if (QDF_IS_STATUS_ERROR(resp->reassoc_status))
-		goto reassoc_fail;
-
-	if (QDF_IS_STATUS_SUCCESS(resp->reassoc_status) &&
-	    sm_state == WLAN_CM_S_CONNECTED) {
-		cm_update_scan_db_on_reassoc_success(cm_ctx, resp);
-		cm_set_fils_wep_key_on_reassoc(cm_ctx, resp);
-	}
-
-	mlme_cm_reassoc_complete_ind(vdev, resp);
-	mlme_cm_osif_reassoc_complete(vdev, resp);
-	cm_inform_if_mgr_reassoc_complete(vdev, resp->reassoc_status);
-	cm_inform_blm_reassoc_complete(vdev, resp);
-
-reassoc_fail:
-	/* Update scan entry in case connect is success or fails with bssid */
-	if (!qdf_is_macaddr_zero(&resp->bssid)) {
-		if (QDF_IS_STATUS_SUCCESS(resp->reassoc_status))
-			mlme_info.assoc_state  = SCAN_ENTRY_CON_STATE_ASSOC;
-		else
-			mlme_info.assoc_state = SCAN_ENTRY_CON_STATE_NONE;
-		qdf_copy_macaddr(&bss_info.bssid, &resp->bssid);
-		bss_info.freq = resp->freq;
-		bss_info.ssid.length = resp->ssid.length;
-		qdf_mem_copy(&bss_info.ssid.ssid, resp->ssid.ssid,
-			     bss_info.ssid.length);
-		wlan_scan_update_mlme_by_bssinfo(
-					wlan_vdev_get_pdev(vdev),
-					&bss_info, &mlme_info);
-	}
-	cm_remove_cmd(cm_ctx, &resp->cm_id);
-
+	resp->is_reassoc = true;
+	cm_connect_complete(cm_ctx, resp);
 	/*
 	 * If roaming fails and conn_sm is in ROAMING state, then
 	 * initiate disconnect to cleanup and move conn_sm to INIT state
 	 */
-	if (QDF_IS_STATUS_ERROR(resp->reassoc_status) &&
-	    sm_state == WLAN_CM_S_ROAMING) {
+	if (QDF_IS_STATUS_ERROR(resp->connect_status) &&
+	    cm_get_state(cm_ctx) == WLAN_CM_S_ROAMING) {
 		cm_reassoc_fail_disconnect(cm_ctx->vdev, CM_ROAM_DISCONNECT,
 					   REASON_UNSPEC_FAILURE,
 					   &resp->bssid);
@@ -477,7 +391,7 @@ reassoc_fail:
 static void
 cm_reassoc_handle_event_post_fail(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id)
 {
-	struct wlan_cm_roam_resp *resp;
+	struct wlan_cm_connect_resp *resp;
 
 	resp = qdf_mem_malloc(sizeof(*resp));
 	if (!resp)
@@ -492,7 +406,7 @@ cm_reassoc_handle_event_post_fail(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id)
 static QDF_STATUS cm_reassoc_cmd_timeout(struct cnx_mgr *cm_ctx,
 					 wlan_cm_id cm_id)
 {
-	struct wlan_cm_roam_resp *resp;
+	struct wlan_cm_connect_resp *resp;
 	QDF_STATUS status;
 
 	resp = qdf_mem_malloc(sizeof(*resp));
@@ -710,7 +624,7 @@ QDF_STATUS cm_reassoc_start(struct cnx_mgr *cm_ctx,
 }
 
 QDF_STATUS cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
-			  struct wlan_cm_roam_resp *resp)
+			  struct wlan_cm_connect_resp *resp)
 {
 	struct cnx_mgr *cm_ctx;
 	QDF_STATUS qdf_status;
@@ -734,7 +648,7 @@ QDF_STATUS cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
 		goto post_err;
 	}
 
-	if (QDF_IS_STATUS_SUCCESS(resp->reassoc_status)) {
+	if (QDF_IS_STATUS_SUCCESS(resp->connect_status)) {
 		/*
 		 * On successful connection to sae single pmk AP,
 		 * clear all the single pmk AP.

+ 8 - 8
umac/mlme/connection_mgr/core/src/wlan_cm_roam.h

@@ -39,12 +39,12 @@ QDF_STATUS cm_roam_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
 /**
  * cm_reassoc_rsp() - Connection manager reassoc response
  * @vdev: vdev pointer
- * @resp: Reassoc response
+ * @resp: Connect response
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
-			  struct wlan_cm_roam_resp *resp);
+			  struct wlan_cm_connect_resp *resp);
 
 /**
  * cm_roam_disconnect_rsp() - Connection manager api to post connect event
@@ -62,14 +62,14 @@ QDF_STATUS cm_roam_disconnect_rsp(struct wlan_objmgr_vdev *vdev,
  * cm_reassoc_complete() - This API would be called after reassoc complete
  * request from the serialization.
  * @cm_ctx: connection manager context
- * @resp: Roam complete resp.
+ * @resp: connect resp.
  *
  * This API would be called after roam completion resp from VDEV mgr
  *
  * Return: QDF status
  */
 QDF_STATUS cm_reassoc_complete(struct cnx_mgr *cm_ctx,
-			       struct wlan_cm_roam_resp *resp);
+			       struct wlan_cm_connect_resp *resp);
 
 /**
  * cm_get_active_reassoc_req() - Get copy of active reassoc request
@@ -143,12 +143,12 @@ cm_resume_reassoc_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id);
  * cm_roam_resp_cmid_match_list_head() - Check if resp cmid is same as list
  * head
  * @cm_ctx: connection manager context
- * @resp: roam resp
+ * @resp: connect resp
  *
  * Return: bool
  */
 bool cm_roam_resp_cmid_match_list_head(struct cnx_mgr *cm_ctx,
-				       struct wlan_cm_roam_resp *resp);
+				       struct wlan_cm_connect_resp *resp);
 
 /**
  * cm_send_reassoc_start_fail() - initiate reassoc failure
@@ -167,7 +167,7 @@ cm_send_reassoc_start_fail(struct cnx_mgr *cm_ctx,
 
 #else
 static inline QDF_STATUS cm_reassoc_complete(struct cnx_mgr *cm_ctx,
-					     struct wlan_cm_roam_resp *resp)
+					     struct wlan_cm_connect_resp *resp)
 {
 	return QDF_STATUS_SUCCESS;
 }
@@ -234,7 +234,7 @@ QDF_STATUS cm_add_roam_req_to_list(struct cnx_mgr *cm_ctx,
 QDF_STATUS
 cm_fill_bss_info_in_roam_rsp_by_cm_id(struct cnx_mgr *cm_ctx,
 				      wlan_cm_id cm_id,
-				      struct wlan_cm_roam_resp *resp);
+				      struct wlan_cm_connect_resp *resp);
 
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 /**

+ 1 - 1
umac/mlme/connection_mgr/core/src/wlan_cm_roam_util.c

@@ -168,7 +168,7 @@ bool cm_get_active_reassoc_req(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS
 cm_fill_bss_info_in_roam_rsp_by_cm_id(struct cnx_mgr *cm_ctx,
 				      wlan_cm_id cm_id,
-				      struct wlan_cm_roam_resp *resp)
+				      struct wlan_cm_connect_resp *resp)
 {
 	qdf_list_node_t *cur_node = NULL, *next_node = NULL;
 	struct cm_req *cm_req;

+ 3 - 3
umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h

@@ -341,16 +341,16 @@ wlan_cm_get_active_req_type(struct wlan_objmgr_vdev *vdev);
 /**
  * wlan_cm_reassoc_rsp() - Connection manager reassoc response
  * @vdev: vdev pointer
- * @resp: Reassoc response
+ * @resp: Connect response
  *
  * Return: QDF_STATUS
  */
 QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
-			       struct wlan_cm_roam_resp *resp);
+			       struct wlan_cm_connect_resp *resp);
 #else
 static inline
 QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
-			       struct wlan_cm_roam_resp *resp)
+			       struct wlan_cm_connect_resp *resp)
 {
 	return QDF_STATUS_SUCCESS;
 }

+ 47 - 27
umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h

@@ -352,7 +352,6 @@ enum wlan_cm_connect_fail_reason {
 
 #ifdef WLAN_FEATURE_FILS_SK
 #define CM_FILS_MAX_HLP_DATA_LEN 2048
-#define MAX_KEK_LENGTH 64
 #define MAX_TK_LENGTH 32
 #define MAX_GTK_LENGTH 255
 
@@ -407,12 +406,53 @@ struct wlan_connect_rsp_ies {
 #endif
 };
 
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
+/**
+ * struct wlan_cm_connect_rsp - connect resp from VDEV mgr and will be sent to
+ * OSIF
+ * @auth_status: roam auth status (authenticated or connected)
+ * @kck_len: kck length
+ * @kck: kck info in roam sync
+ * @kek_len: kek length
+ * @kek: kek info in roam sync
+ * @replay_ctr: replay counter
+ * @subnet_change_status: if subnet has changed.
+ *                        0 = unchanged
+ *                        1 = changed
+ *                        2 = unknown
+ * @roam_reason: reason of roaming
+ * @pmk_len: fils pmk length
+ * @pmk: fils pmk info
+ * @pmkid: fils pmkid
+ * @update_erp_next_seq_num: if seq update required
+ * @next_erp_seq_num: next seq number
+ */
+struct wlan_roam_sync_info {
+	uint8_t auth_status;
+	uint8_t kck_len;
+	uint8_t kck[MAX_KCK_LEN];
+	uint8_t kek_len;
+	uint8_t kek[MAX_KEK_LENGTH];
+	uint8_t replay_ctr[REPLAY_CTR_LEN];
+	uint8_t subnet_change_status;
+	uint16_t roam_reason;
+#ifdef WLAN_FEATURE_FILS_SK
+	uint32_t pmk_len;
+	uint8_t pmk[MAX_PMK_LEN];
+	uint8_t pmkid[PMKID_LEN];
+	bool update_erp_next_seq_num;
+	uint16_t next_erp_seq_num;
+#endif
+};
+#endif
+
 /**
  * struct wlan_cm_connect_rsp - connect resp from VDEV mgr and will be sent to
  * OSIF
  * @vdev_id: vdev id
  * @is_wps_connection: if its wps connection
  * @is_osen_connection: if its osen connection
+ * @is_reassoc: if response is for reassoc/roam
  * @cm_id: Connect manager id
  * @bssid: BSSID of the ap
  * @ssid: SSID of the connection
@@ -422,12 +462,14 @@ struct wlan_connect_rsp_ies {
  * @status_code: protocol status code received in auth/assoc resp
  * @aid: aid
  * @connect_ies: connect related IE required by osif to send to kernel
+ * @roaming_info: roam sync info received
  * @is_fils_connection: is fils connection
  */
 struct wlan_cm_connect_resp {
 	uint8_t vdev_id;
 	uint8_t is_wps_connection:1,
-		is_osen_connection:1;
+		is_osen_connection:1,
+		is_reassoc:1;
 	wlan_cm_id cm_id;
 	struct qdf_mac_addr bssid;
 	struct wlan_ssid ssid;
@@ -437,36 +479,14 @@ struct wlan_cm_connect_resp {
 	enum wlan_status_code status_code;
 	uint8_t aid;
 	struct wlan_connect_rsp_ies connect_ies;
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
+	struct wlan_roam_sync_info *roaming_info;
+#endif
 #ifdef WLAN_FEATURE_FILS_SK
 	bool is_fils_connection;
 #endif
 };
 
-/**
- * struct wlan_cm_roam_rsp - Roam resp from VDEV mgr and will be sent to
- * OSIF
- * @vdev_id: vdev id
- * @cm_id: Connection manager id
- * @bssid: BSSID of the ap
- * @ssid: SSID of the connection
- * @freq: Channel frequency
- * @reassoc_status: Reassoc status success or failure
- * @reason: connect fail reason, valid only in case of failure
- * @status_code: protocol status code received in auth/assoc resp
- * @connect_ies: connect related IE required by osif to send to kernel
- */
-struct wlan_cm_roam_resp {
-	uint8_t vdev_id;
-	wlan_cm_id cm_id;
-	struct qdf_mac_addr bssid;
-	struct wlan_ssid ssid;
-	qdf_freq_t freq;
-	QDF_STATUS reassoc_status;
-	enum wlan_cm_connect_fail_reason reason;
-	enum wlan_status_code status_code;
-	struct wlan_connect_rsp_ies connect_ies;
-};
-
 /**
  * struct wlan_cm_discon_rsp - disconnect resp from VDEV mgr and will be sent to
  * OSIF

+ 1 - 1
umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c

@@ -118,7 +118,7 @@ QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev,
 
 #ifdef WLAN_FEATURE_HOST_ROAM
 QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
-			       struct wlan_cm_roam_resp *resp)
+			       struct wlan_cm_connect_resp *resp)
 {
 	return cm_reassoc_rsp(vdev, resp);
 }

+ 0 - 32
umac/mlme/include/wlan_mlme_cmn.h

@@ -52,9 +52,6 @@
  * @mlme_cm_disconnect_start_cb: Disconnect start callback
  * @vdev: vdev pointer
  *
- * @mlme_cm_reassoc_complete_cb: Reassoc done callback
- * @vdev: vdev pointer
- * @rsp: Roam response
  */
 struct mlme_cm_ops {
 	QDF_STATUS (*mlme_cm_connect_complete_cb)(
@@ -72,9 +69,6 @@ struct mlme_cm_ops {
 					struct wlan_cm_discon_rsp *rsp);
 	QDF_STATUS (*mlme_cm_disconnect_start_cb)(
 					struct wlan_objmgr_vdev *vdev);
-	QDF_STATUS (*mlme_cm_reassoc_complete_cb)(
-					struct wlan_objmgr_vdev *vdev,
-					struct wlan_cm_roam_resp *rsp);
 };
 #endif
 
@@ -126,8 +120,6 @@ struct mlme_cm_ops {
  * @mlme_cm_ext_roam_start_ind_cb:          callback to indicate roam start
  * @mlme_cm_ext_reassoc_req_cb:             callback for reassoc request to
  *                                          VDEV/PEER SM
- * @mlme_cm_ext_reassoc_complete_ind_cb:    callback to indicate reassoc
- *                                          complete
  */
 struct mlme_ext_ops {
 	QDF_STATUS (*mlme_psoc_ext_hdl_create)(
@@ -195,9 +187,6 @@ struct mlme_ext_ops {
 	QDF_STATUS (*mlme_cm_ext_reassoc_req_cb)(
 				struct wlan_objmgr_vdev *vdev,
 				struct wlan_cm_vdev_reassoc_req *req);
-	QDF_STATUS (*mlme_cm_ext_reassoc_complete_ind_cb)(
-				struct wlan_objmgr_vdev *vdev,
-				struct wlan_cm_roam_resp *rsp);
 #endif
 };
 
@@ -496,17 +485,6 @@ QDF_STATUS mlme_cm_roam_start_ind(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS mlme_cm_reassoc_req(struct wlan_objmgr_vdev *vdev,
 			       struct wlan_cm_vdev_reassoc_req *req);
 
-/**
- * mlme_cm_reassoc_complete_ind() - Connection manager ext reassoc complete
- * indication
- * @vdev: VDEV object
- * @rsp: Connection manager roam response
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS mlme_cm_reassoc_complete_ind(struct wlan_objmgr_vdev *vdev,
-					struct wlan_cm_roam_resp *rsp);
-
 /**
  * mlme_cm_disconnect_start_ind() - Connection manager ext disconnect start
  * indication
@@ -568,16 +546,6 @@ QDF_STATUS mlme_cm_vdev_down_req(struct wlan_objmgr_vdev *vdev);
 QDF_STATUS mlme_cm_osif_connect_complete(struct wlan_objmgr_vdev *vdev,
 					 struct wlan_cm_connect_resp *rsp);
 
-/**
- * mlme_cm_osif_reassoc_complete() - Reassoc complete resp to osif
- * @vdev: vdev pointer
- * @rsp: Roam response
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS mlme_cm_osif_reassoc_complete(struct wlan_objmgr_vdev *vdev,
-					 struct wlan_cm_roam_resp *rsp);
-
 /**
  * mlme_cm_osif_failed_candidate_ind() - Failed Candidate indication to osif
  * @vdev: vdev pointer

+ 0 - 22
umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c

@@ -345,17 +345,6 @@ QDF_STATUS mlme_cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
 	return ret;
 }
 
-QDF_STATUS mlme_cm_reassoc_complete_ind(struct wlan_objmgr_vdev *vdev,
-					struct wlan_cm_roam_resp *rsp)
-{
-	QDF_STATUS ret = QDF_STATUS_SUCCESS;
-
-	if ((glbl_ops) && glbl_ops->mlme_cm_ext_reassoc_complete_ind_cb)
-		ret = glbl_ops->mlme_cm_ext_reassoc_complete_ind_cb(vdev, rsp);
-
-	return ret;
-}
-
 QDF_STATUS mlme_cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
 					struct wlan_cm_disconnect_req *req)
 {
@@ -420,17 +409,6 @@ QDF_STATUS mlme_cm_osif_connect_complete(struct wlan_objmgr_vdev *vdev,
 	return ret;
 }
 
-QDF_STATUS mlme_cm_osif_reassoc_complete(struct wlan_objmgr_vdev *vdev,
-					 struct wlan_cm_roam_resp *rsp)
-{
-	QDF_STATUS ret = QDF_STATUS_SUCCESS;
-
-	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_reassoc_complete_cb)
-		ret = glbl_cm_ops->mlme_cm_reassoc_complete_cb(vdev, rsp);
-
-	return ret;
-}
-
 QDF_STATUS
 mlme_cm_osif_failed_candidate_ind(struct wlan_objmgr_vdev *vdev,
 				  struct wlan_cm_connect_resp *rsp)