Procházet zdrojové kódy

qcacmn: Add support to send TWT IE in assoc/probe rsp

Add support to send TWT IE in assoc/probe rsp to fulfill WFA requirement
FW sends TWT IE in mgmt rx event for probe req and assoc req. Send this
IE in probe rsp and assoc rsp. This change takes care of extracting TWT
IE in mgmt rx event.

Change-Id: I1a97eb58c03f76c7ced31349dc0e3b4a908ceda0
CRs-Fixed: 3585625
Kiran Venkatappa před 2 roky
rodič
revize
42e618a774

+ 30 - 4
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h

@@ -844,14 +844,40 @@ struct frm_conn_ap {
 	uint8_t is_conn_ap_frm;
 };
 
+/**
+ * enum mgmt_rx_evt_ext_meta_id - Identifier to rx_params ext data
+ * @MGMT_RX_PARAMS_EXT_META_ADDBA: Tag id to indicate ADDBA meta info
+ * @MGMT_RX_PARAMS_EXT_META_TWT: Tag id to indicate TWT IE in meta info
+ */
+enum mgmt_rx_evt_ext_meta_id {
+	MGMT_RX_PARAMS_EXT_META_ADDBA,
+	MGMT_RX_PARAMS_EXT_META_TWT,
+};
+
+#define MAX_TWT_IE_RX_PARAMS_LEN 255
 /**
  * struct mgmt_rx_event_ext_params - Host mgmt extended params
- * @ba_win_size: Block-Ack window size
- * @reo_win_size: Reo win size
+ * @meta_id: Meta id to identify if this is ADDBA or TWT related info
+ * @add_ba_params: set for meta_id MGMT_RX_PARAMS_EXT_META_ADDBA
+ *     @ba_win_size: Block-Ack window size
+ *     @reo_win_size: Reo win size
+ * @twt_ie:  Set when meta_id is MGMT_RX_PARAMS_EXT_META_TWT
+ *     @ie_len: IE len of TWT IE from FW
+ *     @ie_data: IE data of TWT IE from FW
+ * @u: union of above two params as it is mutually exclusive.
  */
 struct mgmt_rx_event_ext_params {
-	uint16_t ba_win_size;
-	uint16_t reo_win_size;
+	enum mgmt_rx_evt_ext_meta_id meta_id;
+	union {
+		struct add_ba_params {
+			uint16_t ba_win_size;
+			uint16_t reo_win_size;
+		} addba;
+		struct twt_ie {
+			uint16_t ie_len;
+			uint8_t ie_data[MAX_TWT_IE_RX_PARAMS_LEN];
+		} twt;
+	} u;
 };
 
 #ifdef WLAN_FEATURE_11BE_MLO

+ 39 - 16
wmi/src/wmi_unified_tlv.c

@@ -13402,6 +13402,12 @@ static QDF_STATUS extract_mgmt_rx_ext_params_tlv(wmi_unified_t wmi_handle,
 	WMI_MGMT_RX_EVENTID_param_tlvs *param_tlvs;
 	wmi_mgmt_rx_params_ext *ext_params_tlv;
 	wmi_mgmt_rx_hdr *ev_hdr;
+	wmi_mgmt_rx_params_ext_meta_t meta_id;
+	uint8_t *ie_data;
+
+	/* initialize to zero and set it only if tlv has valid meta data */
+	ext_params->u.addba.ba_win_size = 0;
+	ext_params->u.addba.reo_win_size = 0;
 
 	param_tlvs = (WMI_MGMT_RX_EVENTID_param_tlvs *) evt_buf;
 	if (!param_tlvs) {
@@ -13417,24 +13423,41 @@ static QDF_STATUS extract_mgmt_rx_ext_params_tlv(wmi_unified_t wmi_handle,
 
 	ext_params_tlv = param_tlvs->mgmt_rx_params_ext;
 	if (ext_params_tlv) {
-		ext_params->ba_win_size = WMI_RX_PARAM_EXT_BA_WIN_SIZE_GET(
-					ext_params_tlv->mgmt_rx_params_ext_dword1);
-		if (ext_params->ba_win_size > 1024) {
-			wmi_info("ba win size %d from TLV is Invalid",
-				 ext_params->ba_win_size);
-			return QDF_STATUS_E_INVAL;
-		}
+		meta_id = WMI_RX_PARAM_EXT_META_ID_GET(
+				ext_params_tlv->mgmt_rx_params_ext_dword0);
+		if (meta_id == WMI_RX_PARAMS_EXT_META_ADDBA) {
+			ext_params->meta_id = MGMT_RX_PARAMS_EXT_META_ADDBA;
+			ext_params->u.addba.ba_win_size =
+				WMI_RX_PARAM_EXT_BA_WIN_SIZE_GET(
+				ext_params_tlv->mgmt_rx_params_ext_dword1);
+			if (ext_params->u.addba.ba_win_size > 1024) {
+				wmi_info("ba win size %d from TLV is Invalid",
+					 ext_params->u.addba.ba_win_size);
+				return QDF_STATUS_E_INVAL;
+			}
 
-		ext_params->reo_win_size = WMI_RX_PARAM_EXT_REO_WIN_SIZE_GET(
-					ext_params_tlv->mgmt_rx_params_ext_dword1);
-		if (ext_params->reo_win_size > 2048) {
-			wmi_info("reo win size %d from TLV is Invalid",
-				 ext_params->reo_win_size);
-			return QDF_STATUS_E_INVAL;
+			ext_params->u.addba.reo_win_size =
+				WMI_RX_PARAM_EXT_REO_WIN_SIZE_GET(
+				ext_params_tlv->mgmt_rx_params_ext_dword1);
+			if (ext_params->u.addba.reo_win_size > 2048) {
+				wmi_info("reo win size %d from TLV is Invalid",
+					 ext_params->u.addba.reo_win_size);
+				return QDF_STATUS_E_INVAL;
+			}
+		}
+		if (meta_id == WMI_RX_PARAMS_EXT_META_TWT) {
+			ext_params->meta_id = MGMT_RX_PARAMS_EXT_META_TWT;
+			ext_params->u.twt.ie_len =
+				ext_params_tlv->twt_ie_buf_len;
+			ie_data = param_tlvs->ie_data;
+			if (ext_params->u.twt.ie_len &&
+			    (ext_params->u.twt.ie_len <
+					MAX_TWT_IE_RX_PARAMS_LEN)) {
+				qdf_mem_copy(ext_params->u.twt.ie_data,
+					     ie_data,
+					     ext_params_tlv->twt_ie_buf_len);
+			}
 		}
-	} else {
-		ext_params->ba_win_size = 0;
-		ext_params->reo_win_size = 0;
 	}
 
 	return QDF_STATUS_SUCCESS;