summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaidiReddy Yenuga <saidir@codeaurora.org>2017-02-24 16:17:03 +0530
committerqcabuildsw <qcabuildsw@localhost>2017-03-07 02:56:47 -0800
commit9b80325e8f1907107c35a08afbc94b78def4fc50 (patch)
tree710a37990a2e11fb1e1a0a0b908d87e88c16f576
parent18238e673c442ac95750f74b4642a76e8419e42a (diff)
qcacld-3.0: Configure and clear default packet filters over suspend and resume
In suspend mode multicast, broadcast packets wakes up host, this leads to higher power consumption. Add support to configure the IPv6/IPv4 multicast, IPv4 broadcast, XID, STP, DTP/LLC/CDP packet filters based on ini bit map param, before the device goes to suspend mode and clear the same filters in resume. CRs-Fixed: 2011442 Change-Id: Ib355459132086902ba008f2abd17415a8f569b41
-rw-r--r--core/hdd/inc/wlan_hdd_cfg.h41
-rw-r--r--core/hdd/inc/wlan_hdd_main.h1
-rw-r--r--core/hdd/inc/wlan_hdd_packet_filter_api.h58
-rw-r--r--core/hdd/inc/wlan_hdd_packet_filter_rules.h180
-rw-r--r--core/hdd/src/wlan_hdd_cfg.c9
-rw-r--r--core/hdd/src/wlan_hdd_packet_filter.c100
-rw-r--r--core/hdd/src/wlan_hdd_power.c6
-rw-r--r--core/hdd/src/wlan_hdd_wext.c14
8 files changed, 402 insertions, 7 deletions
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index 7743fac4a341..4d05d0b646de 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -9880,7 +9880,7 @@ enum dot11p_mode {
*
* </ini>
*/
-#define CFG_QCN_IE_SUPPORT_NAME "g_qcn_ie_support"
+#define CFG_QCN_IE_SUPPORT_NAME "g_qcn_ie_support"
#define CFG_QCN_IE_SUPPORT_MIN 0
#define CFG_QCN_IE_SUPPORT_MAX 1
#define CFG_QCN_IE_SUPPORT_DEFAULT 1
@@ -9907,6 +9907,44 @@ enum dot11p_mode {
#define CFG_FILS_MAX_CHAN_GUARD_TIME_MAX (10)
#define CFG_FILS_MAX_CHAN_GUARD_TIME_DEFAULT (0)
+/*
+ * <ini>
+ * g_enable_packet_filter_bitmap - Enable Packet filters before going into
+ * suspend mode
+ * @Min: 0
+ * @Max: 63
+ * @Default: 0
+ * Below is the Detailed bit map of the Filters
+ * bit-0 : IPv6 multicast
+ * bit-1 : IPv4 multicast
+ * bit-2 : IPv4 broadcast
+ * bit-3 : XID - Exchange station Identification packet, solicits the
+ * identification of the receiving station
+ * bit-4 : STP - Spanning Tree Protocol, builds logical loop free topology
+ * bit-5 : DTP/LLC/CDP
+ * DTP - Dynamic Trunking Protocol is used by Ciscoswitches to negotiate
+ * whether an interconnection between two switches should be put into access or
+ * trunk mode
+ * LLC - Logical link control, used for multiplexing, flow & error control
+ * CDP - Cisco Discovery Protocol packet contains information about the cisco
+ * devices in the network
+ *
+ * This ini support to enable above mentioned packet filters
+ * when target goes to suspend mode, clear those when resume
+ *
+ * Related: None
+ *
+ * Supported Feature: PACKET FILTERING
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_ENABLE_PACKET_FILTERS_NAME "g_enable_packet_filter_bitmap"
+#define CFG_ENABLE_PACKET_FILTERS_DEFAULT (0)
+#define CFG_ENABLE_PACKET_FILTERS_MIN (0)
+#define CFG_ENABLE_PACKET_FILTERS_MAX (63)
+
/*---------------------------------------------------------------------------
Type declarations
-------------------------------------------------------------------------*/
@@ -10633,6 +10671,7 @@ struct hdd_config {
uint8_t rssi_penalize_factor_5g;
uint8_t max_rssi_penalize_5g;
+ uint8_t packet_filters_bitmap;
};
#define VAR_OFFSET(_Struct, _Var) (offsetof(_Struct, _Var))
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index 841e6f40299e..0b71f521c0ef 100644
--- a/core/hdd/inc/wlan_hdd_main.h
+++ b/core/hdd/inc/wlan_hdd_main.h
@@ -1657,6 +1657,7 @@ struct hdd_context_s {
uint8_t beacon_probe_rsp_cnt_per_scan;
bool rcpi_enabled;
bool imps_enabled;
+ int user_configured_pkt_filter_rules;
};
/*---------------------------------------------------------------------------
diff --git a/core/hdd/inc/wlan_hdd_packet_filter_api.h b/core/hdd/inc/wlan_hdd_packet_filter_api.h
new file mode 100644
index 000000000000..9ae980a5bead
--- /dev/null
+++ b/core/hdd/inc/wlan_hdd_packet_filter_api.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2017 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.
+ */
+
+#if !defined(WLAN_HDD_PACKET_FILTER_API_H__)
+#define WLAN_HDD_PACKET_FILTER_API_H__
+
+/**
+ * DOC: wlan_hdd_packet_filter_rules.h
+ *
+ */
+
+/* Include files */
+
+/**
+ * hdd_enable_default_pkt_filters() - Enable default packet filters based
+ * on, filters bit map provided in INI, when target goes to suspend mode
+ * @adapter: Adapter context for which default filters to be configure
+ *
+ * Return: zero if success, non-zero otherwise
+ */
+int hdd_enable_default_pkt_filters(hdd_adapter_t *pAadapter);
+
+/**
+ * hdd_disable_default_pkt_filters() - Disable default packet filters based
+ * on, filters bit map provided in INI, when target resumes
+ * @adapter: Adapter context for which default filters to be cleared
+ *
+ * Return: zero if success, non-zero otherwise
+ */
+int hdd_disable_default_pkt_filters(hdd_adapter_t *pAdapter);
+
+/**
+ * wlan_hdd_set_filter() - Set packet filter
+ * @hdd_ctx: Global HDD context
+ * @request: Packet filter request struct
+ * @sessionId: Target session for the request
+ *
+ * Return: 0 on success, non-zero on error
+ */
+int wlan_hdd_set_filter(hdd_context_t *hdd_ctx,
+ struct pkt_filter_cfg *request,
+ uint8_t sessionId);
+#endif
diff --git a/core/hdd/inc/wlan_hdd_packet_filter_rules.h b/core/hdd/inc/wlan_hdd_packet_filter_rules.h
new file mode 100644
index 000000000000..64739aeeeef5
--- /dev/null
+++ b/core/hdd/inc/wlan_hdd_packet_filter_rules.h
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2017 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.
+ */
+
+#if !defined(WLAN_HDD_PACKET_FILTER_RULES_H__)
+#define WLAN_HDD_PACKET_FILTER_RULES_H__
+
+/**
+ * DOC: wlan_hdd_packet_filter_rules.h
+ *
+ */
+
+/* Include files */
+
+#define MAX_NUM_PACKET_FILTERS 6
+
+/**
+ * @filter_action: Filter action, set/clear the filter
+ * Ex: filter_action = 1 set the filter
+ * filter_action = 2 clear the filter
+ * @filter_id: Filter id Ex: 1/2/3/4/5 .... MAX_NUM_FILTERS
+ * @num_params: Number of parameters Ex: 1/2/3/4/5
+ * @params_data: Packet filter parameters details
+ *
+ * @protocol_layer: the type of protocol layer header to which the data
+ * being configured correspond
+ * Ex: protocol_layer = 1 - MAC Header
+ * protocol_layer = 2 - ARP Header
+ * protocol_layer = 3 - IP Header
+ * @compare_flag: comparison type
+ * EX: compare_flag = 0 - comparison is invalid
+ * compare_flag = 1 - compare for equality of the data present in received
+ * packet to the corresponding configured data
+ * compare_flag = 2 - compare for equality of the data present in received
+ * packet to the corresponding configured data after
+ * applying the mask
+ * compare_flag = 3 - compare for non-equality of the data present in
+ * received packet to the corresponding configured data
+ * compare_flag = 4 - compare for non-equality of the data present in
+ * received packet to the corresponding configured data
+ * after applying the mask
+ * @data_fffset: Offset of the data to compare from the respective protocol
+ * layer header start (as per the respective protocol
+ * specification) in terms of bytes
+ * @data_length: length of data to compare
+ * @compare_data: Array of 8 bytes
+ * @data_mask: Mask to be applied on the received packet data (Array of 8 bytes)
+ */
+static const struct pkt_filter_cfg
+ packet_filter_default_rules[MAX_NUM_PACKET_FILTERS] = {
+ { .filter_action = 1,
+ .filter_id = 0,
+ .num_params = 3,
+ .params_data = {
+ { .protocol_layer = 1,
+ .compare_flag = 5,
+ .data_offset = 0,
+ .data_length = 1,
+ .compare_data = {1, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} },
+ { .protocol_layer = 2,
+ .compare_flag = 3,
+ .data_offset = 6,
+ .data_length = 2,
+ .compare_data = {134, 221, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} },
+ { .protocol_layer = 3,
+ .compare_flag = 4,
+ .data_offset = 24,
+ .data_length = 2,
+ .compare_data = {255, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {255, 0, 0, 0, 0, 0, 0, 0} } } },
+
+ { .filter_action = 1,
+ .filter_id = 0,
+ .num_params = 3,
+ .params_data = {
+ { .protocol_layer = 1,
+ .compare_flag = 5,
+ .data_offset = 0,
+ .data_length = 1,
+ .compare_data = {1, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} },
+ { .protocol_layer = 2,
+ .compare_flag = 3,
+ .data_offset = 6,
+ .data_length = 2,
+ .compare_data = {8, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} },
+ { .protocol_layer = 3,
+ .compare_flag = 4,
+ .data_offset = 16,
+ .data_length = 1,
+ .compare_data = {224, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {240, 0, 0, 0, 0, 0, 0, 0} } } },
+ { .filter_action = 1,
+ .filter_id = 0,
+ .num_params = 3,
+ .params_data = {
+ { .protocol_layer = 1,
+ .compare_flag = 5,
+ .data_offset = 0,
+ .data_length = 1,
+ .compare_data = {1, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} },
+ { .protocol_layer = 2,
+ .compare_flag = 3,
+ .data_offset = 6,
+ .data_length = 2,
+ .compare_data = {8, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} },
+ { .protocol_layer = 3,
+ .compare_flag = 4,
+ .data_offset = 18,
+ .data_length = 2,
+ .compare_data = {0, 255, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 255, 0, 0, 0, 0, 0, 0} } } },
+ { .filter_action = 1,
+ .filter_id = 0,
+ .num_params = 2,
+ .params_data = {
+ { .protocol_layer = 1,
+ .compare_flag = 5,
+ .data_offset = 0,
+ .data_length = 1,
+ .compare_data = {1, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} },
+ { .protocol_layer = 2,
+ .compare_flag = 3,
+ .data_offset = 8,
+ .data_length = 4,
+ .compare_data = {0, 1, 175, 129, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} } } },
+ { .filter_action = 1,
+ .filter_id = 0,
+ .num_params = 2,
+ .params_data = {
+ { .protocol_layer = 1,
+ .compare_flag = 5,
+ .data_offset = 0,
+ .data_length = 1,
+ .compare_data = {1, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} },
+ { .protocol_layer = 2,
+ .compare_flag = 3,
+ .data_offset = 6,
+ .data_length = 2,
+ .compare_data = {0, 39, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} } } },
+ { .filter_action = 1,
+ .filter_id = 0,
+ .num_params = 2,
+ .params_data = {
+ { .protocol_layer = 1,
+ .compare_flag = 5,
+ .data_offset = 0,
+ .data_length = 1,
+ .compare_data = {1, 0, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} },
+ { .protocol_layer = 2,
+ .compare_flag = 3,
+ .data_offset = 4,
+ .data_length = 2,
+ .compare_data = {0, 12, 0, 0, 0, 0, 0, 0},
+ .data_mask = {0, 0, 0, 0, 0, 0, 0, 0} } } } };
+#endif
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index b8b17dc3486f..00299587f243 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -4320,7 +4320,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_ENABLE_BCAST_PROBE_RESP_DEFAULT,
CFG_ENABLE_BCAST_PROBE_RESP_MIN,
CFG_ENABLE_BCAST_PROBE_RESP_MAX),
-
REG_VARIABLE(CFG_QCN_IE_SUPPORT_NAME, WLAN_PARAM_Integer,
struct hdd_config, qcn_ie_support,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -4333,7 +4332,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_FILS_MAX_CHAN_GUARD_TIME_DEFAULT,
CFG_FILS_MAX_CHAN_GUARD_TIME_MIN,
CFG_FILS_MAX_CHAN_GUARD_TIME_MAX),
-
REG_VARIABLE(CFG_ENABLE_5G_BAND_PREF_NAME, WLAN_PARAM_Integer,
struct hdd_config, enable_5g_band_pref,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -4382,7 +4380,12 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_5G_MAX_RSSI_PENALIZE_DEFAULT,
CFG_5G_MAX_RSSI_PENALIZE_MIN,
CFG_5G_MAX_RSSI_PENALIZE_MAX),
-
+ REG_VARIABLE(CFG_ENABLE_PACKET_FILTERS_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, packet_filters_bitmap,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_PACKET_FILTERS_DEFAULT,
+ CFG_ENABLE_PACKET_FILTERS_MIN,
+ CFG_ENABLE_PACKET_FILTERS_MAX),
};
/**
diff --git a/core/hdd/src/wlan_hdd_packet_filter.c b/core/hdd/src/wlan_hdd_packet_filter.c
new file mode 100644
index 000000000000..39cbe3a7f820
--- /dev/null
+++ b/core/hdd/src/wlan_hdd_packet_filter.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2017 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.
+ */
+
+/**
+ * DOC: wlan_hdd_packet_filter.c
+ *
+ * WLAN Host Device Driver implementation
+ *
+ */
+
+/* Include Files */
+#include "wlan_hdd_packet_filter_api.h"
+
+int hdd_enable_default_pkt_filters(hdd_adapter_t *pAdapter)
+{
+ hdd_context_t *pHddCtx;
+ uint8_t filters = 0, i = 0, filter_id = 1;
+
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ if (NULL == pHddCtx) {
+ hdd_err("HDD context is Null!!!");
+ return -EINVAL;
+ }
+ if (!pHddCtx->user_configured_pkt_filter_rules) {
+ hdd_info("user has defined pkt filter run hence skipping default packet filter rule");
+ return 0;
+ }
+
+ filters = pHddCtx->config->packet_filters_bitmap;
+
+ while (filters != 0) {
+ if (filters & 0x1) {
+ hdd_err("setting filter[%d], of id = %d \n",
+ i+1, filter_id);
+ packet_filter_default_rules[i].filter_id = filter_id;
+ wlan_hdd_set_filter(pHddCtx,
+ &packet_filter_default_rules[i],
+ pAdapter->sessionId);
+ filter_id++;
+ }
+ filters = filters >> 1;
+ i++;
+ }
+
+ return 0;
+}
+
+int hdd_disable_default_pkt_filters(hdd_adapter_t *pAdapter)
+{
+ hdd_context_t *pHddCtx;
+ uint8_t filters = 0, i = 0, filter_id = 1;
+
+ struct pkt_filter_cfg packet_filter_default_rules;
+
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ if (NULL == pHddCtx) {
+ hdd_err("HDD context is Null!!!");
+ return -EINVAL;
+ }
+
+ if (!pHddCtx->user_configured_pkt_filter_rules) {
+ hdd_info("user has defined pkt filter run hence skipping default packet filter rule");
+ return 0;
+ }
+
+ filters = pHddCtx->config->packet_filters_bitmap;
+
+ while (filters != 0) {
+ if (filters & 0x1) {
+ hdd_err("Clearing filter[%d], of id = %d \n",
+ i+1, filter_id);
+ packet_filter_default_rules.filter_action =
+ HDD_RCV_FILTER_CLEAR;
+ packet_filter_default_rules.filter_id = i;
+ wlan_hdd_set_filter(pHddCtx,
+ &packet_filter_default_rules,
+ pAdapter->sessionId);
+ filter_id++;
+ }
+ filters = filters >> 1;
+ i++;
+ }
+
+ return 0;
+}
diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c
index 087eb16e1946..f4613f402402 100644
--- a/core/hdd/src/wlan_hdd_power.c
+++ b/core/hdd/src/wlan_hdd_power.c
@@ -78,6 +78,7 @@
#include "wlan_hdd_driver_ops.h"
#include <wlan_logging_sock_svc.h>
#include "cds_utils.h"
+#include "wlan_hdd_packet_filter_api.h"
/* Preprocessor definitions and constants */
#define HDD_SSR_BRING_UP_TIME 30000
@@ -1271,6 +1272,7 @@ hdd_suspend_wlan(void (*callback)(void *callbackContext, bool suspended),
return;
}
+
status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
pAdapter = pAdapterNode->pAdapter;
@@ -1280,6 +1282,8 @@ hdd_suspend_wlan(void (*callback)(void *callbackContext, bool suspended),
wlan_hdd_netif_queue_control(pAdapter, WLAN_NETIF_TX_DISABLE,
WLAN_CONTROL_PATH);
+ if (pAdapter->device_mode == QDF_STA_MODE)
+ status = hdd_enable_default_pkt_filters(pAdapter);
/* Configure supported OffLoads */
hdd_conf_hostoffload(pAdapter, true);
@@ -1340,6 +1344,8 @@ static void hdd_resume_wlan(void)
WLAN_WAKE_ALL_NETIF_QUEUE,
WLAN_CONTROL_PATH);
+ if (pAdapter->device_mode == QDF_STA_MODE)
+ status = hdd_disable_default_pkt_filters(pAdapter);
hdd_conf_resume_ind(pAdapter);
status = hdd_get_next_adapter(pHddCtx, pAdapterNode, &pNext);
diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c
index 1ff61a64dd17..eff0df032d6f 100644
--- a/core/hdd/src/wlan_hdd_wext.c
+++ b/core/hdd/src/wlan_hdd_wext.c
@@ -93,6 +93,7 @@
#endif
#include "wlan_hdd_lro.h"
#include "cds_utils.h"
+#include "wlan_hdd_packet_filter_api.h"
#define HDD_FINISH_ULA_TIME_OUT 800
#define HDD_SET_MCBC_FILTERS_TO_FW 1
@@ -11295,9 +11296,9 @@ static int iw_set_keepalive_params(struct net_device *dev,
*
* Return: 0 on success, non-zero on error
*/
-static int wlan_hdd_set_filter(hdd_context_t *hdd_ctx,
- struct pkt_filter_cfg *request,
- uint8_t sessionId)
+int wlan_hdd_set_filter(hdd_context_t *hdd_ctx,
+ struct pkt_filter_cfg *request,
+ uint8_t sessionId)
{
tSirRcvPktFilterCfgType packetFilterSetReq = {0};
tSirRcvFltPktClearParam packetFilterClrReq = {0};
@@ -11475,6 +11476,13 @@ static int __iw_set_packet_filter_params(struct net_device *dev,
return -ENOMEM;
}
+ if (request->filter_action == HDD_RCV_FILTER_SET)
+ hdd_ctx->user_configured_pkt_filter_rules |=
+ 1 << request->filter_id;
+ else if (request->filter_action == HDD_RCV_FILTER_CLEAR)
+ hdd_ctx->user_configured_pkt_filter_rules &=
+ ~(1 << request->filter_id);
+
ret = wlan_hdd_set_filter(hdd_ctx, request, adapter->sessionId);
qdf_mem_free(request);