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
Cette révision appartient à :
Jeff Johnson
2018-04-21 10:06:09 -07:00
révisé par nshrivas
Parent e8b1b82e17
révision 11ba331f28
2 fichiers modifiés avec 161 ajouts et 169 suppressions

Voir le fichier

@@ -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;
}

Voir le fichier

@@ -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