Quellcode durchsuchen

qcacmn: Fix connect resp struct params

Fix connect resp params.
-- Fix length of the assoc req and assoc resp
-- Remove unused params from connect resp

Change-Id: I992b1bf1037bb4a09ecd37501420168c29de8187
CRs-Fixed: 2857372
Santosh Anbu vor 4 Jahren
Ursprung
Commit
6cc0d45bfd

+ 103 - 20
os_if/linux/mlme/src/osif_cm_connect_rsp.c

@@ -29,6 +29,71 @@
 #include "wlan_cfg80211.h"
 #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)
+{
+	/* Validate IE and length */
+	if (!assoc_req->len || !assoc_req->ptr ||
+	    assoc_req->len <= WLAN_ASSOC_REQ_IES_OFFSET)
+		return;
+
+	*ie_data_len = assoc_req->len - WLAN_ASSOC_REQ_IES_OFFSET;
+	*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)
+{
+	/* Validate IE and length */
+	if (!assoc_rsp->len || !assoc_rsp->ptr ||
+	    assoc_rsp->len <= WLAN_ASSOC_RSP_IES_OFFSET)
+		return;
+
+	*ie_data_len = assoc_rsp->len - WLAN_ASSOC_RSP_IES_OFFSET;
+	*ie_data_ptr = assoc_rsp->ptr + WLAN_ASSOC_RSP_IES_OFFSET;
+}
+
+#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)
+{
+	*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)
+{
+	*ie_data_len = assoc_rsp->len;
+	*ie_data_ptr = assoc_rsp->ptr;
+}
+
+#endif
+
 /**
  * osif_validate_connect_and_reset_src_id() - Validate connect response and
  * resets source and id
@@ -142,18 +207,23 @@ static void __osif_connect_bss(struct net_device *dev,
 			       enum ieee80211_statuscode status)
 {
 	enum nl80211_timeout_reason nl_timeout_reason;
+	size_t req_len = 0;
+	const uint8_t *req_ptr = NULL;
+	size_t rsp_len = 0;
+	const uint8_t *rsp_ptr = NULL;
 
 	nl_timeout_reason = osif_convert_timeout_reason(rsp->reason);
 
 	osif_debug("nl_timeout_reason %d", nl_timeout_reason);
 
+	osif_cm_get_assoc_req_ie_data(&rsp->connect_ies.assoc_req,
+				      &req_len, &req_ptr);
+	osif_cm_get_assoc_rsp_ie_data(&rsp->connect_ies.assoc_rsp,
+				      &rsp_len, &rsp_ptr);
+
 	cfg80211_connect_bss(dev, rsp->bssid.bytes, bss,
-			     rsp->connect_ies.assoc_req.ptr,
-			     rsp->connect_ies.assoc_req.len,
-			     rsp->connect_ies.assoc_rsp.ptr,
-			     rsp->connect_ies.assoc_rsp.len,
-			     status, GFP_KERNEL,
-			     nl_timeout_reason);
+			     req_ptr, req_len, rsp_ptr, rsp_len, status,
+			     GFP_KERNEL, nl_timeout_reason);
 }
 #else /* CFG80211_CONNECT_TIMEOUT_REASON_CODE */
 
@@ -173,11 +243,18 @@ static void __osif_connect_bss(struct net_device *dev,
 			       struct wlan_cm_connect_resp *rsp,
 			       ieee80211_statuscode status)
 {
+	size_t req_len = 0;
+	const uint8_t *req_ptr = NULL;
+	size_t rsp_len = 0;
+	const uint8_t *rsp_ptr = NULL;
+
+	osif_cm_get_assoc_req_ie_data(&rsp->connect_ies.assoc_req,
+				      &req_len, &req_ptr);
+	osif_cm_get_assoc_rsp_ie_data(&rsp->connect_ies.assoc_rsp,
+				      &rsp_len, &rsp_ptr);
+
 	cfg80211_connect_bss(dev, rsp->bssid.bytes, bss,
-			     rsp->connect_ies.assoc_req.ptr,
-			     rsp->connect_ies.assoc_req.len,
-			     rsp->connect_ies.assoc_rsp.ptr,
-			     rsp->connect_ies.assoc_rsp.len,
+			     req_ptr, req_len, rsp_ptr, rsp_len,
 			     status, GFP_KERNEL);
 }
 #endif /* CFG80211_CONNECT_TIMEOUT_REASON_CODE */
