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