Forráskód Böngészése

qcacld-3.0: Update scan request IE's with default scan IE's

1) If g_qcn_ie_support is enabled, Save QCN IE along with default scan
   IE's received from Supplicant at init time.
2) Compare and update scan IE's with saved default scan IE's for each
   scan offload request to FW.

Change-Id: I902ab753db3bc3d5b4de400f550bf4ba3ceb424b
CRs-Fixed: 2033203
Selvaraj, Sridhar 8 éve
szülő
commit
021ee0ace3

+ 1 - 1
core/hdd/inc/wlan_hdd_main.h

@@ -807,7 +807,7 @@ typedef struct hdd_scaninfo_s {
 	tSirAddie scanAddIE;
 
 	uint8_t *default_scan_ies;
-	uint8_t default_scan_ies_len;
+	uint16_t default_scan_ies_len;
 	/* Scan mode */
 	tSirScanType scan_mode;
 

+ 3 - 0
core/hdd/inc/wlan_hdd_wext.h

@@ -229,6 +229,9 @@ enum hdd_wlan_wmm_ts_info_ack_policy {
 #define MBO_OUI_TYPE   "\x50\x6f\x9a\x16"
 #define MBO_OUI_TYPE_SIZE  4
 
+#define QCN_OUI_TYPE   "\x8c\xfd\xf0\x01"
+#define QCN_OUI_TYPE_SIZE  4
+
 enum hdd_wps_mode {
 	eWEXT_WPS_OFF = 0,
 	eWEXT_WPS_ON = 1,

+ 63 - 8
core/hdd/src/wlan_hdd_cfg80211.c

@@ -4551,31 +4551,86 @@ wlan_hdd_wifi_config_policy[QCA_WLAN_VENDOR_ATTR_CONFIG_MAX + 1] = {
 };
 
 /**
- * wlan_hdd_save_default_scan_ies() - API to store the default scan IEs
+ * wlan_hdd_add_qcn_ie() - Add QCN IE to a given IE buffer
+ * @ie_data: IE buffer
+ * @ie_len: length of the @ie_data
  *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS wlan_hdd_add_qcn_ie(uint8_t *ie_data, uint16_t *ie_len)
+{
+	tDot11fIEQCN_IE qcn_ie;
+	uint8_t qcn_ie_hdr[QCN_IE_HDR_LEN]
+		= {IE_EID_VENDOR, DOT11F_IE_QCN_IE_MAX_LEN,
+			0x8C, 0xFD, 0xF0, 0x1};
+
+	if (((*ie_len) + QCN_IE_HDR_LEN +
+		QCN_IE_VERSION_SUBATTR_DATA_LEN) > MAX_DEFAULT_SCAN_IE_LEN) {
+		hdd_err("IE buffer not enough for QCN IE");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	/* Add QCN IE header */
+	qdf_mem_copy(ie_data + (*ie_len), qcn_ie_hdr, QCN_IE_HDR_LEN);
+	(*ie_len) += QCN_IE_HDR_LEN;
+
+	/* Retrieve Version sub-attribute data */
+	populate_dot11f_qcn_ie(&qcn_ie);
+
+	/* Add QCN IE data[version sub attribute] */
+	qdf_mem_copy(ie_data + (*ie_len), qcn_ie.version,
+				 (QCN_IE_VERSION_SUBATTR_LEN));
+	(*ie_len) += (QCN_IE_VERSION_SUBATTR_LEN);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * wlan_hdd_save_default_scan_ies() - API to store the default scan IEs
+ * @hdd_ctx: HDD context
  * @adapter: Pointer to HDD adapter
  * @ie_data: Pointer to Scan IEs buffer
  * @ie_len: Length of Scan IEs
  *
+ * This API is used to store the default scan ies received from
+ * supplicant. Also saves QCN IE if g_qcn_ie_support INI is enabled
+ *
  * Return: 0 on success; error number otherwise
  */
-static int wlan_hdd_save_default_scan_ies(hdd_adapter_t *adapter,
-		uint8_t *ie_data, uint8_t ie_len)
+static int wlan_hdd_save_default_scan_ies(hdd_context_t *hdd_ctx,
+					  hdd_adapter_t *adapter,
+					  uint8_t *ie_data, uint16_t ie_len)
 {
-	hdd_scaninfo_t *scan_info = NULL;
-	scan_info = &adapter->scan_info;
+	hdd_scaninfo_t *scan_info = &adapter->scan_info;
+	bool add_qcn_ie = hdd_ctx->config->qcn_ie_support;
+
+	if (!scan_info)
+		return -EINVAL;
 
 	if (scan_info->default_scan_ies) {
 		qdf_mem_free(scan_info->default_scan_ies);
 		scan_info->default_scan_ies = NULL;
 	}
 
+	if (add_qcn_ie)
+		ie_len += (QCN_IE_HDR_LEN + QCN_IE_VERSION_SUBATTR_DATA_LEN);
+
 	scan_info->default_scan_ies = qdf_mem_malloc(ie_len);
 	if (!scan_info->default_scan_ies)
 		return -ENOMEM;
 
 	memcpy(scan_info->default_scan_ies, ie_data, ie_len);
-	scan_info->default_scan_ies_len = ie_len;
+
+	/* Add QCN IE if g_qcn_ie_support INI is enabled */
+	if (add_qcn_ie)
+		wlan_hdd_add_qcn_ie(scan_info->default_scan_ies,
+					&(scan_info->default_scan_ies_len));
+
+	hdd_debug("Saved default scan IE:");
+	qdf_trace_hex_dump(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_DEBUG,
+				(uint8_t *) scan_info->default_scan_ies,
+				scan_info->default_scan_ies_len);
+
 	return 0;
 }
 
@@ -4841,8 +4896,8 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 			scan_ie = (uint8_t *) nla_data(tb
 				[QCA_WLAN_VENDOR_ATTR_CONFIG_SCAN_DEFAULT_IES]);
 
-			if (wlan_hdd_save_default_scan_ies(adapter, scan_ie,
-								scan_ie_len))
+			if (wlan_hdd_save_default_scan_ies(hdd_ctx, adapter,
+							scan_ie, scan_ie_len))
 				hdd_err("Failed to save default scan IEs");
 
 			if (adapter->device_mode == QDF_STA_MODE) {

+ 27 - 16
core/hdd/src/wlan_hdd_scan.c

@@ -1445,13 +1445,14 @@ static inline void wlan_hdd_copy_bssid_scan_request(tCsrScanRequest *scan_req,
  */
 static int wlan_hdd_update_scan_ies(hdd_adapter_t *adapter,
 			hdd_scaninfo_t *scan_info, uint8_t *scan_ie,
-			uint8_t *scan_ie_len)
+			uint16_t *scan_ie_len)
 {
-	uint8_t rem_len = scan_info->default_scan_ies_len;
+	uint16_t rem_len = scan_info->default_scan_ies_len;
 	uint8_t *temp_ie = scan_info->default_scan_ies;
 	uint8_t *current_ie;
 	uint8_t elem_id;
 	uint16_t elem_len;
+	bool add_ie;
 
 	if (!scan_info->default_scan_ies_len || !scan_info->default_scan_ies)
 		return 0;
@@ -1465,20 +1466,31 @@ static int wlan_hdd_update_scan_ies(hdd_adapter_t *adapter,
 		switch (elem_id) {
 		case DOT11F_EID_EXTCAP:
 			if (!wlan_hdd_cfg80211_get_ie_ptr(scan_ie, *scan_ie_len,
-						DOT11F_EID_EXTCAP)) {
-				qdf_mem_copy(scan_ie + (*scan_ie_len),
-						current_ie, elem_len + 2);
-				(*scan_ie_len) += (elem_len + 2);
-			}
+							DOT11F_EID_EXTCAP))
+				add_ie = true;
 			break;
-		case DOT11F_EID_WPA:
-			if (!wlan_hdd_get_mbo_ie_ptr(scan_ie, *scan_ie_len)) {
-				qdf_mem_copy(scan_ie + (*scan_ie_len),
-						current_ie, elem_len + 2);
-				(*scan_ie_len) += (elem_len + 2);
-			}
+		case IE_EID_VENDOR:
+			if ((0 == qdf_mem_cmp(&temp_ie[0], MBO_OUI_TYPE,
+							MBO_OUI_TYPE_SIZE)) ||
+				(0 == qdf_mem_cmp(&temp_ie[0], QCN_OUI_TYPE,
+							QCN_OUI_TYPE_SIZE)))
+				add_ie = true;
 			break;
 		}
+
+		if (add_ie && (((*scan_ie_len) + elem_len) >
+					SIR_MAC_MAX_ADD_IE_LENGTH)){
+			hdd_err("Not enough buffer to save default scan IE's");
+			return 0;
+		}
+
+		if (add_ie) {
+			qdf_mem_copy(scan_ie + (*scan_ie_len),
+						current_ie, elem_len + 2);
+			(*scan_ie_len) += (elem_len + 2);
+			add_ie = false;
+		}
+
 		temp_ie += elem_len;
 		rem_len -= elem_len;
 	}
@@ -1677,10 +1689,9 @@ static int __wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
 		       request->ie_len);
 		pScanInfo->scanAddIE.length = request->ie_len;
 
-		if (wlan_hdd_update_scan_ies(pAdapter, pScanInfo,
+		wlan_hdd_update_scan_ies(pAdapter, pScanInfo,
 				pScanInfo->scanAddIE.addIEdata,
-				(uint8_t *)&pScanInfo->scanAddIE.length))
-			hdd_err("Update scan IEs with default Scan IEs failed");
+				&pScanInfo->scanAddIE.length);
 
 		if ((QDF_STA_MODE == pAdapter->device_mode) ||
 		    (QDF_P2P_CLIENT_MODE == pAdapter->device_mode) ||

+ 1 - 1
core/mac/inc/sir_api.h

@@ -5684,7 +5684,7 @@ struct fw_dump_rsp {
 #define DEFAULT_SCAN_IE_ID 256
 
  /* MAX_DEFAULT_SCAN_IE_LEN - Maxmimum length of Default Scan IE's */
-#define MAX_DEFAULT_SCAN_IE_LEN 1024
+#define MAX_DEFAULT_SCAN_IE_LEN 2048
 
  /* Extended Capabilities IE header(IE Id + IE Length) length */
 #define EXT_CAP_IE_HDR_LEN 2

+ 1 - 1
core/mac/inc/sir_mac_prot_def.h

@@ -427,7 +427,7 @@
 #define SIR_MAC_ANI_WORKAROUND_EID_MIN     0
 #define SIR_MAC_ANI_WORKAROUND_EID_MAX     255
 
-#define SIR_MAC_MAX_ADD_IE_LENGTH       500
+#define SIR_MAC_MAX_ADD_IE_LENGTH       2048
 
 /* / Maximum length of each IE */
 #define SIR_MAC_MAX_IE_LENGTH       255

+ 0 - 2
core/mac/src/pe/include/lim_api.h

@@ -379,7 +379,5 @@ QDF_STATUS lim_update_ext_cap_ie(tpAniSirGlobal mac_ctx,
 			  LIM_HE_MU_BEAMFORMER_BIT_POS)
 #endif
 
-QDF_STATUS lim_add_qcn_ie(tpAniSirGlobal mac_ctx, uint8_t *ie_data,
-							uint16_t *ie_len);
 /************************************************************/
 #endif /* __LIM_API_H */

+ 0 - 36
core/mac/src/pe/lim/lim_api.c

@@ -2471,39 +2471,3 @@ QDF_STATUS lim_update_ext_cap_ie(tpAniSirGlobal mac_ctx,
 	(*local_ie_len) += driver_ext_cap.num_bytes;
 	return QDF_STATUS_SUCCESS;
 }
-
-/**
- * lim_add_qcn_ie() - Add QCN IE to a given IE buffer
- *
- * @mac_ctx: Pointer to Global MAC structure
- * @ie_data: IE buffer
- * @ie_len: length of the @ie_data
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS lim_add_qcn_ie(tpAniSirGlobal mac_ctx, uint8_t *ie_data,
-							uint16_t *ie_len)
-{
-	tDot11fIEQCN_IE qcn_ie;
-	uint8_t qcn_ie_hdr[QCN_IE_HDR_LEN]
-		= {IE_EID_VENDOR, DOT11F_IE_QCN_IE_MAX_LEN,
-			0x8C, 0xFD, 0xF0, 0x1};
-
-	if (((*ie_len) + DOT11F_IE_QCN_IE_MAX_LEN) > MAX_DEFAULT_SCAN_IE_LEN) {
-		pe_err("IE buffer not enough for QCN IE");
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	/* Add QCN IE header */
-	qdf_mem_copy(ie_data + (*ie_len), qcn_ie_hdr, QCN_IE_HDR_LEN);
-	(*ie_len) += QCN_IE_HDR_LEN;
-
-	/* Retrieve Version sub-attribute data */
-	populate_dot11f_qcn_ie(&qcn_ie);
-
-	/* Add QCN IE data[version sub attribute] */
-	qdf_mem_copy(ie_data + (*ie_len), qcn_ie.version,
-			(QCN_IE_VERSION_SUBATTR_LEN));
-	(*ie_len) += (QCN_IE_VERSION_SUBATTR_LEN);
-	return QDF_STATUS_SUCCESS;
-}

+ 0 - 8
core/mac/src/pe/lim/lim_process_message_queue.c

@@ -262,7 +262,6 @@ static void lim_process_set_default_scan_ie_request(tpAniSirGlobal mac_ctx,
 	uint16_t local_ie_len;
 	struct scheduler_msg msg_q = {0};
 	tSirRetStatus ret_code;
-	QDF_STATUS qdf_status;
 
 	if (!msg_buf) {
 		pe_err("msg_buf is NULL");
@@ -285,13 +284,6 @@ static void lim_process_set_default_scan_ie_request(tpAniSirGlobal mac_ctx,
 		goto scan_ie_send_fail;
 	}
 
-	if (mac_ctx->roam.configParam.qcn_ie_support) {
-		qdf_status = lim_add_qcn_ie(mac_ctx, local_ie_buf,
-							&local_ie_len);
-		if (QDF_IS_STATUS_ERROR(qdf_status))
-			goto scan_ie_send_fail;
-	}
-
 	wma_ie_params = qdf_mem_malloc(sizeof(*wma_ie_params) + local_ie_len);
 	if (!wma_ie_params) {
 		pe_err("fail to alloc wma_ie_params");