From 794acdb8c6d01c3604048e28bfa2ed245094f189 Mon Sep 17 00:00:00 2001 From: Balaji Pothunoori Date: Mon, 1 Nov 2021 13:20:43 +0530 Subject: [PATCH] qcacld-3.0: add os_if layer for monitor mode configuration Add os_if layer for monitor mode vendor configurations. Change-Id: I20488e0e398b1761745b24a70e9888fe487b88ac CRs-Fixed: 3055069 --- Kbuild | 7 +- core/hdd/src/wlan_hdd_cfg80211.c | 180 +--------------------- os_if/pkt_capture/inc/os_if_pkt_capture.h | 78 ++++++++++ os_if/pkt_capture/src/os_if_pkt_capture.c | 180 ++++++++++++++++++++++ 4 files changed, 269 insertions(+), 176 deletions(-) create mode 100644 os_if/pkt_capture/inc/os_if_pkt_capture.h create mode 100644 os_if/pkt_capture/src/os_if_pkt_capture.c diff --git a/Kbuild b/Kbuild index 7dac5c6a6b35..b62db12edf2c 100644 --- a/Kbuild +++ b/Kbuild @@ -1400,10 +1400,12 @@ $(call add-wlan-objs,action_oui,$(ACTION_OUI_OBJS)) ######## PACKET CAPTURE ######## PKT_CAPTURE_DIR := components/pkt_capture +PKT_CAPTURE_OS_IF_DIR := os_if/pkt_capture PKT_CAPTURE_TARGET_IF_DIR := components/target_if/pkt_capture/ PKT_CAPTURE_INC := -I$(WLAN_ROOT)/$(PKT_CAPTURE_DIR)/core/inc \ -I$(WLAN_ROOT)/$(PKT_CAPTURE_DIR)/dispatcher/inc \ - -I$(WLAN_ROOT)/$(PKT_CAPTURE_TARGET_IF_DIR)/inc + -I$(WLAN_ROOT)/$(PKT_CAPTURE_TARGET_IF_DIR)/inc \ + -I$(WLAN_ROOT)/$(PKT_CAPTURE_OS_IF_DIR)/inc ifeq ($(CONFIG_WLAN_FEATURE_PKT_CAPTURE), y) PKT_CAPTURE_OBJS := $(PKT_CAPTURE_DIR)/core/src/wlan_pkt_capture_main.o \ @@ -1412,7 +1414,8 @@ PKT_CAPTURE_OBJS := $(PKT_CAPTURE_DIR)/core/src/wlan_pkt_capture_main.o \ $(PKT_CAPTURE_DIR)/core/src/wlan_pkt_capture_data_txrx.o \ $(PKT_CAPTURE_DIR)/dispatcher/src/wlan_pkt_capture_ucfg_api.o \ $(PKT_CAPTURE_DIR)/dispatcher/src/wlan_pkt_capture_tgt_api.o \ - $(PKT_CAPTURE_TARGET_IF_DIR)/src/target_if_pkt_capture.o + $(PKT_CAPTURE_TARGET_IF_DIR)/src/target_if_pkt_capture.o \ + $(PKT_CAPTURE_OS_IF_DIR)/src/os_if_pkt_capture.o endif $(call add-wlan-objs,pkt_capture,$(PKT_CAPTURE_OBJS)) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index e16d9c9d2c5b..be03aa5671d3 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -164,6 +164,7 @@ #include "wlan_wfa_ucfg_api.h" #include "wlan_roam_debug.h" #include "wlan_pkt_capture_ucfg_api.h" +#include "os_if_pkt_capture.h" #define g_mode_rates_size (12) #define a_mode_rates_size (8) @@ -14988,58 +14989,6 @@ 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) @@ -15487,108 +15436,6 @@ static int wlan_hdd_cfg80211_get_usable_channel(struct wiphy *wiphy, #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 @@ -15609,8 +15456,8 @@ __wlan_hdd_cfg80211_set_monitor_mode(struct wiphy *wiphy, 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; + QDF_STATUS status; if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) { hdd_err("Command not allowed in FTM mode"); @@ -15618,21 +15465,15 @@ __wlan_hdd_cfg80211_set_monitor_mode(struct wiphy *wiphy, } if (!ucfg_pkt_capture_get_mode(hdd_ctx->psoc)) - return QDF_STATUS_E_FAILURE; + return -EPERM; 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; - } + status = os_if_monitor_mode_configure(adapter, data, data_len); - errno = hdd_monitor_mode_configure(adapter, tb); - - return errno; + return qdf_status_to_os_return(status); } /** @@ -16555,16 +16396,7 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_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) - }, + FEATURE_MONITOR_MODE_VENDOR_COMMANDS #endif }; diff --git a/os_if/pkt_capture/inc/os_if_pkt_capture.h b/os_if/pkt_capture/inc/os_if_pkt_capture.h new file mode 100644 index 000000000000..474a4704c99d --- /dev/null +++ b/os_if/pkt_capture/inc/os_if_pkt_capture.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _OS_IF_PKT_CAPTURE_H_ +#define _OS_IF_PKT_CAPTURE_H_ + +#include "qdf_types.h" +#include "qca_vendor.h" +#include "wlan_hdd_main.h" + +#ifdef WLAN_FEATURE_PKT_CAPTURE + +#define os_if_pkt_enter() QDF_TRACE_ENTER(QDF_MODULE_ID_HDD, "enter") +#define os_if_pkt_exit() QDF_TRACE_EXIT(QDF_MODULE_ID_HDD, "exit") + +#define FEATURE_MONITOR_MODE_VENDOR_COMMANDS \ + { \ + .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) \ + }, + +/* 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 + +extern const struct nla_policy +set_monitor_mode_policy[SET_MONITOR_MODE_CONFIG_MAX + 1]; + +/** + * os_if_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 + */ +QDF_STATUS os_if_monitor_mode_configure(struct hdd_adapter *adapter, + const void *data, int data_len); +#endif +#endif diff --git a/os_if/pkt_capture/src/os_if_pkt_capture.c b/os_if/pkt_capture/src/os_if_pkt_capture.c new file mode 100644 index 000000000000..43633ab18f5d --- /dev/null +++ b/os_if/pkt_capture/src/os_if_pkt_capture.c @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "osif_sync.h" +#include "qdf_str.h" +#include "qdf_trace.h" +#include "qdf_types.h" +#include "wlan_osif_priv.h" +#include +#include "wlan_cfg80211.h" +#include "wlan_objmgr_psoc_obj.h" +#include "wlan_objmgr_pdev_obj.h" +#include "wlan_objmgr_vdev_obj.h" +#include "wlan_utility.h" +#include "wlan_osif_request_manager.h" +#include "wlan_mlme_ucfg_api.h" +#include "wlan_pkt_capture_ucfg_api.h" +#include "os_if_pkt_capture.h" +#include "wlan_hdd_main.h" +#include "cfg_ucfg_api.h" +#include "wlan_hdd_object_manager.h" + +#ifdef WLAN_FEATURE_PKT_CAPTURE + +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 + }, +}; + +QDF_STATUS os_if_monitor_mode_configure(struct hdd_adapter *adapter, + const void *data, int data_len) +{ + struct pkt_capture_frame_filter frame_filter = {0}; + struct wlan_objmgr_vdev *vdev; + struct nlattr *tb[SET_MONITOR_MODE_CONFIG_MAX + 1]; + QDF_STATUS status; + + os_if_pkt_enter(); + + if (tb[SET_MONITOR_MODE_INVALID]) + return QDF_STATUS_E_FAILURE; + + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) + return QDF_STATUS_E_INVAL; + + if (wlan_cfg80211_nla_parse(tb, SET_MONITOR_MODE_CONFIG_MAX, + data, data_len, set_monitor_mode_policy)) { + osif_err("invalid monitor attr"); + hdd_objmgr_put_vdev(vdev); + return QDF_STATUS_E_INVAL; + } + + 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); + } + + osif_debug("Monitor mode config %s data tx %d data rx %d mgmt tx %d mgmt rx %d ctrl tx %d ctrl rx %d bi %d\n", + 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); + + os_if_pkt_exit(); + + return status; +} + +#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