Эх сурвалжийг харах

qcacmn: Add params in connect req to pass non converged params

Add connect params in osif connect request to pass scan IE and other
params from legacy to be used in connect request.

Change-Id: I83721023362ff2405727316f090671468200b362
CRs-Fixed: 2793280
Abhishek Singh 4 жил өмнө
parent
commit
2e046c6e96

+ 20 - 1
os_if/linux/mlme/inc/osif_cm_req.h

@@ -30,16 +30,35 @@
 #include <net/cfg80211.h>
 #include "wlan_objmgr_vdev_obj.h"
 
+/**
+ * struct osif_connect_params - extra connect params
+ * @scan_ie: default scan ie to be used in connect scan and unicast probe req
+ * during connect
+ * @force_rsne_override: force the arbitrary rsne received in connect req to be
+ * used with out validation, used for the scenarios where the device is used
+ * as a testbed device with special functionality and not recommended
+ * for production.
+ * @dot11mode_filter: dot11mode filter used to restrict connection to
+ * 11n/11ac/11ax.
+ */
+struct osif_connect_params {
+	struct element_info scan_ie;
+	bool force_rsne_override;
+	enum dot11_mode_filter dot11mode_filter;
+};
+
 /**
  * osif_cm_connect() - Connect start request
  * @dev: net dev
  * @vdev: vdev pointer
  * @req: connect req
+ * @params: connect params
  *
  * Return: int
  */
 int osif_cm_connect(struct net_device *dev, struct wlan_objmgr_vdev *vdev,
-		    struct cfg80211_connect_params *req);
+		    const struct cfg80211_connect_params *req,
+		    const struct osif_connect_params *params);
 
 /**
  * osif_cm_disconnect() - Disconnect start request

+ 61 - 25
os_if/linux/mlme/src/osif_cm_req.c

@@ -47,7 +47,7 @@ static void osif_cm_free_wep_key_params(struct wlan_cm_connect_req *connect_req)
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
 static QDF_STATUS
 osif_cm_update_wep_seq_info(struct wlan_cm_connect_req *connect_req,
-			    struct cfg80211_connect_params *req)
+			    const struct cfg80211_connect_params *req)
 {
 	if (req->crypto.wep_keys->seq_len) {
 		connect_req->crypto.wep_keys.seq_len =
@@ -67,15 +67,15 @@ osif_cm_update_wep_seq_info(struct wlan_cm_connect_req *connect_req,
 #else
 static inline QDF_STATUS
 osif_cm_update_wep_seq_info(struct wlan_cm_connect_req *connect_req,
-			    struct cfg80211_connect_params *req)
+			    const struct cfg80211_connect_params *req)
 {
 	return QDF_STATUS_SUCCESS;
 }
 #endif
 
-static QDF_STATUS osif_cm_set_wep_key_params(
-				struct wlan_cm_connect_req *connect_req,
-				struct cfg80211_connect_params *req)
+static QDF_STATUS
+osif_cm_set_wep_key_params(struct wlan_cm_connect_req *connect_req,
+			   const struct cfg80211_connect_params *req)
 {
 	if (!req->key_len)
 		return QDF_STATUS_SUCCESS;
@@ -95,7 +95,7 @@ static QDF_STATUS osif_cm_set_wep_key_params(
 }
 
 static void osif_cm_set_auth_type(struct wlan_cm_connect_req *connect_req,
-				  struct cfg80211_connect_params *req)
+				  const struct cfg80211_connect_params *req)
 {
 	wlan_crypto_auth_mode crypto_auth_type =
 			osif_nl_to_crypto_auth_type(req->auth_type);
@@ -116,7 +116,7 @@ static void osif_cm_set_auth_type(struct wlan_cm_connect_req *connect_req,
 
 static
 QDF_STATUS osif_cm_set_crypto_params(struct wlan_cm_connect_req *connect_req,
-				     struct cfg80211_connect_params *req)
+				     const struct cfg80211_connect_params *req)
 {
 	uint32_t i = 0;
 	QDF_STATUS status;
@@ -193,7 +193,7 @@ static bool osif_cm_is_akm_suite_fils(uint32_t key_mgmt)
 	}
 }
 
-static bool osif_cm_is_conn_type_fils(struct cfg80211_connect_params *req)
+static bool osif_cm_is_conn_type_fils(const struct cfg80211_connect_params *req)
 {
 	int num_akm_suites = req->crypto.n_akm_suites;
 	uint32_t key_mgmt = req->crypto.akm_suites[0];
@@ -218,8 +218,9 @@ static bool osif_cm_is_conn_type_fils(struct cfg80211_connect_params *req)
 	return true;
 }
 
-static QDF_STATUS osif_cm_set_fils_info(struct wlan_cm_connect_req *connect_req,
-					struct cfg80211_connect_params *req)
+static QDF_STATUS
+osif_cm_set_fils_info(struct wlan_cm_connect_req *connect_req,
+		      const struct cfg80211_connect_params *req)
 {
 	connect_req->fils_info.is_fils_connection =
 					osif_cm_is_conn_type_fils(req);
@@ -262,7 +263,7 @@ static QDF_STATUS osif_cm_set_fils_info(struct wlan_cm_connect_req *connect_req,
 #else
 static inline
 QDF_STATUS osif_cm_set_fils_info(struct wlan_cm_connect_req *connect_req,
-				 struct cfg80211_connect_params *req)
+				 const struct cfg80211_connect_params *req)
 {
 	return QDF_STATUS_SUCCESS;
 }
@@ -271,13 +272,14 @@ QDF_STATUS osif_cm_set_fils_info(struct wlan_cm_connect_req *connect_req,
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
 static inline void
 osif_cm_set_prev_bssid(struct wlan_cm_connect_req *connect_req,
-		       struct cfg80211_connect_params *req)
+		       const struct cfg80211_connect_params *req)
 {
 	qdf_mem_copy(connect_req->prev_bssid.bytes, req->prev_bssid,
 		     QDF_MAC_ADDR_SIZE);
 }
 
-static inline void osif_cm_dump_prev_bssid(struct cfg80211_connect_params *req)
+static inline
+void osif_cm_dump_prev_bssid(const struct cfg80211_connect_params *req)
 {
 	if (req->prev_bssid)
 		osif_nofl_debug("prev BSSID "QDF_MAC_ADDR_FMT,
@@ -287,19 +289,20 @@ static inline void osif_cm_dump_prev_bssid(struct cfg80211_connect_params *req)
 #else
 static inline void
 osif_cm_set_prev_bssid(struct wlan_cm_connect_req *connect_req,
-		       struct cfg80211_connect_params *req)
+		       const struct cfg80211_connect_params *req)
 {
 }
 
-static inline void osif_cm_dump_prev_bssid(struct cfg80211_connect_params *req)
+static inline
+void osif_cm_dump_prev_bssid(const struct cfg80211_connect_params *req)
 {
 }
 
 #endif
 
-static inline void osif_cm_dump_connect_req(struct net_device *dev,
-					    uint8_t vdev_id,
-					    struct cfg80211_connect_params *req)
+static inline void
+osif_cm_dump_connect_req(struct net_device *dev, uint8_t vdev_id,
+			 const struct cfg80211_connect_params *req)
 {
 	uint32_t i;
 
@@ -328,8 +331,44 @@ static inline void osif_cm_dump_connect_req(struct net_device *dev,
 				req->crypto.ciphers_pairwise[i]);
 }
 
+static void
+osif_cm_fill_connect_params(struct wlan_cm_connect_req *req,
+			    const struct osif_connect_params *params)
+{
+	if (!params)
+		return;
+
+	if (params->scan_ie.len) {
+		req->scan_ie.ptr = qdf_mem_malloc(params->scan_ie.len);
+		if (req->scan_ie.ptr) {
+			qdf_mem_copy(req->scan_ie.ptr, params->scan_ie.ptr,
+				     params->scan_ie.len);
+			req->scan_ie.len = params->scan_ie.len;
+		}
+	}
+	req->dot11mode_filter = params->dot11mode_filter;
+	req->force_rsne_override = params->force_rsne_override;
+}
+
+static void osif_cm_free_connect_req(struct wlan_cm_connect_req *connect_req)
+{
+	if (connect_req->scan_ie.ptr) {
+		qdf_mem_free(connect_req->scan_ie.ptr);
+		connect_req->assoc_ie.ptr = NULL;
+	}
+
+	if (connect_req->assoc_ie.ptr) {
+		qdf_mem_free(connect_req->assoc_ie.ptr);
+		connect_req->assoc_ie.ptr = NULL;
+	}
+
+	osif_cm_free_wep_key_params(connect_req);
+	qdf_mem_free(connect_req);
+}
+
 int osif_cm_connect(struct net_device *dev, struct wlan_objmgr_vdev *vdev,
-		    struct cfg80211_connect_params *req)
+		    const struct cfg80211_connect_params *req,
+		    const struct osif_connect_params *params)
 {
 	struct wlan_cm_connect_req *connect_req;
 	const u8 *bssid_hint = req->bssid_hint;
@@ -395,17 +434,14 @@ int osif_cm_connect(struct net_device *dev, struct wlan_objmgr_vdev *vdev,
 	if (QDF_IS_STATUS_ERROR(status))
 		goto connect_start_fail;
 
+	osif_cm_fill_connect_params(connect_req, params);
+
 	status = ucfg_cm_start_connect(vdev, connect_req);
 	if (QDF_IS_STATUS_ERROR(status))
 		osif_err("Connect failed with status %d", status);
 
 connect_start_fail:
-	if (connect_req->assoc_ie.ptr) {
-		qdf_mem_free(connect_req->assoc_ie.ptr);
-		connect_req->assoc_ie.ptr = NULL;
-	}
-	osif_cm_free_wep_key_params(connect_req);
-	qdf_mem_free(connect_req);
+	osif_cm_free_connect_req(connect_req);
 
 	return qdf_status_to_os_return(status);
 }

+ 25 - 30
umac/mlme/connection_mgr/core/src/wlan_cm_connect.c

@@ -1130,7 +1130,9 @@ cm_resume_connect_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
 
 	req.vdev_id = wlan_vdev_get_id(cm_ctx->vdev);
 	req.cm_id = *cm_id;
+	req.force_rsne_override = cm_req->connect_req.req.force_rsne_override;
 	req.assoc_ie = cm_req->connect_req.req.assoc_ie;
+	req.scan_ie = cm_req->connect_req.req.scan_ie;
 	req.bss = cm_req->connect_req.cur_candidate;
 
 	wlan_reg_read_current_country(psoc, country_code);
@@ -1466,15 +1468,29 @@ cm_set_crypto_params_from_ie(struct wlan_cm_connect_req *req)
 }
 
 static QDF_STATUS
-cm_allocate_and_copy_assoc_wep_ie(struct wlan_cm_connect_req *target,
+cm_allocate_and_copy_ies_and_keys(struct wlan_cm_connect_req *target,
 				  struct wlan_cm_connect_req *source)
 {
+	/* Reset the copied pointers of target */
+	source->assoc_ie.ptr = NULL;
+	source->crypto.wep_keys.key = NULL;
+	source->crypto.wep_keys.seq = NULL;
+	source->scan_ie.ptr = NULL;
+
+	if (source->scan_ie.ptr) {
+		target->scan_ie.ptr = qdf_mem_malloc(source->scan_ie.len);
+		if (!target->scan_ie.ptr)
+			target->scan_ie.len = 0;
+		else
+			qdf_mem_copy(target->scan_ie.ptr,
+				     source->scan_ie.ptr, source->scan_ie.len);
+	}
+
 	if (source->assoc_ie.ptr) {
 		target->assoc_ie.ptr = qdf_mem_malloc(source->assoc_ie.len);
 		if (!target->assoc_ie.ptr)
 			return QDF_STATUS_E_NOMEM;
 
-		target->assoc_ie.len = source->assoc_ie.len;
 		qdf_mem_copy(target->assoc_ie.ptr, source->assoc_ie.ptr,
 			     source->assoc_ie.len);
 	}
