qcacld-3.0: add os_if layer for monitor mode configuration
Add os_if layer for monitor mode vendor configuration. Change-Id: I20488e0e398b1761745b24a70e9888fe487b88ac CRs-Fixed: 3055069
This commit is contained in:
parent
19532c3f4a
commit
517caa56e6
7
Kbuild
7
Kbuild
@ -1578,10 +1578,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 \
|
||||
@ -1590,7 +1592,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))
|
||||
|
@ -175,6 +175,7 @@
|
||||
#include "qdf_util.h"
|
||||
#include "wlan_hdd_mdns_offload.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)
|
||||
@ -15389,58 +15390,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)
|
||||
@ -15891,108 +15840,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_by_user(adapter, WLAN_PKT_CAPTURE_ID);
|
||||
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_by_user(vdev, WLAN_PKT_CAPTURE_ID);
|
||||
|
||||
hdd_exit();
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* __wlan_hdd_cfg80211_set_monitor_mode() - Wifi monitor mode configuration
|
||||
* vendor command
|
||||
@ -16013,8 +15860,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");
|
||||
@ -16022,21 +15869,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);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -16071,16 +15912,6 @@ static int wlan_hdd_cfg80211_set_monitor_mode(struct wiphy *wiphy,
|
||||
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
|
||||
|
||||
/**
|
||||
@ -17109,16 +16940,7 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
|
||||
FEATURE_MDNS_OFFLOAD_VENDOR_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
os_if/pkt_capture/inc/os_if_pkt_capture.h
Normal file
78
os_if/pkt_capture/inc/os_if_pkt_capture.h
Normal file
@ -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
|
176
os_if/pkt_capture/src/os_if_pkt_capture.c
Normal file
176
os_if/pkt_capture/src/os_if_pkt_capture.c
Normal file
@ -0,0 +1,176 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
if (tb[SET_MONITOR_MODE_INVALID])
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
vdev = hdd_objmgr_get_vdev_by_user(adapter, WLAN_PKT_CAPTURE_ID);
|
||||
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_by_user(vdev, WLAN_PKT_CAPTURE_ID);
|
||||
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_by_user(vdev, WLAN_PKT_CAPTURE_ID);
|
||||
|
||||
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
|
Loading…
Reference in New Issue
Block a user