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;