From 11ba331f28b89fe776614a285427eaa4ceac7382 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sat, 21 Apr 2018 10:06:09 -0700 Subject: [PATCH] qcacld-3.0: Relocate wlan_hdd_set_filter() Function wlan_hdd_set_filter() is currently located in wlan_hdd_wext.c, but this function is independent of wireless extensions, so relocate it as part of the plan to omit wlan_hdd_wext.c from the build when wireless extensions is not enabled. Change-Id: I7377806ad27ec8d6fa361523d290156a7facacac CRs-Fixed: 2228938 --- core/hdd/src/wlan_hdd_packet_filter.c | 162 ++++++++++++++++++++++++- core/hdd/src/wlan_hdd_wext.c | 168 -------------------------- 2 files changed, 161 insertions(+), 169 deletions(-) diff --git a/core/hdd/src/wlan_hdd_packet_filter.c b/core/hdd/src/wlan_hdd_packet_filter.c index a1ef3f087c20..dbe201280638 100644 --- a/core/hdd/src/wlan_hdd_packet_filter.c +++ b/core/hdd/src/wlan_hdd_packet_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018 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 @@ -99,3 +99,163 @@ int hdd_disable_default_pkt_filters(struct hdd_adapter *adapter) return 0; } + +int wlan_hdd_set_filter(struct hdd_context *hdd_ctx, + struct pkt_filter_cfg *request, + uint8_t sessionId) +{ + struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req = NULL; + struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param = NULL; + int i = 0; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + if (hdd_ctx->config->disablePacketFilter) { + hdd_warn("Packet filtering disabled in ini"); + return 0; + } + + /* Debug display of request components. */ + hdd_debug("Packet Filter Request : FA %d params %d", + request->filter_action, request->num_params); + + switch (request->filter_action) { + case HDD_RCV_FILTER_SET: + hdd_debug("Set Packet Filter Request for Id: %d", + request->filter_id); + + pmo_set_pkt_fltr_req = + qdf_mem_malloc(sizeof(*pmo_set_pkt_fltr_req)); + if (!pmo_set_pkt_fltr_req) { + hdd_err("unable to allocate pmo_set_pkt_fltr_req"); + return QDF_STATUS_E_NOMEM; + } + + pmo_set_pkt_fltr_req->filter_id = request->filter_id; + if (request->num_params >= HDD_MAX_CMP_PER_PACKET_FILTER) { + hdd_err("Number of Params exceed Max limit %d", + request->num_params); + status = QDF_STATUS_E_INVAL; + goto out; + } + pmo_set_pkt_fltr_req->num_params = request->num_params; + pmo_set_pkt_fltr_req->coalesce_time = 0; + pmo_set_pkt_fltr_req->filter_type = PMO_RCV_FILTER_TYPE_FILTER_PKT; + for (i = 0; i < request->num_params; i++) { + pmo_set_pkt_fltr_req->params_data[i].protocol_layer = + request->params_data[i].protocol_layer; + pmo_set_pkt_fltr_req->params_data[i].compare_flag = + request->params_data[i].compare_flag; + pmo_set_pkt_fltr_req->params_data[i].data_offset = + request->params_data[i].data_offset; + pmo_set_pkt_fltr_req->params_data[i].data_length = + request->params_data[i].data_length; + pmo_set_pkt_fltr_req->params_data[i].reserved = 0; + + if (request->params_data[i].data_offset > + SIR_MAX_FILTER_TEST_DATA_OFFSET) { + hdd_err("Invalid data offset %u for param %d (max = %d)", + request->params_data[i].data_offset, + i, + SIR_MAX_FILTER_TEST_DATA_OFFSET); + status = QDF_STATUS_E_INVAL; + goto out; + } + + if (request->params_data[i].data_length > + SIR_MAX_FILTER_TEST_DATA_LEN) { + hdd_err("Error invalid data length %d", + request->params_data[i].data_length); + status = QDF_STATUS_E_INVAL; + goto out; + } + + hdd_debug("Proto %d Comp Flag %d Filter Type %d", + request->params_data[i].protocol_layer, + request->params_data[i].compare_flag, + pmo_set_pkt_fltr_req->filter_type); + + hdd_debug("Data Offset %d Data Len %d", + request->params_data[i].data_offset, + request->params_data[i].data_length); + + if (sizeof( + pmo_set_pkt_fltr_req->params_data[i].compare_data) + < (request->params_data[i].data_length)) { + hdd_err("Error invalid data length %d", + request->params_data[i].data_length); + status = QDF_STATUS_E_INVAL; + goto out; + } + + memcpy( + &pmo_set_pkt_fltr_req->params_data[i].compare_data, + request->params_data[i].compare_data, + request->params_data[i].data_length); + memcpy(&pmo_set_pkt_fltr_req->params_data[i].data_mask, + request->params_data[i].data_mask, + request->params_data[i].data_length); + + hdd_debug("CData %d CData %d CData %d CData %d CData %d CData %d", + request->params_data[i].compare_data[0], + request->params_data[i].compare_data[1], + request->params_data[i].compare_data[2], + request->params_data[i].compare_data[3], + request->params_data[i].compare_data[4], + request->params_data[i].compare_data[5]); + + hdd_debug("MData %d MData %d MData %d MData %d MData %d MData %d", + request->params_data[i].data_mask[0], + request->params_data[i].data_mask[1], + request->params_data[i].data_mask[2], + request->params_data[i].data_mask[3], + request->params_data[i].data_mask[4], + request->params_data[i].data_mask[5]); + } + + if (QDF_STATUS_SUCCESS != + pmo_ucfg_set_pkt_filter(hdd_ctx->hdd_psoc, + pmo_set_pkt_fltr_req, + sessionId)) { + hdd_err("Failure to execute Set Filter"); + status = QDF_STATUS_E_INVAL; + goto out; + } + + break; + + case HDD_RCV_FILTER_CLEAR: + hdd_debug("Clear Packet Filter Request for Id: %d", + request->filter_id); + + pmo_clr_pkt_fltr_param = qdf_mem_malloc( + sizeof(*pmo_clr_pkt_fltr_param)); + if (!pmo_clr_pkt_fltr_param) { + hdd_err("unable to allocate pmo_clr_pkt_fltr_param"); + return QDF_STATUS_E_NOMEM; + } + + pmo_clr_pkt_fltr_param->filter_id = request->filter_id; + if (QDF_STATUS_SUCCESS != + pmo_ucfg_clear_pkt_filter(hdd_ctx->hdd_psoc, + pmo_clr_pkt_fltr_param, + sessionId)) { + hdd_err("Failure to execute Clear Filter"); + status = QDF_STATUS_E_INVAL; + goto out; + } + break; + + default: + hdd_err("Packet Filter Request: Invalid %d", + request->filter_action); + return -EINVAL; + } + +out: + if (pmo_set_pkt_fltr_req) + qdf_mem_free(pmo_set_pkt_fltr_req); + if (pmo_clr_pkt_fltr_param) + qdf_mem_free(pmo_clr_pkt_fltr_param); + + return status; +} diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c index d0b3166de5bc..accbb481c900 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -8245,174 +8245,6 @@ static int iw_set_keepalive_params(struct net_device *dev, } #ifdef WLAN_FEATURE_PACKET_FILTERING -/** - * 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(struct hdd_context *hdd_ctx, - struct pkt_filter_cfg *request, - uint8_t sessionId) -{ - struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req = NULL; - struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param = NULL; - int i = 0; - QDF_STATUS status = QDF_STATUS_SUCCESS; - - if (hdd_ctx->config->disablePacketFilter) { - hdd_warn("Packet filtering disabled in ini"); - return 0; - } - - /* Debug display of request components. */ - hdd_debug("Packet Filter Request : FA %d params %d", - request->filter_action, request->num_params); - - switch (request->filter_action) { - case HDD_RCV_FILTER_SET: - hdd_debug("Set Packet Filter Request for Id: %d", - request->filter_id); - - pmo_set_pkt_fltr_req = - qdf_mem_malloc(sizeof(*pmo_set_pkt_fltr_req)); - if (!pmo_set_pkt_fltr_req) { - hdd_err("unable to allocate pmo_set_pkt_fltr_req"); - return QDF_STATUS_E_NOMEM; - } - - pmo_set_pkt_fltr_req->filter_id = request->filter_id; - if (request->num_params >= HDD_MAX_CMP_PER_PACKET_FILTER) { - hdd_err("Number of Params exceed Max limit %d", - request->num_params); - status = QDF_STATUS_E_INVAL; - goto out; - } - pmo_set_pkt_fltr_req->num_params = request->num_params; - pmo_set_pkt_fltr_req->coalesce_time = 0; - pmo_set_pkt_fltr_req->filter_type = PMO_RCV_FILTER_TYPE_FILTER_PKT; - for (i = 0; i < request->num_params; i++) { - pmo_set_pkt_fltr_req->params_data[i].protocol_layer = - request->params_data[i].protocol_layer; - pmo_set_pkt_fltr_req->params_data[i].compare_flag = - request->params_data[i].compare_flag; - pmo_set_pkt_fltr_req->params_data[i].data_offset = - request->params_data[i].data_offset; - pmo_set_pkt_fltr_req->params_data[i].data_length = - request->params_data[i].data_length; - pmo_set_pkt_fltr_req->params_data[i].reserved = 0; - - if (request->params_data[i].data_offset > - SIR_MAX_FILTER_TEST_DATA_OFFSET) { - hdd_err("Invalid data offset %u for param %d (max = %d)", - request->params_data[i].data_offset, - i, - SIR_MAX_FILTER_TEST_DATA_OFFSET); - status = QDF_STATUS_E_INVAL; - goto out; - } - - if (request->params_data[i].data_length > - SIR_MAX_FILTER_TEST_DATA_LEN) { - hdd_err("Error invalid data length %d", - request->params_data[i].data_length); - status = QDF_STATUS_E_INVAL; - goto out; - } - - hdd_debug("Proto %d Comp Flag %d Filter Type %d", - request->params_data[i].protocol_layer, - request->params_data[i].compare_flag, - pmo_set_pkt_fltr_req->filter_type); - - hdd_debug("Data Offset %d Data Len %d", - request->params_data[i].data_offset, - request->params_data[i].data_length); - - if (sizeof( - pmo_set_pkt_fltr_req->params_data[i].compare_data) - < (request->params_data[i].data_length)) { - hdd_err("Error invalid data length %d", - request->params_data[i].data_length); - status = QDF_STATUS_E_INVAL; - goto out; - } - - memcpy( - &pmo_set_pkt_fltr_req->params_data[i].compare_data, - request->params_data[i].compare_data, - request->params_data[i].data_length); - memcpy(&pmo_set_pkt_fltr_req->params_data[i].data_mask, - request->params_data[i].data_mask, - request->params_data[i].data_length); - - hdd_debug("CData %d CData %d CData %d CData %d CData %d CData %d", - request->params_data[i].compare_data[0], - request->params_data[i].compare_data[1], - request->params_data[i].compare_data[2], - request->params_data[i].compare_data[3], - request->params_data[i].compare_data[4], - request->params_data[i].compare_data[5]); - - hdd_debug("MData %d MData %d MData %d MData %d MData %d MData %d", - request->params_data[i].data_mask[0], - request->params_data[i].data_mask[1], - request->params_data[i].data_mask[2], - request->params_data[i].data_mask[3], - request->params_data[i].data_mask[4], - request->params_data[i].data_mask[5]); - } - - if (QDF_STATUS_SUCCESS != - pmo_ucfg_set_pkt_filter(hdd_ctx->hdd_psoc, - pmo_set_pkt_fltr_req, - sessionId)) { - hdd_err("Failure to execute Set Filter"); - status = QDF_STATUS_E_INVAL; - goto out; - } - - break; - - case HDD_RCV_FILTER_CLEAR: - hdd_debug("Clear Packet Filter Request for Id: %d", - request->filter_id); - - pmo_clr_pkt_fltr_param = qdf_mem_malloc( - sizeof(*pmo_clr_pkt_fltr_param)); - if (!pmo_clr_pkt_fltr_param) { - hdd_err("unable to allocate pmo_clr_pkt_fltr_param"); - return QDF_STATUS_E_NOMEM; - } - - pmo_clr_pkt_fltr_param->filter_id = request->filter_id; - if (QDF_STATUS_SUCCESS != - pmo_ucfg_clear_pkt_filter(hdd_ctx->hdd_psoc, - pmo_clr_pkt_fltr_param, - sessionId)) { - hdd_err("Failure to execute Clear Filter"); - status = QDF_STATUS_E_INVAL; - goto out; - } - break; - - default: - hdd_err("Packet Filter Request: Invalid %d", - request->filter_action); - return -EINVAL; - } - -out: - if (pmo_set_pkt_fltr_req) - qdf_mem_free(pmo_set_pkt_fltr_req); - if (pmo_clr_pkt_fltr_param) - qdf_mem_free(pmo_clr_pkt_fltr_param); - - return status; -} - /** * __iw_set_packet_filter_params() - set packet filter parameters in target * @dev: Pointer to netdev