diff options
| author | Himanshu Agarwal <himanaga@qti.qualcomm.com> | 2016-03-30 18:53:58 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-04-28 16:50:58 +0530 |
| commit | 63916a50c4e7e894cf90316ba4a7c920e892e73f (patch) | |
| tree | 6ad826890db9a6a31e18efe15cf49909a5aaff03 | |
| parent | be5a9e402249ae1e28711eed56e43041b747527b (diff) | |
qcacld-2.0: Refactor intra bss forwarded packets count
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
| -rw-r--r-- | CORE/CLD_TXRX/TLSHIM/tl_shim.c | 16 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TLSHIM/tl_shim.h | 3 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_rx_fwd.c | 25 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_rx_fwd.h | 8 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_txrx.c | 3 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_txrx_types.h | 5 | ||||
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_main.h | 3 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_assoc.c | 7 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_hostapd.c | 9 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 29 |
10 files changed, 74 insertions, 34 deletions
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c index 79211e7b8e75..a4243388e8d6 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c @@ -2651,17 +2651,21 @@ void WLANTL_clear_datapath_stats(void *vos_ctx, uint16_t 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 - * +/** + * tlshim_get_intra_bss_fwd_pkts_count() - to get the total tx and rx packets + * that have been forwarded from txrx layer without coming to upper layers. * @session_id: session id/vdev id + * @fwd_tx_packets: pointer to forwarded tx packets count parameter + * @fwd_rx_packets: pointer to forwarded rx packets count parameter * - * Returns: forwarded packet count + * Returns: status -> A_OK - success, A_ERROR - failure * */ -uint64_t tlshim_get_fwd_to_tx_packet_count(uint8_t session_id) +A_STATUS tlshim_get_intra_bss_fwd_pkts_count(uint8_t session_id, + unsigned long *fwd_tx_packets, unsigned long *fwd_rx_packets) { - return ol_rx_get_fwd_to_tx_packet_count(session_id); + return ol_get_intra_bss_fwd_pkts_count(session_id, fwd_tx_packets, + fwd_rx_packets); } /* diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.h b/CORE/CLD_TXRX/TLSHIM/tl_shim.h index 9a0c9ef03389..984c155eee41 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.h +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.h @@ -126,10 +126,11 @@ 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); int tlshim_get_ll_queue_pause_bitmap(uint8_t session_id, uint8_t *pause_bitmap, __adf_time_t *pause_timestamp); +A_STATUS tlshim_get_intra_bss_fwd_pkts_count(uint8_t session_id, + unsigned long *fwd_tx_packets, unsigned long *fwd_rx_packets); #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 e9cf932ff36c..d4117d73ef8c 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014, 2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -234,7 +234,8 @@ 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++; + tx_vdev->fwd_tx_packets++; + vdev->fwd_rx_packets++; TXRX_STATS_ADD(pdev, pub.rx.intra_bss_fwd.packets_fwd, 1); } else { @@ -242,6 +243,7 @@ ol_rx_fwd_check( copy = adf_nbuf_copy(msdu); 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); @@ -266,23 +268,28 @@ 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. +/* + * 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/CLD_TXRX/TXRX/ol_rx_fwd.h b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.h index 68e71b0350f3..035e91f6f843 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.h +++ b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.h @@ -80,8 +80,10 @@ 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); +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/CLD_TXRX/TXRX/ol_txrx.c b/CORE/CLD_TXRX/TXRX/ol_txrx.c index 8289b6bde0b8..2b8dbed9411f 100644 --- a/CORE/CLD_TXRX/TXRX/ol_txrx.c +++ b/CORE/CLD_TXRX/TXRX/ol_txrx.c @@ -1041,7 +1041,8 @@ ol_txrx_vdev_attach( 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; #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 b1a1798ed85e..b529e852deee 100644 --- a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h +++ b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h @@ -973,8 +973,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; + /* 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 9a80fc9009c5..c04571a2e686 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -1169,7 +1169,8 @@ 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_fwd_tx_packets; + unsigned long prev_fwd_rx_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 e2d0c41bb86d..da8f8875dd0b 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -796,8 +796,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); + tlshim_get_intra_bss_fwd_pkts_count(pAdapter->sessionId, + &pAdapter->prev_fwd_tx_packets, &pAdapter->prev_fwd_rx_packets); pAdapter->prev_tx_bytes = pAdapter->stats.tx_bytes; spin_unlock_bh(&pHddCtx->bus_bw_lock); hdd_start_bus_bw_compute_timer(pAdapter); @@ -847,7 +847,8 @@ 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_fwd_tx_packets = 0; + pAdapter->prev_fwd_rx_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 f56a73301fac..8a6de894828f 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -1809,8 +1809,10 @@ 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); + tlshim_get_intra_bss_fwd_pkts_count( + pHostapdAdapter->sessionId, + &pHostapdAdapter->prev_fwd_tx_packets, + &pHostapdAdapter->prev_fwd_rx_packets); pHostapdAdapter->prev_tx_bytes = pHostapdAdapter->stats.tx_bytes; spin_unlock_bh(&pHddCtx->bus_bw_lock); @@ -2004,7 +2006,8 @@ 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_fwd_tx_packets = 0; + pHostapdAdapter->prev_fwd_rx_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 d6383694ba6d..cc6ac6ee2d52 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -13550,10 +13550,13 @@ 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, fwd_packets = 0, tx_bytes = 0; + uint64_t tx_packets = 0, rx_packets = 0, tx_bytes = 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 *pAdapterNode = NULL; VOS_STATUS status = 0; + A_STATUS ret; v_BOOL_t connected = FALSE; #ifdef IPA_UC_OFFLOAD uint32_t ipa_tx_packets = 0, ipa_rx_packets = 0; @@ -13597,9 +13600,20 @@ 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); + + if (pAdapter->device_mode == WLAN_HDD_SOFTAP || + pAdapter->device_mode == WLAN_HDD_P2P_GO || + pAdapter->device_mode == WLAN_HDD_IBSS) { + + ret = tlshim_get_intra_bss_fwd_pkts_count(pAdapter->sessionId, + &fwd_tx_packets, &fwd_rx_packets); + if (ret == A_OK) { + fwd_tx_packets_diff += HDD_BW_GET_DIFF(fwd_tx_packets, + pAdapter->prev_fwd_tx_packets); + fwd_rx_packets_diff += HDD_BW_GET_DIFF(fwd_tx_packets, + pAdapter->prev_fwd_rx_packets); + } + } hdd_set_bundle_require(pAdapter->sessionId, pHddCtx, tx_bytes); @@ -13611,7 +13625,8 @@ 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; + pAdapter->prev_fwd_tx_packets = fwd_tx_packets; + pAdapter->prev_fwd_rx_packets = fwd_rx_packets; spin_unlock_bh(&pHddCtx->bus_bw_lock); connected = TRUE; } @@ -13621,6 +13636,10 @@ static void hdd_bus_bw_compute_cbk(void *priv) pHddCtx->hdd_txrx_hist[pHddCtx->hdd_txrx_hist_idx].interval_rx = rx_packets; pHddCtx->hdd_txrx_hist[pHddCtx->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; + #ifdef IPA_UC_OFFLOAD hdd_ipa_uc_stat_query(pHddCtx, &ipa_tx_packets, &ipa_rx_packets); tx_packets += (uint64_t)ipa_tx_packets; |
