From 5ac2f7bef9dc74b5e7d6b0f5e1c54c4b1b617a1e Mon Sep 17 00:00:00 2001 From: Himanshu Agarwal Date: Fri, 6 May 2016 20:08:10 +0530 Subject: [PATCH] qcacld-3.0: Refactor intra bss forwarded packets count Propagation from qcacld-2.0 to qcacld-3.0. Initially, when a packet is forwarded from txrx layer, it is added in count only once although the count should increase by 2 as there is one rx packet and one tx packet that is not getting considered in the hdd packet count. Add code to ensure that when packet is forwarded from lower layers, it get considered accurately in the packet count. Change-Id: I47bc1e0ecfa2e831438534cf34d37086a306b4e9 CRs-Fixed: 996735 --- core/dp/txrx/ol_rx_fwd.c | 28 +++++++++++++++++----------- core/dp/txrx/ol_rx_fwd.h | 9 +++++---- core/dp/txrx/ol_txrx.c | 3 ++- core/dp/txrx/ol_txrx_types.h | 5 +++-- core/hdd/inc/wlan_hdd_main.h | 3 ++- core/hdd/src/wlan_hdd_assoc.c | 8 +++++--- core/hdd/src/wlan_hdd_hostapd.c | 10 ++++++---- core/hdd/src/wlan_hdd_main.c | 33 +++++++++++++++++++++++++++------ 8 files changed, 67 insertions(+), 32 deletions(-) diff --git a/core/dp/txrx/ol_rx_fwd.c b/core/dp/txrx/ol_rx_fwd.c index 22e173475127..099cba969e42 100644 --- a/core/dp/txrx/ol_rx_fwd.c +++ b/core/dp/txrx/ol_rx_fwd.c @@ -199,14 +199,17 @@ ol_rx_fwd_check(struct ol_txrx_vdev_t *vdev, qdf_net_buf_debug_release_skb(msdu); ol_rx_fwd_to_tx(tx_vdev, msdu); msdu = NULL; /* already handled this MSDU */ - vdev->fwd_to_tx_packets++; + tx_vdev->fwd_tx_packets++; + vdev->fwd_rx_packets++; TXRX_STATS_ADD(pdev, pub.rx.intra_bss_fwd.packets_fwd, 1); } else { qdf_nbuf_t copy; copy = qdf_nbuf_copy(msdu); - if (copy) + if (copy) { ol_rx_fwd_to_tx(tx_vdev, copy); + tx_vdev->fwd_tx_packets++; + } TXRX_STATS_ADD(pdev, pub.rx.intra_bss_fwd.packets_stack_n_fwd, 1); } @@ -233,23 +236,26 @@ ol_rx_fwd_check(struct ol_txrx_vdev_t *vdev, } } -/* 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. - * +/* + * ol_get_intra_bss_fwd_pkts_count() - to get the total tx and rx packets + * that has been forwarded from txrx layer without going to upper layers. * @vdev_id: vdev id + * @fwd_tx_packets: pointer to forwarded tx packets count parameter + * @fwd_rx_packets: pointer to forwarded rx packets count parameter * - * Return: forwarded packet count if vdev is valid - * 0 if vdev is NULL - * + * Return: status -> A_OK - success, A_ERROR - failure */ -uint64_t ol_rx_get_fwd_to_tx_packet_count(uint8_t vdev_id) +A_STATUS ol_get_intra_bss_fwd_pkts_count(uint8_t vdev_id, + unsigned long *fwd_tx_packets, unsigned long *fwd_rx_packets) { struct ol_txrx_vdev_t *vdev = NULL; vdev = (struct ol_txrx_vdev_t *)ol_txrx_get_vdev_from_vdev_id(vdev_id); if (!vdev) - return 0; + return A_ERROR; - return vdev->fwd_to_tx_packets; + *fwd_tx_packets = vdev->fwd_tx_packets; + *fwd_rx_packets = vdev->fwd_rx_packets; + return A_OK; } diff --git a/core/dp/txrx/ol_rx_fwd.h b/core/dp/txrx/ol_rx_fwd.h index 1922f046b808..9e1fc5c37d1b 100644 --- a/core/dp/txrx/ol_rx_fwd.h +++ b/core/dp/txrx/ol_rx_fwd.h @@ -72,9 +72,10 @@ ol_rx_fwd_check(struct ol_txrx_vdev_t *vdev, struct ol_txrx_peer_t *peer, unsigned tid, qdf_nbuf_t msdu_list); -uint64_t -ol_rx_get_fwd_to_tx_packet_count( - uint8_t vdev_id); - +A_STATUS +ol_get_intra_bss_fwd_pkts_count( + uint8_t vdev_id, + unsigned long *fwd_tx_packets, + unsigned long *fwd_rx_packets); #endif /* _OL_RX_FWD_H_ */ diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 665c4fb08a6f..63bdd47c8451 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -1145,7 +1145,8 @@ ol_txrx_vdev_attach(ol_txrx_pdev_handle pdev, vdev->safemode = 0; vdev->drop_unenc = 1; vdev->num_filters = 0; - vdev->fwd_to_tx_packets = 0; + vdev->fwd_tx_packets = 0; + vdev->fwd_rx_packets = 0; qdf_mem_copy(&vdev->mac_addr.raw[0], vdev_mac_addr, OL_TXRX_MAC_ADDR_LEN); diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index 37d10d3cf392..f66c755059ad 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -881,8 +881,9 @@ struct ol_txrx_vdev_t { struct ol_tx_flow_pool_t *pool; #endif - /* packet count that only forwarded and not sent to OS layer */ - uint64_t fwd_to_tx_packets; + /* intra bss forwarded tx and rx packets count */ + uint64_t fwd_tx_packets; + uint64_t fwd_rx_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 7899ea3b8b64..660460ad484d 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -993,7 +993,8 @@ struct hdd_adapter_s { #ifdef MSM_PLATFORM unsigned long prev_rx_packets; unsigned long prev_tx_packets; - unsigned long prev_fwd_packets; + unsigned long prev_fwd_tx_packets; + unsigned long prev_fwd_rx_packets; int connection; #endif bool is_roc_inprogress; diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index e2c43c5eab1d..5c601674c842 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -864,8 +864,9 @@ static void hdd_send_association_event(struct net_device *dev, 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 = - ol_rx_get_fwd_to_tx_packet_count(pAdapter->sessionId); + ol_get_intra_bss_fwd_pkts_count(pAdapter->sessionId, + &pAdapter->prev_fwd_tx_packets, + &pAdapter->prev_fwd_rx_packets); spin_unlock_bh(&pHddCtx->bus_bw_lock); hdd_start_bus_bw_compute_timer(pAdapter); #endif @@ -921,7 +922,8 @@ static void hdd_send_association_event(struct net_device *dev, spin_lock_bh(&pHddCtx->bus_bw_lock); pAdapter->prev_tx_packets = 0; pAdapter->prev_rx_packets = 0; - pAdapter->prev_fwd_packets = 0; + pAdapter->prev_fwd_tx_packets = 0; + pAdapter->prev_fwd_rx_packets = 0; spin_unlock_bh(&pHddCtx->bus_bw_lock); hdd_stop_bus_bw_compute_timer(pAdapter); #endif diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index b56ea7995b52..dda9f5adf0e1 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -1399,9 +1399,10 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, pHostapdAdapter->stats.tx_packets; pHostapdAdapter->prev_rx_packets = pHostapdAdapter->stats.rx_packets; - pHostapdAdapter->prev_fwd_packets = - ol_rx_get_fwd_to_tx_packet_count( - pHostapdAdapter->sessionId); + ol_get_intra_bss_fwd_pkts_count( + pHostapdAdapter->sessionId, + &pHostapdAdapter->prev_fwd_tx_packets, + &pHostapdAdapter->prev_fwd_rx_packets); spin_unlock_bh(&pHddCtx->bus_bw_lock); hdd_start_bus_bw_compute_timer(pHostapdAdapter); } @@ -1597,7 +1598,8 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, spin_lock_bh(&pHddCtx->bus_bw_lock); pHostapdAdapter->prev_tx_packets = 0; pHostapdAdapter->prev_rx_packets = 0; - pHostapdAdapter->prev_fwd_packets = 0; + pHostapdAdapter->prev_fwd_tx_packets = 0; + pHostapdAdapter->prev_fwd_rx_packets = 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 f6a36989777a..566227f71ff0 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -4652,10 +4652,13 @@ static void hdd_bus_bw_compute_cbk(void *priv) { hdd_context_t *hdd_ctx = (hdd_context_t *) priv; hdd_adapter_t *adapter = NULL; - uint64_t tx_packets = 0, rx_packets = 0, fwd_packets = 0; + uint64_t tx_packets = 0, rx_packets = 0; + unsigned long fwd_tx_packets = 0, fwd_rx_packets = 0; + unsigned long fwd_tx_packets_diff = 0, fwd_rx_packets_diff = 0; uint64_t total_tx = 0, total_rx = 0; hdd_adapter_list_node_t *adapterNode = NULL; QDF_STATUS status = 0; + A_STATUS ret; bool connected = false; uint32_t ipa_tx_packets = 0, ipa_rx_packets = 0; @@ -4687,10 +4690,23 @@ static void hdd_bus_bw_compute_cbk(void *priv) adapter->prev_tx_packets); rx_packets += HDD_BW_GET_DIFF(adapter->stats.rx_packets, adapter->prev_rx_packets); - fwd_packets = ol_rx_get_fwd_to_tx_packet_count( - adapter->sessionId); - tx_packets += HDD_BW_GET_DIFF(fwd_packets, - adapter->prev_fwd_packets); + + if (adapter->device_mode == QDF_SAP_MODE || + adapter->device_mode == QDF_P2P_GO_MODE || + adapter->device_mode == QDF_IBSS_MODE) { + + ret = ol_get_intra_bss_fwd_pkts_count( + adapter->sessionId, + &fwd_tx_packets, &fwd_rx_packets); + if (ret == A_OK) { + fwd_tx_packets_diff += HDD_BW_GET_DIFF( + fwd_tx_packets, + adapter->prev_fwd_tx_packets); + fwd_rx_packets_diff += HDD_BW_GET_DIFF( + fwd_tx_packets, + adapter->prev_fwd_rx_packets); + } + } total_rx += adapter->stats.rx_packets; total_tx += adapter->stats.tx_packets; @@ -4698,7 +4714,8 @@ static void hdd_bus_bw_compute_cbk(void *priv) spin_lock_bh(&hdd_ctx->bus_bw_lock); adapter->prev_tx_packets = adapter->stats.tx_packets; adapter->prev_rx_packets = adapter->stats.rx_packets; - adapter->prev_fwd_packets = fwd_packets; + adapter->prev_fwd_tx_packets = fwd_tx_packets; + adapter->prev_fwd_rx_packets = fwd_rx_packets; spin_unlock_bh(&hdd_ctx->bus_bw_lock); connected = true; } @@ -4710,6 +4727,10 @@ static void hdd_bus_bw_compute_cbk(void *priv) hdd_ctx->hdd_txrx_hist[hdd_ctx->hdd_txrx_hist_idx].interval_tx = tx_packets; + /* add intra bss forwarded tx and rx packets */ + tx_packets += fwd_tx_packets_diff; + rx_packets += fwd_rx_packets_diff; + hdd_ipa_uc_stat_query(hdd_ctx, &ipa_tx_packets, &ipa_rx_packets); tx_packets += (uint64_t)ipa_tx_packets; rx_packets += (uint64_t)ipa_rx_packets;