• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.wifi.hal;
18 
19 import static com.android.server.wifi.aware.WifiAwareStateManager.NAN_BOOTSTRAPPING_ACCEPT;
20 import static com.android.server.wifi.aware.WifiAwareStateManager.NAN_BOOTSTRAPPING_COMEBACK;
21 import static com.android.server.wifi.aware.WifiAwareStateManager.NAN_BOOTSTRAPPING_REJECT;
22 import static com.android.server.wifi.aware.WifiAwareStateManager.NAN_PAIRING_AKM_PASN;
23 import static com.android.server.wifi.aware.WifiAwareStateManager.NAN_PAIRING_AKM_SAE;
24 import static com.android.server.wifi.aware.WifiAwareStateManager.NAN_PAIRING_REQUEST_TYPE_SETUP;
25 import static com.android.server.wifi.aware.WifiAwareStateManager.NAN_PAIRING_REQUEST_TYPE_VERIFICATION;
26 
27 import android.hardware.wifi.IWifiNanIfaceEventCallback;
28 import android.hardware.wifi.NanBootstrappingConfirmInd;
29 import android.hardware.wifi.NanBootstrappingMethod;
30 import android.hardware.wifi.NanBootstrappingRequestInd;
31 import android.hardware.wifi.NanBootstrappingResponseCode;
32 import android.hardware.wifi.NanCapabilities;
33 import android.hardware.wifi.NanCipherSuiteType;
34 import android.hardware.wifi.NanClusterEventInd;
35 import android.hardware.wifi.NanDataPathChannelInfo;
36 import android.hardware.wifi.NanDataPathConfirmInd;
37 import android.hardware.wifi.NanDataPathRequestInd;
38 import android.hardware.wifi.NanDataPathScheduleUpdateInd;
39 import android.hardware.wifi.NanFollowupReceivedInd;
40 import android.hardware.wifi.NanMatchInd;
41 import android.hardware.wifi.NanPairingAkm;
42 import android.hardware.wifi.NanPairingConfig;
43 import android.hardware.wifi.NanPairingConfirmInd;
44 import android.hardware.wifi.NanPairingRequestInd;
45 import android.hardware.wifi.NanPairingRequestType;
46 import android.hardware.wifi.NanStatus;
47 import android.hardware.wifi.NanStatusCode;
48 import android.hardware.wifi.NanSuspensionModeChangeInd;
49 import android.hardware.wifi.NpkSecurityAssociation;
50 import android.net.MacAddress;
51 import android.net.wifi.OuiKeyedData;
52 import android.net.wifi.aware.AwarePairingConfig;
53 import android.net.wifi.aware.Characteristics;
54 import android.net.wifi.aware.WifiAwareChannelInfo;
55 import android.net.wifi.util.HexEncoding;
56 import android.util.Log;
57 
58 import com.android.server.wifi.aware.Capabilities;
59 import com.android.server.wifi.aware.PairingConfigManager.PairingSecurityAssociationInfo;
60 import com.android.server.wifi.hal.WifiNanIface.NanClusterEventType;
61 import com.android.server.wifi.hal.WifiNanIface.NanRangingIndication;
62 import com.android.server.wifi.util.HalAidlUtil;
63 
64 import java.util.ArrayList;
65 import java.util.Arrays;
66 import java.util.List;
67 
68 /**
69  * Callback registered with the Vendor HAL service. On events, converts arguments
70  * to their framework equivalents and calls the registered framework callback.
71  */
72 public class WifiNanIfaceCallbackAidlImpl extends IWifiNanIfaceEventCallback.Stub {
73     private static final String TAG = "WifiNanIfaceCallbackAidlImpl";
74 
75     private boolean mVerboseLoggingEnabled;
76     private final WifiNanIfaceAidlImpl mWifiNanIface;
77 
WifiNanIfaceCallbackAidlImpl(WifiNanIfaceAidlImpl wifiNanIface)78     public WifiNanIfaceCallbackAidlImpl(WifiNanIfaceAidlImpl wifiNanIface) {
79         mWifiNanIface = wifiNanIface;
80     }
81 
82     /**
83      * Enable verbose logging.
84      */
enableVerboseLogging(boolean verbose)85     public void enableVerboseLogging(boolean verbose) {
86         mVerboseLoggingEnabled = verbose;
87     }
88 
89     @Override
notifyCapabilitiesResponse(char id, NanStatus status, NanCapabilities capabilities)90     public void notifyCapabilitiesResponse(char id, NanStatus status,
91             NanCapabilities capabilities) {
92         if (!checkFrameworkCallback()) return;
93         if (mVerboseLoggingEnabled) {
94             Log.v(TAG, "notifyCapabilitiesResponse: id=" + id + ", status="
95                     + statusString(status) + ", capabilities=" + capabilities);
96         }
97 
98         if (status.status == NanStatusCode.SUCCESS) {
99             Capabilities frameworkCapabilities = toFrameworkCapability(capabilities);
100             mWifiNanIface.getFrameworkCallback().notifyCapabilitiesResponse(
101                     (short) id, frameworkCapabilities);
102         } else {
103             Log.e(TAG, "notifyCapabilitiesResponse: error code=" + status.status + " ("
104                     + status.description + ")");
105         }
106     }
107 
108     @Override
notifyEnableResponse(char id, NanStatus status)109     public void notifyEnableResponse(char id, NanStatus status) {
110         if (!checkFrameworkCallback()) return;
111         if (mVerboseLoggingEnabled) {
112             Log.v(TAG, "notifyEnableResponse: id=" + id + ", status=" + statusString(status));
113         }
114 
115         if (status.status == NanStatusCode.ALREADY_ENABLED) {
116             Log.wtf(TAG, "notifyEnableResponse: id=" + id + ", already enabled!?");
117         }
118         mWifiNanIface.getFrameworkCallback().notifyEnableResponse(
119                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
120     }
121 
122     @Override
notifyConfigResponse(char id, NanStatus status)123     public void notifyConfigResponse(char id, NanStatus status) {
124         if (!checkFrameworkCallback()) return;
125         if (mVerboseLoggingEnabled) {
126             Log.v(TAG, "notifyConfigResponse: id=" + id + ", status=" + statusString(status));
127         }
128         mWifiNanIface.getFrameworkCallback().notifyConfigResponse(
129                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
130     }
131 
132     @Override
notifyDisableResponse(char id, NanStatus status)133     public void notifyDisableResponse(char id, NanStatus status) {
134         if (!checkFrameworkCallback()) return;
135         if (mVerboseLoggingEnabled) {
136             Log.v(TAG, "notifyDisableResponse: id=" + id + ", status=" + statusString(status));
137         }
138 
139         if (status.status != NanStatusCode.SUCCESS) {
140             Log.e(TAG, "notifyDisableResponse: failure - code=" + status.status + " ("
141                     + status.description + ")");
142         }
143         mWifiNanIface.getFrameworkCallback().notifyDisableResponse(
144                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
145     }
146 
147     @Override
notifyStartPublishResponse(char id, NanStatus status, byte publishId)148     public void notifyStartPublishResponse(char id, NanStatus status, byte publishId) {
149         if (!checkFrameworkCallback()) return;
150         if (mVerboseLoggingEnabled) {
151             Log.v(TAG, "notifyStartPublishResponse: id=" + id + ", status=" + statusString(status)
152                     + ", publishId=" + publishId);
153         }
154         mWifiNanIface.getFrameworkCallback().notifyStartPublishResponse(
155                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status), publishId);
156     }
157 
158     @Override
notifyStopPublishResponse(char id, NanStatus status)159     public void notifyStopPublishResponse(char id, NanStatus status) {
160         if (!checkFrameworkCallback()) return;
161         if (mVerboseLoggingEnabled) {
162             Log.v(TAG, "notifyStopPublishResponse: id=" + id + ", status=" + statusString(status));
163         }
164 
165         if (status.status == NanStatusCode.SUCCESS) {
166             // NOP
167         } else {
168             Log.e(TAG, "notifyStopPublishResponse: failure - code=" + status.status + " ("
169                     + status.description + ")");
170         }
171     }
172 
173     @Override
notifyStartSubscribeResponse(char id, NanStatus status, byte subscribeId)174     public void notifyStartSubscribeResponse(char id, NanStatus status, byte subscribeId) {
175         if (!checkFrameworkCallback()) return;
176         if (mVerboseLoggingEnabled) {
177             Log.v(TAG, "notifyStartSubscribeResponse: id=" + id + ", status=" + statusString(status)
178                     + ", subscribeId=" + subscribeId);
179         }
180         mWifiNanIface.getFrameworkCallback().notifyStartSubscribeResponse(
181                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status), subscribeId);
182     }
183 
184     @Override
notifyStopSubscribeResponse(char id, NanStatus status)185     public void notifyStopSubscribeResponse(char id, NanStatus status) {
186         if (!checkFrameworkCallback()) return;
187         if (mVerboseLoggingEnabled) {
188             Log.v(TAG, "notifyStopSubscribeResponse: id=" + id + ", status="
189                     + statusString(status));
190         }
191 
192         if (status.status == NanStatusCode.SUCCESS) {
193             // NOP
194         } else {
195             Log.e(TAG, "notifyStopSubscribeResponse: failure - code=" + status.status + " ("
196                     + status.description + ")");
197         }
198     }
199 
200     @Override
notifyTransmitFollowupResponse(char id, NanStatus status)201     public void notifyTransmitFollowupResponse(char id, NanStatus status) {
202         if (!checkFrameworkCallback()) return;
203         if (mVerboseLoggingEnabled) {
204             Log.v(TAG, "notifyTransmitFollowupResponse: id=" + id + ", status="
205                     + statusString(status));
206         }
207         mWifiNanIface.getFrameworkCallback().notifyTransmitFollowupResponse(
208                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
209     }
210 
211     @Override
notifyCreateDataInterfaceResponse(char id, NanStatus status)212     public void notifyCreateDataInterfaceResponse(char id, NanStatus status) {
213         if (!checkFrameworkCallback()) return;
214         if (mVerboseLoggingEnabled) {
215             Log.v(TAG, "notifyCreateDataInterfaceResponse: id=" + id + ", status="
216                     + statusString(status));
217         }
218         mWifiNanIface.getFrameworkCallback().notifyCreateDataInterfaceResponse(
219                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
220     }
221 
222     @Override
notifyDeleteDataInterfaceResponse(char id, NanStatus status)223     public void notifyDeleteDataInterfaceResponse(char id, NanStatus status) {
224         if (!checkFrameworkCallback()) return;
225         if (mVerboseLoggingEnabled) {
226             Log.v(TAG, "notifyDeleteDataInterfaceResponse: id=" + id + ", status="
227                     + statusString(status));
228         }
229         mWifiNanIface.getFrameworkCallback().notifyDeleteDataInterfaceResponse(
230                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
231     }
232 
233     @Override
notifyInitiateDataPathResponse(char id, NanStatus status, int ndpInstanceId)234     public void notifyInitiateDataPathResponse(char id, NanStatus status,
235             int ndpInstanceId) {
236         if (!checkFrameworkCallback()) return;
237         if (mVerboseLoggingEnabled) {
238             Log.v(TAG, "notifyInitiateDataPathResponse: id=" + id + ", status="
239                     + statusString(status) + ", ndpInstanceId=" + ndpInstanceId);
240         }
241         mWifiNanIface.getFrameworkCallback().notifyInitiateDataPathResponse(
242                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status), ndpInstanceId);
243     }
244 
245     @Override
notifyRespondToDataPathIndicationResponse(char id, NanStatus status)246     public void notifyRespondToDataPathIndicationResponse(char id, NanStatus status) {
247         if (!checkFrameworkCallback()) return;
248         if (mVerboseLoggingEnabled) {
249             Log.v(TAG, "notifyRespondToDataPathIndicationResponse: id=" + id
250                     + ", status=" + statusString(status));
251         }
252         mWifiNanIface.getFrameworkCallback().notifyRespondToDataPathIndicationResponse(
253                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
254     }
255 
256     @Override
notifyInitiatePairingResponse(char id, NanStatus status, int pairingInstanceId)257     public void notifyInitiatePairingResponse(char id, NanStatus status,
258             int pairingInstanceId) {
259         if (!checkFrameworkCallback()) return;
260         if (mVerboseLoggingEnabled) {
261             Log.v(TAG, "notifyInitiatePairingResponse: id=" + id
262                     + ", status=" + statusString(status));
263         }
264         mWifiNanIface.getFrameworkCallback().notifyInitiatePairingResponse(
265                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status), pairingInstanceId);
266     }
267 
268     @Override
notifyRespondToPairingIndicationResponse(char id, NanStatus status)269     public void notifyRespondToPairingIndicationResponse(char id, NanStatus status) {
270         if (!checkFrameworkCallback()) return;
271         if (mVerboseLoggingEnabled) {
272             Log.v(TAG, "notifyRespondToPairingIndicationResponse: id=" + id
273                     + ", status=" + statusString(status));
274         }
275         mWifiNanIface.getFrameworkCallback().notifyRespondToPairingIndicationResponse(
276                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
277     }
278 
279     @Override
notifyInitiateBootstrappingResponse(char id, NanStatus status, int bootstrappingInstanceId)280     public void notifyInitiateBootstrappingResponse(char id, NanStatus status,
281             int bootstrappingInstanceId) {
282         if (!checkFrameworkCallback()) return;
283         if (mVerboseLoggingEnabled) {
284             Log.v(TAG, "notifyInitiateBootstrappingResponse: id=" + id
285                     + ", status=" + statusString(status));
286         }
287         mWifiNanIface.getFrameworkCallback().notifyInitiateBootstrappingResponse(
288                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status),
289                 bootstrappingInstanceId);
290     }
291 
292     @Override
notifyRespondToBootstrappingIndicationResponse(char id, NanStatus status)293     public void notifyRespondToBootstrappingIndicationResponse(char id, NanStatus status) {
294         if (!checkFrameworkCallback()) return;
295         if (mVerboseLoggingEnabled) {
296             Log.v(TAG, "notifyRespondToBootstrappingIndicationResponse: id=" + id
297                     + ", status=" + statusString(status));
298         }
299         mWifiNanIface.getFrameworkCallback().notifyRespondToBootstrappingIndicationResponse(
300                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
301     }
302 
303     @Override
notifyTerminatePairingResponse(char id, NanStatus status)304     public void notifyTerminatePairingResponse(char id, NanStatus status) {
305         if (!checkFrameworkCallback()) return;
306         if (mVerboseLoggingEnabled) {
307             Log.v(TAG, "notifyTerminatePairingResponse: id=" + id
308                     + ", status=" + statusString(status));
309         }
310         mWifiNanIface.getFrameworkCallback().notifyTerminatePairingResponse(
311                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
312     }
313 
314     @Override
notifyTerminateDataPathResponse(char id, NanStatus status)315     public void notifyTerminateDataPathResponse(char id, NanStatus status) {
316         if (!checkFrameworkCallback()) return;
317         if (mVerboseLoggingEnabled) {
318             Log.v(TAG, "notifyTerminateDataPathResponse: id=" + id + ", status="
319                     + statusString(status));
320         }
321         mWifiNanIface.getFrameworkCallback().notifyTerminateDataPathResponse(
322                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
323     }
324 
325     @Override
notifySuspendResponse(char id, NanStatus status)326     public void notifySuspendResponse(char id, NanStatus status) {
327         if (!checkFrameworkCallback()) {
328             return;
329         }
330         if (mVerboseLoggingEnabled) {
331             Log.v(TAG, "notifySuspendResponse: id=" + id + ", status="
332                     + statusString(status));
333         }
334         mWifiNanIface.getFrameworkCallback().notifySuspendResponse(
335                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
336     }
337 
338     @Override
notifyResumeResponse(char id, NanStatus status)339     public void notifyResumeResponse(char id, NanStatus status) {
340         if (!checkFrameworkCallback()) {
341             return;
342         }
343         if (mVerboseLoggingEnabled) {
344             Log.v(TAG, "notifyResumeResponse: id=" + id + ", status="
345                     + statusString(status));
346         }
347         mWifiNanIface.getFrameworkCallback().notifyResumeResponse(
348                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
349     }
350 
351     @Override
eventClusterEvent(NanClusterEventInd event)352     public void eventClusterEvent(NanClusterEventInd event) {
353         if (!checkFrameworkCallback()) return;
354         if (mVerboseLoggingEnabled) {
355             Log.v(TAG, "eventClusterEvent: eventType=" + event.eventType + ", addr="
356                     + String.valueOf(HexEncoding.encode(event.addr)));
357         }
358         mWifiNanIface.getFrameworkCallback().eventClusterEvent(
359                 NanClusterEventType.fromAidl(event.eventType), event.addr);
360     }
361 
362     @Override
eventDisabled(NanStatus status)363     public void eventDisabled(NanStatus status) {
364         if (!checkFrameworkCallback()) return;
365         if (mVerboseLoggingEnabled) Log.v(TAG, "eventDisabled: status=" + statusString(status));
366         mWifiNanIface.getFrameworkCallback().eventDisabled(
367                 WifiNanIface.NanStatusCode.fromAidl(status.status));
368     }
369 
370     @Override
eventPublishTerminated(byte sessionId, NanStatus status)371     public void eventPublishTerminated(byte sessionId, NanStatus status) {
372         if (!checkFrameworkCallback()) return;
373         if (mVerboseLoggingEnabled) {
374             Log.v(TAG, "eventPublishTerminated: sessionId=" + sessionId + ", status="
375                     + statusString(status));
376         }
377         mWifiNanIface.getFrameworkCallback().eventPublishTerminated(
378                 sessionId, WifiNanIface.NanStatusCode.fromAidl(status.status));
379     }
380 
381     @Override
eventSubscribeTerminated(byte sessionId, NanStatus status)382     public void eventSubscribeTerminated(byte sessionId, NanStatus status) {
383         if (!checkFrameworkCallback()) return;
384         if (mVerboseLoggingEnabled) {
385             Log.v(TAG, "eventSubscribeTerminated: sessionId=" + sessionId + ", status="
386                     + statusString(status));
387         }
388         mWifiNanIface.getFrameworkCallback().eventSubscribeTerminated(
389                 sessionId, WifiNanIface.NanStatusCode.fromAidl(status.status));
390     }
391 
392     @Override
eventMatch(NanMatchInd event)393     public void eventMatch(NanMatchInd event) {
394         if (!checkFrameworkCallback()) return;
395         byte[] serviceSpecificInfo = event.serviceSpecificInfo;
396         boolean isExtendedServiceSpecificInfo = false;
397         if (serviceSpecificInfo == null || serviceSpecificInfo.length == 0) {
398             serviceSpecificInfo = event.extendedServiceSpecificInfo;
399             isExtendedServiceSpecificInfo = true;
400         }
401         List<OuiKeyedData> vendorData = null;
402         if (WifiHalAidlImpl.isServiceVersionAtLeast(2) && event.vendorData != null) {
403             vendorData = HalAidlUtil.halToFrameworkOuiKeyedDataList(event.vendorData);
404         }
405         if (mVerboseLoggingEnabled) {
406             Log.v(
407                     TAG,
408                     "eventMatch: discoverySessionId="
409                             + event.discoverySessionId
410                             + ", peerId="
411                             + event.peerId
412                             + ", addr="
413                             + String.valueOf(HexEncoding.encode(event.addr))
414                             + ", isExtendedServiceSpecificInfo="
415                             + isExtendedServiceSpecificInfo
416                             + ", serviceSpecificInfo="
417                             + Arrays.toString(serviceSpecificInfo)
418                             + ", ssi.size()="
419                             + (serviceSpecificInfo == null ? 0 : serviceSpecificInfo.length)
420                             + ", matchFilter="
421                             + Arrays.toString(event.matchFilter)
422                             + ", mf.size()="
423                             + (event.matchFilter == null ? 0 : event.matchFilter.length)
424                             + ", rangingIndicationType="
425                             + event.rangingIndicationType
426                             + ", rangingMeasurementInMm="
427                             + event.rangingMeasurementInMm
428                             + ", "
429                             + "scid="
430                             + Arrays.toString(event.scid));
431         }
432         mWifiNanIface
433                 .getFrameworkCallback()
434                 .eventMatch(
435                         event.discoverySessionId,
436                         event.peerId,
437                         event.addr,
438                         serviceSpecificInfo,
439                         event.matchFilter,
440                         NanRangingIndication.fromAidl(event.rangingIndicationType),
441                         event.rangingMeasurementInMm,
442                         event.scid,
443                         toPublicDataPathCipherSuites(event.peerCipherType),
444                         event.peerNira.nonce,
445                         event.peerNira.tag,
446                         createPublicPairingConfig(event.peerPairingConfig),
447                         vendorData);
448     }
449 
createPublicPairingConfig(NanPairingConfig nativePairingConfig)450     private AwarePairingConfig createPublicPairingConfig(NanPairingConfig nativePairingConfig) {
451         return new AwarePairingConfig(nativePairingConfig.enablePairingSetup,
452                 nativePairingConfig.enablePairingCache,
453                 nativePairingConfig.enablePairingVerification,
454                 toBootStrappingMethods(nativePairingConfig.supportedBootstrappingMethods));
455     }
456 
toBootStrappingMethods(int nativeMethods)457     private int toBootStrappingMethods(int nativeMethods) {
458         int publicMethods = 0;
459 
460         if ((nativeMethods & NanBootstrappingMethod.BOOTSTRAPPING_OPPORTUNISTIC_MASK) != 0) {
461             publicMethods |= AwarePairingConfig.PAIRING_BOOTSTRAPPING_OPPORTUNISTIC;
462         }
463         if ((nativeMethods & NanBootstrappingMethod.BOOTSTRAPPING_PIN_CODE_DISPLAY_MASK) != 0) {
464             publicMethods |= AwarePairingConfig.PAIRING_BOOTSTRAPPING_PIN_CODE_DISPLAY;
465         }
466         if ((nativeMethods & NanBootstrappingMethod.BOOTSTRAPPING_PASSPHRASE_DISPLAY_MASK) != 0) {
467             publicMethods |= AwarePairingConfig.PAIRING_BOOTSTRAPPING_PASSPHRASE_DISPLAY;
468         }
469         if ((nativeMethods & NanBootstrappingMethod.BOOTSTRAPPING_QR_DISPLAY_MASK) != 0) {
470             publicMethods |= AwarePairingConfig.PAIRING_BOOTSTRAPPING_QR_DISPLAY;
471         }
472         if ((nativeMethods & NanBootstrappingMethod.BOOTSTRAPPING_NFC_TAG_MASK) != 0) {
473             publicMethods |= AwarePairingConfig.PAIRING_BOOTSTRAPPING_NFC_TAG;
474         }
475         if ((nativeMethods & NanBootstrappingMethod.BOOTSTRAPPING_PIN_CODE_KEYPAD_MASK) != 0) {
476             publicMethods |= AwarePairingConfig.PAIRING_BOOTSTRAPPING_PIN_CODE_KEYPAD;
477         }
478         if ((nativeMethods & NanBootstrappingMethod.BOOTSTRAPPING_PASSPHRASE_KEYPAD_MASK) != 0) {
479             publicMethods |= AwarePairingConfig.PAIRING_BOOTSTRAPPING_PASSPHRASE_KEYPAD;
480         }
481         if ((nativeMethods & NanBootstrappingMethod.BOOTSTRAPPING_QR_SCAN_MASK) != 0) {
482             publicMethods |= AwarePairingConfig.PAIRING_BOOTSTRAPPING_QR_SCAN;
483         }
484         if ((nativeMethods & NanBootstrappingMethod.BOOTSTRAPPING_NFC_READER_MASK) != 0) {
485             publicMethods |= AwarePairingConfig.PAIRING_BOOTSTRAPPING_NFC_READER;
486         }
487 
488         return publicMethods;
489     }
490 
491     @Override
eventMatchExpired(byte discoverySessionId, int peerId)492     public void eventMatchExpired(byte discoverySessionId, int peerId) {
493         if (!checkFrameworkCallback()) return;
494         if (mVerboseLoggingEnabled) {
495             Log.v(TAG, "eventMatchExpired: discoverySessionId=" + discoverySessionId
496                     + ", peerId=" + peerId);
497         }
498         mWifiNanIface.getFrameworkCallback().eventMatchExpired(discoverySessionId, peerId);
499     }
500 
501     @Override
eventFollowupReceived(NanFollowupReceivedInd event)502     public void eventFollowupReceived(NanFollowupReceivedInd event) {
503         if (!checkFrameworkCallback()) return;
504         byte[] serviceSpecificInfo = event.serviceSpecificInfo;
505         boolean isExtendedServiceSpecificInfo = false;
506         if (serviceSpecificInfo == null || serviceSpecificInfo.length == 0) {
507             serviceSpecificInfo = event.extendedServiceSpecificInfo;
508             isExtendedServiceSpecificInfo = true;
509         }
510 
511         if (mVerboseLoggingEnabled) {
512             Log.v(
513                     TAG,
514                     "eventFollowupReceived: discoverySessionId="
515                             + event.discoverySessionId
516                             + ", peerId="
517                             + event.peerId
518                             + ", addr="
519                             + String.valueOf(HexEncoding.encode(event.addr))
520                             + ", isExtendedServiceSpecificInfo="
521                             + isExtendedServiceSpecificInfo
522                             + ", serviceSpecificInfo="
523                             + Arrays.toString(event.serviceSpecificInfo)
524                             + ", ssi.size()="
525                             + (serviceSpecificInfo == null ? 0 : serviceSpecificInfo.length));
526         }
527         mWifiNanIface
528                 .getFrameworkCallback()
529                 .eventFollowupReceived(
530                         event.discoverySessionId, event.peerId, event.addr, serviceSpecificInfo);
531     }
532 
533     @Override
eventTransmitFollowup(char id, NanStatus status)534     public void eventTransmitFollowup(char id, NanStatus status) {
535         if (!checkFrameworkCallback()) return;
536         if (mVerboseLoggingEnabled) {
537             Log.v(TAG, "eventTransmitFollowup: id=" + id + ", status=" + statusString(status));
538         }
539         mWifiNanIface.getFrameworkCallback().eventTransmitFollowup(
540                 (short) id, WifiNanIface.NanStatusCode.fromAidl(status.status));
541     }
542 
543     @Override
eventSuspensionModeChanged(NanSuspensionModeChangeInd event)544     public void eventSuspensionModeChanged(NanSuspensionModeChangeInd event) {
545         if (!checkFrameworkCallback()) return;
546         if (mVerboseLoggingEnabled) {
547             Log.v(TAG, "eventSuspensionModeChanged: isSuspended=" + event.isSuspended);
548         }
549         mWifiNanIface.getFrameworkCallback().eventSuspensionModeChanged(event.isSuspended);
550     }
551 
552     @Override
eventDataPathRequest(NanDataPathRequestInd event)553     public void eventDataPathRequest(NanDataPathRequestInd event) {
554         if (!checkFrameworkCallback()) return;
555         if (mVerboseLoggingEnabled) {
556             Log.v(TAG, "eventDataPathRequest: discoverySessionId=" + event.discoverySessionId
557                     + ", peerDiscMacAddr=" + String.valueOf(
558                     HexEncoding.encode(event.peerDiscMacAddr)) + ", ndpInstanceId="
559                     + event.ndpInstanceId + ", appInfo.size()=" + event.appInfo.length);
560         }
561         mWifiNanIface.getFrameworkCallback().eventDataPathRequest(event.discoverySessionId,
562                 event.peerDiscMacAddr, event.ndpInstanceId, event.appInfo);
563     }
564 
565     @Override
eventDataPathConfirm(NanDataPathConfirmInd event)566     public void eventDataPathConfirm(NanDataPathConfirmInd event) {
567         if (!checkFrameworkCallback()) return;
568         if (mVerboseLoggingEnabled) {
569             Log.v(TAG, "eventDataPathConfirm: ndpInstanceId=" + event.ndpInstanceId
570                     + ", peerNdiMacAddr=" + String.valueOf(
571                     HexEncoding.encode(event.peerNdiMacAddr)) + ", dataPathSetupSuccess="
572                     + event.dataPathSetupSuccess + ", reason=" + event.status.status
573                     + ", appInfo.size()=" + event.appInfo.length
574                     + ", channelInfo" + Arrays.toString(event.channelInfo));
575         }
576         List<WifiAwareChannelInfo> wifiAwareChannelInfos = convertHalChannelInfo(event.channelInfo);
577         mWifiNanIface.getFrameworkCallback().eventDataPathConfirm(
578                 WifiNanIface.NanStatusCode.fromAidl(event.status.status), event.ndpInstanceId,
579                 event.dataPathSetupSuccess, event.peerNdiMacAddr, event.appInfo,
580                 wifiAwareChannelInfos);
581     }
582 
583     @Override
eventDataPathScheduleUpdate(NanDataPathScheduleUpdateInd event)584     public void eventDataPathScheduleUpdate(NanDataPathScheduleUpdateInd event) {
585         if (!checkFrameworkCallback()) return;
586         if (mVerboseLoggingEnabled) {
587             Log.v(TAG, "eventDataPathScheduleUpdate: peerMac="
588                     + MacAddress.fromBytes(event.peerDiscoveryAddress)
589                     + ", ndpIds=" + Arrays.toString(event.ndpInstanceIds)
590                     + ", channelInfo=" + Arrays.toString(event.channelInfo));
591         }
592         List<WifiAwareChannelInfo> wifiAwareChannelInfos = convertHalChannelInfo(event.channelInfo);
593         ArrayList<Integer> ndpInstanceIds = new ArrayList<>();
594         for (int i : event.ndpInstanceIds) {
595             ndpInstanceIds.add(i);
596         }
597         mWifiNanIface.getFrameworkCallback().eventDataPathScheduleUpdate(
598                 event.peerDiscoveryAddress, ndpInstanceIds, wifiAwareChannelInfos);
599     }
600 
601     @Override
eventDataPathTerminated(int ndpInstanceId)602     public void eventDataPathTerminated(int ndpInstanceId) {
603         if (!checkFrameworkCallback()) return;
604         if (mVerboseLoggingEnabled) {
605             Log.v(TAG, "eventDataPathTerminated: ndpInstanceId=" + ndpInstanceId);
606         }
607         mWifiNanIface.getFrameworkCallback().eventDataPathTerminated(ndpInstanceId);
608     }
609 
610     @Override
eventPairingRequest(NanPairingRequestInd event)611     public void eventPairingRequest(NanPairingRequestInd event) {
612         if (!checkFrameworkCallback()) return;
613         if (mVerboseLoggingEnabled) {
614             Log.v(TAG, "eventPairingRequest:");
615         }
616         mWifiNanIface.getFrameworkCallback().eventPairingRequest(event.discoverySessionId,
617                 event.peerId, event.peerDiscMacAddr,
618                 event.pairingInstanceId, pairingRequestTypeFromAidl(event.requestType),
619                 event.enablePairingCache, event.peerNira.nonce, event.peerNira.tag);
620     }
621 
pairingRequestTypeFromAidl(@anPairingRequestType int requestType)622     private static int pairingRequestTypeFromAidl(@NanPairingRequestType int requestType) {
623         if (requestType == NanPairingRequestType.NAN_PAIRING_SETUP) {
624             return NAN_PAIRING_REQUEST_TYPE_SETUP;
625         }
626         return NAN_PAIRING_REQUEST_TYPE_VERIFICATION;
627     }
628 
629     @Override
eventPairingConfirm(NanPairingConfirmInd event)630     public void eventPairingConfirm(NanPairingConfirmInd event) {
631         if (!checkFrameworkCallback()) return;
632         if (mVerboseLoggingEnabled) {
633             Log.v(TAG, "eventPairingConfirm: ndpInstanceId=");
634         }
635         mWifiNanIface.getFrameworkCallback().eventPairingConfirm(event.pairingInstanceId,
636                 event.pairingSuccess, WifiNanIface.NanStatusCode.fromAidl(event.status.status),
637                 pairingRequestTypeFromAidl(event.requestType), event.enablePairingCache,
638                 createPairingSecurityAssociationInfo(event.npksa));
639     }
640 
createPairingSecurityAssociationInfo( NpkSecurityAssociation npksa)641     private static PairingSecurityAssociationInfo createPairingSecurityAssociationInfo(
642             NpkSecurityAssociation npksa) {
643         return new PairingSecurityAssociationInfo(npksa.peerNanIdentityKey,
644                 npksa.localNanIdentityKey, npksa.npk,
645                 createPublicPairingAkm(npksa.akm), toPublicDataPathCipherSuites(npksa.cipherType));
646     }
647 
createPublicPairingAkm(int aidlAkm)648     private static int createPublicPairingAkm(int aidlAkm) {
649         switch (aidlAkm) {
650             case NanPairingAkm.SAE:
651                 return NAN_PAIRING_AKM_SAE;
652             case NanPairingAkm.PASN:
653                 return NAN_PAIRING_AKM_PASN;
654         }
655         Log.e(TAG, "unknown pairing AKM");
656         return aidlAkm;
657     }
658 
659     @Override
eventBootstrappingRequest(NanBootstrappingRequestInd event)660     public void eventBootstrappingRequest(NanBootstrappingRequestInd event) {
661         if (!checkFrameworkCallback()) return;
662         if (mVerboseLoggingEnabled) {
663             Log.v(TAG, "eventBootstrappingRequest:");
664         }
665         mWifiNanIface.getFrameworkCallback().eventBootstrappingRequest(event.discoverySessionId,
666                 event.peerId, event.peerDiscMacAddr,
667                 event.bootstrappingInstanceId, event.requestBootstrappingMethod);
668     }
669 
670     @Override
eventBootstrappingConfirm(NanBootstrappingConfirmInd event)671     public void eventBootstrappingConfirm(NanBootstrappingConfirmInd event) {
672         if (!checkFrameworkCallback()) return;
673         if (mVerboseLoggingEnabled) {
674             Log.v(TAG, "eventBootstrappingConfirm:");
675         }
676         mWifiNanIface.getFrameworkCallback().eventBootstrappingConfirm(
677                 event.bootstrappingInstanceId,
678                 convertAidlBootstrappingResponseCodeToFramework(event.responseCode),
679                 WifiNanIface.NanStatusCode.fromAidl(event.reasonCode.status), event.comeBackDelay,
680                 event.cookie);
681     }
682 
convertAidlBootstrappingResponseCodeToFramework(int aidlCode)683     private int convertAidlBootstrappingResponseCodeToFramework(int aidlCode) {
684         switch (aidlCode) {
685             case NanBootstrappingResponseCode.NAN_BOOTSTRAPPING_REQUEST_ACCEPT:
686                 return NAN_BOOTSTRAPPING_ACCEPT;
687             case NanBootstrappingResponseCode.NAN_BOOTSTRAPPING_REQUEST_REJECT:
688                 return NAN_BOOTSTRAPPING_REJECT;
689             case NanBootstrappingResponseCode.NAN_BOOTSTRAPPING_REQUEST_COMEBACK:
690                 return NAN_BOOTSTRAPPING_COMEBACK;
691         }
692         Log.e(TAG, "unknown bootstrapping response code");
693         return aidlCode;
694     }
695 
696     @Override
getInterfaceHash()697     public String getInterfaceHash() {
698         return IWifiNanIfaceEventCallback.HASH;
699     }
700 
701     @Override
getInterfaceVersion()702     public int getInterfaceVersion() {
703         return IWifiNanIfaceEventCallback.VERSION;
704     }
705 
toFrameworkCapability(NanCapabilities capabilities)706     private Capabilities toFrameworkCapability(NanCapabilities capabilities) {
707         Capabilities frameworkCapabilities = new Capabilities();
708         frameworkCapabilities.maxConcurrentAwareClusters = capabilities.maxConcurrentClusters;
709         frameworkCapabilities.maxPublishes = capabilities.maxPublishes;
710         frameworkCapabilities.maxSubscribes = capabilities.maxSubscribes;
711         frameworkCapabilities.maxServiceNameLen = capabilities.maxServiceNameLen;
712         frameworkCapabilities.maxMatchFilterLen = capabilities.maxMatchFilterLen;
713         frameworkCapabilities.maxTotalMatchFilterLen = capabilities.maxTotalMatchFilterLen;
714         frameworkCapabilities.maxServiceSpecificInfoLen =
715                 capabilities.maxServiceSpecificInfoLen;
716         frameworkCapabilities.maxExtendedServiceSpecificInfoLen =
717                 capabilities.maxExtendedServiceSpecificInfoLen;
718         frameworkCapabilities.maxNdiInterfaces = capabilities.maxNdiInterfaces;
719         frameworkCapabilities.maxNdpSessions = capabilities.maxNdpSessions;
720         frameworkCapabilities.maxAppInfoLen = capabilities.maxAppInfoLen;
721         frameworkCapabilities.maxQueuedTransmitMessages =
722                 capabilities.maxQueuedTransmitFollowupMsgs;
723         frameworkCapabilities.maxSubscribeInterfaceAddresses =
724                 capabilities.maxSubscribeInterfaceAddresses;
725         frameworkCapabilities.supportedDataPathCipherSuites = toPublicDataPathCipherSuites(
726                 capabilities.supportedCipherSuites);
727         frameworkCapabilities.supportedPairingCipherSuites = toPublicPairingCipherSuites(
728                 capabilities.supportedCipherSuites);
729         frameworkCapabilities.isInstantCommunicationModeSupported =
730                 capabilities.instantCommunicationModeSupportFlag;
731         frameworkCapabilities.isNanPairingSupported = capabilities.supportsPairing;
732         frameworkCapabilities.isSetClusterIdSupported = capabilities.supportsSetClusterId;
733         frameworkCapabilities.isSuspensionSupported = capabilities.supportsSuspension;
734         frameworkCapabilities.is6gSupported = capabilities.supports6g;
735         frameworkCapabilities.isHeSupported = capabilities.supportsHe;
736         return frameworkCapabilities;
737     }
738 
toPublicDataPathCipherSuites(int nativeCipherSuites)739     private static int toPublicDataPathCipherSuites(int nativeCipherSuites) {
740         int publicCipherSuites = 0;
741 
742         if ((nativeCipherSuites & NanCipherSuiteType.SHARED_KEY_128_MASK) != 0) {
743             publicCipherSuites |= Characteristics.WIFI_AWARE_CIPHER_SUITE_NCS_SK_128;
744         }
745         if ((nativeCipherSuites & NanCipherSuiteType.SHARED_KEY_256_MASK) != 0) {
746             publicCipherSuites |= Characteristics.WIFI_AWARE_CIPHER_SUITE_NCS_SK_256;
747         }
748         if ((nativeCipherSuites & NanCipherSuiteType.PUBLIC_KEY_2WDH_256_MASK) != 0) {
749             publicCipherSuites |= Characteristics.WIFI_AWARE_CIPHER_SUITE_NCS_PK_128;
750         }
751         if ((nativeCipherSuites & NanCipherSuiteType.PUBLIC_KEY_2WDH_256_MASK) != 0) {
752             publicCipherSuites |= Characteristics.WIFI_AWARE_CIPHER_SUITE_NCS_PK_256;
753         }
754 
755         return publicCipherSuites;
756     }
757 
toPublicPairingCipherSuites(int nativeCipherSuites)758     private static int toPublicPairingCipherSuites(int nativeCipherSuites) {
759         int publicCipherSuites = 0;
760 
761         if ((nativeCipherSuites & NanCipherSuiteType.PUBLIC_KEY_PASN_128_MASK) != 0) {
762             publicCipherSuites |= Characteristics.WIFI_AWARE_CIPHER_SUITE_NCS_PK_PASN_128;
763         }
764         if ((nativeCipherSuites & NanCipherSuiteType.PUBLIC_KEY_PASN_256_MASK) != 0) {
765             publicCipherSuites |= Characteristics.WIFI_AWARE_CIPHER_SUITE_NCS_PK_PASN_256;
766         }
767 
768         return publicCipherSuites;
769     }
770 
statusString(NanStatus status)771     private static String statusString(NanStatus status) {
772         if (status == null) {
773             return "status=null";
774         }
775         StringBuilder sb = new StringBuilder();
776         sb.append(status.status).append(" (").append(status.description).append(")");
777         return sb.toString();
778     }
779 
780 
781     /**
782      * Convert HAL NanDataPathChannelInfo to WifiAwareChannelInfo
783      */
convertHalChannelInfo( NanDataPathChannelInfo[] channelInfos)784     private List<WifiAwareChannelInfo> convertHalChannelInfo(
785             NanDataPathChannelInfo[] channelInfos) {
786         List<WifiAwareChannelInfo> wifiAwareChannelInfos = new ArrayList<>();
787         if (channelInfos == null) {
788             return null;
789         }
790         for (android.hardware.wifi.NanDataPathChannelInfo channelInfo : channelInfos) {
791             wifiAwareChannelInfos.add(new WifiAwareChannelInfo(channelInfo.channelFreq,
792                     HalAidlUtil.getChannelBandwidthFromHal(channelInfo.channelBandwidth),
793                     channelInfo.numSpatialStreams));
794         }
795         return wifiAwareChannelInfos;
796     }
797 
checkFrameworkCallback()798     private boolean checkFrameworkCallback() {
799         if (mWifiNanIface == null) {
800             Log.e(TAG, "mWifiNanIface is null");
801             return false;
802         } else if (mWifiNanIface.getFrameworkCallback() == null) {
803             Log.e(TAG, "Framework callback is null");
804             return false;
805         }
806         return true;
807     }
808 }
809