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