1  /*
2   * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for
6   * any purpose with or without fee is hereby granted, provided that the
7   * above copyright notice and this permission notice appear in all
8   * copies.
9   *
10   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17   * PERFORMANCE OF THIS SOFTWARE.
18   */
19  
20  /*
21   * This file was originally distributed by Qualcomm Atheros, Inc.
22   * under proprietary terms before Copyright ownership was assigned
23   * to the Linux Foundation.
24   */
25  
26  /**
27   * DOC: wlan_hdd_apf.h
28   *
29   * Android Packet Filter related API's and definitions
30   */
31  
32  #ifndef __WLAN_HDD_APF_H
33  #define __WLAN_HDD_APF_H
34  
35  #ifdef FEATURE_WLAN_APF
36  
37  #include <net/cfg80211.h>
38  #include "sir_api.h"
39  #include "wlan_hdd_main.h"
40  #include "wmi_unified_param.h"
41  #include "qca_vendor.h"
42  
43  #define APF_CONTEXT_MAGIC 0x4575354
44  
45  #define MAX_APF_MEMORY_LEN	4096
46  
47  /* APF commands wait times in msec */
48  #define WLAN_WAIT_TIME_APF_READ_MEM     10000
49  
50  /* QCA_NL80211_VENDOR_PACKET_FILTER policy */
51  extern const struct nla_policy wlan_hdd_apf_offload_policy[
52  			QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_MAX + 1];
53  
54  #define FEATURE_APF_OFFLOAD_VENDOR_COMMANDS \
55  	{ \
56  		.info.vendor_id = QCA_NL80211_VENDOR_ID, \
57  		.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_PACKET_FILTER, \
58  		.flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
59  			WIPHY_VENDOR_CMD_NEED_NETDEV | \
60  			WIPHY_VENDOR_CMD_NEED_RUNNING, \
61  		.doit = wlan_hdd_cfg80211_apf_offload, \
62  		vendor_command_policy(wlan_hdd_apf_offload_policy, \
63  				      QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_MAX) \
64  	},
65  
66  /**
67   * wlan_hdd_cfg80211_apf_offload() - SSR Wrapper to APF Offload
68   * @wiphy:    wiphy structure pointer
69   * @wdev:     Wireless device structure pointer
70   * @data:     Pointer to the data received
71   * @data_len: Length of @data
72   *
73   * Return: 0 on success; errno on failure
74   */
75  
76  int wlan_hdd_cfg80211_apf_offload(struct wiphy *wiphy,
77  				  struct wireless_dev *wdev,
78  				  const void *data, int data_len);
79  
80  /**
81   * hdd_apf_context_init - APF Context initialization operations
82   * @adapter: hdd adapter
83   *
84   * Return: None
85   */
86  void hdd_apf_context_init(struct hdd_adapter *adapter);
87  
88  /**
89   * hdd_apf_context_destroy - APF Context de-init operations
90   * @adapter: hdd adapter
91   *
92   * Return: None
93   */
94  void hdd_apf_context_destroy(struct hdd_adapter *adapter);
95  
96  /**
97   * hdd_get_apf_capabilities_cb() - Callback function to get APF capabilities
98   * @hdd_context: pointer to the hdd context
99   * @data: pointer to the data received
100   *
101   * This function receives the response/data from the lower layer and
102   * checks to see if the thread is still waiting then post the results to
103   * upper layer, if the request has timed out then ignore.
104   *
105   * Return: None
106   */
107  void hdd_get_apf_capabilities_cb(void *hdd_context,
108  				 struct sir_apf_get_offload *data);
109  #else /* FEATURE_WLAN_APF */
110  
111  #define FEATURE_APF_OFFLOAD_VENDOR_COMMANDS
112  
hdd_apf_context_init(struct hdd_adapter * adapter)113  static inline void hdd_apf_context_init(struct hdd_adapter *adapter)
114  {
115  }
116  
hdd_apf_context_destroy(struct hdd_adapter * adapter)117  static inline void hdd_apf_context_destroy(struct hdd_adapter *adapter)
118  {
119  }
120  
121  #endif /* FEATURE_WLAN_APF */
122  
123  #endif /* WLAN_HDD_APF_H */
124