qcacmn: Configure and clear packet filter
Add PMO changes to configure and clear default packet filters over suspend and resume Change-Id: I2e150defc8ce60e7b8346d058bfe3d9ec286aa26 CRs-Fixed: 2034458
This commit is contained in:

committed by
snandini

parent
94a9ec829c
commit
7e3ec7a1dc
57
pmo/core/inc/wlan_pmo_pkt_filter.h
Normal file
57
pmo/core/inc/wlan_pmo_pkt_filter.h
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* 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: Declare packet filter feature API's
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _WLAN_PMO_PKT_FILTER_H_
|
||||||
|
#define _WLAN_PMO_PKT_FILTER_
|
||||||
|
|
||||||
|
#include "wlan_pmo_pkt_filter_public_struct.h"
|
||||||
|
|
||||||
|
struct wlan_objmgr_psoc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pmo_set_pkt_fltr_req() - Set packet filter
|
||||||
|
* @vdev: objmgr vdev
|
||||||
|
* @pmo_set_pkt_fltr_req:
|
||||||
|
* @vdev_id:
|
||||||
|
* API to set packet filter
|
||||||
|
*
|
||||||
|
* Return: QQDF_STATUS_SUCCESS in case of success else return error
|
||||||
|
*/
|
||||||
|
QDF_STATUS pmo_core_set_pkt_filter(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req,
|
||||||
|
uint8_t vdev_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pmo_core_clear_pkt_filter() - Clear packet filter
|
||||||
|
* @vdev: objmgr vdev
|
||||||
|
* @pmo_clr_pkt_fltr_req:
|
||||||
|
* @vdev_id:
|
||||||
|
*
|
||||||
|
* API to clear packet filter
|
||||||
|
*
|
||||||
|
* Return: QQDF_STATUS_SUCCESS in case of success else return error
|
||||||
|
*/
|
||||||
|
QDF_STATUS pmo_core_clear_pkt_filter(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_req,
|
||||||
|
uint8_t vdev_id);
|
||||||
|
|
||||||
|
#endif /* end of _WLAN_PMO_PKT_FILTER_H_ */
|
||||||
|
|
96
pmo/core/src/wlan_pmo_pkt_filter.c
Normal file
96
pmo/core/src/wlan_pmo_pkt_filter.c
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* 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: Implements Packet filter feature API's
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wlan_pmo_pkt_filter.h"
|
||||||
|
#include "wlan_pmo_tgt_api.h"
|
||||||
|
#include "wlan_pmo_main.h"
|
||||||
|
#include "wlan_pmo_obj_mgmt_public_struct.h"
|
||||||
|
|
||||||
|
QDF_STATUS pmo_core_set_pkt_filter(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
struct wlan_objmgr_vdev *vdev;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
PMO_ENTER();
|
||||||
|
|
||||||
|
if (!psoc) {
|
||||||
|
pmo_err("psoc is null");
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
|
||||||
|
if (!vdev) {
|
||||||
|
pmo_err("vdev is NULL");
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = pmo_tgt_set_pkt_filter(vdev, pmo_set_pkt_fltr_req, vdev_id);
|
||||||
|
if (status != QDF_STATUS_SUCCESS)
|
||||||
|
goto dec_ref;
|
||||||
|
|
||||||
|
dec_ref:
|
||||||
|
wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
|
||||||
|
out:
|
||||||
|
PMO_EXIT();
|
||||||
|
|
||||||
|
return status;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS pmo_core_clear_pkt_filter(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
struct wlan_objmgr_vdev *vdev;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
PMO_ENTER();
|
||||||
|
|
||||||
|
if (!psoc) {
|
||||||
|
pmo_err("psoc is null");
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
|
||||||
|
if (!vdev) {
|
||||||
|
pmo_err("vdev is NULL");
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = pmo_tgt_clear_pkt_filter(vdev, pmo_clr_pkt_fltr_param,
|
||||||
|
vdev_id);
|
||||||
|
if (status != QDF_STATUS_SUCCESS)
|
||||||
|
goto dec_ref;
|
||||||
|
|
||||||
|
dec_ref:
|
||||||
|
wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
|
||||||
|
out:
|
||||||
|
PMO_EXIT();
|
||||||
|
|
||||||
|
return status;
|
||||||
|
|
||||||
|
}
|
141
pmo/dispatcher/inc/wlan_pmo_pkt_filter_public_struct.h
Normal file
141
pmo/dispatcher/inc/wlan_pmo_pkt_filter_public_struct.h
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* 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: Declare various struct, macros which shall be used in
|
||||||
|
* pmo packet filter feature.
|
||||||
|
*
|
||||||
|
* Note: This file shall not contain public API's prototype/declarations.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _WLAN_PMO_PKT_FILTER_PUBLIC_STRUCT_H_
|
||||||
|
#define _WLAN_PMO_PKT_FILTER_PUBLIC_STRUCT_H_
|
||||||
|
|
||||||
|
#include "qdf_types.h"
|
||||||
|
|
||||||
|
#define PMO_MAX_FILTER_TEST_DATA_LEN 8
|
||||||
|
#define PMO_MAX_NUM_TESTS_PER_FILTER 10
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum pmo_rcv_pkt_fltr_type: Receive Filter Parameters
|
||||||
|
* @PMO_RCV_FILTER_TYPE_INVALID: invalied filter type
|
||||||
|
* @PMO_RCV_FILTER_TYPE_FILTER_PKT: packet filter
|
||||||
|
* @PMO_RCV_FILTER_TYPE_BUFFER_PKT: buffer packet
|
||||||
|
* @PMO_RCV_FILTER_TYPE_MAX_ENUM_SIZE: max filter
|
||||||
|
*/
|
||||||
|
enum pmo_rcv_pkt_fltr_type {
|
||||||
|
PMO_RCV_FILTER_TYPE_INVALID,
|
||||||
|
PMO_RCV_FILTER_TYPE_FILTER_PKT,
|
||||||
|
PMO_RCV_FILTER_TYPE_BUFFER_PKT,
|
||||||
|
PMO_RCV_FILTER_TYPE_MAX_ENUM_SIZE
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum pmo_rcv_pkt_fltr_flag_type: Receive Filter flags
|
||||||
|
* @PMO_FILTER_CMP_TYPE_INVALID: invalied flag
|
||||||
|
* @PMO_FILTER_CMP_TYPE_EQUAL: equal
|
||||||
|
* @PMO_FILTER_CMP_TYPE_MASK_EQUAL: mask
|
||||||
|
* @PMO_FILTER_CMP_TYPE_NOT_EQUAL: not equal
|
||||||
|
* @PMO_FILTER_CMP_TYPE_MASK_NOT_EQUAL: mask not equal
|
||||||
|
* @PMO_FILTER_CMP_TYPE_MAX: max size of flag
|
||||||
|
*/
|
||||||
|
enum pmo_rcv_pkt_fltr_flag_type {
|
||||||
|
PMO_FILTER_CMP_TYPE_INVALID,
|
||||||
|
PMO_FILTER_CMP_TYPE_EQUAL,
|
||||||
|
PMO_FILTER_CMP_TYPE_MASK_EQUAL,
|
||||||
|
PMO_FILTER_CMP_TYPE_NOT_EQUAL,
|
||||||
|
PMO_FILTER_CMP_TYPE_MASK_NOT_EQUAL,
|
||||||
|
PMO_FILTER_CMP_TYPE_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum pmo_rcv_pkt_fltr_protocol_params: Receive Filter protocal parameters
|
||||||
|
* @PMO_FILTER_HDR_TYPE_INVALID: invalied type
|
||||||
|
* @PMO_FILTER_HDR_TYPE_MAC: mac protocol
|
||||||
|
* @PMO_FILTER_HDR_TYPE_ARP: arp protocol
|
||||||
|
* @PMO_FILTER_HDR_TYPE_IPV4: ipv4 protocol
|
||||||
|
* @PMO_FILTER_HDR_TYPE_IPV6: ipv6 protocol
|
||||||
|
* @PMO_FILTER_HDR_TYPE_UDP: udp protocol
|
||||||
|
* @PMO_FILTER_HDR_TYPE_MAX: max of type of protocol
|
||||||
|
*/
|
||||||
|
enum pmo_rcv_pkt_fltr_protocol_params {
|
||||||
|
PMO_FILTER_HDR_TYPE_INVALID,
|
||||||
|
PMO_FILTER_HDR_TYPE_MAC,
|
||||||
|
PMO_FILTER_HDR_TYPE_ARP,
|
||||||
|
PMO_FILTER_HDR_TYPE_IPV4,
|
||||||
|
PMO_FILTER_HDR_TYPE_IPV6,
|
||||||
|
PMO_FILTER_HDR_TYPE_UDP,
|
||||||
|
PMO_FILTER_HDR_TYPE_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct pmo_rcv_pkt_fltr_field_params - pmo packet filter field parameters
|
||||||
|
* @protocol_layer: Protocol layer
|
||||||
|
* @compare_flag: Comparison flag
|
||||||
|
* @data_length: Length of the data to compare
|
||||||
|
* @data_offset: from start of the respective frame header
|
||||||
|
* @reserved: Reserved field
|
||||||
|
* @compare_data: Data to compare
|
||||||
|
* @data_mask: Mask to be applied on the received packet data before compare
|
||||||
|
*/
|
||||||
|
struct pmo_rcv_pkt_fltr_field_params {
|
||||||
|
enum pmo_rcv_pkt_fltr_protocol_params protocol_layer;
|
||||||
|
enum pmo_rcv_pkt_fltr_flag_type compare_flag;
|
||||||
|
uint16_t data_length;
|
||||||
|
uint8_t data_offset;
|
||||||
|
uint8_t reserved;
|
||||||
|
uint8_t compare_data[PMO_MAX_FILTER_TEST_DATA_LEN];
|
||||||
|
uint8_t data_mask[PMO_MAX_FILTER_TEST_DATA_LEN];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct pmo_rcv_pkt_fltr_cfg - pmo packet filter config
|
||||||
|
* @filter_id: filter id
|
||||||
|
* @filter_type: filter type
|
||||||
|
* @num_params: number of parameters
|
||||||
|
* @coalesce_time: time
|
||||||
|
* @self_macaddr: mac address
|
||||||
|
* @bssid: Bssid of the connected AP
|
||||||
|
* @params_data: data
|
||||||
|
*/
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg {
|
||||||
|
uint8_t filter_id;
|
||||||
|
enum pmo_rcv_pkt_fltr_type filter_type;
|
||||||
|
uint32_t num_params;
|
||||||
|
uint32_t coalesce_time;
|
||||||
|
struct qdf_mac_addr self_macaddr;
|
||||||
|
struct qdf_mac_addr bssid;
|
||||||
|
struct pmo_rcv_pkt_fltr_field_params
|
||||||
|
params_data[PMO_MAX_NUM_TESTS_PER_FILTER];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct pmo_rcv_pkt_fltr_cfg - pmo receive Filter Clear Parameters
|
||||||
|
* @status: only valid for response message
|
||||||
|
* @filter_id:
|
||||||
|
* @self_macaddr:
|
||||||
|
* @bssid: peer ap address
|
||||||
|
*/
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param {
|
||||||
|
uint32_t status;
|
||||||
|
uint8_t filter_id;
|
||||||
|
struct qdf_mac_addr self_macaddr;
|
||||||
|
struct qdf_mac_addr bssid;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* end of _WLAN_PMO_PKT_FILTER_PUBLIC_STRUCT_H_ */
|
@@ -48,6 +48,34 @@ QDF_STATUS pmo_tgt_enable_non_arp_bcast_filter_req(
|
|||||||
QDF_STATUS pmo_tgt_disable_non_arp_bcast_filter_req(
|
QDF_STATUS pmo_tgt_disable_non_arp_bcast_filter_req(
|
||||||
struct wlan_objmgr_vdev *vdev, uint8_t vdev_id);
|
struct wlan_objmgr_vdev *vdev, uint8_t vdev_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pmo_tgt_set_pkt_filter() - Set packet filter
|
||||||
|
* @vdev: objmgr vdev
|
||||||
|
* @pmo_set_pkt_fltr_req:
|
||||||
|
* @vdev_id: vdev id
|
||||||
|
*
|
||||||
|
* API to set packet filter
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS in case of success else return error
|
||||||
|
*/
|
||||||
|
QDF_STATUS pmo_tgt_set_pkt_filter(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req,
|
||||||
|
uint8_t vdev_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pmo_tgt_clear_pkt_filter() - Clear packet filter
|
||||||
|
* @vdev: objmgr vdev
|
||||||
|
* @pmo_clr_pkt_fltr_param:
|
||||||
|
* @vdev_id: vdev id
|
||||||
|
*
|
||||||
|
* API to clear packet filter
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS in case of success else return error
|
||||||
|
*/
|
||||||
|
QDF_STATUS pmo_tgt_clear_pkt_filter(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param,
|
||||||
|
uint8_t vdev_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pmo_tgt_enable_arp_offload_req() - Enable arp offload req to target
|
* pmo_tgt_enable_arp_offload_req() - Enable arp offload req to target
|
||||||
* @vdev: objmgr vdev
|
* @vdev: objmgr vdev
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
#include "wlan_pmo_wow_public_struct.h"
|
#include "wlan_pmo_wow_public_struct.h"
|
||||||
#include "wlan_pmo_common_public_struct.h"
|
#include "wlan_pmo_common_public_struct.h"
|
||||||
#include "wlan_pmo_obj_mgmt_api.h"
|
#include "wlan_pmo_obj_mgmt_api.h"
|
||||||
|
#include "wlan_pmo_pkt_filter_public_struct.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pmo_ucfg_is_ap_mode_supports_arp_ns() - Check ap mode support arp&ns offload
|
* pmo_ucfg_is_ap_mode_supports_arp_ns() - Check ap mode support arp&ns offload
|
||||||
@@ -300,6 +301,30 @@ QDF_STATUS pmo_ucfg_enable_gtk_offload_in_fwr(struct wlan_objmgr_vdev *vdev);
|
|||||||
*/
|
*/
|
||||||
QDF_STATUS pmo_ucfg_disable_gtk_offload_in_fwr(struct wlan_objmgr_vdev *vdev);
|
QDF_STATUS pmo_ucfg_disable_gtk_offload_in_fwr(struct wlan_objmgr_vdev *vdev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pmo_ucfg_set_pkt_filter() - Set packet filter
|
||||||
|
* @psoc: objmgr psoc handle
|
||||||
|
* @pmo_set_pkt_fltr_req:
|
||||||
|
* @vdev_id: vdev id
|
||||||
|
*
|
||||||
|
* Return QDF_STATUS_SUCCESS -in case of success else return error
|
||||||
|
*/
|
||||||
|
QDF_STATUS pmo_ucfg_set_pkt_filter(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req,
|
||||||
|
uint8_t vdev_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pmo_ucfg_clear_pkt_filter() - Clear packet filter
|
||||||
|
* @psoc: objmgr psoc handle
|
||||||
|
* @pmo_clr_pkt_fltr_req:
|
||||||
|
* @vdev_id: vdev id
|
||||||
|
*
|
||||||
|
* Return QDF_STATUS_SUCCESS -in case of success else return error
|
||||||
|
*/
|
||||||
|
QDF_STATUS pmo_ucfg_clear_pkt_filter(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param,
|
||||||
|
uint8_t vdev_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pmo_ucfg_get_gtk_rsp(): API to send gtk response request to fwr
|
* pmo_ucfg_get_gtk_rsp(): API to send gtk response request to fwr
|
||||||
* @vdev: objmgr vdev handle
|
* @vdev: objmgr vdev handle
|
||||||
|
155
pmo/dispatcher/src/wlan_pmo_tgt_pkt_filter.c
Normal file
155
pmo/dispatcher/src/wlan_pmo_tgt_pkt_filter.c
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
* 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: Implements public API for pmo to interact with target/WMI
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wlan_pmo_tgt_api.h"
|
||||||
|
#include "wlan_pmo_pkt_filter_public_struct.h"
|
||||||
|
#include "wlan_pmo_obj_mgmt_public_struct.h"
|
||||||
|
|
||||||
|
QDF_STATUS pmo_tgt_set_pkt_filter(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg *request_buf = NULL;
|
||||||
|
struct wlan_objmgr_psoc *psoc;
|
||||||
|
struct wlan_lmac_if_pmo_tx_ops pmo_tx_ops;
|
||||||
|
struct qdf_mac_addr peer_bssid;
|
||||||
|
|
||||||
|
PMO_ENTER();
|
||||||
|
|
||||||
|
psoc = wlan_vdev_get_psoc(vdev);
|
||||||
|
if (!psoc) {
|
||||||
|
pmo_err("psoc unavailable for vdev %p", vdev);
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmo_info("filter_type=%d, filter_id = %d",
|
||||||
|
pmo_set_pkt_fltr_req->filter_type,
|
||||||
|
pmo_set_pkt_fltr_req->filter_id);
|
||||||
|
|
||||||
|
request_buf = qdf_mem_malloc(sizeof(*request_buf));
|
||||||
|
|
||||||
|
if (request_buf == NULL) {
|
||||||
|
pmo_err("Not able to allocate memory for Receive Filter Set Filter request");
|
||||||
|
status = QDF_STATUS_E_NOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = pmo_get_vdev_bss_peer_mac_addr(vdev,
|
||||||
|
&peer_bssid);
|
||||||
|
if (status != QDF_STATUS_SUCCESS) {
|
||||||
|
status = QDF_STATUS_E_INVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
qdf_mem_copy(request_buf, pmo_set_pkt_fltr_req, sizeof(*request_buf));
|
||||||
|
|
||||||
|
qdf_mem_copy(&request_buf->self_macaddr.bytes,
|
||||||
|
wlan_vdev_mlme_get_macaddr(vdev),
|
||||||
|
QDF_MAC_ADDR_SIZE);
|
||||||
|
|
||||||
|
qdf_copy_macaddr(&pmo_set_pkt_fltr_req->bssid,
|
||||||
|
&peer_bssid);
|
||||||
|
|
||||||
|
pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
|
||||||
|
if (!pmo_tx_ops.send_set_pkt_filter) {
|
||||||
|
pmo_err("send_set_pkt_filter is null");
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = pmo_tx_ops.send_set_pkt_filter(vdev, request_buf);
|
||||||
|
if (status != QDF_STATUS_SUCCESS)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (request_buf)
|
||||||
|
qdf_mem_free(request_buf);
|
||||||
|
PMO_EXIT();
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS pmo_tgt_clear_pkt_filter(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param *request_buf = NULL;
|
||||||
|
struct wlan_objmgr_psoc *psoc;
|
||||||
|
struct wlan_lmac_if_pmo_tx_ops pmo_tx_ops;
|
||||||
|
struct qdf_mac_addr peer_bssid;
|
||||||
|
|
||||||
|
PMO_ENTER();
|
||||||
|
|
||||||
|
psoc = wlan_vdev_get_psoc(vdev);
|
||||||
|
if (!psoc) {
|
||||||
|
pmo_err("psoc unavailable for vdev %p", vdev);
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmo_info("filter_id = %d", pmo_clr_pkt_fltr_param->filter_id);
|
||||||
|
|
||||||
|
request_buf = qdf_mem_malloc(sizeof(*request_buf));
|
||||||
|
|
||||||
|
if (request_buf == NULL) {
|
||||||
|
pmo_err("Not able to allocate memory for Receive Filter Set Filter request");
|
||||||
|
status = QDF_STATUS_E_NOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = pmo_get_vdev_bss_peer_mac_addr(vdev,
|
||||||
|
&peer_bssid);
|
||||||
|
if (status != QDF_STATUS_SUCCESS) {
|
||||||
|
status = QDF_STATUS_E_INVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
qdf_mem_copy(request_buf, pmo_clr_pkt_fltr_param, sizeof(*request_buf));
|
||||||
|
|
||||||
|
qdf_mem_copy(&request_buf->self_macaddr.bytes,
|
||||||
|
wlan_vdev_mlme_get_macaddr(vdev),
|
||||||
|
QDF_MAC_ADDR_SIZE);
|
||||||
|
|
||||||
|
qdf_copy_macaddr(&pmo_clr_pkt_fltr_param->bssid,
|
||||||
|
&peer_bssid);
|
||||||
|
|
||||||
|
pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
|
||||||
|
if (!pmo_tx_ops.send_clear_pkt_filter) {
|
||||||
|
pmo_err("send_clear_pkt_filter is null");
|
||||||
|
status = QDF_STATUS_E_NULL_VALUE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = pmo_tx_ops.send_clear_pkt_filter(vdev, request_buf);
|
||||||
|
if (status != QDF_STATUS_SUCCESS)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (request_buf)
|
||||||
|
qdf_mem_free(request_buf);
|
||||||
|
PMO_EXIT();
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
@@ -29,6 +29,7 @@
|
|||||||
#include "wlan_pmo_main.h"
|
#include "wlan_pmo_main.h"
|
||||||
#include "wlan_pmo_lphb.h"
|
#include "wlan_pmo_lphb.h"
|
||||||
#include "wlan_pmo_suspend_resume.h"
|
#include "wlan_pmo_suspend_resume.h"
|
||||||
|
#include "wlan_pmo_pkt_filter.h"
|
||||||
|
|
||||||
QDF_STATUS pmo_ucfg_get_psoc_config(struct wlan_objmgr_psoc *psoc,
|
QDF_STATUS pmo_ucfg_get_psoc_config(struct wlan_objmgr_psoc *psoc,
|
||||||
struct pmo_psoc_cfg *psoc_cfg)
|
struct pmo_psoc_cfg *psoc_cfg)
|
||||||
@@ -182,6 +183,21 @@ QDF_STATUS pmo_ucfg_disable_gtk_offload_in_fwr(struct wlan_objmgr_vdev *vdev)
|
|||||||
return pmo_core_disable_gtk_offload_in_fwr(vdev);
|
return pmo_core_disable_gtk_offload_in_fwr(vdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS pmo_ucfg_set_pkt_filter(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
return pmo_core_set_pkt_filter(psoc, pmo_set_pkt_fltr_req, vdev_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS pmo_ucfg_clear_pkt_filter(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
return pmo_core_clear_pkt_filter(psoc,
|
||||||
|
pmo_clr_pkt_fltr_param, vdev_id);
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS pmo_ucfg_get_gtk_rsp(struct wlan_objmgr_vdev *vdev,
|
QDF_STATUS pmo_ucfg_get_gtk_rsp(struct wlan_objmgr_vdev *vdev,
|
||||||
struct pmo_gtk_rsp_req *gtk_rsp_req)
|
struct pmo_gtk_rsp_req *gtk_rsp_req)
|
||||||
{
|
{
|
||||||
|
@@ -137,6 +137,30 @@ QDF_STATUS target_if_pmo_send_non_arp_bcast_filter_req(
|
|||||||
struct wlan_objmgr_vdev *vdev,
|
struct wlan_objmgr_vdev *vdev,
|
||||||
struct pmo_bcast_filter_params *bcast_req);
|
struct pmo_bcast_filter_params *bcast_req);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* target_if_pmo_send_pkt_filter_req() - enable packet filter
|
||||||
|
* @vdev: objmgr vdev
|
||||||
|
* @rcv_filter_param: filter params
|
||||||
|
*
|
||||||
|
* This function enable packet filter
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS for success or error code
|
||||||
|
*/
|
||||||
|
QDF_STATUS target_if_pmo_send_pkt_filter_req(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg *rcv_filter_param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* target_if_pmo_clear_pkt_filter_req() - disable packet filter
|
||||||
|
* @vdev: objmgr vdev
|
||||||
|
* @rcv_clear_param: filter params
|
||||||
|
*
|
||||||
|
* This function disable packet filter
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS for success or error code
|
||||||
|
*/
|
||||||
|
QDF_STATUS target_if_pmo_clear_pkt_filter_req(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param *rcv_clear_param);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* target_if_pmo_send_arp_offload_req() - sends arp request to fwr
|
* target_if_pmo_send_arp_offload_req() - sends arp request to fwr
|
||||||
* @vdev: objmgr vdev
|
* @vdev: objmgr vdev
|
||||||
|
@@ -94,6 +94,10 @@ void target_if_pmo_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
|
|||||||
target_if_pmo_psoc_send_host_wakeup_ind;
|
target_if_pmo_psoc_send_host_wakeup_ind;
|
||||||
pmo_tx_ops->psoc_send_target_resume_req =
|
pmo_tx_ops->psoc_send_target_resume_req =
|
||||||
target_if_pmo_psoc_send_target_resume_req;
|
target_if_pmo_psoc_send_target_resume_req;
|
||||||
|
pmo_tx_ops->send_set_pkt_filter =
|
||||||
|
target_if_pmo_send_pkt_filter_req;
|
||||||
|
pmo_tx_ops->send_clear_pkt_filter =
|
||||||
|
target_if_pmo_clear_pkt_filter_req;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
101
target_if/pmo/src/target_if_pmo_pkt_filter.c
Normal file
101
target_if/pmo/src/target_if_pmo_pkt_filter.c
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* 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: target_if_pmo_pkt_filter.c
|
||||||
|
*
|
||||||
|
* Target interface file for pmo component to
|
||||||
|
* send packet filter related cmd and process event.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "target_if.h"
|
||||||
|
#include "target_if_pmo.h"
|
||||||
|
#include "wmi_unified_pmo_api.h"
|
||||||
|
#include "wlan_pmo_pkt_filter_public_struct.h"
|
||||||
|
|
||||||
|
QDF_STATUS target_if_pmo_send_pkt_filter_req(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct pmo_rcv_pkt_fltr_cfg *rcv_filter_param)
|
||||||
|
{
|
||||||
|
uint8_t vdev_id;
|
||||||
|
struct wlan_objmgr_psoc *psoc;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
if (!vdev) {
|
||||||
|
target_if_err("vdev ptr passed is NULL");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlan_vdev_obj_lock(vdev);
|
||||||
|
psoc = wlan_vdev_get_psoc(vdev);
|
||||||
|
vdev_id = wlan_vdev_get_id(vdev);
|
||||||
|
wlan_vdev_obj_unlock(vdev);
|
||||||
|
if (!psoc) {
|
||||||
|
target_if_err("psoc handle is NULL");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send the command along with data */
|
||||||
|
status = wmi_unified_config_packet_filter_cmd(
|
||||||
|
GET_WMI_HDL_FROM_PSOC(psoc), vdev_id,
|
||||||
|
rcv_filter_param,
|
||||||
|
rcv_filter_param->filter_id, true);
|
||||||
|
if (status) {
|
||||||
|
target_if_err("Failed to send pkt_filter cmd");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable packet filter */
|
||||||
|
status = wmi_unified_enable_disable_packet_filter_cmd(
|
||||||
|
GET_WMI_HDL_FROM_PSOC(psoc),
|
||||||
|
vdev_id, true);
|
||||||
|
if (status)
|
||||||
|
target_if_err("Failed to send packet filter wmi cmd to fw");
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS target_if_pmo_clear_pkt_filter_req(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct pmo_rcv_pkt_fltr_clear_param *rcv_clear_param)
|
||||||
|
{
|
||||||
|
uint8_t vdev_id;
|
||||||
|
struct wlan_objmgr_psoc *psoc;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
if (!vdev) {
|
||||||
|
target_if_err("vdev ptr passed is NULL");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlan_vdev_obj_lock(vdev);
|
||||||
|
psoc = wlan_vdev_get_psoc(vdev);
|
||||||
|
vdev_id = wlan_vdev_get_id(vdev);
|
||||||
|
wlan_vdev_obj_unlock(vdev);
|
||||||
|
if (!psoc) {
|
||||||
|
target_if_err("psoc handle is NULL");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send the command along with data */
|
||||||
|
status = wmi_unified_config_packet_filter_cmd(
|
||||||
|
GET_WMI_HDL_FROM_PSOC(psoc), vdev_id,
|
||||||
|
NULL, rcv_clear_param->filter_id, false);
|
||||||
|
|
||||||
|
if (status)
|
||||||
|
target_if_err("Failed to clear filter cmd");
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
Reference in New Issue
Block a user