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 
50 class wifiEventHandler: public WifiCommand
51 {
52 private:
53     int mRequestId;
54 
55 protected:
56     struct nlattr *tb[NL80211_ATTR_MAX + 1];
57     u32 mSubcmd;
58 
59 public:
60     wifiEventHandler(wifi_handle handle, int id, u32 subcmd);
61     virtual ~wifiEventHandler();
62     virtual int get_request_id();
63     virtual int handleEvent(WifiEvent &event);
64 };
65 
66 class IfaceEventHandlerCommand: public wifiEventHandler
67 {
68 private:
69     char *mEventData;
70     u32 mDataLen;
71     wifi_event_handler mHandler;
72 
73 public:
74     IfaceEventHandlerCommand(wifi_handle handle, int id, u32 subcmd);
75     virtual ~IfaceEventHandlerCommand();
76 
77     virtual int handleEvent(WifiEvent &event);
78     virtual void setCallbackHandler(wifi_event_handler nHandler);
79     virtual int get_request_id();
80 };
81 
82 class WifihalGeneric: public WifiVendorCommand
83 {
84 private:
85     feature_set mSet;
86     features_info mDriverFeatures;
87     int mSetSizeMax;
88     int *mSetSizePtr;
89     feature_set *mConcurrencySet;
90     int filterVersion;
91     int filterLength;
92     int firmware_bus_max_size;
93     wifi_capa *mCapa;
94     /* Packet Filter buffer and length */
95     u8 *mfilter_packet_read_buffer;
96     int mfilter_packet_length;
97     u32 res_size;
98     wifi_usable_channel *channel_buff;
99     virtual wifi_error wifiParseCapabilities(struct nlattr **tbVendor);
100 
101 public:
102     WifihalGeneric(wifi_handle handle, int id, u32 vendor_id, u32 subcmd);
103     virtual ~WifihalGeneric();
104     virtual wifi_error requestResponse();
105     virtual int handleResponse(WifiEvent &reply);
106     virtual int handle_response_usable_channels(struct nlattr *VendorData,
107                                                 u32 mDataLen);
108     virtual void getResponseparams(feature_set *pset);
109     virtual void getDriverFeatures(features_info *pfeatures);
110     virtual void setMaxSetSize(int set_size_max);
111     virtual void setSizePtr(int *set_size);
112     virtual void setPacketBufferParams(u8 *host_packet_buffer, int packet_length);
113     virtual void setConcurrencySet(feature_set set[]);
114     virtual int getFilterVersion();
115     virtual int getFilterLength();
116     virtual int getBusSize();
117     virtual wifi_error wifiGetCapabilities(wifi_interface_handle handle);
118     virtual void set_channels_buff(wifi_usable_channel *channels);
119     virtual u32 get_results_size(void);
120 };
121 
122 /**
123  * nla_for_each_nested from libnl is throwing implicit conversion from void*
124  * error. Adding a local definition to avoid it.
125  */
126 #define for_each_nested_attribute(pos, nla, rem) \
127     for (pos = (struct nlattr *)nla_data(nla), rem = nla_len(nla); \
128          nla_ok(pos, rem); \
129          pos = nla_next(pos, &(rem)))
130 
131 #ifdef __cplusplus
132 }
133 #endif /* __cplusplus */
134 #endif
135