Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 794acdb8 authored by Balaji Pothunoori's avatar Balaji Pothunoori Committed by Madan Koyyalamudi
Browse files

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
parent d541dd9a
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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))
+6 −174
Original line number Diff line number Diff line
@@ -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
};
+78 −0
Original line number Diff line number Diff line
/*
 * 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
+180 −0
Original line number Diff line number Diff line
/*
 * 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 <net/cfg80211.h>
#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