1 /* Copyright (c) 2014, The Linux Foundation. All rights reserved.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions
5  * are met:
6  *  * Redistributions of source code must retain the above copyright
7  *    notice, this list of conditions and the following disclaimer.
8  *  * Redistributions in binary form must reproduce the above copyright
9  *    notice, this list of conditions and the following disclaimer in
10  *    the documentation and/or other materials provided with the
11  *    distribution.
12  *  * Neither the name of The Linux Foundation nor the names of its
13  *    contributors may be used to endorse or promote products derived
14  *    from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #ifndef __WIFI_HAL_IFACEEVENTHANDLER_COMMAND_H__
30 #define __WIFI_HAL_IFACEEVENTHANDLER_COMMAND_H__
31 
32 #include "common.h"
33 #include "cpp_bindings.h"
34 #ifdef __GNUC__
35 #define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b))))
36 #define STRUCT_PACKED __attribute__ ((packed))
37 #else
38 #define PRINTF_FORMAT(a,b)
39 #define STRUCT_PACKED
40 #endif
41 #include "vendor_definitions.h"
42 #include <hardware_legacy/wifi_hal.h>
43 
44 #ifdef __cplusplus
45 extern "C"
46 {
47 #endif /* __cplusplus */
48 
49 typedef struct{
50     int num_entries;
51     radar_history_result *entries;
52 } RadarHistoryResultsParams;
53 
54 class wifiEventHandler: public WifiCommand
55 {
56 private:
57     int mRequestId;
58 
59 protected:
60     struct nlattr *tb[NL80211_ATTR_MAX + 1];
61     u32 mSubcmd;
62 
63 public:
64     wifiEventHandler(wifi_handle handle, int id, u32 subcmd);
65     virtual ~wifiEventHandler();
66     virtual int get_request_id();
67     virtual int handleEvent(WifiEvent &event);
68 };
69 
70 class IfaceEventHandlerCommand: public wifiEventHandler
71 {
72 private:
73     char *mEventData;
74     u32 mDataLen;
75     wifi_event_handler mHandler;
76 
77 public:
78     IfaceEventHandlerCommand(wifi_handle handle, int id, u32 subcmd);
79     virtual ~IfaceEventHandlerCommand();
80 
81     virtual int handleEvent(WifiEvent &event);
82     virtual void setCallbackHandler(wifi_event_handler nHandler);
83     virtual int get_request_id();
84 };
85 
86 class WifihalGeneric: public WifiVendorCommand
87 {
88 private:
89     feature_set mSet;
90     features_info mDriverFeatures;
91     int mSetSizeMax;
92     int *mSetSizePtr;
93     feature_set *mConcurrencySet;
94     int filterVersion;
95     int filterLength;
96     int firmware_bus_max_size;
97     wifi_capa *mCapa;
98     /* Packet Filter buffer and length */
99     u8 *mfilter_packet_read_buffer;
100     int mfilter_packet_length;
101     u32 res_size;
102     wifi_usable_channel *channel_buff;
103     RadarHistoryResultsParams mRadarResultParams;
104     virtual wifi_error wifiParseCapabilities(struct nlattr **tbVendor);
105     virtual wifi_error wifiParseRadarHistory();
106 
107 public:
108     WifihalGeneric(wifi_handle handle, int id, u32 vendor_id, u32 subcmd);
109     virtual ~WifihalGeneric();
110     virtual wifi_error requestResponse();
111     virtual int handleResponse(WifiEvent &reply);
112     virtual int handle_response_usable_channels(struct nlattr *VendorData,
113                                                 u32 mDataLen);
114     virtual void getResponseparams(feature_set *pset);
115     virtual void getDriverFeatures(features_info *pfeatures);
116     virtual void setMaxSetSize(int set_size_max);
117     virtual void setSizePtr(int *set_size);
118     virtual void setPacketBufferParams(u8 *host_packet_buffer, int packet_length);
119     virtual void setConcurrencySet(feature_set set[]);
120     virtual int getFilterVersion();
121     virtual int getFilterLength();
122     virtual int getBusSize();
123     virtual wifi_error wifiGetCapabilities(wifi_interface_handle handle);
124     virtual void set_channels_buff(wifi_usable_channel *channels);
125     virtual u32 get_results_size(void);
126     virtual wifi_error copyCachedRadarHistory(radar_history_result *resultBuf,
127             int resultBufSize, int *numResults);
128     virtual void freeCachedRadarHistory();
129     virtual wifi_error getSarVersion(wifi_interface_handle handle);
130 };
131 
132 /**
133  * nla_for_each_nested from libnl is throwing implicit conversion from void*
134  * error. Adding a local definition to avoid it.
135  */
136 #define for_each_nested_attribute(pos, nla, rem) \
137     for (pos = (struct nlattr *)nla_data(nla), rem = nla_len(nla); \
138          nla_ok(pos, rem); \
139          pos = nla_next(pos, &(rem)))
140 
141 #ifdef __cplusplus
142 }
143 #endif /* __cplusplus */
144 #endif
145