From d5873c19354aad6c39be2d0525b1e8dd4c902596 Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Mon, 24 May 2021 20:15:03 +0530 Subject: [PATCH 01/60] Revert "qcacld-3.0: Fix No AMSDU/MPDU aggregation issue" This reverts commit 41ed5d8324e68935c4ef97ebe5d2b0f4622abc2a. Change-Id: I55f78f186927f26dc8064e44f2e6a6f380137cbb --- core/wma/src/wma_features.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 9a60e5dd0f40..cc627b9c1524 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -4029,12 +4029,9 @@ QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id, /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; - /* Set bit3(tx_aggr_size_disable) if tx_aggr_size is invalid */ - if (tx_size == 0) - cmd->enable_bitmap |= (0x1 << 3); - /* Set bit4(rx_aggr_size_disable) if rx_aggr_size is invalid */ + /* bit 3 (tx_aggr_size_disable): If set tx_aggr_size is invalid */ if (rx_size == 0) - cmd->enable_bitmap |= (0x1 << 4); + cmd->enable_bitmap |= (0x1 << 3); cmd->enable_bitmap |= (0x1 << 6); @@ -4098,7 +4095,8 @@ QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle, cmd->rx_aggr_size = qos_aggr->rx_aggregation_size; cmd->tx_aggr_size = tx_aggr_size[queue_num]; /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */ - cmd->enable_bitmap = 0x20 | queue_num; + if (cmd->rx_aggr_size != 0) + cmd->enable_bitmap = 0x20 | queue_num; /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; From 20489725901dc6ebca5ebdabdbedd62032bcf54c Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Thu, 13 May 2021 19:47:55 +0530 Subject: [PATCH 02/60] qcacld-3.0: enable ini based tx aggregation for HSP Currently ini based tx aggregation is disabled, This change is to enable it for HSP. Change-Id: I55f78f186927f26dc8064e44f2e6a6f380137caa CRs-Fixed: 2934422 --- configs/default_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/default_defconfig b/configs/default_defconfig index e014f47f07fa..190c039dc243 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -50,7 +50,7 @@ ifeq ($(CONFIG_CNSS_QCA6490), y) CONFIG_GENERIC_SHADOW_REGISTER_ACCESS_ENABLE :=y CONFIG_WLAN_TWT_SAP_STA_COUNT := y CONFIG_WLAN_TWT_SAP_PDEV_COUNT := y - CONFIG_TX_AGGREGATION_SIZE_ENABLE := n + CONFIG_TX_AGGREGATION_SIZE_ENABLE := y CONFIG_DUMP_REO_QUEUE_INFO_IN_DDR :=y endif From 819a7152cb129c22aa01a91c1a183dbfc02ee6c0 Mon Sep 17 00:00:00 2001 From: Maheswara Sarma Date: Mon, 28 Jun 2021 01:11:55 -0700 Subject: [PATCH 03/60] Revert "qcacld-3.0: enable ini based tx aggregation for HSP" This reverts commit 20489725901dc6ebca5ebdabdbedd62032bcf54c. Change-Id: I3d2797de71c1d980668346bf4acea4f4cff00ac4 --- configs/default_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/default_defconfig b/configs/default_defconfig index bd7f50222899..3ec6be41a855 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -52,7 +52,7 @@ ifeq ($(CONFIG_CNSS_QCA6490), y) CONFIG_GENERIC_SHADOW_REGISTER_ACCESS_ENABLE :=y CONFIG_WLAN_TWT_SAP_STA_COUNT := y CONFIG_WLAN_TWT_SAP_PDEV_COUNT := y - CONFIG_TX_AGGREGATION_SIZE_ENABLE := y + CONFIG_TX_AGGREGATION_SIZE_ENABLE := n CONFIG_DUMP_REO_QUEUE_INFO_IN_DDR :=y endif From 84175d8c663deb8ba88bb28514be0e99cbdb2fcc Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Mon, 7 Jun 2021 12:58:43 +0530 Subject: [PATCH 04/60] Revert "qcacld-3.0: Enable TX_AGGREGATION_SIZE_ENABLE for HST" This reverts commit Ieca8464991a6a194d6f02b70fe4972aca288b541. Change-Id: Iacdbafc5e7e07a3a3effc029edb4adf58a619ada CRs-Fixed: 2963209 --- Kbuild | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Kbuild b/Kbuild index 4565dbe15af8..7874b353a671 100644 --- a/Kbuild +++ b/Kbuild @@ -3314,10 +3314,6 @@ cppflags-y += -DSYSTEM_PM_CHECK cppflags-y += -DDISABLE_EAPOL_INTRABSS_FWD endif -ifeq ($(CONFIG_TX_AGGREGATION_SIZE_ENABLE), y) -cppflags-y += -DTX_AGGREGATION_SIZE_ENABLE -endif - # Enable Low latency optimisation mode cppflags-$(CONFIG_WLAN_FEATURE_LL_MODE) += -DWLAN_FEATURE_LL_MODE From a99bc115f103d2a9b7f39997c78b0ce7ba289fc5 Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Mon, 28 Jun 2021 11:43:42 +0530 Subject: [PATCH 05/60] qcacld-3.0: revert Disable TX_AGGREGATION_SIZE ini for HSP This reverts commit I9e49ad5218f913f116cf4472f768f572740f14df since ini based tx aggregation is configured based on firmware capability. Change-Id: I54541cd282eda6606e75fa347989624a0e0fef01 CRs-Fixed: 2963280 --- components/mlme/core/src/wlan_mlme_main.c | 22 +-------- components/mlme/dispatcher/inc/cfg_qos.h | 18 +++----- configs/default_defconfig | 3 -- core/hdd/src/wlan_hdd_cfg80211.c | 54 ----------------------- core/wma/src/wma_features.c | 6 +-- 5 files changed, 8 insertions(+), 95 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 202b50d66b70..562f6cdc4ea7 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -752,9 +752,8 @@ static void mlme_init_ht_cap_in_cfg(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_SHORT_SLOT_TIME_ENABLED); } -#ifdef TX_AGGREGATION_SIZE_ENABLE -static void mlme_init_tx_aggregation_size(struct wlan_objmgr_psoc *psoc, - struct wlan_mlme_qos *qos_aggr_params) +static void mlme_init_qos_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_qos *qos_aggr_params) { qos_aggr_params->tx_aggregation_size = cfg_get(psoc, CFG_TX_AGGREGATION_SIZE); @@ -766,23 +765,6 @@ static void mlme_init_tx_aggregation_size(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_TX_AGGREGATION_SIZEVI); qos_aggr_params->tx_aggregation_size_vo = cfg_get(psoc, CFG_TX_AGGREGATION_SIZEVO); -} -#else -static void mlme_init_tx_aggregation_size(struct wlan_objmgr_psoc *psoc, - struct wlan_mlme_qos *qos_aggr_params) -{ - qos_aggr_params->tx_aggregation_size = 0; - qos_aggr_params->tx_aggregation_size_be = 0; - qos_aggr_params->tx_aggregation_size_bk = 0; - qos_aggr_params->tx_aggregation_size_vi = 0; - qos_aggr_params->tx_aggregation_size_vo = 0; -} -#endif - -static void mlme_init_qos_cfg(struct wlan_objmgr_psoc *psoc, - struct wlan_mlme_qos *qos_aggr_params) -{ - mlme_init_tx_aggregation_size(psoc, qos_aggr_params); qos_aggr_params->rx_aggregation_size = cfg_get(psoc, CFG_RX_AGGREGATION_SIZE); qos_aggr_params->tx_aggr_sw_retry_threshold_be = diff --git a/components/mlme/dispatcher/inc/cfg_qos.h b/components/mlme/dispatcher/inc/cfg_qos.h index 9d94e33e7769..07f74acdf68c 100644 --- a/components/mlme/dispatcher/inc/cfg_qos.h +++ b/components/mlme/dispatcher/inc/cfg_qos.h @@ -26,13 +26,11 @@ #if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \ defined(QCA_WIFI_QCA6490) || defined(QCA_WIFI_QCA6750) - #define ADDBA_TXAGGR_SIZE 256 #else #define ADDBA_TXAGGR_SIZE 64 #endif -#ifdef TX_AGGREGATION_SIZE_ENABLE /* * * gTxAggregationSize - Gives an option to configure Tx aggregation size @@ -172,16 +170,6 @@ CFG_VALUE_OR_DEFAULT, \ "Tx Aggregation size value for VO") -#define CFG_QOS_TX_AGGREGATION \ - CFG(CFG_TX_AGGREGATION_SIZE) \ - CFG(CFG_TX_AGGREGATION_SIZEBE) \ - CFG(CFG_TX_AGGREGATION_SIZEBK) \ - CFG(CFG_TX_AGGREGATION_SIZEVI) \ - CFG(CFG_TX_AGGREGATION_SIZEVO) -#else -#define CFG_QOS_TX_AGGREGATION -#endif - /* * * gRxAggregationSize - Gives an option to configure Rx aggregation size @@ -537,8 +525,12 @@ "Enable UAPSD for SAP") #define CFG_QOS_ALL \ - CFG_QOS_TX_AGGREGATION \ CFG(CFG_SAP_MAX_INACTIVITY_OVERRIDE) \ + CFG(CFG_TX_AGGREGATION_SIZE) \ + CFG(CFG_TX_AGGREGATION_SIZEBE) \ + CFG(CFG_TX_AGGREGATION_SIZEBK) \ + CFG(CFG_TX_AGGREGATION_SIZEVI) \ + CFG(CFG_TX_AGGREGATION_SIZEVO) \ CFG(CFG_RX_AGGREGATION_SIZE) \ CFG(CFG_TX_AGGR_SW_RETRY_BE) \ CFG(CFG_TX_AGGR_SW_RETRY_BK) \ diff --git a/configs/default_defconfig b/configs/default_defconfig index 3ec6be41a855..36f16e990663 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -1,5 +1,3 @@ -CONFIG_TX_AGGREGATION_SIZE_ENABLE := y - CONFIG_HANDLE_RX_REROUTE_ERR := y ifeq ($(CONFIG_CNSS_QCA6290), y) @@ -52,7 +50,6 @@ ifeq ($(CONFIG_CNSS_QCA6490), y) CONFIG_GENERIC_SHADOW_REGISTER_ACCESS_ENABLE :=y CONFIG_WLAN_TWT_SAP_STA_COUNT := y CONFIG_WLAN_TWT_SAP_PDEV_COUNT := y - CONFIG_TX_AGGREGATION_SIZE_ENABLE := n CONFIG_DUMP_REO_QUEUE_INFO_IN_DDR :=y endif diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 0fd1ab3e7671..57e63df9576a 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -7646,7 +7646,6 @@ static int hdd_config_access_policy(struct hdd_adapter *adapter, return qdf_status_to_os_return(status); } -#ifdef TX_AGGREGATION_SIZE_ENABLE static int hdd_config_mpdu_aggregation(struct hdd_adapter *adapter, struct nlattr *tb[]) { @@ -7724,59 +7723,6 @@ static int hdd_config_msdu_aggregation(struct hdd_adapter *adapter, return qdf_status_to_os_return(status); } -#else -static int hdd_config_mpdu_aggregation(struct hdd_adapter *adapter, - struct nlattr *tb[]) -{ - struct nlattr *rx_attr = - tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION]; - uint8_t rx_size; - QDF_STATUS status; - - if (!rx_attr) - return 0; - - rx_size = nla_get_u8(rx_attr); - if (!cfg_in_range(CFG_RX_AGGREGATION_SIZE, rx_size)) { - hdd_err("RX %d MPDU aggr size not in range", - rx_size); - return -EINVAL; - } - - status = wma_set_tx_rx_aggr_size(adapter->vdev_id, - 0, - rx_size, - WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU); - - return qdf_status_to_os_return(status); -} - -static int hdd_config_msdu_aggregation(struct hdd_adapter *adapter, - struct nlattr *tb[]) -{ - struct nlattr *rx_attr = - tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MSDU_AGGREGATION]; - uint8_t rx_size; - QDF_STATUS status; - - if (!rx_attr) - return 0; - - rx_size = nla_get_u8(rx_attr); - if (!cfg_in_range(CFG_RX_AGGREGATION_SIZE, rx_size)) { - hdd_err("RX %d MPDU aggr size not in range", - rx_size); - return -EINVAL; - } - - status = wma_set_tx_rx_aggr_size(adapter->vdev_id, - 0, - rx_size, - WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU); - - return qdf_status_to_os_return(status); -} -#endif static QDF_STATUS hdd_populate_vdev_chains(struct wlan_mlme_nss_chains *nss_chains_cfg, diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 6c56c2970240..b5c745d0cf58 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -4029,9 +4029,6 @@ QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id, /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; - /* bit 3 (tx_aggr_size_disable): If set tx_aggr_size is invalid */ - if (rx_size == 0) - cmd->enable_bitmap |= (0x1 << 3); cmd->enable_bitmap |= (0x1 << 6); @@ -4095,8 +4092,7 @@ QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle, cmd->rx_aggr_size = qos_aggr->rx_aggregation_size; cmd->tx_aggr_size = tx_aggr_size[queue_num]; /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */ - if (cmd->rx_aggr_size != 0) - cmd->enable_bitmap = 0x20 | queue_num; + cmd->enable_bitmap = 0x20 | queue_num; /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; From f95502e2380afb48bb1f94b155d15ad919853038 Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Mon, 7 Jun 2021 17:38:25 +0530 Subject: [PATCH 06/60] qcacld-3.0: tx aggr support based on firmware capability Currently ini based tx aggr support disabled due to firmware incompatibility. This change is to enable ini based tx aggr support based on firmware capability. Change-Id: Id5d7197f18fafd926de889f9b69ca2be90497fd2 CRs-Fixed: 2859709 --- components/mlme/dispatcher/inc/cfg_qos.h | 5 --- core/wma/src/wma_features.c | 41 +++++++++++++++++++++--- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/components/mlme/dispatcher/inc/cfg_qos.h b/components/mlme/dispatcher/inc/cfg_qos.h index 07f74acdf68c..ccff899c62fe 100644 --- a/components/mlme/dispatcher/inc/cfg_qos.h +++ b/components/mlme/dispatcher/inc/cfg_qos.h @@ -24,12 +24,7 @@ #ifndef __CFG_MLME_QOS_H #define __CFG_MLME_QOS_H -#if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \ - defined(QCA_WIFI_QCA6490) || defined(QCA_WIFI_QCA6750) #define ADDBA_TXAGGR_SIZE 256 -#else -#define ADDBA_TXAGGR_SIZE 64 -#endif /* * diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index b5c745d0cf58..b9069bc6fe64 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -78,6 +78,12 @@ */ #define WMA_SET_VDEV_IE_SOURCE_HOST 0x0 +/* + * Max AMPDU Tx Aggr supported size + */ +#define ADDBA_TXAGGR_SIZE_HELIUM 64 +#define ADDBA_TXAGGR_SIZE_LITHIUM 256 + static bool is_wakeup_event_console_logs_enabled; void wma_set_wakeup_logs_to_console(bool value) @@ -4023,6 +4029,20 @@ QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id, WMITLV_GET_STRUCT_TLVLEN( wmi_vdev_set_custom_aggr_size_cmd_fixed_param)); + if (wmi_service_enabled(wma_handle->wmi_handle, + wmi_service_ampdu_tx_buf_size_256_support)) { + cmd->enable_bitmap |= (0x1 << 6); + if (!(tx_size <= ADDBA_TXAGGR_SIZE_LITHIUM)) { + wma_err("Invalid AMPDU Size"); + return QDF_STATUS_E_INVAL; + } + } else if (tx_size == ADDBA_TXAGGR_SIZE_LITHIUM) { + tx_size = ADDBA_TXAGGR_SIZE_HELIUM; + } else if (!(tx_size <= ADDBA_TXAGGR_SIZE_HELIUM)) { + wma_err("Invalid AMPDU Size"); + return QDF_STATUS_E_INVAL; + } + cmd->vdev_id = vdev_id; cmd->tx_aggr_size = tx_size; cmd->rx_aggr_size = rx_size; @@ -4030,8 +4050,6 @@ QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id, if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; - cmd->enable_bitmap |= (0x1 << 6); - wma_debug("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d", cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id, cmd->enable_bitmap); @@ -4091,14 +4109,27 @@ QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle, cmd->vdev_id = vdev_id; cmd->rx_aggr_size = qos_aggr->rx_aggregation_size; cmd->tx_aggr_size = tx_aggr_size[queue_num]; + + if (wmi_service_enabled(wma_handle->wmi_handle, + wmi_service_ampdu_tx_buf_size_256_support)) { + cmd->enable_bitmap |= (0x1 << 6); + if (!(tx_aggr_size[queue_num] <= ADDBA_TXAGGR_SIZE_LITHIUM)) { + wma_err("Invalid AMPDU Size"); + return QDF_STATUS_E_INVAL; + } + } else if (tx_aggr_size[queue_num] == ADDBA_TXAGGR_SIZE_LITHIUM) { + tx_aggr_size[queue_num] = ADDBA_TXAGGR_SIZE_HELIUM; + } else if (!(tx_aggr_size[queue_num] <= ADDBA_TXAGGR_SIZE_HELIUM)) { + wma_err("Invalid AMPDU Size"); + return QDF_STATUS_E_INVAL; + } + /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */ - cmd->enable_bitmap = 0x20 | queue_num; + cmd->enable_bitmap |= 0x20 | queue_num; /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; - cmd->enable_bitmap |= (0x1 << 6); - wma_debug("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d, bitmap: %d", queue_num, cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id, From 1a1ca8f34d3e8b3d25b0534196379bfd904d4bbf Mon Sep 17 00:00:00 2001 From: Maheswara Sarma Date: Thu, 1 Jul 2021 13:22:08 +0530 Subject: [PATCH 07/60] Revert "qcacld-3.0: tx aggr support based on firmware capability" This reverts commit Id5d7197f18fafd926de889f9b69ca2be90497fd2. Change-Id: I00bc5a1f73e70362c6a7a34c39d75be228d06650 --- components/mlme/dispatcher/inc/cfg_qos.h | 5 +++ core/wma/src/wma_features.c | 41 +++--------------------- 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/components/mlme/dispatcher/inc/cfg_qos.h b/components/mlme/dispatcher/inc/cfg_qos.h index ccff899c62fe..07f74acdf68c 100644 --- a/components/mlme/dispatcher/inc/cfg_qos.h +++ b/components/mlme/dispatcher/inc/cfg_qos.h @@ -24,7 +24,12 @@ #ifndef __CFG_MLME_QOS_H #define __CFG_MLME_QOS_H +#if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \ + defined(QCA_WIFI_QCA6490) || defined(QCA_WIFI_QCA6750) #define ADDBA_TXAGGR_SIZE 256 +#else +#define ADDBA_TXAGGR_SIZE 64 +#endif /* * diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index b9069bc6fe64..b5c745d0cf58 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -78,12 +78,6 @@ */ #define WMA_SET_VDEV_IE_SOURCE_HOST 0x0 -/* - * Max AMPDU Tx Aggr supported size - */ -#define ADDBA_TXAGGR_SIZE_HELIUM 64 -#define ADDBA_TXAGGR_SIZE_LITHIUM 256 - static bool is_wakeup_event_console_logs_enabled; void wma_set_wakeup_logs_to_console(bool value) @@ -4029,20 +4023,6 @@ QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id, WMITLV_GET_STRUCT_TLVLEN( wmi_vdev_set_custom_aggr_size_cmd_fixed_param)); - if (wmi_service_enabled(wma_handle->wmi_handle, - wmi_service_ampdu_tx_buf_size_256_support)) { - cmd->enable_bitmap |= (0x1 << 6); - if (!(tx_size <= ADDBA_TXAGGR_SIZE_LITHIUM)) { - wma_err("Invalid AMPDU Size"); - return QDF_STATUS_E_INVAL; - } - } else if (tx_size == ADDBA_TXAGGR_SIZE_LITHIUM) { - tx_size = ADDBA_TXAGGR_SIZE_HELIUM; - } else if (!(tx_size <= ADDBA_TXAGGR_SIZE_HELIUM)) { - wma_err("Invalid AMPDU Size"); - return QDF_STATUS_E_INVAL; - } - cmd->vdev_id = vdev_id; cmd->tx_aggr_size = tx_size; cmd->rx_aggr_size = rx_size; @@ -4050,6 +4030,8 @@ QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id, if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; + cmd->enable_bitmap |= (0x1 << 6); + wma_debug("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d", cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id, cmd->enable_bitmap); @@ -4109,27 +4091,14 @@ QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle, cmd->vdev_id = vdev_id; cmd->rx_aggr_size = qos_aggr->rx_aggregation_size; cmd->tx_aggr_size = tx_aggr_size[queue_num]; - - if (wmi_service_enabled(wma_handle->wmi_handle, - wmi_service_ampdu_tx_buf_size_256_support)) { - cmd->enable_bitmap |= (0x1 << 6); - if (!(tx_aggr_size[queue_num] <= ADDBA_TXAGGR_SIZE_LITHIUM)) { - wma_err("Invalid AMPDU Size"); - return QDF_STATUS_E_INVAL; - } - } else if (tx_aggr_size[queue_num] == ADDBA_TXAGGR_SIZE_LITHIUM) { - tx_aggr_size[queue_num] = ADDBA_TXAGGR_SIZE_HELIUM; - } else if (!(tx_aggr_size[queue_num] <= ADDBA_TXAGGR_SIZE_HELIUM)) { - wma_err("Invalid AMPDU Size"); - return QDF_STATUS_E_INVAL; - } - /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */ - cmd->enable_bitmap |= 0x20 | queue_num; + cmd->enable_bitmap = 0x20 | queue_num; /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; + cmd->enable_bitmap |= (0x1 << 6); + wma_debug("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d, bitmap: %d", queue_num, cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id, From 07b129465cdc1e32cdb7cbd8bd2bb099abc6e196 Mon Sep 17 00:00:00 2001 From: Maheswara Sarma Date: Thu, 1 Jul 2021 13:22:21 +0530 Subject: [PATCH 08/60] Revert "qcacld-3.0: revert Disable TX_AGGREGATION_SIZE ini for HSP" This reverts commit I54541cd282eda6606e75fa347989624a0e0fef01. Change-Id: If21f225e87ca5b968f782e56904b796249c349bc --- components/mlme/core/src/wlan_mlme_main.c | 22 ++++++++- components/mlme/dispatcher/inc/cfg_qos.h | 18 +++++--- configs/default_defconfig | 3 ++ core/hdd/src/wlan_hdd_cfg80211.c | 54 +++++++++++++++++++++++ core/wma/src/wma_features.c | 6 ++- 5 files changed, 95 insertions(+), 8 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 562f6cdc4ea7..202b50d66b70 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -752,8 +752,9 @@ static void mlme_init_ht_cap_in_cfg(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_SHORT_SLOT_TIME_ENABLED); } -static void mlme_init_qos_cfg(struct wlan_objmgr_psoc *psoc, - struct wlan_mlme_qos *qos_aggr_params) +#ifdef TX_AGGREGATION_SIZE_ENABLE +static void mlme_init_tx_aggregation_size(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_qos *qos_aggr_params) { qos_aggr_params->tx_aggregation_size = cfg_get(psoc, CFG_TX_AGGREGATION_SIZE); @@ -765,6 +766,23 @@ static void mlme_init_qos_cfg(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_TX_AGGREGATION_SIZEVI); qos_aggr_params->tx_aggregation_size_vo = cfg_get(psoc, CFG_TX_AGGREGATION_SIZEVO); +} +#else +static void mlme_init_tx_aggregation_size(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_qos *qos_aggr_params) +{ + qos_aggr_params->tx_aggregation_size = 0; + qos_aggr_params->tx_aggregation_size_be = 0; + qos_aggr_params->tx_aggregation_size_bk = 0; + qos_aggr_params->tx_aggregation_size_vi = 0; + qos_aggr_params->tx_aggregation_size_vo = 0; +} +#endif + +static void mlme_init_qos_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_qos *qos_aggr_params) +{ + mlme_init_tx_aggregation_size(psoc, qos_aggr_params); qos_aggr_params->rx_aggregation_size = cfg_get(psoc, CFG_RX_AGGREGATION_SIZE); qos_aggr_params->tx_aggr_sw_retry_threshold_be = diff --git a/components/mlme/dispatcher/inc/cfg_qos.h b/components/mlme/dispatcher/inc/cfg_qos.h index 07f74acdf68c..9d94e33e7769 100644 --- a/components/mlme/dispatcher/inc/cfg_qos.h +++ b/components/mlme/dispatcher/inc/cfg_qos.h @@ -26,11 +26,13 @@ #if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \ defined(QCA_WIFI_QCA6490) || defined(QCA_WIFI_QCA6750) + #define ADDBA_TXAGGR_SIZE 256 #else #define ADDBA_TXAGGR_SIZE 64 #endif +#ifdef TX_AGGREGATION_SIZE_ENABLE /* * * gTxAggregationSize - Gives an option to configure Tx aggregation size @@ -170,6 +172,16 @@ CFG_VALUE_OR_DEFAULT, \ "Tx Aggregation size value for VO") +#define CFG_QOS_TX_AGGREGATION \ + CFG(CFG_TX_AGGREGATION_SIZE) \ + CFG(CFG_TX_AGGREGATION_SIZEBE) \ + CFG(CFG_TX_AGGREGATION_SIZEBK) \ + CFG(CFG_TX_AGGREGATION_SIZEVI) \ + CFG(CFG_TX_AGGREGATION_SIZEVO) +#else +#define CFG_QOS_TX_AGGREGATION +#endif + /* * * gRxAggregationSize - Gives an option to configure Rx aggregation size @@ -525,12 +537,8 @@ "Enable UAPSD for SAP") #define CFG_QOS_ALL \ + CFG_QOS_TX_AGGREGATION \ CFG(CFG_SAP_MAX_INACTIVITY_OVERRIDE) \ - CFG(CFG_TX_AGGREGATION_SIZE) \ - CFG(CFG_TX_AGGREGATION_SIZEBE) \ - CFG(CFG_TX_AGGREGATION_SIZEBK) \ - CFG(CFG_TX_AGGREGATION_SIZEVI) \ - CFG(CFG_TX_AGGREGATION_SIZEVO) \ CFG(CFG_RX_AGGREGATION_SIZE) \ CFG(CFG_TX_AGGR_SW_RETRY_BE) \ CFG(CFG_TX_AGGR_SW_RETRY_BK) \ diff --git a/configs/default_defconfig b/configs/default_defconfig index 36f16e990663..3ec6be41a855 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -1,3 +1,5 @@ +CONFIG_TX_AGGREGATION_SIZE_ENABLE := y + CONFIG_HANDLE_RX_REROUTE_ERR := y ifeq ($(CONFIG_CNSS_QCA6290), y) @@ -50,6 +52,7 @@ ifeq ($(CONFIG_CNSS_QCA6490), y) CONFIG_GENERIC_SHADOW_REGISTER_ACCESS_ENABLE :=y CONFIG_WLAN_TWT_SAP_STA_COUNT := y CONFIG_WLAN_TWT_SAP_PDEV_COUNT := y + CONFIG_TX_AGGREGATION_SIZE_ENABLE := n CONFIG_DUMP_REO_QUEUE_INFO_IN_DDR :=y endif diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 57e63df9576a..0fd1ab3e7671 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -7646,6 +7646,7 @@ static int hdd_config_access_policy(struct hdd_adapter *adapter, return qdf_status_to_os_return(status); } +#ifdef TX_AGGREGATION_SIZE_ENABLE static int hdd_config_mpdu_aggregation(struct hdd_adapter *adapter, struct nlattr *tb[]) { @@ -7723,6 +7724,59 @@ static int hdd_config_msdu_aggregation(struct hdd_adapter *adapter, return qdf_status_to_os_return(status); } +#else +static int hdd_config_mpdu_aggregation(struct hdd_adapter *adapter, + struct nlattr *tb[]) +{ + struct nlattr *rx_attr = + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION]; + uint8_t rx_size; + QDF_STATUS status; + + if (!rx_attr) + return 0; + + rx_size = nla_get_u8(rx_attr); + if (!cfg_in_range(CFG_RX_AGGREGATION_SIZE, rx_size)) { + hdd_err("RX %d MPDU aggr size not in range", + rx_size); + return -EINVAL; + } + + status = wma_set_tx_rx_aggr_size(adapter->vdev_id, + 0, + rx_size, + WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU); + + return qdf_status_to_os_return(status); +} + +static int hdd_config_msdu_aggregation(struct hdd_adapter *adapter, + struct nlattr *tb[]) +{ + struct nlattr *rx_attr = + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MSDU_AGGREGATION]; + uint8_t rx_size; + QDF_STATUS status; + + if (!rx_attr) + return 0; + + rx_size = nla_get_u8(rx_attr); + if (!cfg_in_range(CFG_RX_AGGREGATION_SIZE, rx_size)) { + hdd_err("RX %d MPDU aggr size not in range", + rx_size); + return -EINVAL; + } + + status = wma_set_tx_rx_aggr_size(adapter->vdev_id, + 0, + rx_size, + WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU); + + return qdf_status_to_os_return(status); +} +#endif static QDF_STATUS hdd_populate_vdev_chains(struct wlan_mlme_nss_chains *nss_chains_cfg, diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index b5c745d0cf58..6c56c2970240 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -4029,6 +4029,9 @@ QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id, /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; + /* bit 3 (tx_aggr_size_disable): If set tx_aggr_size is invalid */ + if (rx_size == 0) + cmd->enable_bitmap |= (0x1 << 3); cmd->enable_bitmap |= (0x1 << 6); @@ -4092,7 +4095,8 @@ QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle, cmd->rx_aggr_size = qos_aggr->rx_aggregation_size; cmd->tx_aggr_size = tx_aggr_size[queue_num]; /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */ - cmd->enable_bitmap = 0x20 | queue_num; + if (cmd->rx_aggr_size != 0) + cmd->enable_bitmap = 0x20 | queue_num; /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; From 5084de505f87a3d499369c5709ef67c7c899409a Mon Sep 17 00:00:00 2001 From: Maheswara Sarma Date: Thu, 1 Jul 2021 13:22:44 +0530 Subject: [PATCH 09/60] Revert "Revert "qcacld-3.0: Enable TX_AGGREGATION_SIZE_ENABLE for HST"" This reverts commit Iacdbafc5e7e07a3a3effc029edb4adf58a619ada. Change-Id: Ief79d5e0508f03af1b6cbcc2758d0db0d1c8d85c --- Kbuild | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Kbuild b/Kbuild index 7874b353a671..4565dbe15af8 100644 --- a/Kbuild +++ b/Kbuild @@ -3314,6 +3314,10 @@ cppflags-y += -DSYSTEM_PM_CHECK cppflags-y += -DDISABLE_EAPOL_INTRABSS_FWD endif +ifeq ($(CONFIG_TX_AGGREGATION_SIZE_ENABLE), y) +cppflags-y += -DTX_AGGREGATION_SIZE_ENABLE +endif + # Enable Low latency optimisation mode cppflags-$(CONFIG_WLAN_FEATURE_LL_MODE) += -DWLAN_FEATURE_LL_MODE From 74ab5904e59c91c014813a7504d381c0c6ad7dcb Mon Sep 17 00:00:00 2001 From: Maheswara Sarma Date: Thu, 1 Jul 2021 13:23:03 +0530 Subject: [PATCH 10/60] Revert "Revert "qcacld-3.0: enable ini based tx aggregation for HSP"" This reverts commit I3d2797de71c1d980668346bf4acea4f4cff00ac4. Change-Id: Ie489ae3ead65382e921ccc27052ab62601f0d6ec --- configs/default_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/default_defconfig b/configs/default_defconfig index 3ec6be41a855..bd7f50222899 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -52,7 +52,7 @@ ifeq ($(CONFIG_CNSS_QCA6490), y) CONFIG_GENERIC_SHADOW_REGISTER_ACCESS_ENABLE :=y CONFIG_WLAN_TWT_SAP_STA_COUNT := y CONFIG_WLAN_TWT_SAP_PDEV_COUNT := y - CONFIG_TX_AGGREGATION_SIZE_ENABLE := n + CONFIG_TX_AGGREGATION_SIZE_ENABLE := y CONFIG_DUMP_REO_QUEUE_INFO_IN_DDR :=y endif From 9ceca8650040b5896494bff69dc4f2b9751f1b26 Mon Sep 17 00:00:00 2001 From: Maheswara Sarma Date: Mon, 19 Jul 2021 00:12:36 -0700 Subject: [PATCH 11/60] Revert "Revert "Revert "qcacld-3.0: enable ini based tx aggregation for HSP""" This reverts commit 74ab5904e59c91c014813a7504d381c0c6ad7dcb. Change-Id: I4ddaf7d85ecab860e704efd9e327ad283bb0933c --- configs/default_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/default_defconfig b/configs/default_defconfig index 5b0544d04ed3..6aaf2a1fc644 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -50,7 +50,7 @@ ifeq ($(CONFIG_CNSS_QCA6490), y) CONFIG_GENERIC_SHADOW_REGISTER_ACCESS_ENABLE :=y CONFIG_WLAN_TWT_SAP_STA_COUNT := y CONFIG_WLAN_TWT_SAP_PDEV_COUNT := y - CONFIG_TX_AGGREGATION_SIZE_ENABLE := y + CONFIG_TX_AGGREGATION_SIZE_ENABLE := n CONFIG_DUMP_REO_QUEUE_INFO_IN_DDR :=y endif From 1d1422c1935bcae455030a72602caead5aecfa21 Mon Sep 17 00:00:00 2001 From: Dundi Raviteja Date: Mon, 27 Sep 2021 17:07:11 +0530 Subject: [PATCH 12/60] qcacld-3.0: Don't delete monitor interface when STA interface is down Don't delete monitor interface while STA interface is getting down, instead de-register packet capture callbacks and register back when STA interface is UP again. Change-Id: I42ea39ec619c08d99fa5ba287be20249e2b2582f CRs-Fixed: 3013758 --- core/hdd/inc/wlan_hdd_main.h | 29 +++++++ core/hdd/src/wlan_hdd_main.c | 144 +++++++++++++++++++---------------- 2 files changed, 108 insertions(+), 65 deletions(-) diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index bde9ab586ca4..a001e5121087 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -1224,6 +1224,7 @@ struct hdd_context; * @delete_in_progress: Flag to indicate that the adapter delete is in * progress, and any operation using rtnl lock inside * the driver can be avoided/skipped. + * @mon_adapter: hdd_adapter of monitor mode. */ struct hdd_adapter { /* Magic cookie for adapter sanity verification. Note that this @@ -1539,6 +1540,9 @@ struct hdd_adapter { #endif bool delete_in_progress; qdf_atomic_t net_dev_hold_ref_count[NET_DEV_HOLD_ID_MAX]; +#ifdef WLAN_FEATURE_PKT_CAPTURE + struct hdd_adapter *mon_adapter; +#endif }; #define WLAN_HDD_GET_STATION_CTX_PTR(adapter) (&(adapter)->session.station) @@ -4716,6 +4720,22 @@ void wlan_hdd_del_monitor(struct hdd_context *hdd_ctx, void wlan_hdd_del_p2p_interface(struct hdd_context *hdd_ctx); +/** + * hdd_reset_monitor_interface() - reset monitor interface flags + * @sta_adapter: station adapter + * + * Return: void + */ +void hdd_reset_monitor_interface(struct hdd_adapter *sta_adapter); + +/** + * hdd_is_pkt_capture_mon_enable() - Is packet capture monitor mode enable + * @sta_adapter: station adapter + * + * Return: status of packet capture monitor adapter + */ +struct hdd_adapter * +hdd_is_pkt_capture_mon_enable(struct hdd_adapter *sta_adapter); #else static inline void wlan_hdd_del_monitor(struct hdd_context *hdd_ctx, @@ -4733,6 +4753,15 @@ static inline void wlan_hdd_del_p2p_interface(struct hdd_context *hdd_ctx) { } + +static inline void hdd_reset_monitor_interface(struct hdd_adapter *sta_adapter) +{ +} + +static inline int hdd_is_pkt_capture_mon_enable(struct hdd_adapter *adapter) +{ + return 0; +} #endif /* WLAN_FEATURE_PKT_CAPTURE */ /** * wlan_hdd_is_session_type_monitor() - check if session type is MONITOR diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 80e0c50c269c..948ed00699f2 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2979,10 +2979,12 @@ static int __hdd_pktcapture_open(struct net_device *dev) ret = qdf_status_to_os_return(status); if (ret) { hdd_objmgr_put_vdev(adapter->vdev); + adapter->vdev = NULL; return ret; } set_bit(DEVICE_IFACE_OPENED, &adapter->event_flags); + sta_adapter->mon_adapter = adapter; return ret; } @@ -3013,69 +3015,86 @@ static int hdd_pktcapture_open(struct net_device *net_dev) } /** - * hdd_del_monitor_interface() - Delete monitor interface - * @hdd_ctx: hdd context + * hdd_unmap_monitor_interface_vdev() - unmap monitor interface vdev and + * deregister packet capture callbacks + * @sta_adapter: station adapter * * Return: void */ -static void hdd_del_monitor_interface(struct hdd_context *hdd_ctx) +static void +hdd_unmap_monitor_interface_vdev(struct hdd_adapter *sta_adapter) { - struct hdd_adapter *adapter; + struct hdd_adapter *mon_adapter = sta_adapter->mon_adapter; - adapter = hdd_get_adapter(hdd_ctx, QDF_MONITOR_MODE); - if (adapter) { - struct osif_vdev_sync *vdev_sync; - - vdev_sync = osif_vdev_sync_unregister(adapter->dev); - - if (hdd_is_interface_up(adapter)) { - hdd_stop_adapter(hdd_ctx, adapter); - hdd_deinit_adapter(hdd_ctx, adapter, - true); - } - - hdd_close_adapter(hdd_ctx, adapter, true); - - if (vdev_sync) { - osif_vdev_sync_wait_for_ops(vdev_sync); - osif_vdev_sync_destroy(vdev_sync); - } + if (mon_adapter && hdd_is_interface_up(mon_adapter)) { + ucfg_pkt_capture_deregister_callbacks(mon_adapter->vdev); + hdd_objmgr_put_vdev(mon_adapter->vdev); + mon_adapter->vdev = NULL; + hdd_reset_monitor_interface(sta_adapter); } } /** - * hdd_close_monitor_interface() - Close monitor interface - * @hdd_ctx: hdd context + * hdd_map_monitor_interface_vdev() - Map monitor interface vdev and + * register packet capture callbacks + * @sta_adapter: Station adapter * - * Return: void + * Return: None */ -static void hdd_close_monitor_interface(struct hdd_context *hdd_ctx) +static void hdd_map_monitor_interface_vdev(struct hdd_adapter *sta_adapter) { - struct hdd_adapter *adapter; + struct hdd_adapter *mon_adapter; + QDF_STATUS status; + int ret; - adapter = hdd_get_adapter(hdd_ctx, QDF_MONITOR_MODE); - if (adapter) { - struct osif_vdev_sync *vdev_sync; - - vdev_sync = osif_vdev_sync_unregister( - adapter->dev); - - wlan_hdd_del_monitor(hdd_ctx, adapter, true); - - if (vdev_sync) { - osif_vdev_sync_wait_for_ops(vdev_sync); - osif_vdev_sync_destroy(vdev_sync); - } + mon_adapter = hdd_get_adapter(sta_adapter->hdd_ctx, QDF_MONITOR_MODE); + if (!mon_adapter) { + hdd_debug("No monitor interface found"); + return; } + + if (!mon_adapter || !hdd_is_interface_up(mon_adapter)) { + hdd_debug("Monitor interface is not up\n"); + return; + } + + if (!wlan_hdd_is_session_type_monitor(mon_adapter->device_mode)) + return; + + mon_adapter->vdev = hdd_objmgr_get_vdev(sta_adapter); + + status = ucfg_pkt_capture_register_callbacks(mon_adapter->vdev, + hdd_mon_rx_packet_cbk, + mon_adapter); + ret = qdf_status_to_os_return(status); + if (ret) { + hdd_err("Failed registering packet capture callbacks"); + hdd_objmgr_put_vdev(mon_adapter->vdev); + mon_adapter->vdev = NULL; + return; + } + + sta_adapter->mon_adapter = mon_adapter; +} + +void hdd_reset_monitor_interface(struct hdd_adapter *sta_adapter) +{ + sta_adapter->mon_adapter = NULL; +} + +struct hdd_adapter * +hdd_is_pkt_capture_mon_enable(struct hdd_adapter *sta_adapter) +{ + return sta_adapter->mon_adapter; } #else static inline void -hdd_del_monitor_interface(struct hdd_context *hdd_ctx) +hdd_unmap_monitor_interface_vdev(struct hdd_adapter *sta_adapter) { } static inline void -hdd_close_monitor_interface(struct hdd_context *hdd_ctx) +hdd_map_monitor_interface_vdev(struct hdd_adapter *sta_adapter) { } #endif @@ -4414,6 +4433,8 @@ static int __hdd_open(struct net_device *dev) hdd_populate_wifi_pos_cfg(hdd_ctx); hdd_lpass_notify_start(hdd_ctx, adapter); + hdd_map_monitor_interface_vdev(adapter); + return 0; } @@ -4490,23 +4511,9 @@ int hdd_stop_no_trans(struct net_device *dev) WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER, WLAN_CONTROL_PATH); - if (adapter->device_mode == QDF_STA_MODE) { + if (adapter->device_mode == QDF_STA_MODE) hdd_lpass_notify_stop(hdd_ctx); - if (ucfg_pkt_capture_get_mode(hdd_ctx->psoc) != - PACKET_CAPTURE_MODE_DISABLE) - hdd_close_monitor_interface(hdd_ctx); - } - - if (wlan_hdd_is_session_type_monitor(adapter->device_mode) && - adapter->vdev && - ucfg_pkt_capture_get_mode(hdd_ctx->psoc) != - PACKET_CAPTURE_MODE_DISABLE) { - ucfg_pkt_capture_deregister_callbacks(adapter->vdev); - hdd_objmgr_put_vdev(adapter->vdev); - adapter->vdev = NULL; - } - /* * NAN data interface is different in some sense. The traffic on NDI is * bursty in nature and depends on the need to transfer. The service @@ -7215,9 +7222,11 @@ QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx, hdd_destroy_adapter_sysfs_files(adapter); if (adapter->device_mode == QDF_STA_MODE && + hdd_is_pkt_capture_mon_enable(adapter) && ucfg_pkt_capture_get_mode(hdd_ctx->psoc) != - PACKET_CAPTURE_MODE_DISABLE) - hdd_del_monitor_interface(hdd_ctx); + PACKET_CAPTURE_MODE_DISABLE) { + hdd_unmap_monitor_interface_vdev(adapter); + } if (adapter->vdev_id != WLAN_UMAC_VDEV_ID_MAX) wlan_hdd_cfg80211_deregister_frames(adapter); @@ -7345,14 +7354,24 @@ QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx, break; case QDF_MONITOR_MODE: - if (wlan_hdd_is_session_type_monitor(QDF_MONITOR_MODE) && + if (wlan_hdd_is_session_type_monitor(adapter->device_mode) && adapter->vdev && ucfg_pkt_capture_get_mode(hdd_ctx->psoc) != PACKET_CAPTURE_MODE_DISABLE) { + struct hdd_adapter *sta_adapter; + ucfg_pkt_capture_deregister_callbacks(adapter->vdev); hdd_objmgr_put_vdev(adapter->vdev); adapter->vdev = NULL; + + sta_adapter = hdd_get_adapter(hdd_ctx, QDF_STA_MODE); + if (!sta_adapter) { + hdd_err("No station interface found"); + return -EINVAL; + } + hdd_reset_monitor_interface(sta_adapter); } + if (wlan_hdd_is_session_type_monitor(QDF_MONITOR_MODE) && ucfg_mlme_is_sta_mon_conc_supported(hdd_ctx->psoc)) { hdd_info("Release wakelock for STA + monitor mode!"); @@ -18717,11 +18736,6 @@ void wlan_hdd_del_monitor(struct hdd_context *hdd_ctx, hdd_stop_adapter(hdd_ctx, adapter); hdd_close_adapter(hdd_ctx, adapter, true); - if (adapter->vdev) { - hdd_objmgr_put_vdev(adapter->vdev); - adapter->vdev = NULL; - } - hdd_open_p2p_interface(hdd_ctx); } From 990d5d47e9cb0586614bbf41055fc76008afc9c7 Mon Sep 17 00:00:00 2001 From: Dundi Raviteja Date: Tue, 28 Sep 2021 16:41:09 +0530 Subject: [PATCH 13/60] qcacld-3.0: Map monitor interface vdev during SSR Map monitor interface vdev with STA vdev during SSR reinit. Change-Id: I0baca7c09d0fe7f800135181a1445770ab8e2971 CRs-Fixed: 3045111 --- core/hdd/src/wlan_hdd_main.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 948ed00699f2..e8aee8c542e1 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -4433,7 +4433,9 @@ static int __hdd_open(struct net_device *dev) hdd_populate_wifi_pos_cfg(hdd_ctx); hdd_lpass_notify_start(hdd_ctx, adapter); - hdd_map_monitor_interface_vdev(adapter); + if (ucfg_pkt_capture_get_mode(hdd_ctx->psoc) != + PACKET_CAPTURE_MODE_DISABLE) + hdd_map_monitor_interface_vdev(adapter); return 0; } @@ -8532,7 +8534,6 @@ QDF_STATUS hdd_start_all_adapters(struct hdd_context *hdd_ctx) { struct hdd_adapter *adapter, *next_adapter = NULL; bool value; - struct wlan_objmgr_vdev *vdev; wlan_net_dev_ref_dbgid dbgid = NET_DEV_HOLD_START_ALL_ADAPTERS; hdd_enter(); @@ -8598,19 +8599,19 @@ QDF_STATUS hdd_start_all_adapters(struct hdd_context *hdd_ctx) break; case QDF_MONITOR_MODE: if (wlan_hdd_is_session_type_monitor( - QDF_MONITOR_MODE) && + adapter->device_mode) && ucfg_pkt_capture_get_mode(hdd_ctx->psoc) != PACKET_CAPTURE_MODE_DISABLE) { - vdev = hdd_objmgr_get_vdev(adapter); - if (vdev) { - ucfg_pkt_capture_register_callbacks( - vdev, - hdd_mon_rx_packet_cbk, - adapter); - hdd_objmgr_put_vdev(vdev); - } else { - hdd_err("vdev is null"); + struct hdd_adapter *sta_adapter; + + sta_adapter = hdd_get_adapter(hdd_ctx, + QDF_STA_MODE); + if (!sta_adapter) { + hdd_err("No station interface found"); + return -EINVAL; } + + hdd_map_monitor_interface_vdev(sta_adapter); break; } hdd_start_station_adapter(adapter); From d82f8b8f821d2e56c450b6f4584745fef9b8446e Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 27 Aug 2021 15:06:05 +0530 Subject: [PATCH 14/60] qcacld-3.0: Set frame filter based on vendor command Currently, packet capture mode frame filter configuration is done based on ini. This change enables user to set the packet capture mode frame filter configuration at runtime through vendor command QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE. Change-Id: Ifd40a9295394324b0cde4ff15bb55ea77851a6bc CRs-Fixed: 3046091 --- .../core/inc/wlan_pkt_capture_main.h | 10 ++ .../core/inc/wlan_pkt_capture_priv.h | 2 + .../core/src/wlan_pkt_capture_main.c | 56 ++++++++ .../inc/wlan_pkt_capture_public_structs.h | 124 ++++++++++++++++++ .../inc/wlan_pkt_capture_ucfg_api.h | 19 +++ .../src/wlan_pkt_capture_ucfg_api.c | 7 + 6 files changed, 218 insertions(+) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index b6b328338247..9561217bc6ab 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -201,6 +201,16 @@ void pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev); void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu, struct wlan_objmgr_vdev *vdev, uint16_t ch_freq); +/** + * pkt_capture_set_filter - Set packet capture frame filter + * @frame_filter: pkt capture frame filter data + * @vdev: pointer to vdev + * + * Return: QDF_STATUS + */ +QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev); + #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * pkt_capture_get_pktcap_mode_v2 - Get packet capture mode diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h index 26e3bd4c4031..080f7340481c 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h @@ -80,10 +80,12 @@ struct pkt_capture_vdev_priv { * @psoc: pointer to psoc object * @cfg_param: INI config params for packet capture * @cb_obj: struct contaning callback pointers + * @frame_filter: struct contaning packet capture filter */ struct pkt_psoc_priv { struct wlan_objmgr_psoc *psoc; struct pkt_capture_cfg cfg_param; struct pkt_capture_callbacks cb_obj; + struct pkt_capture_frame_filter frame_filter; }; #endif /* End of _WLAN_PKT_CAPTURE_PRIV_STRUCT_H_ */ diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 3e2703e2043d..cea00cb01592 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -977,3 +977,59 @@ void pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev) cdp_txrx_set_pdev_param(soc, wlan_objmgr_pdev_get_pdev_id(pdev), CDP_MONITOR_FREQUENCY, val); } + +QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev) +{ + struct pkt_psoc_priv *psoc_priv; + struct wlan_objmgr_psoc *psoc; + + if (!vdev) { + pkt_capture_err("vdev is NULL"); + return QDF_STATUS_E_FAILURE; + } + + psoc = wlan_vdev_get_psoc(vdev); + psoc_priv = pkt_capture_psoc_get_priv(psoc); + if (!psoc_priv) { + pkt_capture_err("psoc_priv is NULL"); + return QDF_STATUS_E_FAILURE; + } + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE)) + psoc_priv->frame_filter.data_tx_frame_filter = + frame_filter.data_tx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE)) + psoc_priv->frame_filter.data_rx_frame_filter = + frame_filter.data_rx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE)) + psoc_priv->frame_filter.mgmt_tx_frame_filter = + frame_filter.mgmt_tx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE)) + psoc_priv->frame_filter.mgmt_rx_frame_filter = + frame_filter.mgmt_rx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE)) + psoc_priv->frame_filter.ctrl_tx_frame_filter = + frame_filter.ctrl_tx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE)) + psoc_priv->frame_filter.ctrl_rx_frame_filter = + frame_filter.ctrl_rx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL)) + psoc_priv->frame_filter.connected_beacon_interval = + frame_filter.connected_beacon_interval; + + return QDF_STATUS_SUCCESS; +} diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index 4fdad87bd43f..acc1656b7877 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -19,6 +19,10 @@ #ifndef _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ #define _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ +#define PACKET_CAPTURE_DATA_MAX_FILTER BIT(18) +#define PACKET_CAPTURE_MGMT_MAX_FILTER BIT(5) +#define PACKET_CAPTURE_CTRL_MAX_FILTER BIT(3) + /** * enum pkt_capture_mode - packet capture modes * @PACKET_CAPTURE_MODE_DISABLE: packet capture mode disable @@ -124,4 +128,124 @@ struct wlan_pkt_capture_rx_ops { (struct wlan_objmgr_psoc *psoc); }; +/** + * pkt_capture_data_frame_type - Represent the various + * data types to be filtered in packet capture. + */ +enum pkt_capture_data_frame_type { + PKT_CAPTURE_DATA_FRAME_TYPE_ALL = BIT(0), + /* valid only if PKT_CAPTURE_DATA_DATA_FRAME_TYPE_ALL is not set */ + PKT_CAPTURE_DATA_FRAME_TYPE_ARP = BIT(1), + PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV4 = BIT(2), + PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV6 = BIT(3), + PKT_CAPTURE_DATA_FRAME_TYPE_EAPOL = BIT(4), + PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4 = BIT(5), + PKT_CAPTURE_DATA_FRAME_TYPE_DNSV6 = BIT(6), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYN = BIT(7), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYNACK = BIT(8), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FIN = BIT(9), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FINACK = BIT(10), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_ACK = BIT(11), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_RST = BIT(12), + PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV4 = BIT(13), + PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV6 = BIT(14), + PKT_CAPTURE_DATA_FRAME_TYPE_RTP = BIT(15), + PKT_CAPTURE_DATA_FRAME_TYPE_SIP = BIT(16), + PKT_CAPTURE_DATA_FRAME_QOS_NULL = BIT(17), +}; + +/** + * pkt_capture_mgmt_frame_type - Represent the various + * mgmt types to be sent over the monitor interface. + * @PKT_CAPTURE_MGMT_FRAME_TYPE_ALL: All the MGMT Frames. + * @PKT_CAPTURE_MGMT_CONNECT_NO_BEACON: All the MGMT Frames + * except the Beacons. Valid only in the Connect state. + * @PKT_CAPTURE_MGMT_CONNECT_BEACON: Only the connected + * BSSID Beacons. Valid only in the Connect state. + * @PKT_CAPTURE_MONITOR_MGMT_CONNECT_SCAN_BEACON: Represents + * the Beacons obtained during the scan (off channel and connected channel) + * when in connected state. + */ + +enum pkt_capture_mgmt_frame_type { + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL = BIT(0), + /* valid only if PKT_CAPTURE_MGMT_FRAME_TYPE_ALL is not set */ + PKT_CAPTURE_MGMT_CONNECT_NO_BEACON = BIT(1), + PKT_CAPTURE_MGMT_CONNECT_BEACON = BIT(2), + PKT_CAPTURE_MGMT_CONNECT_SCAN_BEACON = BIT(3), +}; + +/** + * pkt_capture_ctrl_frame_type - Represent the various + * ctrl types to be sent over the monitor interface. + * @PKT_CAPTURE_CTRL_FRAME_TYPE_ALL: All the ctrl Frames. + * @PKT_CAPTURE_CTRL_TRIGGER_FRAME: Trigger Frame. + */ +enum pkt_capture_ctrl_frame_type { + PKT_CAPTURE_CTRL_FRAME_TYPE_ALL = BIT(0), + /* valid only if PKT_CAPTURE_CTRL_FRAME_TYPE_ALL is not set */ + PKT_CAPTURE_CTRL_TRIGGER_FRAME = BIT(1), +}; + +/** + * enum pkt_capture_attr_set_monitor_mode - Used by the + * vendor command QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE to set the + * monitor mode. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These data packets + * are represented by enum pkt_capture_data_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These data packets + * are represented by enum pkt_capture_data_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These mgmt packets + * are represented by enum pkt_capture_mgmt_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These mgmt packets + * are represented by enum pkt_capture_mgmt_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These ctrl packets + * are represented by enum pkt_capture_ctrl_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These ctrl packets + * are represented by enum pkt_capture_ctrl_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL: u32 attribute, + * An interval only for the connected beacon interval, which expects that the + * connected BSSID's beacons shall be sent on the monitor interface only on this + * specific interval. + */ +enum pkt_capture_attr_set_monitor_mode { + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_INVALID = 0, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE = 1, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE = 2, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE = 3, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE = 4, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE = 5, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE = 6, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL = 7, + + /* keep last */ + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_AFTER_LAST, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MAX = + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_AFTER_LAST - 1, + +}; + +struct pkt_capture_frame_filter { + enum pkt_capture_data_frame_type data_tx_frame_filter; + enum pkt_capture_data_frame_type data_rx_frame_filter; + enum pkt_capture_mgmt_frame_type mgmt_tx_frame_filter; + enum pkt_capture_mgmt_frame_type mgmt_rx_frame_filter; + enum pkt_capture_ctrl_frame_type ctrl_tx_frame_filter; + enum pkt_capture_ctrl_frame_type ctrl_rx_frame_filter; + uint32_t connected_beacon_interval; + uint8_t vendor_attr_to_set; +}; #endif /* _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ */ diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h index 10147b580332..768b3ac00fad 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h @@ -267,6 +267,17 @@ int ucfg_pkt_capture_register_wma_callbacks(struct wlan_objmgr_psoc *psoc, struct pkt_capture_callbacks *cb_obj); +/** + * ucfg_pkt_capture_set_filter ucfg API to set frame filter + * @frame_filter: pkt capture frame filter data + * @vdev: pointer to vdev + * + * Return: QDF_STATUS + */ +QDF_STATUS +ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev); + #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * ucfg_pkt_capture_send_config - send packet capture config @@ -425,5 +436,13 @@ QDF_STATUS ucfg_pkt_capture_send_config { return QDF_STATUS_SUCCESS; } + +static inline QDF_STATUS +ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev) +{ + return QDF_STATUS_SUCCESS; +} + #endif /* WLAN_FEATURE_PKT_CAPTURE */ #endif /* _WLAN_PKT_CAPTURE_UCFG_API_H_ */ diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 97179fceeaa0..626ef47572a4 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -309,6 +309,13 @@ ucfg_pkt_capture_register_wma_callbacks(struct wlan_objmgr_psoc *psoc, return 0; } +QDF_STATUS +ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev) +{ + return pkt_capture_set_filter(frame_filter, vdev); +} + #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 QDF_STATUS ucfg_pkt_capture_send_config (struct wlan_objmgr_vdev *vdev, From 3b939c6932beafe505308fd29bc15bfe3985f9c4 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Tue, 7 Sep 2021 12:40:11 +0530 Subject: [PATCH 15/60] qcacld-3.0: Add support to send mode to FW based on frame filter In packet capture component add support to send data and mgmt mode to FW based on frame filter received from user through vendor command. Change-Id: Ib6d0d8abe53c29ea6c52900c628d87b603baf1e3 CRs-Fixed: 3046220 --- .../core/src/wlan_pkt_capture_main.c | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index cea00cb01592..cdb7e6fba41e 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -983,6 +983,9 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, { struct pkt_psoc_priv *psoc_priv; struct wlan_objmgr_psoc *psoc; + enum pkt_capture_mode mode = PACKET_CAPTURE_MODE_DISABLE; + struct dp_soc *soc; + QDF_STATUS status; if (!vdev) { pkt_capture_err("vdev is NULL"); @@ -1031,5 +1034,23 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, psoc_priv->frame_filter.connected_beacon_interval = frame_filter.connected_beacon_interval; + if (psoc_priv->frame_filter.mgmt_tx_frame_filter || + psoc_priv->frame_filter.mgmt_rx_frame_filter) + mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; + + if (psoc_priv->frame_filter.data_tx_frame_filter || + psoc_priv->frame_filter.data_rx_frame_filter) + mode |= PACKET_CAPTURE_MODE_DATA_ONLY; + + if (mode != pkt_capture_get_pktcap_mode(psoc)) { + status = tgt_pkt_capture_send_mode(vdev, mode); + if (QDF_IS_STATUS_ERROR(status)) { + pkt_capture_err("Unable to send packet capture mode"); + return status; + } + soc = wlan_psoc_get_dp_handle(psoc); + soc->wlan_cfg_ctx->pkt_capture_mode = mode; + } + return QDF_STATUS_SUCCESS; } From dbc1c1a878d0ecd6ad60105539484bddeff7c390 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Tue, 7 Sep 2021 13:01:37 +0530 Subject: [PATCH 16/60] qcacld-3.0: Add support to send config to FW based on filter In packet cpature component add support to send ctrl frames config to FW based on frame filter received from user through vendor command. Change-Id: Ie45ea2135e237a156fb60663e3f85cc601490e4a CRs-Fixed: 3046222 --- .../core/inc/wlan_pkt_capture_main.h | 19 ++++ .../core/inc/wlan_pkt_capture_priv.h | 2 + .../core/src/wlan_pkt_capture_main.c | 106 +++++++++++++++++- .../inc/wlan_pkt_capture_public_structs.h | 25 +++-- .../dispatcher/inc/wlan_pkt_capture_tgt_api.h | 4 +- .../inc/wlan_pkt_capture_ucfg_api.h | 60 +++++----- .../dispatcher/src/wlan_pkt_capture_tgt_api.c | 4 +- .../src/wlan_pkt_capture_ucfg_api.c | 34 ++++-- .../pkt_capture/src/target_if_pkt_capture.c | 8 +- 9 files changed, 204 insertions(+), 58 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index 9561217bc6ab..eda02a6d6113 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -172,6 +172,25 @@ void pkt_capture_set_pktcap_mode(struct wlan_objmgr_psoc *psoc, enum pkt_capture_mode pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc); +/** + * pkt_capture_set_pktcap_config - Set packet capture config + * @psoc: pointer to psoc object + * @config: config to be set + * + * Return: None + */ +void pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, + enum pkt_capture_config config); + +/** + * pkt_capture_get_pktcap_config - Get packet capture config + * @psoc: pointer to psoc object + * + * Return: config value + */ +enum pkt_capture_config +pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc); + /** * pkt_capture_drop_nbuf_list() - drop an nbuf list * @buf_list: buffer list to be dropepd diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h index 080f7340481c..3d8c207c23ae 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h @@ -44,11 +44,13 @@ struct pkt_capture_cfg { * @mon_cb: monitor callback function pointer * @mon_ctx: monitor callback context * @pkt_capture_mode: packet capture mode + * @pkt_capture_config: pakcet capture config */ struct pkt_capture_cb_context { QDF_STATUS (*mon_cb)(void *, qdf_nbuf_t); void *mon_ctx; enum pkt_capture_mode pkt_capture_mode; + enum pkt_capture_config pkt_capture_config; }; /** diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index cdb7e6fba41e..d10d6115758c 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -686,6 +686,65 @@ pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc) return mode; } +void pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, + enum pkt_capture_config config) +{ + struct pkt_capture_vdev_priv *vdev_priv; + struct wlan_objmgr_vdev *vdev; + + if (!psoc) { + pkt_capture_err("psoc is NULL"); + return; + } + + vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, + QDF_STA_MODE, + WLAN_PKT_CAPTURE_ID); + if (!vdev) { + pkt_capture_err("vdev is NULL"); + return; + } + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (vdev_priv) + vdev_priv->cb_ctx->pkt_capture_config = config; + else + pkt_capture_err("vdev_priv is NULL"); + + wlan_objmgr_vdev_release_ref(vdev, WLAN_PKT_CAPTURE_ID); +} + +enum pkt_capture_config +pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc) +{ + enum pkt_capture_config config = 0; + struct pkt_capture_vdev_priv *vdev_priv; + struct wlan_objmgr_vdev *vdev; + + if (!psoc) { + pkt_capture_err("psoc is NULL"); + return 0; + } + + if (!pkt_capture_get_mode(psoc)) + return 0; + + vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, + QDF_STA_MODE, + WLAN_PKT_CAPTURE_ID); + if (!vdev) + return 0; + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) + pkt_capture_err("vdev_priv is NULL"); + else + config = vdev_priv->cb_ctx->pkt_capture_config; + + wlan_objmgr_vdev_release_ref(vdev, WLAN_PKT_CAPTURE_ID); + return config; +} + /** * pkt_capture_callback_ctx_create() - Create packet capture callback context * @vdev_priv: pointer to packet capture vdev priv obj @@ -986,6 +1045,8 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, enum pkt_capture_mode mode = PACKET_CAPTURE_MODE_DISABLE; struct dp_soc *soc; QDF_STATUS status; + enum pkt_capture_config config = 0; + bool check_enable_beacon = 0; if (!vdev) { pkt_capture_err("vdev is NULL"); @@ -1034,10 +1095,35 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, psoc_priv->frame_filter.connected_beacon_interval = frame_filter.connected_beacon_interval; - if (psoc_priv->frame_filter.mgmt_tx_frame_filter || - psoc_priv->frame_filter.mgmt_rx_frame_filter) + if (psoc_priv->frame_filter.mgmt_tx_frame_filter) mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; + if (psoc_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL) { + mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; + config |= 1 << PACKET_CAPTURE_CONFIG_BEACON_ENABLE; + config |= 1 << PACKET_CAPTURE_CONFIG_OFF_CHANNEL_BEACON_ENABLE; + } else { + if (psoc_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_NO_BEACON) { + mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; + config |= 1 << PACKET_CAPTURE_CONFIG_NO_BEACON_ENABLE; + } else { + check_enable_beacon = 1; + } + } + + if (check_enable_beacon) { + if (psoc_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_BEACON) + config |= 1 << PACKET_CAPTURE_CONFIG_BEACON_ENABLE; + + if (psoc_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_SCAN_BEACON) + config |= 1 << + PACKET_CAPTURE_CONFIG_OFF_CHANNEL_BEACON_ENABLE; + } + if (psoc_priv->frame_filter.data_tx_frame_filter || psoc_priv->frame_filter.data_rx_frame_filter) mode |= PACKET_CAPTURE_MODE_DATA_ONLY; @@ -1052,5 +1138,21 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, soc->wlan_cfg_ctx->pkt_capture_mode = mode; } + if (psoc_priv->frame_filter.ctrl_tx_frame_filter || + psoc_priv->frame_filter.ctrl_rx_frame_filter) + config |= 1 << PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE; + + if (psoc_priv->frame_filter.data_rx_frame_filter & + PKT_CAPTURE_DATA_FRAME_QOS_NULL) + config |= 1 << PACKET_CAPTURE_CONFIG_QOS_ENABLE; + + if (config != pkt_capture_get_pktcap_config(psoc)) { + status = tgt_pkt_capture_send_config(vdev, config); + if (QDF_IS_STATUS_ERROR(status)) { + pkt_capture_err("packet capture send config failed"); + return status; + } + } + return QDF_STATUS_SUCCESS; } diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index acc1656b7877..ab71e1a5dbc0 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -38,19 +38,22 @@ enum pkt_capture_mode { }; /** - * enum pkt_capture_trigger_qos_config - packet capture config - * @PACKET_CAPTURE_CONFIG_TRIGGER_QOS_DISABLE: disable capture for trigger and - * qos frames + * enum pkt_capture_config - packet capture config * @PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE: enable capture for trigger frames only * @PACKET_CAPTURE_CONFIG_QOS_ENABLE: enable capture for qos frames only - * @PACKET_CAPTURE_CONFIG_TRIGGER_QOS_ENABLE: enable capture for both trigger - * and qos frames + * @PACKET_CAPTURE_CONFIG_CONNECT_NO_BEACON_ENABLE: drop all beacons, when + * device in connected state + * @PACKET_CAPTURE_CONFIG_CONNECT_BEACON_ENABLE: enable only connected BSSID + * beacons, when device in connected state + * @PACKET_CAPTURE_CONFIG_CONNECT_OFF_CHANNEL_BEACON_ENABLE: enable off channel + * beacons, when device in connected state */ -enum pkt_capture_trigger_qos_config { - PACKET_CAPTURE_CONFIG_TRIGGER_QOS_DISABLE = 0, - PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE, - PACKET_CAPTURE_CONFIG_QOS_ENABLE, - PACKET_CAPTURE_CONFIG_TRIGGER_QOS_ENABLE, +enum pkt_capture_config { + PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE = BIT(0), + PACKET_CAPTURE_CONFIG_QOS_ENABLE = BIT(1), + PACKET_CAPTURE_CONFIG_NO_BEACON_ENABLE = BIT(2), + PACKET_CAPTURE_CONFIG_BEACON_ENABLE = BIT(3), + PACKET_CAPTURE_CONFIG_OFF_CHANNEL_BEACON_ENABLE = BIT(4), }; /** @@ -106,7 +109,7 @@ struct wlan_pkt_capture_tx_ops { QDF_STATUS (*pkt_capture_send_config) (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - enum pkt_capture_trigger_qos_config config); + enum pkt_capture_config config); }; /** diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h index e4c1c3da7fc1..8cccff114dcc 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h @@ -53,7 +53,6 @@ QDF_STATUS tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, enum pkt_capture_mode mode); -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * tgt_pkt_capture_send_config() - send packet capture config to firmware * @vdev: pointer to vdev object @@ -63,8 +62,9 @@ tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, */ QDF_STATUS tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config); + enum pkt_capture_config config); +#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * tgt_pkt_capture_smu_event() - Receive smart monitor event from firmware * @psoc: pointer to psoc diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h index 768b3ac00fad..125e6082b9d7 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h @@ -120,6 +120,25 @@ void ucfg_pkt_capture_set_pktcap_mode(struct wlan_objmgr_psoc *psoc, enum pkt_capture_mode ucfg_pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc); +/** + * ucfg_pkt_capturee_set_pktcap_config - Set packet capture config + * @psoc: pointer to psoc object + * @config: config to be set + * + * Return: None + */ +void ucfg_pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, + enum pkt_capture_config config); + +/** + * ucfg_pkt_capture_get_pktcap_config - Get packet capture config + * @psoc: pointer to psoc object + * + * Return: config value + */ +enum pkt_capture_config +ucfg_pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc); + /** * ucfg_pkt_capture_process_mgmt_tx_data() - process management tx packets * @pdev: pointer to pdev object @@ -278,27 +297,6 @@ QDF_STATUS ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev); -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 -/** - * ucfg_pkt_capture_send_config - send packet capture config - * @vdev: pointer to vdev object - * @config: packet capture config - * - * Return: None - */ -QDF_STATUS ucfg_pkt_capture_send_config - (struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config); -#else -static inline -QDF_STATUS ucfg_pkt_capture_send_config - (struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config) -{ - return QDF_STATUS_SUCCESS; -} - -#endif #else static inline QDF_STATUS ucfg_pkt_capture_init(void) @@ -354,6 +352,18 @@ ucfg_pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc) return PACKET_CAPTURE_MODE_DISABLE; } +static inline +void ucfg_pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, + enum pkt_capture_config config) +{ +} + +static inline enum pkt_capture_config +ucfg_pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc) +{ + return 0; +} + static inline QDF_STATUS ucfg_pkt_capture_process_mgmt_tx_data( struct mgmt_offload_event_params *params, @@ -429,14 +439,6 @@ ucfg_pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev) { } -static inline -QDF_STATUS ucfg_pkt_capture_send_config - (struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config) -{ - return QDF_STATUS_SUCCESS; -} - static inline QDF_STATUS ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev) diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c index 0d069cd0cccd..d66b8a6560f6 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c @@ -126,10 +126,9 @@ tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, return status; } -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 QDF_STATUS tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config) + enum pkt_capture_config config) { QDF_STATUS status = QDF_STATUS_E_FAILURE; struct pkt_capture_vdev_priv *vdev_priv; @@ -161,6 +160,7 @@ tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, return status; } +#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 QDF_STATUS tgt_pkt_capture_smu_event(struct wlan_objmgr_psoc *psoc, struct smu_event_params *param) diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 626ef47572a4..0c9523efab77 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -86,6 +86,31 @@ ucfg_pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc) return pkt_capture_get_pktcap_mode(psoc); } +/** + * ucfg_pkt_capture_set_pktcap_config - Set packet capture config + * @psoc: pointer to psoc object + * @config: config to be set + * + * Return: None + */ +void ucfg_pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, + enum pkt_capture_config config) +{ + pkt_capture_set_pktcap_config(psoc, config); +} + +/** + * ucfg_pkt_capture_get_pktcap_config - Get packet capture config + * @psoc: pointer to psoc object + * + * Return: config value + */ +enum pkt_capture_config +ucfg_pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc) +{ + return pkt_capture_get_pktcap_config(psoc); +} + /** * ucfg_pkt_capture_init() - Packet capture component initialization. * @@ -315,12 +340,3 @@ ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, { return pkt_capture_set_filter(frame_filter, vdev); } - -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 -QDF_STATUS ucfg_pkt_capture_send_config - (struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config) -{ - return tgt_pkt_capture_send_config(vdev, config); -} -#endif diff --git a/components/target_if/pkt_capture/src/target_if_pkt_capture.c b/components/target_if/pkt_capture/src/target_if_pkt_capture.c index 4361c157fa90..e2dd60e1760e 100644 --- a/components/target_if/pkt_capture/src/target_if_pkt_capture.c +++ b/components/target_if/pkt_capture/src/target_if_pkt_capture.c @@ -79,7 +79,7 @@ static QDF_STATUS target_if_set_packet_capture_config (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - enum pkt_capture_trigger_qos_config config_value) + enum pkt_capture_config config_value) { wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc); QDF_STATUS status = QDF_STATUS_E_FAILURE; @@ -98,7 +98,9 @@ target_if_set_packet_capture_config param.param_value = (uint32_t)config_value; status = wmi_unified_vdev_set_param_send(wmi_handle, ¶m); - if (QDF_IS_STATUS_ERROR(status)) + if (QDF_IS_STATUS_SUCCESS(status)) + ucfg_pkt_capture_set_pktcap_config(psoc, config_value); + else pkt_capture_err("failed to set packet capture config"); return status; @@ -108,7 +110,7 @@ static QDF_STATUS target_if_set_packet_capture_config (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - enum pkt_capture_trigger_qos_config config_value) + enum pkt_capture_config config_value) { return QDF_STATUS_SUCCESS; } From 252d42763679aa2a7b019e88d5d73376d923dba7 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Mon, 30 Aug 2021 12:46:42 +0530 Subject: [PATCH 17/60] qcacld-3.0: Add tgt support to send beacon report period to FW Add tgt support in packet capture component to send user configured beacon report intervel to FW. Change-Id: Ibeb9f9a7f9ad2c2afa6929c492bd1029784b5f9e CRs-Fixed: 3046224 --- .../core/src/wlan_pkt_capture_main.c | 40 +++++++++++++++++-- .../inc/wlan_pkt_capture_public_structs.h | 4 ++ .../dispatcher/inc/wlan_pkt_capture_tgt_api.h | 11 +++++ .../dispatcher/src/wlan_pkt_capture_tgt_api.c | 36 +++++++++++++++++ .../pkt_capture/src/target_if_pkt_capture.c | 40 +++++++++++++++++++ 5 files changed, 127 insertions(+), 4 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index d10d6115758c..52a9a522c696 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -33,6 +33,7 @@ #include "cdp_txrx_ctrl.h" #include "wlan_pkt_capture_tgt_api.h" #include +#include "wlan_vdev_mgr_utils_api.h" static struct wlan_objmgr_vdev *gp_pkt_capture_vdev; @@ -1046,7 +1047,9 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct dp_soc *soc; QDF_STATUS status; enum pkt_capture_config config = 0; - bool check_enable_beacon = 0; + bool check_enable_beacon = 0, send_bcn = 0; + struct vdev_mlme_obj *vdev_mlme; + uint32_t bcn_interval, nth_beacon_value; if (!vdev) { pkt_capture_err("vdev is NULL"); @@ -1091,9 +1094,14 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, frame_filter.ctrl_rx_frame_filter; if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL)) - psoc_priv->frame_filter.connected_beacon_interval = - frame_filter.connected_beacon_interval; + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL)) { + if (frame_filter.connected_beacon_interval != + psoc_priv->frame_filter.connected_beacon_interval) { + psoc_priv->frame_filter.connected_beacon_interval = + frame_filter.connected_beacon_interval; + send_bcn = 1; + } + } if (psoc_priv->frame_filter.mgmt_tx_frame_filter) mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; @@ -1154,5 +1162,29 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, } } + if (send_bcn) { + vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj( + vdev, + WLAN_UMAC_COMP_MLME); + + if (!vdev_mlme) + return QDF_STATUS_E_FAILURE; + + wlan_util_vdev_mlme_get_param(vdev_mlme, + WLAN_MLME_CFG_BEACON_INTERVAL, + &bcn_interval); + + nth_beacon_value = + psoc_priv->frame_filter.connected_beacon_interval / + bcn_interval; + + status = tgt_pkt_capture_send_beacon_interval(vdev, + nth_beacon_value); + + if (QDF_IS_STATUS_ERROR(status)) { + pkt_capture_err("Unable to send beacon interval to fw"); + return status; + } + } return QDF_STATUS_SUCCESS; } diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index ab71e1a5dbc0..9b0c4bcc6900 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -110,6 +110,10 @@ struct wlan_pkt_capture_tx_ops { (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, enum pkt_capture_config config); + QDF_STATUS (*pkt_capture_send_beacon_interval) + (struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint32_t nth_value); }; /** diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h index 8cccff114dcc..fc26e89b85b8 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h @@ -53,6 +53,17 @@ QDF_STATUS tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, enum pkt_capture_mode mode); +/** + * tgt_pkt_capture_send_beacon_interval() - send beacon interval to firmware + * @vdev: pointer to vdev object + * @nth_value: Beacon report period + * + * Return: QDF_STATUS + */ +QDF_STATUS +tgt_pkt_capture_send_beacon_interval(struct wlan_objmgr_vdev *vdev, + uint32_t nth_value); + /** * tgt_pkt_capture_send_config() - send packet capture config to firmware * @vdev: pointer to vdev object diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c index d66b8a6560f6..ae65e8408c0a 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c @@ -126,6 +126,42 @@ tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, return status; } +QDF_STATUS +tgt_pkt_capture_send_beacon_interval(struct wlan_objmgr_vdev *vdev, + uint32_t nth_value) +{ + QDF_STATUS status = QDF_STATUS_E_FAILURE; + struct pkt_capture_vdev_priv *vdev_priv; + struct wlan_pkt_capture_tx_ops *tx_ops; + struct wlan_objmgr_psoc *psoc; + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + pkt_capture_err("psoc is NULL"); + return status; + } + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) { + pkt_capture_err("vdev priv is NULL"); + return status; + } + + tx_ops = &vdev_priv->tx_ops; + + if (!tx_ops->pkt_capture_send_beacon_interval) + return status; + + status = tx_ops->pkt_capture_send_beacon_interval + (psoc, + wlan_vdev_get_id(vdev), + nth_value); + if (QDF_IS_STATUS_ERROR(status)) + pkt_capture_err("Unable to send beacon interval to fw"); + + return status; +} + QDF_STATUS tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, enum pkt_capture_config config) diff --git a/components/target_if/pkt_capture/src/target_if_pkt_capture.c b/components/target_if/pkt_capture/src/target_if_pkt_capture.c index e2dd60e1760e..159d3435d8ad 100644 --- a/components/target_if/pkt_capture/src/target_if_pkt_capture.c +++ b/components/target_if/pkt_capture/src/target_if_pkt_capture.c @@ -116,6 +116,44 @@ target_if_set_packet_capture_config } #endif +/** + * target_if_set_packet_capture_beacon_interval() - set packet capture beacon + * interval + * @psoc: pointer to psoc object + * @vdev_id: vdev id + * @nth_value: Beacon report period + * + * Return: QDF_STATUS + */ +static QDF_STATUS +target_if_set_packet_capture_beacon_interval + (struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint32_t nth_value) +{ + wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc); + QDF_STATUS status = QDF_STATUS_E_FAILURE; + struct vdev_set_params param; + + if (!wmi_handle) { + target_if_err("Invalid wmi handle"); + return QDF_STATUS_E_INVAL; + } + + target_if_debug("psoc:%pK, vdev_id:%d nth_value:%d", + psoc, vdev_id, nth_value); + + param.vdev_id = vdev_id; + param.param_id = WMI_VDEV_PARAM_NTH_BEACON_TO_HOST; + param.param_value = nth_value; + + status = wmi_unified_vdev_set_param_send(wmi_handle, ¶m); + if (QDF_IS_STATUS_ERROR(status)) + pkt_capture_err("failed to set beacon interval"); + + return status; +} + /** * target_if_mgmt_offload_data_event_handler() - offload event handler * @handle: scn handle @@ -426,4 +464,6 @@ target_if_pkt_capture_register_tx_ops(struct wlan_pkt_capture_tx_ops *tx_ops) tx_ops->pkt_capture_send_mode = target_if_set_packet_capture_mode; tx_ops->pkt_capture_send_config = target_if_set_packet_capture_config; + tx_ops->pkt_capture_send_beacon_interval = + target_if_set_packet_capture_beacon_interval; } From 58d43563a6ac027e25efd4108c5068f1f6ca9225 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 3 Sep 2021 16:58:53 +0530 Subject: [PATCH 18/60] qcacld-3.0: Add check for data tx rx based on vendor command This commit adds check for data tx and rx packets based on vendor command received from user. Change-Id: Ieddb96d8778131ec5876c55462b518e1db552f57 CRs-Fixed: 3046231 --- .../core/src/wlan_pkt_capture_main.c | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 52a9a522c696..1cf3169faa7b 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -257,6 +257,23 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, uint8_t bssid[QDF_MAC_ADDR_SIZE]; uint8_t tid = 0; struct dp_soc *psoc = soc; + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_psoc *obj_mgr_psoc; + struct pkt_psoc_priv *psoc_priv; + struct pkt_capture_frame_filter *frame_filter; + + vdev = pkt_capture_get_vdev(); + if (!vdev) + return; + + obj_mgr_psoc = wlan_vdev_get_psoc(vdev); + psoc_priv = pkt_capture_psoc_get_priv(obj_mgr_psoc); + if (!psoc_priv) { + pkt_capture_err("psoc_priv is NULL"); + return; + } + + frame_filter = &psoc_priv->frame_filter; switch (event) { case WDI_EVENT_PKT_CAPTURE_TX_DATA: @@ -274,10 +291,9 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, hal_tx_comp_get_status(&desc->comp, &tx_comp_status, psoc->hal_soc); - if (!(pkt_capture_get_pktcap_mode_v2() & - PKT_CAPTURE_MODE_DATA_ONLY)) { + + if (!frame_filter->data_tx_frame_filter) return; - } if (tx_comp_status.valid) pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; @@ -397,9 +413,17 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, case WDI_EVENT_PKT_CAPTURE_RX_DATA: { - if (!(pkt_capture_get_pktcap_mode_v2() & - PKT_CAPTURE_MODE_DATA_ONLY)) + qdf_nbuf_t nbuf = (qdf_nbuf_t)log_data; + + if (!frame_filter->data_rx_frame_filter) { + /* + * Rx offload packets are delivered only to pkt capture + * component and not to stack so free them. + */ + if (status == RX_OFFLOAD_PKT) + qdf_nbuf_free(nbuf); return; + } pkt_capture_msdu_process_pkts(bssid, log_data, vdev_id, soc, status); @@ -410,8 +434,7 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, { qdf_nbuf_t nbuf = (qdf_nbuf_t)log_data; - if (!(pkt_capture_get_pktcap_mode_v2() & - PKT_CAPTURE_MODE_DATA_ONLY)) { + if (!frame_filter->data_rx_frame_filter) { /* * Rx offload packets are delivered only to pkt capture * component and not to stack so free them @@ -432,8 +455,7 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, bool is_pkt_during_roam = false; uint32_t freq = 0; - if (!(pkt_capture_get_pktcap_mode_v2() & - PKT_CAPTURE_MODE_DATA_ONLY)) + if (!frame_filter->data_tx_frame_filter) return; offload_deliver_msg = From 64a2d1ee784dda98244ea32420b712843ac5251e Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Wed, 8 Sep 2021 16:29:00 +0530 Subject: [PATCH 19/60] qcacld-3.0: Add filter for data packets in packet capture mode Deliver data packets to monitor interface only if corresponding filter is set by vendor command. Change-Id: Ibf24349d17d1e649819447b1cde36a834e5579a4 CRs-Fixed: 3046233 --- .../core/src/wlan_pkt_capture_main.c | 396 ++++++++++++------ 1 file changed, 264 insertions(+), 132 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 1cf3169faa7b..2f5c5d01aa64 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -251,12 +251,227 @@ pkt_capture_process_ppdu_stats(void *log_data) qdf_spin_unlock(&vdev_priv->lock_q); } +static void +pkt_capture_process_tx_data(void *soc, void *log_data, u_int16_t vdev_id, + uint32_t status) +{ + struct dp_soc *psoc = soc; + uint8_t tid = 0; + uint8_t bssid[QDF_MAC_ADDR_SIZE]; + struct pkt_capture_tx_hdr_elem_t *ptr_pktcapture_hdr; + struct pkt_capture_tx_hdr_elem_t pktcapture_hdr = {0}; + struct hal_tx_completion_status tx_comp_status = {0}; + struct qdf_tso_seg_elem_t *tso_seg = NULL; + uint32_t txcap_hdr_size = + sizeof(struct pkt_capture_tx_hdr_elem_t); + + struct dp_tx_desc_s *desc = log_data; + qdf_nbuf_t netbuf; + int nbuf_len; + + hal_tx_comp_get_status(&desc->comp, &tx_comp_status, + psoc->hal_soc); + + if (tx_comp_status.valid) + pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; + pktcapture_hdr.timestamp = tx_comp_status.tsf; + pktcapture_hdr.preamble = tx_comp_status.pkt_type; + pktcapture_hdr.mcs = tx_comp_status.mcs; + pktcapture_hdr.bw = tx_comp_status.bw; + /* nss not available */ + pktcapture_hdr.nss = 0; + pktcapture_hdr.rssi_comb = tx_comp_status.ack_frame_rssi; + /* rate not available */ + pktcapture_hdr.rate = 0; + pktcapture_hdr.stbc = tx_comp_status.stbc; + pktcapture_hdr.sgi = tx_comp_status.sgi; + pktcapture_hdr.ldpc = tx_comp_status.ldpc; + /* Beamformed not available */ + pktcapture_hdr.beamformed = 0; + pktcapture_hdr.framectrl = IEEE80211_FC0_TYPE_DATA | + (IEEE80211_FC1_DIR_TODS << 8); + pktcapture_hdr.tx_retry_cnt = tx_comp_status.transmit_cnt - 1; + /* seqno not available */ + pktcapture_hdr.seqno = 0; + tid = tx_comp_status.tid; + status = tx_comp_status.status; + + if (desc->frm_type == dp_tx_frm_tso) { + if (!desc->tso_desc) + return; + tso_seg = desc->tso_desc; + nbuf_len = tso_seg->seg.total_len; + } else { + nbuf_len = qdf_nbuf_len(desc->nbuf); + } + + netbuf = qdf_nbuf_alloc(NULL, + roundup(nbuf_len + RESERVE_BYTES, 4), + RESERVE_BYTES, 4, false); + + if (!netbuf) + return; + + qdf_nbuf_put_tail(netbuf, nbuf_len); + + if (desc->frm_type == dp_tx_frm_tso) { + uint8_t frag_cnt, num_frags = 0; + int frag_len = 0; + uint32_t tcp_seq_num; + uint16_t ip_len; + + if (tso_seg->seg.num_frags > 0) + num_frags = tso_seg->seg.num_frags - 1; + + /*Num of frags in a tso seg cannot be less than 2 */ + if (num_frags < 1) { + pkt_capture_err("num of frags in tso segment is %d\n", + (num_frags + 1)); + qdf_nbuf_free(netbuf); + return; + } + + tcp_seq_num = tso_seg->seg.tso_flags.tcp_seq_num; + tcp_seq_num = qdf_cpu_to_be32(tcp_seq_num); + + ip_len = tso_seg->seg.tso_flags.ip_len; + ip_len = qdf_cpu_to_be16(ip_len); + + for (frag_cnt = 0; frag_cnt <= num_frags; frag_cnt++) { + qdf_mem_copy( + qdf_nbuf_data(netbuf) + frag_len, + tso_seg->seg.tso_frags[frag_cnt].vaddr, + tso_seg->seg.tso_frags[frag_cnt].length); + frag_len += + tso_seg->seg.tso_frags[frag_cnt].length; + } + + qdf_mem_copy((qdf_nbuf_data(netbuf) + + IPV4_PKT_LEN_OFFSET), + &ip_len, sizeof(ip_len)); + qdf_mem_copy((qdf_nbuf_data(netbuf) + + IPV4_TCP_SEQ_NUM_OFFSET), + &tcp_seq_num, sizeof(tcp_seq_num)); + } else { + qdf_mem_copy(qdf_nbuf_data(netbuf), + qdf_nbuf_data(desc->nbuf), nbuf_len); + } + + if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) { + netbuf = qdf_nbuf_realloc_headroom(netbuf, + txcap_hdr_size); + if (!netbuf) { + QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, + QDF_TRACE_LEVEL_ERROR, + FL("No headroom")); + return; + } + } + + if (!qdf_nbuf_push_head(netbuf, txcap_hdr_size)) { + QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, + QDF_TRACE_LEVEL_ERROR, FL("No headroom")); + qdf_nbuf_free(netbuf); + return; + } + + ptr_pktcapture_hdr = + (struct pkt_capture_tx_hdr_elem_t *)qdf_nbuf_data(netbuf); + qdf_mem_copy(ptr_pktcapture_hdr, &pktcapture_hdr, + txcap_hdr_size); + + pkt_capture_datapkt_process( + vdev_id, netbuf, TXRX_PROCESS_TYPE_DATA_TX_COMPL, + tid, status, TXRX_PKTCAPTURE_PKT_FORMAT_8023, + bssid, NULL, pktcapture_hdr.tx_retry_cnt); +} + +/** + * pkt_capture_is_frame_filter_set() - Check frame filter is set + * @nbuf: buffer address + * @frame_filter: frame filter address + * @direction: frame direction + * + * Return: true, if filter bit is set + * false, if filter bit is not set + */ +static bool +pkt_capture_is_frame_filter_set(qdf_nbuf_t buf, + struct pkt_capture_frame_filter *frame_filter, + bool direction) +{ + enum pkt_capture_data_frame_type data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_ALL; + + if (qdf_nbuf_is_ipv4_arp_pkt(buf)) + data_frame_type = PKT_CAPTURE_DATA_FRAME_TYPE_ARP; + else if (qdf_nbuf_is_ipv4_eapol_pkt(buf)) + data_frame_type = PKT_CAPTURE_DATA_FRAME_TYPE_EAPOL; + else if (qdf_nbuf_data_is_tcp_syn(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYN; + else if (qdf_nbuf_data_is_tcp_syn_ack(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYNACK; + else if (qdf_nbuf_data_is_tcp_syn(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FIN; + else if (qdf_nbuf_data_is_tcp_syn_ack(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FINACK; + else if (qdf_nbuf_data_is_tcp_ack(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_ACK; + else if (qdf_nbuf_data_is_tcp_rst(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_RST; + else if (qdf_nbuf_is_ipv4_pkt(buf)) { + if (qdf_nbuf_is_ipv4_dhcp_pkt(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV4; + else if (qdf_nbuf_is_icmp_pkt(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV4; + else if (qdf_nbuf_data_is_dns_query(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4; + else if (qdf_nbuf_data_is_dns_response(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4; + } else if (qdf_nbuf_is_ipv6_pkt(buf)) { + if (qdf_nbuf_is_ipv6_dhcp_pkt(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV6; + else if (qdf_nbuf_is_icmpv6_pkt(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV6; + /* need to add code for + * PKT_CAPTURE_DATA_FRAME_TYPE_DNSV6 + */ + } + /* Add code for + * PKT_CAPTURE_DATA_FRAME_TYPE_RTP + * PKT_CAPTURE_DATA_FRAME_TYPE_SIP + * PKT_CAPTURE_DATA_FRAME_QOS_NULL + */ + + if (direction == IEEE80211_FC1_DIR_TODS) { + if (data_frame_type & frame_filter->data_tx_frame_filter) + return true; + else + return false; + } else { + if (data_frame_type & frame_filter->data_rx_frame_filter) + return true; + else + return false; + } +} + void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, u_int16_t vdev_id, uint32_t status) { uint8_t bssid[QDF_MAC_ADDR_SIZE]; - uint8_t tid = 0; - struct dp_soc *psoc = soc; struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_psoc *obj_mgr_psoc; struct pkt_psoc_priv *psoc_priv; @@ -278,136 +493,21 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, switch (event) { case WDI_EVENT_PKT_CAPTURE_TX_DATA: { - struct pkt_capture_tx_hdr_elem_t *ptr_pktcapture_hdr; - struct pkt_capture_tx_hdr_elem_t pktcapture_hdr = {0}; - struct hal_tx_completion_status tx_comp_status = {0}; - struct qdf_tso_seg_elem_t *tso_seg = NULL; - uint32_t txcap_hdr_size = - sizeof(struct pkt_capture_tx_hdr_elem_t); - struct dp_tx_desc_s *desc = log_data; - qdf_nbuf_t netbuf; - int nbuf_len; - - hal_tx_comp_get_status(&desc->comp, &tx_comp_status, - psoc->hal_soc); if (!frame_filter->data_tx_frame_filter) return; - if (tx_comp_status.valid) - pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; - pktcapture_hdr.timestamp = tx_comp_status.tsf; - pktcapture_hdr.preamble = tx_comp_status.pkt_type; - pktcapture_hdr.mcs = tx_comp_status.mcs; - pktcapture_hdr.bw = tx_comp_status.bw; - /* nss not available */ - pktcapture_hdr.nss = 0; - pktcapture_hdr.rssi_comb = tx_comp_status.ack_frame_rssi; - /* rate not available */ - pktcapture_hdr.rate = 0; - pktcapture_hdr.stbc = tx_comp_status.stbc; - pktcapture_hdr.sgi = tx_comp_status.sgi; - pktcapture_hdr.ldpc = tx_comp_status.ldpc; - /* Beamformed not available */ - pktcapture_hdr.beamformed = 0; - pktcapture_hdr.framectrl = IEEE80211_FC0_TYPE_DATA | - (IEEE80211_FC1_DIR_TODS << 8); - pktcapture_hdr.tx_retry_cnt = tx_comp_status.transmit_cnt - 1; - /* seqno not available */ - pktcapture_hdr.seqno = 0; - tid = tx_comp_status.tid; - status = tx_comp_status.status; - - if (desc->frm_type == dp_tx_frm_tso) { - if (!desc->tso_desc) - return; - tso_seg = desc->tso_desc; - nbuf_len = tso_seg->seg.total_len; - } else { - nbuf_len = qdf_nbuf_len(desc->nbuf); + if (frame_filter->data_tx_frame_filter & + PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { + pkt_capture_process_tx_data(soc, log_data, + vdev_id, status); + } else if (pkt_capture_is_frame_filter_set( + desc->nbuf, frame_filter, IEEE80211_FC1_DIR_TODS)) { + pkt_capture_process_tx_data(soc, log_data, + vdev_id, status); } - netbuf = qdf_nbuf_alloc(NULL, - roundup(nbuf_len + RESERVE_BYTES, 4), - RESERVE_BYTES, 4, false); - - if (!netbuf) - return; - - qdf_nbuf_put_tail(netbuf, nbuf_len); - - if (desc->frm_type == dp_tx_frm_tso) { - uint8_t frag_cnt, num_frags = 0; - int frag_len = 0; - uint32_t tcp_seq_num; - uint16_t ip_len; - - if (tso_seg->seg.num_frags > 0) - num_frags = tso_seg->seg.num_frags - 1; - - /*Num of frags in a tso seg cannot be less than 2 */ - if (num_frags < 1) { - pkt_capture_err("num of frags in tso segment is %d\n", - (num_frags + 1)); - qdf_nbuf_free(netbuf); - return; - } - - tcp_seq_num = tso_seg->seg.tso_flags.tcp_seq_num; - tcp_seq_num = qdf_cpu_to_be32(tcp_seq_num); - - ip_len = tso_seg->seg.tso_flags.ip_len; - ip_len = qdf_cpu_to_be16(ip_len); - - for (frag_cnt = 0; frag_cnt <= num_frags; frag_cnt++) { - qdf_mem_copy( - qdf_nbuf_data(netbuf) + frag_len, - tso_seg->seg.tso_frags[frag_cnt].vaddr, - tso_seg->seg.tso_frags[frag_cnt].length); - frag_len += - tso_seg->seg.tso_frags[frag_cnt].length; - } - - qdf_mem_copy((qdf_nbuf_data(netbuf) + - IPV4_PKT_LEN_OFFSET), - &ip_len, sizeof(ip_len)); - qdf_mem_copy((qdf_nbuf_data(netbuf) + - IPV4_TCP_SEQ_NUM_OFFSET), - &tcp_seq_num, sizeof(tcp_seq_num)); - } else { - qdf_mem_copy(qdf_nbuf_data(netbuf), - qdf_nbuf_data(desc->nbuf), nbuf_len); - } - - if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) { - netbuf = qdf_nbuf_realloc_headroom(netbuf, - txcap_hdr_size); - if (!netbuf) { - QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, - QDF_TRACE_LEVEL_ERROR, - FL("No headroom")); - return; - } - } - - if (!qdf_nbuf_push_head(netbuf, txcap_hdr_size)) { - QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, - QDF_TRACE_LEVEL_ERROR, FL("No headroom")); - qdf_nbuf_free(netbuf); - return; - } - - ptr_pktcapture_hdr = - (struct pkt_capture_tx_hdr_elem_t *)qdf_nbuf_data(netbuf); - qdf_mem_copy(ptr_pktcapture_hdr, &pktcapture_hdr, - txcap_hdr_size); - - pkt_capture_datapkt_process( - vdev_id, netbuf, TXRX_PROCESS_TYPE_DATA_TX_COMPL, - tid, status, TXRX_PKTCAPTURE_PKT_FORMAT_8023, - bssid, NULL, pktcapture_hdr.tx_retry_cnt); - break; } @@ -425,8 +525,19 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, return; } - pkt_capture_msdu_process_pkts(bssid, log_data, vdev_id, soc, - status); + if (frame_filter->data_rx_frame_filter & + PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { + pkt_capture_msdu_process_pkts(bssid, log_data, + vdev_id, soc, status); + } else if (pkt_capture_is_frame_filter_set( + nbuf, frame_filter, IEEE80211_FC1_DIR_FROMDS)) { + pkt_capture_msdu_process_pkts(bssid, log_data, + vdev_id, soc, status); + } else { + if (status == RX_OFFLOAD_PKT) + qdf_nbuf_free(nbuf); + } + break; } @@ -444,8 +555,19 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, return; } - pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, status, - nbuf); + if (frame_filter->data_rx_frame_filter & + PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { + pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, + status, nbuf); + } else if (pkt_capture_is_frame_filter_set( + nbuf, frame_filter, IEEE80211_FC1_DIR_FROMDS)) { + pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, + status, nbuf); + } else { + if (status == RX_OFFLOAD_PKT) + qdf_nbuf_free(nbuf); + } + break; } @@ -454,6 +576,8 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, struct htt_tx_offload_deliver_ind_hdr_t *offload_deliver_msg; bool is_pkt_during_roam = false; uint32_t freq = 0; + qdf_nbuf_t buf = log_data + + sizeof(struct htt_tx_offload_deliver_ind_hdr_t); if (!frame_filter->data_tx_frame_filter) return; @@ -471,9 +595,17 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, vdev_id = offload_deliver_msg->vdev_id; } - pkt_capture_offload_deliver_indication_handler( - log_data, - vdev_id, bssid, soc); + if (frame_filter->data_tx_frame_filter & + PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { + pkt_capture_offload_deliver_indication_handler( + log_data, + vdev_id, bssid, soc); + } else if (pkt_capture_is_frame_filter_set( + buf, frame_filter, IEEE80211_FC1_DIR_TODS)) { + pkt_capture_offload_deliver_indication_handler( + log_data, + vdev_id, bssid, soc); + } break; } From 65d0df531a1572cd94170592613972a2a8cba067 Mon Sep 17 00:00:00 2001 From: Surabhi Vishnoi Date: Fri, 3 Sep 2021 11:19:20 +0530 Subject: [PATCH 20/60] qcacld-3.0: Add check for mgmt/ctrl rx packets in pkt capture Deliver management and control rx packets to monitor interface only if corresponding filter is set by vendor command. Change-Id: I9aeb8071cfc6207359f8d7ec74af2a21e2742d1e CRs-Fixed: 3044857 --- .../core/src/wlan_pkt_capture_mgmt_txrx.c | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c index ec926368edcc..17bdce38ca88 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c @@ -426,17 +426,43 @@ pkt_capture_mgmt_rx_data_cb(struct wlan_objmgr_psoc *psoc, enum mgmt_frame_type frm_type) { struct mon_rx_status txrx_status = {0}; + struct pkt_psoc_priv *psoc_priv; struct ieee80211_frame *wh; tpSirMacFrameCtl pfc; qdf_nbuf_t nbuf; int buf_len; struct wlan_objmgr_vdev *vdev; - if (!(pkt_capture_get_pktcap_mode(psoc) & PKT_CAPTURE_MODE_MGMT_ONLY)) { - qdf_nbuf_free(wbuf); + psoc_priv = pkt_capture_psoc_get_priv(psoc); + if (!psoc_priv) { + pkt_capture_err("psoc priv is NULL"); return QDF_STATUS_E_FAILURE; } + pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(wbuf)); + + if (pfc->type == SIR_MAC_CTRL_FRAME && + !psoc_priv->frame_filter.ctrl_rx_frame_filter) + goto exit; + + if (pfc->type == SIR_MAC_MGMT_FRAME && + !psoc_priv->frame_filter.mgmt_rx_frame_filter) + goto exit; + + if (pfc->type == SIR_MAC_MGMT_FRAME) { + if (pfc->subType == SIR_MAC_MGMT_BEACON) { + if (psoc_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_NO_BEACON) + goto exit; + } else { + if (!((psoc_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL) || + (psoc_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_NO_BEACON))) + goto exit; + } + } + buf_len = qdf_nbuf_len(wbuf); nbuf = qdf_nbuf_alloc(NULL, roundup( buf_len + RESERVE_BYTES, 4), @@ -501,6 +527,9 @@ pkt_capture_mgmt_rx_data_cb(struct wlan_objmgr_psoc *psoc, qdf_nbuf_free(nbuf); return QDF_STATUS_SUCCESS; +exit: + qdf_nbuf_free(wbuf); + return QDF_STATUS_SUCCESS; } QDF_STATUS pkt_capture_mgmt_rx_ops(struct wlan_objmgr_psoc *psoc, From c28d3506567d41c763c28415a373ff52004ab921 Mon Sep 17 00:00:00 2001 From: Surabhi Vishnoi Date: Fri, 3 Sep 2021 13:49:31 +0530 Subject: [PATCH 21/60] qcacld-3.0: Add check for mgmt/ctrl tx packets in pkt capture Deliver management and control tx packets to monitor interface only if corresponding filter is set by vendor command. Change-Id: Ifc7f0ecfce7d7a105902e8a9ce522ba0325ee9cd CRs-Fixed: 3044855 --- .../core/src/wlan_pkt_capture_mgmt_txrx.c | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c index 17bdce38ca88..1816f5187c27 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c @@ -329,15 +329,39 @@ void pkt_capture_mgmt_tx(struct wlan_objmgr_pdev *pdev, uint16_t chan_freq, uint8_t preamble_type) { + struct mgmt_offload_event_params params = {0}; + tpSirMacFrameCtl pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(nbuf)); + struct pkt_psoc_priv *psoc_priv; + struct wlan_objmgr_psoc *psoc; qdf_nbuf_t wbuf; int nbuf_len; - struct mgmt_offload_event_params params = {0}; if (!pdev) { pkt_capture_err("pdev is NULL"); return; } + psoc = wlan_pdev_get_psoc(pdev); + if (!psoc) { + pkt_capture_err("psoc is NULL"); + return; + } + + psoc_priv = pkt_capture_psoc_get_priv(psoc); + if (!psoc_priv) { + pkt_capture_err("psoc priv is NULL"); + return; + } + + if (pfc->type == IEEE80211_FC0_TYPE_MGT && + !(psoc_priv->frame_filter.mgmt_tx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL)) + return; + + if (pfc->type == IEEE80211_FC0_TYPE_CTL && + !psoc_priv->frame_filter.ctrl_tx_frame_filter) + return; + nbuf_len = qdf_nbuf_len(nbuf); wbuf = qdf_nbuf_alloc(NULL, roundup(nbuf_len + RESERVE_BYTES, 4), RESERVE_BYTES, 4, false); @@ -380,6 +404,9 @@ pkt_capture_mgmt_tx_completion(struct wlan_objmgr_pdev *pdev, uint32_t status, struct mgmt_offload_event_params *params) { + struct pkt_psoc_priv *psoc_priv; + struct wlan_objmgr_psoc *psoc; + tpSirMacFrameCtl pfc; qdf_nbuf_t wbuf, nbuf; int nbuf_len; @@ -388,9 +415,30 @@ pkt_capture_mgmt_tx_completion(struct wlan_objmgr_pdev *pdev, return; } + psoc = wlan_pdev_get_psoc(pdev); + if (!psoc) { + pkt_capture_err("psoc is NULL"); + return; + } + + psoc_priv = pkt_capture_psoc_get_priv(psoc); + if (!psoc_priv) { + pkt_capture_err("psoc priv is NULL"); + return; + } + nbuf = mgmt_txrx_get_nbuf(pdev, desc_id); if (!nbuf) return; + pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(nbuf)); + if (pfc->type == IEEE80211_FC0_TYPE_MGT && + !(psoc_priv->frame_filter.mgmt_tx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL)) + return; + + if (pfc->type == IEEE80211_FC0_TYPE_CTL && + !psoc_priv->frame_filter.ctrl_tx_frame_filter) + return; nbuf_len = qdf_nbuf_len(nbuf); wbuf = qdf_nbuf_alloc(NULL, roundup(nbuf_len + RESERVE_BYTES, 4), From 1f4a0128d1d95c917454b1922ddb59c476872992 Mon Sep 17 00:00:00 2001 From: Surabhi Vishnoi Date: Mon, 27 Sep 2021 16:47:35 +0530 Subject: [PATCH 22/60] qcacld-3.0: Deliver tx offload mgmt pkts based on filter Deliver tx offload management to mon interface in packet capture mode based on config filters added by vendor command. Change-Id: Id60529b963e3021d7744858980b316b546606550 CRs-Fixed: 3045460 --- .../core/inc/wlan_pkt_capture_main.h | 8 +++++++ .../core/src/wlan_pkt_capture_main.c | 24 +++++++++++++++++++ .../src/wlan_pkt_capture_ucfg_api.c | 9 ++++--- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index eda02a6d6113..c621d7006cec 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -230,6 +230,14 @@ void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu, QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev); +/** + * pkt_capture_is_tx_mgmt_enable - Check if tx mgmt frames enabled + * @pdev: pointer to pdev + * + * Return: bool + */ +bool pkt_capture_is_tx_mgmt_enable(struct wlan_objmgr_pdev *pdev); + #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * pkt_capture_get_pktcap_mode_v2 - Get packet capture mode diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 2f5c5d01aa64..c97d5ffae221 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -651,6 +651,30 @@ enum pkt_capture_mode pkt_capture_get_mode(struct wlan_objmgr_psoc *psoc) return psoc_priv->cfg_param.pkt_capture_mode; } +bool pkt_capture_is_tx_mgmt_enable(struct wlan_objmgr_pdev *pdev) +{ + struct pkt_psoc_priv *psoc_priv; + struct wlan_objmgr_psoc *psoc; + + psoc = wlan_pdev_get_psoc(pdev); + if (!psoc) { + pkt_capture_err("psoc is NULL"); + return false; + } + + psoc_priv = pkt_capture_psoc_get_priv(psoc); + if (!psoc_priv) { + pkt_capture_err("psoc priv is NULL"); + return false; + } + + if (!(psoc_priv->frame_filter.mgmt_tx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL)) + return false; + + return true; +} + QDF_STATUS pkt_capture_register_callbacks(struct wlan_objmgr_vdev *vdev, QDF_STATUS (*mon_cb)(void *, qdf_nbuf_t), diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 0c9523efab77..838e9d6ad091 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -229,9 +229,12 @@ ucfg_pkt_capture_process_mgmt_tx_data(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t nbuf, uint8_t status) { - return pkt_capture_process_mgmt_tx_data( - pdev, params, nbuf, - pkt_capture_mgmt_status_map(status)); + if (pkt_capture_is_tx_mgmt_enable(pdev)) + return pkt_capture_process_mgmt_tx_data( + pdev, params, nbuf, + pkt_capture_mgmt_status_map(status)); + + return QDF_STATUS_SUCCESS; } void From 82fba8d12f4747050858966e6af0ae0179d0c8f9 Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Tue, 28 Sep 2021 17:26:34 +0530 Subject: [PATCH 23/60] qcacld-3.0: vendor command changes to configure parameters for monitor mode Add new vendor command aims to indicate the driver to configure monitor mode parameters for an interface on which this command is issued. Once enabled, the frames (both TX and RX) on this interface are sent to an active coexisting monitor interface. Change-Id: Ieb01d5f928d4e414f46bd00524ad683ad889963e CRs-Fixed: 3025473 --- core/hdd/src/wlan_hdd_cfg80211.c | 228 +++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 1708dce78f73..6894bc0e2781 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -163,6 +163,8 @@ #include "wlan_if_mgr_public_struct.h" #include "wlan_wfa_ucfg_api.h" #include "wlan_roam_debug.h" +#include "wlan_pkt_capture_ucfg_api.h" + #define g_mode_rates_size (12) #define a_mode_rates_size (8) @@ -14986,6 +14988,36 @@ get_usable_channel_policy[QCA_WLAN_VENDOR_ATTR_USABLE_CHANNELS_MAX + 1] = { }, }; +#ifdef WLAN_FEATURE_PKT_CAPTURE +static const struct nla_policy +set_monitor_mode_policy[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX + 1] = { + [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_INVALID] = { + .type = NLA_U32 + }, + [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL] = { + .type = NLA_U32 + }, +}; +#endif + #ifdef WLAN_FEATURE_GET_USABLE_CHAN_LIST static enum nl80211_chan_width hdd_convert_phy_bw_to_nl_bw(enum phy_ch_width bw) @@ -15431,6 +15463,189 @@ static int wlan_hdd_cfg80211_get_usable_channel(struct wiphy *wiphy, } #endif +#ifdef WLAN_FEATURE_PKT_CAPTURE +/** + * hdd_monitor_mode_configure - Process monitor mode configuration + * operation in the received vendor command + * @adapter: adapter pointer + * @tb: nl attributes + * + * Handles QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE + * + * Return: 0 for Success and negative value for failure + */ +static int hdd_monitor_mode_configure(struct hdd_adapter *adapter, + struct nlattr **tb) +{ + struct pkt_capture_frame_filter frame_filter = {0}; + struct wlan_objmgr_vdev *vdev; + + QDF_STATUS status; + + hdd_enter(); + + vdev = hdd_objmgr_get_vdev(adapter); + + if (!vdev) + return QDF_STATUS_E_FAILURE; + + if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_INVALID]) + return QDF_STATUS_E_FAILURE; + + if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE] && + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE]) < + PACKET_CAPTURE_DATA_MAX_FILTER) { + frame_filter.data_tx_frame_filter = + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set = + BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE] && + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE]) < + PACKET_CAPTURE_DATA_MAX_FILTER) { + frame_filter.data_rx_frame_filter = + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE] && + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE]) < + PACKET_CAPTURE_MGMT_MAX_FILTER) { + frame_filter.mgmt_tx_frame_filter = + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE] && + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE]) < + PACKET_CAPTURE_MGMT_MAX_FILTER) { + frame_filter.mgmt_rx_frame_filter = + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE] && + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE]) < + PACKET_CAPTURE_CTRL_MAX_FILTER) { + frame_filter.ctrl_tx_frame_filter = + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE] && + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE]) < + PACKET_CAPTURE_CTRL_MAX_FILTER) { + frame_filter.ctrl_rx_frame_filter = + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL]) { + frame_filter.connected_beacon_interval = + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL]); + frame_filter.vendor_attr_to_set |= + BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL); + } + + hdd_debug("Monitor mode config %s data tx %d data rx %d mgmt tx %d mgmt rx %d ctrl tx %d ctrl rx %d beacon interval %d\n", + __func__, frame_filter.data_tx_frame_filter, + frame_filter.data_rx_frame_filter, frame_filter.mgmt_tx_frame_filter, + frame_filter.mgmt_rx_frame_filter, frame_filter.ctrl_tx_frame_filter, + frame_filter.ctrl_rx_frame_filter, frame_filter.connected_beacon_interval); + + status = ucfg_pkt_capture_set_filter(frame_filter, vdev); + hdd_objmgr_put_vdev(vdev); + + hdd_exit(); + + return status; +} + +/** + * __wlan_hdd_cfg80211_set_monitor_mode() - Wifi monitor mode configuration + * vendor command + * @wiphy: wiphy device pointer + * @wdev: wireless device pointer + * @data: Vendor command data buffer + * @data_len: Buffer length + * + * Handles . + * + * Return: 0 for Success and negative value for failure + */ +static int +__wlan_hdd_cfg80211_set_monitor_mode(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int data_len) +{ + struct net_device *dev = wdev->netdev; + struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev); + struct hdd_context *hdd_ctx = wiphy_priv(wiphy); + struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX + 1]; + int errno; + + if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) { + hdd_err("Command not allowed in FTM mode"); + return -EPERM; + } + + errno = wlan_hdd_validate_context(hdd_ctx); + if (errno) + return errno; + + if (!ucfg_pkt_capture_get_mode(hdd_ctx->psoc)) + return QDF_STATUS_E_FAILURE; + + errno = hdd_validate_adapter(adapter); + if (errno) + return errno; + + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX, + data, data_len, set_monitor_mode_policy)) { + hdd_err("invalid monitor attr"); + return -EINVAL; + } + + errno = hdd_monitor_mode_configure(adapter, tb); + + return errno; +} + +/** + * wlan_hdd_cfg80211_set_monitor_mode() - set monitor mode + * @wiphy: wiphy pointer + * @wdev: pointer to struct wireless_dev + * @data: pointer to incoming NL vendor data + * @data_len: length of @data + * + * Return: 0 on success; error number otherwise. + */ +static int wlan_hdd_cfg80211_set_monitor_mode(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int data_len) +{ + int errno; + struct osif_vdev_sync *vdev_sync; + + errno = osif_vdev_sync_op_start(wdev->netdev, &vdev_sync); + if (errno) + return errno; + + errno = __wlan_hdd_cfg80211_set_monitor_mode(wiphy, wdev, + data, data_len); + + osif_vdev_sync_op_stop(vdev_sync); + + return errno; +} +#endif + /** * wlan_hdd_cfg80211_get_chain_rssi() - get chain rssi * @wiphy: wiphy pointer @@ -16305,6 +16520,19 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = { FEATURE_THERMAL_VENDOR_COMMANDS FEATURE_BTC_CHAIN_MODE_COMMANDS FEATURE_WMM_COMMANDS + +#ifdef WLAN_FEATURE_PKT_CAPTURE + { + .info.vendor_id = QCA_NL80211_VENDOR_ID, + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV | + WIPHY_VENDOR_CMD_NEED_RUNNING, + .doit = wlan_hdd_cfg80211_set_monitor_mode, + vendor_command_policy(set_monitor_mode_policy, + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX) + }, +#endif }; struct hdd_context *hdd_cfg80211_wiphy_alloc(void) From 024c0d306055e41bd8dcb7968f110d4a3179d6a2 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:12:20 +0530 Subject: [PATCH 24/60] Revert "qcacld-3.0: Deliver tx offload mgmt pkts based on filter" This reverts commit 1f4a0128d1d95c917454b1922ddb59c476872992. Change-Id: Ifb9381a878ad8932edd3eafaf5024cc1e85514e5 --- .../core/inc/wlan_pkt_capture_main.h | 8 ------- .../core/src/wlan_pkt_capture_main.c | 24 ------------------- .../src/wlan_pkt_capture_ucfg_api.c | 9 +++---- 3 files changed, 3 insertions(+), 38 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index c621d7006cec..eda02a6d6113 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -230,14 +230,6 @@ void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu, QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev); -/** - * pkt_capture_is_tx_mgmt_enable - Check if tx mgmt frames enabled - * @pdev: pointer to pdev - * - * Return: bool - */ -bool pkt_capture_is_tx_mgmt_enable(struct wlan_objmgr_pdev *pdev); - #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * pkt_capture_get_pktcap_mode_v2 - Get packet capture mode diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index c97d5ffae221..2f5c5d01aa64 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -651,30 +651,6 @@ enum pkt_capture_mode pkt_capture_get_mode(struct wlan_objmgr_psoc *psoc) return psoc_priv->cfg_param.pkt_capture_mode; } -bool pkt_capture_is_tx_mgmt_enable(struct wlan_objmgr_pdev *pdev) -{ - struct pkt_psoc_priv *psoc_priv; - struct wlan_objmgr_psoc *psoc; - - psoc = wlan_pdev_get_psoc(pdev); - if (!psoc) { - pkt_capture_err("psoc is NULL"); - return false; - } - - psoc_priv = pkt_capture_psoc_get_priv(psoc); - if (!psoc_priv) { - pkt_capture_err("psoc priv is NULL"); - return false; - } - - if (!(psoc_priv->frame_filter.mgmt_tx_frame_filter & - PKT_CAPTURE_MGMT_FRAME_TYPE_ALL)) - return false; - - return true; -} - QDF_STATUS pkt_capture_register_callbacks(struct wlan_objmgr_vdev *vdev, QDF_STATUS (*mon_cb)(void *, qdf_nbuf_t), diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 838e9d6ad091..0c9523efab77 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -229,12 +229,9 @@ ucfg_pkt_capture_process_mgmt_tx_data(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t nbuf, uint8_t status) { - if (pkt_capture_is_tx_mgmt_enable(pdev)) - return pkt_capture_process_mgmt_tx_data( - pdev, params, nbuf, - pkt_capture_mgmt_status_map(status)); - - return QDF_STATUS_SUCCESS; + return pkt_capture_process_mgmt_tx_data( + pdev, params, nbuf, + pkt_capture_mgmt_status_map(status)); } void From da6d9e1b30fc7d93c2fa68a1f8f92cd42cbbbf2d Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:13:45 +0530 Subject: [PATCH 25/60] Revert "qcacld-3.0: Add check for mgmt/ctrl tx packets in pkt capture" This reverts commit c28d3506567d41c763c28415a373ff52004ab921. Change-Id: Ib34943252acf4ffa93a2aeadd299829f878841f3 --- .../core/src/wlan_pkt_capture_mgmt_txrx.c | 50 +------------------ 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c index 1816f5187c27..17bdce38ca88 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c @@ -329,39 +329,15 @@ void pkt_capture_mgmt_tx(struct wlan_objmgr_pdev *pdev, uint16_t chan_freq, uint8_t preamble_type) { - struct mgmt_offload_event_params params = {0}; - tpSirMacFrameCtl pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(nbuf)); - struct pkt_psoc_priv *psoc_priv; - struct wlan_objmgr_psoc *psoc; qdf_nbuf_t wbuf; int nbuf_len; + struct mgmt_offload_event_params params = {0}; if (!pdev) { pkt_capture_err("pdev is NULL"); return; } - psoc = wlan_pdev_get_psoc(pdev); - if (!psoc) { - pkt_capture_err("psoc is NULL"); - return; - } - - psoc_priv = pkt_capture_psoc_get_priv(psoc); - if (!psoc_priv) { - pkt_capture_err("psoc priv is NULL"); - return; - } - - if (pfc->type == IEEE80211_FC0_TYPE_MGT && - !(psoc_priv->frame_filter.mgmt_tx_frame_filter & - PKT_CAPTURE_MGMT_FRAME_TYPE_ALL)) - return; - - if (pfc->type == IEEE80211_FC0_TYPE_CTL && - !psoc_priv->frame_filter.ctrl_tx_frame_filter) - return; - nbuf_len = qdf_nbuf_len(nbuf); wbuf = qdf_nbuf_alloc(NULL, roundup(nbuf_len + RESERVE_BYTES, 4), RESERVE_BYTES, 4, false); @@ -404,9 +380,6 @@ pkt_capture_mgmt_tx_completion(struct wlan_objmgr_pdev *pdev, uint32_t status, struct mgmt_offload_event_params *params) { - struct pkt_psoc_priv *psoc_priv; - struct wlan_objmgr_psoc *psoc; - tpSirMacFrameCtl pfc; qdf_nbuf_t wbuf, nbuf; int nbuf_len; @@ -415,30 +388,9 @@ pkt_capture_mgmt_tx_completion(struct wlan_objmgr_pdev *pdev, return; } - psoc = wlan_pdev_get_psoc(pdev); - if (!psoc) { - pkt_capture_err("psoc is NULL"); - return; - } - - psoc_priv = pkt_capture_psoc_get_priv(psoc); - if (!psoc_priv) { - pkt_capture_err("psoc priv is NULL"); - return; - } - nbuf = mgmt_txrx_get_nbuf(pdev, desc_id); if (!nbuf) return; - pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(nbuf)); - if (pfc->type == IEEE80211_FC0_TYPE_MGT && - !(psoc_priv->frame_filter.mgmt_tx_frame_filter & - PKT_CAPTURE_MGMT_FRAME_TYPE_ALL)) - return; - - if (pfc->type == IEEE80211_FC0_TYPE_CTL && - !psoc_priv->frame_filter.ctrl_tx_frame_filter) - return; nbuf_len = qdf_nbuf_len(nbuf); wbuf = qdf_nbuf_alloc(NULL, roundup(nbuf_len + RESERVE_BYTES, 4), From 2a5fd47f3e821656e3d7b7da9bbc429ad91cb13e Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:14:48 +0530 Subject: [PATCH 26/60] Revert "qcacld-3.0: Add check for mgmt/ctrl rx packets in pkt capture" This reverts commit 65d0df531a1572cd94170592613972a2a8cba067. Change-Id: I9a2b1131d748874add287d52e79f45b48e26c55c --- .../core/src/wlan_pkt_capture_mgmt_txrx.c | 33 ++----------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c index 17bdce38ca88..ec926368edcc 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c @@ -426,43 +426,17 @@ pkt_capture_mgmt_rx_data_cb(struct wlan_objmgr_psoc *psoc, enum mgmt_frame_type frm_type) { struct mon_rx_status txrx_status = {0}; - struct pkt_psoc_priv *psoc_priv; struct ieee80211_frame *wh; tpSirMacFrameCtl pfc; qdf_nbuf_t nbuf; int buf_len; struct wlan_objmgr_vdev *vdev; - psoc_priv = pkt_capture_psoc_get_priv(psoc); - if (!psoc_priv) { - pkt_capture_err("psoc priv is NULL"); + if (!(pkt_capture_get_pktcap_mode(psoc) & PKT_CAPTURE_MODE_MGMT_ONLY)) { + qdf_nbuf_free(wbuf); return QDF_STATUS_E_FAILURE; } - pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(wbuf)); - - if (pfc->type == SIR_MAC_CTRL_FRAME && - !psoc_priv->frame_filter.ctrl_rx_frame_filter) - goto exit; - - if (pfc->type == SIR_MAC_MGMT_FRAME && - !psoc_priv->frame_filter.mgmt_rx_frame_filter) - goto exit; - - if (pfc->type == SIR_MAC_MGMT_FRAME) { - if (pfc->subType == SIR_MAC_MGMT_BEACON) { - if (psoc_priv->frame_filter.mgmt_rx_frame_filter & - PKT_CAPTURE_MGMT_CONNECT_NO_BEACON) - goto exit; - } else { - if (!((psoc_priv->frame_filter.mgmt_rx_frame_filter & - PKT_CAPTURE_MGMT_FRAME_TYPE_ALL) || - (psoc_priv->frame_filter.mgmt_rx_frame_filter & - PKT_CAPTURE_MGMT_CONNECT_NO_BEACON))) - goto exit; - } - } - buf_len = qdf_nbuf_len(wbuf); nbuf = qdf_nbuf_alloc(NULL, roundup( buf_len + RESERVE_BYTES, 4), @@ -527,9 +501,6 @@ pkt_capture_mgmt_rx_data_cb(struct wlan_objmgr_psoc *psoc, qdf_nbuf_free(nbuf); return QDF_STATUS_SUCCESS; -exit: - qdf_nbuf_free(wbuf); - return QDF_STATUS_SUCCESS; } QDF_STATUS pkt_capture_mgmt_rx_ops(struct wlan_objmgr_psoc *psoc, From b594f3783f635befcb4aa0e5e95c21b3efd2f1c2 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:16:00 +0530 Subject: [PATCH 27/60] Revert "qcacld-3.0: Add filter for data packets in packet capture mode" This reverts commit 64a2d1ee784dda98244ea32420b712843ac5251e. Change-Id: Ia7a8f5ffa4e93efa3c37786ad39f377ceaf5a3fe --- .../core/src/wlan_pkt_capture_main.c | 396 ++++++------------ 1 file changed, 132 insertions(+), 264 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 2f5c5d01aa64..1cf3169faa7b 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -251,227 +251,12 @@ pkt_capture_process_ppdu_stats(void *log_data) qdf_spin_unlock(&vdev_priv->lock_q); } -static void -pkt_capture_process_tx_data(void *soc, void *log_data, u_int16_t vdev_id, - uint32_t status) -{ - struct dp_soc *psoc = soc; - uint8_t tid = 0; - uint8_t bssid[QDF_MAC_ADDR_SIZE]; - struct pkt_capture_tx_hdr_elem_t *ptr_pktcapture_hdr; - struct pkt_capture_tx_hdr_elem_t pktcapture_hdr = {0}; - struct hal_tx_completion_status tx_comp_status = {0}; - struct qdf_tso_seg_elem_t *tso_seg = NULL; - uint32_t txcap_hdr_size = - sizeof(struct pkt_capture_tx_hdr_elem_t); - - struct dp_tx_desc_s *desc = log_data; - qdf_nbuf_t netbuf; - int nbuf_len; - - hal_tx_comp_get_status(&desc->comp, &tx_comp_status, - psoc->hal_soc); - - if (tx_comp_status.valid) - pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; - pktcapture_hdr.timestamp = tx_comp_status.tsf; - pktcapture_hdr.preamble = tx_comp_status.pkt_type; - pktcapture_hdr.mcs = tx_comp_status.mcs; - pktcapture_hdr.bw = tx_comp_status.bw; - /* nss not available */ - pktcapture_hdr.nss = 0; - pktcapture_hdr.rssi_comb = tx_comp_status.ack_frame_rssi; - /* rate not available */ - pktcapture_hdr.rate = 0; - pktcapture_hdr.stbc = tx_comp_status.stbc; - pktcapture_hdr.sgi = tx_comp_status.sgi; - pktcapture_hdr.ldpc = tx_comp_status.ldpc; - /* Beamformed not available */ - pktcapture_hdr.beamformed = 0; - pktcapture_hdr.framectrl = IEEE80211_FC0_TYPE_DATA | - (IEEE80211_FC1_DIR_TODS << 8); - pktcapture_hdr.tx_retry_cnt = tx_comp_status.transmit_cnt - 1; - /* seqno not available */ - pktcapture_hdr.seqno = 0; - tid = tx_comp_status.tid; - status = tx_comp_status.status; - - if (desc->frm_type == dp_tx_frm_tso) { - if (!desc->tso_desc) - return; - tso_seg = desc->tso_desc; - nbuf_len = tso_seg->seg.total_len; - } else { - nbuf_len = qdf_nbuf_len(desc->nbuf); - } - - netbuf = qdf_nbuf_alloc(NULL, - roundup(nbuf_len + RESERVE_BYTES, 4), - RESERVE_BYTES, 4, false); - - if (!netbuf) - return; - - qdf_nbuf_put_tail(netbuf, nbuf_len); - - if (desc->frm_type == dp_tx_frm_tso) { - uint8_t frag_cnt, num_frags = 0; - int frag_len = 0; - uint32_t tcp_seq_num; - uint16_t ip_len; - - if (tso_seg->seg.num_frags > 0) - num_frags = tso_seg->seg.num_frags - 1; - - /*Num of frags in a tso seg cannot be less than 2 */ - if (num_frags < 1) { - pkt_capture_err("num of frags in tso segment is %d\n", - (num_frags + 1)); - qdf_nbuf_free(netbuf); - return; - } - - tcp_seq_num = tso_seg->seg.tso_flags.tcp_seq_num; - tcp_seq_num = qdf_cpu_to_be32(tcp_seq_num); - - ip_len = tso_seg->seg.tso_flags.ip_len; - ip_len = qdf_cpu_to_be16(ip_len); - - for (frag_cnt = 0; frag_cnt <= num_frags; frag_cnt++) { - qdf_mem_copy( - qdf_nbuf_data(netbuf) + frag_len, - tso_seg->seg.tso_frags[frag_cnt].vaddr, - tso_seg->seg.tso_frags[frag_cnt].length); - frag_len += - tso_seg->seg.tso_frags[frag_cnt].length; - } - - qdf_mem_copy((qdf_nbuf_data(netbuf) + - IPV4_PKT_LEN_OFFSET), - &ip_len, sizeof(ip_len)); - qdf_mem_copy((qdf_nbuf_data(netbuf) + - IPV4_TCP_SEQ_NUM_OFFSET), - &tcp_seq_num, sizeof(tcp_seq_num)); - } else { - qdf_mem_copy(qdf_nbuf_data(netbuf), - qdf_nbuf_data(desc->nbuf), nbuf_len); - } - - if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) { - netbuf = qdf_nbuf_realloc_headroom(netbuf, - txcap_hdr_size); - if (!netbuf) { - QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, - QDF_TRACE_LEVEL_ERROR, - FL("No headroom")); - return; - } - } - - if (!qdf_nbuf_push_head(netbuf, txcap_hdr_size)) { - QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, - QDF_TRACE_LEVEL_ERROR, FL("No headroom")); - qdf_nbuf_free(netbuf); - return; - } - - ptr_pktcapture_hdr = - (struct pkt_capture_tx_hdr_elem_t *)qdf_nbuf_data(netbuf); - qdf_mem_copy(ptr_pktcapture_hdr, &pktcapture_hdr, - txcap_hdr_size); - - pkt_capture_datapkt_process( - vdev_id, netbuf, TXRX_PROCESS_TYPE_DATA_TX_COMPL, - tid, status, TXRX_PKTCAPTURE_PKT_FORMAT_8023, - bssid, NULL, pktcapture_hdr.tx_retry_cnt); -} - -/** - * pkt_capture_is_frame_filter_set() - Check frame filter is set - * @nbuf: buffer address - * @frame_filter: frame filter address - * @direction: frame direction - * - * Return: true, if filter bit is set - * false, if filter bit is not set - */ -static bool -pkt_capture_is_frame_filter_set(qdf_nbuf_t buf, - struct pkt_capture_frame_filter *frame_filter, - bool direction) -{ - enum pkt_capture_data_frame_type data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_ALL; - - if (qdf_nbuf_is_ipv4_arp_pkt(buf)) - data_frame_type = PKT_CAPTURE_DATA_FRAME_TYPE_ARP; - else if (qdf_nbuf_is_ipv4_eapol_pkt(buf)) - data_frame_type = PKT_CAPTURE_DATA_FRAME_TYPE_EAPOL; - else if (qdf_nbuf_data_is_tcp_syn(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYN; - else if (qdf_nbuf_data_is_tcp_syn_ack(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYNACK; - else if (qdf_nbuf_data_is_tcp_syn(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FIN; - else if (qdf_nbuf_data_is_tcp_syn_ack(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FINACK; - else if (qdf_nbuf_data_is_tcp_ack(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_ACK; - else if (qdf_nbuf_data_is_tcp_rst(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_RST; - else if (qdf_nbuf_is_ipv4_pkt(buf)) { - if (qdf_nbuf_is_ipv4_dhcp_pkt(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV4; - else if (qdf_nbuf_is_icmp_pkt(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV4; - else if (qdf_nbuf_data_is_dns_query(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4; - else if (qdf_nbuf_data_is_dns_response(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4; - } else if (qdf_nbuf_is_ipv6_pkt(buf)) { - if (qdf_nbuf_is_ipv6_dhcp_pkt(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV6; - else if (qdf_nbuf_is_icmpv6_pkt(buf)) - data_frame_type = - PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV6; - /* need to add code for - * PKT_CAPTURE_DATA_FRAME_TYPE_DNSV6 - */ - } - /* Add code for - * PKT_CAPTURE_DATA_FRAME_TYPE_RTP - * PKT_CAPTURE_DATA_FRAME_TYPE_SIP - * PKT_CAPTURE_DATA_FRAME_QOS_NULL - */ - - if (direction == IEEE80211_FC1_DIR_TODS) { - if (data_frame_type & frame_filter->data_tx_frame_filter) - return true; - else - return false; - } else { - if (data_frame_type & frame_filter->data_rx_frame_filter) - return true; - else - return false; - } -} - void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, u_int16_t vdev_id, uint32_t status) { uint8_t bssid[QDF_MAC_ADDR_SIZE]; + uint8_t tid = 0; + struct dp_soc *psoc = soc; struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_psoc *obj_mgr_psoc; struct pkt_psoc_priv *psoc_priv; @@ -493,21 +278,136 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, switch (event) { case WDI_EVENT_PKT_CAPTURE_TX_DATA: { + struct pkt_capture_tx_hdr_elem_t *ptr_pktcapture_hdr; + struct pkt_capture_tx_hdr_elem_t pktcapture_hdr = {0}; + struct hal_tx_completion_status tx_comp_status = {0}; + struct qdf_tso_seg_elem_t *tso_seg = NULL; + uint32_t txcap_hdr_size = + sizeof(struct pkt_capture_tx_hdr_elem_t); + struct dp_tx_desc_s *desc = log_data; + qdf_nbuf_t netbuf; + int nbuf_len; + + hal_tx_comp_get_status(&desc->comp, &tx_comp_status, + psoc->hal_soc); if (!frame_filter->data_tx_frame_filter) return; - if (frame_filter->data_tx_frame_filter & - PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { - pkt_capture_process_tx_data(soc, log_data, - vdev_id, status); - } else if (pkt_capture_is_frame_filter_set( - desc->nbuf, frame_filter, IEEE80211_FC1_DIR_TODS)) { - pkt_capture_process_tx_data(soc, log_data, - vdev_id, status); + if (tx_comp_status.valid) + pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; + pktcapture_hdr.timestamp = tx_comp_status.tsf; + pktcapture_hdr.preamble = tx_comp_status.pkt_type; + pktcapture_hdr.mcs = tx_comp_status.mcs; + pktcapture_hdr.bw = tx_comp_status.bw; + /* nss not available */ + pktcapture_hdr.nss = 0; + pktcapture_hdr.rssi_comb = tx_comp_status.ack_frame_rssi; + /* rate not available */ + pktcapture_hdr.rate = 0; + pktcapture_hdr.stbc = tx_comp_status.stbc; + pktcapture_hdr.sgi = tx_comp_status.sgi; + pktcapture_hdr.ldpc = tx_comp_status.ldpc; + /* Beamformed not available */ + pktcapture_hdr.beamformed = 0; + pktcapture_hdr.framectrl = IEEE80211_FC0_TYPE_DATA | + (IEEE80211_FC1_DIR_TODS << 8); + pktcapture_hdr.tx_retry_cnt = tx_comp_status.transmit_cnt - 1; + /* seqno not available */ + pktcapture_hdr.seqno = 0; + tid = tx_comp_status.tid; + status = tx_comp_status.status; + + if (desc->frm_type == dp_tx_frm_tso) { + if (!desc->tso_desc) + return; + tso_seg = desc->tso_desc; + nbuf_len = tso_seg->seg.total_len; + } else { + nbuf_len = qdf_nbuf_len(desc->nbuf); } + netbuf = qdf_nbuf_alloc(NULL, + roundup(nbuf_len + RESERVE_BYTES, 4), + RESERVE_BYTES, 4, false); + + if (!netbuf) + return; + + qdf_nbuf_put_tail(netbuf, nbuf_len); + + if (desc->frm_type == dp_tx_frm_tso) { + uint8_t frag_cnt, num_frags = 0; + int frag_len = 0; + uint32_t tcp_seq_num; + uint16_t ip_len; + + if (tso_seg->seg.num_frags > 0) + num_frags = tso_seg->seg.num_frags - 1; + + /*Num of frags in a tso seg cannot be less than 2 */ + if (num_frags < 1) { + pkt_capture_err("num of frags in tso segment is %d\n", + (num_frags + 1)); + qdf_nbuf_free(netbuf); + return; + } + + tcp_seq_num = tso_seg->seg.tso_flags.tcp_seq_num; + tcp_seq_num = qdf_cpu_to_be32(tcp_seq_num); + + ip_len = tso_seg->seg.tso_flags.ip_len; + ip_len = qdf_cpu_to_be16(ip_len); + + for (frag_cnt = 0; frag_cnt <= num_frags; frag_cnt++) { + qdf_mem_copy( + qdf_nbuf_data(netbuf) + frag_len, + tso_seg->seg.tso_frags[frag_cnt].vaddr, + tso_seg->seg.tso_frags[frag_cnt].length); + frag_len += + tso_seg->seg.tso_frags[frag_cnt].length; + } + + qdf_mem_copy((qdf_nbuf_data(netbuf) + + IPV4_PKT_LEN_OFFSET), + &ip_len, sizeof(ip_len)); + qdf_mem_copy((qdf_nbuf_data(netbuf) + + IPV4_TCP_SEQ_NUM_OFFSET), + &tcp_seq_num, sizeof(tcp_seq_num)); + } else { + qdf_mem_copy(qdf_nbuf_data(netbuf), + qdf_nbuf_data(desc->nbuf), nbuf_len); + } + + if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) { + netbuf = qdf_nbuf_realloc_headroom(netbuf, + txcap_hdr_size); + if (!netbuf) { + QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, + QDF_TRACE_LEVEL_ERROR, + FL("No headroom")); + return; + } + } + + if (!qdf_nbuf_push_head(netbuf, txcap_hdr_size)) { + QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, + QDF_TRACE_LEVEL_ERROR, FL("No headroom")); + qdf_nbuf_free(netbuf); + return; + } + + ptr_pktcapture_hdr = + (struct pkt_capture_tx_hdr_elem_t *)qdf_nbuf_data(netbuf); + qdf_mem_copy(ptr_pktcapture_hdr, &pktcapture_hdr, + txcap_hdr_size); + + pkt_capture_datapkt_process( + vdev_id, netbuf, TXRX_PROCESS_TYPE_DATA_TX_COMPL, + tid, status, TXRX_PKTCAPTURE_PKT_FORMAT_8023, + bssid, NULL, pktcapture_hdr.tx_retry_cnt); + break; } @@ -525,19 +425,8 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, return; } - if (frame_filter->data_rx_frame_filter & - PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { - pkt_capture_msdu_process_pkts(bssid, log_data, - vdev_id, soc, status); - } else if (pkt_capture_is_frame_filter_set( - nbuf, frame_filter, IEEE80211_FC1_DIR_FROMDS)) { - pkt_capture_msdu_process_pkts(bssid, log_data, - vdev_id, soc, status); - } else { - if (status == RX_OFFLOAD_PKT) - qdf_nbuf_free(nbuf); - } - + pkt_capture_msdu_process_pkts(bssid, log_data, vdev_id, soc, + status); break; } @@ -555,19 +444,8 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, return; } - if (frame_filter->data_rx_frame_filter & - PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { - pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, - status, nbuf); - } else if (pkt_capture_is_frame_filter_set( - nbuf, frame_filter, IEEE80211_FC1_DIR_FROMDS)) { - pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, - status, nbuf); - } else { - if (status == RX_OFFLOAD_PKT) - qdf_nbuf_free(nbuf); - } - + pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, status, + nbuf); break; } @@ -576,8 +454,6 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, struct htt_tx_offload_deliver_ind_hdr_t *offload_deliver_msg; bool is_pkt_during_roam = false; uint32_t freq = 0; - qdf_nbuf_t buf = log_data + - sizeof(struct htt_tx_offload_deliver_ind_hdr_t); if (!frame_filter->data_tx_frame_filter) return; @@ -595,17 +471,9 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, vdev_id = offload_deliver_msg->vdev_id; } - if (frame_filter->data_tx_frame_filter & - PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { - pkt_capture_offload_deliver_indication_handler( - log_data, - vdev_id, bssid, soc); - } else if (pkt_capture_is_frame_filter_set( - buf, frame_filter, IEEE80211_FC1_DIR_TODS)) { - pkt_capture_offload_deliver_indication_handler( - log_data, - vdev_id, bssid, soc); - } + pkt_capture_offload_deliver_indication_handler( + log_data, + vdev_id, bssid, soc); break; } From 9ecfaffae109f844f9d7842a844024606cdfe3a2 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:16:43 +0530 Subject: [PATCH 28/60] Revert "qcacld-3.0: Add check for data tx rx based on vendor command" This reverts commit 58d43563a6ac027e25efd4108c5068f1f6ca9225. Change-Id: I043736fdb692e99a2c622e7d2a60fcad913a35df --- .../core/src/wlan_pkt_capture_main.c | 40 +++++-------------- 1 file changed, 9 insertions(+), 31 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 1cf3169faa7b..52a9a522c696 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -257,23 +257,6 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, uint8_t bssid[QDF_MAC_ADDR_SIZE]; uint8_t tid = 0; struct dp_soc *psoc = soc; - struct wlan_objmgr_vdev *vdev; - struct wlan_objmgr_psoc *obj_mgr_psoc; - struct pkt_psoc_priv *psoc_priv; - struct pkt_capture_frame_filter *frame_filter; - - vdev = pkt_capture_get_vdev(); - if (!vdev) - return; - - obj_mgr_psoc = wlan_vdev_get_psoc(vdev); - psoc_priv = pkt_capture_psoc_get_priv(obj_mgr_psoc); - if (!psoc_priv) { - pkt_capture_err("psoc_priv is NULL"); - return; - } - - frame_filter = &psoc_priv->frame_filter; switch (event) { case WDI_EVENT_PKT_CAPTURE_TX_DATA: @@ -291,9 +274,10 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, hal_tx_comp_get_status(&desc->comp, &tx_comp_status, psoc->hal_soc); - - if (!frame_filter->data_tx_frame_filter) + if (!(pkt_capture_get_pktcap_mode_v2() & + PKT_CAPTURE_MODE_DATA_ONLY)) { return; + } if (tx_comp_status.valid) pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; @@ -413,17 +397,9 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, case WDI_EVENT_PKT_CAPTURE_RX_DATA: { - qdf_nbuf_t nbuf = (qdf_nbuf_t)log_data; - - if (!frame_filter->data_rx_frame_filter) { - /* - * Rx offload packets are delivered only to pkt capture - * component and not to stack so free them. - */ - if (status == RX_OFFLOAD_PKT) - qdf_nbuf_free(nbuf); + if (!(pkt_capture_get_pktcap_mode_v2() & + PKT_CAPTURE_MODE_DATA_ONLY)) return; - } pkt_capture_msdu_process_pkts(bssid, log_data, vdev_id, soc, status); @@ -434,7 +410,8 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, { qdf_nbuf_t nbuf = (qdf_nbuf_t)log_data; - if (!frame_filter->data_rx_frame_filter) { + if (!(pkt_capture_get_pktcap_mode_v2() & + PKT_CAPTURE_MODE_DATA_ONLY)) { /* * Rx offload packets are delivered only to pkt capture * component and not to stack so free them @@ -455,7 +432,8 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, bool is_pkt_during_roam = false; uint32_t freq = 0; - if (!frame_filter->data_tx_frame_filter) + if (!(pkt_capture_get_pktcap_mode_v2() & + PKT_CAPTURE_MODE_DATA_ONLY)) return; offload_deliver_msg = From 1573e8ee5228cbe9448ff061a33d899d986222ce Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:17:28 +0530 Subject: [PATCH 29/60] Revert "qcacld-3.0: Add tgt support to send beacon report period to FW" This reverts commit 252d42763679aa2a7b019e88d5d73376d923dba7. Change-Id: Ie431dcde9f1c9602870d660ce7d81606009a149a --- .../core/src/wlan_pkt_capture_main.c | 40 ++----------------- .../inc/wlan_pkt_capture_public_structs.h | 4 -- .../dispatcher/inc/wlan_pkt_capture_tgt_api.h | 11 ----- .../dispatcher/src/wlan_pkt_capture_tgt_api.c | 36 ----------------- .../pkt_capture/src/target_if_pkt_capture.c | 40 ------------------- 5 files changed, 4 insertions(+), 127 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 52a9a522c696..d10d6115758c 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -33,7 +33,6 @@ #include "cdp_txrx_ctrl.h" #include "wlan_pkt_capture_tgt_api.h" #include -#include "wlan_vdev_mgr_utils_api.h" static struct wlan_objmgr_vdev *gp_pkt_capture_vdev; @@ -1047,9 +1046,7 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct dp_soc *soc; QDF_STATUS status; enum pkt_capture_config config = 0; - bool check_enable_beacon = 0, send_bcn = 0; - struct vdev_mlme_obj *vdev_mlme; - uint32_t bcn_interval, nth_beacon_value; + bool check_enable_beacon = 0; if (!vdev) { pkt_capture_err("vdev is NULL"); @@ -1094,14 +1091,9 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, frame_filter.ctrl_rx_frame_filter; if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL)) { - if (frame_filter.connected_beacon_interval != - psoc_priv->frame_filter.connected_beacon_interval) { - psoc_priv->frame_filter.connected_beacon_interval = - frame_filter.connected_beacon_interval; - send_bcn = 1; - } - } + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL)) + psoc_priv->frame_filter.connected_beacon_interval = + frame_filter.connected_beacon_interval; if (psoc_priv->frame_filter.mgmt_tx_frame_filter) mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; @@ -1162,29 +1154,5 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, } } - if (send_bcn) { - vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj( - vdev, - WLAN_UMAC_COMP_MLME); - - if (!vdev_mlme) - return QDF_STATUS_E_FAILURE; - - wlan_util_vdev_mlme_get_param(vdev_mlme, - WLAN_MLME_CFG_BEACON_INTERVAL, - &bcn_interval); - - nth_beacon_value = - psoc_priv->frame_filter.connected_beacon_interval / - bcn_interval; - - status = tgt_pkt_capture_send_beacon_interval(vdev, - nth_beacon_value); - - if (QDF_IS_STATUS_ERROR(status)) { - pkt_capture_err("Unable to send beacon interval to fw"); - return status; - } - } return QDF_STATUS_SUCCESS; } diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index 9b0c4bcc6900..ab71e1a5dbc0 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -110,10 +110,6 @@ struct wlan_pkt_capture_tx_ops { (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, enum pkt_capture_config config); - QDF_STATUS (*pkt_capture_send_beacon_interval) - (struct wlan_objmgr_psoc *psoc, - uint8_t vdev_id, - uint32_t nth_value); }; /** diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h index fc26e89b85b8..8cccff114dcc 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h @@ -53,17 +53,6 @@ QDF_STATUS tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, enum pkt_capture_mode mode); -/** - * tgt_pkt_capture_send_beacon_interval() - send beacon interval to firmware - * @vdev: pointer to vdev object - * @nth_value: Beacon report period - * - * Return: QDF_STATUS - */ -QDF_STATUS -tgt_pkt_capture_send_beacon_interval(struct wlan_objmgr_vdev *vdev, - uint32_t nth_value); - /** * tgt_pkt_capture_send_config() - send packet capture config to firmware * @vdev: pointer to vdev object diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c index ae65e8408c0a..d66b8a6560f6 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c @@ -126,42 +126,6 @@ tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, return status; } -QDF_STATUS -tgt_pkt_capture_send_beacon_interval(struct wlan_objmgr_vdev *vdev, - uint32_t nth_value) -{ - QDF_STATUS status = QDF_STATUS_E_FAILURE; - struct pkt_capture_vdev_priv *vdev_priv; - struct wlan_pkt_capture_tx_ops *tx_ops; - struct wlan_objmgr_psoc *psoc; - - psoc = wlan_vdev_get_psoc(vdev); - if (!psoc) { - pkt_capture_err("psoc is NULL"); - return status; - } - - vdev_priv = pkt_capture_vdev_get_priv(vdev); - if (!vdev_priv) { - pkt_capture_err("vdev priv is NULL"); - return status; - } - - tx_ops = &vdev_priv->tx_ops; - - if (!tx_ops->pkt_capture_send_beacon_interval) - return status; - - status = tx_ops->pkt_capture_send_beacon_interval - (psoc, - wlan_vdev_get_id(vdev), - nth_value); - if (QDF_IS_STATUS_ERROR(status)) - pkt_capture_err("Unable to send beacon interval to fw"); - - return status; -} - QDF_STATUS tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, enum pkt_capture_config config) diff --git a/components/target_if/pkt_capture/src/target_if_pkt_capture.c b/components/target_if/pkt_capture/src/target_if_pkt_capture.c index 159d3435d8ad..e2dd60e1760e 100644 --- a/components/target_if/pkt_capture/src/target_if_pkt_capture.c +++ b/components/target_if/pkt_capture/src/target_if_pkt_capture.c @@ -116,44 +116,6 @@ target_if_set_packet_capture_config } #endif -/** - * target_if_set_packet_capture_beacon_interval() - set packet capture beacon - * interval - * @psoc: pointer to psoc object - * @vdev_id: vdev id - * @nth_value: Beacon report period - * - * Return: QDF_STATUS - */ -static QDF_STATUS -target_if_set_packet_capture_beacon_interval - (struct wlan_objmgr_psoc *psoc, - uint8_t vdev_id, - uint32_t nth_value) -{ - wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc); - QDF_STATUS status = QDF_STATUS_E_FAILURE; - struct vdev_set_params param; - - if (!wmi_handle) { - target_if_err("Invalid wmi handle"); - return QDF_STATUS_E_INVAL; - } - - target_if_debug("psoc:%pK, vdev_id:%d nth_value:%d", - psoc, vdev_id, nth_value); - - param.vdev_id = vdev_id; - param.param_id = WMI_VDEV_PARAM_NTH_BEACON_TO_HOST; - param.param_value = nth_value; - - status = wmi_unified_vdev_set_param_send(wmi_handle, ¶m); - if (QDF_IS_STATUS_ERROR(status)) - pkt_capture_err("failed to set beacon interval"); - - return status; -} - /** * target_if_mgmt_offload_data_event_handler() - offload event handler * @handle: scn handle @@ -464,6 +426,4 @@ target_if_pkt_capture_register_tx_ops(struct wlan_pkt_capture_tx_ops *tx_ops) tx_ops->pkt_capture_send_mode = target_if_set_packet_capture_mode; tx_ops->pkt_capture_send_config = target_if_set_packet_capture_config; - tx_ops->pkt_capture_send_beacon_interval = - target_if_set_packet_capture_beacon_interval; } From c7650770a58e5c533c25fda482b72d89edb0abdf Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:18:13 +0530 Subject: [PATCH 30/60] Revert "qcacld-3.0: Add support to send config to FW based on filter" This reverts commit dbc1c1a878d0ecd6ad60105539484bddeff7c390. Change-Id: I4660512e5c5b72f60f20332c5139e7bc15f20890 --- .../core/inc/wlan_pkt_capture_main.h | 19 ---- .../core/inc/wlan_pkt_capture_priv.h | 2 - .../core/src/wlan_pkt_capture_main.c | 106 +----------------- .../inc/wlan_pkt_capture_public_structs.h | 25 ++--- .../dispatcher/inc/wlan_pkt_capture_tgt_api.h | 4 +- .../inc/wlan_pkt_capture_ucfg_api.h | 60 +++++----- .../dispatcher/src/wlan_pkt_capture_tgt_api.c | 4 +- .../src/wlan_pkt_capture_ucfg_api.c | 34 ++---- .../pkt_capture/src/target_if_pkt_capture.c | 8 +- 9 files changed, 58 insertions(+), 204 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index eda02a6d6113..9561217bc6ab 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -172,25 +172,6 @@ void pkt_capture_set_pktcap_mode(struct wlan_objmgr_psoc *psoc, enum pkt_capture_mode pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc); -/** - * pkt_capture_set_pktcap_config - Set packet capture config - * @psoc: pointer to psoc object - * @config: config to be set - * - * Return: None - */ -void pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, - enum pkt_capture_config config); - -/** - * pkt_capture_get_pktcap_config - Get packet capture config - * @psoc: pointer to psoc object - * - * Return: config value - */ -enum pkt_capture_config -pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc); - /** * pkt_capture_drop_nbuf_list() - drop an nbuf list * @buf_list: buffer list to be dropepd diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h index 3d8c207c23ae..080f7340481c 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h @@ -44,13 +44,11 @@ struct pkt_capture_cfg { * @mon_cb: monitor callback function pointer * @mon_ctx: monitor callback context * @pkt_capture_mode: packet capture mode - * @pkt_capture_config: pakcet capture config */ struct pkt_capture_cb_context { QDF_STATUS (*mon_cb)(void *, qdf_nbuf_t); void *mon_ctx; enum pkt_capture_mode pkt_capture_mode; - enum pkt_capture_config pkt_capture_config; }; /** diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index d10d6115758c..cdb7e6fba41e 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -686,65 +686,6 @@ pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc) return mode; } -void pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, - enum pkt_capture_config config) -{ - struct pkt_capture_vdev_priv *vdev_priv; - struct wlan_objmgr_vdev *vdev; - - if (!psoc) { - pkt_capture_err("psoc is NULL"); - return; - } - - vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, - QDF_STA_MODE, - WLAN_PKT_CAPTURE_ID); - if (!vdev) { - pkt_capture_err("vdev is NULL"); - return; - } - - vdev_priv = pkt_capture_vdev_get_priv(vdev); - if (vdev_priv) - vdev_priv->cb_ctx->pkt_capture_config = config; - else - pkt_capture_err("vdev_priv is NULL"); - - wlan_objmgr_vdev_release_ref(vdev, WLAN_PKT_CAPTURE_ID); -} - -enum pkt_capture_config -pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc) -{ - enum pkt_capture_config config = 0; - struct pkt_capture_vdev_priv *vdev_priv; - struct wlan_objmgr_vdev *vdev; - - if (!psoc) { - pkt_capture_err("psoc is NULL"); - return 0; - } - - if (!pkt_capture_get_mode(psoc)) - return 0; - - vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, - QDF_STA_MODE, - WLAN_PKT_CAPTURE_ID); - if (!vdev) - return 0; - - vdev_priv = pkt_capture_vdev_get_priv(vdev); - if (!vdev_priv) - pkt_capture_err("vdev_priv is NULL"); - else - config = vdev_priv->cb_ctx->pkt_capture_config; - - wlan_objmgr_vdev_release_ref(vdev, WLAN_PKT_CAPTURE_ID); - return config; -} - /** * pkt_capture_callback_ctx_create() - Create packet capture callback context * @vdev_priv: pointer to packet capture vdev priv obj @@ -1045,8 +986,6 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, enum pkt_capture_mode mode = PACKET_CAPTURE_MODE_DISABLE; struct dp_soc *soc; QDF_STATUS status; - enum pkt_capture_config config = 0; - bool check_enable_beacon = 0; if (!vdev) { pkt_capture_err("vdev is NULL"); @@ -1095,35 +1034,10 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, psoc_priv->frame_filter.connected_beacon_interval = frame_filter.connected_beacon_interval; - if (psoc_priv->frame_filter.mgmt_tx_frame_filter) + if (psoc_priv->frame_filter.mgmt_tx_frame_filter || + psoc_priv->frame_filter.mgmt_rx_frame_filter) mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; - if (psoc_priv->frame_filter.mgmt_rx_frame_filter & - PKT_CAPTURE_MGMT_FRAME_TYPE_ALL) { - mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; - config |= 1 << PACKET_CAPTURE_CONFIG_BEACON_ENABLE; - config |= 1 << PACKET_CAPTURE_CONFIG_OFF_CHANNEL_BEACON_ENABLE; - } else { - if (psoc_priv->frame_filter.mgmt_rx_frame_filter & - PKT_CAPTURE_MGMT_CONNECT_NO_BEACON) { - mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; - config |= 1 << PACKET_CAPTURE_CONFIG_NO_BEACON_ENABLE; - } else { - check_enable_beacon = 1; - } - } - - if (check_enable_beacon) { - if (psoc_priv->frame_filter.mgmt_rx_frame_filter & - PKT_CAPTURE_MGMT_CONNECT_BEACON) - config |= 1 << PACKET_CAPTURE_CONFIG_BEACON_ENABLE; - - if (psoc_priv->frame_filter.mgmt_rx_frame_filter & - PKT_CAPTURE_MGMT_CONNECT_SCAN_BEACON) - config |= 1 << - PACKET_CAPTURE_CONFIG_OFF_CHANNEL_BEACON_ENABLE; - } - if (psoc_priv->frame_filter.data_tx_frame_filter || psoc_priv->frame_filter.data_rx_frame_filter) mode |= PACKET_CAPTURE_MODE_DATA_ONLY; @@ -1138,21 +1052,5 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, soc->wlan_cfg_ctx->pkt_capture_mode = mode; } - if (psoc_priv->frame_filter.ctrl_tx_frame_filter || - psoc_priv->frame_filter.ctrl_rx_frame_filter) - config |= 1 << PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE; - - if (psoc_priv->frame_filter.data_rx_frame_filter & - PKT_CAPTURE_DATA_FRAME_QOS_NULL) - config |= 1 << PACKET_CAPTURE_CONFIG_QOS_ENABLE; - - if (config != pkt_capture_get_pktcap_config(psoc)) { - status = tgt_pkt_capture_send_config(vdev, config); - if (QDF_IS_STATUS_ERROR(status)) { - pkt_capture_err("packet capture send config failed"); - return status; - } - } - return QDF_STATUS_SUCCESS; } diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index ab71e1a5dbc0..acc1656b7877 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -38,22 +38,19 @@ enum pkt_capture_mode { }; /** - * enum pkt_capture_config - packet capture config + * enum pkt_capture_trigger_qos_config - packet capture config + * @PACKET_CAPTURE_CONFIG_TRIGGER_QOS_DISABLE: disable capture for trigger and + * qos frames * @PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE: enable capture for trigger frames only * @PACKET_CAPTURE_CONFIG_QOS_ENABLE: enable capture for qos frames only - * @PACKET_CAPTURE_CONFIG_CONNECT_NO_BEACON_ENABLE: drop all beacons, when - * device in connected state - * @PACKET_CAPTURE_CONFIG_CONNECT_BEACON_ENABLE: enable only connected BSSID - * beacons, when device in connected state - * @PACKET_CAPTURE_CONFIG_CONNECT_OFF_CHANNEL_BEACON_ENABLE: enable off channel - * beacons, when device in connected state + * @PACKET_CAPTURE_CONFIG_TRIGGER_QOS_ENABLE: enable capture for both trigger + * and qos frames */ -enum pkt_capture_config { - PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE = BIT(0), - PACKET_CAPTURE_CONFIG_QOS_ENABLE = BIT(1), - PACKET_CAPTURE_CONFIG_NO_BEACON_ENABLE = BIT(2), - PACKET_CAPTURE_CONFIG_BEACON_ENABLE = BIT(3), - PACKET_CAPTURE_CONFIG_OFF_CHANNEL_BEACON_ENABLE = BIT(4), +enum pkt_capture_trigger_qos_config { + PACKET_CAPTURE_CONFIG_TRIGGER_QOS_DISABLE = 0, + PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE, + PACKET_CAPTURE_CONFIG_QOS_ENABLE, + PACKET_CAPTURE_CONFIG_TRIGGER_QOS_ENABLE, }; /** @@ -109,7 +106,7 @@ struct wlan_pkt_capture_tx_ops { QDF_STATUS (*pkt_capture_send_config) (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - enum pkt_capture_config config); + enum pkt_capture_trigger_qos_config config); }; /** diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h index 8cccff114dcc..e4c1c3da7fc1 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h @@ -53,6 +53,7 @@ QDF_STATUS tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, enum pkt_capture_mode mode); +#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * tgt_pkt_capture_send_config() - send packet capture config to firmware * @vdev: pointer to vdev object @@ -62,9 +63,8 @@ tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, */ QDF_STATUS tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, - enum pkt_capture_config config); + enum pkt_capture_trigger_qos_config config); -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * tgt_pkt_capture_smu_event() - Receive smart monitor event from firmware * @psoc: pointer to psoc diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h index 125e6082b9d7..768b3ac00fad 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h @@ -120,25 +120,6 @@ void ucfg_pkt_capture_set_pktcap_mode(struct wlan_objmgr_psoc *psoc, enum pkt_capture_mode ucfg_pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc); -/** - * ucfg_pkt_capturee_set_pktcap_config - Set packet capture config - * @psoc: pointer to psoc object - * @config: config to be set - * - * Return: None - */ -void ucfg_pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, - enum pkt_capture_config config); - -/** - * ucfg_pkt_capture_get_pktcap_config - Get packet capture config - * @psoc: pointer to psoc object - * - * Return: config value - */ -enum pkt_capture_config -ucfg_pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc); - /** * ucfg_pkt_capture_process_mgmt_tx_data() - process management tx packets * @pdev: pointer to pdev object @@ -297,6 +278,27 @@ QDF_STATUS ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev); +#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 +/** + * ucfg_pkt_capture_send_config - send packet capture config + * @vdev: pointer to vdev object + * @config: packet capture config + * + * Return: None + */ +QDF_STATUS ucfg_pkt_capture_send_config + (struct wlan_objmgr_vdev *vdev, + enum pkt_capture_trigger_qos_config config); +#else +static inline +QDF_STATUS ucfg_pkt_capture_send_config + (struct wlan_objmgr_vdev *vdev, + enum pkt_capture_trigger_qos_config config) +{ + return QDF_STATUS_SUCCESS; +} + +#endif #else static inline QDF_STATUS ucfg_pkt_capture_init(void) @@ -352,18 +354,6 @@ ucfg_pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc) return PACKET_CAPTURE_MODE_DISABLE; } -static inline -void ucfg_pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, - enum pkt_capture_config config) -{ -} - -static inline enum pkt_capture_config -ucfg_pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc) -{ - return 0; -} - static inline QDF_STATUS ucfg_pkt_capture_process_mgmt_tx_data( struct mgmt_offload_event_params *params, @@ -439,6 +429,14 @@ ucfg_pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev) { } +static inline +QDF_STATUS ucfg_pkt_capture_send_config + (struct wlan_objmgr_vdev *vdev, + enum pkt_capture_trigger_qos_config config) +{ + return QDF_STATUS_SUCCESS; +} + static inline QDF_STATUS ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev) diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c index d66b8a6560f6..0d069cd0cccd 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c @@ -126,9 +126,10 @@ tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, return status; } +#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 QDF_STATUS tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, - enum pkt_capture_config config) + enum pkt_capture_trigger_qos_config config) { QDF_STATUS status = QDF_STATUS_E_FAILURE; struct pkt_capture_vdev_priv *vdev_priv; @@ -160,7 +161,6 @@ tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, return status; } -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 QDF_STATUS tgt_pkt_capture_smu_event(struct wlan_objmgr_psoc *psoc, struct smu_event_params *param) diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 0c9523efab77..626ef47572a4 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -86,31 +86,6 @@ ucfg_pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc) return pkt_capture_get_pktcap_mode(psoc); } -/** - * ucfg_pkt_capture_set_pktcap_config - Set packet capture config - * @psoc: pointer to psoc object - * @config: config to be set - * - * Return: None - */ -void ucfg_pkt_capture_set_pktcap_config(struct wlan_objmgr_psoc *psoc, - enum pkt_capture_config config) -{ - pkt_capture_set_pktcap_config(psoc, config); -} - -/** - * ucfg_pkt_capture_get_pktcap_config - Get packet capture config - * @psoc: pointer to psoc object - * - * Return: config value - */ -enum pkt_capture_config -ucfg_pkt_capture_get_pktcap_config(struct wlan_objmgr_psoc *psoc) -{ - return pkt_capture_get_pktcap_config(psoc); -} - /** * ucfg_pkt_capture_init() - Packet capture component initialization. * @@ -340,3 +315,12 @@ ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, { return pkt_capture_set_filter(frame_filter, vdev); } + +#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 +QDF_STATUS ucfg_pkt_capture_send_config + (struct wlan_objmgr_vdev *vdev, + enum pkt_capture_trigger_qos_config config) +{ + return tgt_pkt_capture_send_config(vdev, config); +} +#endif diff --git a/components/target_if/pkt_capture/src/target_if_pkt_capture.c b/components/target_if/pkt_capture/src/target_if_pkt_capture.c index e2dd60e1760e..4361c157fa90 100644 --- a/components/target_if/pkt_capture/src/target_if_pkt_capture.c +++ b/components/target_if/pkt_capture/src/target_if_pkt_capture.c @@ -79,7 +79,7 @@ static QDF_STATUS target_if_set_packet_capture_config (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - enum pkt_capture_config config_value) + enum pkt_capture_trigger_qos_config config_value) { wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc); QDF_STATUS status = QDF_STATUS_E_FAILURE; @@ -98,9 +98,7 @@ target_if_set_packet_capture_config param.param_value = (uint32_t)config_value; status = wmi_unified_vdev_set_param_send(wmi_handle, ¶m); - if (QDF_IS_STATUS_SUCCESS(status)) - ucfg_pkt_capture_set_pktcap_config(psoc, config_value); - else + if (QDF_IS_STATUS_ERROR(status)) pkt_capture_err("failed to set packet capture config"); return status; @@ -110,7 +108,7 @@ static QDF_STATUS target_if_set_packet_capture_config (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - enum pkt_capture_config config_value) + enum pkt_capture_trigger_qos_config config_value) { return QDF_STATUS_SUCCESS; } From eb3e4dd93d41b7d16f03424c13d317d23094e89b Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:19:42 +0530 Subject: [PATCH 31/60] Revert "qcacld-3.0: Add support to send mode to FW based on frame filter" This reverts commit 3b939c6932beafe505308fd29bc15bfe3985f9c4. Change-Id: I1f6fce4f147c69d3463570757e11a28787586141 --- .../core/src/wlan_pkt_capture_main.c | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index cdb7e6fba41e..cea00cb01592 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -983,9 +983,6 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, { struct pkt_psoc_priv *psoc_priv; struct wlan_objmgr_psoc *psoc; - enum pkt_capture_mode mode = PACKET_CAPTURE_MODE_DISABLE; - struct dp_soc *soc; - QDF_STATUS status; if (!vdev) { pkt_capture_err("vdev is NULL"); @@ -1034,23 +1031,5 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, psoc_priv->frame_filter.connected_beacon_interval = frame_filter.connected_beacon_interval; - if (psoc_priv->frame_filter.mgmt_tx_frame_filter || - psoc_priv->frame_filter.mgmt_rx_frame_filter) - mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; - - if (psoc_priv->frame_filter.data_tx_frame_filter || - psoc_priv->frame_filter.data_rx_frame_filter) - mode |= PACKET_CAPTURE_MODE_DATA_ONLY; - - if (mode != pkt_capture_get_pktcap_mode(psoc)) { - status = tgt_pkt_capture_send_mode(vdev, mode); - if (QDF_IS_STATUS_ERROR(status)) { - pkt_capture_err("Unable to send packet capture mode"); - return status; - } - soc = wlan_psoc_get_dp_handle(psoc); - soc->wlan_cfg_ctx->pkt_capture_mode = mode; - } - return QDF_STATUS_SUCCESS; } From 310e7dd4f4d5cbcfa0d40ffb5b47deae03f49ea0 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:20:29 +0530 Subject: [PATCH 32/60] Revert "qcacld-3.0: vendor command changes to configure parameters for monitor mode" This reverts commit 82fba8d12f4747050858966e6af0ae0179d0c8f9. Change-Id: Iab73fd3a7470348400a40dd0f95d8cccd47fb633 --- core/hdd/src/wlan_hdd_cfg80211.c | 228 ------------------------------- 1 file changed, 228 deletions(-) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 6894bc0e2781..1708dce78f73 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -163,8 +163,6 @@ #include "wlan_if_mgr_public_struct.h" #include "wlan_wfa_ucfg_api.h" #include "wlan_roam_debug.h" -#include "wlan_pkt_capture_ucfg_api.h" - #define g_mode_rates_size (12) #define a_mode_rates_size (8) @@ -14988,36 +14986,6 @@ get_usable_channel_policy[QCA_WLAN_VENDOR_ATTR_USABLE_CHANNELS_MAX + 1] = { }, }; -#ifdef WLAN_FEATURE_PKT_CAPTURE -static const struct nla_policy -set_monitor_mode_policy[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX + 1] = { - [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_INVALID] = { - .type = NLA_U32 - }, - [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE] = { - .type = NLA_U32 - }, - [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE] = { - .type = NLA_U32 - }, - [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE] = { - .type = NLA_U32 - }, - [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE] = { - .type = NLA_U32 - }, - [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE] = { - .type = NLA_U32 - }, - [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE] = { - .type = NLA_U32 - }, - [QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL] = { - .type = NLA_U32 - }, -}; -#endif - #ifdef WLAN_FEATURE_GET_USABLE_CHAN_LIST static enum nl80211_chan_width hdd_convert_phy_bw_to_nl_bw(enum phy_ch_width bw) @@ -15463,189 +15431,6 @@ static int wlan_hdd_cfg80211_get_usable_channel(struct wiphy *wiphy, } #endif -#ifdef WLAN_FEATURE_PKT_CAPTURE -/** - * hdd_monitor_mode_configure - Process monitor mode configuration - * operation in the received vendor command - * @adapter: adapter pointer - * @tb: nl attributes - * - * Handles QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE - * - * Return: 0 for Success and negative value for failure - */ -static int hdd_monitor_mode_configure(struct hdd_adapter *adapter, - struct nlattr **tb) -{ - struct pkt_capture_frame_filter frame_filter = {0}; - struct wlan_objmgr_vdev *vdev; - - QDF_STATUS status; - - hdd_enter(); - - vdev = hdd_objmgr_get_vdev(adapter); - - if (!vdev) - return QDF_STATUS_E_FAILURE; - - if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_INVALID]) - return QDF_STATUS_E_FAILURE; - - if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE] && - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE]) < - PACKET_CAPTURE_DATA_MAX_FILTER) { - frame_filter.data_tx_frame_filter = - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE]); - frame_filter.vendor_attr_to_set = - BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE); - } - - if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE] && - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE]) < - PACKET_CAPTURE_DATA_MAX_FILTER) { - frame_filter.data_rx_frame_filter = - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE]); - frame_filter.vendor_attr_to_set |= - BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE); - } - - if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE] && - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE]) < - PACKET_CAPTURE_MGMT_MAX_FILTER) { - frame_filter.mgmt_tx_frame_filter = - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE]); - frame_filter.vendor_attr_to_set |= - BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE); - } - - if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE] && - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE]) < - PACKET_CAPTURE_MGMT_MAX_FILTER) { - frame_filter.mgmt_rx_frame_filter = - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE]); - frame_filter.vendor_attr_to_set |= - BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE); - } - - if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE] && - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE]) < - PACKET_CAPTURE_CTRL_MAX_FILTER) { - frame_filter.ctrl_tx_frame_filter = - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE]); - frame_filter.vendor_attr_to_set |= - BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE); - } - - if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE] && - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE]) < - PACKET_CAPTURE_CTRL_MAX_FILTER) { - frame_filter.ctrl_rx_frame_filter = - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE]); - frame_filter.vendor_attr_to_set |= - BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE); - } - - if (tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL]) { - frame_filter.connected_beacon_interval = - nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL]); - frame_filter.vendor_attr_to_set |= - BIT(QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL); - } - - hdd_debug("Monitor mode config %s data tx %d data rx %d mgmt tx %d mgmt rx %d ctrl tx %d ctrl rx %d beacon interval %d\n", - __func__, frame_filter.data_tx_frame_filter, - frame_filter.data_rx_frame_filter, frame_filter.mgmt_tx_frame_filter, - frame_filter.mgmt_rx_frame_filter, frame_filter.ctrl_tx_frame_filter, - frame_filter.ctrl_rx_frame_filter, frame_filter.connected_beacon_interval); - - status = ucfg_pkt_capture_set_filter(frame_filter, vdev); - hdd_objmgr_put_vdev(vdev); - - hdd_exit(); - - return status; -} - -/** - * __wlan_hdd_cfg80211_set_monitor_mode() - Wifi monitor mode configuration - * vendor command - * @wiphy: wiphy device pointer - * @wdev: wireless device pointer - * @data: Vendor command data buffer - * @data_len: Buffer length - * - * Handles . - * - * Return: 0 for Success and negative value for failure - */ -static int -__wlan_hdd_cfg80211_set_monitor_mode(struct wiphy *wiphy, - struct wireless_dev *wdev, - const void *data, int data_len) -{ - struct net_device *dev = wdev->netdev; - struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev); - struct hdd_context *hdd_ctx = wiphy_priv(wiphy); - struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX + 1]; - int errno; - - if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) { - hdd_err("Command not allowed in FTM mode"); - return -EPERM; - } - - errno = wlan_hdd_validate_context(hdd_ctx); - if (errno) - return errno; - - if (!ucfg_pkt_capture_get_mode(hdd_ctx->psoc)) - return QDF_STATUS_E_FAILURE; - - errno = hdd_validate_adapter(adapter); - if (errno) - return errno; - - if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX, - data, data_len, set_monitor_mode_policy)) { - hdd_err("invalid monitor attr"); - return -EINVAL; - } - - errno = hdd_monitor_mode_configure(adapter, tb); - - return errno; -} - -/** - * wlan_hdd_cfg80211_set_monitor_mode() - set monitor mode - * @wiphy: wiphy pointer - * @wdev: pointer to struct wireless_dev - * @data: pointer to incoming NL vendor data - * @data_len: length of @data - * - * Return: 0 on success; error number otherwise. - */ -static int wlan_hdd_cfg80211_set_monitor_mode(struct wiphy *wiphy, - struct wireless_dev *wdev, - const void *data, int data_len) -{ - int errno; - struct osif_vdev_sync *vdev_sync; - - errno = osif_vdev_sync_op_start(wdev->netdev, &vdev_sync); - if (errno) - return errno; - - errno = __wlan_hdd_cfg80211_set_monitor_mode(wiphy, wdev, - data, data_len); - - osif_vdev_sync_op_stop(vdev_sync); - - return errno; -} -#endif - /** * wlan_hdd_cfg80211_get_chain_rssi() - get chain rssi * @wiphy: wiphy pointer @@ -16520,19 +16305,6 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = { FEATURE_THERMAL_VENDOR_COMMANDS FEATURE_BTC_CHAIN_MODE_COMMANDS FEATURE_WMM_COMMANDS - -#ifdef WLAN_FEATURE_PKT_CAPTURE - { - .info.vendor_id = QCA_NL80211_VENDOR_ID, - .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE, - .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_set_monitor_mode, - vendor_command_policy(set_monitor_mode_policy, - QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX) - }, -#endif }; struct hdd_context *hdd_cfg80211_wiphy_alloc(void) From 81116a7a92daf76d88b85c7237588868adad3931 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 12 Nov 2021 11:21:14 +0530 Subject: [PATCH 33/60] Revert "qcacld-3.0: Set frame filter based on vendor command" This reverts commit d82f8b8f821d2e56c450b6f4584745fef9b8446e. Change-Id: I293c9853acb6e5169ce6ac6c3bfe143ed12e79c8 --- .../core/inc/wlan_pkt_capture_main.h | 10 -- .../core/inc/wlan_pkt_capture_priv.h | 2 - .../core/src/wlan_pkt_capture_main.c | 56 -------- .../inc/wlan_pkt_capture_public_structs.h | 124 ------------------ .../inc/wlan_pkt_capture_ucfg_api.h | 19 --- .../src/wlan_pkt_capture_ucfg_api.c | 7 - 6 files changed, 218 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index 9561217bc6ab..b6b328338247 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -201,16 +201,6 @@ void pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev); void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu, struct wlan_objmgr_vdev *vdev, uint16_t ch_freq); -/** - * pkt_capture_set_filter - Set packet capture frame filter - * @frame_filter: pkt capture frame filter data - * @vdev: pointer to vdev - * - * Return: QDF_STATUS - */ -QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, - struct wlan_objmgr_vdev *vdev); - #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * pkt_capture_get_pktcap_mode_v2 - Get packet capture mode diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h index 080f7340481c..26e3bd4c4031 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h @@ -80,12 +80,10 @@ struct pkt_capture_vdev_priv { * @psoc: pointer to psoc object * @cfg_param: INI config params for packet capture * @cb_obj: struct contaning callback pointers - * @frame_filter: struct contaning packet capture filter */ struct pkt_psoc_priv { struct wlan_objmgr_psoc *psoc; struct pkt_capture_cfg cfg_param; struct pkt_capture_callbacks cb_obj; - struct pkt_capture_frame_filter frame_filter; }; #endif /* End of _WLAN_PKT_CAPTURE_PRIV_STRUCT_H_ */ diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index cea00cb01592..3e2703e2043d 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -977,59 +977,3 @@ void pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev) cdp_txrx_set_pdev_param(soc, wlan_objmgr_pdev_get_pdev_id(pdev), CDP_MONITOR_FREQUENCY, val); } - -QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, - struct wlan_objmgr_vdev *vdev) -{ - struct pkt_psoc_priv *psoc_priv; - struct wlan_objmgr_psoc *psoc; - - if (!vdev) { - pkt_capture_err("vdev is NULL"); - return QDF_STATUS_E_FAILURE; - } - - psoc = wlan_vdev_get_psoc(vdev); - psoc_priv = pkt_capture_psoc_get_priv(psoc); - if (!psoc_priv) { - pkt_capture_err("psoc_priv is NULL"); - return QDF_STATUS_E_FAILURE; - } - - if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE)) - psoc_priv->frame_filter.data_tx_frame_filter = - frame_filter.data_tx_frame_filter; - - if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE)) - psoc_priv->frame_filter.data_rx_frame_filter = - frame_filter.data_rx_frame_filter; - - if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE)) - psoc_priv->frame_filter.mgmt_tx_frame_filter = - frame_filter.mgmt_tx_frame_filter; - - if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE)) - psoc_priv->frame_filter.mgmt_rx_frame_filter = - frame_filter.mgmt_rx_frame_filter; - - if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE)) - psoc_priv->frame_filter.ctrl_tx_frame_filter = - frame_filter.ctrl_tx_frame_filter; - - if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE)) - psoc_priv->frame_filter.ctrl_rx_frame_filter = - frame_filter.ctrl_rx_frame_filter; - - if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL)) - psoc_priv->frame_filter.connected_beacon_interval = - frame_filter.connected_beacon_interval; - - return QDF_STATUS_SUCCESS; -} diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index acc1656b7877..4fdad87bd43f 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -19,10 +19,6 @@ #ifndef _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ #define _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ -#define PACKET_CAPTURE_DATA_MAX_FILTER BIT(18) -#define PACKET_CAPTURE_MGMT_MAX_FILTER BIT(5) -#define PACKET_CAPTURE_CTRL_MAX_FILTER BIT(3) - /** * enum pkt_capture_mode - packet capture modes * @PACKET_CAPTURE_MODE_DISABLE: packet capture mode disable @@ -128,124 +124,4 @@ struct wlan_pkt_capture_rx_ops { (struct wlan_objmgr_psoc *psoc); }; -/** - * pkt_capture_data_frame_type - Represent the various - * data types to be filtered in packet capture. - */ -enum pkt_capture_data_frame_type { - PKT_CAPTURE_DATA_FRAME_TYPE_ALL = BIT(0), - /* valid only if PKT_CAPTURE_DATA_DATA_FRAME_TYPE_ALL is not set */ - PKT_CAPTURE_DATA_FRAME_TYPE_ARP = BIT(1), - PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV4 = BIT(2), - PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV6 = BIT(3), - PKT_CAPTURE_DATA_FRAME_TYPE_EAPOL = BIT(4), - PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4 = BIT(5), - PKT_CAPTURE_DATA_FRAME_TYPE_DNSV6 = BIT(6), - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYN = BIT(7), - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYNACK = BIT(8), - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FIN = BIT(9), - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FINACK = BIT(10), - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_ACK = BIT(11), - PKT_CAPTURE_DATA_FRAME_TYPE_TCP_RST = BIT(12), - PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV4 = BIT(13), - PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV6 = BIT(14), - PKT_CAPTURE_DATA_FRAME_TYPE_RTP = BIT(15), - PKT_CAPTURE_DATA_FRAME_TYPE_SIP = BIT(16), - PKT_CAPTURE_DATA_FRAME_QOS_NULL = BIT(17), -}; - -/** - * pkt_capture_mgmt_frame_type - Represent the various - * mgmt types to be sent over the monitor interface. - * @PKT_CAPTURE_MGMT_FRAME_TYPE_ALL: All the MGMT Frames. - * @PKT_CAPTURE_MGMT_CONNECT_NO_BEACON: All the MGMT Frames - * except the Beacons. Valid only in the Connect state. - * @PKT_CAPTURE_MGMT_CONNECT_BEACON: Only the connected - * BSSID Beacons. Valid only in the Connect state. - * @PKT_CAPTURE_MONITOR_MGMT_CONNECT_SCAN_BEACON: Represents - * the Beacons obtained during the scan (off channel and connected channel) - * when in connected state. - */ - -enum pkt_capture_mgmt_frame_type { - PKT_CAPTURE_MGMT_FRAME_TYPE_ALL = BIT(0), - /* valid only if PKT_CAPTURE_MGMT_FRAME_TYPE_ALL is not set */ - PKT_CAPTURE_MGMT_CONNECT_NO_BEACON = BIT(1), - PKT_CAPTURE_MGMT_CONNECT_BEACON = BIT(2), - PKT_CAPTURE_MGMT_CONNECT_SCAN_BEACON = BIT(3), -}; - -/** - * pkt_capture_ctrl_frame_type - Represent the various - * ctrl types to be sent over the monitor interface. - * @PKT_CAPTURE_CTRL_FRAME_TYPE_ALL: All the ctrl Frames. - * @PKT_CAPTURE_CTRL_TRIGGER_FRAME: Trigger Frame. - */ -enum pkt_capture_ctrl_frame_type { - PKT_CAPTURE_CTRL_FRAME_TYPE_ALL = BIT(0), - /* valid only if PKT_CAPTURE_CTRL_FRAME_TYPE_ALL is not set */ - PKT_CAPTURE_CTRL_TRIGGER_FRAME = BIT(1), -}; - -/** - * enum pkt_capture_attr_set_monitor_mode - Used by the - * vendor command QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE to set the - * monitor mode. - * - * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE: u32 attribute, - * Represents the tx data packet type to be monitored (u32). These data packets - * are represented by enum pkt_capture_data_frame_type. - * - * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE: u32 attribute, - * Represents the tx data packet type to be monitored (u32). These data packets - * are represented by enum pkt_capture_data_frame_type. - * - * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE: u32 attribute, - * Represents the tx data packet type to be monitored (u32). These mgmt packets - * are represented by enum pkt_capture_mgmt_frame_type. - * - * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE: u32 attribute, - * Represents the tx data packet type to be monitored (u32). These mgmt packets - * are represented by enum pkt_capture_mgmt_frame_type. - * - * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE: u32 attribute, - * Represents the tx data packet type to be monitored (u32). These ctrl packets - * are represented by enum pkt_capture_ctrl_frame_type. - * - * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE: u32 attribute, - * Represents the tx data packet type to be monitored (u32). These ctrl packets - * are represented by enum pkt_capture_ctrl_frame_type. - * - * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL: u32 attribute, - * An interval only for the connected beacon interval, which expects that the - * connected BSSID's beacons shall be sent on the monitor interface only on this - * specific interval. - */ -enum pkt_capture_attr_set_monitor_mode { - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_INVALID = 0, - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE = 1, - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE = 2, - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE = 3, - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE = 4, - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE = 5, - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE = 6, - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL = 7, - - /* keep last */ - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_AFTER_LAST, - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MAX = - PKT_CAPTURE_ATTR_SET_MONITOR_MODE_AFTER_LAST - 1, - -}; - -struct pkt_capture_frame_filter { - enum pkt_capture_data_frame_type data_tx_frame_filter; - enum pkt_capture_data_frame_type data_rx_frame_filter; - enum pkt_capture_mgmt_frame_type mgmt_tx_frame_filter; - enum pkt_capture_mgmt_frame_type mgmt_rx_frame_filter; - enum pkt_capture_ctrl_frame_type ctrl_tx_frame_filter; - enum pkt_capture_ctrl_frame_type ctrl_rx_frame_filter; - uint32_t connected_beacon_interval; - uint8_t vendor_attr_to_set; -}; #endif /* _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ */ diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h index 768b3ac00fad..10147b580332 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h @@ -267,17 +267,6 @@ int ucfg_pkt_capture_register_wma_callbacks(struct wlan_objmgr_psoc *psoc, struct pkt_capture_callbacks *cb_obj); -/** - * ucfg_pkt_capture_set_filter ucfg API to set frame filter - * @frame_filter: pkt capture frame filter data - * @vdev: pointer to vdev - * - * Return: QDF_STATUS - */ -QDF_STATUS -ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, - struct wlan_objmgr_vdev *vdev); - #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * ucfg_pkt_capture_send_config - send packet capture config @@ -436,13 +425,5 @@ QDF_STATUS ucfg_pkt_capture_send_config { return QDF_STATUS_SUCCESS; } - -static inline QDF_STATUS -ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, - struct wlan_objmgr_vdev *vdev) -{ - return QDF_STATUS_SUCCESS; -} - #endif /* WLAN_FEATURE_PKT_CAPTURE */ #endif /* _WLAN_PKT_CAPTURE_UCFG_API_H_ */ diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 626ef47572a4..97179fceeaa0 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -309,13 +309,6 @@ ucfg_pkt_capture_register_wma_callbacks(struct wlan_objmgr_psoc *psoc, return 0; } -QDF_STATUS -ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, - struct wlan_objmgr_vdev *vdev) -{ - return pkt_capture_set_filter(frame_filter, vdev); -} - #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 QDF_STATUS ucfg_pkt_capture_send_config (struct wlan_objmgr_vdev *vdev, From b0ef669a4dc6d2d639fe173400b7e362c6418d91 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 27 Aug 2021 15:06:05 +0530 Subject: [PATCH 34/60] qcacld-3.0: Set frame filter based on vendor command Currently, packet capture mode frame filter configuration is done based on ini. This change enables user to set the packet capture mode frame filter configuration at runtime through vendor command QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE. Change-Id: I555d717132037c6dfdcff12e655b7dd584da4edd --- .../core/inc/wlan_pkt_capture_main.h | 10 ++ .../core/inc/wlan_pkt_capture_priv.h | 2 + .../core/src/wlan_pkt_capture_main.c | 54 ++++++++ .../inc/wlan_pkt_capture_public_structs.h | 124 ++++++++++++++++++ .../inc/wlan_pkt_capture_ucfg_api.h | 19 +++ .../src/wlan_pkt_capture_ucfg_api.c | 7 + 6 files changed, 216 insertions(+) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index b6b328338247..9561217bc6ab 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -201,6 +201,16 @@ void pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev); void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu, struct wlan_objmgr_vdev *vdev, uint16_t ch_freq); +/** + * pkt_capture_set_filter - Set packet capture frame filter + * @frame_filter: pkt capture frame filter data + * @vdev: pointer to vdev + * + * Return: QDF_STATUS + */ +QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev); + #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * pkt_capture_get_pktcap_mode_v2 - Get packet capture mode diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h index 26e3bd4c4031..8f375535b464 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h @@ -58,6 +58,7 @@ struct pkt_capture_cb_context { * @cb_ctx: pointer to packet capture mon callback context * @rx_ops: rx ops * @tx_ops: tx ops + * @frame_filter: config filter set by vendor command * @rx_avg_rssi: avg rssi of rx data packets * @ppdu_stats_q: list used for storing smu related ppdu stats * @lock_q: spinlock for ppdu_stats q @@ -69,6 +70,7 @@ struct pkt_capture_vdev_priv { struct pkt_capture_cb_context *cb_ctx; struct wlan_pkt_capture_rx_ops rx_ops; struct wlan_pkt_capture_tx_ops tx_ops; + struct pkt_capture_frame_filter frame_filter; int32_t rx_avg_rssi; qdf_list_t ppdu_stats_q; qdf_spinlock_t lock_q; diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 3e2703e2043d..c896686c9056 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -977,3 +977,57 @@ void pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev) cdp_txrx_set_pdev_param(soc, wlan_objmgr_pdev_get_pdev_id(pdev), CDP_MONITOR_FREQUENCY, val); } + +QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev) +{ + struct pkt_capture_vdev_priv *vdev_priv; + + if (!vdev) { + pkt_capture_err("vdev is NULL"); + return QDF_STATUS_E_FAILURE; + } + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) { + pkt_capture_err("vdev_priv is NULL"); + return QDF_STATUS_E_FAILURE; + } + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE)) + vdev_priv->frame_filter.data_tx_frame_filter = + frame_filter.data_tx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE)) + vdev_priv->frame_filter.data_rx_frame_filter = + frame_filter.data_rx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE)) + vdev_priv->frame_filter.mgmt_tx_frame_filter = + frame_filter.mgmt_tx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE)) + vdev_priv->frame_filter.mgmt_rx_frame_filter = + frame_filter.mgmt_rx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE)) + vdev_priv->frame_filter.ctrl_tx_frame_filter = + frame_filter.ctrl_tx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE)) + vdev_priv->frame_filter.ctrl_rx_frame_filter = + frame_filter.ctrl_rx_frame_filter; + + if (frame_filter.vendor_attr_to_set & + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL)) + vdev_priv->frame_filter.connected_beacon_interval = + frame_filter.connected_beacon_interval; + + return QDF_STATUS_SUCCESS; +} diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index 4fdad87bd43f..acc1656b7877 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -19,6 +19,10 @@ #ifndef _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ #define _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ +#define PACKET_CAPTURE_DATA_MAX_FILTER BIT(18) +#define PACKET_CAPTURE_MGMT_MAX_FILTER BIT(5) +#define PACKET_CAPTURE_CTRL_MAX_FILTER BIT(3) + /** * enum pkt_capture_mode - packet capture modes * @PACKET_CAPTURE_MODE_DISABLE: packet capture mode disable @@ -124,4 +128,124 @@ struct wlan_pkt_capture_rx_ops { (struct wlan_objmgr_psoc *psoc); }; +/** + * pkt_capture_data_frame_type - Represent the various + * data types to be filtered in packet capture. + */ +enum pkt_capture_data_frame_type { + PKT_CAPTURE_DATA_FRAME_TYPE_ALL = BIT(0), + /* valid only if PKT_CAPTURE_DATA_DATA_FRAME_TYPE_ALL is not set */ + PKT_CAPTURE_DATA_FRAME_TYPE_ARP = BIT(1), + PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV4 = BIT(2), + PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV6 = BIT(3), + PKT_CAPTURE_DATA_FRAME_TYPE_EAPOL = BIT(4), + PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4 = BIT(5), + PKT_CAPTURE_DATA_FRAME_TYPE_DNSV6 = BIT(6), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYN = BIT(7), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYNACK = BIT(8), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FIN = BIT(9), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FINACK = BIT(10), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_ACK = BIT(11), + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_RST = BIT(12), + PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV4 = BIT(13), + PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV6 = BIT(14), + PKT_CAPTURE_DATA_FRAME_TYPE_RTP = BIT(15), + PKT_CAPTURE_DATA_FRAME_TYPE_SIP = BIT(16), + PKT_CAPTURE_DATA_FRAME_QOS_NULL = BIT(17), +}; + +/** + * pkt_capture_mgmt_frame_type - Represent the various + * mgmt types to be sent over the monitor interface. + * @PKT_CAPTURE_MGMT_FRAME_TYPE_ALL: All the MGMT Frames. + * @PKT_CAPTURE_MGMT_CONNECT_NO_BEACON: All the MGMT Frames + * except the Beacons. Valid only in the Connect state. + * @PKT_CAPTURE_MGMT_CONNECT_BEACON: Only the connected + * BSSID Beacons. Valid only in the Connect state. + * @PKT_CAPTURE_MONITOR_MGMT_CONNECT_SCAN_BEACON: Represents + * the Beacons obtained during the scan (off channel and connected channel) + * when in connected state. + */ + +enum pkt_capture_mgmt_frame_type { + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL = BIT(0), + /* valid only if PKT_CAPTURE_MGMT_FRAME_TYPE_ALL is not set */ + PKT_CAPTURE_MGMT_CONNECT_NO_BEACON = BIT(1), + PKT_CAPTURE_MGMT_CONNECT_BEACON = BIT(2), + PKT_CAPTURE_MGMT_CONNECT_SCAN_BEACON = BIT(3), +}; + +/** + * pkt_capture_ctrl_frame_type - Represent the various + * ctrl types to be sent over the monitor interface. + * @PKT_CAPTURE_CTRL_FRAME_TYPE_ALL: All the ctrl Frames. + * @PKT_CAPTURE_CTRL_TRIGGER_FRAME: Trigger Frame. + */ +enum pkt_capture_ctrl_frame_type { + PKT_CAPTURE_CTRL_FRAME_TYPE_ALL = BIT(0), + /* valid only if PKT_CAPTURE_CTRL_FRAME_TYPE_ALL is not set */ + PKT_CAPTURE_CTRL_TRIGGER_FRAME = BIT(1), +}; + +/** + * enum pkt_capture_attr_set_monitor_mode - Used by the + * vendor command QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE to set the + * monitor mode. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These data packets + * are represented by enum pkt_capture_data_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These data packets + * are represented by enum pkt_capture_data_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These mgmt packets + * are represented by enum pkt_capture_mgmt_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These mgmt packets + * are represented by enum pkt_capture_mgmt_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These ctrl packets + * are represented by enum pkt_capture_ctrl_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE: u32 attribute, + * Represents the tx data packet type to be monitored (u32). These ctrl packets + * are represented by enum pkt_capture_ctrl_frame_type. + * + * @PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL: u32 attribute, + * An interval only for the connected beacon interval, which expects that the + * connected BSSID's beacons shall be sent on the monitor interface only on this + * specific interval. + */ +enum pkt_capture_attr_set_monitor_mode { + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_INVALID = 0, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE = 1, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE = 2, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE = 3, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE = 4, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE = 5, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE = 6, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL = 7, + + /* keep last */ + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_AFTER_LAST, + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_MAX = + PKT_CAPTURE_ATTR_SET_MONITOR_MODE_AFTER_LAST - 1, + +}; + +struct pkt_capture_frame_filter { + enum pkt_capture_data_frame_type data_tx_frame_filter; + enum pkt_capture_data_frame_type data_rx_frame_filter; + enum pkt_capture_mgmt_frame_type mgmt_tx_frame_filter; + enum pkt_capture_mgmt_frame_type mgmt_rx_frame_filter; + enum pkt_capture_ctrl_frame_type ctrl_tx_frame_filter; + enum pkt_capture_ctrl_frame_type ctrl_rx_frame_filter; + uint32_t connected_beacon_interval; + uint8_t vendor_attr_to_set; +}; #endif /* _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ */ diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h index 10147b580332..768b3ac00fad 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h @@ -267,6 +267,17 @@ int ucfg_pkt_capture_register_wma_callbacks(struct wlan_objmgr_psoc *psoc, struct pkt_capture_callbacks *cb_obj); +/** + * ucfg_pkt_capture_set_filter ucfg API to set frame filter + * @frame_filter: pkt capture frame filter data + * @vdev: pointer to vdev + * + * Return: QDF_STATUS + */ +QDF_STATUS +ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev); + #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * ucfg_pkt_capture_send_config - send packet capture config @@ -425,5 +436,13 @@ QDF_STATUS ucfg_pkt_capture_send_config { return QDF_STATUS_SUCCESS; } + +static inline QDF_STATUS +ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev) +{ + return QDF_STATUS_SUCCESS; +} + #endif /* WLAN_FEATURE_PKT_CAPTURE */ #endif /* _WLAN_PKT_CAPTURE_UCFG_API_H_ */ diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 97179fceeaa0..626ef47572a4 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -309,6 +309,13 @@ ucfg_pkt_capture_register_wma_callbacks(struct wlan_objmgr_psoc *psoc, return 0; } +QDF_STATUS +ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, + struct wlan_objmgr_vdev *vdev) +{ + return pkt_capture_set_filter(frame_filter, vdev); +} + #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 QDF_STATUS ucfg_pkt_capture_send_config (struct wlan_objmgr_vdev *vdev, From f5068d74fba0ea77c46b3581ec25dca0cc67c668 Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Mon, 4 Oct 2021 20:08:35 +0530 Subject: [PATCH 35/60] qcacld-3.0: vendor command changes to configure parameters for monitor mode Add the support to the vendor command QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE which aims to configure the monitor mode parameters for the specific interface. Once enabled, the configured frames ( TX and RX ) are sent over the active coexisting monitor interface. Change-Id: If28b098117a9fbf932d2c5ebf379908c3c4cda12 --- core/hdd/src/wlan_hdd_cfg80211.c | 261 +++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 1708dce78f73..e16d9c9d2c5b 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -163,6 +163,8 @@ #include "wlan_if_mgr_public_struct.h" #include "wlan_wfa_ucfg_api.h" #include "wlan_roam_debug.h" +#include "wlan_pkt_capture_ucfg_api.h" + #define g_mode_rates_size (12) #define a_mode_rates_size (8) @@ -14986,6 +14988,58 @@ get_usable_channel_policy[QCA_WLAN_VENDOR_ATTR_USABLE_CHANNELS_MAX + 1] = { }, }; +#ifdef WLAN_FEATURE_PKT_CAPTURE + +/* Short name for QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE command */ + +#define SET_MONITOR_MODE_CONFIG_MAX \ + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX +#define SET_MONITOR_MODE_INVALID \ + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_INVALID +#define SET_MONITOR_MODE_DATA_TX_FRAME_TYPE \ + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE +#define SET_MONITOR_MODE_DATA_RX_FRAME_TYPE \ + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_DATA_RX_FRAME_TYPE +#define SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE \ + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE +#define SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE \ + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE +#define SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE \ + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE +#define SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE \ + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE +#define SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL \ + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL + +static const struct nla_policy +set_monitor_mode_policy[SET_MONITOR_MODE_CONFIG_MAX + 1] = { + [SET_MONITOR_MODE_INVALID] = { + .type = NLA_U32 + }, + [SET_MONITOR_MODE_DATA_TX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [SET_MONITOR_MODE_DATA_RX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE] = { + .type = NLA_U32 + }, + [SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL] = { + .type = NLA_U32 + }, +}; +#endif + #ifdef WLAN_FEATURE_GET_USABLE_CHAN_LIST static enum nl80211_chan_width hdd_convert_phy_bw_to_nl_bw(enum phy_ch_width bw) @@ -15431,6 +15485,200 @@ static int wlan_hdd_cfg80211_get_usable_channel(struct wiphy *wiphy, } #endif +#ifdef WLAN_FEATURE_PKT_CAPTURE + +/** + * hdd_monitor_mode_configure - Process monitor mode configuration + * operation in the received vendor command + * @adapter: adapter pointer + * @tb: nl attributes + * + * Handles QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE + * + * Return: 0 for Success and negative value for failure + */ +static int hdd_monitor_mode_configure(struct hdd_adapter *adapter, + struct nlattr **tb) +{ + struct pkt_capture_frame_filter frame_filter = {0}; + struct wlan_objmgr_vdev *vdev; + + QDF_STATUS status; + + hdd_enter_dev(adapter->dev); + + vdev = hdd_objmgr_get_vdev(adapter);; + if (!vdev) + return QDF_STATUS_E_INVAL; + + if (tb[SET_MONITOR_MODE_INVALID]) + return QDF_STATUS_E_FAILURE; + + if (tb[SET_MONITOR_MODE_DATA_TX_FRAME_TYPE] && + nla_get_u32(tb[SET_MONITOR_MODE_DATA_TX_FRAME_TYPE]) < + PACKET_CAPTURE_DATA_MAX_FILTER) { + frame_filter.data_tx_frame_filter = + nla_get_u32(tb[SET_MONITOR_MODE_DATA_TX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set = + BIT(SET_MONITOR_MODE_DATA_TX_FRAME_TYPE); + } + + if (tb[SET_MONITOR_MODE_DATA_RX_FRAME_TYPE] && + nla_get_u32(tb[SET_MONITOR_MODE_DATA_RX_FRAME_TYPE]) < + PACKET_CAPTURE_DATA_MAX_FILTER) { + frame_filter.data_rx_frame_filter = + nla_get_u32(tb[SET_MONITOR_MODE_DATA_RX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(SET_MONITOR_MODE_DATA_RX_FRAME_TYPE); + } + + if (tb[SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE] && + nla_get_u32(tb[SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE]) < + PACKET_CAPTURE_MGMT_MAX_FILTER) { + frame_filter.mgmt_tx_frame_filter = + nla_get_u32(tb[SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE); + } + + if (tb[SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE] && + nla_get_u32(tb[SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE]) < + PACKET_CAPTURE_MGMT_MAX_FILTER) { + frame_filter.mgmt_rx_frame_filter = + nla_get_u32(tb[SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE); + } + + if (tb[SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE] && + nla_get_u32(tb[SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE]) < + PACKET_CAPTURE_CTRL_MAX_FILTER) { + frame_filter.ctrl_tx_frame_filter = + nla_get_u32(tb[SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE); + } + + if (tb[SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE] && + nla_get_u32(tb[SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE]) < + PACKET_CAPTURE_CTRL_MAX_FILTER) { + frame_filter.ctrl_rx_frame_filter = + nla_get_u32(tb[SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE]); + frame_filter.vendor_attr_to_set |= + BIT(SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE); + } + + if (tb[SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL]) { + frame_filter.connected_beacon_interval = + nla_get_u32(tb[SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL]); + frame_filter.vendor_attr_to_set |= + BIT(SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL); + } + + hdd_debug("Monitor mode config %s data tx %d data rx %d mgmt tx %d mgmt rx %d ctrl tx %d ctrl rx %d beacon interval %d\n", + __func__, frame_filter.data_tx_frame_filter, + frame_filter.data_rx_frame_filter, frame_filter.mgmt_tx_frame_filter, + frame_filter.mgmt_rx_frame_filter, frame_filter.ctrl_tx_frame_filter, + frame_filter.ctrl_rx_frame_filter, frame_filter.connected_beacon_interval); + + status = ucfg_pkt_capture_set_filter(frame_filter, vdev); + hdd_objmgr_put_vdev(adapter->vdev); + + hdd_exit(); + + return status; +} + +/** + * __wlan_hdd_cfg80211_set_monitor_mode() - Wifi monitor mode configuration + * vendor command + * @wiphy: wiphy device pointer + * @wdev: wireless device pointer + * @data: Vendor command data buffer + * @data_len: Buffer length + * + * Handles . + * + * Return: 0 for Success and negative value for failure + */ +static int +__wlan_hdd_cfg80211_set_monitor_mode(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int data_len) +{ + struct net_device *dev = wdev->netdev; + struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev); + struct hdd_context *hdd_ctx = wiphy_priv(wiphy); + struct nlattr *tb[SET_MONITOR_MODE_CONFIG_MAX + 1]; + int errno; + + if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) { + hdd_err("Command not allowed in FTM mode"); + return -EPERM; + } + + if (!ucfg_pkt_capture_get_mode(hdd_ctx->psoc)) + return QDF_STATUS_E_FAILURE; + + errno = hdd_validate_adapter(adapter); + if (errno) + return errno; + + if (wlan_cfg80211_nla_parse(tb, SET_MONITOR_MODE_CONFIG_MAX, + data, data_len, set_monitor_mode_policy)) { + hdd_err("invalid monitor attr"); + return -EINVAL; + } + + errno = hdd_monitor_mode_configure(adapter, tb); + + return errno; +} + +/** + * wlan_hdd_cfg80211_set_monitor_mode() - set monitor mode + * @wiphy: wiphy pointer + * @wdev: pointer to struct wireless_dev + * @data: pointer to incoming NL vendor data + * @data_len: length of @data + * + * Return: 0 on success; error number otherwise. + */ +static int wlan_hdd_cfg80211_set_monitor_mode(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int data_len) +{ + int errno; + struct osif_vdev_sync *vdev_sync; + + hdd_enter_dev(wdev->netdev); + + errno = osif_vdev_sync_op_start(wdev->netdev, &vdev_sync); + if (errno) + return errno; + + errno = __wlan_hdd_cfg80211_set_monitor_mode(wiphy, wdev, + data, data_len); + + osif_vdev_sync_op_stop(vdev_sync); + + hdd_exit(); + + return errno; +} + +#undef SET_MONITOR_MODE_CONFIG_MAX +#undef SET_MONITOR_MODE_INVALID +#undef SET_MONITOR_MODE_DATA_TX_FRAME_TYPE +#undef SET_MONITOR_MODE_DATA_RX_FRAME_TYPE +#undef SET_MONITOR_MODE_MGMT_TX_FRAME_TYPE +#undef SET_MONITOR_MODE_MGMT_RX_FRAME_TYPE +#undef SET_MONITOR_MODE_CTRL_TX_FRAME_TYPE +#undef SET_MONITOR_MODE_CTRL_RX_FRAME_TYPE +#undef SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL + +#endif + /** * wlan_hdd_cfg80211_get_chain_rssi() - get chain rssi * @wiphy: wiphy pointer @@ -16305,6 +16553,19 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = { FEATURE_THERMAL_VENDOR_COMMANDS FEATURE_BTC_CHAIN_MODE_COMMANDS FEATURE_WMM_COMMANDS + +#ifdef WLAN_FEATURE_PKT_CAPTURE + { + .info.vendor_id = QCA_NL80211_VENDOR_ID, + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_SET_MONITOR_MODE, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV | + WIPHY_VENDOR_CMD_NEED_RUNNING, + .doit = wlan_hdd_cfg80211_set_monitor_mode, + vendor_command_policy(set_monitor_mode_policy, + QCA_WLAN_VENDOR_ATTR_SET_MONITOR_MODE_MAX) + }, +#endif }; struct hdd_context *hdd_cfg80211_wiphy_alloc(void) From 952fbb474b538b8c66ddfab872562eaa49afea7e Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Tue, 7 Sep 2021 12:40:11 +0530 Subject: [PATCH 36/60] qcacld-3.0: Add support to send mode to FW based on frame filter In packet capture component add support to send data and mgmt mode to FW based on frame filter received from user through vendor command. Change-Id: I7d974ca30008c32d68ab1f1f5b19bc10641f64fc --- .../core/src/wlan_pkt_capture_main.c | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index c896686c9056..55cdad1e4cc2 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -982,6 +982,10 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev) { struct pkt_capture_vdev_priv *vdev_priv; + struct wlan_objmgr_psoc *psoc; + enum pkt_capture_mode mode = PACKET_CAPTURE_MODE_DISABLE; + ol_txrx_soc_handle soc; + QDF_STATUS status; if (!vdev) { pkt_capture_err("vdev is NULL"); @@ -994,6 +998,18 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, return QDF_STATUS_E_FAILURE; } + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + pkt_capture_err("psoc is NULL"); + return QDF_STATUS_E_FAILURE; + } + + soc = cds_get_context(QDF_MODULE_ID_SOC); + if (!soc) { + pkt_capture_err("Invalid soc"); + return QDF_STATUS_E_FAILURE; + } + if (frame_filter.vendor_attr_to_set & BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_DATA_TX_FRAME_TYPE)) vdev_priv->frame_filter.data_tx_frame_filter = @@ -1029,5 +1045,24 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, vdev_priv->frame_filter.connected_beacon_interval = frame_filter.connected_beacon_interval; + if (vdev_priv->frame_filter.mgmt_tx_frame_filter || + vdev_priv->frame_filter.mgmt_rx_frame_filter) + mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; + + if (vdev_priv->frame_filter.data_tx_frame_filter || + vdev_priv->frame_filter.data_rx_frame_filter) + mode |= PACKET_CAPTURE_MODE_DATA_ONLY; + + if (mode != pkt_capture_get_pktcap_mode(psoc)) { + status = tgt_pkt_capture_send_mode(vdev, mode); + if (QDF_IS_STATUS_ERROR(status)) { + pkt_capture_err("Unable to send packet capture mode"); + return status; + } + + if (mode & PACKET_CAPTURE_MODE_DATA_ONLY) + cdp_set_pkt_capture_mode(soc, true); + } + return QDF_STATUS_SUCCESS; } From 2bd2232a59c161b5c3cc334df12a346b3395d598 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Tue, 7 Sep 2021 13:01:37 +0530 Subject: [PATCH 37/60] qcacld-3.0: Add support to send config to FW based on filter In packet capture component add support to send ctrl and beacon frames config to FW based on frame filter received from user through vendor command. Change-Id: Ie233eafd4331a10840d2b7ba51db64363b41d346 --- .../core/inc/wlan_pkt_capture_main.h | 19 ++++ .../core/inc/wlan_pkt_capture_priv.h | 8 +- .../core/src/wlan_pkt_capture_main.c | 88 +++++++++++++++++-- .../inc/wlan_pkt_capture_public_structs.h | 25 +++--- .../dispatcher/inc/wlan_pkt_capture_tgt_api.h | 4 +- .../inc/wlan_pkt_capture_ucfg_api.h | 60 +++++++------ .../dispatcher/src/wlan_pkt_capture_tgt_api.c | 4 +- .../src/wlan_pkt_capture_ucfg_api.c | 34 +++++-- .../pkt_capture/src/target_if_pkt_capture.c | 17 +++- 9 files changed, 195 insertions(+), 64 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index 9561217bc6ab..da20a0e17093 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -172,6 +172,25 @@ void pkt_capture_set_pktcap_mode(struct wlan_objmgr_psoc *psoc, enum pkt_capture_mode pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc); +/** + * pkt_capture_set_pktcap_config - Set packet capture config + * @vdev: pointer to vdev object + * @config: config to be set + * + * Return: None + */ +void pkt_capture_set_pktcap_config(struct wlan_objmgr_vdev *vdev, + enum pkt_capture_config config); + +/** + * pkt_capture_get_pktcap_config - Get packet capture config + * @vdev: pointer to vdev object + * + * Return: config value + */ +enum pkt_capture_config +pkt_capture_get_pktcap_config(struct wlan_objmgr_vdev *vdev); + /** * pkt_capture_drop_nbuf_list() - drop an nbuf list * @buf_list: buffer list to be dropepd diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h index 8f375535b464..94aafd1d1967 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h @@ -32,23 +32,23 @@ #include "wlan_pkt_capture_mon_thread.h" /** - * struct pkt_capture_cfg - packet capture cfg to store ini values + * struct pkt_capture_cfg - struct to store config values * @pkt_capture_mode: packet capture mode + * @pkt_capture_config: config for trigger, qos and beacon frames */ struct pkt_capture_cfg { enum pkt_capture_mode pkt_capture_mode; + enum pkt_capture_config pkt_capture_config; }; /** * struct pkt_capture_cb_context - packet capture callback context * @mon_cb: monitor callback function pointer * @mon_ctx: monitor callback context - * @pkt_capture_mode: packet capture mode */ struct pkt_capture_cb_context { QDF_STATUS (*mon_cb)(void *, qdf_nbuf_t); void *mon_ctx; - enum pkt_capture_mode pkt_capture_mode; }; /** @@ -59,6 +59,7 @@ struct pkt_capture_cb_context { * @rx_ops: rx ops * @tx_ops: tx ops * @frame_filter: config filter set by vendor command + * @cfg_params: packet capture config params * @rx_avg_rssi: avg rssi of rx data packets * @ppdu_stats_q: list used for storing smu related ppdu stats * @lock_q: spinlock for ppdu_stats q @@ -71,6 +72,7 @@ struct pkt_capture_vdev_priv { struct wlan_pkt_capture_rx_ops rx_ops; struct wlan_pkt_capture_tx_ops tx_ops; struct pkt_capture_frame_filter frame_filter; + struct pkt_capture_cfg cfg_params; int32_t rx_avg_rssi; qdf_list_t ppdu_stats_q; qdf_spinlock_t lock_q; diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 55cdad1e4cc2..e3bb7794c851 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -150,7 +150,7 @@ pkt_capture_get_pktcap_mode_v2() if (!vdev_priv) pkt_capture_err("vdev_priv is NULL"); else - mode = vdev_priv->cb_ctx->pkt_capture_mode; + mode = vdev_priv->cfg_params.pkt_capture_mode; return mode; } @@ -648,7 +648,7 @@ void pkt_capture_set_pktcap_mode(struct wlan_objmgr_psoc *psoc, vdev_priv = pkt_capture_vdev_get_priv(vdev); if (vdev_priv) - vdev_priv->cb_ctx->pkt_capture_mode = mode; + vdev_priv->cfg_params.pkt_capture_mode = mode; else pkt_capture_err("vdev_priv is NULL"); @@ -680,12 +680,47 @@ pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc) if (!vdev_priv) pkt_capture_err("vdev_priv is NULL"); else - mode = vdev_priv->cb_ctx->pkt_capture_mode; + mode = vdev_priv->cfg_params.pkt_capture_mode; wlan_objmgr_vdev_release_ref(vdev, WLAN_PKT_CAPTURE_ID); return mode; } +void pkt_capture_set_pktcap_config(struct wlan_objmgr_vdev *vdev, + enum pkt_capture_config config) +{ + struct pkt_capture_vdev_priv *vdev_priv; + + if (!vdev) { + pkt_capture_err("vdev is NULL"); + return; + } + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (vdev_priv) + vdev_priv->cfg_params.pkt_capture_config = config; + else + pkt_capture_err("vdev_priv is NULL"); +} + +enum pkt_capture_config +pkt_capture_get_pktcap_config(struct wlan_objmgr_vdev *vdev) +{ + enum pkt_capture_config config = 0; + struct pkt_capture_vdev_priv *vdev_priv; + + if (!vdev) + return 0; + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) + pkt_capture_err("vdev_priv is NULL"); + else + config = vdev_priv->cfg_params.pkt_capture_config; + + return config; +} + /** * pkt_capture_callback_ctx_create() - Create packet capture callback context * @vdev_priv: pointer to packet capture vdev priv obj @@ -986,6 +1021,8 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, enum pkt_capture_mode mode = PACKET_CAPTURE_MODE_DISABLE; ol_txrx_soc_handle soc; QDF_STATUS status; + enum pkt_capture_config config = 0; + bool check_enable_beacon = 0; if (!vdev) { pkt_capture_err("vdev is NULL"); @@ -1045,10 +1082,35 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, vdev_priv->frame_filter.connected_beacon_interval = frame_filter.connected_beacon_interval; - if (vdev_priv->frame_filter.mgmt_tx_frame_filter || - vdev_priv->frame_filter.mgmt_rx_frame_filter) + if (vdev_priv->frame_filter.mgmt_tx_frame_filter) mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; + if (vdev_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL) { + mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; + config |= PACKET_CAPTURE_CONFIG_BEACON_ENABLE; + config |= PACKET_CAPTURE_CONFIG_OFF_CHANNEL_BEACON_ENABLE; + } else { + if (vdev_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_NO_BEACON) { + mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; + config |= PACKET_CAPTURE_CONFIG_NO_BEACON_ENABLE; + } else { + check_enable_beacon = 1; + } + } + + if (check_enable_beacon) { + if (vdev_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_BEACON) + config |= PACKET_CAPTURE_CONFIG_BEACON_ENABLE; + + if (vdev_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_SCAN_BEACON) + config |= + PACKET_CAPTURE_CONFIG_OFF_CHANNEL_BEACON_ENABLE; + } + if (vdev_priv->frame_filter.data_tx_frame_filter || vdev_priv->frame_filter.data_rx_frame_filter) mode |= PACKET_CAPTURE_MODE_DATA_ONLY; @@ -1064,5 +1126,21 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, cdp_set_pkt_capture_mode(soc, true); } + if (vdev_priv->frame_filter.ctrl_tx_frame_filter || + vdev_priv->frame_filter.ctrl_rx_frame_filter) + config |= PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE; + + if (vdev_priv->frame_filter.data_rx_frame_filter & + PKT_CAPTURE_DATA_FRAME_QOS_NULL) + config |= PACKET_CAPTURE_CONFIG_QOS_ENABLE; + + if (config != pkt_capture_get_pktcap_config(vdev)) { + status = tgt_pkt_capture_send_config(vdev, config); + if (QDF_IS_STATUS_ERROR(status)) { + pkt_capture_err("packet capture send config failed"); + return status; + } + } + return QDF_STATUS_SUCCESS; } diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index acc1656b7877..ab71e1a5dbc0 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -38,19 +38,22 @@ enum pkt_capture_mode { }; /** - * enum pkt_capture_trigger_qos_config - packet capture config - * @PACKET_CAPTURE_CONFIG_TRIGGER_QOS_DISABLE: disable capture for trigger and - * qos frames + * enum pkt_capture_config - packet capture config * @PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE: enable capture for trigger frames only * @PACKET_CAPTURE_CONFIG_QOS_ENABLE: enable capture for qos frames only - * @PACKET_CAPTURE_CONFIG_TRIGGER_QOS_ENABLE: enable capture for both trigger - * and qos frames + * @PACKET_CAPTURE_CONFIG_CONNECT_NO_BEACON_ENABLE: drop all beacons, when + * device in connected state + * @PACKET_CAPTURE_CONFIG_CONNECT_BEACON_ENABLE: enable only connected BSSID + * beacons, when device in connected state + * @PACKET_CAPTURE_CONFIG_CONNECT_OFF_CHANNEL_BEACON_ENABLE: enable off channel + * beacons, when device in connected state */ -enum pkt_capture_trigger_qos_config { - PACKET_CAPTURE_CONFIG_TRIGGER_QOS_DISABLE = 0, - PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE, - PACKET_CAPTURE_CONFIG_QOS_ENABLE, - PACKET_CAPTURE_CONFIG_TRIGGER_QOS_ENABLE, +enum pkt_capture_config { + PACKET_CAPTURE_CONFIG_TRIGGER_ENABLE = BIT(0), + PACKET_CAPTURE_CONFIG_QOS_ENABLE = BIT(1), + PACKET_CAPTURE_CONFIG_NO_BEACON_ENABLE = BIT(2), + PACKET_CAPTURE_CONFIG_BEACON_ENABLE = BIT(3), + PACKET_CAPTURE_CONFIG_OFF_CHANNEL_BEACON_ENABLE = BIT(4), }; /** @@ -106,7 +109,7 @@ struct wlan_pkt_capture_tx_ops { QDF_STATUS (*pkt_capture_send_config) (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - enum pkt_capture_trigger_qos_config config); + enum pkt_capture_config config); }; /** diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h index e4c1c3da7fc1..8cccff114dcc 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h @@ -53,7 +53,6 @@ QDF_STATUS tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, enum pkt_capture_mode mode); -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * tgt_pkt_capture_send_config() - send packet capture config to firmware * @vdev: pointer to vdev object @@ -63,8 +62,9 @@ tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, */ QDF_STATUS tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config); + enum pkt_capture_config config); +#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * tgt_pkt_capture_smu_event() - Receive smart monitor event from firmware * @psoc: pointer to psoc diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h index 768b3ac00fad..70571466e8e1 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h @@ -120,6 +120,25 @@ void ucfg_pkt_capture_set_pktcap_mode(struct wlan_objmgr_psoc *psoc, enum pkt_capture_mode ucfg_pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc); +/** + * ucfg_pkt_capturee_set_pktcap_config - Set packet capture config + * @vdev: pointer to vdev object + * @config: config to be set + * + * Return: None + */ +void ucfg_pkt_capture_set_pktcap_config(struct wlan_objmgr_vdev *vdev, + enum pkt_capture_config config); + +/** + * ucfg_pkt_capture_get_pktcap_config - Get packet capture config + * @vdev: pointer to vdev object + * + * Return: config value + */ +enum pkt_capture_config +ucfg_pkt_capture_get_pktcap_config(struct wlan_objmgr_vdev *vdev); + /** * ucfg_pkt_capture_process_mgmt_tx_data() - process management tx packets * @pdev: pointer to pdev object @@ -278,27 +297,6 @@ QDF_STATUS ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev); -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 -/** - * ucfg_pkt_capture_send_config - send packet capture config - * @vdev: pointer to vdev object - * @config: packet capture config - * - * Return: None - */ -QDF_STATUS ucfg_pkt_capture_send_config - (struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config); -#else -static inline -QDF_STATUS ucfg_pkt_capture_send_config - (struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config) -{ - return QDF_STATUS_SUCCESS; -} - -#endif #else static inline QDF_STATUS ucfg_pkt_capture_init(void) @@ -354,6 +352,18 @@ ucfg_pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc) return PACKET_CAPTURE_MODE_DISABLE; } +static inline +void ucfg_pkt_capture_set_pktcap_config(struct wlan_objmgr_vdev *vdev, + enum pkt_capture_config config) +{ +} + +static inline enum pkt_capture_config +ucfg_pkt_capture_get_pktcap_config(struct wlan_objmgr_vdev *vdev) +{ + return 0; +} + static inline QDF_STATUS ucfg_pkt_capture_process_mgmt_tx_data( struct mgmt_offload_event_params *params, @@ -429,14 +439,6 @@ ucfg_pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev) { } -static inline -QDF_STATUS ucfg_pkt_capture_send_config - (struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config) -{ - return QDF_STATUS_SUCCESS; -} - static inline QDF_STATUS ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev) diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c index 0d069cd0cccd..d66b8a6560f6 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c @@ -126,10 +126,9 @@ tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, return status; } -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 QDF_STATUS tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config) + enum pkt_capture_config config) { QDF_STATUS status = QDF_STATUS_E_FAILURE; struct pkt_capture_vdev_priv *vdev_priv; @@ -161,6 +160,7 @@ tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, return status; } +#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 QDF_STATUS tgt_pkt_capture_smu_event(struct wlan_objmgr_psoc *psoc, struct smu_event_params *param) diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 626ef47572a4..135ed9a178ae 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -86,6 +86,31 @@ ucfg_pkt_capture_get_pktcap_mode(struct wlan_objmgr_psoc *psoc) return pkt_capture_get_pktcap_mode(psoc); } +/** + * ucfg_pkt_capture_set_pktcap_config - Set packet capture config + * @vdev: pointer to vdev object + * @config: config to be set + * + * Return: None + */ +void ucfg_pkt_capture_set_pktcap_config(struct wlan_objmgr_vdev *vdev, + enum pkt_capture_config config) +{ + pkt_capture_set_pktcap_config(vdev, config); +} + +/** + * ucfg_pkt_capture_get_pktcap_config - Get packet capture config + * @vdev: pointer to vdev object + * + * Return: config value + */ +enum pkt_capture_config +ucfg_pkt_capture_get_pktcap_config(struct wlan_objmgr_vdev *vdev) +{ + return pkt_capture_get_pktcap_config(vdev); +} + /** * ucfg_pkt_capture_init() - Packet capture component initialization. * @@ -315,12 +340,3 @@ ucfg_pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, { return pkt_capture_set_filter(frame_filter, vdev); } - -#ifdef WLAN_FEATURE_PKT_CAPTURE_V2 -QDF_STATUS ucfg_pkt_capture_send_config - (struct wlan_objmgr_vdev *vdev, - enum pkt_capture_trigger_qos_config config) -{ - return tgt_pkt_capture_send_config(vdev, config); -} -#endif diff --git a/components/target_if/pkt_capture/src/target_if_pkt_capture.c b/components/target_if/pkt_capture/src/target_if_pkt_capture.c index 4361c157fa90..6072b6848358 100644 --- a/components/target_if/pkt_capture/src/target_if_pkt_capture.c +++ b/components/target_if/pkt_capture/src/target_if_pkt_capture.c @@ -79,10 +79,11 @@ static QDF_STATUS target_if_set_packet_capture_config (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - enum pkt_capture_trigger_qos_config config_value) + enum pkt_capture_config config_value) { wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc); QDF_STATUS status = QDF_STATUS_E_FAILURE; + struct wlan_objmgr_vdev *vdev; struct vdev_set_params param; if (!wmi_handle) { @@ -90,6 +91,13 @@ target_if_set_packet_capture_config return QDF_STATUS_E_INVAL; } + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_PKT_CAPTURE_ID); + if (!vdev) { + pkt_capture_err("vdev is NULL"); + return QDF_STATUS_E_INVAL; + } + target_if_debug("psoc:%pK, vdev_id:%d config_value:%d", psoc, vdev_id, config_value); @@ -98,9 +106,12 @@ target_if_set_packet_capture_config param.param_value = (uint32_t)config_value; status = wmi_unified_vdev_set_param_send(wmi_handle, ¶m); - if (QDF_IS_STATUS_ERROR(status)) + if (QDF_IS_STATUS_SUCCESS(status)) + ucfg_pkt_capture_set_pktcap_config(vdev, config_value); + else pkt_capture_err("failed to set packet capture config"); + wlan_objmgr_vdev_release_ref(vdev, WLAN_PKT_CAPTURE_ID); return status; } #else @@ -108,7 +119,7 @@ static QDF_STATUS target_if_set_packet_capture_config (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - enum pkt_capture_trigger_qos_config config_value) + enum pkt_capture_config config_value) { return QDF_STATUS_SUCCESS; } From b3b403425cbfb7e8fe4d9cff1f988be8e360171b Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Mon, 30 Aug 2021 12:46:42 +0530 Subject: [PATCH 38/60] qcacld-3.0: Add tgt support to send beacon report period to FW Add tgt support in packet capture component to send user configured beacon report interval to FW. Change-Id: I8b0b3062dca0667db6ca305ed54ac603086dae82 --- .../core/src/wlan_pkt_capture_main.c | 44 +++++++++++++++++-- .../inc/wlan_pkt_capture_public_structs.h | 4 ++ .../dispatcher/inc/wlan_pkt_capture_tgt_api.h | 11 +++++ .../dispatcher/src/wlan_pkt_capture_tgt_api.c | 36 +++++++++++++++ .../pkt_capture/src/target_if_pkt_capture.c | 40 +++++++++++++++++ 5 files changed, 131 insertions(+), 4 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index e3bb7794c851..f054d283abf4 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -33,6 +33,7 @@ #include "cdp_txrx_ctrl.h" #include "wlan_pkt_capture_tgt_api.h" #include +#include "wlan_vdev_mgr_utils_api.h" static struct wlan_objmgr_vdev *gp_pkt_capture_vdev; @@ -1022,7 +1023,9 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, ol_txrx_soc_handle soc; QDF_STATUS status; enum pkt_capture_config config = 0; - bool check_enable_beacon = 0; + bool check_enable_beacon = 0, send_bcn = 0; + struct vdev_mlme_obj *vdev_mlme; + uint32_t bcn_interval, nth_beacon_value; if (!vdev) { pkt_capture_err("vdev is NULL"); @@ -1078,9 +1081,14 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, frame_filter.ctrl_rx_frame_filter; if (frame_filter.vendor_attr_to_set & - BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL)) - vdev_priv->frame_filter.connected_beacon_interval = - frame_filter.connected_beacon_interval; + BIT(PKT_CAPTURE_ATTR_SET_MONITOR_MODE_CONNECTED_BEACON_INTERVAL)) { + if (frame_filter.connected_beacon_interval != + vdev_priv->frame_filter.connected_beacon_interval) { + vdev_priv->frame_filter.connected_beacon_interval = + frame_filter.connected_beacon_interval; + send_bcn = 1; + } + } if (vdev_priv->frame_filter.mgmt_tx_frame_filter) mode |= PACKET_CAPTURE_MODE_MGMT_ONLY; @@ -1142,5 +1150,33 @@ QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, } } + if (send_bcn) { + vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj( + vdev, + WLAN_UMAC_COMP_MLME); + + if (!vdev_mlme) + return QDF_STATUS_E_FAILURE; + + wlan_util_vdev_mlme_get_param(vdev_mlme, + WLAN_MLME_CFG_BEACON_INTERVAL, + &bcn_interval); + + if (bcn_interval) { + nth_beacon_value = + vdev_priv-> + frame_filter.connected_beacon_interval / + bcn_interval; + + status = tgt_pkt_capture_send_beacon_interval( + vdev, + nth_beacon_value); + + if (QDF_IS_STATUS_ERROR(status)) { + pkt_capture_err("send beacon interval fail"); + return status; + } + } + } return QDF_STATUS_SUCCESS; } diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index ab71e1a5dbc0..9b0c4bcc6900 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -110,6 +110,10 @@ struct wlan_pkt_capture_tx_ops { (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, enum pkt_capture_config config); + QDF_STATUS (*pkt_capture_send_beacon_interval) + (struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint32_t nth_value); }; /** diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h index 8cccff114dcc..fc26e89b85b8 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_tgt_api.h @@ -53,6 +53,17 @@ QDF_STATUS tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, enum pkt_capture_mode mode); +/** + * tgt_pkt_capture_send_beacon_interval() - send beacon interval to firmware + * @vdev: pointer to vdev object + * @nth_value: Beacon report period + * + * Return: QDF_STATUS + */ +QDF_STATUS +tgt_pkt_capture_send_beacon_interval(struct wlan_objmgr_vdev *vdev, + uint32_t nth_value); + /** * tgt_pkt_capture_send_config() - send packet capture config to firmware * @vdev: pointer to vdev object diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c index d66b8a6560f6..ae65e8408c0a 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_tgt_api.c @@ -126,6 +126,42 @@ tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev, return status; } +QDF_STATUS +tgt_pkt_capture_send_beacon_interval(struct wlan_objmgr_vdev *vdev, + uint32_t nth_value) +{ + QDF_STATUS status = QDF_STATUS_E_FAILURE; + struct pkt_capture_vdev_priv *vdev_priv; + struct wlan_pkt_capture_tx_ops *tx_ops; + struct wlan_objmgr_psoc *psoc; + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + pkt_capture_err("psoc is NULL"); + return status; + } + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) { + pkt_capture_err("vdev priv is NULL"); + return status; + } + + tx_ops = &vdev_priv->tx_ops; + + if (!tx_ops->pkt_capture_send_beacon_interval) + return status; + + status = tx_ops->pkt_capture_send_beacon_interval + (psoc, + wlan_vdev_get_id(vdev), + nth_value); + if (QDF_IS_STATUS_ERROR(status)) + pkt_capture_err("Unable to send beacon interval to fw"); + + return status; +} + QDF_STATUS tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev, enum pkt_capture_config config) diff --git a/components/target_if/pkt_capture/src/target_if_pkt_capture.c b/components/target_if/pkt_capture/src/target_if_pkt_capture.c index 6072b6848358..cdf1a339b934 100644 --- a/components/target_if/pkt_capture/src/target_if_pkt_capture.c +++ b/components/target_if/pkt_capture/src/target_if_pkt_capture.c @@ -125,6 +125,44 @@ target_if_set_packet_capture_config } #endif +/** + * target_if_set_packet_capture_beacon_interval() - set packet capture beacon + * interval + * @psoc: pointer to psoc object + * @vdev_id: vdev id + * @nth_value: Beacon report period + * + * Return: QDF_STATUS + */ +static QDF_STATUS +target_if_set_packet_capture_beacon_interval + (struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint32_t nth_value) +{ + wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc); + QDF_STATUS status = QDF_STATUS_E_FAILURE; + struct vdev_set_params param; + + if (!wmi_handle) { + target_if_err("Invalid wmi handle"); + return QDF_STATUS_E_INVAL; + } + + target_if_debug("psoc:%pK, vdev_id:%d nth_value:%d", + psoc, vdev_id, nth_value); + + param.vdev_id = vdev_id; + param.param_id = WMI_VDEV_PARAM_NTH_BEACON_TO_HOST; + param.param_value = nth_value; + + status = wmi_unified_vdev_set_param_send(wmi_handle, ¶m); + if (QDF_IS_STATUS_ERROR(status)) + pkt_capture_err("failed to set beacon interval"); + + return status; +} + /** * target_if_mgmt_offload_data_event_handler() - offload event handler * @handle: scn handle @@ -435,4 +473,6 @@ target_if_pkt_capture_register_tx_ops(struct wlan_pkt_capture_tx_ops *tx_ops) tx_ops->pkt_capture_send_mode = target_if_set_packet_capture_mode; tx_ops->pkt_capture_send_config = target_if_set_packet_capture_config; + tx_ops->pkt_capture_send_beacon_interval = + target_if_set_packet_capture_beacon_interval; } From 1e88db032d17d7617abac317e0e2af3d749d7b0e Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Fri, 3 Sep 2021 16:58:53 +0530 Subject: [PATCH 39/60] qcacld-3.0: Add check for data tx rx based on vendor command This commit adds check for data tx and rx packets based on vendor command received from user. Change-Id: I202341e0cdc2ac03d4d7338bd0467bf966c2fea7 --- .../core/inc/wlan_pkt_capture_main.h | 4 +- .../core/src/wlan_pkt_capture_main.c | 41 ++++++++++++++----- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index da20a0e17093..2cd4f75115c2 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -244,12 +244,12 @@ pkt_capture_get_pktcap_mode_v2(void); * @soc: dp_soc handle * @event: wdi event * @log_data: nbuf data - * @vdev_id: vdev id + * @peer_id: peer id * @status: status * * Return: None */ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, - u_int16_t vdev_id, uint32_t status); + u_int16_t peer_id, uint32_t status); #endif #endif /* end of _WLAN_PKT_CAPTURE_MAIN_H_ */ diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index f054d283abf4..c522c6644e0c 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -252,11 +252,27 @@ pkt_capture_process_ppdu_stats(void *log_data) } void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, - u_int16_t vdev_id, uint32_t status) + u_int16_t peer_id, uint32_t status) { uint8_t bssid[QDF_MAC_ADDR_SIZE]; uint8_t tid = 0; struct dp_soc *psoc = soc; + struct wlan_objmgr_vdev *vdev; + struct pkt_capture_vdev_priv *vdev_priv; + struct pkt_capture_frame_filter *frame_filter; + uint16_t vdev_id = 0; + + vdev = pkt_capture_get_vdev(); + if (!vdev) + return; + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) { + pkt_capture_err("vdev priv is NULL"); + return; + } + + frame_filter = &vdev_priv->frame_filter; switch (event) { case WDI_EVENT_PKT_CAPTURE_TX_DATA: @@ -274,10 +290,9 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, hal_tx_comp_get_status(&desc->comp, &tx_comp_status, psoc->hal_soc); - if (!(pkt_capture_get_pktcap_mode_v2() & - PKT_CAPTURE_MODE_DATA_ONLY)) { + + if (!frame_filter->data_tx_frame_filter) return; - } if (tx_comp_status.valid) pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; @@ -397,9 +412,17 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, case WDI_EVENT_PKT_CAPTURE_RX_DATA: { - if (!(pkt_capture_get_pktcap_mode_v2() & - PKT_CAPTURE_MODE_DATA_ONLY)) + qdf_nbuf_t nbuf = (qdf_nbuf_t)log_data; + + if (!frame_filter->data_rx_frame_filter) { + /* + * Rx offload packets are delivered only to pkt capture + * component and not to stack so free them. + */ + if (status == RX_OFFLOAD_PKT) + qdf_nbuf_free(nbuf); return; + } pkt_capture_msdu_process_pkts(bssid, log_data, vdev_id, soc, status); @@ -410,8 +433,7 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, { qdf_nbuf_t nbuf = (qdf_nbuf_t)log_data; - if (!(pkt_capture_get_pktcap_mode_v2() & - PKT_CAPTURE_MODE_DATA_ONLY)) { + if (!frame_filter->data_rx_frame_filter) { /* * Rx offload packets are delivered only to pkt capture * component and not to stack so free them @@ -432,8 +454,7 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, bool is_pkt_during_roam = false; uint32_t freq = 0; - if (!(pkt_capture_get_pktcap_mode_v2() & - PKT_CAPTURE_MODE_DATA_ONLY)) + if (!frame_filter->data_tx_frame_filter) return; offload_deliver_msg = From 453a113e08e4ae88fdbda5911550a07d7b1177ba Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Wed, 8 Sep 2021 16:29:00 +0530 Subject: [PATCH 40/60] qcacld-3.0: Add filter for data packets in packet capture mode Deliver data packets to monitor interface only if corresponding filter is set by vendor command. Change-Id: I1f23d2abdf53cb5fd71dfc60e99ce61038863273 --- .../core/src/wlan_pkt_capture_main.c | 396 ++++++++++++------ 1 file changed, 264 insertions(+), 132 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index c522c6644e0c..0b793d3711ff 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -251,12 +251,227 @@ pkt_capture_process_ppdu_stats(void *log_data) qdf_spin_unlock(&vdev_priv->lock_q); } +static void +pkt_capture_process_tx_data(void *soc, void *log_data, u_int16_t vdev_id, + uint32_t status) +{ + struct dp_soc *psoc = soc; + uint8_t tid = 0; + uint8_t bssid[QDF_MAC_ADDR_SIZE]; + struct pkt_capture_tx_hdr_elem_t *ptr_pktcapture_hdr; + struct pkt_capture_tx_hdr_elem_t pktcapture_hdr = {0}; + struct hal_tx_completion_status tx_comp_status = {0}; + struct qdf_tso_seg_elem_t *tso_seg = NULL; + uint32_t txcap_hdr_size = + sizeof(struct pkt_capture_tx_hdr_elem_t); + + struct dp_tx_desc_s *desc = log_data; + qdf_nbuf_t netbuf; + int nbuf_len; + + hal_tx_comp_get_status(&desc->comp, &tx_comp_status, + psoc->hal_soc); + + if (tx_comp_status.valid) + pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; + pktcapture_hdr.timestamp = tx_comp_status.tsf; + pktcapture_hdr.preamble = tx_comp_status.pkt_type; + pktcapture_hdr.mcs = tx_comp_status.mcs; + pktcapture_hdr.bw = tx_comp_status.bw; + /* nss not available */ + pktcapture_hdr.nss = 0; + pktcapture_hdr.rssi_comb = tx_comp_status.ack_frame_rssi; + /* rate not available */ + pktcapture_hdr.rate = 0; + pktcapture_hdr.stbc = tx_comp_status.stbc; + pktcapture_hdr.sgi = tx_comp_status.sgi; + pktcapture_hdr.ldpc = tx_comp_status.ldpc; + /* Beamformed not available */ + pktcapture_hdr.beamformed = 0; + pktcapture_hdr.framectrl = IEEE80211_FC0_TYPE_DATA | + (IEEE80211_FC1_DIR_TODS << 8); + pktcapture_hdr.tx_retry_cnt = tx_comp_status.transmit_cnt - 1; + /* seqno not available */ + pktcapture_hdr.seqno = 0; + tid = tx_comp_status.tid; + status = tx_comp_status.status; + + if (desc->frm_type == dp_tx_frm_tso) { + if (!desc->tso_desc) + return; + tso_seg = desc->tso_desc; + nbuf_len = tso_seg->seg.total_len; + } else { + nbuf_len = qdf_nbuf_len(desc->nbuf); + } + + netbuf = qdf_nbuf_alloc(NULL, + roundup(nbuf_len + RESERVE_BYTES, 4), + RESERVE_BYTES, 4, false); + + if (!netbuf) + return; + + qdf_nbuf_put_tail(netbuf, nbuf_len); + + if (desc->frm_type == dp_tx_frm_tso) { + uint8_t frag_cnt, num_frags = 0; + int frag_len = 0; + uint32_t tcp_seq_num; + uint16_t ip_len; + + if (tso_seg->seg.num_frags > 0) + num_frags = tso_seg->seg.num_frags - 1; + + /*Num of frags in a tso seg cannot be less than 2 */ + if (num_frags < 1) { + pkt_capture_err("num of frags in tso segment is %d\n", + (num_frags + 1)); + qdf_nbuf_free(netbuf); + return; + } + + tcp_seq_num = tso_seg->seg.tso_flags.tcp_seq_num; + tcp_seq_num = qdf_cpu_to_be32(tcp_seq_num); + + ip_len = tso_seg->seg.tso_flags.ip_len; + ip_len = qdf_cpu_to_be16(ip_len); + + for (frag_cnt = 0; frag_cnt <= num_frags; frag_cnt++) { + qdf_mem_copy( + qdf_nbuf_data(netbuf) + frag_len, + tso_seg->seg.tso_frags[frag_cnt].vaddr, + tso_seg->seg.tso_frags[frag_cnt].length); + frag_len += + tso_seg->seg.tso_frags[frag_cnt].length; + } + + qdf_mem_copy((qdf_nbuf_data(netbuf) + + IPV4_PKT_LEN_OFFSET), + &ip_len, sizeof(ip_len)); + qdf_mem_copy((qdf_nbuf_data(netbuf) + + IPV4_TCP_SEQ_NUM_OFFSET), + &tcp_seq_num, sizeof(tcp_seq_num)); + } else { + qdf_mem_copy(qdf_nbuf_data(netbuf), + qdf_nbuf_data(desc->nbuf), nbuf_len); + } + + if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) { + netbuf = qdf_nbuf_realloc_headroom(netbuf, + txcap_hdr_size); + if (!netbuf) { + QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, + QDF_TRACE_LEVEL_ERROR, + FL("No headroom")); + return; + } + } + + if (!qdf_nbuf_push_head(netbuf, txcap_hdr_size)) { + QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, + QDF_TRACE_LEVEL_ERROR, FL("No headroom")); + qdf_nbuf_free(netbuf); + return; + } + + ptr_pktcapture_hdr = + (struct pkt_capture_tx_hdr_elem_t *)qdf_nbuf_data(netbuf); + qdf_mem_copy(ptr_pktcapture_hdr, &pktcapture_hdr, + txcap_hdr_size); + + pkt_capture_datapkt_process( + vdev_id, netbuf, TXRX_PROCESS_TYPE_DATA_TX_COMPL, + tid, status, TXRX_PKTCAPTURE_PKT_FORMAT_8023, + bssid, NULL, pktcapture_hdr.tx_retry_cnt); +} + +/** + * pkt_capture_is_frame_filter_set() - Check frame filter is set + * @nbuf: buffer address + * @frame_filter: frame filter address + * @direction: frame direction + * + * Return: true, if filter bit is set + * false, if filter bit is not set + */ +static bool +pkt_capture_is_frame_filter_set(qdf_nbuf_t buf, + struct pkt_capture_frame_filter *frame_filter, + bool direction) +{ + enum pkt_capture_data_frame_type data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_ALL; + + if (qdf_nbuf_is_ipv4_arp_pkt(buf)) { + data_frame_type = PKT_CAPTURE_DATA_FRAME_TYPE_ARP; + } else if (qdf_nbuf_is_ipv4_eapol_pkt(buf)) { + data_frame_type = PKT_CAPTURE_DATA_FRAME_TYPE_EAPOL; + } else if (qdf_nbuf_data_is_tcp_syn(buf)) { + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYN; + } else if (qdf_nbuf_data_is_tcp_syn_ack(buf)) { + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYNACK; + } else if (qdf_nbuf_data_is_tcp_syn(buf)) { + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FIN; + } else if (qdf_nbuf_data_is_tcp_syn_ack(buf)) { + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FINACK; + } else if (qdf_nbuf_data_is_tcp_ack(buf)) { + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_ACK; + } else if (qdf_nbuf_data_is_tcp_rst(buf)) { + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_TCP_RST; + } else if (qdf_nbuf_is_ipv4_pkt(buf)) { + if (qdf_nbuf_is_ipv4_dhcp_pkt(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV4; + else if (qdf_nbuf_is_icmp_pkt(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV4; + else if (qdf_nbuf_data_is_dns_query(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4; + else if (qdf_nbuf_data_is_dns_response(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4; + } else if (qdf_nbuf_is_ipv6_pkt(buf)) { + if (qdf_nbuf_is_ipv6_dhcp_pkt(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV6; + else if (qdf_nbuf_is_icmpv6_pkt(buf)) + data_frame_type = + PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV6; + /* need to add code for + * PKT_CAPTURE_DATA_FRAME_TYPE_DNSV6 + */ + } + /* Add code for + * PKT_CAPTURE_DATA_FRAME_TYPE_RTP + * PKT_CAPTURE_DATA_FRAME_TYPE_SIP + * PKT_CAPTURE_DATA_FRAME_QOS_NULL + */ + + if (direction == IEEE80211_FC1_DIR_TODS) { + if (data_frame_type & frame_filter->data_tx_frame_filter) + return true; + else + return false; + } else { + if (data_frame_type & frame_filter->data_rx_frame_filter) + return true; + else + return false; + } +} + void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, u_int16_t peer_id, uint32_t status) { uint8_t bssid[QDF_MAC_ADDR_SIZE]; - uint8_t tid = 0; - struct dp_soc *psoc = soc; struct wlan_objmgr_vdev *vdev; struct pkt_capture_vdev_priv *vdev_priv; struct pkt_capture_frame_filter *frame_filter; @@ -277,136 +492,21 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, switch (event) { case WDI_EVENT_PKT_CAPTURE_TX_DATA: { - struct pkt_capture_tx_hdr_elem_t *ptr_pktcapture_hdr; - struct pkt_capture_tx_hdr_elem_t pktcapture_hdr = {0}; - struct hal_tx_completion_status tx_comp_status = {0}; - struct qdf_tso_seg_elem_t *tso_seg = NULL; - uint32_t txcap_hdr_size = - sizeof(struct pkt_capture_tx_hdr_elem_t); - struct dp_tx_desc_s *desc = log_data; - qdf_nbuf_t netbuf; - int nbuf_len; - - hal_tx_comp_get_status(&desc->comp, &tx_comp_status, - psoc->hal_soc); if (!frame_filter->data_tx_frame_filter) return; - if (tx_comp_status.valid) - pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; - pktcapture_hdr.timestamp = tx_comp_status.tsf; - pktcapture_hdr.preamble = tx_comp_status.pkt_type; - pktcapture_hdr.mcs = tx_comp_status.mcs; - pktcapture_hdr.bw = tx_comp_status.bw; - /* nss not available */ - pktcapture_hdr.nss = 0; - pktcapture_hdr.rssi_comb = tx_comp_status.ack_frame_rssi; - /* rate not available */ - pktcapture_hdr.rate = 0; - pktcapture_hdr.stbc = tx_comp_status.stbc; - pktcapture_hdr.sgi = tx_comp_status.sgi; - pktcapture_hdr.ldpc = tx_comp_status.ldpc; - /* Beamformed not available */ - pktcapture_hdr.beamformed = 0; - pktcapture_hdr.framectrl = IEEE80211_FC0_TYPE_DATA | - (IEEE80211_FC1_DIR_TODS << 8); - pktcapture_hdr.tx_retry_cnt = tx_comp_status.transmit_cnt - 1; - /* seqno not available */ - pktcapture_hdr.seqno = 0; - tid = tx_comp_status.tid; - status = tx_comp_status.status; - - if (desc->frm_type == dp_tx_frm_tso) { - if (!desc->tso_desc) - return; - tso_seg = desc->tso_desc; - nbuf_len = tso_seg->seg.total_len; - } else { - nbuf_len = qdf_nbuf_len(desc->nbuf); + if (frame_filter->data_tx_frame_filter & + PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { + pkt_capture_process_tx_data(soc, log_data, + vdev_id, status); + } else if (pkt_capture_is_frame_filter_set( + desc->nbuf, frame_filter, IEEE80211_FC1_DIR_TODS)) { + pkt_capture_process_tx_data(soc, log_data, + vdev_id, status); } - netbuf = qdf_nbuf_alloc(NULL, - roundup(nbuf_len + RESERVE_BYTES, 4), - RESERVE_BYTES, 4, false); - - if (!netbuf) - return; - - qdf_nbuf_put_tail(netbuf, nbuf_len); - - if (desc->frm_type == dp_tx_frm_tso) { - uint8_t frag_cnt, num_frags = 0; - int frag_len = 0; - uint32_t tcp_seq_num; - uint16_t ip_len; - - if (tso_seg->seg.num_frags > 0) - num_frags = tso_seg->seg.num_frags - 1; - - /*Num of frags in a tso seg cannot be less than 2 */ - if (num_frags < 1) { - pkt_capture_err("num of frags in tso segment is %d\n", - (num_frags + 1)); - qdf_nbuf_free(netbuf); - return; - } - - tcp_seq_num = tso_seg->seg.tso_flags.tcp_seq_num; - tcp_seq_num = qdf_cpu_to_be32(tcp_seq_num); - - ip_len = tso_seg->seg.tso_flags.ip_len; - ip_len = qdf_cpu_to_be16(ip_len); - - for (frag_cnt = 0; frag_cnt <= num_frags; frag_cnt++) { - qdf_mem_copy( - qdf_nbuf_data(netbuf) + frag_len, - tso_seg->seg.tso_frags[frag_cnt].vaddr, - tso_seg->seg.tso_frags[frag_cnt].length); - frag_len += - tso_seg->seg.tso_frags[frag_cnt].length; - } - - qdf_mem_copy((qdf_nbuf_data(netbuf) + - IPV4_PKT_LEN_OFFSET), - &ip_len, sizeof(ip_len)); - qdf_mem_copy((qdf_nbuf_data(netbuf) + - IPV4_TCP_SEQ_NUM_OFFSET), - &tcp_seq_num, sizeof(tcp_seq_num)); - } else { - qdf_mem_copy(qdf_nbuf_data(netbuf), - qdf_nbuf_data(desc->nbuf), nbuf_len); - } - - if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) { - netbuf = qdf_nbuf_realloc_headroom(netbuf, - txcap_hdr_size); - if (!netbuf) { - QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, - QDF_TRACE_LEVEL_ERROR, - FL("No headroom")); - return; - } - } - - if (!qdf_nbuf_push_head(netbuf, txcap_hdr_size)) { - QDF_TRACE(QDF_MODULE_ID_PKT_CAPTURE, - QDF_TRACE_LEVEL_ERROR, FL("No headroom")); - qdf_nbuf_free(netbuf); - return; - } - - ptr_pktcapture_hdr = - (struct pkt_capture_tx_hdr_elem_t *)qdf_nbuf_data(netbuf); - qdf_mem_copy(ptr_pktcapture_hdr, &pktcapture_hdr, - txcap_hdr_size); - - pkt_capture_datapkt_process( - vdev_id, netbuf, TXRX_PROCESS_TYPE_DATA_TX_COMPL, - tid, status, TXRX_PKTCAPTURE_PKT_FORMAT_8023, - bssid, NULL, pktcapture_hdr.tx_retry_cnt); - break; } @@ -424,8 +524,19 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, return; } - pkt_capture_msdu_process_pkts(bssid, log_data, vdev_id, soc, - status); + if (frame_filter->data_rx_frame_filter & + PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { + pkt_capture_msdu_process_pkts(bssid, log_data, + vdev_id, soc, status); + } else if (pkt_capture_is_frame_filter_set( + nbuf, frame_filter, IEEE80211_FC1_DIR_FROMDS)) { + pkt_capture_msdu_process_pkts(bssid, log_data, + vdev_id, soc, status); + } else { + if (status == RX_OFFLOAD_PKT) + qdf_nbuf_free(nbuf); + } + break; } @@ -443,8 +554,19 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, return; } - pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, status, - nbuf); + if (frame_filter->data_rx_frame_filter & + PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { + pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, + status, nbuf); + } else if (pkt_capture_is_frame_filter_set( + nbuf, frame_filter, IEEE80211_FC1_DIR_FROMDS)) { + pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, + status, nbuf); + } else { + if (status == RX_OFFLOAD_PKT) + qdf_nbuf_free(nbuf); + } + break; } @@ -453,6 +575,8 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, struct htt_tx_offload_deliver_ind_hdr_t *offload_deliver_msg; bool is_pkt_during_roam = false; uint32_t freq = 0; + qdf_nbuf_t buf = log_data + + sizeof(struct htt_tx_offload_deliver_ind_hdr_t); if (!frame_filter->data_tx_frame_filter) return; @@ -470,9 +594,17 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, vdev_id = offload_deliver_msg->vdev_id; } - pkt_capture_offload_deliver_indication_handler( - log_data, - vdev_id, bssid, soc); + if (frame_filter->data_tx_frame_filter & + PKT_CAPTURE_DATA_FRAME_TYPE_ALL) { + pkt_capture_offload_deliver_indication_handler( + log_data, + vdev_id, bssid, soc); + } else if (pkt_capture_is_frame_filter_set( + buf, frame_filter, IEEE80211_FC1_DIR_TODS)) { + pkt_capture_offload_deliver_indication_handler( + log_data, + vdev_id, bssid, soc); + } break; } From 64be5a65516e52191a220d6511779c13207df965 Mon Sep 17 00:00:00 2001 From: Surabhi Vishnoi Date: Fri, 3 Sep 2021 11:19:20 +0530 Subject: [PATCH 41/60] qcacld-3.0: Add check for mgmt/ctrl rx packets in pkt capture Deliver management and control rx packets to monitor interface only if corresponding filter is set by vendor command. Change-Id: I3566af669cade4bca7eb3c5aafd00566799b54e2 --- .../core/src/wlan_pkt_capture_mgmt_txrx.c | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c index ec926368edcc..ff785c8a7998 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c @@ -426,17 +426,52 @@ pkt_capture_mgmt_rx_data_cb(struct wlan_objmgr_psoc *psoc, enum mgmt_frame_type frm_type) { struct mon_rx_status txrx_status = {0}; + struct pkt_capture_vdev_priv *vdev_priv; struct ieee80211_frame *wh; tpSirMacFrameCtl pfc; qdf_nbuf_t nbuf; int buf_len; struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_pdev *pdev; - if (!(pkt_capture_get_pktcap_mode(psoc) & PKT_CAPTURE_MODE_MGMT_ONLY)) { + vdev = pkt_capture_get_vdev(); + if (!vdev) { + pkt_capture_err("vdev is NULL"); qdf_nbuf_free(wbuf); return QDF_STATUS_E_FAILURE; } + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) { + pkt_capture_err("packet capture vdev priv is NULL"); + qdf_nbuf_free(wbuf); + return QDF_STATUS_E_FAILURE; + } + + pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(wbuf)); + + if (pfc->type == SIR_MAC_CTRL_FRAME && + !vdev_priv->frame_filter.ctrl_rx_frame_filter) + goto exit; + + if (pfc->type == SIR_MAC_MGMT_FRAME && + !vdev_priv->frame_filter.mgmt_rx_frame_filter) + goto exit; + + if (pfc->type == SIR_MAC_MGMT_FRAME) { + if (pfc->subType == SIR_MAC_MGMT_BEACON) { + if (vdev_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_NO_BEACON) + goto exit; + } else { + if (!((vdev_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL) || + (vdev_priv->frame_filter.mgmt_rx_frame_filter & + PKT_CAPTURE_MGMT_CONNECT_NO_BEACON))) + goto exit; + } + } + buf_len = qdf_nbuf_len(wbuf); nbuf = qdf_nbuf_alloc(NULL, roundup( buf_len + RESERVE_BYTES, 4), @@ -454,14 +489,12 @@ pkt_capture_mgmt_rx_data_cb(struct wlan_objmgr_psoc *psoc, pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(nbuf)); wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf); + pdev = wlan_vdev_get_pdev(vdev); + if ((pfc->type == IEEE80211_FC0_TYPE_MGT) && (pfc->subType == SIR_MAC_MGMT_DISASSOC || pfc->subType == SIR_MAC_MGMT_DEAUTH || pfc->subType == SIR_MAC_MGMT_ACTION)) { - struct wlan_objmgr_pdev *pdev; - - vdev = pkt_capture_get_vdev(); - pdev = wlan_vdev_get_pdev(vdev); if (pkt_capture_is_rmf_enabled(pdev, psoc, wh->i_addr1)) { QDF_STATUS status; @@ -501,6 +534,9 @@ pkt_capture_mgmt_rx_data_cb(struct wlan_objmgr_psoc *psoc, qdf_nbuf_free(nbuf); return QDF_STATUS_SUCCESS; +exit: + qdf_nbuf_free(wbuf); + return QDF_STATUS_SUCCESS; } QDF_STATUS pkt_capture_mgmt_rx_ops(struct wlan_objmgr_psoc *psoc, From 44627629357d1df4f5b0b46f7cc6bf0f77a2c0e5 Mon Sep 17 00:00:00 2001 From: Surabhi Vishnoi Date: Fri, 3 Sep 2021 13:49:31 +0530 Subject: [PATCH 42/60] qcacld-3.0: Add check for mgmt/ctrl tx packets in pkt capture Deliver management and control tx packets to monitor interface only if corresponding filter is set by vendor command. Change-Id: I580af04b2b7b9e749c1c710211193452b2b8d0f9 --- .../core/src/wlan_pkt_capture_mgmt_txrx.c | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c index ff785c8a7998..cb6679cf8f2c 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c @@ -329,15 +329,39 @@ void pkt_capture_mgmt_tx(struct wlan_objmgr_pdev *pdev, uint16_t chan_freq, uint8_t preamble_type) { + struct mgmt_offload_event_params params = {0}; + tpSirMacFrameCtl pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(nbuf)); + struct pkt_capture_vdev_priv *vdev_priv; + struct wlan_objmgr_vdev *vdev; qdf_nbuf_t wbuf; int nbuf_len; - struct mgmt_offload_event_params params = {0}; if (!pdev) { pkt_capture_err("pdev is NULL"); return; } + vdev = pkt_capture_get_vdev(); + if (!vdev) { + pkt_capture_err("vdev is NULL"); + return; + } + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) { + pkt_capture_err("packet capture vdev priv is NULL"); + return; + } + + if (pfc->type == IEEE80211_FC0_TYPE_MGT && + !(vdev_priv->frame_filter.mgmt_tx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL)) + return; + + if (pfc->type == IEEE80211_FC0_TYPE_CTL && + !vdev_priv->frame_filter.ctrl_tx_frame_filter) + return; + nbuf_len = qdf_nbuf_len(nbuf); wbuf = qdf_nbuf_alloc(NULL, roundup(nbuf_len + RESERVE_BYTES, 4), RESERVE_BYTES, 4, false); @@ -380,6 +404,9 @@ pkt_capture_mgmt_tx_completion(struct wlan_objmgr_pdev *pdev, uint32_t status, struct mgmt_offload_event_params *params) { + struct pkt_capture_vdev_priv *vdev_priv; + struct wlan_objmgr_vdev *vdev; + tpSirMacFrameCtl pfc; qdf_nbuf_t wbuf, nbuf; int nbuf_len; @@ -388,9 +415,30 @@ pkt_capture_mgmt_tx_completion(struct wlan_objmgr_pdev *pdev, return; } + vdev = pkt_capture_get_vdev(); + if (!vdev) { + pkt_capture_err("vdev is NULL"); + return; + } + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) { + pkt_capture_err("packet capture vdev priv is NULL"); + return; + } + nbuf = mgmt_txrx_get_nbuf(pdev, desc_id); if (!nbuf) return; + pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(nbuf)); + if (pfc->type == IEEE80211_FC0_TYPE_MGT && + !(vdev_priv->frame_filter.mgmt_tx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL)) + return; + + if (pfc->type == IEEE80211_FC0_TYPE_CTL && + !vdev_priv->frame_filter.ctrl_tx_frame_filter) + return; nbuf_len = qdf_nbuf_len(nbuf); wbuf = qdf_nbuf_alloc(NULL, roundup(nbuf_len + RESERVE_BYTES, 4), From 01d8ca3009313e9ca6548e250edb4654abf71ab4 Mon Sep 17 00:00:00 2001 From: Surabhi Vishnoi Date: Mon, 27 Sep 2021 16:47:35 +0530 Subject: [PATCH 43/60] qcacld-3.0: Deliver tx offload mgmt pkts based on filter Deliver tx offload management to mon interface in packet capture mode based on config filters added by vendor command. Change-Id: Ib60e6d2f62ad8d69de2e47f02796a32b8ce7aacb --- .../core/inc/wlan_pkt_capture_main.h | 8 +++++++ .../core/src/wlan_pkt_capture_main.c | 24 +++++++++++++++++++ .../src/wlan_pkt_capture_ucfg_api.c | 8 ++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h index 2cd4f75115c2..cb48a75b7b8d 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_main.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_main.h @@ -230,6 +230,14 @@ void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu, QDF_STATUS pkt_capture_set_filter(struct pkt_capture_frame_filter frame_filter, struct wlan_objmgr_vdev *vdev); +/** + * pkt_capture_is_tx_mgmt_enable - Check if tx mgmt frames enabled + * @pdev: pointer to pdev + * + * Return: bool + */ +bool pkt_capture_is_tx_mgmt_enable(struct wlan_objmgr_pdev *pdev); + #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 /** * pkt_capture_get_pktcap_mode_v2 - Get packet capture mode diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 0b793d3711ff..993178e1f17b 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -650,6 +650,30 @@ enum pkt_capture_mode pkt_capture_get_mode(struct wlan_objmgr_psoc *psoc) return psoc_priv->cfg_param.pkt_capture_mode; } +bool pkt_capture_is_tx_mgmt_enable(struct wlan_objmgr_pdev *pdev) +{ + struct pkt_capture_vdev_priv *vdev_priv; + struct wlan_objmgr_vdev *vdev; + + vdev = pkt_capture_get_vdev(); + if (!vdev) { + pkt_capture_err("vdev is NULL"); + return false; + } + + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) { + pkt_capture_err("vdev_priv is NULL"); + return false; + } + + if (!(vdev_priv->frame_filter.mgmt_tx_frame_filter & + PKT_CAPTURE_MGMT_FRAME_TYPE_ALL)) + return false; + + return true; +} + QDF_STATUS pkt_capture_register_callbacks(struct wlan_objmgr_vdev *vdev, QDF_STATUS (*mon_cb)(void *, qdf_nbuf_t), diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 135ed9a178ae..0fca2f29046d 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -229,9 +229,15 @@ ucfg_pkt_capture_process_mgmt_tx_data(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t nbuf, uint8_t status) { - return pkt_capture_process_mgmt_tx_data( + if (pkt_capture_is_tx_mgmt_enable(pdev)) + return pkt_capture_process_mgmt_tx_data( pdev, params, nbuf, pkt_capture_mgmt_status_map(status)); + + else { + qdf_nbuf_free(nbuf); + return QDF_STATUS_SUCCESS; + } } void From c8e1fdd8906315d3c3884705c3b667bfae59496f Mon Sep 17 00:00:00 2001 From: Maheswara Sarma Date: Sat, 13 Nov 2021 20:29:46 +0530 Subject: [PATCH 44/60] qcacld-3.0: revert Disable TX_AGGREGATION_SIZE ini for HSP Change-Id: I9524c1dc579d9d642663072c1094b794756c70fc --- configs/default_defconfig | 1 - core/wma/src/wma_features.c | 7 ------- 2 files changed, 8 deletions(-) diff --git a/configs/default_defconfig b/configs/default_defconfig index 9a37b05df498..84d823a15564 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -50,7 +50,6 @@ ifeq ($(CONFIG_CNSS_QCA6490), y) CONFIG_GENERIC_SHADOW_REGISTER_ACCESS_ENABLE :=y CONFIG_WLAN_TWT_SAP_STA_COUNT := y CONFIG_WLAN_TWT_SAP_PDEV_COUNT := y - CONFIG_TX_AGGREGATION_SIZE_ENABLE := n CONFIG_DUMP_REO_QUEUE_INFO_IN_DDR :=y endif diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index bf97ed9a42df..8c1a30ebcb72 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -4049,11 +4049,6 @@ QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id, /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) cmd->enable_bitmap |= 0x04; - /* bit 3 (tx_aggr_size_disable): If set tx_aggr_size is invalid */ - if (rx_size == 0) - cmd->enable_bitmap |= (0x1 << 3); - - cmd->enable_bitmap |= (0x1 << 6); wma_debug("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d", cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id, @@ -4130,8 +4125,6 @@ QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle, } /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */ - if (cmd->rx_aggr_size != 0) - cmd->enable_bitmap = 0x20 | queue_num; cmd->enable_bitmap |= 0x20 | queue_num; /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */ if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU) From 19de3826b2e05403658a5347eb7563d77c9fb908 Mon Sep 17 00:00:00 2001 From: Surabhi Vishnoi Date: Tue, 18 Jan 2022 16:38:58 +0530 Subject: [PATCH 45/60] qcacld-3.0: roam latency optimisation changes This change optimises the time to enable the TX queues during roaming by deferring the roam and auth indication to userspace and wpa_supplicant. Also, ignore tx power stats if the roaming is in progress. Change-Id: I1724022de3b87482e4e4a35efac358de9f6a367d CRs-Fixed: 3119070 --- core/hdd/src/wlan_hdd_assoc.c | 71 +++++++++++++++++++---------------- core/hdd/src/wlan_hdd_power.c | 4 +- 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index e410040400d9..ac403672898c 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -3061,9 +3061,6 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, sta_ctx->ap_supports_immediate_power_save); } - /* Indicate 'connect' status to user space */ - hdd_send_association_event(dev, roam_info); - if (policy_mgr_is_mcc_in_24G(hdd_ctx->psoc)) { if (hdd_ctx->miracast_value) wlan_hdd_set_mas(adapter, @@ -3265,6 +3262,27 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, assoc_req_len = 0; } + if (!hddDisconInProgress) { + /* + * Perform any WMM-related association + * processing. + */ + hdd_wmm_assoc(adapter, roam_info, + eCSR_BSS_TYPE_INFRASTRUCTURE); + + /* + * Register the Station with DP after associated + */ + qdf_status = hdd_roam_register_sta(adapter, + roam_info, + roam_info->bss_desc); + hdd_debug("Enabling queues"); + hdd_netif_queue_enable(adapter); + } + + /* Indicate 'connect' status to user space */ + hdd_send_association_event(dev, roam_info); + if ((roam_info->u.pConnectedProfile->AuthType == eCSR_AUTH_TYPE_FT_RSN) || (roam_info->u.pConnectedProfile->AuthType == @@ -3406,38 +3424,10 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, conn_info_freq); } } - if (!hddDisconInProgress) { - /* - * Perform any WMM-related association - * processing. - */ - hdd_wmm_assoc(adapter, roam_info, - eCSR_BSS_TYPE_INFRASTRUCTURE); - - /* - * Register the Station with DP after associated - */ - qdf_status = hdd_roam_register_sta(adapter, - roam_info, - roam_info->bss_desc); - hdd_debug("Enabling queues"); - hdd_netif_queue_enable(adapter); - } } else { - /* - * wpa supplicant expecting WPA/RSN IE in connect result - * in case of reassociation also need to indicate it to - * supplicant. - */ - sme_roam_get_wpa_rsn_req_ie( - mac_handle, - adapter->vdev_id, - &reqRsnLength, reqRsnIe); - cdp_hl_fc_set_td_limit(soc, adapter->vdev_id, conn_info_freq); - hdd_send_re_assoc_event(dev, adapter, roam_info, - reqRsnIe, reqRsnLength); + /* Reassoc successfully */ if (roam_info->fAuthRequired) { qdf_status = @@ -3475,7 +3465,24 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, /* Start the tx queues */ hdd_debug("Enabling queues"); hdd_netif_queue_enable(adapter); + + /* Indicate 'connect' status to user space */ + hdd_send_association_event(dev, roam_info); + + /* + * wpa supplicant expecting WPA/RSN IE in connect result + * in case of reassociation also need to indicate it to + * supplicant. + */ + sme_roam_get_wpa_rsn_req_ie( + mac_handle, + adapter->vdev_id, + &reqRsnLength, reqRsnIe); + + hdd_send_re_assoc_event(dev, adapter, roam_info, + reqRsnIe, reqRsnLength); } + qdf_mem_free(reqRsnIe); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index 4c63bfabf304..7ce05521d729 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -2954,8 +2954,8 @@ static int __wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy, HDD_IS_RATE_LIMIT_REQ(is_rate_limited, hdd_ctx->config->nb_commands_interval); if (hdd_ctx->driver_status != DRIVER_MODULES_ENABLED || - is_rate_limited) { - hdd_debug("Modules not enabled/rate limited, use cached stats"); + is_rate_limited || hdd_is_roaming_in_progress(hdd_ctx)) { + hdd_debug("Modules not enabled/rate limited/roaming, use cached stats"); /* Send cached data to upperlayer*/ *dbm = adapter->hdd_stats.class_a_stat.max_pwr; return 0; From 6fa39f5836ce4bf9d90defaf446ec415a73278a0 Mon Sep 17 00:00:00 2001 From: Krupali Dhanvijay Date: Wed, 19 Jan 2022 10:39:39 +0530 Subject: [PATCH 46/60] qcacld-3.0: Do not reserve NAN discovery vdev in case of FTM mode If firmware supports NAN discovery vdev then one vdev is reserved for NAN. Do not reserve NAN discovery vdev in case of FTM mode. Change-Id: Ie16df46bbb09dd89889639d40dc1a65e3786ce73 CRs-Fixed: 2830136 --- core/wma/src/wma_main.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 16812d9723fb..17355e9e7f9d 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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 @@ -6975,11 +6976,14 @@ int wma_rx_service_ready_ext_event(void *handle, uint8_t *event, * indicate 3 vdevs and firmware shall add 1 vdev for NAN. So decrement * the num_vdevs by 1. */ - if (ucfg_nan_is_vdev_creation_allowed(wma_handle->psoc)) { - wlan_res_cfg->nan_separate_iface_support = true; - } else { - wlan_res_cfg->num_vdevs--; - wma_update_num_peers_tids(wma_handle, wlan_res_cfg); + + if (QDF_GLOBAL_FTM_MODE != cds_get_conparam()) { + if (ucfg_nan_is_vdev_creation_allowed(wma_handle->psoc)) { + wlan_res_cfg->nan_separate_iface_support = true; + } else { + wlan_res_cfg->num_vdevs--; + wma_update_num_peers_tids(wma_handle, wlan_res_cfg); + } } if ((ucfg_pkt_capture_get_mode(wma_handle->psoc) != From 3f31c7fbf66028b588f2bca1b607aba1903e26de Mon Sep 17 00:00:00 2001 From: Surabhi Vishnoi Date: Thu, 27 Jan 2022 14:42:07 +0530 Subject: [PATCH 47/60] qcacld-3.0: Reduce the log level to optimise the roam time TWT initialisation will fail for each non 11ax connection so an error log is not needed if peer object for TWT is not found. Also, RIC data is not mandatory in FT session, so if its not present, log a debug level print instead of error level. Change-Id: I7fec9f88aa68b2ae947e34a1aede311e9fed2d05 CRs-Fixed: 3117535 From 09ba57f25267e7b1f2c4b10719a5c8fe4b3deaa1 Mon Sep 17 00:00:00 2001 From: Krupali Dhanvijay Date: Tue, 25 Jan 2022 15:04:19 +0530 Subject: [PATCH 48/60] qcacld-3.0: Add support to configure 6G roam scan dwell time Add ini support to configure 6GHz active and passive scan dwell time and send this to firmware to be used for LFR scans via WMI_ROAM_SCAN_MODE. Based on these values, firmware will use host sent values else use hardcoded values. Currently firmware uses hardcoded values to configure 6Ghz roam scan dwell time. With this change user can configure it using INI. Change-Id: I90e79ad59eef7f73faa0b9dfd2d38b65aca12285 CRs-Fixed: 3116861 --- components/wmi/src/wmi_unified_roam_tlv.c | 8 +++++++- core/sme/src/csr/csr_api_roam.c | 24 ++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/components/wmi/src/wmi_unified_roam_tlv.c b/components/wmi/src/wmi_unified_roam_tlv.c index ea5baa732c77..20847eebe623 100644 --- a/components/wmi/src/wmi_unified_roam_tlv.c +++ b/components/wmi/src/wmi_unified_roam_tlv.c @@ -2339,6 +2339,10 @@ wmi_fill_rso_start_scan_tlv(struct wlan_roam_scan_offload_params *rso_req, scan_tlv->idle_time = src_scan_params->idle_time; scan_tlv->n_probes = src_scan_params->n_probes; scan_tlv->scan_ctrl_flags |= src_scan_params->scan_ctrl_flags; + scan_tlv->dwell_time_active_6ghz = + src_scan_params->dwell_time_active_6ghz; + scan_tlv->dwell_time_passive_6ghz = + src_scan_params->dwell_time_passive_6ghz; WMI_SCAN_SET_DWELL_MODE(scan_tlv->scan_ctrl_flags, src_scan_params->rso_adaptive_dwell_mode); @@ -2351,8 +2355,10 @@ wmi_fill_rso_start_scan_tlv(struct wlan_roam_scan_offload_params *rso_req, scan_tlv->scan_ctrl_flags_ext |= WMI_SCAN_DBS_POLICY_DEFAULT; - wmi_debug("RSO_CFG: dwell time: active %d passive %d, minrest %d max rest %d repeat probe time %d probe_spacing:%d", + wmi_debug("RSO_CFG: dwell time: active %d passive %d, active 6g %d passive 6g %d, minrest %d max rest %d repeat probe time %d probe_spacing:%d", scan_tlv->dwell_time_active, scan_tlv->dwell_time_passive, + scan_tlv->dwell_time_active_6ghz, + scan_tlv->dwell_time_passive_6ghz, scan_tlv->min_rest_time, scan_tlv->max_rest_time, scan_tlv->repeat_probe_time, scan_tlv->probe_spacing_time); wmi_debug("RSO_CFG: ctrl_flags:0x%x probe_delay:%d max_scan_time:%d idle_time:%d n_probes:%d", diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 096f812bf679..a671bf1620a7 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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 @@ -18674,6 +18674,26 @@ csr_cm_roam_scan_offload_fill_lfr3_config( } #endif +#ifdef CONFIG_BAND_6GHZ +static void +csr_cm_fill_6ghz_dwell_times(struct wlan_objmgr_psoc *psoc, + struct wlan_roam_scan_params *scan_params) +{ + wlan_scan_cfg_get_active_6g_dwelltime( + psoc, + &scan_params->dwell_time_active_6ghz); + + wlan_scan_cfg_get_passive_6g_dwelltime( + psoc, + &scan_params->dwell_time_passive_6ghz); +} +#else +static inline void +csr_cm_fill_6ghz_dwell_times(struct wlan_objmgr_psoc *psoc, + struct wlan_roam_scan_params *scan_params) +{} +#endif + static void csr_cm_roam_scan_offload_fill_scan_params( struct mac_context *mac, @@ -18794,6 +18814,8 @@ csr_cm_roam_scan_offload_fill_scan_params( scan_params->rso_adaptive_dwell_mode = mac->mlme_cfg->lfr.adaptive_roamscan_dwell_mode; + + csr_cm_fill_6ghz_dwell_times(mac->psoc, scan_params); } /** From 049f256b704eabd5f906a6d4c84a09f4aa958c35 Mon Sep 17 00:00:00 2001 From: Surabhi Vishnoi Date: Tue, 18 Jan 2022 16:38:58 +0530 Subject: [PATCH 49/60] qcacld-3.0: Optimize the roam latency time This change optimizes the time to enable the TX queues during connect/roaming by deferring the oem response to userspace and roam_auth indication to wpa_supplicant. Also, ignore tx power stats if the roaming is in progress. Change-Id: Ic5de5cbe369e92302ad51523082dcb629d53d4ff CRs-Fixed: 3119070 --- core/hdd/src/wlan_hdd_assoc.c | 18 ++++++++++++------ core/hdd/src/wlan_hdd_power.c | 3 ++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index aec25c29e78b..eafa7ac91347 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -3085,12 +3085,6 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, sta_ctx->ap_supports_immediate_power_save); } - if (policy_mgr_is_mcc_in_24G(hdd_ctx->psoc)) { - if (hdd_ctx->miracast_value) - wlan_hdd_set_mas(adapter, - hdd_ctx->miracast_value); - } - /* Initialize the Linkup event completion variable */ INIT_COMPLETION(adapter->linkup_event_var); @@ -3307,6 +3301,12 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, /* Indicate 'connect' status to user space */ hdd_send_association_event(dev, roam_info); + if (policy_mgr_is_mcc_in_24G(hdd_ctx->psoc)) { + if (hdd_ctx->miracast_value) + wlan_hdd_set_mas(adapter, + hdd_ctx->miracast_value); + } + if ((roam_info->u.pConnectedProfile->AuthType == eCSR_AUTH_TYPE_FT_RSN) || (roam_info->u.pConnectedProfile->AuthType == @@ -3493,6 +3493,12 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, /* Indicate 'connect' status to user space */ hdd_send_association_event(dev, roam_info); + if (policy_mgr_is_mcc_in_24G(hdd_ctx->psoc)) { + if (hdd_ctx->miracast_value) + wlan_hdd_set_mas(adapter, + hdd_ctx->miracast_value); + } + /* * wpa supplicant expecting WPA/RSN IE in connect result * in case of reassociation also need to indicate it to diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index 0e208c95a8bd..e672764d0287 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -2938,7 +2938,8 @@ static int __wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy, case QDF_STA_MODE: case QDF_P2P_CLIENT_MODE: sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); - if (sta_ctx->hdd_reassoc_scenario) { + if (sta_ctx->hdd_reassoc_scenario || + hdd_is_roaming_in_progress(hdd_ctx)) { hdd_debug("Roaming is in progress, rej this req"); return -EINVAL; } From 4ad3c3d1acca7ef82caa8b13f6cfd4baa49b300f Mon Sep 17 00:00:00 2001 From: Surya Prakash Sivaraj Date: Thu, 28 Apr 2022 19:46:42 +0530 Subject: [PATCH 50/60] qcacld-3.0: Update preauth candidate entry to scan table During SAE roam auth offload, update the beacon/probe response frame coming from the FW via WMI_ROAM_FRAME_EVENTID into the scan db. When the bss info of the preauth candidate is unavailable in the host/kernel scan entry, supplicant fails to determine the proper SAE PWE config of the peer and the commit request fails. Change-Id: Ia782ece7bebf8274f949fe9fb3b2a2882bf47597 CRs-Fixed: 3075458 --- core/mac/inc/sir_api.h | 15 ++++ core/mac/src/pe/lim/lim_api.c | 3 +- core/sme/inc/csr_neighbor_roam.h | 13 +++- core/sme/src/common/sme_api.c | 2 + core/sme/src/csr/csr_api_roam.c | 122 +++++++++++++++++++++++++++++++ core/wma/inc/wma.h | 3 + core/wma/inc/wma_internal.h | 11 +++ core/wma/inc/wma_types.h | 12 ++- core/wma/src/wma_main.c | 5 ++ core/wma/src/wma_mgmt.c | 8 +- core/wma/src/wma_scan_roam.c | 66 +++++++++++++++++ 11 files changed, 254 insertions(+), 6 deletions(-) diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 07bfe3bb0e91..a595bb0f2cec 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -482,6 +482,9 @@ struct sme_ready_req { uint16_t deauth_disassoc_frame_len, uint16_t reason_code); csr_roam_pmkid_req_fn_t csr_roam_pmkid_req_cb; + QDF_STATUS (*csr_roam_candidate_event_cb)(struct mac_context *mac, + uint8_t *frame, + uint32_t len); }; /** @@ -2929,6 +2932,18 @@ struct roam_offload_synch_ind { enum wlan_phymode phy_mode; /*phy mode sent by fw */ }; +/* + * struct roam_scan_candidate_frame Roam candidate scan entry + * vdev_id : vdev id + * frame_len : Length of the beacon/probe rsp frame + * frame : Pointer to the frame + */ +struct roam_scan_candidate_frame { + uint8_t vdev_id; + uint32_t frame_length; + uint8_t *frame; +}; + #ifdef WLAN_FEATURE_ROAM_OFFLOAD struct handoff_failure_ind { uint8_t vdev_id; diff --git a/core/mac/src/pe/lim/lim_api.c b/core/mac/src/pe/lim/lim_api.c index 4872771f9eee..7433c5275baa 100644 --- a/core/mac/src/pe/lim/lim_api.c +++ b/core/mac/src/pe/lim/lim_api.c @@ -1356,7 +1356,8 @@ void pe_register_callbacks_with_wma(struct mac_context *mac, ready_req->csr_roam_auth_event_handle_cb, ready_req->pe_roam_synch_cb, ready_req->pe_disconnect_cb, - ready_req->csr_roam_pmkid_req_cb); + ready_req->csr_roam_pmkid_req_cb, + ready_req->csr_roam_candidate_event_cb); if (status != QDF_STATUS_SUCCESS) pe_err("Registering roaming callbacks with WMA failed"); } diff --git a/core/sme/inc/csr_neighbor_roam.h b/core/sme/inc/csr_neighbor_roam.h index b2d6df7da07b..9c1b0e2cb8bf 100644 --- a/core/sme/inc/csr_neighbor_roam.h +++ b/core/sme/inc/csr_neighbor_roam.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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 @@ -380,6 +381,7 @@ QDF_STATUS csr_process_roam_pmkid_req_callback(struct mac_context *mac_ctx, uint8_t vdev_id, struct roam_pmkid_req_event *roam_bsslist); + #else static inline QDF_STATUS csr_roam_pmkid_req_callback(uint8_t vdev_id, @@ -388,7 +390,9 @@ csr_roam_pmkid_req_callback(uint8_t vdev_id, return QDF_STATUS_SUCCESS; } #endif /* WLAN_FEATURE_FIPS */ - +QDF_STATUS +csr_roam_candidate_event_handle_callback(struct mac_context *mac_ctx, + uint8_t *frame, uint32_t len); #else static inline QDF_STATUS csr_roam_synch_callback(struct mac_context *mac, struct roam_offload_synch_ind *roam_synch_data, @@ -420,6 +424,13 @@ csr_roam_pmkid_req_callback(uint8_t vdev_id, { return QDF_STATUS_E_NOSUPPORT; } + +QDF_STATUS +csr_roam_candidate_event_handle_callback(struct mac_context *mac_ctx, + uint8_t *frame, uint32_t len) +{ + return QDF_STATUS_SUCCESS; +} #endif void csr_neighbor_roam_state_transition(struct mac_context *mac_ctx, uint8_t newstate, uint8_t session); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index cef5746de8bf..19efa85e80e5 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -1185,6 +1185,8 @@ QDF_STATUS sme_hdd_ready_ind(mac_handle_t mac_handle) msg->csr_roam_auth_event_handle_cb = csr_roam_auth_offload_callback; msg->csr_roam_pmkid_req_cb = csr_roam_pmkid_req_callback; + msg->csr_roam_candidate_event_cb = + csr_roam_candidate_event_handle_callback; status = u_mac_post_ctrl_msg(mac_handle, (tSirMbMsg *)msg); if (QDF_IS_STATUS_ERROR(status)) { diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 185db6359ad4..165ac18e190c 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -21938,6 +21938,128 @@ csr_roam_auth_offload_callback(struct mac_context *mac_ctx, return status; } + +static +void csr_inform_bcn_probe(struct mac_context *mac_ctx, + uint8_t *frame, uint32_t len, + qdf_freq_t freq) +{ + qdf_nbuf_t buf; + uint8_t *data, i; + struct mgmt_rx_event_params rx_param = {0}; + struct wlan_frame_hdr *hdr; + enum mgmt_frame_type frm_type = MGMT_BEACON; + + hdr = (struct wlan_frame_hdr *)frame; + + if ((hdr->i_fc[0] & QDF_IEEE80211_FC0_SUBTYPE_MASK) == + MGMT_SUBTYPE_PROBE_RESP) + frm_type = MGMT_PROBE_RESP; + + rx_param.pdev_id = 0; + rx_param.chan_freq = freq; + /* Real RSSI will be filled after roam sync */ + rx_param.rssi = 0; + + /* Set all per chain rssi as invalid */ + for (i = 0; i < WLAN_MGMT_TXRX_HOST_MAX_ANTENNA; i++) + rx_param.rssi_ctl[i] = WLAN_INVALID_PER_CHAIN_RSSI; + + buf = qdf_nbuf_alloc(NULL, qdf_roundup(len, 4), 0, 4, false); + if (!buf) + return; + + qdf_nbuf_put_tail(buf, len); + qdf_nbuf_set_protocol(buf, ETH_P_CONTROL); + + data = qdf_nbuf_data(buf); + qdf_mem_copy(data, frame, len); + /* buf will be freed by scan module in error or success case */ + wlan_scan_process_bcn_probe_rx_sync(wlan_pdev_get_psoc(mac_ctx->pdev), + buf, &rx_param, frm_type); +} + +QDF_STATUS +csr_roam_candidate_event_handle_callback(struct mac_context *mac_ctx, + uint8_t *frame, uint32_t len) +{ + uint32_t ie_offset, ie_len; + uint8_t *ie_ptr = NULL; + uint8_t *extracted_ie = NULL; + uint8_t primary_channel, band; + qdf_freq_t op_freq; + + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_MLME, QDF_TRACE_LEVEL_DEBUG, + frame, len); + + /* Fixed parameters offset */ + ie_offset = sizeof(struct wlan_frame_hdr) + SIR_MAC_B_PR_SSID_OFFSET; + + if (len <= ie_offset) { + mlme_err("Invalid frame length"); + return QDF_STATUS_E_FAILURE; + } + + ie_ptr = frame + ie_offset; + ie_len = len - ie_offset; + + /* For 2.4GHz,5GHz get channel from DS IE */ + extracted_ie = (uint8_t *)wlan_get_ie_ptr_from_eid(WLAN_ELEMID_DSPARMS, + ie_ptr, ie_len); + + if (extracted_ie && extracted_ie[0] == WLAN_ELEMID_DSPARMS && + extracted_ie[1] == WLAN_DS_PARAM_IE_MAX_LEN) { + band = BIT(REG_BAND_2G) | BIT(REG_BAND_5G); + primary_channel = *(extracted_ie + 2); + sme_debug("Extracted primary channel from DS : %d", + primary_channel); + goto update_beacon; + } + + /* For HT, VHT and non-6GHz HE, get channel from HTINFO IE */ + extracted_ie = (uint8_t *) + wlan_get_ie_ptr_from_eid(WLAN_ELEMID_HTINFO_ANA, + ie_ptr, ie_len); + if (extracted_ie && extracted_ie[0] == WLAN_ELEMID_HTINFO_ANA && + extracted_ie[1] == sizeof(struct wlan_ie_htinfo_cmn)) { + band = BIT(REG_BAND_2G) | BIT(REG_BAND_5G); + primary_channel = + ((struct wlan_ie_htinfo *)extracted_ie)-> + hi_ie.hi_ctrlchannel; + sme_debug("Extracted primary channel from HT INFO : %d", + primary_channel); + goto update_beacon; + } + + /* For 6GHz, get channel from HE OP IE */ + extracted_ie = (uint8_t *) + wlan_get_ext_ie_ptr_from_ext_id(WLAN_HEOP_OUI_TYPE, + (uint8_t) + WLAN_HEOP_OUI_SIZE, + ie_ptr, ie_len); + + if (extracted_ie && + !qdf_mem_cmp(&extracted_ie[2], WLAN_HEOP_OUI_TYPE, + WLAN_HEOP_OUI_SIZE) && + extracted_ie[1] <= WLAN_MAX_HEOP_IE_LEN) { + band = BIT(REG_BAND_6G); + primary_channel = util_scan_get_6g_oper_channel(extracted_ie); + sme_debug("Extracted primary channel from HE OP : %d", + primary_channel); + if (primary_channel) + goto update_beacon; + } + + mlme_err("Primary channel was not found in the candidate scan entry"); + return QDF_STATUS_E_FAILURE; + +update_beacon: + op_freq = wlan_reg_chan_band_to_freq(mac_ctx->pdev, + primary_channel, band); + sme_debug("Roaming candidate frequency : %d", op_freq); + csr_inform_bcn_probe(mac_ctx, frame, len, op_freq); + return QDF_STATUS_SUCCESS; +} #endif QDF_STATUS csr_update_owe_info(struct mac_context *mac, diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 8821fa6995a0..5474fe767d0f 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -1012,6 +1012,9 @@ typedef struct { uint16_t reason_code); QDF_STATUS (*csr_roam_pmkid_req_cb)(uint8_t vdev_id, struct roam_pmkid_req_event *bss_list); + QDF_STATUS (*csr_roam_candidate_event_cb)(struct mac_context *mac, + uint8_t *frame, + uint32_t len); qdf_wake_lock_t wmi_cmd_rsp_wake_lock; qdf_runtime_lock_t wmi_cmd_rsp_runtime_lock; qdf_runtime_lock_t sap_prevent_runtime_pm_lock; diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index 40fda877feca..1d7f88d5392c 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -312,6 +312,17 @@ void wma_report_real_time_roam_stats(struct wlan_objmgr_psoc *psoc, enum roam_rt_stats_type events, struct mlme_roam_debug_info *roam_info, uint32_t value, uint32_t reason); + +/** + * wma_roam_candidate_frame_event_handler - Handles wma roam frame event id + * @handle: wma_handle + * @event: event data + * @len: length of the data + * + *Return: Success or Failure status + */ +int wma_roam_candidate_frame_event_handler(void *handle, uint8_t *event, + uint32_t len); #else static inline int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h index 7a298bf070b7..62b4c204756c 100644 --- a/core/wma/inc/wma_types.h +++ b/core/wma/inc/wma_types.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. 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 @@ -738,7 +738,10 @@ QDF_STATUS wma_register_roaming_callbacks( uint8_t *deauth_disassoc_frame, uint16_t deauth_disassoc_frame_len, uint16_t reason_code), - csr_roam_pmkid_req_fn_t csr_roam_pmkid_req_cb); + csr_roam_pmkid_req_fn_t csr_roam_pmkid_req_cb, + QDF_STATUS (*csr_roam_candidate_event_cb)(struct mac_context *mac, + uint8_t *frame, + uint32_t len)); #else static inline QDF_STATUS wma_register_roaming_callbacks( csr_roam_synch_fn_t csr_roam_synch_cb, @@ -752,7 +755,10 @@ static inline QDF_STATUS wma_register_roaming_callbacks( uint8_t *deauth_disassoc_frame, uint16_t deauth_disassoc_frame_len, uint16_t reason_code), - csr_roam_pmkid_req_fn_t csr_roam_pmkid_req_cb) + csr_roam_pmkid_req_fn_t csr_roam_pmkid_req_cb, + QDF_STATUS (*csr_roam_candidate_event_cb)(struct mac_context *mac, + uint8_t *frame, + uint32_t len)) { return QDF_STATUS_E_NOSUPPORT; } diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 9261497cbdf6..0022d35dd71e 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -3413,6 +3413,11 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc, wma_roam_vdev_disconnect_event_handler, WMA_RX_SERIALIZER_CTX); + wmi_unified_register_event_handler(wma_handle->wmi_handle, + wmi_roam_frame_event_id, + wma_roam_candidate_frame_event_handler, + WMA_RX_SERIALIZER_CTX); + #endif /* WLAN_FEATURE_ROAM_OFFLOAD */ wmi_unified_register_event_handler(wma_handle->wmi_handle, wmi_rssi_breach_event_id, diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index aa3b23e4087d..e6136508c682 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -3699,6 +3699,8 @@ QDF_STATUS wma_de_register_mgmt_frm_client(void) * @pe_roam_synch_cb: PE roam synch callback routine pointer * @csr_roam_auth_event_handle_cb: CSR callback routine pointer * @csr_roam_pmkid_req_cb: CSR roam pmkid callback routine pointer + * @csr_roam_candidate_event_handle_cb: CSR roam candidate callback + * routine pointer * * Register the SME and PE callback routines with WMA for * handling roaming @@ -3716,7 +3718,9 @@ QDF_STATUS wma_register_roaming_callbacks( uint8_t *deauth_disassoc_frame, uint16_t deauth_disassoc_frame_len, uint16_t reason_code), - csr_roam_pmkid_req_fn_t csr_roam_pmkid_req_cb) + csr_roam_pmkid_req_fn_t csr_roam_pmkid_req_cb, + QDF_STATUS (*csr_roam_candidate_event_cb)(struct mac_context *mac, + uint8_t *frame, uint32_t len)) { tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA); @@ -3729,6 +3733,8 @@ QDF_STATUS wma_register_roaming_callbacks( wma->csr_roam_auth_event_handle_cb = csr_roam_auth_event_handle_cb; wma->pe_roam_synch_cb = pe_roam_synch_cb; wma->pe_disconnect_cb = pe_disconnect_cb; + wma->csr_roam_candidate_event_cb = + csr_roam_candidate_event_cb; wma_debug("Registered roam synch callbacks with WMA successfully"); wma->csr_roam_pmkid_req_cb = csr_roam_pmkid_req_cb; diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index ce2d886c0e6d..63cc777ef924 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -2611,6 +2611,72 @@ int wma_roam_stats_event_handler(WMA_HANDLE handle, uint8_t *event, err: return -EINVAL; } + +int wma_roam_candidate_frame_event_handler(void *handle, uint8_t *event, + uint32_t len) +{ + tp_wma_handle wma = (tp_wma_handle) handle; + WMI_ROAM_FRAME_EVENTID_param_tlvs *param_buf = NULL; + wmi_roam_frame_event_fixed_param *frame_params = NULL; + struct roam_scan_candidate_frame *data; + struct mac_context *mac_ctx; + QDF_STATUS status; + + if (!event || !len) { + wma_err("Empty roam candidate frame event"); + return QDF_STATUS_E_FAILURE; + } + + param_buf = (WMI_ROAM_FRAME_EVENTID_param_tlvs *)event; + if (!param_buf) { + wma_err("Received null buf from target"); + return -EINVAL; + } + + frame_params = + (wmi_roam_frame_event_fixed_param *)param_buf->fixed_param; + + if (!wma_is_vdev_valid(frame_params->vdev_id)) { + wma_err("Invalid vdev id %d", frame_params->vdev_id); + return QDF_STATUS_E_FAILURE; + } + + if (frame_params->frame_length > param_buf->num_frame) { + wma_err("Invalid frame length %d expected : %d", + frame_params->frame_length, + param_buf->num_frame); + return QDF_STATUS_E_FAILURE; + } + + if (!param_buf->frame) { + wmi_err("Frame pointer is Null"); + return QDF_STATUS_E_FAILURE; + } + + mac_ctx = cds_get_context(QDF_MODULE_ID_PE); + + if (!mac_ctx) { + wma_err("NULL mac ptr"); + QDF_ASSERT(0); + return -EINVAL; + } + + data = qdf_mem_malloc(sizeof(*data)); + + if (!data) + return -ENOMEM; + + data->vdev_id = frame_params->vdev_id; + data->frame_length = frame_params->frame_length; + data->frame = (uint8_t *)param_buf->frame; + + status = wma->csr_roam_candidate_event_cb(mac_ctx, data->frame, + data->frame_length); + qdf_mem_free(data); + + return QDF_STATUS_SUCCESS; +} + #endif /** From d1a4eedae5987115e4697434831eefb716e81117 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Tue, 13 Jul 2021 18:07:00 +0530 Subject: [PATCH 51/60] qcacld-3.0: Update the channel only if AUTH resp is successful Currently channel is updated whenever AUTH frame is received irrespective of its status. So in case of unsuccessful AUTH wrong channel is updated in pkt capture mode. To fix this issue, update the channel only if AUTH response is successful. Also if after AUTH success, association or reassociation fails update the channel with last connected channel. Change-Id: I51ee6bb2466f765ce6058c411b0dc0ab74a0dd04 CRs-Fixed: 2987748 --- .../core/inc/wlan_pkt_capture_priv.h | 6 +- .../core/src/wlan_pkt_capture_main.c | 2 + .../core/src/wlan_pkt_capture_mon_thread.c | 75 ++++++++++++++++++- 3 files changed, 78 insertions(+), 5 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h index ce37798894ed..93ab1eac698b 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. 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 @@ -63,6 +63,8 @@ struct pkt_capture_cb_context { * @ppdu_stats_q: list used for storing smu related ppdu stats * @lock_q: spinlock for ppdu_stats q * @tx_nss: nss of tx data packets received from ppdu stats + * @last_freq: Last connected freq + * @curr_freq: current connected freq */ struct pkt_capture_vdev_priv { struct wlan_objmgr_vdev *vdev; @@ -74,6 +76,8 @@ struct pkt_capture_vdev_priv { qdf_list_t ppdu_stats_q; qdf_spinlock_t lock_q; uint8_t tx_nss; + qdf_freq_t last_freq; + qdf_freq_t curr_freq; }; /** diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 04f11b1143b0..5d1e3ee2b7d8 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -754,6 +754,8 @@ pkt_capture_register_callbacks(struct wlan_objmgr_vdev *vdev, target_if_pkt_capture_register_rx_ops(&psoc_priv->rx_ops); pkt_capture_wdi_event_subscribe(psoc); pkt_capture_record_channel(vdev); + vdev_priv->curr_freq = vdev->vdev_mlme.des_chan->ch_freq; + vdev_priv->last_freq = vdev_priv->curr_freq; status = tgt_pkt_capture_register_ev_handler(vdev); if (QDF_IS_STATUS_ERROR(status)) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_mon_thread.c b/components/pkt_capture/core/src/wlan_pkt_capture_mon_thread.c index 599edf22d261..be99be8ee939 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_mon_thread.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_mon_thread.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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 @@ -25,6 +26,7 @@ #include "wlan_mgmt_txrx_utils_api.h" #include "cdp_txrx_ctrl.h" #include "cfg_ucfg_api.h" +#include "wlan_mgmt_txrx_utils_api.h" void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu, struct wlan_objmgr_vdev *vdev, uint16_t ch_freq) @@ -35,6 +37,9 @@ void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu, void *soc = cds_get_context(QDF_MODULE_ID_SOC); struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev); cdp_config_param_type val; + uint16_t status; + tSirMacAuthFrameBody *auth; + struct pkt_capture_vdev_priv *vdev_priv; rthdr = (struct radiotap_header *)qdf_nbuf_data(msdu); rtlen = rthdr->it_len; @@ -42,17 +47,79 @@ void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu, type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK; sub_type = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; + vdev_priv = pkt_capture_vdev_get_priv(vdev); + if (!vdev_priv) { + pkt_capture_err("packet capture vdev priv is NULL"); + return; + } + + /* + * Update channel only if successful AUTH Resp is received. + * This is done so that EAPOL M1 data frame have correct + * channel + */ if ((type == IEEE80211_FC0_TYPE_MGT) && (sub_type == MGMT_SUBTYPE_AUTH)) { uint8_t chan = wlan_freq_to_chan(ch_freq); - val.cdp_pdev_param_monitor_chan = chan; - cdp_txrx_set_pdev_param(soc, wlan_objmgr_pdev_get_pdev_id(pdev), + auth = (tSirMacAuthFrameBody *)(qdf_nbuf_data(msdu) + rtlen + + sizeof(tSirMacMgmtHdr)); + + if (auth->authTransactionSeqNumber == SIR_MAC_AUTH_FRAME_2 || + auth->authTransactionSeqNumber == SIR_MAC_AUTH_FRAME_4) { + if (auth->authStatusCode == STATUS_SUCCESS) { + val.cdp_pdev_param_monitor_chan = chan; + cdp_txrx_set_pdev_param( + soc, wlan_objmgr_pdev_get_pdev_id(pdev), CDP_MONITOR_CHANNEL, val); - val.cdp_pdev_param_mon_freq = ch_freq; - cdp_txrx_set_pdev_param(soc, wlan_objmgr_pdev_get_pdev_id(pdev), + val.cdp_pdev_param_mon_freq = ch_freq; + cdp_txrx_set_pdev_param( + soc, wlan_objmgr_pdev_get_pdev_id(pdev), CDP_MONITOR_FREQUENCY, val); + } + } + } + + /* + * Update channel to last connected channel in case of assoc/reassoc + * response failure and save current chan in case of success + */ + if ((type == IEEE80211_FC0_TYPE_MGT) && + ((sub_type == MGMT_SUBTYPE_ASSOC_RESP) || + (sub_type == MGMT_SUBTYPE_REASSOC_RESP))) { + if (qdf_nbuf_len(msdu) < (rtlen + sizeof(tSirMacMgmtHdr) + + SIR_MAC_ASSOC_RSP_STATUS_CODE_OFFSET)) { + pkt_capture_err("Packet length is less than expected"); + qdf_nbuf_free(msdu); + return; + } + + status = (uint16_t)(*(qdf_nbuf_data(msdu) + rtlen + + sizeof(tSirMacMgmtHdr) + + SIR_MAC_ASSOC_RSP_STATUS_CODE_OFFSET)); + + if (status == STATUS_SUCCESS) { + vdev_priv->last_freq = vdev_priv->curr_freq; + vdev_priv->curr_freq = ch_freq; + } else { + uint8_t chan_num; + + chan_num = wlan_reg_freq_to_chan(pdev, + vdev_priv->last_freq); + + val.cdp_pdev_param_monitor_chan = chan_num; + cdp_txrx_set_pdev_param( + soc, wlan_objmgr_pdev_get_pdev_id(pdev), + CDP_MONITOR_CHANNEL, val); + + val.cdp_pdev_param_mon_freq = vdev_priv->last_freq; + cdp_txrx_set_pdev_param( + soc, wlan_objmgr_pdev_get_pdev_id(pdev), + CDP_MONITOR_FREQUENCY, val); + + vdev_priv->curr_freq = vdev_priv->last_freq; + } } if (cb_ctx->mon_cb(cb_ctx->mon_ctx, msdu) != QDF_STATUS_SUCCESS) { From cba262e4abfd203b81411d64a34d976d5a736a4a Mon Sep 17 00:00:00 2001 From: Nagalakshmi Date: Tue, 29 Nov 2022 22:48:35 -0800 Subject: [PATCH 52/60] qcacld-3.0: Fix OOB in wma_scan_roam.c Currently in wma_extscan_hotlist_match_event_handler API, dest_hotlist get memory allocation based on numap which takes value from event->total_entries. But numap is limited to WMA_EXTSCAN_MAX_HOTLIST_ENTRIES and event->total_entries more than WMA_EXTSCAN_MAX_HOTLIST_ENTRIES can cause out of bound issue. Fix is to populate dest_hotlist->numOfAps from numap instead of event->total_entries to avoid any out of bound issue. Change-Id: I756f7e4a4dcd454508bba83d4a8bbbb139530905 CRs-Fixed: 3346781 --- core/wma/src/wma_scan_roam.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 19dc459dbe44..cfa317853883 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -3564,7 +3564,7 @@ int wma_extscan_hotlist_match_event_handler(void *handle, return -ENOMEM; dest_ap = &dest_hotlist->ap[0]; - dest_hotlist->numOfAps = event->total_entries; + dest_hotlist->numOfAps = numap; dest_hotlist->requestId = event->config_request_id; if (event->first_entry_index + From 424157846542e2ba86f2e9bd7d21baa9d26cd2f7 Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Thu, 23 Mar 2023 12:11:03 +0530 Subject: [PATCH 53/60] qcacld-3.0: update mcs value for HT and VHT mode for mon mode Currently monitor mode HT & VHT data packet tx rate is not matching with ota packet tx rate due to incorrect mcs value. This change is to update proper mcs value for HT & VHT modes. Change-Id: Ib4fb06a06ce35a4e8e683e5a22c8be226492b13f CRs-Fixed: 3442509 --- .../pkt_capture/core/src/wlan_pkt_capture_data_txrx.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c index 6cebfe5481b9..0c69d911f0ac 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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 @@ -179,12 +179,14 @@ static void pkt_capture_tx_get_phy_info( mcs = 8 + pktcapture_hdr->mcs; else mcs = pktcapture_hdr->mcs; + + tx_status->ht_mcs = mcs; break; case 0x3: tx_status->vht_flags = 1; mcs = pktcapture_hdr->mcs; tx_status->vht_flag_values3[0] = - mcs << 0x4 | (pktcapture_hdr->nss + 1); + mcs << 0x4 | (pktcapture_hdr->nss); tx_status->vht_flag_values2 = pktcapture_hdr->bw; break; case 0x4: From 03d81c87dbaa68d2534045f5431dd9f755e439e3 Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Wed, 29 Mar 2023 15:35:19 +0530 Subject: [PATCH 54/60] qcacld-3.0: tx rate update for data packet in legacy modes Currently, For legacy modes monitor mode reporting incorrect tx rate for data packet in radiotap header due to packetcapture_hdr rate is hardcoded as '0'. This change calculates the data rate of legacy packets using mcs reported in tx completion. Change-Id: I2a651b8fb36947672bd30f8a635f0e643219e520 CRs-Fixed: 3442376 --- components/pkt_capture/core/src/wlan_pkt_capture_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 27081aa1c9a6..d4009775dd07 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -292,8 +292,8 @@ pkt_capture_process_tx_data(void *soc, void *log_data, u_int16_t vdev_id, /* nss not available */ pktcapture_hdr.nss = 0; pktcapture_hdr.rssi_comb = tx_comp_status.ack_frame_rssi; - /* rate not available */ - pktcapture_hdr.rate = 0; + /* update rate from available mcs */ + pktcapture_hdr.rate = tx_comp_status.mcs; pktcapture_hdr.stbc = tx_comp_status.stbc; pktcapture_hdr.sgi = tx_comp_status.sgi; pktcapture_hdr.ldpc = tx_comp_status.ldpc; From 92151b69be14f9510223cef9d074d495b8bb2175 Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Mon, 3 Apr 2023 16:08:48 +0530 Subject: [PATCH 55/60] qcacld-3.0: Fix ofdm and cck flag info for mon mode data packets Currently cck and ofdm flags are filled wrongly for monitor mode data packets based on preamble and wireshark deriving incorrect phy type for 11G & 11B. This change is to update cck and ofdm flags based on packet type. Change-Id: I5fcdc463ea2a6d83253e39cc377a2471aeb4e144 CRs-Fixed: 3447567 --- .../pkt_capture/core/inc/wlan_pkt_capture_data_txrx.h | 3 +++ .../pkt_capture/core/src/wlan_pkt_capture_data_txrx.c | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_data_txrx.h b/components/pkt_capture/core/inc/wlan_pkt_capture_data_txrx.h index e933c47ce78e..c56ff2787944 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_data_txrx.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_data_txrx.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. 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 @@ -42,6 +43,8 @@ #define IEEE80211_RADIOTAP_HE_DATA1_STBC_KNOWN 0x0200 #endif +#define HAL_TX_PKT_TYPE_11B 1 + /** * pkt_capture_data_process_type - data pkt types to process * for packet capture mode diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c index 0c69d911f0ac..3bd0a085964e 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c @@ -207,9 +207,9 @@ static void pkt_capture_tx_get_phy_info( break; } - if (preamble == 0) + if (preamble_type != HAL_TX_PKT_TYPE_11B) tx_status->ofdm_flag = 1; - else if (preamble == 1) + else tx_status->cck_flag = 1; tx_status->mcs = mcs; @@ -729,9 +729,9 @@ static void pkt_capture_rx_get_phy_info(void *context, void *psoc, break; } - if (preamble == 0) + if (preamble_type != HAL_RX_PKT_TYPE_11B) rx_status->ofdm_flag = 1; - else if (preamble == 1) + else rx_status->cck_flag = 1; rx_status->bw = bw; From a6ae724cc90abdb7023a2014706f60f3cf1164de Mon Sep 17 00:00:00 2001 From: Rahul Choudhary Date: Wed, 24 May 2023 06:36:31 -0700 Subject: [PATCH 56/60] Release 2.0.8.33C Release 2.0.8.33C Change-Id: I094706e9e81db607b7ca2153ce46d7af7200169b CRs-Fixed: 774533 --- core/mac/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index a22196838e55..0a11c2fd4a18 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 2 #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 8 -#define QWLAN_VERSION_EXTRA "B" +#define QWLAN_VERSION_EXTRA "C" #define QWLAN_VERSION_BUILD 33 -#define QWLAN_VERSIONSTR "2.0.8.33B" +#define QWLAN_VERSIONSTR "2.0.8.33C" #endif /* QWLAN_VERSION_H */ From 44f77a6b2572cb8d6ae547870e3b2ca91f854de1 Mon Sep 17 00:00:00 2001 From: Azmath Mohammed Date: Fri, 26 Aug 2022 11:57:02 +0530 Subject: [PATCH 57/60] qcacld-3.0: Fix for code error Add missing break after the update of ret variable. Change-Id: Ib9c54575d97d26f05239a2fb44a87a63440b9bdf CRs-Fixed: 3277218 --- components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c index 3bd0a085964e..e8c8682737c3 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c @@ -115,6 +115,7 @@ static unsigned char pkt_capture_get_tx_rate( case 0x0: ret = 0x16; *preamble = LONG_PREAMBLE; + break; case 0x1: ret = 0xB; *preamble = LONG_PREAMBLE; From 3ae434d51664de2a260511ebf35cf60beed1584e Mon Sep 17 00:00:00 2001 From: Rahul Choudhary Date: Wed, 24 May 2023 09:02:43 -0700 Subject: [PATCH 58/60] Release 2.0.8.33D Release 2.0.8.33D Change-Id: I5486a330381e4472ab77cabe67d1fe341a7f6e2b CRs-Fixed: 774533 --- core/mac/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index 0a11c2fd4a18..378883e3ded1 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 2 #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 8 -#define QWLAN_VERSION_EXTRA "C" +#define QWLAN_VERSION_EXTRA "D" #define QWLAN_VERSION_BUILD 33 -#define QWLAN_VERSIONSTR "2.0.8.33C" +#define QWLAN_VERSIONSTR "2.0.8.33D" #endif /* QWLAN_VERSION_H */ From 632d736aa2bba0f9d4a6eed19ca705f08f546172 Mon Sep 17 00:00:00 2001 From: Surya Prakash Sivaraj Date: Tue, 16 May 2023 11:08:19 +0530 Subject: [PATCH 59/60] qcacld-3.0: Update channel before user space update As part of roaming, roamed event is sent to the userspace. This marks the end of roaming and userspace begins CSI restart for the new BSS. But, the channel information of the new BSS is not yet updated to the vdev. This leads to sending wrong channel in the for CFR capture. To fix this, update the channel info of the new BSS before sending userspace update. Change-Id: I3af5aadf6041e56f2261aaebd7d2c1a108f63c65 CRs-Fixed: 3500062 --- core/wma/src/wma_scan_roam.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 409c88336202..702063ef6170 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -1398,16 +1398,6 @@ int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, wma_roam_update_vdev(wma, roam_synch_ind_ptr); - if (QDF_IS_STATUS_ERROR(wma->csr_roam_synch_cb(wma->mac_context, - roam_synch_ind_ptr, - bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION))) { - wma_err("CSR roam synch propagation failed, abort roam"); - status = -EINVAL; - goto cleanup_label; - } - - wma_process_roam_synch_complete(wma, synch_event->vdev_id); - /* update freq and channel width */ wma->interfaces[synch_event->vdev_id].ch_freq = roam_synch_ind_ptr->chan_freq; @@ -1426,6 +1416,16 @@ int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, param_buf->chan, &wma->interfaces[synch_event->vdev_id]); + if (QDF_IS_STATUS_ERROR(wma->csr_roam_synch_cb(wma->mac_context, + roam_synch_ind_ptr, + bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION))) { + wma_err("CSR roam synch propagation failed, abort roam"); + status = -EINVAL; + goto cleanup_label; + } + + wma_process_roam_synch_complete(wma, synch_event->vdev_id); + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE); wma->interfaces[synch_event->vdev_id].roam_synch_delay = From b7e74f81db1202dd2a7b0397b2e3ef6a44e9be1e Mon Sep 17 00:00:00 2001 From: Rahul Choudhary Date: Fri, 26 May 2023 03:13:58 -0700 Subject: [PATCH 60/60] Release 2.0.8.33E Release 2.0.8.33E Change-Id: I91532367e0600df8aa3156eda0e5e854bd479ce3 CRs-Fixed: 774533 --- core/mac/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index 378883e3ded1..6ac0327ecc61 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 2 #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 8 -#define QWLAN_VERSION_EXTRA "D" +#define QWLAN_VERSION_EXTRA "E" #define QWLAN_VERSION_BUILD 33 -#define QWLAN_VERSIONSTR "2.0.8.33D" +#define QWLAN_VERSIONSTR "2.0.8.33E" #endif /* QWLAN_VERSION_H */