From 1514e796b6238d3220598651d3a04b5500d786a8 Mon Sep 17 00:00:00 2001 From: Jeffin Mammen Date: Mon, 20 May 2019 10:30:44 +0530 Subject: [PATCH] qcacmn: Update Peer rx/tx rate based on DATA packets Packets sent/received at fixed rate were also considered to update the client rates as displayed in wlanconfig command output. An idle client transmits NULL packets at basic rate and hence rx rate shows up the basic rate when an idle client is connected. Consider only data packets to update rates. Do not consider NULL packets for rate update. CRs-Fixed: 2435447 Change-Id: Icbf9f2a656bb0d36e16d953952c529185c119f17 --- dp/wifi3.0/dp_internal.h | 24 ++++++++++++++++++++++++ dp/wifi3.0/dp_rx_mon_status.c | 3 ++- qdf/inc/qdf_net_types.h | 7 +++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 246e3f0dcd..9a583e6c19 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -1035,6 +1035,30 @@ static inline int dp_get_mac_id_for_mac(struct dp_soc *soc, uint32_t mac_id) bool dp_is_soc_reinit(struct dp_soc *soc); +/* + * dp_is_subtype_data() - check if the frame subtype is data + * + * @frame_ctrl: Frame control field + * + * check the frame control field and verify if the packet + * is a data packet. + * + * Return: true or false + */ +static inline bool dp_is_subtype_data(uint16_t frame_ctrl) +{ + if (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_TYPE_MASK) == + QDF_IEEE80211_FC0_TYPE_DATA) && + (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) == + QDF_IEEE80211_FC0_SUBTYPE_DATA) || + ((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) == + QDF_IEEE80211_FC0_SUBTYPE_QOS))) { + return true; + } + + return false; +} + #ifdef WDI_EVENT_ENABLE QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev, uint32_t stats_type_upload_mask, diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index de5de6d492..eb02142223 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -281,7 +281,8 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, struct dp_peer *peer, if (is_invalid_peer) return; - dp_rx_rate_stats_update(peer, ppdu); + if (dp_is_subtype_data(ppdu->frame_ctrl)) + dp_rx_rate_stats_update(peer, ppdu); #if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE dp_wdi_event_handler(WDI_EVENT_UPDATE_DP_STATS, pdev->soc, diff --git a/qdf/inc/qdf_net_types.h b/qdf/inc/qdf_net_types.h index fdf61628bc..bad9ba4d85 100644 --- a/qdf/inc/qdf_net_types.h +++ b/qdf/inc/qdf_net_types.h @@ -67,6 +67,13 @@ typedef __in6_addr_t in6_addr_t; #define QDF_IEEE80211_FC1_TODS 0x01 #define QDF_IEEE80211_FC1_FROMDS 0x02 +#define QDF_IEEE80211_FC0_TYPE_MASK 0x0c +#define QDF_IEEE80211_FC0_SUBTYPE_MASK 0xf0 + +#define QDF_IEEE80211_FC0_TYPE_DATA 0x08 +#define QDF_IEEE80211_FC0_SUBTYPE_DATA 0x00 +#define QDF_IEEE80211_FC0_SUBTYPE_QOS 0x80 + #define QDF_NET_IS_MAC_MULTICAST(_a) (*(_a) & 0x01) /**