Procházet zdrojové kódy

qcacld-3.0: Add support for TWT clear_traffic_stats

Add support for TWT clear_traffic_stats

Change-Id: Id5d5859f1953736b6d6a62f0e41037d1b7f383b7
CRs-Fixed: 3085890
Srinivas Girigowda před 3 roky
rodič
revize
0a5273b343

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

@@ -252,6 +252,8 @@ static int hdd_twt_configure(struct hdd_adapter *adapter,
 		ret = osif_twt_get_session_traffic_stats(vdev, twt_param_attr);
 		break;
 	case QCA_WLAN_TWT_CLEAR_STATS:
+		ret = osif_twt_clear_session_traffic_stats(vdev,
+							   twt_param_attr);
 		break;
 	default:
 		hdd_err("Invalid TWT Operation");

+ 10 - 0
os_if/twt/inc/osif_twt_ext_req.h

@@ -208,6 +208,9 @@ QDF_STATUS osif_twt_get_stats_response(struct wlan_objmgr_vdev *vdev,
 				       struct twt_infra_cp_stats_event *params,
 				       uint32_t num_session_stats);
 
+int osif_twt_clear_session_traffic_stats(struct wlan_objmgr_vdev *vdev,
+					 struct nlattr *twt_param_attr);
+
 #else
 static inline
 int osif_twt_setup_req(struct wlan_objmgr_vdev *vdev,
@@ -271,6 +274,13 @@ int osif_twt_get_session_traffic_stats(struct wlan_objmgr_vdev *vdev,
 	return 0;
 }
 
+static inline
+int osif_twt_clear_session_traffic_stats(struct wlan_objmgr_vdev *vdev,
+					 struct nlattr *twt_param_attr)
+{
+	return 0;
+}
+
 #endif
 #endif /* _OSIF_TWT_EXT_REQ_H_ */
 

+ 70 - 0
os_if/twt/src/osif_twt_ext_req.c

@@ -2066,3 +2066,73 @@ int osif_twt_get_session_traffic_stats(struct wlan_objmgr_vdev *vdev,
 
 	return qdf_status_to_os_return(qdf_status);
 }
+
+int osif_twt_clear_session_traffic_stats(struct wlan_objmgr_vdev *vdev,
+					 struct nlattr *twt_param_attr)
+{
+	struct wlan_objmgr_psoc *psoc;
+	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_TWT_STATS_MAX + 1];
+	int ret, id;
+	uint32_t dialog_id;
+	bool is_stats_tgt_cap_enabled;
+	QDF_STATUS status;
+	struct qdf_mac_addr peer_mac;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc)
+		return -EINVAL;
+
+	ret = wlan_cfg80211_nla_parse_nested(tb,
+				QCA_WLAN_VENDOR_ATTR_TWT_STATS_MAX,
+				twt_param_attr,
+				qca_wlan_vendor_twt_stats_dialog_policy);
+
+	if (ret)
+		return ret;
+
+	ucfg_twt_get_twt_stats_enabled(psoc, &is_stats_tgt_cap_enabled);
+	if (!is_stats_tgt_cap_enabled) {
+		osif_debug("TWT Stats not supported by target");
+		return -EOPNOTSUPP;
+	}
+
+	id = QCA_WLAN_VENDOR_ATTR_TWT_STATS_FLOW_ID;
+	if (!tb[id]) {
+		osif_err_rl("TWT Clear stats - dialog id param is must");
+		return -EINVAL;
+	}
+
+	if (osif_fill_peer_macaddr(vdev, peer_mac.bytes))
+		return -EINVAL;
+
+	dialog_id = (uint32_t)nla_get_u8(tb[id]);
+	osif_debug("dialog_id %d peer mac_addr "QDF_MAC_ADDR_FMT,
+		   dialog_id, QDF_MAC_ADDR_REF(peer_mac.bytes));
+
+	status = ucfg_twt_check_all_twt_support(psoc, dialog_id);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		osif_debug("All TWT sessions not supported by target");
+		return -EOPNOTSUPP;
+	}
+
+	if (ucfg_twt_is_command_in_progress(psoc, &peer_mac,
+					    TWT_ALL_SESSIONS_DIALOG_ID,
+					    WLAN_TWT_STATISTICS, NULL) ||
+	    ucfg_twt_is_command_in_progress(psoc, &peer_mac,
+					    TWT_ALL_SESSIONS_DIALOG_ID,
+					    WLAN_TWT_CLEAR_STATISTICS,
+					    NULL)) {
+		osif_warn("Already TWT statistics or clear statistics exists");
+		return -EALREADY;
+	}
+
+	if (!ucfg_twt_is_setup_done(psoc, &peer_mac, dialog_id)) {
+		osif_debug("TWT session %d setup incomplete", dialog_id);
+		return -EAGAIN;
+	}
+
+	ret = wlan_cfg80211_mc_twt_clear_infra_cp_stats(vdev, dialog_id,
+							peer_mac.bytes);
+
+	return ret;
+}