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