From 909e3f9b43cb29c826d6f36ad47d69e7b899281c Mon Sep 17 00:00:00 2001 From: Alok Kumar Date: Sun, 8 Sep 2019 20:08:43 +0530 Subject: [PATCH] qcacld-3.0: Register TxRx callbacks for pkt capture mode Register TxRx callbacks to pktcapture_ops for packet capture mode Change-Id: I7de52bfd94b992cd5fd7c64e5352fe76ed1a7f3b CRs-Fixed: 2533876 --- core/dp/txrx/ol_txrx.c | 125 ++++++++++++++++++++++++++++++++++- core/dp/txrx/ol_txrx_types.h | 9 ++- 2 files changed, 132 insertions(+), 2 deletions(-) diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 30dffd9fcc6ca..a8b5aa585f7ec 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -5917,6 +5917,117 @@ void ol_deregister_packetdump_callback(struct cdp_soc_t *soc_hdl, pdev->ol_rx_packetdump_cb = NULL; } +#ifdef WLAN_FEATURE_PKT_CAPTURE +/** + * ol_txrx_register_pktcapture_cb() - Register pkt capture mode callback + * @soc: soc handle + * @pdev_id: pdev id + * @context: virtual device's osif_dev + * @cb: callback to register + * + * Return: QDF_STATUS Enumeration + */ +static QDF_STATUS ol_txrx_register_pktcapture_cb( + struct cdp_soc_t *soc, + uint8_t pdev_id, + void *context, + QDF_STATUS(cb)(void *, qdf_nbuf_t)) +{ + struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id( + cdp_soc_t_to_ol_txrx_soc_t(soc), + pdev_id); + + if (!pdev) { + ol_txrx_err("pdev NULL!"); + return QDF_STATUS_E_INVAL; + } + + pdev->mon_osif_dev = context; + pdev->mon_cb = cb; + return QDF_STATUS_SUCCESS; +} + +/** + * ol_txrx_deregister_pktcapture_cb() - Register pkt capture mode callback + * @soc: soc handle + * @pdev_id: pdev id + * + * Return: QDF_STATUS Enumeration + */ +static QDF_STATUS ol_txrx_deregister_pktcapture_cb(struct cdp_soc_t *soc, + uint8_t pdev_id) +{ + ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id( + cdp_soc_t_to_ol_txrx_soc_t(soc), + pdev_id); + + if (qdf_unlikely(!pdev)) { + qdf_print("%s: pdev is NULL!\n", __func__); + qdf_assert(0); + return QDF_STATUS_E_INVAL; + } + + pdev->mon_osif_dev = NULL; + pdev->mon_cb = NULL; + + return QDF_STATUS_SUCCESS; +} + +/** + * ol_txrx_get_pktcapture_mode() - return pktcapture mode + * @soc: soc handle + * @pdev_id: pdev id + * + * Return: 0 - disable + * 1 - Mgmt packets + * 2 - Data packets + * 3 - Both Mgmt and Data packets + */ +static uint8_t ol_txrx_get_pktcapture_mode(struct cdp_soc_t *soc, + uint8_t pdev_id) +{ + struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id( + cdp_soc_t_to_ol_txrx_soc_t(soc), + pdev_id); + + if (!pdev) { + qdf_print("%s: pdev is NULL\n", __func__); + return 0; + } + + if (!pdev->mon_cb || !pdev->mon_osif_dev) + return 0; + + return pdev->pktcapture_mode_value; +} + +/** + * ol_txrx_set_pktcapture_mode() - set pktcapture mode + * @soc: soc handle + * @pdev_id: pdev id + * @val : 0 - disable + * 1 - Mgmt packets + * 2 - Data packets + * 3 - Both Mgmt and Data packets + * + * Return: none + */ +static void ol_txrx_set_pktcapture_mode(struct cdp_soc_t *soc, + uint8_t pdev_id, uint8_t val) +{ + struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id( + cdp_soc_t_to_ol_txrx_soc_t(soc), + pdev_id); + + if (!pdev) { + qdf_print("%s: pdev is NULL\n", __func__); + return; + } + + pdev->pktcapture_mode_value = val; +} +#endif /* WLAN_FEATURE_PKT_CAPTURE */ + static struct cdp_cmn_ops ol_ops_cmn = { .txrx_soc_attach_target = ol_txrx_soc_attach_target, .txrx_vdev_attach = ol_txrx_vdev_attach, @@ -6164,6 +6275,15 @@ static struct cdp_raw_ops ol_ops_raw = { /* EMPTY FOR MCL */ }; +#ifdef WLAN_FEATURE_PKT_CAPTURE +static struct cdp_pktcapture_ops ol_ops_pkt_capture = { + .txrx_pktcapture_cb_register = ol_txrx_register_pktcapture_cb, + .txrx_pktcapture_cb_deregister = ol_txrx_deregister_pktcapture_cb, + .txrx_pktcapture_set_mode = ol_txrx_set_pktcapture_mode, + .txrx_pktcapture_get_mode = ol_txrx_get_pktcapture_mode, +}; +#endif /* #ifdef WLAN_FEATURE_PKT_CAPTURE */ + static struct cdp_ops ol_txrx_ops = { .cmn_drv_ops = &ol_ops_cmn, .ctrl_ops = &ol_ops_ctrl, @@ -6190,7 +6310,10 @@ static struct cdp_ops ol_txrx_ops = { .throttle_ops = &ol_ops_throttle, .mob_stats_ops = &ol_ops_mob_stats, .delay_ops = &ol_ops_delay, - .pmf_ops = &ol_ops_pmf + .pmf_ops = &ol_ops_pmf, +#ifdef WLAN_FEATURE_PKT_CAPTURE + .pktcapture_ops = &ol_ops_pkt_capture, +#endif }; ol_txrx_soc_handle ol_txrx_soc_attach(void *scn_handle, diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index 82d555dc26e54..e298612a111c0 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -653,6 +653,13 @@ struct ol_txrx_pdev_t { htt_pdev_handle htt_pdev; +#ifdef WLAN_FEATURE_PKT_CAPTURE + void *mon_osif_dev; + QDF_STATUS (*mon_cb)(void *osif_dev, + qdf_nbuf_t msdu_list); + uint8_t pktcapture_mode_value; +#endif /* WLAN_FEATURE_PKT_CAPTURE */ + #ifdef WLAN_FEATURE_FASTPATH struct CE_handle *ce_tx_hdl; /* Handle to Tx packet posting CE */ struct CE_handle *ce_htt_msg_hdl; /* Handle to TxRx completion CE */