summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimanshu Agarwal <himanaga@qti.qualcomm.com>2016-03-15 15:32:25 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-03-17 13:11:34 +0530
commitb7b56d0b7922483f54e3fbfb44018b7d08fc9c8f (patch)
tree758bac3dc19c4ca71fb374a8ed35775e27e0b027
parent558f9662f6616c3df4f777898413dbe395dbd22e (diff)
qcacld-2.0: Add intra bss forwarded packets count
In lpm qos voting, no. of packets or bytes sent or received in a particular amount of time is recorded and decision of disabling or enabling lpm is done based on that. These packets are recorded in HDD layer. In case when packets are forwarded to tx only, packets don't come upto HDD layer and so in case of intra bss forwarding, lpm qos voting is not being executed appropriately. Add code to calculate the intra bss forwarded packets in txrx layer and update them in calculating lpm qos voting. Change-Id: I805663688cb300c8735b3e2f9680818a7b50bc9f CRs-Fixed: 990868
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c14
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.h1
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_fwd.c26
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_fwd.h3
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx.h4
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx.c1
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx_types.h3
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h1
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c4
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c4
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c6
11 files changed, 66 insertions, 1 deletions
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index f34097790774..7b41017f447a 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -42,6 +42,7 @@
#include "wma_api.h"
#include "vos_utils.h"
#include "wdi_out.h"
+#include "ol_rx_fwd.h"
#define TLSHIM_PEER_AUTHORIZE_WAIT 50
@@ -2653,3 +2654,16 @@ void WLANTL_clear_datapath_stats(void *vos_ctx, uint16_t bitmap)
wdi_in_clear_stats(pdev, bitmap);
return;
}
+
+/* tlshim_get_fwd_to_tx_packet_count() - to get the total rx packets that have
+ * been directly forwarded to tx without coming to upper layers
+ *
+ * @session_id: session id/vdev id
+ *
+ * Returns: forwarded packet count
+ *
+ */
+uint64_t tlshim_get_fwd_to_tx_packet_count(uint8_t session_id)
+{
+ return ol_rx_get_fwd_to_tx_packet_count(session_id);
+}
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.h b/CORE/CLD_TXRX/TLSHIM/tl_shim.h
index 0fb1f8809653..f34737814d3d 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.h
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.h
@@ -124,6 +124,7 @@ VOS_STATUS tl_shim_get_vdevid(struct ol_txrx_peer_t *peer, u_int8_t *vdev_id);
int tlshim_mgmt_roam_event_ind(void *context, u_int32_t vdev_id);
void *tl_shim_get_vdev_by_addr(void *vos_context, uint8_t *mac_addr);
void *tl_shim_get_vdev_by_sta_id(void *vos_context, uint8_t sta_id);
+uint64_t tlshim_get_fwd_to_tx_packet_count(uint8_t session_id);
#ifdef QCA_SUPPORT_TXRX_VDEV_PAUSE_LL
void tl_shim_set_peer_authorized_event(void *vos_ctx, v_U8_t session_id);
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c
index 7072eef4e780..5b08918f00e3 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c
+++ b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c
@@ -42,6 +42,7 @@
#ifdef QCA_ARP_SPOOFING_WAR
#include <ol_if_athvar.h>
#endif
+#include "ol_tx.h"
/*
@@ -233,6 +234,7 @@ ol_rx_fwd_check(
htt_rx_msdu_desc_free(pdev->htt_pdev, msdu);
ol_rx_fwd_to_tx(tx_vdev, msdu);
msdu = NULL; /* already handled this MSDU */
+ vdev->fwd_to_tx_packets++;
TXRX_STATS_ADD(pdev, pub.rx.intra_bss_fwd.packets_fwd,
1);
} else {
@@ -263,3 +265,27 @@ ol_rx_fwd_check(
}
}
}
+
+/* ol_rx_get_fwd_to_tx_packet_count() - to get the total rx packets that has
+ * been forwarded to tx without going to OS layer.
+ *
+ * @vdev_id: vdev id
+ *
+ * Return: forwarded packet count if vdev is valid
+ * 0 if vdev is NULL
+ *
+ */
+uint64_t ol_rx_get_fwd_to_tx_packet_count(uint8_t vdev_id)
+{
+ struct ol_txrx_vdev_t *vdev = NULL;
+
+ vdev = (struct ol_txrx_vdev_t *)ol_txrx_get_vdev_from_vdev_id(vdev_id);
+ if (!vdev) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: vdev is NULL for vdev id %d", __func__, vdev_id);
+ return 0;
+ }
+
+ return vdev->fwd_to_tx_packets;
+}
+
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.h b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.h
index 928c151625f9..68e71b0350f3 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.h
+++ b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.h
@@ -80,5 +80,8 @@ ol_rx_fwd_check(
unsigned tid,
adf_nbuf_t msdu_list);
+uint64_t
+ol_rx_get_fwd_to_tx_packet_count(
+ uint8_t vdev_id);
#endif /* _OL_RX_FWD_H_ */
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx.h b/CORE/CLD_TXRX/TXRX/ol_tx.h
index ed6e6439c16c..65275eb0ea64 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx.h
+++ b/CORE/CLD_TXRX/TXRX/ol_tx.h
@@ -121,4 +121,8 @@ ol_tx_vdev_ll_pause_start_timer(struct ol_txrx_vdev_t *vdev);
void
ol_tx_pdev_ll_pause_queue_send_all(struct ol_txrx_pdev_t *pdev);
+
+struct ol_txrx_vdev_t *
+ol_txrx_get_vdev_from_vdev_id(uint8_t vdev_id);
+
#endif /* _OL_TX__H_ */
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx.c b/CORE/CLD_TXRX/TXRX/ol_txrx.c
index e70a4e7b3aff..8adb3fc0e1b2 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx.c
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx.c
@@ -1036,6 +1036,7 @@ ol_txrx_vdev_attach(
vdev->safemode = 0;
vdev->drop_unenc = 1;
vdev->num_filters = 0;
+ vdev->fwd_to_tx_packets = 0;
#if defined(CONFIG_PER_VDEV_TX_DESC_POOL)
adf_os_atomic_init(&vdev->tx_desc_count);
#endif
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
index 00fb5cf68d83..d76f26c0da49 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
@@ -967,6 +967,9 @@ struct ol_txrx_vdev_t {
/* Default OCB TX parameter */
struct ocb_tx_ctrl_hdr_t *ocb_def_tx_param;
+
+ /* packet count that only forwarded and not dent to OS layer */
+ uint64_t fwd_to_tx_packets;
};
struct ol_rx_reorder_array_elem_t {
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 496bc79c6d72..3971dcf22e9c 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1133,6 +1133,7 @@ struct hdd_adapter_s
#ifdef FEATURE_BUS_BANDWIDTH
unsigned long prev_rx_packets;
unsigned long prev_tx_packets;
+ unsigned long prev_fwd_packets;
unsigned long prev_tx_bytes;
int connection;
#endif
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 95694d88a2d8..571bf14b3a7e 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -70,6 +70,7 @@
#endif
#include <vos_sched.h>
#include <wlan_logging_sock_svc.h>
+#include "tl_shim.h"
struct ether_addr
{
@@ -794,6 +795,8 @@ static void hdd_SendAssociationEvent(struct net_device *dev,tCsrRoamInfo *pCsrRo
spin_lock_bh(&pHddCtx->bus_bw_lock);
pAdapter->prev_tx_packets = pAdapter->stats.tx_packets;
pAdapter->prev_rx_packets = pAdapter->stats.rx_packets;
+ pAdapter->prev_fwd_packets =
+ tlshim_get_fwd_to_tx_packet_count(pAdapter->sessionId);
pAdapter->prev_tx_bytes = pAdapter->stats.tx_bytes;
spin_unlock_bh(&pHddCtx->bus_bw_lock);
hdd_start_bus_bw_compute_timer(pAdapter);
@@ -843,6 +846,7 @@ static void hdd_SendAssociationEvent(struct net_device *dev,tCsrRoamInfo *pCsrRo
spin_lock_bh(&pHddCtx->bus_bw_lock);
pAdapter->prev_tx_packets = 0;
pAdapter->prev_rx_packets = 0;
+ pAdapter->prev_fwd_packets = 0;
pAdapter->prev_tx_bytes = 0;
spin_unlock_bh(&pHddCtx->bus_bw_lock);
hdd_stop_bus_bw_compute_timer(pAdapter);
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 9e9af4f184b9..b6995887bbf7 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -81,6 +81,7 @@
#include "wlan_hdd_misc.h"
#include <vos_utils.h>
#include "vos_cnss.h"
+#include "tl_shim.h"
#include "wma.h"
#ifdef DEBUG
@@ -1795,6 +1796,8 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
spin_lock_bh(&pHddCtx->bus_bw_lock);
pHostapdAdapter->prev_tx_packets = pHostapdAdapter->stats.tx_packets;
pHostapdAdapter->prev_rx_packets = pHostapdAdapter->stats.rx_packets;
+ pHostapdAdapter->prev_fwd_packets =
+ tlshim_get_fwd_to_tx_packet_count(pHostapdAdapter->sessionId);
pHostapdAdapter->prev_tx_bytes =
pHostapdAdapter->stats.tx_bytes;
spin_unlock_bh(&pHddCtx->bus_bw_lock);
@@ -1980,6 +1983,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
spin_lock_bh(&pHddCtx->bus_bw_lock);
pHostapdAdapter->prev_tx_packets = 0;
pHostapdAdapter->prev_rx_packets = 0;
+ pHostapdAdapter->prev_fwd_packets = 0;
pHostapdAdapter->prev_tx_bytes = 0;
spin_unlock_bh(&pHddCtx->bus_bw_lock);
hdd_stop_bus_bw_compute_timer(pHostapdAdapter);
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index d0adfde36359..9423e3264068 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -13400,7 +13400,7 @@ static void hdd_bus_bw_compute_cbk(void *priv)
{
hdd_context_t *pHddCtx = (hdd_context_t *)priv;
hdd_adapter_t *pAdapter = NULL;
- uint64_t tx_packets= 0, rx_packets= 0, tx_bytes = 0;
+ uint64_t tx_packets = 0, rx_packets = 0, fwd_packets = 0, tx_bytes = 0;
uint64_t total_tx = 0, total_rx = 0;
hdd_adapter_list_node_t *pAdapterNode = NULL;
VOS_STATUS status = 0;
@@ -13447,6 +13447,9 @@ static void hdd_bus_bw_compute_cbk(void *priv)
pAdapter->prev_tx_bytes);
rx_packets += HDD_BW_GET_DIFF(pAdapter->stats.rx_packets,
pAdapter->prev_rx_packets);
+ fwd_packets = tlshim_get_fwd_to_tx_packet_count(pAdapter->sessionId);
+ tx_packets += HDD_BW_GET_DIFF(fwd_packets,
+ pAdapter->prev_fwd_packets);
hdd_set_bundle_require(pAdapter->sessionId, pHddCtx, tx_bytes);
@@ -13458,6 +13461,7 @@ static void hdd_bus_bw_compute_cbk(void *priv)
pAdapter->prev_tx_packets = pAdapter->stats.tx_packets;
pAdapter->prev_tx_bytes = pAdapter->stats.tx_bytes;
pAdapter->prev_rx_packets = pAdapter->stats.rx_packets;
+ pAdapter->prev_fwd_packets = fwd_packets;
spin_unlock_bh(&pHddCtx->bus_bw_lock);
connected = TRUE;
}