@@ -338,10 +415,12 @@ static void osif_connect_done(struct net_device *dev, struct cfg80211_bss *bss,
 		conn_rsp_params.bssid = rsp->bssid.bytes;
 		conn_rsp_params.timeout_reason =
 			osif_convert_timeout_reason(rsp->reason);
-		conn_rsp_params.req_ie = rsp->connect_ies.assoc_req.ptr;
-		conn_rsp_params.req_ie_len = rsp->connect_ies.assoc_req.len;
-		conn_rsp_params.resp_ie = rsp->connect_ies.assoc_rsp.ptr;
-		conn_rsp_params.resp_ie_len = rsp->connect_ies.assoc_rsp.len;
+		osif_cm_get_assoc_req_ie_data(&rsp->connect_ies.assoc_req,
+					      &conn_rsp_params.req_ie_len,
+					      &conn_rsp_params.req_ie);
+		osif_cm_get_assoc_rsp_ie_data(&rsp->connect_ies.assoc_rsp,
+					      &conn_rsp_params.resp_ie_len,
+					      &conn_rsp_params.resp_ie);
 		conn_rsp_params.bss = bss;
 		osif_populate_fils_params(&conn_rsp_params,
 					  rsp->connect_ies.fils_ie);
@@ -427,6 +506,10 @@ static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
 					 struct wlan_cm_connect_resp *rsp)
 {
 	enum ieee80211_statuscode status = WLAN_STATUS_SUCCESS;
+	size_t req_len = 0;
+	const uint8_t *req_ptr = NULL;
+	size_t rsp_len = 0;
+	const uint8_t *rsp_ptr = NULL;
 
 	if (QDF_IS_STATUS_ERROR(rsp->connect_status)) {
 		if (rsp->status_code)
@@ -435,13 +518,13 @@ static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
 			status = WLAN_STATUS_UNSPECIFIED_FAILURE;
 	}
 
+	osif_cm_get_assoc_req_ie_data(&rsp->connect_ies.assoc_req,
+				      &req_len, &req_ptr);
+	osif_cm_get_assoc_rsp_ie_data(&rsp->connect_ies.assoc_rsp,
+				      &rsp_len, &rsp_ptr);
 	cfg80211_connect_result(osif_priv->wdev->netdev,
-				rsp->bssid.bytes,
-				rsp->connect_ies.assoc_req.ptr,
-				rsp->connect_ies.assoc_req.len,
-				rsp->connect_ies.assoc_rsp.ptr,
-				rsp->connect_ies.assoc_rsp.len,
-				status, GFP_KERNEL);
+				rsp->bssid.bytes, req_ptr, req_len,
+				rsp_ptr, rsp_len, status, GFP_KERNEL);
 }
 #endif /* CFG80211_CONNECT_BSS */
 

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

@@ -25,6 +25,11 @@
 #include <qdf_types.h>
 #include <osdep.h>
 
+/* Assoc resp IE offset Capability(2) + AID(2) + Status Code(2) */
+#define WLAN_ASSOC_RSP_IES_OFFSET 6
+/* Assoc req IE offset - Capability(2) + LI(2) */
+#define WLAN_ASSOC_REQ_IES_OFFSET 4
+
 #define IEEE80211_CCMP_HEADERLEN    8
 #define IEEE80211_HT_CTRL_LEN       4
 #define IEEE80211_CCMP_MICLEN       8

+ 2 - 0
umac/mlme/connection_mgr/core/src/wlan_cm_connect.c

@@ -1471,6 +1471,8 @@ cm_resume_connect_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mlme_err(CM_PREFIX_FMT "connect request failed",
 			 CM_PREFIX_REF(req.vdev_id, req.cm_id));
+		/* try delete bss peer if req fails */
+		mlme_cm_bss_peer_delete_req(cm_ctx->vdev);
 		status = cm_send_connect_start_fail(cm_ctx,
 						    &cm_req->connect_req,
 						    CM_JOIN_FAILED);

+ 0 - 2
umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h

@@ -367,14 +367,12 @@ struct fils_connect_rsp_params {
  * @bcn_probe_rsp: Raw beacon or probe rsp of connected AP
  * @assoc_req: assoc req IE pointer send during conenct
  * @assoc_rsq: assoc rsp IE received during connection
- * @ric_resp_ie: ric ie from assoc resp received during connection
  * @fills_ie: fills connection ie received during connection
  */
 struct wlan_connect_rsp_ies {
 	struct element_info bcn_probe_rsp;
 	struct element_info assoc_req;
 	struct element_info assoc_rsp;
-	struct element_info ric_resp_ie;
 #ifdef WLAN_FEATURE_FILS_SK
 	struct fils_connect_rsp_params *fils_ie;
 #endif