Browse Source

qcacld-3.0: Check if TWT session exists for get and clear stats

Check if a TWT session has been created for the dialog_id given
in get and clear stats command request. Reject it in driver if
session doesn't exist.

Change-Id: Ie9a761128e3a0188c4ece9a7bac58268a2ebb88f
CRs-Fixed: 2864284
Rajasekaran Kalidoss 4 years ago
parent
commit
58cc8f9bcd
1 changed files with 37 additions and 0 deletions
  1. 37 0
      core/hdd/src/wlan_hdd_twt.c

+ 37 - 0
core/hdd/src/wlan_hdd_twt.c

@@ -2575,6 +2575,8 @@ static int hdd_twt_clear_session_traffic_stats(struct hdd_adapter *adapter,
 	int ret, id;
 	uint32_t dialog_id;
 	uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
+	bool is_stats_tgt_cap_enabled;
+	QDF_STATUS status;
 
 	ret = wlan_cfg80211_nla_parse_nested(
 				tb,
@@ -2584,6 +2586,13 @@ static int hdd_twt_clear_session_traffic_stats(struct hdd_adapter *adapter,
 	if (ret)
 		return ret;
 
+	ucfg_mlme_get_twt_statistics_tgt_cap(adapter->hdd_ctx->psoc,
+					     &is_stats_tgt_cap_enabled);
+	if (!is_stats_tgt_cap_enabled) {
+		hdd_debug("TWT Stats not supported by target");
+		return -EOPNOTSUPP;
+	}
+
 	id = QCA_WLAN_VENDOR_ATTR_TWT_STATS_FLOW_ID;
 	if (!tb[id]) {
 		hdd_err_rl("TWT Clear stats - dialog id param is must");
@@ -2598,6 +2607,19 @@ static int hdd_twt_clear_session_traffic_stats(struct hdd_adapter *adapter,
 	hdd_debug("dialog_id %d peer mac_addr " QDF_MAC_ADDR_FMT,
 		  dialog_id, QDF_MAC_ADDR_REF(peer_mac));
 
+	status = hdd_twt_check_all_twt_support(adapter->hdd_ctx->psoc,
+					       dialog_id);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		hdd_debug("All TWT sessions not supported by target");
+		return -EOPNOTSUPP;
+	}
+
+	if (!ucfg_mlme_is_twt_setup_done(adapter->hdd_ctx->psoc,
+					 &hdd_sta_ctx->conn_info.bssid,
+					 dialog_id)) {
+		hdd_debug("TWT session %d setup incomplete", dialog_id);
+		return -EINVAL;
+	}
 	ret = wlan_cfg80211_mc_twt_clear_infra_cp_stats(adapter->vdev,
 							dialog_id, peer_mac);
 
@@ -2673,6 +2695,7 @@ static int hdd_twt_get_session_traffic_stats(struct hdd_adapter *adapter,
 	QDF_STATUS qdf_status;
 	uint32_t dialog_id;
 	uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
+	bool is_stats_tgt_cap_enabled;
 
 	ret = wlan_cfg80211_nla_parse_nested(
 				tb,
@@ -2682,6 +2705,13 @@ static int hdd_twt_get_session_traffic_stats(struct hdd_adapter *adapter,
 	if (ret)
 		return ret;
 
+	ucfg_mlme_get_twt_statistics_tgt_cap(adapter->hdd_ctx->psoc,
+					     &is_stats_tgt_cap_enabled);
+	if (!is_stats_tgt_cap_enabled) {
+		hdd_debug("TWT Stats not supported by target");
+		return -EOPNOTSUPP;
+	}
+
 	id = QCA_WLAN_VENDOR_ATTR_TWT_STATS_FLOW_ID;
 	if (tb[id])
 		dialog_id = (uint32_t)nla_get_u8(tb[id]);
@@ -2696,6 +2726,13 @@ static int hdd_twt_get_session_traffic_stats(struct hdd_adapter *adapter,
 	hdd_debug("get_stats peer mac_addr " QDF_MAC_ADDR_FMT,
 		  QDF_MAC_ADDR_REF(peer_mac));
 
+	if (!ucfg_mlme_is_twt_setup_done(adapter->hdd_ctx->psoc,
+					 &hdd_sta_ctx->conn_info.bssid,
+					 dialog_id)) {
+		hdd_debug("TWT session %d setup incomplete", dialog_id);
+		return -EINVAL;
+	}
+
 	qdf_status = hdd_twt_request_session_traffic_stats(adapter,
 							   dialog_id, peer_mac);