1 /* 2 * Copyright (C) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include "gap.h" 17 18 #include "log.h" 19 #include "securec.h" 20 21 #include "btm.h" 22 #include "btstack.h" 23 24 #include "allocator.h" 25 #include "module.h" 26 27 #include "btm/btm_controller.h" 28 #include "btm/btm_inq_db.h" 29 #include "btm/btm_interop.h" 30 #include "btm/btm_le_sec.h" 31 #include "btm/btm_thread.h" 32 #include "hci/hci.h" 33 #include "hci/hci_error.h" 34 #include "smp/smp.h" 35 #include "smp/smp_def.h" 36 37 #include "gap_internal.h" 38 #include "gap_le.h" 39 #include "gap_task_internal.h" 40 41 static GapMng g_gapMng; 42 43 typedef struct { 44 int traceLevel; 45 } GapInitializeParam; 46 47 static int GapWriteScanEnable(void); 48 static int GapWriteInquiryScanActivity(void); 49 static int GapWriteInquiryScanType(void); 50 static int GapWriteCurrentIACLAP(void); 51 static int GapWritePageScanActivity(void); 52 static int GapWritePageScanType(void); 53 static int GapWriteClassOfDevice(uint32_t cod); 54 55 static void GapFreeRegSecInfo(void *data); 56 static void GapFreeReqSecInfo(void *data); 57 static void GapFreeDeviceInfo(void *data); 58 GapFreeListNode(void * data)59 static void GapFreeListNode(void *data) 60 { 61 MEM_MALLOC.free(data); 62 } 63 GapInitializeTask(void * ctx)64 static void GapInitializeTask(void *ctx) 65 { 66 LOG_DEBUG("%{public}s:", __FUNCTION__); 67 68 (void)memset_s(&g_gapMng, sizeof(GapMng), 0x00, sizeof(GapMng)); 69 g_gapMng.traceLevel = ((GapInitializeParam *)ctx)->traceLevel; 70 #ifdef GAP_BREDR_SUPPORT 71 g_gapMng.bredr.profileSecBlock.registerlist = ListCreate(GapFreeRegSecInfo); 72 g_gapMng.bredr.profileSecBlock.requestlist = ListCreate(GapFreeReqSecInfo); 73 g_gapMng.bredr.connectionInfoBlock.devicelist = ListCreate(GapFreeDeviceInfo); 74 #endif 75 #ifdef GAP_LE_SUPPORT 76 g_gapMng.le.connectionInfoBlock.deviceList = ListCreate(GapFreeLeDeviceInfo); 77 g_gapMng.le.signatureBlock.RequestList = ListCreate(GapFreeLeSignatureRequest); 78 g_gapMng.le.randomAddressBlock.reportRPAResolveList = ListCreate(GapFreeReportRPAResolveInfo); 79 g_gapMng.le.exAdvBlock.exAdvInfoList = ListCreate(GapFreeListNode); 80 #endif 81 } 82 GapInitialize(int traceLevel)83 static void GapInitialize(int traceLevel) 84 { 85 LOG_INFO("%{public}s:", __FUNCTION__); 86 87 BTM_CreateProcessingQueue(PROCESSING_QUEUE_ID_GAP, BTM_PROCESSING_QUEUE_SIZE_DEFAULT); 88 89 GapInitializeParam *ctx = MEM_MALLOC.alloc(sizeof(GapInitializeParam)); 90 if (ctx == NULL) { 91 LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__); 92 return; 93 } 94 95 int ret = GapRunTaskBlockProcess(GapInitializeTask, ctx); 96 if (ret != BT_SUCCESS) { 97 LOG_ERROR("%{public}s: Run task error.", __FUNCTION__); 98 } 99 100 MEM_MALLOC.free(ctx); 101 } 102 GapEnableBredr(void)103 static void GapEnableBredr(void) 104 { 105 if (BTM_IsControllerSupportBrEdr()) { 106 g_gapMng.bredr.isEnable = true; 107 108 g_gapMng.bredr.keyMissingRetry = true; 109 110 HciWriteInquiryModeParam writeInquiryModeParam = { 111 .inquiryMode = HCI_INQUIRY_MODE_STANDARD, 112 }; 113 114 if (BTM_IsControllerSupportEirInquiryResponse()) { 115 writeInquiryModeParam.inquiryMode = HCI_INQUIRY_MODE_EIR; 116 } else if (BTM_IsControllerSupportRssiInquiryResponse()) { 117 writeInquiryModeParam.inquiryMode = HCI_INQUIRY_MODE_RSSI; 118 } 119 120 HCI_WriteInquiryMode(&writeInquiryModeParam); 121 } 122 } 123 GapEnableLe(void)124 static void GapEnableLe(void) 125 { 126 if (BTM_IsControllerSupportLe()) { 127 g_gapMng.le.isEnable = true; 128 g_gapMng.le.local.minEncKeySize = GAP_ENC_KEY_MAX_SIZE; 129 int ret = BTM_GetLocalAddr(&g_gapMng.le.local.addr); 130 if (ret == BT_SUCCESS) { 131 g_gapMng.le.local.addr.type = LOCAL_ADDR_TYPE_PUBLIC; 132 } else { 133 g_gapMng.le.local.addr.type = LOCAL_ADDR_TYPE_RANDOM; 134 } 135 136 if (BTM_IsControllerSupportLeExtendedAdvertising()) { 137 HCI_LeReadMaximumAdvertisingDataLength(); 138 HCI_LeReadNumberofSupportedAdvertisingSets(); 139 } 140 141 GapRegisterL2capCallbacks(); 142 GapRegisterSmCallbacks(); 143 } 144 } 145 GapEnableTask(void * ctx)146 static void GapEnableTask(void *ctx) 147 { 148 LOG_DEBUG("%{public}s:", __FUNCTION__); 149 150 #ifdef GAP_BREDR_SUPPORT 151 GapEnableBredr(); 152 #endif 153 #ifdef GAP_LE_SUPPORT 154 GapEnableLe(); 155 #endif 156 GapRegisterHciEventCallbacks(); 157 GapRegisterBtmAclCallbacks(); 158 } 159 GapEnable(void)160 static void GapEnable(void) 161 { 162 LOG_INFO("%{public}s:", __FUNCTION__); 163 164 int ret = GapRunTaskBlockProcess(GapEnableTask, NULL); 165 if (ret != BT_SUCCESS) { 166 LOG_ERROR("%{public}s: Run task error.", __FUNCTION__); 167 } 168 } 169 GapDisableTask(void * ctx)170 static void GapDisableTask(void *ctx) 171 { 172 LOG_DEBUG("%{public}s:", __FUNCTION__); 173 GapDeregisterHciEventCallbacks(); 174 GapDeregisterBtmAclCallbacks(); 175 if (BTM_IsControllerSupportBrEdr()) { 176 ListClear(g_gapMng.bredr.profileSecBlock.registerlist); 177 ListNode *node = ListGetFirstNode(g_gapMng.bredr.profileSecBlock.requestlist); 178 while (node != NULL) { 179 RequestSecInfo *reqInfo = ListGetNodeData(node); 180 node = ListGetNextNode(node); 181 if (!reqInfo->doCallback) { 182 ListRemoveNode(g_gapMng.bredr.profileSecBlock.requestlist, reqInfo); 183 } 184 } 185 ListClear(g_gapMng.bredr.connectionInfoBlock.devicelist); 186 g_gapMng.bredr.scanModeBlock.status = GAP_SCANMODE_STATUS_IDLE; 187 g_gapMng.bredr.inquiryBlock.status = GAP_INQUIRY_STATUS_IDLE; 188 g_gapMng.bredr.remoteNameBlock.status = GAP_REMOTE_NAME_STATUS_IDLE; 189 g_gapMng.bredr.encryptionBlock.status = GAP_SET_ENCRYPTION_STATUS_IDLE; 190 g_gapMng.bredr.isEnable = false; 191 } 192 193 if (BTM_IsControllerSupportLe()) { 194 GapDeregisterL2capCallbacks(); 195 GapDeregisterSmCallbacks(); 196 ListClear(g_gapMng.le.connectionInfoBlock.deviceList); 197 ListClear(g_gapMng.le.signatureBlock.RequestList); 198 ListClear(g_gapMng.le.randomAddressBlock.reportRPAResolveList); 199 ListClear(g_gapMng.le.exAdvBlock.exAdvInfoList); 200 g_gapMng.le.bondBlock.isPairing = false; 201 g_gapMng.le.randomAddressBlock.generationInfo.processing = false; 202 g_gapMng.le.isEnable = false; 203 } 204 } 205 GapDisable(void * ctx)206 static void GapDisable(void *ctx) 207 { 208 LOG_INFO("%{public}s:", __FUNCTION__); 209 210 int ret = GapRunTaskBlockProcess(GapDisableTask, NULL); 211 if (ret != BT_SUCCESS) { 212 LOG_ERROR("%{public}s: Run task error.", __FUNCTION__); 213 } 214 } 215 GapFinalizeTask(void * ctx)216 static void GapFinalizeTask(void *ctx) 217 { 218 LOG_INFO("%{public}s:", __FUNCTION__); 219 220 #ifdef GAP_BREDR_SUPPORT 221 ListDelete(g_gapMng.bredr.profileSecBlock.registerlist); 222 ListDelete(g_gapMng.bredr.profileSecBlock.requestlist); 223 ListDelete(g_gapMng.bredr.connectionInfoBlock.devicelist); 224 #endif 225 #ifdef GAP_LE_SUPPORT 226 ListDelete(g_gapMng.le.connectionInfoBlock.deviceList); 227 ListDelete(g_gapMng.le.signatureBlock.RequestList); 228 ListDelete(g_gapMng.le.randomAddressBlock.reportRPAResolveList); 229 ListDelete(g_gapMng.le.exAdvBlock.exAdvInfoList); 230 #endif 231 232 (void)memset_s(&g_gapMng, sizeof(GapMng), 0x00, sizeof(GapMng)); 233 234 BTM_DeleteProcessingQueue(PROCESSING_QUEUE_ID_GAP); 235 } 236 GapFinalize(void)237 static void GapFinalize(void) 238 { 239 LOG_INFO("%{public}s:", __FUNCTION__); 240 241 int ret = GapRunTaskBlockProcess(GapFinalizeTask, NULL); 242 if (ret != BT_SUCCESS) { 243 LOG_ERROR("%{public}s: Run task error.", __FUNCTION__); 244 } 245 } 246 GapChangeHCIAddr(BtAddr * addr,const HciBdAddr * hciAddr,uint8_t addrType)247 void GapChangeHCIAddr(BtAddr *addr, const HciBdAddr *hciAddr, uint8_t addrType) 248 { 249 (void)memcpy_s(addr->addr, BT_ADDRESS_SIZE, hciAddr->raw, BT_ADDRESS_SIZE); 250 addr->type = addrType; 251 } 252 GapIsEmptyAddr(const uint8_t * addr)253 bool GapIsEmptyAddr(const uint8_t *addr) 254 { 255 for (int i = 0; i < BT_ADDRESS_SIZE; i++) { 256 if (addr[i] != 0) { 257 return false; 258 } 259 } 260 return true; 261 } 262 GapAddrCompare(const BtAddr * addr1,const BtAddr * addr2)263 bool GapAddrCompare(const BtAddr *addr1, const BtAddr *addr2) 264 { 265 return (!memcmp(addr1->addr, addr2->addr, BT_ADDRESS_SIZE) && 266 !((addr1->type == BT_PUBLIC_DEVICE_ADDRESS || addr1->type == BT_PUBLIC_IDENTITY_ADDRESS) ^ 267 (addr2->type == BT_PUBLIC_DEVICE_ADDRESS || addr2->type == BT_PUBLIC_IDENTITY_ADDRESS))); 268 } 269 GapCompareChannelID(GAP_SecMultiplexingProtocol protocolID,GapSecChannel channelID1,GapSecChannel channelID2)270 bool GapCompareChannelID(GAP_SecMultiplexingProtocol protocolID, GapSecChannel channelID1, GapSecChannel channelID2) 271 { 272 return (protocolID == SEC_PROTOCOL_L2CAP) ? (channelID1.l2capPsm == channelID2.l2capPsm) 273 : (channelID1.rfcommChannel == channelID2.rfcommChannel); 274 } 275 276 #ifdef GAP_BREDR_SUPPORT 277 GapIsBredrEnable(void)278 bool GapIsBredrEnable(void) 279 { 280 return g_gapMng.bredr.isEnable; 281 } 282 GapGetScanModeBlock(void)283 ScanModeBlock *GapGetScanModeBlock(void) 284 { 285 return &g_gapMng.bredr.scanModeBlock; 286 } 287 GapGetInquiryBlock(void)288 InquiryBlock *GapGetInquiryBlock(void) 289 { 290 return &g_gapMng.bredr.inquiryBlock; 291 } 292 GapGetRemoteNameBlock(void)293 RemoteNameBlock *GapGetRemoteNameBlock(void) 294 { 295 return &g_gapMng.bredr.remoteNameBlock; 296 } 297 GapGetSecurityMode(void)298 GAP_SecurityMode *GapGetSecurityMode(void) 299 { 300 return &g_gapMng.bredr.secMode; 301 } 302 GapGetProfileSecurityBlock(void)303 ProfileSecurityBlock *GapGetProfileSecurityBlock(void) 304 { 305 return &g_gapMng.bredr.profileSecBlock; 306 } 307 GapGetConnectionInfoBlock(void)308 ConnectionInfoBlock *GapGetConnectionInfoBlock(void) 309 { 310 return &g_gapMng.bredr.connectionInfoBlock; 311 } 312 GapGetEncryptionBlock(void)313 EncryptionBlock *GapGetEncryptionBlock(void) 314 { 315 return &g_gapMng.bredr.encryptionBlock; 316 } 317 GapIsBondMode(void)318 bool GapIsBondMode(void) 319 { 320 bool isBondMode; 321 isBondMode = (g_gapMng.bredr.bondableMode == GAP_BONDABLE_MODE); 322 return isBondMode; 323 } 324 #endif 325 326 #ifdef GAP_LE_SUPPORT 327 GapIsLeEnable(void)328 bool GapIsLeEnable(void) 329 { 330 return g_gapMng.le.isEnable; 331 } 332 GapLeRolesCheck(uint8_t role)333 bool GapLeRolesCheck(uint8_t role) 334 { 335 return !!(g_gapMng.le.local.role & role); 336 } 337 GapFreeLeDeviceInfo(void * data)338 void GapFreeLeDeviceInfo(void *data) 339 { 340 LeDeviceInfo *deviceInfo = data; 341 342 AlarmCancel(deviceInfo->alarm); 343 AlarmDelete(deviceInfo->alarm); 344 if (deviceInfo->securityReq != NULL) { 345 MEM_MALLOC.free(deviceInfo->securityReq); 346 deviceInfo->securityReq = NULL; 347 } 348 if (deviceInfo->paramUpdateReq != NULL) { 349 MEM_MALLOC.free(deviceInfo->paramUpdateReq); 350 deviceInfo->paramUpdateReq = NULL; 351 } 352 MEM_MALLOC.free(deviceInfo); 353 } 354 GapFreeLeSignatureRequest(void * data)355 void GapFreeLeSignatureRequest(void *data) 356 { 357 MEM_MALLOC.free(data); 358 } 359 GapGetLeBondBlock(void)360 LeBondBlock *GapGetLeBondBlock(void) 361 { 362 return &g_gapMng.le.bondBlock; 363 } 364 GapGetLeConnectionInfoBlock(void)365 LeConnectionInfoBlock *GapGetLeConnectionInfoBlock(void) 366 { 367 return &g_gapMng.le.connectionInfoBlock; 368 } 369 GapGetLeSignatureBlock(void)370 LeSignatureBlock *GapGetLeSignatureBlock(void) 371 { 372 return &g_gapMng.le.signatureBlock; 373 } 374 GapGetLeRandomAddressBlock(void)375 LeRandomAddressBlock *GapGetLeRandomAddressBlock(void) 376 { 377 return &g_gapMng.le.randomAddressBlock; 378 } 379 GapGetLeExAdvBlock(void)380 LeExAdvBlock *GapGetLeExAdvBlock(void) 381 { 382 return &g_gapMng.le.exAdvBlock; 383 } 384 GapIsLeBondableMode(void)385 bool GapIsLeBondableMode(void) 386 { 387 return g_gapMng.le.local.bondableMode == GAP_BONDABLE_MODE; 388 } 389 GapGetLeLocalInfo(void)390 LeLocalInfo *GapGetLeLocalInfo(void) 391 { 392 return &g_gapMng.le.local; 393 } 394 395 #endif 396 397 #ifdef GAP_BREDR_SUPPORT 398 GAP_SetScanMode(const GapDiscoverModeInfo * discoverInfo,const GapConnectableModeInfo * connectableInfo,GapSetScanModeResultCallback callback,void * context)399 int GAP_SetScanMode(const GapDiscoverModeInfo *discoverInfo, const GapConnectableModeInfo *connectableInfo, 400 GapSetScanModeResultCallback callback, void *context) 401 { 402 int ret; 403 ScanModeBlock *scanModeBlock = NULL; 404 405 LOG_INFO("%{public}s:discoverable:[%hhu][%hhu][%04x][%04x], connectable:[%hhu][%hhu][%04x][%04x]", 406 __FUNCTION__, 407 discoverInfo->mode, 408 discoverInfo->type, 409 discoverInfo->scanInterval, 410 discoverInfo->scanWindow, 411 connectableInfo->mode, 412 connectableInfo->type, 413 connectableInfo->scanInterval, 414 connectableInfo->scanWindow); 415 416 if (GapIsBredrEnable() == false) { 417 return GAP_ERR_NOT_ENABLE; 418 } 419 420 if (discoverInfo->mode > GAP_DISCOVERABLE_MODE_GENERAL || discoverInfo->type > GAP_INQUIRY_SCAN_TYPE_INTERLACED || 421 discoverInfo->scanInterval < GAP_SCAN_INTERVAL_RANGE_MIN || 422 discoverInfo->scanInterval > GAP_SCAN_INTERVAL_RANGE_MAX || 423 discoverInfo->scanWindow < GAP_SCAN_WINDOW_RANGE_MIN || discoverInfo->scanWindow > discoverInfo->scanInterval || 424 connectableInfo->mode > GAP_CONNECTABLE_MODE || connectableInfo->type > GAP_PAGE_SCAN_TYPE_INTERLACED || 425 connectableInfo->scanInterval < GAP_SCAN_INTERVAL_RANGE_MIN || 426 connectableInfo->scanInterval > GAP_SCAN_INTERVAL_RANGE_MAX || 427 connectableInfo->scanWindow < GAP_SCAN_WINDOW_RANGE_MIN || 428 connectableInfo->scanWindow > connectableInfo->scanInterval) { 429 return GAP_ERR_INVAL_PARAM; 430 } 431 432 scanModeBlock = GapGetScanModeBlock(); 433 if (scanModeBlock->status != GAP_SCANMODE_STATUS_IDLE) { 434 ret = GAP_ERR_INVAL_STATE; 435 } else { 436 (void)memcpy_s( 437 &scanModeBlock->discoverMode, sizeof(GapDiscoverModeInfo), discoverInfo, sizeof(GapDiscoverModeInfo)); 438 (void)memcpy_s(&scanModeBlock->connectableMode, 439 sizeof(GapConnectableModeInfo), 440 connectableInfo, 441 sizeof(GapConnectableModeInfo)); 442 scanModeBlock->callback = callback; 443 scanModeBlock->context = context; 444 scanModeBlock->status = GAP_SCANMODE_STATUS_CLOSING; 445 446 ret = GapWriteScanEnable(); 447 if (ret != BT_SUCCESS) { 448 LOG_WARN(""); 449 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 450 } 451 } 452 453 return ret; 454 } 455 GapWriteScanEnable(void)456 static int GapWriteScanEnable(void) 457 { 458 LOG_DEBUG("%{public}s:", __FUNCTION__); 459 HciWriteScanEnableParam hciCmdParam; 460 ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 461 uint8_t discoverMode = scanModeBlock->discoverMode.mode; 462 uint8_t connectableMode = scanModeBlock->connectableMode.mode; 463 int ret; 464 465 if (scanModeBlock->status == GAP_SCANMODE_STATUS_CLOSING) { 466 hciCmdParam.scanEnable = 0; 467 ret = HCI_WriteScanEnable(&hciCmdParam); 468 } else if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 469 if (discoverMode != GAP_DISCOVERABLE_MODE_NON && connectableMode != GAP_CONNECTABLE_MODE_NON) { 470 hciCmdParam.scanEnable = INQUIRY_SCAN_ENABLED_PAGE_SCAN_ENABLED; 471 } else if (connectableMode != GAP_DISCOVERABLE_MODE_NON) { 472 hciCmdParam.scanEnable = INQUIRY_SCAN_DISABLED_PAGE_SCAN_ENABLED; 473 } else if (discoverMode != GAP_CONNECTABLE_MODE_NON) { 474 hciCmdParam.scanEnable = INQUIRY_SCAN_ENABLED_PAGE_SCAN_DISABLED; 475 } else { 476 hciCmdParam.scanEnable = NO_SCANS_ENABLED; 477 } 478 ret = HCI_WriteScanEnable(&hciCmdParam); 479 } else { 480 ret = GAP_ERR_INVAL_STATE; 481 } 482 return ret; 483 } 484 GapWriteScanEnableComplete(const HciWriteScanEnableReturnParam * param)485 NO_SANITIZE("cfi") void GapWriteScanEnableComplete(const HciWriteScanEnableReturnParam *param) 486 { 487 LOG_DEBUG("%{public}s:", __FUNCTION__); 488 int ret = GAP_SUCCESS; 489 GapSetScanModeResultCallback callback = NULL; 490 ScanModeBlock *scanModeBlock = NULL; 491 uint8_t retStatus = param->status; 492 493 if (GapIsBredrEnable() == false) { 494 LOG_ERROR("Not Enable."); 495 return; 496 } 497 498 scanModeBlock = GapGetScanModeBlock(); 499 if (scanModeBlock->status == GAP_SCANMODE_STATUS_CLOSING) { 500 if (retStatus == HCI_SUCCESS) { 501 if (scanModeBlock->discoverMode.mode) { 502 scanModeBlock->status = GAP_SCANMODE_STATUS_SETTING; 503 ret = GapWriteInquiryScanActivity(); 504 } else if (scanModeBlock->connectableMode.mode) { 505 scanModeBlock->status = GAP_SCANMODE_STATUS_SETTING; 506 ret = GapWritePageScanActivity(); 507 } else { 508 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 509 callback = scanModeBlock->callback; 510 } 511 if (ret != BT_SUCCESS) { 512 LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 513 retStatus = GAP_STATUS_FAILED; 514 callback = scanModeBlock->callback; 515 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 516 } 517 } else { 518 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 519 callback = scanModeBlock->callback; 520 } 521 } else if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 522 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 523 callback = scanModeBlock->callback; 524 } else { 525 LOG_WARN(""); 526 } 527 528 if (callback != NULL) { 529 callback(retStatus, scanModeBlock->context); 530 } 531 } 532 GapWriteInquiryScanActivity(void)533 static int GapWriteInquiryScanActivity(void) 534 { 535 LOG_DEBUG("%{public}s:", __FUNCTION__); 536 int ret; 537 ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 538 HciWriteInquiryScanActivityParam hciCmdParam; 539 540 if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 541 hciCmdParam.inquiryScanInterval = scanModeBlock->discoverMode.scanInterval; 542 hciCmdParam.inquiryScanWindow = scanModeBlock->discoverMode.scanWindow; 543 ret = HCI_WriteInquiryScanActivity(&hciCmdParam); 544 } else { 545 ret = GAP_ERR_INVAL_STATE; 546 } 547 return ret; 548 } 549 GapWriteInquiryScanActivityComplete(const HciWriteInquiryScanActivityReturnParam * param)550 void GapWriteInquiryScanActivityComplete(const HciWriteInquiryScanActivityReturnParam *param) 551 { 552 LOG_DEBUG("%{public}s:", __FUNCTION__); 553 GapSetScanModeResultCallback callback = NULL; 554 uint8_t retStatus = param->status; 555 556 if (GapIsBredrEnable() == false) { 557 LOG_ERROR("%sNot Enable.", ""); 558 return; 559 } 560 561 ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 562 if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 563 if (retStatus == HCI_SUCCESS) { 564 int ret = GapWriteInquiryScanType(); 565 if (ret != BT_SUCCESS) { 566 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 567 retStatus = GAP_STATUS_FAILED; 568 callback = scanModeBlock->callback; 569 LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 570 } 571 } else { 572 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 573 callback = scanModeBlock->callback; 574 } 575 } 576 577 if (callback != NULL) { 578 callback(retStatus, scanModeBlock->context); 579 } 580 } 581 GapWriteInquiryScanType(void)582 static int GapWriteInquiryScanType(void) 583 { 584 LOG_DEBUG("%{public}s:", __FUNCTION__); 585 int ret; 586 ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 587 HciWriteInquiryScanTypeParam hciCmdParam; 588 589 if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 590 hciCmdParam.scanType = scanModeBlock->discoverMode.type; 591 ret = HCI_WriteInquiryScanType(&hciCmdParam); 592 } else { 593 ret = GAP_ERR_INVAL_STATE; 594 } 595 return ret; 596 } 597 GapWriteInquiryScanTypeComplete(const HciWriteInquiryScanTypeReturnParam * param)598 void GapWriteInquiryScanTypeComplete(const HciWriteInquiryScanTypeReturnParam *param) 599 { 600 LOG_DEBUG("%{public}s:", __FUNCTION__); 601 ScanModeBlock *scanModeBlock = NULL; 602 GapSetScanModeResultCallback callback = NULL; 603 uint8_t retStatus = param->status; 604 605 if (GapIsBredrEnable() == false) { 606 LOG_ERROR("%sNot Enable.", ""); 607 return; 608 } 609 610 scanModeBlock = GapGetScanModeBlock(); 611 if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 612 if (retStatus == HCI_SUCCESS) { 613 int ret = GapWriteCurrentIACLAP(); 614 if (ret != BT_SUCCESS) { 615 LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 616 callback = scanModeBlock->callback; 617 retStatus = GAP_STATUS_FAILED; 618 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 619 } 620 } else { 621 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 622 callback = scanModeBlock->callback; 623 } 624 } 625 626 if (callback != NULL) { 627 callback(retStatus, scanModeBlock->context); 628 } 629 } 630 GapWriteCurrentIACLAP(void)631 static int GapWriteCurrentIACLAP(void) 632 { 633 LOG_DEBUG("%{public}s:", __FUNCTION__); 634 ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 635 uint8_t discoverableMode = scanModeBlock->discoverMode.mode; 636 uint8_t numCurrentIAC = 0; 637 uint32_t iacLAP[CURRENT_IAC_MAX_NUM]; 638 639 if (discoverableMode & GAP_DISCOVERABLE_MODE_GENERAL) { 640 iacLAP[numCurrentIAC] = LAP_GENERAL_INQUIRY_ACCESS; 641 numCurrentIAC++; 642 } else if (discoverableMode & GAP_DISCOVERABLE_MODE_LIMITED) { 643 iacLAP[numCurrentIAC] = LAP_GENERAL_INQUIRY_ACCESS; 644 numCurrentIAC++; 645 iacLAP[numCurrentIAC] = LAP_LIMITED_INQUIRY_ACCESS; 646 numCurrentIAC++; 647 } 648 649 HciWriteCurrentIacLapParam param = { 650 .numCurrentIAC = numCurrentIAC, 651 .iacLAP = iacLAP, 652 }; 653 654 return HCI_WriteCurrentIacLap(¶m); 655 } 656 GapWriteCurrentIACLAPComplete(const HciWriteCurrentIacLapReturnParam * param)657 void GapWriteCurrentIACLAPComplete(const HciWriteCurrentIacLapReturnParam *param) 658 { 659 LOG_DEBUG("%{public}s:", __FUNCTION__); 660 ScanModeBlock *scanModeBlock = NULL; 661 GapSetScanModeResultCallback callback = NULL; 662 uint8_t retStatus = param->status; 663 664 if (GapIsBredrEnable() == false) { 665 LOG_ERROR("%sNot Enable.", ""); 666 return; 667 } 668 669 scanModeBlock = GapGetScanModeBlock(); 670 if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 671 if (retStatus == HCI_SUCCESS) { 672 if (scanModeBlock->discoverMode.mode & GAP_INQUIRY_MODE_LIMITED) { 673 g_gapMng.bredr.classOfDevice |= COD_LIMITED_DISCOVERABLE_BIT; 674 } else { 675 g_gapMng.bredr.classOfDevice &= ~COD_LIMITED_DISCOVERABLE_BIT; 676 } 677 678 int ret = GapWriteClassOfDevice(g_gapMng.bredr.classOfDevice); 679 if (ret != BT_SUCCESS) { 680 LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 681 retStatus = GAP_STATUS_FAILED; 682 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 683 callback = scanModeBlock->callback; 684 } 685 } else { 686 callback = scanModeBlock->callback; 687 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 688 } 689 } 690 691 if (callback != NULL) { 692 callback(retStatus, scanModeBlock->context); 693 } 694 } 695 GapWritePageScanActivity(void)696 static int GapWritePageScanActivity(void) 697 { 698 LOG_DEBUG("%{public}s:", __FUNCTION__); 699 int ret; 700 ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 701 HciWritePageScanActivityParam hciCmdParam; 702 703 hciCmdParam.pageScanInterval = scanModeBlock->connectableMode.scanInterval; 704 hciCmdParam.pageScanWindow = scanModeBlock->connectableMode.scanWindow; 705 ret = HCI_WritePageScanActivity(&hciCmdParam); 706 return ret; 707 } 708 GapWritePageScanActivityComplete(const HciWritePageScanActivityReturnParam * param)709 void GapWritePageScanActivityComplete(const HciWritePageScanActivityReturnParam *param) 710 { 711 LOG_DEBUG("%{public}s:", __FUNCTION__); 712 GapSetScanModeResultCallback callback = NULL; 713 uint8_t retStatus = param->status; 714 715 if (GapIsBredrEnable() == false) { 716 LOG_ERROR("%sNot Enable.", ""); 717 return; 718 } 719 720 ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 721 if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 722 if (retStatus == HCI_SUCCESS) { 723 int ret = GapWritePageScanType(); 724 if (ret != BT_SUCCESS) { 725 LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 726 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 727 callback = scanModeBlock->callback; 728 retStatus = GAP_STATUS_FAILED; 729 } 730 } else { 731 callback = scanModeBlock->callback; 732 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 733 } 734 } 735 736 if (callback != NULL) { 737 callback(retStatus, scanModeBlock->context); 738 } 739 } 740 GapWritePageScanType(void)741 static int GapWritePageScanType(void) 742 { 743 LOG_DEBUG("%{public}s:", __FUNCTION__); 744 int ret; 745 ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 746 HciWritePageScanTypeParam hciCmdParam; 747 748 hciCmdParam.pageScanType = scanModeBlock->connectableMode.type; 749 ret = HCI_WritePageScanType(&hciCmdParam); 750 return ret; 751 } 752 GapWritePageScanTypeComplete(const HciWritePageScanTypeReturnParam * param)753 void GapWritePageScanTypeComplete(const HciWritePageScanTypeReturnParam *param) 754 { 755 LOG_DEBUG("%{public}s:", __FUNCTION__); 756 GapSetScanModeResultCallback callback = NULL; 757 uint8_t retStatus = param->status; 758 759 if (GapIsBredrEnable() == false) { 760 LOG_ERROR("%sNot Enable.", ""); 761 return; 762 } 763 764 ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 765 if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 766 if (retStatus == HCI_SUCCESS) { 767 int ret = GapWriteScanEnable(); 768 if (ret != BT_SUCCESS) { 769 LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 770 callback = scanModeBlock->callback; 771 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 772 retStatus = GAP_STATUS_FAILED; 773 } 774 } else { 775 callback = scanModeBlock->callback; 776 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 777 } 778 } 779 780 if (callback != NULL) { 781 callback(retStatus, scanModeBlock->context); 782 } 783 } 784 GapReadLocalOobExtendedDataComplete(const HciReadLocalOobExtendedDataReturnParam * param)785 void GapReadLocalOobExtendedDataComplete(const HciReadLocalOobExtendedDataReturnParam *param) 786 { 787 if (param->status == HCI_SUCCESS) { 788 (void)memcpy_s(g_gapMng.bredr.oobData256.C, GAP_OOB_DATA_CONFIRM_SIZE, param->c256, GAP_OOB_DATA_CONFIRM_SIZE); 789 (void)memcpy_s(g_gapMng.bredr.oobData256.R, GAP_OOB_DATA_RANDOM_SIZE, param->r256, GAP_OOB_DATA_RANDOM_SIZE); 790 (void)memcpy_s(g_gapMng.bredr.oobData192.C, GAP_OOB_DATA_CONFIRM_SIZE, param->c192, GAP_OOB_DATA_CONFIRM_SIZE); 791 (void)memcpy_s(g_gapMng.bredr.oobData192.R, GAP_OOB_DATA_RANDOM_SIZE, param->r192, GAP_OOB_DATA_RANDOM_SIZE); 792 } else { 793 int ret = HCI_ReadLocalOOBData(); 794 if (ret != BT_SUCCESS) { 795 LOG_WARN("%{public}s: Local OOB data read failed", __FUNCTION__); 796 } 797 } 798 } 799 GapReadLocalOobDataComplete(const HciReadLocalOOBDataReturnParam * param)800 void GapReadLocalOobDataComplete(const HciReadLocalOOBDataReturnParam *param) 801 { 802 if (param->status == HCI_SUCCESS) { 803 (void)memset_s(g_gapMng.bredr.oobData256.C, GAP_OOB_DATA_CONFIRM_SIZE, 0x00, GAP_OOB_DATA_CONFIRM_SIZE); 804 (void)memset_s(g_gapMng.bredr.oobData256.R, GAP_OOB_DATA_RANDOM_SIZE, 0x00, GAP_OOB_DATA_RANDOM_SIZE); 805 (void)memcpy_s(g_gapMng.bredr.oobData192.C, GAP_OOB_DATA_CONFIRM_SIZE, param->C, GAP_OOB_DATA_CONFIRM_SIZE); 806 (void)memcpy_s(g_gapMng.bredr.oobData192.R, GAP_OOB_DATA_RANDOM_SIZE, param->R, GAP_OOB_DATA_RANDOM_SIZE); 807 } else { 808 (void)memset_s(g_gapMng.bredr.oobData256.C, GAP_OOB_DATA_CONFIRM_SIZE, 0x00, GAP_OOB_DATA_CONFIRM_SIZE); 809 (void)memset_s(g_gapMng.bredr.oobData256.R, GAP_OOB_DATA_RANDOM_SIZE, 0x00, GAP_OOB_DATA_RANDOM_SIZE); 810 (void)memset_s(g_gapMng.bredr.oobData192.C, GAP_OOB_DATA_CONFIRM_SIZE, 0x00, GAP_OOB_DATA_CONFIRM_SIZE); 811 (void)memset_s(g_gapMng.bredr.oobData192.R, GAP_OOB_DATA_RANDOM_SIZE, 0x00, GAP_OOB_DATA_RANDOM_SIZE); 812 } 813 } 814 GapReadNewLocalOOBData(void)815 int GapReadNewLocalOOBData(void) 816 { 817 int ret; 818 819 BtmLocalVersionInformation version; 820 BTM_GetLocalVersionInformation(&version); 821 if (version.hciVersion >= BLUETOOTH_CORE_SPECIFICATION_4_1) { 822 ret = HCI_ReadLocalOOBExtendedData(); 823 if (ret != BT_SUCCESS) { 824 LOG_WARN("%{public}s: Local OOB data read failed", __FUNCTION__); 825 } 826 } else { 827 ret = HCI_ReadLocalOOBData(); 828 if (ret != BT_SUCCESS) { 829 LOG_WARN("%{public}s: Local OOB data read failed", __FUNCTION__); 830 } 831 } 832 833 return ret; 834 } 835 GapIsKeyMissingRetry(void)836 bool GapIsKeyMissingRetry(void) 837 { 838 return g_gapMng.bredr.keyMissingRetry; 839 } 840 GAP_SetKeyMissingRetry(bool retry)841 int GAP_SetKeyMissingRetry(bool retry) 842 { 843 g_gapMng.bredr.keyMissingRetry = retry; 844 return GAP_SUCCESS; 845 } 846 GAP_SetBondableMode(uint8_t bondableMode)847 int GAP_SetBondableMode(uint8_t bondableMode) 848 { 849 LOG_INFO("%{public}s:bondable[%hhu]", __FUNCTION__, bondableMode); 850 851 if (GapIsBredrEnable() == false) { 852 return GAP_ERR_NOT_ENABLE; 853 } 854 855 g_gapMng.bredr.bondableMode = bondableMode; 856 if (bondableMode == GAP_BONDABLE_MODE) { 857 GapReadNewLocalOOBData(); 858 } 859 860 return GAP_SUCCESS; 861 } 862 GapFreeRegSecInfo(void * data)863 static void GapFreeRegSecInfo(void *data) 864 { 865 MEM_MALLOC.free(data); 866 } 867 GapFreeReqSecInfo(void * data)868 static void GapFreeReqSecInfo(void *data) 869 { 870 GapAuthenticationClearInfo(data); 871 MEM_MALLOC.free(data); 872 } 873 GapFreeDeviceInfo(void * data)874 static void GapFreeDeviceInfo(void *data) 875 { 876 DeviceInfo *devInfo = data; 877 if (devInfo != NULL) { 878 AlarmCancel(devInfo->alarm); 879 AlarmDelete(devInfo->alarm); 880 AlarmCancel(devInfo->aclAlarm); 881 AlarmDelete(devInfo->aclAlarm); 882 if (devInfo->waitEncryptAlarm != NULL) { 883 AlarmCancel(devInfo->waitEncryptAlarm); 884 AlarmDelete(devInfo->waitEncryptAlarm); 885 } 886 MEM_MALLOC.free(devInfo); 887 } 888 } 889 GAP_RegisterServiceSecurity(const BtAddr * addr,const GapServiceSecurityInfo * serviceInfo,uint16_t securityMode)890 int GAP_RegisterServiceSecurity(const BtAddr *addr, const GapServiceSecurityInfo *serviceInfo, uint16_t securityMode) 891 { 892 int ret = GAP_SUCCESS; 893 ListNode *node = NULL; 894 ProfileSecurityInfo *regInfo = NULL; 895 896 if (GapIsBredrEnable() == false) { 897 return GAP_ERR_NOT_ENABLE; 898 } 899 900 ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock(); 901 node = ListGetFirstNode(profileSecurityBlock->registerlist); 902 while (node != 0) { 903 regInfo = (ProfileSecurityInfo *)ListGetNodeData(node); 904 if ((addr == NULL || GapIsEmptyAddr(addr->addr) || GapAddrCompare(addr, ®Info->addr)) && 905 (regInfo->info.direction == serviceInfo->direction) && 906 (regInfo->info.serviceId == serviceInfo->serviceId) && 907 (regInfo->info.protocolId == serviceInfo->protocolId) && 908 GapCompareChannelID(serviceInfo->protocolId, regInfo->info.channelId, serviceInfo->channelId)) { 909 ret = GAP_ERR_REPEATED; 910 LOG_WARN("Repeated Register Security %{public}d", serviceInfo->serviceId); 911 break; 912 } 913 node = ListGetNextNode(node); 914 } 915 916 if (node == NULL) { 917 regInfo = MEM_MALLOC.alloc(sizeof(ProfileSecurityInfo)); 918 if (regInfo == NULL) { 919 ret = GAP_ERR_OUT_OF_RES; 920 } else { 921 (void)memset_s(regInfo, sizeof(ProfileSecurityInfo), 0x00, sizeof(ProfileSecurityInfo)); 922 if (addr != NULL) { 923 (void)memcpy_s(®Info->addr, BT_ADDRESS_SIZE, addr, BT_ADDRESS_SIZE); 924 } 925 regInfo->info = *serviceInfo; 926 regInfo->securityMode = securityMode; 927 928 ListAddFirst(profileSecurityBlock->registerlist, regInfo); 929 } 930 } 931 932 if (addr != NULL) { 933 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr)); 934 } 935 936 return ret; 937 } GAP_DeregisterServiceSecurity(const BtAddr * addr,const GapServiceSecurityInfo * serviceInfo)938 int GAP_DeregisterServiceSecurity(const BtAddr *addr, const GapServiceSecurityInfo *serviceInfo) 939 { 940 int ret = GAP_SUCCESS; 941 ProfileSecurityBlock *profileSecurityBlock = NULL; 942 ListNode *node = NULL; 943 ProfileSecurityInfo *regInfo = NULL; 944 945 if (GapIsBredrEnable() == false) { 946 return GAP_ERR_NOT_ENABLE; 947 } 948 949 profileSecurityBlock = GapGetProfileSecurityBlock(); 950 node = ListGetFirstNode(profileSecurityBlock->registerlist); 951 while (node != 0) { 952 regInfo = (ProfileSecurityInfo *)ListGetNodeData(node); 953 if ((addr == NULL || GapIsEmptyAddr(addr->addr) || GapAddrCompare(addr, ®Info->addr)) && 954 regInfo->info.direction == serviceInfo->direction && regInfo->info.serviceId == serviceInfo->serviceId && 955 regInfo->info.protocolId == serviceInfo->protocolId && 956 GapCompareChannelID(serviceInfo->protocolId, regInfo->info.channelId, serviceInfo->channelId)) { 957 ListRemoveNode(profileSecurityBlock->registerlist, regInfo); 958 break; 959 } 960 node = ListGetNextNode(node); 961 } 962 963 if (node == NULL) { 964 LOG_WARN("%{public}s:not found", __FUNCTION__); 965 ret = GAP_ERR_INVAL_PARAM; 966 } 967 968 if (addr != NULL) { 969 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr)); 970 } 971 972 return ret; 973 } 974 GapFindConnectionDeviceByAddr(void * nodeData,void * param)975 bool GapFindConnectionDeviceByAddr(void *nodeData, void *param) 976 { 977 DeviceInfo *deviceInfo = nodeData; 978 BtAddr *addr = param; 979 980 if (!memcmp(&deviceInfo->addr, addr, sizeof(BtAddr))) { 981 return true; 982 } 983 984 return false; 985 } 986 GapFindConnectionDeviceByHandle(void * nodeData,void * param)987 bool GapFindConnectionDeviceByHandle(void *nodeData, void *param) 988 { 989 DeviceInfo *deviceInfo = nodeData; 990 uint16_t handle = *(uint16_t *)param; 991 992 if (handle == deviceInfo->handle) { 993 return true; 994 } 995 996 return false; 997 } 998 GapFindCmpListData(void * nodeData,void * param)999 bool GapFindCmpListData(void *nodeData, void *param) 1000 { 1001 return (nodeData == param); 1002 } 1003 GapStopUseAclConnection(void * dev)1004 void GapStopUseAclConnection(void *dev) 1005 { 1006 DeviceInfo *device = ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindCmpListData, dev); 1007 if (device != NULL) { 1008 AlarmCancel(device->aclAlarm); 1009 BTM_AclRelease(device->handle); 1010 } 1011 } 1012 GapUseAclConnectionTimeoutTask(void * ctx)1013 void GapUseAclConnectionTimeoutTask(void *ctx) 1014 { 1015 DeviceInfo *dev = ((GapGeneralPointerInfo *)ctx)->pointer; 1016 1017 GapStopUseAclConnection(dev); 1018 } 1019 GapUseAclConnectionTimeout(void * dev)1020 void GapUseAclConnectionTimeout(void *dev) 1021 { 1022 LOG_INFO("%{public}s: ", __FUNCTION__); 1023 GapGeneralPointerInfo *ctx = MEM_MALLOC.alloc(sizeof(GapGeneralPointerInfo)); 1024 if (ctx == NULL) { 1025 LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__); 1026 return; 1027 } 1028 1029 ctx->pointer = dev; 1030 1031 int ret = GapRunTaskUnBlockProcess(GapUseAclConnectionTimeoutTask, ctx, NULL); 1032 if (ret != BT_SUCCESS) { 1033 LOG_ERROR("%{public}s: Task error:%{public}d.", __FUNCTION__, ret); 1034 } 1035 } 1036 GapStartUseAclConnection(DeviceInfo * device,uint64_t timeMs)1037 void GapStartUseAclConnection(DeviceInfo *device, uint64_t timeMs) 1038 { 1039 if (device != NULL) { 1040 AlarmCancel(device->aclAlarm); 1041 BTM_AclAddRef(device->handle); 1042 AlarmSet(device->aclAlarm, timeMs, GapUseAclConnectionTimeout, device); 1043 } 1044 } 1045 GAP_GetLocalExtendedOOBData(GapOOBData * oobData192,GapOOBData * oobData256)1046 int GAP_GetLocalExtendedOOBData(GapOOBData *oobData192, GapOOBData *oobData256) 1047 { 1048 int ret = GAP_SUCCESS; 1049 1050 (void)memcpy_s(oobData192, sizeof(GapOOBData), &g_gapMng.bredr.oobData192, sizeof(GapOOBData)); 1051 (void)memcpy_s(oobData256, sizeof(GapOOBData), &g_gapMng.bredr.oobData256, sizeof(GapOOBData)); 1052 1053 return ret; 1054 } 1055 GAP_GetLocalAddr(BtAddr * addr)1056 int GAP_GetLocalAddr(BtAddr *addr) 1057 { 1058 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr)); 1059 1060 return BTM_GetLocalAddr(addr); 1061 } 1062 GAP_SetLocalName(const char * name,int length)1063 int GAP_SetLocalName(const char *name, int length) 1064 { 1065 HciWriteLocalNameParam param = {0}; 1066 1067 LOG_INFO("%{public}s: name:%{public}s", __FUNCTION__, name); 1068 1069 if (GapIsBredrEnable() == false) { 1070 return GAP_ERR_NOT_ENABLE; 1071 } 1072 1073 (void)memcpy_s(param.localName, sizeof(param.localName), name, length); 1074 return HCI_WriteLocalName(¶m); 1075 } 1076 GAP_SetClassOfDevice(uint32_t cod)1077 int GAP_SetClassOfDevice(uint32_t cod) 1078 { 1079 LOG_INFO("%{public}s: cmd:%06x", __FUNCTION__, cod); 1080 1081 if (GapIsBredrEnable() == false) { 1082 return GAP_ERR_NOT_ENABLE; 1083 } 1084 1085 g_gapMng.bredr.classOfDevice = cod; 1086 1087 return GapWriteClassOfDevice(cod); 1088 } 1089 GapWriteClassOfDevice(uint32_t cod)1090 static int GapWriteClassOfDevice(uint32_t cod) 1091 { 1092 HciWriteClassofDeviceParam param = { 1093 .classofDevice = COD_UINT_TO_ARRAY(cod), 1094 }; 1095 1096 return HCI_WriteClassofDevice(¶m); 1097 } 1098 GapWriteClassOfDeviceComplete(const HciWriteClassofDeviceReturnParam * param)1099 void GapWriteClassOfDeviceComplete(const HciWriteClassofDeviceReturnParam *param) 1100 { 1101 LOG_DEBUG("%{public}s:", __FUNCTION__); 1102 ScanModeBlock *scanModeBlock = NULL; 1103 GapSetScanModeResultCallback callback = NULL; 1104 uint8_t retStatus = param->status; 1105 1106 if (GapIsBredrEnable() == false) { 1107 LOG_ERROR("%sNot Enable.", ""); 1108 return; 1109 } 1110 1111 scanModeBlock = GapGetScanModeBlock(); 1112 if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 1113 if (retStatus == HCI_SUCCESS) { 1114 int ret; 1115 if (scanModeBlock->connectableMode.mode) { 1116 ret = GapWritePageScanActivity(); 1117 } else { 1118 ret = GapWriteScanEnable(); 1119 } 1120 if (ret != BT_SUCCESS) { 1121 LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 1122 retStatus = GAP_STATUS_FAILED; 1123 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 1124 callback = scanModeBlock->callback; 1125 } 1126 } else { 1127 scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 1128 callback = scanModeBlock->callback; 1129 } 1130 } 1131 1132 if (callback != NULL) { 1133 callback(retStatus, scanModeBlock->context); 1134 } 1135 } 1136 GAP_SetExtendedInquiryResponse(const uint8_t eir[GAP_EIR_SIZE_MAX])1137 int GAP_SetExtendedInquiryResponse(const uint8_t eir[GAP_EIR_SIZE_MAX]) 1138 { 1139 int ret; 1140 HciWriteExtendedInquiryResponseParam hciCmdParam; 1141 1142 LOG_INFO("%{public}s:", __FUNCTION__); 1143 1144 if (GapIsBredrEnable() == false) { 1145 return GAP_ERR_NOT_ENABLE; 1146 } 1147 1148 (void)memcpy_s(hciCmdParam.extendInquiryRes, sizeof(hciCmdParam.extendInquiryRes), eir, GAP_EIR_SIZE_MAX); 1149 hciCmdParam.fecRequired = GAP_EIR_FEC_REQUIRED; 1150 1151 ret = HCI_WriteExtendedInquiryResponse(&hciCmdParam); 1152 1153 return ret; 1154 } 1155 GapSetExtendedInquiryResponseComplete(const HciWriteExtendedInquiryResponseReturnParam * param)1156 void GapSetExtendedInquiryResponseComplete(const HciWriteExtendedInquiryResponseReturnParam *param) 1157 { 1158 if (param->status) { 1159 LOG_WARN("%{public}s:", __FUNCTION__); 1160 } 1161 } 1162 GapAllocDeviceInfo(const BtAddr * addr,const uint16_t handle)1163 static DeviceInfo *GapAllocDeviceInfo(const BtAddr *addr, const uint16_t handle) 1164 { 1165 DeviceInfo *deviceInfo = MEM_MALLOC.alloc(sizeof(DeviceInfo)); 1166 if (deviceInfo == NULL) { 1167 LOG_ERROR("%{public}s:malloc error.", __FUNCTION__); 1168 } else { 1169 (void)memset_s(deviceInfo, sizeof(DeviceInfo), 0x00, sizeof(DeviceInfo)); 1170 deviceInfo->addr = *addr; 1171 deviceInfo->handle = handle; 1172 deviceInfo->status = GAP_DEV_SEC_STATUS_IDLE; 1173 deviceInfo->authenticationStatus = GAP_AUTH_STATUS_IDLE; 1174 deviceInfo->encryptionStatus = GAP_ENC_STATUS_IDLE; 1175 deviceInfo->inDedicatedBonding = false; 1176 deviceInfo->linkkeyType = GAP_LINK_KEY_TYPE_UNKNOWN; 1177 deviceInfo->remoteAuthReq = AUTHENTICATION_UNKNOWN_MITM; 1178 deviceInfo->alarm = AlarmCreate("gapSec", false); 1179 deviceInfo->aclAlarm = AlarmCreate("gapAcl", false); 1180 } 1181 1182 return deviceInfo; 1183 } 1184 GapAclConnectionComplete(const BtmAclConnectCompleteParam * param,void * context)1185 void GapAclConnectionComplete(const BtmAclConnectCompleteParam *param, void *context) 1186 { 1187 ConnectionInfoBlock *connectionInfoBlock = NULL; 1188 ProfileSecurityBlock *profileSecurityBlock = NULL; 1189 DeviceInfo *deviceInfo = NULL; 1190 RequestSecInfo *reqInfo = NULL; 1191 connectionInfoBlock = GapGetConnectionInfoBlock(); 1192 profileSecurityBlock = GapGetProfileSecurityBlock(); 1193 if (param->status == HCI_SUCCESS) { 1194 deviceInfo = GapAllocDeviceInfo(param->addr, param->connectionHandle); 1195 if (deviceInfo == NULL) { 1196 LOG_ERROR("%{public}s:malloc error.", __FUNCTION__); 1197 } else { 1198 ListAddFirst(connectionInfoBlock->devicelist, deviceInfo); 1199 GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_CONNECT_COMP, param->status); 1200 if (*GapGetSecurityMode() != SEC_MODE_2) { 1201 GapIsRemoteDeviceSupportHostSecureSimplePairingAsync(&deviceInfo->addr); 1202 } 1203 GapRequestSecurityProcess(); 1204 } 1205 } else { 1206 ListNode *node = ListGetFirstNode(profileSecurityBlock->requestlist); 1207 while (node != 0) { 1208 reqInfo = ListGetNodeData(node); 1209 node = ListGetNextNode(node); 1210 if (!GapAddrCompare(&reqInfo->addr, param->addr)) { 1211 continue; 1212 } 1213 if (BtmInteropIsMatchedAddr(INTEROP_AUTO_RETRY_PAIRING, param->addr)) { 1214 GapAuthenticationRetry(NULL, reqInfo, param->status); 1215 continue; 1216 } 1217 1218 reqInfo->status = GAP_SEC_REQ_STATUS_FAILED; 1219 reqInfo->hciStatus = param->status; 1220 if (reqInfo->info.serviceId == GAP) { 1221 GapDoAuthenticationCallback(reqInfo); 1222 } 1223 if (!reqInfo->doCallback) { 1224 reqInfo->doCallback = true; 1225 GapDoSecurityCallback(reqInfo); 1226 } 1227 } 1228 } 1229 } 1230 GapAclDisconnectionComplete(uint8_t status,uint16_t connectionHandle,uint8_t reason,void * context)1231 void GapAclDisconnectionComplete(uint8_t status, uint16_t connectionHandle, uint8_t reason, void *context) 1232 { 1233 ConnectionInfoBlock *connectionInfoBlock = NULL; 1234 if (status == HCI_SUCCESS) { 1235 DeviceInfo *info = NULL; 1236 connectionInfoBlock = GapGetConnectionInfoBlock(); 1237 info = ListForEachData( 1238 connectionInfoBlock->devicelist, GapFindConnectionDeviceByHandle, (void *)&connectionHandle); 1239 if (info != NULL) { 1240 GapUpdateSecurityRequest(info, GAP_SEC_EVENT_ACL_DISCONNECT, reason); 1241 GapRequestSecurityProcess(); 1242 1243 ListRemoveNode(connectionInfoBlock->devicelist, info); 1244 } 1245 } 1246 } 1247 1248 #endif 1249 1250 #ifdef GAP_LE_SUPPORT 1251 GapAddrIsResolvablePrivateAddress(const BtAddr * addr)1252 bool GapAddrIsResolvablePrivateAddress(const BtAddr *addr) 1253 { 1254 return (addr->type == BT_RANDOM_DEVICE_ADDRESS) && (addr->addr[5] & 0x40) && !(addr->addr[5] & 0x80); 1255 } 1256 GapAddrIsStaticAddress(const BtAddr * addr)1257 bool GapAddrIsStaticAddress(const BtAddr *addr) 1258 { 1259 return (addr->type == BT_RANDOM_DEVICE_ADDRESS) && (addr->addr[5] & 0x40) && (addr->addr[5] & 0x80); 1260 } 1261 GapAddrIsPublicAddress(const BtAddr * addr)1262 bool GapAddrIsPublicAddress(const BtAddr *addr) 1263 { 1264 return addr->type == BT_PUBLIC_DEVICE_ADDRESS; 1265 } 1266 GapAddrIsIdentityAddress(const BtAddr * addr)1267 bool GapAddrIsIdentityAddress(const BtAddr *addr) 1268 { 1269 return addr->type == BT_PUBLIC_IDENTITY_ADDRESS || addr->type == BT_RANDOM_IDENTITY_ADDRESS; 1270 } 1271 GapFindLeConnectionDeviceByAddr(void * nodeData,void * param)1272 bool GapFindLeConnectionDeviceByAddr(void *nodeData, void *param) 1273 { 1274 LeDeviceInfo *deviceInfo = nodeData; 1275 BtAddr *addr = param; 1276 1277 return GapAddrCompare(&deviceInfo->addr, addr); 1278 } 1279 GapFindLeConnectionDeviceByHandle(void * nodeData,void * param)1280 bool GapFindLeConnectionDeviceByHandle(void *nodeData, void *param) 1281 { 1282 LeDeviceInfo *deviceInfo = nodeData; 1283 uint16_t *handle = (uint16_t *)param; 1284 1285 return deviceInfo->handle == *handle; 1286 } 1287 GAP_LeSetRole(uint8_t role)1288 int GAP_LeSetRole(uint8_t role) 1289 { 1290 LOG_INFO("%{public}s: role[%02x]", __FUNCTION__, role); 1291 1292 if (GapIsLeEnable() == false) { 1293 return GAP_ERR_NOT_ENABLE; 1294 } 1295 1296 g_gapMng.le.local.role = role; 1297 if (GapLeRolesCheck(GAP_LE_ROLE_PREIPHERAL | GAP_LE_ROLE_CENTRAL) == true) { 1298 BtmKey key; 1299 BTM_GetLocalIdentityResolvingKey(&key); 1300 SMP_SetIRK(key.key); 1301 SMP_SetIdentAddr(&g_gapMng.le.local.addr); 1302 } 1303 1304 return GAP_SUCCESS; 1305 } 1306 GAP_LeSetStaticIdentityAddr(uint8_t addr[BT_ADDRESS_SIZE])1307 int GAP_LeSetStaticIdentityAddr(uint8_t addr[BT_ADDRESS_SIZE]) 1308 { 1309 int ret; 1310 LeLocalInfo *localInfo = NULL; 1311 1312 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr)); 1313 1314 if (GapIsLeEnable() == false) { 1315 return GAP_ERR_NOT_ENABLE; 1316 } 1317 1318 localInfo = GapGetLeLocalInfo(); 1319 if (localInfo->addr.type == BT_PUBLIC_DEVICE_ADDRESS) { 1320 LOG_WARN("%{public}s: have public address " BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(localInfo->addr.addr)); 1321 localInfo->addr.type = BT_RANDOM_DEVICE_ADDRESS; 1322 } 1323 (void)memcpy_s(localInfo->addr.addr, BT_ADDRESS_SIZE, addr, BT_ADDRESS_SIZE); 1324 ret = SMP_SetIdentAddr(&localInfo->addr); 1325 1326 return ret; 1327 } 1328 GapGenerateRPAResult(uint8_t status,const uint8_t * addr)1329 NO_SANITIZE("cfi") void GapGenerateRPAResult(uint8_t status, const uint8_t *addr) 1330 { 1331 GenResPriAddrResult callback = NULL; 1332 void *context = NULL; 1333 1334 if (GapGetLeRandomAddressBlock()->generationInfo.processing) { 1335 callback = GapGetLeRandomAddressBlock()->generationInfo.callback; 1336 context = GapGetLeRandomAddressBlock()->generationInfo.context; 1337 1338 GapGetLeRandomAddressBlock()->generationInfo.processing = false; 1339 GapGetLeRandomAddressBlock()->generationInfo.callback = NULL; 1340 GapGetLeRandomAddressBlock()->generationInfo.context = NULL; 1341 } 1342 1343 if (callback != NULL) { 1344 callback(status, addr, context); 1345 } 1346 } 1347 GAP_LeGenResPriAddrAsync(GenResPriAddrResult callback,void * context)1348 int GAP_LeGenResPriAddrAsync(GenResPriAddrResult callback, void *context) 1349 { 1350 LOG_INFO("%{public}s:", __FUNCTION__); 1351 int ret; 1352 1353 BtmKey localIRK = {0}; 1354 1355 ret = BTM_GetLocalIdentityResolvingKey(&localIRK); 1356 if (ret != BT_SUCCESS) { 1357 return ret; 1358 } 1359 1360 ret = SMP_GenerateRPA(localIRK.key); 1361 if (ret != BT_SUCCESS) { 1362 return ret; 1363 } 1364 1365 if (GapGetLeRandomAddressBlock()->generationInfo.processing == false) { 1366 GapGetLeRandomAddressBlock()->generationInfo.callback = callback; 1367 GapGetLeRandomAddressBlock()->generationInfo.context = context; 1368 GapGetLeRandomAddressBlock()->generationInfo.processing = true; 1369 } else { 1370 ret = GAP_ERR_INVAL_STATE; 1371 } 1372 1373 return ret; 1374 } 1375 1376 #endif 1377 1378 Module g_gap = { 1379 .name = MODULE_NAME_GAP, 1380 .init = GapInitialize, 1381 .startup = GapEnable, 1382 .shutdown = GapDisable, 1383 .cleanup = GapFinalize, 1384 .dependencies = {MODULE_NAME_HCI, MODULE_NAME_L2CAP, MODULE_NAME_SMP}, 1385 }; 1386 1387 MODULE_DECL(g_gap) 1388