1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef __WIFI_HAL_GSCAN_COMMAND_H__
18#define __WIFI_HAL_GSCAN_COMMAND_H__
19
20#include "common.h"
21#include "cpp_bindings.h"
22#ifdef __GNUC__
23#define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b))))
24#define STRUCT_PACKED __attribute__ ((packed))
25#else
26#define PRINTF_FORMAT(a,b)
27#define STRUCT_PACKED
28#endif
29#include "qca-vendor.h"
30#include "vendor_definitions.h"
31#include "gscan.h"
32
33#ifdef __cplusplus
34extern "C"
35{
36#endif /* __cplusplus */
37
38typedef struct{
39    u32 status;
40    u32 num_channels;
41    wifi_channel channels[];
42} GScanGetValidChannelsRspParams;
43
44typedef struct{
45    u32 status;
46    wifi_gscan_capabilities capabilities;
47} GScanGetCapabilitiesRspParams;
48
49typedef struct{
50    u32 status;
51} GScanStartRspParams;
52
53typedef struct{
54    u32 status;
55} GScanStopRspParams;
56
57typedef struct{
58    u32 status;
59} GScanSetBssidHotlistRspParams;
60
61typedef struct{
62    u32 status;
63} GScanResetBssidHotlistRspParams;
64
65typedef struct{
66    u8  more_data;
67    u32 num_results;
68    wifi_scan_result *results;
69} GScanGetCachedResultsRspParams;
70
71typedef struct{
72    u32 status;
73} GScanSetSignificantChangeRspParams;
74
75typedef struct{
76    u32 status;
77} GScanResetSignificantChangeRspParams;
78
79typedef struct {
80    int max_channels;
81    wifi_channel *channels;
82    int *number_channels;
83} GScan_get_valid_channels_cb_data;
84
85typedef enum{
86    eGScanRspParamsInvalid = 0,
87    eGScanGetValidChannelsRspParams,
88    eGScanGetCapabilitiesRspParams,
89    eGScanGetCachedResultsRspParams,
90    eGScanStartRspParams,
91    eGScanStopRspParams,
92    eGScanSetBssidHotlistRspParams,
93    eGScanResetBssidHotlistRspParams,
94    eGScanSetSignificantChangeRspParams,
95    eGScanResetSignificantChangeRspParams,
96} eGScanRspRarams;
97
98/* Response and Event Callbacks */
99typedef struct {
100    /* Various Events Callback */
101    void (*get_capabilities)(int status, wifi_gscan_capabilities capabilities);
102    void (*start)(int status);
103    void (*stop)(int status);
104    void (*set_bssid_hotlist)(int status);
105    void (*reset_bssid_hotlist)(int status);
106    void (*set_significant_change)(int status);
107    void (*reset_significant_change)(int status);
108    void (*on_hotlist_ap_found)(wifi_request_id id,
109        unsigned num_results, wifi_scan_result *results);
110    void (*get_cached_results)(u8 more_data, u32 num_results);
111    void (*on_significant_change)(wifi_request_id id,
112                unsigned num_results,
113                wifi_significant_change_result **results);
114    /* Reported when report_threshold is reached in scan cache */
115    void (*on_scan_results_available) (wifi_request_id id,
116                                    unsigned num_results_available);
117    /* Reported when each probe response is received, if report_events
118     * enabled in wifi_scan_cmd_params
119     */
120    void (*on_full_scan_result) (wifi_request_id id, wifi_scan_result *result);
121    /* Optional event - indicates progress of scanning statemachine */
122    void (*on_scan_event) (wifi_scan_event event, unsigned status);
123} GScanCallbackHandler;
124
125class GScanCommand: public WifiVendorCommand
126{
127private:
128    GScanStopRspParams                  *mStopGScanRspParams;
129    GScanStartRspParams                 *mStartGScanRspParams;
130    GScanSetBssidHotlistRspParams       *mSetBssidHotlistRspParams;
131    GScanResetBssidHotlistRspParams     *mResetBssidHotlistRspParams;
132    GScanSetSignificantChangeRspParams  *mSetSignificantChangeRspParams;
133    GScanResetSignificantChangeRspParams*mResetSignificantChangeRspParams;
134    GScanGetCapabilitiesRspParams       *mGetCapabilitiesRspParams;
135    GScanGetCachedResultsRspParams      *mGetCachedResultsRspParams;
136    u32                                 mGetCachedResultsNumResults;
137    GScanCallbackHandler                mHandler;
138    int                                 mRequestId;
139    int                                 *mChannels;
140    int                                 mMaxChannels;
141    int                                 *mNumChannelsPtr;
142    bool                                mWaitforRsp;
143
144public:
145    GScanCommand(wifi_handle handle, int id, u32 vendor_id, u32 subcmd);
146    virtual ~GScanCommand();
147
148    /* This function implements creation of GSCAN specific Request
149     * based on  the request type.
150     */
151    virtual int create();
152    virtual int requestEvent();
153    virtual int requestResponse();
154    virtual int handleResponse(WifiEvent &reply);
155    virtual int handleEvent(WifiEvent &event);
156    virtual int setCallbackHandler(GScanCallbackHandler nHandler);
157    virtual void setMaxChannels(int max_channels);
158    virtual void setChannels(int *channels);
159    virtual void setNumChannelsPtr(int *num_channels);
160    virtual int allocRspParams(eGScanRspRarams cmd);
161    virtual void freeRspParams(eGScanRspRarams cmd);
162    virtual void getGetCapabilitiesRspParams(
163                    wifi_gscan_capabilities *capabilities,
164                    u32 *status);
165    virtual void getStartGScanRspParams(u32 *status);
166    virtual void getStopGScanRspParams(u32 *status);
167    virtual void getSetBssidHotlistRspParams(u32 *status);
168    virtual void getResetBssidHotlistRspParams(u32 *status);
169    virtual void getSetSignificantChangeRspParams(u32 *status);
170    virtual void getResetSignificantChangeRspParams(u32 *status);
171    virtual wifi_error getGetCachedResultsRspParams(int max,
172                                                    u8 *moreData,
173                                                    int *numResults,
174                                                    wifi_scan_result *results);
175    /* Takes wait time in seconds. */
176    virtual int timed_wait(u16 wait_time);
177    virtual void waitForRsp(bool wait);
178};
179
180#ifdef __cplusplus
181}
182#endif /* __cplusplus */
183#endif
184