@@ -1483,10 +1499,8 @@ cm_allocate_and_copy_assoc_wep_ie(struct wlan_cm_connect_req *target,
 		target->crypto.wep_keys.key =
 			qdf_mem_malloc(source->crypto.wep_keys.key_len);
 		if (!target->crypto.wep_keys.key)
-			goto wep_key_alloc_fail;
+			return QDF_STATUS_E_NOMEM;
 
-		target->crypto.wep_keys.key_len =
-				source->crypto.wep_keys.key_len;
 		qdf_mem_copy(target->crypto.wep_keys.key,
 			     source->crypto.wep_keys.key,
 			     source->crypto.wep_keys.key_len);
@@ -1496,33 +1510,14 @@ cm_allocate_and_copy_assoc_wep_ie(struct wlan_cm_connect_req *target,
 		target->crypto.wep_keys.seq =
 			qdf_mem_malloc(source->crypto.wep_keys.seq_len);
 		if (!target->crypto.wep_keys.seq)
-			goto wep_seq_alloc_fail;
+			return QDF_STATUS_E_NOMEM;
 
-		target->crypto.wep_keys.seq_len =
-					source->crypto.wep_keys.seq_len;
 		qdf_mem_copy(target->crypto.wep_keys.seq,
 			     source->crypto.wep_keys.seq,
 			     source->crypto.wep_keys.seq_len);
 	}
 
 	return QDF_STATUS_SUCCESS;
-
-wep_seq_alloc_fail:
-	if (target->crypto.wep_keys.key) {
-		qdf_mem_zero(target->crypto.wep_keys.key,
-			     target->crypto.wep_keys.key_len);
-		qdf_mem_free(target->crypto.wep_keys.key);
-		target->crypto.wep_keys.key = NULL;
-	}
-
-wep_key_alloc_fail:
-	if (target->assoc_ie.ptr) {
-		qdf_mem_zero(target->assoc_ie.ptr, target->assoc_ie.len);
-		qdf_mem_free(target->assoc_ie.ptr);
-		target->assoc_ie.ptr = NULL;
-	}
-
-	return QDF_STATUS_E_NOMEM;
 }
 
 QDF_STATUS cm_connect_start_req(struct wlan_objmgr_vdev *vdev,
@@ -1550,16 +1545,16 @@ QDF_STATUS cm_connect_start_req(struct wlan_objmgr_vdev *vdev,
 	connect_req = &cm_req->connect_req;
 	connect_req->req = *req;
 
-	status = cm_allocate_and_copy_assoc_wep_ie(&connect_req->req, req);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		qdf_mem_free(cm_req);
-		return status;
-	}
+	status = cm_allocate_and_copy_ies_and_keys(&connect_req->req, req);
+	if (QDF_IS_STATUS_ERROR(status))
+		goto err;
+
 	cm_set_crypto_params_from_ie(&connect_req->req);
 
 	status = cm_sm_deliver_event(vdev, WLAN_CM_SM_EV_CONNECT_REQ,
 				     sizeof(*connect_req), connect_req);
 
+err:
 	/* free the req if connect is not handled */
 	if (QDF_IS_STATUS_ERROR(status)) {
 		cm_free_connect_req_mem(connect_req);

+ 20 - 18
umac/mlme/connection_mgr/core/src/wlan_cm_util.c

@@ -469,31 +469,33 @@ QDF_STATUS cm_add_req_to_list_and_indicate_osif(struct cnx_mgr *cm_ctx,
 	return QDF_STATUS_SUCCESS;
 }
 
+static void cm_zero_and_free_memory(uint8_t *ptr, uint32_t len)
+{
+	if (!ptr)
+		return;
+
+	qdf_mem_zero(ptr, len);
+	qdf_mem_free(ptr);
+}
+
 void cm_free_connect_req_mem(struct cm_connect_req *connect_req)
 {
+	struct wlan_cm_connect_req *req;
+
+	req = &connect_req->req;
+
 	if (connect_req->candidate_list)
 		wlan_scan_purge_results(connect_req->candidate_list);
 
-	if (connect_req->req.assoc_ie.ptr) {
-		qdf_mem_zero(connect_req->req.assoc_ie.ptr,
-			     connect_req->req.assoc_ie.len);
-		qdf_mem_free(connect_req->req.assoc_ie.ptr);
-		connect_req->req.assoc_ie.ptr = NULL;
-	}
+	cm_zero_and_free_memory(req->assoc_ie.ptr, req->assoc_ie.len);
+	cm_zero_and_free_memory(req->scan_ie.ptr, req->scan_ie.len);
 
-	if (connect_req->req.crypto.wep_keys.key) {
-		qdf_mem_zero(connect_req->req.crypto.wep_keys.key,
-			     connect_req->req.crypto.wep_keys.key_len);
-		qdf_mem_free(connect_req->req.crypto.wep_keys.key);
-		connect_req->req.crypto.wep_keys.key = NULL;
-	}
+	cm_zero_and_free_memory(req->crypto.wep_keys.key,
+				req->crypto.wep_keys.key_len);
+	cm_zero_and_free_memory(req->crypto.wep_keys.seq,
+				req->crypto.wep_keys.seq_len);
 
-	if (connect_req->req.crypto.wep_keys.seq) {
-		qdf_mem_zero(connect_req->req.crypto.wep_keys.seq,
-			     connect_req->req.crypto.wep_keys.seq_len);
-		qdf_mem_free(connect_req->req.crypto.wep_keys.seq);
-		connect_req->req.crypto.wep_keys.seq = NULL;
-	}
+	qdf_mem_zero(connect_req, sizeof(*connect_req));
 }
 
 QDF_STATUS

+ 18 - 1
umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h

@@ -144,6 +144,13 @@ enum wlan_cm_source {
  * @crypto: crypto related info
  * @assoc_ie:Additional assoc IE to be appended in assoc req
  *           (Include RSN/WPA/WAPI/WPS ies)
+ * @scan_ie: Default scan ie to be used in the uncast probe req and connect scan
+ * @force_rsne_override: force the arbitrary rsne received in connect req to be
+ * used with out validation, used for the scenarios where the device is used
+ * as a testbed device with special functionality and not recommended
+ * for production.
+ * @dot11mode_filter: dot11mode filter used to restrict connection to
+ * 11n/11ac/11ax.
  * @ht_caps: ht capability
  * @ht_caps_mask: mask of valid ht caps
  * @vht_caps: vht capability
@@ -160,6 +167,9 @@ struct wlan_cm_connect_req {
 	uint32_t chan_freq;
 	struct wlan_cm_connect_crypto_info crypto;
 	struct element_info assoc_ie;
+	struct element_info scan_ie;
+	bool force_rsne_override;
+	enum dot11_mode_filter dot11mode_filter;
 	uint16_t ht_caps;
 	uint16_t ht_caps_mask;
 	uint32_t vht_caps;
@@ -174,13 +184,20 @@ struct wlan_cm_connect_req {
  * vdev mgr
  * @vdev_id: vdev id
  * @cm_id: Connect manager id
- * @assoc_ie: assoc ie
+ * @force_rsne_override: force the arbitrary rsne received in connect req to be
+ * used with out validation, used for the scenarios where the device is used
+ * as a testbed device with special functionality and not recommended
+ * for production.
+ * @assoc_ie: assoc ie to be used in assoc req
+ * @scan_ie: Default scan ie to be used in the uncast probe req
  * @bss: scan entry for the candidate
  */
 struct wlan_cm_vdev_connect_req {
 	uint8_t vdev_id;
 	wlan_cm_id cm_id;
+	bool force_rsne_override;
 	struct element_info assoc_ie;
+	struct element_info scan_ie;
 	struct scan_cache_node *bss;
 };