xref: /aosp_15_r20/system/chre/chpp/clients/wifi.c (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker  *
4*84e33947SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker  *
8*84e33947SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker  *
10*84e33947SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker  * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker  */
16*84e33947SAndroid Build Coastguard Worker 
17*84e33947SAndroid Build Coastguard Worker #include "chpp/clients/wifi.h"
18*84e33947SAndroid Build Coastguard Worker 
19*84e33947SAndroid Build Coastguard Worker #include <inttypes.h>
20*84e33947SAndroid Build Coastguard Worker #include <stdbool.h>
21*84e33947SAndroid Build Coastguard Worker #include <stddef.h>
22*84e33947SAndroid Build Coastguard Worker #include <stdint.h>
23*84e33947SAndroid Build Coastguard Worker #include <string.h>
24*84e33947SAndroid Build Coastguard Worker 
25*84e33947SAndroid Build Coastguard Worker #include "chpp/app.h"
26*84e33947SAndroid Build Coastguard Worker #include "chpp/clients.h"
27*84e33947SAndroid Build Coastguard Worker #include "chpp/clients/discovery.h"
28*84e33947SAndroid Build Coastguard Worker #ifdef CHPP_CLIENT_ENABLED_TIMESYNC
29*84e33947SAndroid Build Coastguard Worker #include "chpp/clients/timesync.h"
30*84e33947SAndroid Build Coastguard Worker #endif
31*84e33947SAndroid Build Coastguard Worker #include "chpp/common/standard_uuids.h"
32*84e33947SAndroid Build Coastguard Worker #include "chpp/common/wifi.h"
33*84e33947SAndroid Build Coastguard Worker #include "chpp/common/wifi_types.h"
34*84e33947SAndroid Build Coastguard Worker #include "chpp/common/wifi_utils.h"
35*84e33947SAndroid Build Coastguard Worker #include "chpp/log.h"
36*84e33947SAndroid Build Coastguard Worker #include "chpp/macros.h"
37*84e33947SAndroid Build Coastguard Worker #include "chpp/memory.h"
38*84e33947SAndroid Build Coastguard Worker #include "chpp/time.h"
39*84e33947SAndroid Build Coastguard Worker #include "chre/pal/wifi.h"
40*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre/wifi.h"
41*84e33947SAndroid Build Coastguard Worker 
42*84e33947SAndroid Build Coastguard Worker #ifndef CHPP_WIFI_DISCOVERY_TIMEOUT_MS
43*84e33947SAndroid Build Coastguard Worker #define CHPP_WIFI_DISCOVERY_TIMEOUT_MS CHPP_DISCOVERY_DEFAULT_TIMEOUT_MS
44*84e33947SAndroid Build Coastguard Worker #endif
45*84e33947SAndroid Build Coastguard Worker 
46*84e33947SAndroid Build Coastguard Worker #ifndef CHPP_WIFI_MAX_TIMESYNC_AGE_NS
47*84e33947SAndroid Build Coastguard Worker #define CHPP_WIFI_MAX_TIMESYNC_AGE_NS CHPP_TIMESYNC_DEFAULT_MAX_AGE_NS
48*84e33947SAndroid Build Coastguard Worker #endif
49*84e33947SAndroid Build Coastguard Worker 
50*84e33947SAndroid Build Coastguard Worker #ifndef CHPP_WIFI_SCAN_RESULT_TIMEOUT_NS
51*84e33947SAndroid Build Coastguard Worker #define CHPP_WIFI_SCAN_RESULT_TIMEOUT_NS \
52*84e33947SAndroid Build Coastguard Worker   (CHRE_WIFI_SCAN_RESULT_TIMEOUT_NS - CHRE_NSEC_PER_SEC)
53*84e33947SAndroid Build Coastguard Worker #endif
54*84e33947SAndroid Build Coastguard Worker 
55*84e33947SAndroid Build Coastguard Worker /************************************************
56*84e33947SAndroid Build Coastguard Worker  *  Prototypes
57*84e33947SAndroid Build Coastguard Worker  ***********************************************/
58*84e33947SAndroid Build Coastguard Worker 
59*84e33947SAndroid Build Coastguard Worker static enum ChppAppErrorCode chppDispatchWifiResponse(void *clientContext,
60*84e33947SAndroid Build Coastguard Worker                                                       uint8_t *buf, size_t len);
61*84e33947SAndroid Build Coastguard Worker static enum ChppAppErrorCode chppDispatchWifiNotification(void *clientContext,
62*84e33947SAndroid Build Coastguard Worker                                                           uint8_t *buf,
63*84e33947SAndroid Build Coastguard Worker                                                           size_t len);
64*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientInit(void *clientContext, uint8_t handle,
65*84e33947SAndroid Build Coastguard Worker                                struct ChppVersion serviceVersion);
66*84e33947SAndroid Build Coastguard Worker static void chppWifiClientDeinit(void *clientContext);
67*84e33947SAndroid Build Coastguard Worker static void chppWifiClientNotifyReset(void *clientContext);
68*84e33947SAndroid Build Coastguard Worker static void chppWifiClientNotifyMatch(void *clientContext);
69*84e33947SAndroid Build Coastguard Worker 
70*84e33947SAndroid Build Coastguard Worker /************************************************
71*84e33947SAndroid Build Coastguard Worker  *  Private Definitions
72*84e33947SAndroid Build Coastguard Worker  ***********************************************/
73*84e33947SAndroid Build Coastguard Worker 
74*84e33947SAndroid Build Coastguard Worker /**
75*84e33947SAndroid Build Coastguard Worker  * Structure to maintain state for the WiFi client and its Request/Response
76*84e33947SAndroid Build Coastguard Worker  * (RR) functionality.
77*84e33947SAndroid Build Coastguard Worker  */
78*84e33947SAndroid Build Coastguard Worker struct ChppWifiClientState {
79*84e33947SAndroid Build Coastguard Worker   struct ChppEndpointState client;   // CHPP client state
80*84e33947SAndroid Build Coastguard Worker   const struct chrePalWifiApi *api;  // WiFi PAL API
81*84e33947SAndroid Build Coastguard Worker 
82*84e33947SAndroid Build Coastguard Worker   struct ChppOutgoingRequestState
83*84e33947SAndroid Build Coastguard Worker       outReqStates[CHPP_WIFI_CLIENT_REQUEST_MAX + 1];
84*84e33947SAndroid Build Coastguard Worker 
85*84e33947SAndroid Build Coastguard Worker   uint32_t capabilities;            // Cached GetCapabilities result
86*84e33947SAndroid Build Coastguard Worker   bool scanMonitorEnabled;          // Scan monitoring is enabled
87*84e33947SAndroid Build Coastguard Worker   bool scanMonitorSilenceCallback;  // Silence callback during recovery from a
88*84e33947SAndroid Build Coastguard Worker                                     // service reset
89*84e33947SAndroid Build Coastguard Worker   bool capabilitiesValid;  // Flag to indicate if the capabilities result
90*84e33947SAndroid Build Coastguard Worker                            // is valid
91*84e33947SAndroid Build Coastguard Worker };
92*84e33947SAndroid Build Coastguard Worker 
93*84e33947SAndroid Build Coastguard Worker // Note: This global definition of gWifiClientContext supports only one
94*84e33947SAndroid Build Coastguard Worker // instance of the CHPP WiFi client at a time.
95*84e33947SAndroid Build Coastguard Worker struct ChppWifiClientState gWifiClientContext;
96*84e33947SAndroid Build Coastguard Worker static const struct chrePalSystemApi *gSystemApi;
97*84e33947SAndroid Build Coastguard Worker static const struct chrePalWifiCallbacks *gCallbacks;
98*84e33947SAndroid Build Coastguard Worker 
99*84e33947SAndroid Build Coastguard Worker /**
100*84e33947SAndroid Build Coastguard Worker  * Configuration parameters for this client
101*84e33947SAndroid Build Coastguard Worker  */
102*84e33947SAndroid Build Coastguard Worker static const struct ChppClient kWifiClientConfig = {
103*84e33947SAndroid Build Coastguard Worker     .descriptor.uuid = CHPP_UUID_WIFI_STANDARD,
104*84e33947SAndroid Build Coastguard Worker 
105*84e33947SAndroid Build Coastguard Worker     // Version
106*84e33947SAndroid Build Coastguard Worker     .descriptor.version.major = 1,
107*84e33947SAndroid Build Coastguard Worker     .descriptor.version.minor = 0,
108*84e33947SAndroid Build Coastguard Worker     .descriptor.version.patch = 0,
109*84e33947SAndroid Build Coastguard Worker 
110*84e33947SAndroid Build Coastguard Worker     // Notifies client if CHPP is reset
111*84e33947SAndroid Build Coastguard Worker     .resetNotifierFunctionPtr = &chppWifiClientNotifyReset,
112*84e33947SAndroid Build Coastguard Worker 
113*84e33947SAndroid Build Coastguard Worker     // Notifies client if they are matched to a service
114*84e33947SAndroid Build Coastguard Worker     .matchNotifierFunctionPtr = &chppWifiClientNotifyMatch,
115*84e33947SAndroid Build Coastguard Worker 
116*84e33947SAndroid Build Coastguard Worker     // Service response dispatch function pointer
117*84e33947SAndroid Build Coastguard Worker     .responseDispatchFunctionPtr = &chppDispatchWifiResponse,
118*84e33947SAndroid Build Coastguard Worker 
119*84e33947SAndroid Build Coastguard Worker     // Service notification dispatch function pointer
120*84e33947SAndroid Build Coastguard Worker     .notificationDispatchFunctionPtr = &chppDispatchWifiNotification,
121*84e33947SAndroid Build Coastguard Worker 
122*84e33947SAndroid Build Coastguard Worker     // Service response dispatch function pointer
123*84e33947SAndroid Build Coastguard Worker     .initFunctionPtr = &chppWifiClientInit,
124*84e33947SAndroid Build Coastguard Worker 
125*84e33947SAndroid Build Coastguard Worker     // Service notification dispatch function pointer
126*84e33947SAndroid Build Coastguard Worker     .deinitFunctionPtr = &chppWifiClientDeinit,
127*84e33947SAndroid Build Coastguard Worker 
128*84e33947SAndroid Build Coastguard Worker     // Number of request-response states in the outReqStates array.
129*84e33947SAndroid Build Coastguard Worker     .outReqCount = ARRAY_SIZE(gWifiClientContext.outReqStates),
130*84e33947SAndroid Build Coastguard Worker 
131*84e33947SAndroid Build Coastguard Worker     // Min length is the entire header
132*84e33947SAndroid Build Coastguard Worker     .minLength = sizeof(struct ChppAppHeader),
133*84e33947SAndroid Build Coastguard Worker };
134*84e33947SAndroid Build Coastguard Worker 
135*84e33947SAndroid Build Coastguard Worker /************************************************
136*84e33947SAndroid Build Coastguard Worker  *  Prototypes
137*84e33947SAndroid Build Coastguard Worker  ***********************************************/
138*84e33947SAndroid Build Coastguard Worker 
139*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientOpen(const struct chrePalSystemApi *systemApi,
140*84e33947SAndroid Build Coastguard Worker                                const struct chrePalWifiCallbacks *callbacks);
141*84e33947SAndroid Build Coastguard Worker static void chppWifiClientClose(void);
142*84e33947SAndroid Build Coastguard Worker static uint32_t chppWifiClientGetCapabilities(void);
143*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientConfigureScanMonitor(bool enable);
144*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientRequestScan(const struct chreWifiScanParams *params);
145*84e33947SAndroid Build Coastguard Worker static void chppWifiClientReleaseScanEvent(struct chreWifiScanEvent *event);
146*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientRequestRanging(
147*84e33947SAndroid Build Coastguard Worker     const struct chreWifiRangingParams *params);
148*84e33947SAndroid Build Coastguard Worker static void chppWifiClientReleaseRangingEvent(
149*84e33947SAndroid Build Coastguard Worker     struct chreWifiRangingEvent *event);
150*84e33947SAndroid Build Coastguard Worker 
151*84e33947SAndroid Build Coastguard Worker static void chppWiFiRecoverScanMonitor(
152*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext);
153*84e33947SAndroid Build Coastguard Worker static void chppWifiCloseResult(struct ChppWifiClientState *clientContext,
154*84e33947SAndroid Build Coastguard Worker                                 uint8_t *buf, size_t len);
155*84e33947SAndroid Build Coastguard Worker static void chppWifiGetCapabilitiesResult(
156*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len);
157*84e33947SAndroid Build Coastguard Worker static void chppWifiConfigureScanMonitorResult(
158*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len);
159*84e33947SAndroid Build Coastguard Worker static void chppWifiRequestScanResult(struct ChppWifiClientState *clientContext,
160*84e33947SAndroid Build Coastguard Worker                                       uint8_t *buf, size_t len);
161*84e33947SAndroid Build Coastguard Worker static void chppWifiRequestRangingResult(
162*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len);
163*84e33947SAndroid Build Coastguard Worker static void chppWifiRequestNanSubscribeResult(uint8_t *buf, size_t len);
164*84e33947SAndroid Build Coastguard Worker 
165*84e33947SAndroid Build Coastguard Worker static void chppWifiScanEventNotification(
166*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len);
167*84e33947SAndroid Build Coastguard Worker static void chppWifiRangingEventNotification(
168*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len);
169*84e33947SAndroid Build Coastguard Worker static void chppWifiDiscoveryEventNotification(uint8_t *buf, size_t len);
170*84e33947SAndroid Build Coastguard Worker static void chppWifiNanServiceLostEventNotification(uint8_t *buf, size_t len);
171*84e33947SAndroid Build Coastguard Worker static void chppWifiNanServiceTerminatedEventNotification(uint8_t *buf,
172*84e33947SAndroid Build Coastguard Worker                                                           size_t len);
173*84e33947SAndroid Build Coastguard Worker static void chppWifiRequestNanSubscribeNotification(uint8_t *buf, size_t len);
174*84e33947SAndroid Build Coastguard Worker static void chppWifiNanSubscriptionCanceledNotification(uint8_t *buf,
175*84e33947SAndroid Build Coastguard Worker                                                         size_t len);
176*84e33947SAndroid Build Coastguard Worker static void chppWifiNanSubscriptionCanceledResult(uint8_t *buf, size_t len);
177*84e33947SAndroid Build Coastguard Worker 
178*84e33947SAndroid Build Coastguard Worker /************************************************
179*84e33947SAndroid Build Coastguard Worker  *  Private Functions
180*84e33947SAndroid Build Coastguard Worker  ***********************************************/
181*84e33947SAndroid Build Coastguard Worker 
182*84e33947SAndroid Build Coastguard Worker /**
183*84e33947SAndroid Build Coastguard Worker  * Dispatches a service response from the transport layer that is determined to
184*84e33947SAndroid Build Coastguard Worker  * be for the WiFi client.
185*84e33947SAndroid Build Coastguard Worker  *
186*84e33947SAndroid Build Coastguard Worker  * This function is called from the app layer using its function pointer given
187*84e33947SAndroid Build Coastguard Worker  * during client registration.
188*84e33947SAndroid Build Coastguard Worker  *
189*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
190*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
191*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
192*84e33947SAndroid Build Coastguard Worker  *
193*84e33947SAndroid Build Coastguard Worker  * @return Indicates the result of this function call.
194*84e33947SAndroid Build Coastguard Worker  */
chppDispatchWifiResponse(void * clientContext,uint8_t * buf,size_t len)195*84e33947SAndroid Build Coastguard Worker static enum ChppAppErrorCode chppDispatchWifiResponse(void *clientContext,
196*84e33947SAndroid Build Coastguard Worker                                                       uint8_t *buf,
197*84e33947SAndroid Build Coastguard Worker                                                       size_t len) {
198*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *rxHeader = (struct ChppAppHeader *)buf;
199*84e33947SAndroid Build Coastguard Worker   struct ChppWifiClientState *wifiClientContext =
200*84e33947SAndroid Build Coastguard Worker       (struct ChppWifiClientState *)clientContext;
201*84e33947SAndroid Build Coastguard Worker   enum ChppAppErrorCode error = CHPP_APP_ERROR_NONE;
202*84e33947SAndroid Build Coastguard Worker 
203*84e33947SAndroid Build Coastguard Worker   if (rxHeader->command > CHPP_WIFI_CLIENT_REQUEST_MAX) {
204*84e33947SAndroid Build Coastguard Worker     error = CHPP_APP_ERROR_INVALID_COMMAND;
205*84e33947SAndroid Build Coastguard Worker 
206*84e33947SAndroid Build Coastguard Worker   } else if (!chppTimestampIncomingResponse(
207*84e33947SAndroid Build Coastguard Worker                  wifiClientContext->client.appContext,
208*84e33947SAndroid Build Coastguard Worker                  &wifiClientContext->outReqStates[rxHeader->command],
209*84e33947SAndroid Build Coastguard Worker                  rxHeader)) {
210*84e33947SAndroid Build Coastguard Worker     error = CHPP_APP_ERROR_UNEXPECTED_RESPONSE;
211*84e33947SAndroid Build Coastguard Worker 
212*84e33947SAndroid Build Coastguard Worker   } else {
213*84e33947SAndroid Build Coastguard Worker     switch (rxHeader->command) {
214*84e33947SAndroid Build Coastguard Worker       case CHPP_WIFI_OPEN: {
215*84e33947SAndroid Build Coastguard Worker         chppClientProcessOpenResponse(&wifiClientContext->client, buf, len);
216*84e33947SAndroid Build Coastguard Worker         if (rxHeader->error == CHPP_APP_ERROR_NONE) {
217*84e33947SAndroid Build Coastguard Worker           chppWiFiRecoverScanMonitor(wifiClientContext);
218*84e33947SAndroid Build Coastguard Worker         }
219*84e33947SAndroid Build Coastguard Worker         break;
220*84e33947SAndroid Build Coastguard Worker       }
221*84e33947SAndroid Build Coastguard Worker 
222*84e33947SAndroid Build Coastguard Worker       case CHPP_WIFI_CLOSE: {
223*84e33947SAndroid Build Coastguard Worker         chppWifiCloseResult(wifiClientContext, buf, len);
224*84e33947SAndroid Build Coastguard Worker         break;
225*84e33947SAndroid Build Coastguard Worker       }
226*84e33947SAndroid Build Coastguard Worker 
227*84e33947SAndroid Build Coastguard Worker       case CHPP_WIFI_GET_CAPABILITIES: {
228*84e33947SAndroid Build Coastguard Worker         chppWifiGetCapabilitiesResult(wifiClientContext, buf, len);
229*84e33947SAndroid Build Coastguard Worker         break;
230*84e33947SAndroid Build Coastguard Worker       }
231*84e33947SAndroid Build Coastguard Worker 
232*84e33947SAndroid Build Coastguard Worker       case CHPP_WIFI_CONFIGURE_SCAN_MONITOR_ASYNC: {
233*84e33947SAndroid Build Coastguard Worker         chppWifiConfigureScanMonitorResult(wifiClientContext, buf, len);
234*84e33947SAndroid Build Coastguard Worker         break;
235*84e33947SAndroid Build Coastguard Worker       }
236*84e33947SAndroid Build Coastguard Worker 
237*84e33947SAndroid Build Coastguard Worker       case CHPP_WIFI_REQUEST_SCAN_ASYNC: {
238*84e33947SAndroid Build Coastguard Worker         chppWifiRequestScanResult(wifiClientContext, buf, len);
239*84e33947SAndroid Build Coastguard Worker         break;
240*84e33947SAndroid Build Coastguard Worker       }
241*84e33947SAndroid Build Coastguard Worker 
242*84e33947SAndroid Build Coastguard Worker       case CHPP_WIFI_REQUEST_RANGING_ASYNC:
243*84e33947SAndroid Build Coastguard Worker       case CHPP_WIFI_REQUEST_NAN_RANGING_ASYNC: {
244*84e33947SAndroid Build Coastguard Worker         chppWifiRequestRangingResult(wifiClientContext, buf, len);
245*84e33947SAndroid Build Coastguard Worker         break;
246*84e33947SAndroid Build Coastguard Worker       }
247*84e33947SAndroid Build Coastguard Worker 
248*84e33947SAndroid Build Coastguard Worker       case CHPP_WIFI_REQUEST_NAN_SUB: {
249*84e33947SAndroid Build Coastguard Worker         chppWifiRequestNanSubscribeResult(buf, len);
250*84e33947SAndroid Build Coastguard Worker         break;
251*84e33947SAndroid Build Coastguard Worker       }
252*84e33947SAndroid Build Coastguard Worker 
253*84e33947SAndroid Build Coastguard Worker       case CHPP_WIFI_REQUEST_NAN_SUB_CANCEL: {
254*84e33947SAndroid Build Coastguard Worker         chppWifiNanSubscriptionCanceledResult(buf, len);
255*84e33947SAndroid Build Coastguard Worker         break;
256*84e33947SAndroid Build Coastguard Worker       }
257*84e33947SAndroid Build Coastguard Worker 
258*84e33947SAndroid Build Coastguard Worker       default: {
259*84e33947SAndroid Build Coastguard Worker         error = CHPP_APP_ERROR_INVALID_COMMAND;
260*84e33947SAndroid Build Coastguard Worker         break;
261*84e33947SAndroid Build Coastguard Worker       }
262*84e33947SAndroid Build Coastguard Worker     }
263*84e33947SAndroid Build Coastguard Worker   }
264*84e33947SAndroid Build Coastguard Worker 
265*84e33947SAndroid Build Coastguard Worker   return error;
266*84e33947SAndroid Build Coastguard Worker }
267*84e33947SAndroid Build Coastguard Worker 
268*84e33947SAndroid Build Coastguard Worker /**
269*84e33947SAndroid Build Coastguard Worker  * Dispatches a service notification from the transport layer that is determined
270*84e33947SAndroid Build Coastguard Worker  * to be for the WiFi client.
271*84e33947SAndroid Build Coastguard Worker  *
272*84e33947SAndroid Build Coastguard Worker  * This function is called from the app layer using its function pointer given
273*84e33947SAndroid Build Coastguard Worker  * during client registration.
274*84e33947SAndroid Build Coastguard Worker  *
275*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
276*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
277*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
278*84e33947SAndroid Build Coastguard Worker  *
279*84e33947SAndroid Build Coastguard Worker  * @return Indicates the result of this function call.
280*84e33947SAndroid Build Coastguard Worker  */
chppDispatchWifiNotification(void * clientContext,uint8_t * buf,size_t len)281*84e33947SAndroid Build Coastguard Worker static enum ChppAppErrorCode chppDispatchWifiNotification(void *clientContext,
282*84e33947SAndroid Build Coastguard Worker                                                           uint8_t *buf,
283*84e33947SAndroid Build Coastguard Worker                                                           size_t len) {
284*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *rxHeader = (struct ChppAppHeader *)buf;
285*84e33947SAndroid Build Coastguard Worker   struct ChppWifiClientState *wifiClientContext =
286*84e33947SAndroid Build Coastguard Worker       (struct ChppWifiClientState *)clientContext;
287*84e33947SAndroid Build Coastguard Worker   enum ChppAppErrorCode error = CHPP_APP_ERROR_NONE;
288*84e33947SAndroid Build Coastguard Worker 
289*84e33947SAndroid Build Coastguard Worker   switch (rxHeader->command) {
290*84e33947SAndroid Build Coastguard Worker     case CHPP_WIFI_REQUEST_SCAN_ASYNC: {
291*84e33947SAndroid Build Coastguard Worker       chppWifiScanEventNotification(wifiClientContext, buf, len);
292*84e33947SAndroid Build Coastguard Worker       break;
293*84e33947SAndroid Build Coastguard Worker     }
294*84e33947SAndroid Build Coastguard Worker 
295*84e33947SAndroid Build Coastguard Worker     case CHPP_WIFI_REQUEST_RANGING_ASYNC:
296*84e33947SAndroid Build Coastguard Worker     case CHPP_WIFI_REQUEST_NAN_RANGING_ASYNC: {
297*84e33947SAndroid Build Coastguard Worker       chppWifiRangingEventNotification(wifiClientContext, buf, len);
298*84e33947SAndroid Build Coastguard Worker       break;
299*84e33947SAndroid Build Coastguard Worker     }
300*84e33947SAndroid Build Coastguard Worker 
301*84e33947SAndroid Build Coastguard Worker     case CHPP_WIFI_NOTIFICATION_NAN_SERVICE_DISCOVERY: {
302*84e33947SAndroid Build Coastguard Worker       chppWifiDiscoveryEventNotification(buf, len);
303*84e33947SAndroid Build Coastguard Worker       break;
304*84e33947SAndroid Build Coastguard Worker     }
305*84e33947SAndroid Build Coastguard Worker 
306*84e33947SAndroid Build Coastguard Worker     case CHPP_WIFI_NOTIFICATION_NAN_SERVICE_LOST: {
307*84e33947SAndroid Build Coastguard Worker       chppWifiNanServiceLostEventNotification(buf, len);
308*84e33947SAndroid Build Coastguard Worker       break;
309*84e33947SAndroid Build Coastguard Worker     }
310*84e33947SAndroid Build Coastguard Worker 
311*84e33947SAndroid Build Coastguard Worker     case CHPP_WIFI_NOTIFICATION_NAN_SERVICE_TERMINATED: {
312*84e33947SAndroid Build Coastguard Worker       chppWifiNanServiceTerminatedEventNotification(buf, len);
313*84e33947SAndroid Build Coastguard Worker       break;
314*84e33947SAndroid Build Coastguard Worker     }
315*84e33947SAndroid Build Coastguard Worker 
316*84e33947SAndroid Build Coastguard Worker     case CHPP_WIFI_REQUEST_NAN_SUB: {
317*84e33947SAndroid Build Coastguard Worker       chppWifiRequestNanSubscribeNotification(buf, len);
318*84e33947SAndroid Build Coastguard Worker       break;
319*84e33947SAndroid Build Coastguard Worker     }
320*84e33947SAndroid Build Coastguard Worker 
321*84e33947SAndroid Build Coastguard Worker     case CHPP_WIFI_REQUEST_NAN_SUB_CANCEL: {
322*84e33947SAndroid Build Coastguard Worker       chppWifiNanSubscriptionCanceledNotification(buf, len);
323*84e33947SAndroid Build Coastguard Worker       break;
324*84e33947SAndroid Build Coastguard Worker     }
325*84e33947SAndroid Build Coastguard Worker 
326*84e33947SAndroid Build Coastguard Worker     default: {
327*84e33947SAndroid Build Coastguard Worker       error = CHPP_APP_ERROR_INVALID_COMMAND;
328*84e33947SAndroid Build Coastguard Worker       break;
329*84e33947SAndroid Build Coastguard Worker     }
330*84e33947SAndroid Build Coastguard Worker   }
331*84e33947SAndroid Build Coastguard Worker 
332*84e33947SAndroid Build Coastguard Worker   return error;
333*84e33947SAndroid Build Coastguard Worker }
334*84e33947SAndroid Build Coastguard Worker 
335*84e33947SAndroid Build Coastguard Worker /**
336*84e33947SAndroid Build Coastguard Worker  * Initializes the client and provides its handle number and the version of the
337*84e33947SAndroid Build Coastguard Worker  * matched service when/if it the client is matched with a service during
338*84e33947SAndroid Build Coastguard Worker  * discovery.
339*84e33947SAndroid Build Coastguard Worker  *
340*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
341*84e33947SAndroid Build Coastguard Worker  * @param handle Handle number for this client.
342*84e33947SAndroid Build Coastguard Worker  * @param serviceVersion Version of the matched service.
343*84e33947SAndroid Build Coastguard Worker  *
344*84e33947SAndroid Build Coastguard Worker  * @return True if client is compatible and successfully initialized.
345*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientInit(void * clientContext,uint8_t handle,struct ChppVersion serviceVersion)346*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientInit(void *clientContext, uint8_t handle,
347*84e33947SAndroid Build Coastguard Worker                                struct ChppVersion serviceVersion) {
348*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(serviceVersion);
349*84e33947SAndroid Build Coastguard Worker 
350*84e33947SAndroid Build Coastguard Worker   struct ChppWifiClientState *wifiClientContext =
351*84e33947SAndroid Build Coastguard Worker       (struct ChppWifiClientState *)clientContext;
352*84e33947SAndroid Build Coastguard Worker   chppClientInit(&wifiClientContext->client, handle);
353*84e33947SAndroid Build Coastguard Worker 
354*84e33947SAndroid Build Coastguard Worker   return true;
355*84e33947SAndroid Build Coastguard Worker }
356*84e33947SAndroid Build Coastguard Worker 
357*84e33947SAndroid Build Coastguard Worker /**
358*84e33947SAndroid Build Coastguard Worker  * Deinitializes the client.
359*84e33947SAndroid Build Coastguard Worker  *
360*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
361*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientDeinit(void * clientContext)362*84e33947SAndroid Build Coastguard Worker static void chppWifiClientDeinit(void *clientContext) {
363*84e33947SAndroid Build Coastguard Worker   struct ChppWifiClientState *wifiClientContext =
364*84e33947SAndroid Build Coastguard Worker       (struct ChppWifiClientState *)clientContext;
365*84e33947SAndroid Build Coastguard Worker   chppClientDeinit(&wifiClientContext->client);
366*84e33947SAndroid Build Coastguard Worker }
367*84e33947SAndroid Build Coastguard Worker 
368*84e33947SAndroid Build Coastguard Worker /**
369*84e33947SAndroid Build Coastguard Worker  * Notifies the client of an incoming reset.
370*84e33947SAndroid Build Coastguard Worker  *
371*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
372*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientNotifyReset(void * clientContext)373*84e33947SAndroid Build Coastguard Worker static void chppWifiClientNotifyReset(void *clientContext) {
374*84e33947SAndroid Build Coastguard Worker   struct ChppWifiClientState *wifiClientContext =
375*84e33947SAndroid Build Coastguard Worker       (struct ChppWifiClientState *)clientContext;
376*84e33947SAndroid Build Coastguard Worker 
377*84e33947SAndroid Build Coastguard Worker   chppClientCloseOpenRequests(&wifiClientContext->client, &kWifiClientConfig,
378*84e33947SAndroid Build Coastguard Worker                               false /* clearOnly */);
379*84e33947SAndroid Build Coastguard Worker   chppCheckWifiScanEventNotificationReset();
380*84e33947SAndroid Build Coastguard Worker 
381*84e33947SAndroid Build Coastguard Worker   CHPP_LOGI("WiFi client reopening from state=%" PRIu8,
382*84e33947SAndroid Build Coastguard Worker             wifiClientContext->client.openState);
383*84e33947SAndroid Build Coastguard Worker   chppClientSendOpenRequest(&wifiClientContext->client,
384*84e33947SAndroid Build Coastguard Worker                             &wifiClientContext->outReqStates[CHPP_WIFI_OPEN],
385*84e33947SAndroid Build Coastguard Worker                             CHPP_WIFI_OPEN,
386*84e33947SAndroid Build Coastguard Worker                             /*blocking=*/false);
387*84e33947SAndroid Build Coastguard Worker }
388*84e33947SAndroid Build Coastguard Worker 
389*84e33947SAndroid Build Coastguard Worker /**
390*84e33947SAndroid Build Coastguard Worker  * Notifies the client of being matched to a service.
391*84e33947SAndroid Build Coastguard Worker  *
392*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
393*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientNotifyMatch(void * clientContext)394*84e33947SAndroid Build Coastguard Worker static void chppWifiClientNotifyMatch(void *clientContext) {
395*84e33947SAndroid Build Coastguard Worker   struct ChppWifiClientState *wifiClientContext =
396*84e33947SAndroid Build Coastguard Worker       (struct ChppWifiClientState *)clientContext;
397*84e33947SAndroid Build Coastguard Worker 
398*84e33947SAndroid Build Coastguard Worker   if (wifiClientContext->client.pseudoOpen) {
399*84e33947SAndroid Build Coastguard Worker     CHPP_LOGD("Pseudo-open WiFi client opening");
400*84e33947SAndroid Build Coastguard Worker     chppClientSendOpenRequest(&wifiClientContext->client,
401*84e33947SAndroid Build Coastguard Worker                               &wifiClientContext->outReqStates[CHPP_WIFI_OPEN],
402*84e33947SAndroid Build Coastguard Worker                               CHPP_WIFI_OPEN,
403*84e33947SAndroid Build Coastguard Worker                               /*blocking=*/false);
404*84e33947SAndroid Build Coastguard Worker   }
405*84e33947SAndroid Build Coastguard Worker }
406*84e33947SAndroid Build Coastguard Worker 
407*84e33947SAndroid Build Coastguard Worker /**
408*84e33947SAndroid Build Coastguard Worker  * Restores the state of scan monitoring after an incoming reset.
409*84e33947SAndroid Build Coastguard Worker  *
410*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
411*84e33947SAndroid Build Coastguard Worker  */
chppWiFiRecoverScanMonitor(struct ChppWifiClientState * clientContext)412*84e33947SAndroid Build Coastguard Worker static void chppWiFiRecoverScanMonitor(
413*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext) {
414*84e33947SAndroid Build Coastguard Worker   if (clientContext->scanMonitorEnabled) {
415*84e33947SAndroid Build Coastguard Worker     CHPP_LOGD("Re-enabling WiFi scan monitoring after reset");
416*84e33947SAndroid Build Coastguard Worker     clientContext->scanMonitorEnabled = false;
417*84e33947SAndroid Build Coastguard Worker     clientContext->scanMonitorSilenceCallback = true;
418*84e33947SAndroid Build Coastguard Worker 
419*84e33947SAndroid Build Coastguard Worker     if (!chppWifiClientConfigureScanMonitor(true)) {
420*84e33947SAndroid Build Coastguard Worker       clientContext->scanMonitorSilenceCallback = false;
421*84e33947SAndroid Build Coastguard Worker       CHPP_DEBUG_ASSERT_LOG(false, "Failed to re-enable WiFi scan monitoring");
422*84e33947SAndroid Build Coastguard Worker     }
423*84e33947SAndroid Build Coastguard Worker   }
424*84e33947SAndroid Build Coastguard Worker }
425*84e33947SAndroid Build Coastguard Worker 
426*84e33947SAndroid Build Coastguard Worker /**
427*84e33947SAndroid Build Coastguard Worker  * Handles the service response for the close client request.
428*84e33947SAndroid Build Coastguard Worker  *
429*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiResponse().
430*84e33947SAndroid Build Coastguard Worker  *
431*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
432*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
433*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
434*84e33947SAndroid Build Coastguard Worker  */
chppWifiCloseResult(struct ChppWifiClientState * clientContext,uint8_t * buf,size_t len)435*84e33947SAndroid Build Coastguard Worker static void chppWifiCloseResult(struct ChppWifiClientState *clientContext,
436*84e33947SAndroid Build Coastguard Worker                                 uint8_t *buf, size_t len) {
437*84e33947SAndroid Build Coastguard Worker   // TODO
438*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(clientContext);
439*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(buf);
440*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(len);
441*84e33947SAndroid Build Coastguard Worker }
442*84e33947SAndroid Build Coastguard Worker 
443*84e33947SAndroid Build Coastguard Worker /**
444*84e33947SAndroid Build Coastguard Worker  * Handles the service response for the get capabilities client request.
445*84e33947SAndroid Build Coastguard Worker  *
446*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiResponse().
447*84e33947SAndroid Build Coastguard Worker  *
448*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
449*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
450*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
451*84e33947SAndroid Build Coastguard Worker  */
chppWifiGetCapabilitiesResult(struct ChppWifiClientState * clientContext,uint8_t * buf,size_t len)452*84e33947SAndroid Build Coastguard Worker static void chppWifiGetCapabilitiesResult(
453*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len) {
454*84e33947SAndroid Build Coastguard Worker   if (len < sizeof(struct ChppWifiGetCapabilitiesResponse)) {
455*84e33947SAndroid Build Coastguard Worker     CHPP_LOGE("Bad WiFi capabilities len=%" PRIuSIZE, len);
456*84e33947SAndroid Build Coastguard Worker 
457*84e33947SAndroid Build Coastguard Worker   } else {
458*84e33947SAndroid Build Coastguard Worker     struct ChppWifiGetCapabilitiesParameters *result =
459*84e33947SAndroid Build Coastguard Worker         &((struct ChppWifiGetCapabilitiesResponse *)buf)->params;
460*84e33947SAndroid Build Coastguard Worker 
461*84e33947SAndroid Build Coastguard Worker     CHPP_LOGD("chppWifiGetCapabilitiesResult received capabilities=0x%" PRIx32,
462*84e33947SAndroid Build Coastguard Worker               result->capabilities);
463*84e33947SAndroid Build Coastguard Worker 
464*84e33947SAndroid Build Coastguard Worker     CHPP_ASSERT((result->capabilities & CHPP_WIFI_DEFAULT_CAPABILITIES) ==
465*84e33947SAndroid Build Coastguard Worker                 CHPP_WIFI_DEFAULT_CAPABILITIES);
466*84e33947SAndroid Build Coastguard Worker     if (result->capabilities != CHPP_WIFI_DEFAULT_CAPABILITIES) {
467*84e33947SAndroid Build Coastguard Worker       CHPP_LOGE("WiFi capabilities 0x%" PRIx32 " != 0x%" PRIx32,
468*84e33947SAndroid Build Coastguard Worker                 result->capabilities, CHPP_WIFI_DEFAULT_CAPABILITIES);
469*84e33947SAndroid Build Coastguard Worker     }
470*84e33947SAndroid Build Coastguard Worker 
471*84e33947SAndroid Build Coastguard Worker     clientContext->capabilitiesValid = true;
472*84e33947SAndroid Build Coastguard Worker     clientContext->capabilities = result->capabilities;
473*84e33947SAndroid Build Coastguard Worker   }
474*84e33947SAndroid Build Coastguard Worker }
475*84e33947SAndroid Build Coastguard Worker 
476*84e33947SAndroid Build Coastguard Worker /**
477*84e33947SAndroid Build Coastguard Worker  * Handles the service response for the Configure Scan Monitor client request.
478*84e33947SAndroid Build Coastguard Worker  *
479*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiResponse().
480*84e33947SAndroid Build Coastguard Worker  *
481*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
482*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
483*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
484*84e33947SAndroid Build Coastguard Worker  */
chppWifiConfigureScanMonitorResult(struct ChppWifiClientState * clientContext,uint8_t * buf,size_t len)485*84e33947SAndroid Build Coastguard Worker static void chppWifiConfigureScanMonitorResult(
486*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len) {
487*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(clientContext);
488*84e33947SAndroid Build Coastguard Worker 
489*84e33947SAndroid Build Coastguard Worker   if (len < sizeof(struct ChppWifiConfigureScanMonitorAsyncResponse)) {
490*84e33947SAndroid Build Coastguard Worker     // Short response length indicates an error
491*84e33947SAndroid Build Coastguard Worker     uint8_t error = chppAppShortResponseErrorHandler(buf, len, "ScanMonitor");
492*84e33947SAndroid Build Coastguard Worker     if (!gWifiClientContext.scanMonitorSilenceCallback) {
493*84e33947SAndroid Build Coastguard Worker       gCallbacks->scanMonitorStatusChangeCallback(false, error);
494*84e33947SAndroid Build Coastguard Worker     }
495*84e33947SAndroid Build Coastguard Worker   } else {
496*84e33947SAndroid Build Coastguard Worker     struct ChppWifiConfigureScanMonitorAsyncResponseParameters *result =
497*84e33947SAndroid Build Coastguard Worker         &((struct ChppWifiConfigureScanMonitorAsyncResponse *)buf)->params;
498*84e33947SAndroid Build Coastguard Worker 
499*84e33947SAndroid Build Coastguard Worker     gWifiClientContext.scanMonitorEnabled = result->enabled;
500*84e33947SAndroid Build Coastguard Worker     CHPP_LOGD(
501*84e33947SAndroid Build Coastguard Worker         "chppWifiConfigureScanMonitorResult received enable=%d, "
502*84e33947SAndroid Build Coastguard Worker         "errorCode=%" PRIu8,
503*84e33947SAndroid Build Coastguard Worker         result->enabled, result->errorCode);
504*84e33947SAndroid Build Coastguard Worker 
505*84e33947SAndroid Build Coastguard Worker     if (!gWifiClientContext.scanMonitorSilenceCallback) {
506*84e33947SAndroid Build Coastguard Worker       // Per the scanMonitorStatusChangeCallback API contract, unsolicited
507*84e33947SAndroid Build Coastguard Worker       // calls to scanMonitorStatusChangeCallback must not be made, and it
508*84e33947SAndroid Build Coastguard Worker       // should only be invoked as the direct result of an earlier call to
509*84e33947SAndroid Build Coastguard Worker       // configureScanMonitor.
510*84e33947SAndroid Build Coastguard Worker       gCallbacks->scanMonitorStatusChangeCallback(result->enabled,
511*84e33947SAndroid Build Coastguard Worker                                                   result->errorCode);
512*84e33947SAndroid Build Coastguard Worker     }  // Else, the WiFi subsystem has been reset and we are required to
513*84e33947SAndroid Build Coastguard Worker        // silently reenable the scan monitor.
514*84e33947SAndroid Build Coastguard Worker 
515*84e33947SAndroid Build Coastguard Worker     gWifiClientContext.scanMonitorSilenceCallback = false;
516*84e33947SAndroid Build Coastguard Worker   }
517*84e33947SAndroid Build Coastguard Worker }
518*84e33947SAndroid Build Coastguard Worker 
519*84e33947SAndroid Build Coastguard Worker /**
520*84e33947SAndroid Build Coastguard Worker  * Handles the service response for the Request Scan Result client request.
521*84e33947SAndroid Build Coastguard Worker  *
522*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiResponse().
523*84e33947SAndroid Build Coastguard Worker  *
524*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
525*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
526*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
527*84e33947SAndroid Build Coastguard Worker  */
chppWifiRequestScanResult(struct ChppWifiClientState * clientContext,uint8_t * buf,size_t len)528*84e33947SAndroid Build Coastguard Worker static void chppWifiRequestScanResult(struct ChppWifiClientState *clientContext,
529*84e33947SAndroid Build Coastguard Worker                                       uint8_t *buf, size_t len) {
530*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(clientContext);
531*84e33947SAndroid Build Coastguard Worker 
532*84e33947SAndroid Build Coastguard Worker   if (len < sizeof(struct ChppWifiRequestScanResponse)) {
533*84e33947SAndroid Build Coastguard Worker     // Short response length indicates an error
534*84e33947SAndroid Build Coastguard Worker     gCallbacks->scanResponseCallback(
535*84e33947SAndroid Build Coastguard Worker         false, chppAppShortResponseErrorHandler(buf, len, "ScanRequest"));
536*84e33947SAndroid Build Coastguard Worker 
537*84e33947SAndroid Build Coastguard Worker   } else {
538*84e33947SAndroid Build Coastguard Worker     struct ChppWifiRequestScanResponseParameters *result =
539*84e33947SAndroid Build Coastguard Worker         &((struct ChppWifiRequestScanResponse *)buf)->params;
540*84e33947SAndroid Build Coastguard Worker     CHPP_LOGI("Scan request success=%d at service", result->pending);
541*84e33947SAndroid Build Coastguard Worker     gCallbacks->scanResponseCallback(result->pending, result->errorCode);
542*84e33947SAndroid Build Coastguard Worker   }
543*84e33947SAndroid Build Coastguard Worker }
544*84e33947SAndroid Build Coastguard Worker 
545*84e33947SAndroid Build Coastguard Worker /**
546*84e33947SAndroid Build Coastguard Worker  * Handles the service response for the Request Ranging Result client request.
547*84e33947SAndroid Build Coastguard Worker  *
548*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiResponse().
549*84e33947SAndroid Build Coastguard Worker  *
550*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
551*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
552*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
553*84e33947SAndroid Build Coastguard Worker  */
chppWifiRequestRangingResult(struct ChppWifiClientState * clientContext,uint8_t * buf,size_t len)554*84e33947SAndroid Build Coastguard Worker static void chppWifiRequestRangingResult(
555*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len) {
556*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(clientContext);
557*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(len);
558*84e33947SAndroid Build Coastguard Worker 
559*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *rxHeader = (struct ChppAppHeader *)buf;
560*84e33947SAndroid Build Coastguard Worker 
561*84e33947SAndroid Build Coastguard Worker   if (rxHeader->error != CHPP_APP_ERROR_NONE) {
562*84e33947SAndroid Build Coastguard Worker     gCallbacks->rangingEventCallback(chppAppErrorToChreError(rxHeader->error),
563*84e33947SAndroid Build Coastguard Worker                                      NULL);
564*84e33947SAndroid Build Coastguard Worker 
565*84e33947SAndroid Build Coastguard Worker   } else {
566*84e33947SAndroid Build Coastguard Worker     CHPP_LOGD("Ranging request accepted at service");
567*84e33947SAndroid Build Coastguard Worker   }
568*84e33947SAndroid Build Coastguard Worker }
569*84e33947SAndroid Build Coastguard Worker 
570*84e33947SAndroid Build Coastguard Worker /**
571*84e33947SAndroid Build Coastguard Worker  * Handles the service response for the NAN subscribe client request.
572*84e33947SAndroid Build Coastguard Worker  *
573*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiResponse().
574*84e33947SAndroid Build Coastguard Worker  *
575*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
576*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
577*84e33947SAndroid Build Coastguard Worker  */
chppWifiRequestNanSubscribeResult(uint8_t * buf,size_t len)578*84e33947SAndroid Build Coastguard Worker static void chppWifiRequestNanSubscribeResult(uint8_t *buf, size_t len) {
579*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(len);
580*84e33947SAndroid Build Coastguard Worker 
581*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *rxHeader = (struct ChppAppHeader *)buf;
582*84e33947SAndroid Build Coastguard Worker 
583*84e33947SAndroid Build Coastguard Worker   if (rxHeader->error != CHPP_APP_ERROR_NONE) {
584*84e33947SAndroid Build Coastguard Worker     gCallbacks->nanServiceIdentifierCallback(
585*84e33947SAndroid Build Coastguard Worker         chppAppErrorToChreError(rxHeader->error), 0 /* subscriptionId */);
586*84e33947SAndroid Build Coastguard Worker 
587*84e33947SAndroid Build Coastguard Worker   } else {
588*84e33947SAndroid Build Coastguard Worker     CHPP_LOGD("NAN sub accepted at service");
589*84e33947SAndroid Build Coastguard Worker   }
590*84e33947SAndroid Build Coastguard Worker }
591*84e33947SAndroid Build Coastguard Worker 
592*84e33947SAndroid Build Coastguard Worker /**
593*84e33947SAndroid Build Coastguard Worker  * Handles the service response for the NAN subscription cancel client request.
594*84e33947SAndroid Build Coastguard Worker  *
595*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiResponse().
596*84e33947SAndroid Build Coastguard Worker  *
597*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
598*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
599*84e33947SAndroid Build Coastguard Worker  */
chppWifiNanSubscriptionCanceledResult(uint8_t * buf,size_t len)600*84e33947SAndroid Build Coastguard Worker static void chppWifiNanSubscriptionCanceledResult(uint8_t *buf, size_t len) {
601*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(len);
602*84e33947SAndroid Build Coastguard Worker 
603*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *rxHeader = (struct ChppAppHeader *)buf;
604*84e33947SAndroid Build Coastguard Worker 
605*84e33947SAndroid Build Coastguard Worker   if (rxHeader->error != CHPP_APP_ERROR_NONE) {
606*84e33947SAndroid Build Coastguard Worker     gCallbacks->nanSubscriptionCanceledCallback(
607*84e33947SAndroid Build Coastguard Worker         chppAppErrorToChreError(rxHeader->error), 0 /* subscriptionId */);
608*84e33947SAndroid Build Coastguard Worker 
609*84e33947SAndroid Build Coastguard Worker   } else {
610*84e33947SAndroid Build Coastguard Worker     CHPP_LOGD("NAN sub cancel accepted at service");
611*84e33947SAndroid Build Coastguard Worker   }
612*84e33947SAndroid Build Coastguard Worker }
613*84e33947SAndroid Build Coastguard Worker 
614*84e33947SAndroid Build Coastguard Worker /**
615*84e33947SAndroid Build Coastguard Worker  * Handles the WiFi scan event service notification.
616*84e33947SAndroid Build Coastguard Worker  *
617*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiNotification().
618*84e33947SAndroid Build Coastguard Worker  *
619*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
620*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
621*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
622*84e33947SAndroid Build Coastguard Worker  */
chppWifiScanEventNotification(struct ChppWifiClientState * clientContext,uint8_t * buf,size_t len)623*84e33947SAndroid Build Coastguard Worker static void chppWifiScanEventNotification(
624*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len) {
625*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(clientContext);
626*84e33947SAndroid Build Coastguard Worker   CHPP_LOGD("chppWifiScanEventNotification received data len=%" PRIuSIZE, len);
627*84e33947SAndroid Build Coastguard Worker 
628*84e33947SAndroid Build Coastguard Worker   buf += sizeof(struct ChppAppHeader);
629*84e33947SAndroid Build Coastguard Worker   len -= sizeof(struct ChppAppHeader);
630*84e33947SAndroid Build Coastguard Worker 
631*84e33947SAndroid Build Coastguard Worker   struct chreWifiScanEvent *chre =
632*84e33947SAndroid Build Coastguard Worker       chppWifiScanEventToChre((struct ChppWifiScanEvent *)buf, len);
633*84e33947SAndroid Build Coastguard Worker 
634*84e33947SAndroid Build Coastguard Worker   if (chre == NULL) {
635*84e33947SAndroid Build Coastguard Worker     CHPP_LOGE("Scan event conversion failed len=%" PRIuSIZE, len);
636*84e33947SAndroid Build Coastguard Worker   } else {
637*84e33947SAndroid Build Coastguard Worker #ifdef CHPP_CLIENT_ENABLED_TIMESYNC
638*84e33947SAndroid Build Coastguard Worker     uint64_t correctedTime =
639*84e33947SAndroid Build Coastguard Worker         chre->referenceTime -
640*84e33947SAndroid Build Coastguard Worker         (uint64_t)chppTimesyncGetOffset(gWifiClientContext.client.appContext,
641*84e33947SAndroid Build Coastguard Worker                                         CHPP_WIFI_MAX_TIMESYNC_AGE_NS);
642*84e33947SAndroid Build Coastguard Worker     uint64_t currentTime = chppGetCurrentTimeNs();
643*84e33947SAndroid Build Coastguard Worker     if (correctedTime > currentTime) {
644*84e33947SAndroid Build Coastguard Worker       CHPP_LOGW("WiFi scan time overcorrected %" PRIu64 " current %" PRIu64,
645*84e33947SAndroid Build Coastguard Worker                 correctedTime / CHPP_NSEC_PER_MSEC,
646*84e33947SAndroid Build Coastguard Worker                 currentTime / CHPP_NSEC_PER_MSEC);
647*84e33947SAndroid Build Coastguard Worker       correctedTime = currentTime;
648*84e33947SAndroid Build Coastguard Worker     }
649*84e33947SAndroid Build Coastguard Worker     CHPP_LOGD("WiFi scan time corrected from %" PRIu64 "to %" PRIu64,
650*84e33947SAndroid Build Coastguard Worker               chre->referenceTime / CHPP_NSEC_PER_MSEC,
651*84e33947SAndroid Build Coastguard Worker               correctedTime / CHPP_NSEC_PER_MSEC);
652*84e33947SAndroid Build Coastguard Worker     chre->referenceTime = correctedTime;
653*84e33947SAndroid Build Coastguard Worker #endif
654*84e33947SAndroid Build Coastguard Worker 
655*84e33947SAndroid Build Coastguard Worker     CHPP_DEBUG_ASSERT(chppCheckWifiScanEventNotification(chre));
656*84e33947SAndroid Build Coastguard Worker 
657*84e33947SAndroid Build Coastguard Worker     gCallbacks->scanEventCallback(chre);
658*84e33947SAndroid Build Coastguard Worker   }
659*84e33947SAndroid Build Coastguard Worker }
660*84e33947SAndroid Build Coastguard Worker 
661*84e33947SAndroid Build Coastguard Worker /**
662*84e33947SAndroid Build Coastguard Worker  * Handles the WiFi ranging event service notification.
663*84e33947SAndroid Build Coastguard Worker  *
664*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiNotification().
665*84e33947SAndroid Build Coastguard Worker  *
666*84e33947SAndroid Build Coastguard Worker  * @param clientContext Maintains status for each client instance.
667*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
668*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
669*84e33947SAndroid Build Coastguard Worker  */
chppWifiRangingEventNotification(struct ChppWifiClientState * clientContext,uint8_t * buf,size_t len)670*84e33947SAndroid Build Coastguard Worker static void chppWifiRangingEventNotification(
671*84e33947SAndroid Build Coastguard Worker     struct ChppWifiClientState *clientContext, uint8_t *buf, size_t len) {
672*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(clientContext);
673*84e33947SAndroid Build Coastguard Worker 
674*84e33947SAndroid Build Coastguard Worker   CHPP_LOGD("chppWifiRangingEventNotification received data len=%" PRIuSIZE,
675*84e33947SAndroid Build Coastguard Worker             len);
676*84e33947SAndroid Build Coastguard Worker 
677*84e33947SAndroid Build Coastguard Worker   buf += sizeof(struct ChppAppHeader);
678*84e33947SAndroid Build Coastguard Worker   len -= sizeof(struct ChppAppHeader);
679*84e33947SAndroid Build Coastguard Worker 
680*84e33947SAndroid Build Coastguard Worker   // Timestamp correction prior to conversion to avoid const casting issues.
681*84e33947SAndroid Build Coastguard Worker #ifdef CHPP_CLIENT_ENABLED_TIMESYNC
682*84e33947SAndroid Build Coastguard Worker   struct ChppWifiRangingEvent *event = (struct ChppWifiRangingEvent *)buf;
683*84e33947SAndroid Build Coastguard Worker 
684*84e33947SAndroid Build Coastguard Worker   for (size_t i = 0; i < event->resultCount; i++) {
685*84e33947SAndroid Build Coastguard Worker     struct ChppWifiRangingResult *results =
686*84e33947SAndroid Build Coastguard Worker         (struct ChppWifiRangingResult *)&buf[event->results.offset];
687*84e33947SAndroid Build Coastguard Worker 
688*84e33947SAndroid Build Coastguard Worker     uint64_t correctedTime =
689*84e33947SAndroid Build Coastguard Worker         results[i].timestamp -
690*84e33947SAndroid Build Coastguard Worker         (uint64_t)chppTimesyncGetOffset(gWifiClientContext.client.appContext,
691*84e33947SAndroid Build Coastguard Worker                                         CHPP_WIFI_MAX_TIMESYNC_AGE_NS);
692*84e33947SAndroid Build Coastguard Worker     uint64_t currentTime = chppGetCurrentTimeNs();
693*84e33947SAndroid Build Coastguard Worker     if (correctedTime > currentTime) {
694*84e33947SAndroid Build Coastguard Worker       CHPP_LOGW("WiFi ranging time overcorrected %" PRIu64 " current %" PRIu64,
695*84e33947SAndroid Build Coastguard Worker                 correctedTime / CHPP_NSEC_PER_MSEC,
696*84e33947SAndroid Build Coastguard Worker                 currentTime / CHPP_NSEC_PER_MSEC);
697*84e33947SAndroid Build Coastguard Worker       correctedTime = currentTime;
698*84e33947SAndroid Build Coastguard Worker     }
699*84e33947SAndroid Build Coastguard Worker     CHPP_LOGD("WiFi ranging result time corrected from %" PRIu64 "to %" PRIu64,
700*84e33947SAndroid Build Coastguard Worker               results[i].timestamp / CHPP_NSEC_PER_MSEC,
701*84e33947SAndroid Build Coastguard Worker               correctedTime / CHPP_NSEC_PER_MSEC);
702*84e33947SAndroid Build Coastguard Worker     results[i].timestamp = correctedTime;
703*84e33947SAndroid Build Coastguard Worker   }
704*84e33947SAndroid Build Coastguard Worker #endif
705*84e33947SAndroid Build Coastguard Worker 
706*84e33947SAndroid Build Coastguard Worker   struct chreWifiRangingEvent *chre =
707*84e33947SAndroid Build Coastguard Worker       chppWifiRangingEventToChre((struct ChppWifiRangingEvent *)buf, len);
708*84e33947SAndroid Build Coastguard Worker 
709*84e33947SAndroid Build Coastguard Worker   uint8_t error = CHRE_ERROR_NONE;
710*84e33947SAndroid Build Coastguard Worker   if (chre == NULL) {
711*84e33947SAndroid Build Coastguard Worker     error = CHRE_ERROR;
712*84e33947SAndroid Build Coastguard Worker     CHPP_LOGE("Ranging event conversion failed len=%" PRIuSIZE, len);
713*84e33947SAndroid Build Coastguard Worker   }
714*84e33947SAndroid Build Coastguard Worker 
715*84e33947SAndroid Build Coastguard Worker   gCallbacks->rangingEventCallback(error, chre);
716*84e33947SAndroid Build Coastguard Worker }
717*84e33947SAndroid Build Coastguard Worker 
718*84e33947SAndroid Build Coastguard Worker /**
719*84e33947SAndroid Build Coastguard Worker  * Handles the NAN discovery event service notification.
720*84e33947SAndroid Build Coastguard Worker  *
721*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiNotification().
722*84e33947SAndroid Build Coastguard Worker  *
723*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
724*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
725*84e33947SAndroid Build Coastguard Worker  */
chppWifiDiscoveryEventNotification(uint8_t * buf,size_t len)726*84e33947SAndroid Build Coastguard Worker static void chppWifiDiscoveryEventNotification(uint8_t *buf, size_t len) {
727*84e33947SAndroid Build Coastguard Worker   CHPP_LOGD("chppWifiDiscoveryEventNotification data len=%" PRIuSIZE, len);
728*84e33947SAndroid Build Coastguard Worker 
729*84e33947SAndroid Build Coastguard Worker   buf += sizeof(struct ChppAppHeader);
730*84e33947SAndroid Build Coastguard Worker   len -= sizeof(struct ChppAppHeader);
731*84e33947SAndroid Build Coastguard Worker 
732*84e33947SAndroid Build Coastguard Worker   struct ChppWifiNanDiscoveryEvent *chppEvent =
733*84e33947SAndroid Build Coastguard Worker       (struct ChppWifiNanDiscoveryEvent *)buf;
734*84e33947SAndroid Build Coastguard Worker   struct chreWifiNanDiscoveryEvent *event =
735*84e33947SAndroid Build Coastguard Worker       chppWifiNanDiscoveryEventToChre(chppEvent, len);
736*84e33947SAndroid Build Coastguard Worker 
737*84e33947SAndroid Build Coastguard Worker   if (event == NULL) {
738*84e33947SAndroid Build Coastguard Worker     CHPP_LOGE("Discovery event CHPP -> CHRE conversion failed");
739*84e33947SAndroid Build Coastguard Worker   } else {
740*84e33947SAndroid Build Coastguard Worker     gCallbacks->nanServiceDiscoveryCallback(event);
741*84e33947SAndroid Build Coastguard Worker   }
742*84e33947SAndroid Build Coastguard Worker }
743*84e33947SAndroid Build Coastguard Worker 
744*84e33947SAndroid Build Coastguard Worker /**
745*84e33947SAndroid Build Coastguard Worker  * Handles the NAN connection lost event service notification.
746*84e33947SAndroid Build Coastguard Worker  *
747*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiNotification().
748*84e33947SAndroid Build Coastguard Worker  *
749*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
750*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
751*84e33947SAndroid Build Coastguard Worker  */
chppWifiNanServiceLostEventNotification(uint8_t * buf,size_t len)752*84e33947SAndroid Build Coastguard Worker static void chppWifiNanServiceLostEventNotification(uint8_t *buf, size_t len) {
753*84e33947SAndroid Build Coastguard Worker   buf += sizeof(struct ChppAppHeader);
754*84e33947SAndroid Build Coastguard Worker   len -= sizeof(struct ChppAppHeader);
755*84e33947SAndroid Build Coastguard Worker 
756*84e33947SAndroid Build Coastguard Worker   struct ChppWifiNanSessionLostEvent *chppEvent =
757*84e33947SAndroid Build Coastguard Worker       (struct ChppWifiNanSessionLostEvent *)buf;
758*84e33947SAndroid Build Coastguard Worker   struct chreWifiNanSessionLostEvent *event =
759*84e33947SAndroid Build Coastguard Worker       chppWifiNanSessionLostEventToChre(chppEvent, len);
760*84e33947SAndroid Build Coastguard Worker 
761*84e33947SAndroid Build Coastguard Worker   if (event == NULL) {
762*84e33947SAndroid Build Coastguard Worker     CHPP_LOGE("Session lost event CHPP -> CHRE conversion failed");
763*84e33947SAndroid Build Coastguard Worker   } else {
764*84e33947SAndroid Build Coastguard Worker     gCallbacks->nanServiceLostCallback(event->id, event->peerId);
765*84e33947SAndroid Build Coastguard Worker   }
766*84e33947SAndroid Build Coastguard Worker }
767*84e33947SAndroid Build Coastguard Worker 
768*84e33947SAndroid Build Coastguard Worker /**
769*84e33947SAndroid Build Coastguard Worker  * Handles the NAN subscription termination event service notification.
770*84e33947SAndroid Build Coastguard Worker  *
771*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiNotification().
772*84e33947SAndroid Build Coastguard Worker  *
773*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
774*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
775*84e33947SAndroid Build Coastguard Worker  */
chppWifiNanServiceTerminatedEventNotification(uint8_t * buf,size_t len)776*84e33947SAndroid Build Coastguard Worker static void chppWifiNanServiceTerminatedEventNotification(uint8_t *buf,
777*84e33947SAndroid Build Coastguard Worker                                                           size_t len) {
778*84e33947SAndroid Build Coastguard Worker   buf += sizeof(struct ChppAppHeader);
779*84e33947SAndroid Build Coastguard Worker   len -= sizeof(struct ChppAppHeader);
780*84e33947SAndroid Build Coastguard Worker 
781*84e33947SAndroid Build Coastguard Worker   struct ChppWifiNanSessionTerminatedEvent *chppEvent =
782*84e33947SAndroid Build Coastguard Worker       (struct ChppWifiNanSessionTerminatedEvent *)buf;
783*84e33947SAndroid Build Coastguard Worker   struct chreWifiNanSessionTerminatedEvent *event =
784*84e33947SAndroid Build Coastguard Worker       chppWifiNanSessionTerminatedEventToChre(chppEvent, len);
785*84e33947SAndroid Build Coastguard Worker 
786*84e33947SAndroid Build Coastguard Worker   if (event == NULL) {
787*84e33947SAndroid Build Coastguard Worker     CHPP_LOGE("Session terminated event CHPP -> CHRE conversion failed");
788*84e33947SAndroid Build Coastguard Worker   } else {
789*84e33947SAndroid Build Coastguard Worker     gCallbacks->nanServiceTerminatedCallback(event->reason, event->id);
790*84e33947SAndroid Build Coastguard Worker   }
791*84e33947SAndroid Build Coastguard Worker }
792*84e33947SAndroid Build Coastguard Worker 
793*84e33947SAndroid Build Coastguard Worker /**
794*84e33947SAndroid Build Coastguard Worker  * Handles the service response for the NAN subscribe client request.
795*84e33947SAndroid Build Coastguard Worker  *
796*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiNotification().
797*84e33947SAndroid Build Coastguard Worker  *
798*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
799*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
800*84e33947SAndroid Build Coastguard Worker  */
chppWifiRequestNanSubscribeNotification(uint8_t * buf,size_t len)801*84e33947SAndroid Build Coastguard Worker static void chppWifiRequestNanSubscribeNotification(uint8_t *buf, size_t len) {
802*84e33947SAndroid Build Coastguard Worker   uint8_t errorCode = CHRE_ERROR_NONE;
803*84e33947SAndroid Build Coastguard Worker   uint32_t subscriptionId = 0;
804*84e33947SAndroid Build Coastguard Worker 
805*84e33947SAndroid Build Coastguard Worker   if (len < sizeof(struct ChppWifiNanServiceIdentifier)) {
806*84e33947SAndroid Build Coastguard Worker     errorCode = CHRE_ERROR;
807*84e33947SAndroid Build Coastguard Worker   } else {
808*84e33947SAndroid Build Coastguard Worker     struct ChppWifiNanServiceIdentifier *id =
809*84e33947SAndroid Build Coastguard Worker         (struct ChppWifiNanServiceIdentifier *)buf;
810*84e33947SAndroid Build Coastguard Worker     errorCode = id->errorCode;
811*84e33947SAndroid Build Coastguard Worker     subscriptionId = id->subscriptionId;
812*84e33947SAndroid Build Coastguard Worker   }
813*84e33947SAndroid Build Coastguard Worker   gCallbacks->nanServiceIdentifierCallback(errorCode, subscriptionId);
814*84e33947SAndroid Build Coastguard Worker }
815*84e33947SAndroid Build Coastguard Worker 
816*84e33947SAndroid Build Coastguard Worker /**
817*84e33947SAndroid Build Coastguard Worker  * Handles the service response for the NAN subscription cancel client request.
818*84e33947SAndroid Build Coastguard Worker  *
819*84e33947SAndroid Build Coastguard Worker  * This function is called from chppDispatchWifiNotification().
820*84e33947SAndroid Build Coastguard Worker  *
821*84e33947SAndroid Build Coastguard Worker  * @param buf Input data. Cannot be null.
822*84e33947SAndroid Build Coastguard Worker  * @param len Length of input data in bytes.
823*84e33947SAndroid Build Coastguard Worker  */
chppWifiNanSubscriptionCanceledNotification(uint8_t * buf,size_t len)824*84e33947SAndroid Build Coastguard Worker static void chppWifiNanSubscriptionCanceledNotification(uint8_t *buf,
825*84e33947SAndroid Build Coastguard Worker                                                         size_t len) {
826*84e33947SAndroid Build Coastguard Worker   uint8_t errorCode = CHRE_ERROR_NONE;
827*84e33947SAndroid Build Coastguard Worker   uint32_t subscriptionId = 0;
828*84e33947SAndroid Build Coastguard Worker   if (len < (sizeof(struct ChppWifiNanSubscriptionCanceledResponse))) {
829*84e33947SAndroid Build Coastguard Worker     errorCode = CHRE_ERROR;
830*84e33947SAndroid Build Coastguard Worker   } else {
831*84e33947SAndroid Build Coastguard Worker     struct ChppWifiNanSubscriptionCanceledResponse *chppNotif =
832*84e33947SAndroid Build Coastguard Worker         (struct ChppWifiNanSubscriptionCanceledResponse *)buf;
833*84e33947SAndroid Build Coastguard Worker     errorCode = chppNotif->errorCode;
834*84e33947SAndroid Build Coastguard Worker     subscriptionId = chppNotif->subscriptionId;
835*84e33947SAndroid Build Coastguard Worker   }
836*84e33947SAndroid Build Coastguard Worker   gCallbacks->nanSubscriptionCanceledCallback(errorCode, subscriptionId);
837*84e33947SAndroid Build Coastguard Worker }
838*84e33947SAndroid Build Coastguard Worker 
839*84e33947SAndroid Build Coastguard Worker /**
840*84e33947SAndroid Build Coastguard Worker  * Initializes the WiFi client upon an open request from CHRE and responds
841*84e33947SAndroid Build Coastguard Worker  * with the result.
842*84e33947SAndroid Build Coastguard Worker  *
843*84e33947SAndroid Build Coastguard Worker  * @param systemApi CHRE system function pointers.
844*84e33947SAndroid Build Coastguard Worker  * @param callbacks CHRE entry points.
845*84e33947SAndroid Build Coastguard Worker  *
846*84e33947SAndroid Build Coastguard Worker  * @return True if successful. False otherwise.
847*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientOpen(const struct chrePalSystemApi * systemApi,const struct chrePalWifiCallbacks * callbacks)848*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientOpen(const struct chrePalSystemApi *systemApi,
849*84e33947SAndroid Build Coastguard Worker                                const struct chrePalWifiCallbacks *callbacks) {
850*84e33947SAndroid Build Coastguard Worker   CHPP_DEBUG_NOT_NULL(systemApi);
851*84e33947SAndroid Build Coastguard Worker   CHPP_DEBUG_NOT_NULL(callbacks);
852*84e33947SAndroid Build Coastguard Worker 
853*84e33947SAndroid Build Coastguard Worker   bool result = false;
854*84e33947SAndroid Build Coastguard Worker   gSystemApi = systemApi;
855*84e33947SAndroid Build Coastguard Worker   gCallbacks = callbacks;
856*84e33947SAndroid Build Coastguard Worker 
857*84e33947SAndroid Build Coastguard Worker   CHPP_LOGD("WiFi client opening");
858*84e33947SAndroid Build Coastguard Worker   if (gWifiClientContext.client.appContext == NULL) {
859*84e33947SAndroid Build Coastguard Worker     CHPP_LOGE("WiFi client app is null");
860*84e33947SAndroid Build Coastguard Worker   } else {
861*84e33947SAndroid Build Coastguard Worker     if (chppWaitForDiscoveryComplete(gWifiClientContext.client.appContext,
862*84e33947SAndroid Build Coastguard Worker                                      CHPP_WIFI_DISCOVERY_TIMEOUT_MS)) {
863*84e33947SAndroid Build Coastguard Worker       result = chppClientSendOpenRequest(
864*84e33947SAndroid Build Coastguard Worker           &gWifiClientContext.client,
865*84e33947SAndroid Build Coastguard Worker           &gWifiClientContext.outReqStates[CHPP_WIFI_OPEN], CHPP_WIFI_OPEN,
866*84e33947SAndroid Build Coastguard Worker           /*blocking=*/true);
867*84e33947SAndroid Build Coastguard Worker     }
868*84e33947SAndroid Build Coastguard Worker 
869*84e33947SAndroid Build Coastguard Worker     // Since CHPP_WIFI_DEFAULT_CAPABILITIES is mandatory, we can always
870*84e33947SAndroid Build Coastguard Worker     // pseudo-open and return true. Otherwise, these should have been gated.
871*84e33947SAndroid Build Coastguard Worker     chppClientPseudoOpen(&gWifiClientContext.client);
872*84e33947SAndroid Build Coastguard Worker     result = true;
873*84e33947SAndroid Build Coastguard Worker   }
874*84e33947SAndroid Build Coastguard Worker 
875*84e33947SAndroid Build Coastguard Worker   return result;
876*84e33947SAndroid Build Coastguard Worker }
877*84e33947SAndroid Build Coastguard Worker 
878*84e33947SAndroid Build Coastguard Worker /**
879*84e33947SAndroid Build Coastguard Worker  * Deinitializes the WiFi client.
880*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientClose(void)881*84e33947SAndroid Build Coastguard Worker static void chppWifiClientClose(void) {
882*84e33947SAndroid Build Coastguard Worker   // Remote
883*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *request = chppAllocClientRequestCommand(
884*84e33947SAndroid Build Coastguard Worker       &gWifiClientContext.client, CHPP_WIFI_CLOSE);
885*84e33947SAndroid Build Coastguard Worker 
886*84e33947SAndroid Build Coastguard Worker   if (request == NULL) {
887*84e33947SAndroid Build Coastguard Worker     CHPP_LOG_OOM();
888*84e33947SAndroid Build Coastguard Worker   } else if (chppClientSendTimestampedRequestAndWait(
889*84e33947SAndroid Build Coastguard Worker                  &gWifiClientContext.client,
890*84e33947SAndroid Build Coastguard Worker                  &gWifiClientContext.outReqStates[CHPP_WIFI_CLOSE], request,
891*84e33947SAndroid Build Coastguard Worker                  sizeof(*request))) {
892*84e33947SAndroid Build Coastguard Worker     gWifiClientContext.client.openState = CHPP_OPEN_STATE_CLOSED;
893*84e33947SAndroid Build Coastguard Worker     gWifiClientContext.capabilities = CHRE_WIFI_CAPABILITIES_NONE;
894*84e33947SAndroid Build Coastguard Worker     gWifiClientContext.capabilitiesValid = false;
895*84e33947SAndroid Build Coastguard Worker     chppClientCloseOpenRequests(&gWifiClientContext.client, &kWifiClientConfig,
896*84e33947SAndroid Build Coastguard Worker                                 true /* clearOnly */);
897*84e33947SAndroid Build Coastguard Worker   }
898*84e33947SAndroid Build Coastguard Worker }
899*84e33947SAndroid Build Coastguard Worker 
900*84e33947SAndroid Build Coastguard Worker /**
901*84e33947SAndroid Build Coastguard Worker  * Retrieves a set of flags indicating the WiFi features supported by the
902*84e33947SAndroid Build Coastguard Worker  * current implementation.
903*84e33947SAndroid Build Coastguard Worker  *
904*84e33947SAndroid Build Coastguard Worker  * @return Capabilities flags.
905*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientGetCapabilities(void)906*84e33947SAndroid Build Coastguard Worker static uint32_t chppWifiClientGetCapabilities(void) {
907*84e33947SAndroid Build Coastguard Worker   uint32_t capabilities = CHPP_WIFI_DEFAULT_CAPABILITIES;
908*84e33947SAndroid Build Coastguard Worker 
909*84e33947SAndroid Build Coastguard Worker   if (gWifiClientContext.capabilitiesValid) {
910*84e33947SAndroid Build Coastguard Worker     // Result already cached
911*84e33947SAndroid Build Coastguard Worker     capabilities = gWifiClientContext.capabilities;
912*84e33947SAndroid Build Coastguard Worker 
913*84e33947SAndroid Build Coastguard Worker   } else {
914*84e33947SAndroid Build Coastguard Worker     struct ChppAppHeader *request = chppAllocClientRequestCommand(
915*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.client, CHPP_WIFI_GET_CAPABILITIES);
916*84e33947SAndroid Build Coastguard Worker 
917*84e33947SAndroid Build Coastguard Worker     if (request == NULL) {
918*84e33947SAndroid Build Coastguard Worker       CHPP_LOG_OOM();
919*84e33947SAndroid Build Coastguard Worker     } else {
920*84e33947SAndroid Build Coastguard Worker       if (chppClientSendTimestampedRequestAndWait(
921*84e33947SAndroid Build Coastguard Worker               &gWifiClientContext.client,
922*84e33947SAndroid Build Coastguard Worker               &gWifiClientContext.outReqStates[CHPP_WIFI_GET_CAPABILITIES],
923*84e33947SAndroid Build Coastguard Worker               request, sizeof(*request))) {
924*84e33947SAndroid Build Coastguard Worker         // Success. gWifiClientContext.capabilities is now populated
925*84e33947SAndroid Build Coastguard Worker         if (gWifiClientContext.capabilitiesValid) {
926*84e33947SAndroid Build Coastguard Worker           capabilities = gWifiClientContext.capabilities;
927*84e33947SAndroid Build Coastguard Worker         }
928*84e33947SAndroid Build Coastguard Worker       }
929*84e33947SAndroid Build Coastguard Worker     }
930*84e33947SAndroid Build Coastguard Worker   }
931*84e33947SAndroid Build Coastguard Worker 
932*84e33947SAndroid Build Coastguard Worker   return capabilities;
933*84e33947SAndroid Build Coastguard Worker }
934*84e33947SAndroid Build Coastguard Worker 
935*84e33947SAndroid Build Coastguard Worker /**
936*84e33947SAndroid Build Coastguard Worker  * Enables/disables receiving unsolicited scan results (scan monitoring).
937*84e33947SAndroid Build Coastguard Worker  *
938*84e33947SAndroid Build Coastguard Worker  * @param enable True to enable.
939*84e33947SAndroid Build Coastguard Worker  *
940*84e33947SAndroid Build Coastguard Worker  * @return True indicates the request was sent off to the service.
941*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientConfigureScanMonitor(bool enable)942*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientConfigureScanMonitor(bool enable) {
943*84e33947SAndroid Build Coastguard Worker   bool result = false;
944*84e33947SAndroid Build Coastguard Worker 
945*84e33947SAndroid Build Coastguard Worker   struct ChppWifiConfigureScanMonitorAsyncRequest *request =
946*84e33947SAndroid Build Coastguard Worker       chppAllocClientRequestFixed(
947*84e33947SAndroid Build Coastguard Worker           &gWifiClientContext.client,
948*84e33947SAndroid Build Coastguard Worker           struct ChppWifiConfigureScanMonitorAsyncRequest);
949*84e33947SAndroid Build Coastguard Worker 
950*84e33947SAndroid Build Coastguard Worker   if (request == NULL) {
951*84e33947SAndroid Build Coastguard Worker     CHPP_LOG_OOM();
952*84e33947SAndroid Build Coastguard Worker   } else {
953*84e33947SAndroid Build Coastguard Worker     request->header.command = CHPP_WIFI_CONFIGURE_SCAN_MONITOR_ASYNC;
954*84e33947SAndroid Build Coastguard Worker     request->enable = enable;
955*84e33947SAndroid Build Coastguard Worker 
956*84e33947SAndroid Build Coastguard Worker     result = chppClientSendTimestampedRequestOrFail(
957*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.client,
958*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext
959*84e33947SAndroid Build Coastguard Worker              .outReqStates[CHPP_WIFI_CONFIGURE_SCAN_MONITOR_ASYNC],
960*84e33947SAndroid Build Coastguard Worker         request, sizeof(*request), CHPP_REQUEST_TIMEOUT_DEFAULT);
961*84e33947SAndroid Build Coastguard Worker   }
962*84e33947SAndroid Build Coastguard Worker 
963*84e33947SAndroid Build Coastguard Worker   return result;
964*84e33947SAndroid Build Coastguard Worker }
965*84e33947SAndroid Build Coastguard Worker 
966*84e33947SAndroid Build Coastguard Worker /**
967*84e33947SAndroid Build Coastguard Worker  * Request that the WiFi chipset perform a scan or deliver results from its
968*84e33947SAndroid Build Coastguard Worker  * cache.
969*84e33947SAndroid Build Coastguard Worker  *
970*84e33947SAndroid Build Coastguard Worker  * @param params See chreWifiRequestScanAsync().
971*84e33947SAndroid Build Coastguard Worker  *
972*84e33947SAndroid Build Coastguard Worker  * @return True indicates the request was sent off to the service.
973*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientRequestScan(const struct chreWifiScanParams * params)974*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientRequestScan(const struct chreWifiScanParams *params) {
975*84e33947SAndroid Build Coastguard Worker   struct ChppWifiScanParamsWithHeader *request;
976*84e33947SAndroid Build Coastguard Worker   size_t requestLen;
977*84e33947SAndroid Build Coastguard Worker 
978*84e33947SAndroid Build Coastguard Worker   bool result = chppWifiScanParamsFromChre(params, &request, &requestLen);
979*84e33947SAndroid Build Coastguard Worker 
980*84e33947SAndroid Build Coastguard Worker   if (!result) {
981*84e33947SAndroid Build Coastguard Worker     CHPP_LOG_OOM();
982*84e33947SAndroid Build Coastguard Worker   } else {
983*84e33947SAndroid Build Coastguard Worker     request->header.handle = gWifiClientContext.client.handle;
984*84e33947SAndroid Build Coastguard Worker     request->header.type = CHPP_MESSAGE_TYPE_CLIENT_REQUEST;
985*84e33947SAndroid Build Coastguard Worker     request->header.transaction = gWifiClientContext.client.transaction++;
986*84e33947SAndroid Build Coastguard Worker     request->header.error = CHPP_APP_ERROR_NONE;
987*84e33947SAndroid Build Coastguard Worker     request->header.command = CHPP_WIFI_REQUEST_SCAN_ASYNC;
988*84e33947SAndroid Build Coastguard Worker 
989*84e33947SAndroid Build Coastguard Worker     CHPP_STATIC_ASSERT(
990*84e33947SAndroid Build Coastguard Worker         CHRE_WIFI_SCAN_RESULT_TIMEOUT_NS > CHPP_WIFI_SCAN_RESULT_TIMEOUT_NS,
991*84e33947SAndroid Build Coastguard Worker         "Chpp wifi scan timeout needs to be smaller than CHRE wifi scan "
992*84e33947SAndroid Build Coastguard Worker         "timeout");
993*84e33947SAndroid Build Coastguard Worker     result = chppClientSendTimestampedRequestOrFail(
994*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.client,
995*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.outReqStates[CHPP_WIFI_REQUEST_SCAN_ASYNC], request,
996*84e33947SAndroid Build Coastguard Worker         requestLen, CHPP_WIFI_SCAN_RESULT_TIMEOUT_NS);
997*84e33947SAndroid Build Coastguard Worker   }
998*84e33947SAndroid Build Coastguard Worker 
999*84e33947SAndroid Build Coastguard Worker   return result;
1000*84e33947SAndroid Build Coastguard Worker }
1001*84e33947SAndroid Build Coastguard Worker 
1002*84e33947SAndroid Build Coastguard Worker /**
1003*84e33947SAndroid Build Coastguard Worker  * Releases the memory held for the scan event callback.
1004*84e33947SAndroid Build Coastguard Worker  *
1005*84e33947SAndroid Build Coastguard Worker  * @param event Location event to be released.
1006*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientReleaseScanEvent(struct chreWifiScanEvent * event)1007*84e33947SAndroid Build Coastguard Worker static void chppWifiClientReleaseScanEvent(struct chreWifiScanEvent *event) {
1008*84e33947SAndroid Build Coastguard Worker   if (event->scannedFreqListLen > 0) {
1009*84e33947SAndroid Build Coastguard Worker     void *scannedFreqList = CHPP_CONST_CAST_POINTER(event->scannedFreqList);
1010*84e33947SAndroid Build Coastguard Worker     CHPP_FREE_AND_NULLIFY(scannedFreqList);
1011*84e33947SAndroid Build Coastguard Worker   }
1012*84e33947SAndroid Build Coastguard Worker 
1013*84e33947SAndroid Build Coastguard Worker   if (event->resultCount > 0) {
1014*84e33947SAndroid Build Coastguard Worker     void *results = CHPP_CONST_CAST_POINTER(event->results);
1015*84e33947SAndroid Build Coastguard Worker     CHPP_FREE_AND_NULLIFY(results);
1016*84e33947SAndroid Build Coastguard Worker   }
1017*84e33947SAndroid Build Coastguard Worker 
1018*84e33947SAndroid Build Coastguard Worker   CHPP_FREE_AND_NULLIFY(event);
1019*84e33947SAndroid Build Coastguard Worker }
1020*84e33947SAndroid Build Coastguard Worker 
1021*84e33947SAndroid Build Coastguard Worker /**
1022*84e33947SAndroid Build Coastguard Worker  * Request that the WiFi chipset perform RTT ranging.
1023*84e33947SAndroid Build Coastguard Worker  *
1024*84e33947SAndroid Build Coastguard Worker  * @param params See chreWifiRequestRangingAsync().
1025*84e33947SAndroid Build Coastguard Worker  *
1026*84e33947SAndroid Build Coastguard Worker  * @return True indicates the request was sent off to the service.
1027*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientRequestRanging(const struct chreWifiRangingParams * params)1028*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientRequestRanging(
1029*84e33947SAndroid Build Coastguard Worker     const struct chreWifiRangingParams *params) {
1030*84e33947SAndroid Build Coastguard Worker   struct ChppWifiRangingParamsWithHeader *request;
1031*84e33947SAndroid Build Coastguard Worker   size_t requestLen;
1032*84e33947SAndroid Build Coastguard Worker 
1033*84e33947SAndroid Build Coastguard Worker   bool result = chppWifiRangingParamsFromChre(params, &request, &requestLen);
1034*84e33947SAndroid Build Coastguard Worker 
1035*84e33947SAndroid Build Coastguard Worker   if (!result) {
1036*84e33947SAndroid Build Coastguard Worker     CHPP_LOG_OOM();
1037*84e33947SAndroid Build Coastguard Worker   } else {
1038*84e33947SAndroid Build Coastguard Worker     request->header.handle = gWifiClientContext.client.handle;
1039*84e33947SAndroid Build Coastguard Worker     request->header.type = CHPP_MESSAGE_TYPE_CLIENT_REQUEST;
1040*84e33947SAndroid Build Coastguard Worker     request->header.transaction = gWifiClientContext.client.transaction++;
1041*84e33947SAndroid Build Coastguard Worker     request->header.error = CHPP_APP_ERROR_NONE;
1042*84e33947SAndroid Build Coastguard Worker     request->header.command = CHPP_WIFI_REQUEST_RANGING_ASYNC;
1043*84e33947SAndroid Build Coastguard Worker 
1044*84e33947SAndroid Build Coastguard Worker     result = chppClientSendTimestampedRequestOrFail(
1045*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.client,
1046*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.outReqStates[CHPP_WIFI_REQUEST_RANGING_ASYNC],
1047*84e33947SAndroid Build Coastguard Worker         request, requestLen, CHRE_WIFI_RANGING_RESULT_TIMEOUT_NS);
1048*84e33947SAndroid Build Coastguard Worker   }
1049*84e33947SAndroid Build Coastguard Worker 
1050*84e33947SAndroid Build Coastguard Worker   return result;
1051*84e33947SAndroid Build Coastguard Worker }
1052*84e33947SAndroid Build Coastguard Worker 
1053*84e33947SAndroid Build Coastguard Worker /**
1054*84e33947SAndroid Build Coastguard Worker  * Releases the memory held for the RTT ranging event callback.
1055*84e33947SAndroid Build Coastguard Worker  *
1056*84e33947SAndroid Build Coastguard Worker  * @param event Location event to be released.
1057*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientReleaseRangingEvent(struct chreWifiRangingEvent * event)1058*84e33947SAndroid Build Coastguard Worker static void chppWifiClientReleaseRangingEvent(
1059*84e33947SAndroid Build Coastguard Worker     struct chreWifiRangingEvent *event) {
1060*84e33947SAndroid Build Coastguard Worker   if (event->resultCount > 0) {
1061*84e33947SAndroid Build Coastguard Worker     void *results = CHPP_CONST_CAST_POINTER(event->results);
1062*84e33947SAndroid Build Coastguard Worker     CHPP_FREE_AND_NULLIFY(results);
1063*84e33947SAndroid Build Coastguard Worker   }
1064*84e33947SAndroid Build Coastguard Worker 
1065*84e33947SAndroid Build Coastguard Worker   CHPP_FREE_AND_NULLIFY(event);
1066*84e33947SAndroid Build Coastguard Worker }
1067*84e33947SAndroid Build Coastguard Worker 
1068*84e33947SAndroid Build Coastguard Worker /**
1069*84e33947SAndroid Build Coastguard Worker  * Request that the WiFi chipset perform a NAN subscription.
1070*84e33947SAndroid Build Coastguard Worker  * @see chreWifiNanSubscribe for more information.
1071*84e33947SAndroid Build Coastguard Worker  *
1072*84e33947SAndroid Build Coastguard Worker  * @param config NAN service subscription configuration.
1073*84e33947SAndroid Build Coastguard Worker  * @return true if subscribe request was successful, false otherwise.
1074*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientNanSubscribe(const struct chreWifiNanSubscribeConfig * config)1075*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientNanSubscribe(
1076*84e33947SAndroid Build Coastguard Worker     const struct chreWifiNanSubscribeConfig *config) {
1077*84e33947SAndroid Build Coastguard Worker   struct ChppWifiNanSubscribeConfigWithHeader *request;
1078*84e33947SAndroid Build Coastguard Worker   size_t requestLen;
1079*84e33947SAndroid Build Coastguard Worker 
1080*84e33947SAndroid Build Coastguard Worker   bool result =
1081*84e33947SAndroid Build Coastguard Worker       chppWifiNanSubscribeConfigFromChre(config, &request, &requestLen);
1082*84e33947SAndroid Build Coastguard Worker 
1083*84e33947SAndroid Build Coastguard Worker   if (!result) {
1084*84e33947SAndroid Build Coastguard Worker     CHPP_LOG_OOM();
1085*84e33947SAndroid Build Coastguard Worker   } else {
1086*84e33947SAndroid Build Coastguard Worker     request->header.handle = gWifiClientContext.client.handle;
1087*84e33947SAndroid Build Coastguard Worker     request->header.type = CHPP_MESSAGE_TYPE_CLIENT_REQUEST;
1088*84e33947SAndroid Build Coastguard Worker     request->header.transaction = gWifiClientContext.client.transaction++;
1089*84e33947SAndroid Build Coastguard Worker     request->header.error = CHPP_APP_ERROR_NONE;
1090*84e33947SAndroid Build Coastguard Worker     request->header.command = CHPP_WIFI_REQUEST_NAN_SUB;
1091*84e33947SAndroid Build Coastguard Worker 
1092*84e33947SAndroid Build Coastguard Worker     result = chppClientSendTimestampedRequestOrFail(
1093*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.client,
1094*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.outReqStates[CHPP_WIFI_REQUEST_NAN_SUB], request,
1095*84e33947SAndroid Build Coastguard Worker         requestLen, CHRE_ASYNC_RESULT_TIMEOUT_NS);
1096*84e33947SAndroid Build Coastguard Worker   }
1097*84e33947SAndroid Build Coastguard Worker   return result;
1098*84e33947SAndroid Build Coastguard Worker }
1099*84e33947SAndroid Build Coastguard Worker 
1100*84e33947SAndroid Build Coastguard Worker /**
1101*84e33947SAndroid Build Coastguard Worker  * Request the WiFi chipset to cancel a NAN subscription.
1102*84e33947SAndroid Build Coastguard Worker  * @param subscriptionId Identifier assigned by the NAN engine for a service
1103*84e33947SAndroid Build Coastguard Worker  *        subscription.
1104*84e33947SAndroid Build Coastguard Worker  * @return true if cancelation request was successfully dispatched, false
1105*84e33947SAndroid Build Coastguard Worker  *         otherwise.
1106*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientNanSubscribeCancel(uint32_t subscriptionId)1107*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientNanSubscribeCancel(uint32_t subscriptionId) {
1108*84e33947SAndroid Build Coastguard Worker   bool result = false;
1109*84e33947SAndroid Build Coastguard Worker   struct ChppWifiNanSubscribeCancelRequest *request =
1110*84e33947SAndroid Build Coastguard Worker       chppAllocClientRequestFixed(&gWifiClientContext.client,
1111*84e33947SAndroid Build Coastguard Worker                                   struct ChppWifiNanSubscribeCancelRequest);
1112*84e33947SAndroid Build Coastguard Worker 
1113*84e33947SAndroid Build Coastguard Worker   if (request == NULL) {
1114*84e33947SAndroid Build Coastguard Worker     CHPP_LOG_OOM();
1115*84e33947SAndroid Build Coastguard Worker   } else {
1116*84e33947SAndroid Build Coastguard Worker     request->header.handle = gWifiClientContext.client.handle;
1117*84e33947SAndroid Build Coastguard Worker     request->header.command = CHPP_WIFI_REQUEST_NAN_SUB_CANCEL;
1118*84e33947SAndroid Build Coastguard Worker     request->header.type = CHPP_MESSAGE_TYPE_CLIENT_REQUEST;
1119*84e33947SAndroid Build Coastguard Worker     request->header.transaction = gWifiClientContext.client.transaction++;
1120*84e33947SAndroid Build Coastguard Worker     request->header.error = CHPP_APP_ERROR_NONE;
1121*84e33947SAndroid Build Coastguard Worker     request->subscriptionId = subscriptionId;
1122*84e33947SAndroid Build Coastguard Worker 
1123*84e33947SAndroid Build Coastguard Worker     result = chppClientSendTimestampedRequestAndWait(
1124*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.client,
1125*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.outReqStates[CHPP_WIFI_REQUEST_NAN_SUB_CANCEL],
1126*84e33947SAndroid Build Coastguard Worker         request, sizeof(*request));
1127*84e33947SAndroid Build Coastguard Worker   }
1128*84e33947SAndroid Build Coastguard Worker   return result;
1129*84e33947SAndroid Build Coastguard Worker }
1130*84e33947SAndroid Build Coastguard Worker 
1131*84e33947SAndroid Build Coastguard Worker /**
1132*84e33947SAndroid Build Coastguard Worker  * Release the memory held for the NAN service discovery callback.
1133*84e33947SAndroid Build Coastguard Worker  *
1134*84e33947SAndroid Build Coastguard Worker  * @param event Discovery event to be freed.
1135*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientNanReleaseDiscoveryEvent(struct chreWifiNanDiscoveryEvent * event)1136*84e33947SAndroid Build Coastguard Worker static void chppWifiClientNanReleaseDiscoveryEvent(
1137*84e33947SAndroid Build Coastguard Worker     struct chreWifiNanDiscoveryEvent *event) {
1138*84e33947SAndroid Build Coastguard Worker   if (event != NULL) {
1139*84e33947SAndroid Build Coastguard Worker     if (event->serviceSpecificInfo != NULL) {
1140*84e33947SAndroid Build Coastguard Worker       void *info = CHPP_CONST_CAST_POINTER(event->serviceSpecificInfo);
1141*84e33947SAndroid Build Coastguard Worker       CHPP_FREE_AND_NULLIFY(info);
1142*84e33947SAndroid Build Coastguard Worker     }
1143*84e33947SAndroid Build Coastguard Worker     CHPP_FREE_AND_NULLIFY(event);
1144*84e33947SAndroid Build Coastguard Worker   }
1145*84e33947SAndroid Build Coastguard Worker }
1146*84e33947SAndroid Build Coastguard Worker 
1147*84e33947SAndroid Build Coastguard Worker /**
1148*84e33947SAndroid Build Coastguard Worker  * Request that the WiFi chipset perform NAN ranging.
1149*84e33947SAndroid Build Coastguard Worker  *
1150*84e33947SAndroid Build Coastguard Worker  * @param params WiFi NAN ranging parameters.
1151*84e33947SAndroid Build Coastguard Worker  * @return true if the ranging request was successfully dispatched, false
1152*84e33947SAndroid Build Coastguard Worker  *         otherwise.
1153*84e33947SAndroid Build Coastguard Worker  */
chppWifiClientNanRequestNanRanging(const struct chreWifiNanRangingParams * params)1154*84e33947SAndroid Build Coastguard Worker static bool chppWifiClientNanRequestNanRanging(
1155*84e33947SAndroid Build Coastguard Worker     const struct chreWifiNanRangingParams *params) {
1156*84e33947SAndroid Build Coastguard Worker   struct ChppWifiNanRangingParamsWithHeader *request;
1157*84e33947SAndroid Build Coastguard Worker   size_t requestLen;
1158*84e33947SAndroid Build Coastguard Worker   bool result = chppWifiNanRangingParamsFromChre(params, &request, &requestLen);
1159*84e33947SAndroid Build Coastguard Worker 
1160*84e33947SAndroid Build Coastguard Worker   if (!result) {
1161*84e33947SAndroid Build Coastguard Worker     CHPP_LOG_OOM();
1162*84e33947SAndroid Build Coastguard Worker   } else {
1163*84e33947SAndroid Build Coastguard Worker     request->header.handle = gWifiClientContext.client.handle;
1164*84e33947SAndroid Build Coastguard Worker     request->header.command = CHPP_WIFI_REQUEST_NAN_RANGING_ASYNC;
1165*84e33947SAndroid Build Coastguard Worker     request->header.type = CHPP_MESSAGE_TYPE_CLIENT_REQUEST;
1166*84e33947SAndroid Build Coastguard Worker     request->header.transaction = gWifiClientContext.client.transaction++;
1167*84e33947SAndroid Build Coastguard Worker     request->header.error = CHPP_APP_ERROR_NONE;
1168*84e33947SAndroid Build Coastguard Worker 
1169*84e33947SAndroid Build Coastguard Worker     result = chppClientSendTimestampedRequestOrFail(
1170*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.client,
1171*84e33947SAndroid Build Coastguard Worker         &gWifiClientContext.outReqStates[CHPP_WIFI_REQUEST_NAN_RANGING_ASYNC],
1172*84e33947SAndroid Build Coastguard Worker         request, requestLen, CHRE_ASYNC_RESULT_TIMEOUT_NS);
1173*84e33947SAndroid Build Coastguard Worker   }
1174*84e33947SAndroid Build Coastguard Worker   return result;
1175*84e33947SAndroid Build Coastguard Worker }
1176*84e33947SAndroid Build Coastguard Worker 
chppWifiGetNanCapabilites(struct chreWifiNanCapabilities * capabilities)1177*84e33947SAndroid Build Coastguard Worker static bool chppWifiGetNanCapabilites(
1178*84e33947SAndroid Build Coastguard Worker     struct chreWifiNanCapabilities *capabilities) {
1179*84e33947SAndroid Build Coastguard Worker   // Not implemented yet.
1180*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(capabilities);
1181*84e33947SAndroid Build Coastguard Worker   return false;
1182*84e33947SAndroid Build Coastguard Worker }
1183*84e33947SAndroid Build Coastguard Worker 
1184*84e33947SAndroid Build Coastguard Worker /************************************************
1185*84e33947SAndroid Build Coastguard Worker  *  Public Functions
1186*84e33947SAndroid Build Coastguard Worker  ***********************************************/
1187*84e33947SAndroid Build Coastguard Worker 
chppRegisterWifiClient(struct ChppAppState * appContext)1188*84e33947SAndroid Build Coastguard Worker void chppRegisterWifiClient(struct ChppAppState *appContext) {
1189*84e33947SAndroid Build Coastguard Worker   memset(&gWifiClientContext, 0, sizeof(gWifiClientContext));
1190*84e33947SAndroid Build Coastguard Worker   chppRegisterClient(appContext, (void *)&gWifiClientContext,
1191*84e33947SAndroid Build Coastguard Worker                      &gWifiClientContext.client,
1192*84e33947SAndroid Build Coastguard Worker                      gWifiClientContext.outReqStates, &kWifiClientConfig);
1193*84e33947SAndroid Build Coastguard Worker }
1194*84e33947SAndroid Build Coastguard Worker 
chppDeregisterWifiClient(struct ChppAppState * appContext)1195*84e33947SAndroid Build Coastguard Worker void chppDeregisterWifiClient(struct ChppAppState *appContext) {
1196*84e33947SAndroid Build Coastguard Worker   // TODO
1197*84e33947SAndroid Build Coastguard Worker 
1198*84e33947SAndroid Build Coastguard Worker   UNUSED_VAR(appContext);
1199*84e33947SAndroid Build Coastguard Worker }
1200*84e33947SAndroid Build Coastguard Worker 
getChppWifiClientState(void)1201*84e33947SAndroid Build Coastguard Worker struct ChppEndpointState *getChppWifiClientState(void) {
1202*84e33947SAndroid Build Coastguard Worker   return &gWifiClientContext.client;
1203*84e33947SAndroid Build Coastguard Worker }
1204*84e33947SAndroid Build Coastguard Worker 
1205*84e33947SAndroid Build Coastguard Worker #ifdef CHPP_CLIENT_ENABLED_WIFI
1206*84e33947SAndroid Build Coastguard Worker 
1207*84e33947SAndroid Build Coastguard Worker #ifdef CHPP_CLIENT_ENABLED_CHRE_WIFI
chrePalWifiGetApi(uint32_t requestedApiVersion)1208*84e33947SAndroid Build Coastguard Worker const struct chrePalWifiApi *chrePalWifiGetApi(uint32_t requestedApiVersion) {
1209*84e33947SAndroid Build Coastguard Worker #else
1210*84e33947SAndroid Build Coastguard Worker const struct chrePalWifiApi *chppPalWifiGetApi(uint32_t requestedApiVersion) {
1211*84e33947SAndroid Build Coastguard Worker #endif
1212*84e33947SAndroid Build Coastguard Worker 
1213*84e33947SAndroid Build Coastguard Worker   static const struct chrePalWifiApi api = {
1214*84e33947SAndroid Build Coastguard Worker       .moduleVersion = CHPP_PAL_WIFI_API_VERSION,
1215*84e33947SAndroid Build Coastguard Worker       .open = chppWifiClientOpen,
1216*84e33947SAndroid Build Coastguard Worker       .close = chppWifiClientClose,
1217*84e33947SAndroid Build Coastguard Worker       .getCapabilities = chppWifiClientGetCapabilities,
1218*84e33947SAndroid Build Coastguard Worker       .configureScanMonitor = chppWifiClientConfigureScanMonitor,
1219*84e33947SAndroid Build Coastguard Worker       .requestScan = chppWifiClientRequestScan,
1220*84e33947SAndroid Build Coastguard Worker       .releaseScanEvent = chppWifiClientReleaseScanEvent,
1221*84e33947SAndroid Build Coastguard Worker       .requestRanging = chppWifiClientRequestRanging,
1222*84e33947SAndroid Build Coastguard Worker       .releaseRangingEvent = chppWifiClientReleaseRangingEvent,
1223*84e33947SAndroid Build Coastguard Worker       .nanSubscribe = chppWifiClientNanSubscribe,
1224*84e33947SAndroid Build Coastguard Worker       .nanSubscribeCancel = chppWifiClientNanSubscribeCancel,
1225*84e33947SAndroid Build Coastguard Worker       .releaseNanDiscoveryEvent = chppWifiClientNanReleaseDiscoveryEvent,
1226*84e33947SAndroid Build Coastguard Worker       .requestNanRanging = chppWifiClientNanRequestNanRanging,
1227*84e33947SAndroid Build Coastguard Worker       .getNanCapabilities = chppWifiGetNanCapabilites,
1228*84e33947SAndroid Build Coastguard Worker   };
1229*84e33947SAndroid Build Coastguard Worker 
1230*84e33947SAndroid Build Coastguard Worker   CHPP_STATIC_ASSERT(
1231*84e33947SAndroid Build Coastguard Worker       CHRE_PAL_WIFI_API_CURRENT_VERSION == CHPP_PAL_WIFI_API_VERSION,
1232*84e33947SAndroid Build Coastguard Worker       "A newer CHRE PAL API version is available. Please update.");
1233*84e33947SAndroid Build Coastguard Worker 
1234*84e33947SAndroid Build Coastguard Worker   if (!CHRE_PAL_VERSIONS_ARE_COMPATIBLE(api.moduleVersion,
1235*84e33947SAndroid Build Coastguard Worker                                         requestedApiVersion)) {
1236*84e33947SAndroid Build Coastguard Worker     return NULL;
1237*84e33947SAndroid Build Coastguard Worker   } else {
1238*84e33947SAndroid Build Coastguard Worker     return &api;
1239*84e33947SAndroid Build Coastguard Worker   }
1240*84e33947SAndroid Build Coastguard Worker }
1241*84e33947SAndroid Build Coastguard Worker 
1242*84e33947SAndroid Build Coastguard Worker #endif
1243