119e95205Sopenharmony_ci/* 219e95205Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 319e95205Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 419e95205Sopenharmony_ci * you may not use this file except in compliance with the License. 519e95205Sopenharmony_ci * You may obtain a copy of the License at 619e95205Sopenharmony_ci * 719e95205Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 819e95205Sopenharmony_ci * 919e95205Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1019e95205Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1119e95205Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1219e95205Sopenharmony_ci * See the License for the specific language governing permissions and 1319e95205Sopenharmony_ci * limitations under the License. 1419e95205Sopenharmony_ci */ 1519e95205Sopenharmony_ci 1619e95205Sopenharmony_ci#include "gap.h" 1719e95205Sopenharmony_ci 1819e95205Sopenharmony_ci#include "log.h" 1919e95205Sopenharmony_ci#include "securec.h" 2019e95205Sopenharmony_ci 2119e95205Sopenharmony_ci#include "btm.h" 2219e95205Sopenharmony_ci#include "btstack.h" 2319e95205Sopenharmony_ci 2419e95205Sopenharmony_ci#include "allocator.h" 2519e95205Sopenharmony_ci#include "module.h" 2619e95205Sopenharmony_ci 2719e95205Sopenharmony_ci#include "btm/btm_controller.h" 2819e95205Sopenharmony_ci#include "btm/btm_inq_db.h" 2919e95205Sopenharmony_ci#include "btm/btm_interop.h" 3019e95205Sopenharmony_ci#include "btm/btm_le_sec.h" 3119e95205Sopenharmony_ci#include "btm/btm_thread.h" 3219e95205Sopenharmony_ci#include "hci/hci.h" 3319e95205Sopenharmony_ci#include "hci/hci_error.h" 3419e95205Sopenharmony_ci#include "smp/smp.h" 3519e95205Sopenharmony_ci#include "smp/smp_def.h" 3619e95205Sopenharmony_ci 3719e95205Sopenharmony_ci#include "gap_internal.h" 3819e95205Sopenharmony_ci#include "gap_le.h" 3919e95205Sopenharmony_ci#include "gap_task_internal.h" 4019e95205Sopenharmony_ci 4119e95205Sopenharmony_cistatic GapMng g_gapMng; 4219e95205Sopenharmony_ci 4319e95205Sopenharmony_citypedef struct { 4419e95205Sopenharmony_ci int traceLevel; 4519e95205Sopenharmony_ci} GapInitializeParam; 4619e95205Sopenharmony_ci 4719e95205Sopenharmony_cistatic int GapWriteScanEnable(void); 4819e95205Sopenharmony_cistatic int GapWriteInquiryScanActivity(void); 4919e95205Sopenharmony_cistatic int GapWriteInquiryScanType(void); 5019e95205Sopenharmony_cistatic int GapWriteCurrentIACLAP(void); 5119e95205Sopenharmony_cistatic int GapWritePageScanActivity(void); 5219e95205Sopenharmony_cistatic int GapWritePageScanType(void); 5319e95205Sopenharmony_cistatic int GapWriteClassOfDevice(uint32_t cod); 5419e95205Sopenharmony_ci 5519e95205Sopenharmony_cistatic void GapFreeRegSecInfo(void *data); 5619e95205Sopenharmony_cistatic void GapFreeReqSecInfo(void *data); 5719e95205Sopenharmony_cistatic void GapFreeDeviceInfo(void *data); 5819e95205Sopenharmony_ci 5919e95205Sopenharmony_cistatic void GapFreeListNode(void *data) 6019e95205Sopenharmony_ci{ 6119e95205Sopenharmony_ci MEM_MALLOC.free(data); 6219e95205Sopenharmony_ci} 6319e95205Sopenharmony_ci 6419e95205Sopenharmony_cistatic void GapInitializeTask(void *ctx) 6519e95205Sopenharmony_ci{ 6619e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 6719e95205Sopenharmony_ci 6819e95205Sopenharmony_ci (void)memset_s(&g_gapMng, sizeof(GapMng), 0x00, sizeof(GapMng)); 6919e95205Sopenharmony_ci g_gapMng.traceLevel = ((GapInitializeParam *)ctx)->traceLevel; 7019e95205Sopenharmony_ci#ifdef GAP_BREDR_SUPPORT 7119e95205Sopenharmony_ci g_gapMng.bredr.profileSecBlock.registerlist = ListCreate(GapFreeRegSecInfo); 7219e95205Sopenharmony_ci g_gapMng.bredr.profileSecBlock.requestlist = ListCreate(GapFreeReqSecInfo); 7319e95205Sopenharmony_ci g_gapMng.bredr.connectionInfoBlock.devicelist = ListCreate(GapFreeDeviceInfo); 7419e95205Sopenharmony_ci#endif 7519e95205Sopenharmony_ci#ifdef GAP_LE_SUPPORT 7619e95205Sopenharmony_ci g_gapMng.le.connectionInfoBlock.deviceList = ListCreate(GapFreeLeDeviceInfo); 7719e95205Sopenharmony_ci g_gapMng.le.signatureBlock.RequestList = ListCreate(GapFreeLeSignatureRequest); 7819e95205Sopenharmony_ci g_gapMng.le.randomAddressBlock.reportRPAResolveList = ListCreate(GapFreeReportRPAResolveInfo); 7919e95205Sopenharmony_ci g_gapMng.le.exAdvBlock.exAdvInfoList = ListCreate(GapFreeListNode); 8019e95205Sopenharmony_ci#endif 8119e95205Sopenharmony_ci} 8219e95205Sopenharmony_ci 8319e95205Sopenharmony_cistatic void GapInitialize(int traceLevel) 8419e95205Sopenharmony_ci{ 8519e95205Sopenharmony_ci LOG_INFO("%{public}s:", __FUNCTION__); 8619e95205Sopenharmony_ci 8719e95205Sopenharmony_ci BTM_CreateProcessingQueue(PROCESSING_QUEUE_ID_GAP, BTM_PROCESSING_QUEUE_SIZE_DEFAULT); 8819e95205Sopenharmony_ci 8919e95205Sopenharmony_ci GapInitializeParam *ctx = MEM_MALLOC.alloc(sizeof(GapInitializeParam)); 9019e95205Sopenharmony_ci if (ctx == NULL) { 9119e95205Sopenharmony_ci LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__); 9219e95205Sopenharmony_ci return; 9319e95205Sopenharmony_ci } 9419e95205Sopenharmony_ci 9519e95205Sopenharmony_ci int ret = GapRunTaskBlockProcess(GapInitializeTask, ctx); 9619e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 9719e95205Sopenharmony_ci LOG_ERROR("%{public}s: Run task error.", __FUNCTION__); 9819e95205Sopenharmony_ci } 9919e95205Sopenharmony_ci 10019e95205Sopenharmony_ci MEM_MALLOC.free(ctx); 10119e95205Sopenharmony_ci} 10219e95205Sopenharmony_ci 10319e95205Sopenharmony_cistatic void GapEnableBredr(void) 10419e95205Sopenharmony_ci{ 10519e95205Sopenharmony_ci if (BTM_IsControllerSupportBrEdr()) { 10619e95205Sopenharmony_ci g_gapMng.bredr.isEnable = true; 10719e95205Sopenharmony_ci 10819e95205Sopenharmony_ci g_gapMng.bredr.keyMissingRetry = true; 10919e95205Sopenharmony_ci 11019e95205Sopenharmony_ci HciWriteInquiryModeParam writeInquiryModeParam = { 11119e95205Sopenharmony_ci .inquiryMode = HCI_INQUIRY_MODE_STANDARD, 11219e95205Sopenharmony_ci }; 11319e95205Sopenharmony_ci 11419e95205Sopenharmony_ci if (BTM_IsControllerSupportEirInquiryResponse()) { 11519e95205Sopenharmony_ci writeInquiryModeParam.inquiryMode = HCI_INQUIRY_MODE_EIR; 11619e95205Sopenharmony_ci } else if (BTM_IsControllerSupportRssiInquiryResponse()) { 11719e95205Sopenharmony_ci writeInquiryModeParam.inquiryMode = HCI_INQUIRY_MODE_RSSI; 11819e95205Sopenharmony_ci } 11919e95205Sopenharmony_ci 12019e95205Sopenharmony_ci HCI_WriteInquiryMode(&writeInquiryModeParam); 12119e95205Sopenharmony_ci } 12219e95205Sopenharmony_ci} 12319e95205Sopenharmony_ci 12419e95205Sopenharmony_cistatic void GapEnableLe(void) 12519e95205Sopenharmony_ci{ 12619e95205Sopenharmony_ci if (BTM_IsControllerSupportLe()) { 12719e95205Sopenharmony_ci g_gapMng.le.isEnable = true; 12819e95205Sopenharmony_ci g_gapMng.le.local.minEncKeySize = GAP_ENC_KEY_MAX_SIZE; 12919e95205Sopenharmony_ci int ret = BTM_GetLocalAddr(&g_gapMng.le.local.addr); 13019e95205Sopenharmony_ci if (ret == BT_SUCCESS) { 13119e95205Sopenharmony_ci g_gapMng.le.local.addr.type = LOCAL_ADDR_TYPE_PUBLIC; 13219e95205Sopenharmony_ci } else { 13319e95205Sopenharmony_ci g_gapMng.le.local.addr.type = LOCAL_ADDR_TYPE_RANDOM; 13419e95205Sopenharmony_ci } 13519e95205Sopenharmony_ci 13619e95205Sopenharmony_ci if (BTM_IsControllerSupportLeExtendedAdvertising()) { 13719e95205Sopenharmony_ci HCI_LeReadMaximumAdvertisingDataLength(); 13819e95205Sopenharmony_ci HCI_LeReadNumberofSupportedAdvertisingSets(); 13919e95205Sopenharmony_ci } 14019e95205Sopenharmony_ci 14119e95205Sopenharmony_ci GapRegisterL2capCallbacks(); 14219e95205Sopenharmony_ci GapRegisterSmCallbacks(); 14319e95205Sopenharmony_ci } 14419e95205Sopenharmony_ci} 14519e95205Sopenharmony_ci 14619e95205Sopenharmony_cistatic void GapEnableTask(void *ctx) 14719e95205Sopenharmony_ci{ 14819e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 14919e95205Sopenharmony_ci 15019e95205Sopenharmony_ci#ifdef GAP_BREDR_SUPPORT 15119e95205Sopenharmony_ci GapEnableBredr(); 15219e95205Sopenharmony_ci#endif 15319e95205Sopenharmony_ci#ifdef GAP_LE_SUPPORT 15419e95205Sopenharmony_ci GapEnableLe(); 15519e95205Sopenharmony_ci#endif 15619e95205Sopenharmony_ci GapRegisterHciEventCallbacks(); 15719e95205Sopenharmony_ci GapRegisterBtmAclCallbacks(); 15819e95205Sopenharmony_ci} 15919e95205Sopenharmony_ci 16019e95205Sopenharmony_cistatic void GapEnable(void) 16119e95205Sopenharmony_ci{ 16219e95205Sopenharmony_ci LOG_INFO("%{public}s:", __FUNCTION__); 16319e95205Sopenharmony_ci 16419e95205Sopenharmony_ci int ret = GapRunTaskBlockProcess(GapEnableTask, NULL); 16519e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 16619e95205Sopenharmony_ci LOG_ERROR("%{public}s: Run task error.", __FUNCTION__); 16719e95205Sopenharmony_ci } 16819e95205Sopenharmony_ci} 16919e95205Sopenharmony_ci 17019e95205Sopenharmony_cistatic void GapDisableTask(void *ctx) 17119e95205Sopenharmony_ci{ 17219e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 17319e95205Sopenharmony_ci GapDeregisterHciEventCallbacks(); 17419e95205Sopenharmony_ci GapDeregisterBtmAclCallbacks(); 17519e95205Sopenharmony_ci if (BTM_IsControllerSupportBrEdr()) { 17619e95205Sopenharmony_ci ListClear(g_gapMng.bredr.profileSecBlock.registerlist); 17719e95205Sopenharmony_ci ListNode *node = ListGetFirstNode(g_gapMng.bredr.profileSecBlock.requestlist); 17819e95205Sopenharmony_ci while (node != NULL) { 17919e95205Sopenharmony_ci RequestSecInfo *reqInfo = ListGetNodeData(node); 18019e95205Sopenharmony_ci node = ListGetNextNode(node); 18119e95205Sopenharmony_ci if (!reqInfo->doCallback) { 18219e95205Sopenharmony_ci ListRemoveNode(g_gapMng.bredr.profileSecBlock.requestlist, reqInfo); 18319e95205Sopenharmony_ci } 18419e95205Sopenharmony_ci } 18519e95205Sopenharmony_ci ListClear(g_gapMng.bredr.connectionInfoBlock.devicelist); 18619e95205Sopenharmony_ci g_gapMng.bredr.scanModeBlock.status = GAP_SCANMODE_STATUS_IDLE; 18719e95205Sopenharmony_ci g_gapMng.bredr.inquiryBlock.status = GAP_INQUIRY_STATUS_IDLE; 18819e95205Sopenharmony_ci g_gapMng.bredr.remoteNameBlock.status = GAP_REMOTE_NAME_STATUS_IDLE; 18919e95205Sopenharmony_ci g_gapMng.bredr.encryptionBlock.status = GAP_SET_ENCRYPTION_STATUS_IDLE; 19019e95205Sopenharmony_ci g_gapMng.bredr.isEnable = false; 19119e95205Sopenharmony_ci } 19219e95205Sopenharmony_ci 19319e95205Sopenharmony_ci if (BTM_IsControllerSupportLe()) { 19419e95205Sopenharmony_ci GapDeregisterL2capCallbacks(); 19519e95205Sopenharmony_ci GapDeregisterSmCallbacks(); 19619e95205Sopenharmony_ci ListClear(g_gapMng.le.connectionInfoBlock.deviceList); 19719e95205Sopenharmony_ci ListClear(g_gapMng.le.signatureBlock.RequestList); 19819e95205Sopenharmony_ci ListClear(g_gapMng.le.randomAddressBlock.reportRPAResolveList); 19919e95205Sopenharmony_ci ListClear(g_gapMng.le.exAdvBlock.exAdvInfoList); 20019e95205Sopenharmony_ci g_gapMng.le.bondBlock.isPairing = false; 20119e95205Sopenharmony_ci g_gapMng.le.randomAddressBlock.generationInfo.processing = false; 20219e95205Sopenharmony_ci g_gapMng.le.isEnable = false; 20319e95205Sopenharmony_ci } 20419e95205Sopenharmony_ci} 20519e95205Sopenharmony_ci 20619e95205Sopenharmony_cistatic void GapDisable(void *ctx) 20719e95205Sopenharmony_ci{ 20819e95205Sopenharmony_ci LOG_INFO("%{public}s:", __FUNCTION__); 20919e95205Sopenharmony_ci 21019e95205Sopenharmony_ci int ret = GapRunTaskBlockProcess(GapDisableTask, NULL); 21119e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 21219e95205Sopenharmony_ci LOG_ERROR("%{public}s: Run task error.", __FUNCTION__); 21319e95205Sopenharmony_ci } 21419e95205Sopenharmony_ci} 21519e95205Sopenharmony_ci 21619e95205Sopenharmony_cistatic void GapFinalizeTask(void *ctx) 21719e95205Sopenharmony_ci{ 21819e95205Sopenharmony_ci LOG_INFO("%{public}s:", __FUNCTION__); 21919e95205Sopenharmony_ci 22019e95205Sopenharmony_ci#ifdef GAP_BREDR_SUPPORT 22119e95205Sopenharmony_ci ListDelete(g_gapMng.bredr.profileSecBlock.registerlist); 22219e95205Sopenharmony_ci ListDelete(g_gapMng.bredr.profileSecBlock.requestlist); 22319e95205Sopenharmony_ci ListDelete(g_gapMng.bredr.connectionInfoBlock.devicelist); 22419e95205Sopenharmony_ci#endif 22519e95205Sopenharmony_ci#ifdef GAP_LE_SUPPORT 22619e95205Sopenharmony_ci ListDelete(g_gapMng.le.connectionInfoBlock.deviceList); 22719e95205Sopenharmony_ci ListDelete(g_gapMng.le.signatureBlock.RequestList); 22819e95205Sopenharmony_ci ListDelete(g_gapMng.le.randomAddressBlock.reportRPAResolveList); 22919e95205Sopenharmony_ci ListDelete(g_gapMng.le.exAdvBlock.exAdvInfoList); 23019e95205Sopenharmony_ci#endif 23119e95205Sopenharmony_ci 23219e95205Sopenharmony_ci (void)memset_s(&g_gapMng, sizeof(GapMng), 0x00, sizeof(GapMng)); 23319e95205Sopenharmony_ci 23419e95205Sopenharmony_ci BTM_DeleteProcessingQueue(PROCESSING_QUEUE_ID_GAP); 23519e95205Sopenharmony_ci} 23619e95205Sopenharmony_ci 23719e95205Sopenharmony_cistatic void GapFinalize(void) 23819e95205Sopenharmony_ci{ 23919e95205Sopenharmony_ci LOG_INFO("%{public}s:", __FUNCTION__); 24019e95205Sopenharmony_ci 24119e95205Sopenharmony_ci int ret = GapRunTaskBlockProcess(GapFinalizeTask, NULL); 24219e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 24319e95205Sopenharmony_ci LOG_ERROR("%{public}s: Run task error.", __FUNCTION__); 24419e95205Sopenharmony_ci } 24519e95205Sopenharmony_ci} 24619e95205Sopenharmony_ci 24719e95205Sopenharmony_civoid GapChangeHCIAddr(BtAddr *addr, const HciBdAddr *hciAddr, uint8_t addrType) 24819e95205Sopenharmony_ci{ 24919e95205Sopenharmony_ci (void)memcpy_s(addr->addr, BT_ADDRESS_SIZE, hciAddr->raw, BT_ADDRESS_SIZE); 25019e95205Sopenharmony_ci addr->type = addrType; 25119e95205Sopenharmony_ci} 25219e95205Sopenharmony_ci 25319e95205Sopenharmony_cibool GapIsEmptyAddr(const uint8_t *addr) 25419e95205Sopenharmony_ci{ 25519e95205Sopenharmony_ci for (int i = 0; i < BT_ADDRESS_SIZE; i++) { 25619e95205Sopenharmony_ci if (addr[i] != 0) { 25719e95205Sopenharmony_ci return false; 25819e95205Sopenharmony_ci } 25919e95205Sopenharmony_ci } 26019e95205Sopenharmony_ci return true; 26119e95205Sopenharmony_ci} 26219e95205Sopenharmony_ci 26319e95205Sopenharmony_cibool GapAddrCompare(const BtAddr *addr1, const BtAddr *addr2) 26419e95205Sopenharmony_ci{ 26519e95205Sopenharmony_ci return (!memcmp(addr1->addr, addr2->addr, BT_ADDRESS_SIZE) && 26619e95205Sopenharmony_ci !((addr1->type == BT_PUBLIC_DEVICE_ADDRESS || addr1->type == BT_PUBLIC_IDENTITY_ADDRESS) ^ 26719e95205Sopenharmony_ci (addr2->type == BT_PUBLIC_DEVICE_ADDRESS || addr2->type == BT_PUBLIC_IDENTITY_ADDRESS))); 26819e95205Sopenharmony_ci} 26919e95205Sopenharmony_ci 27019e95205Sopenharmony_cibool GapCompareChannelID(GAP_SecMultiplexingProtocol protocolID, GapSecChannel channelID1, GapSecChannel channelID2) 27119e95205Sopenharmony_ci{ 27219e95205Sopenharmony_ci return (protocolID == SEC_PROTOCOL_L2CAP) ? (channelID1.l2capPsm == channelID2.l2capPsm) 27319e95205Sopenharmony_ci : (channelID1.rfcommChannel == channelID2.rfcommChannel); 27419e95205Sopenharmony_ci} 27519e95205Sopenharmony_ci 27619e95205Sopenharmony_ci#ifdef GAP_BREDR_SUPPORT 27719e95205Sopenharmony_ci 27819e95205Sopenharmony_cibool GapIsBredrEnable(void) 27919e95205Sopenharmony_ci{ 28019e95205Sopenharmony_ci return g_gapMng.bredr.isEnable; 28119e95205Sopenharmony_ci} 28219e95205Sopenharmony_ci 28319e95205Sopenharmony_ciScanModeBlock *GapGetScanModeBlock(void) 28419e95205Sopenharmony_ci{ 28519e95205Sopenharmony_ci return &g_gapMng.bredr.scanModeBlock; 28619e95205Sopenharmony_ci} 28719e95205Sopenharmony_ci 28819e95205Sopenharmony_ciInquiryBlock *GapGetInquiryBlock(void) 28919e95205Sopenharmony_ci{ 29019e95205Sopenharmony_ci return &g_gapMng.bredr.inquiryBlock; 29119e95205Sopenharmony_ci} 29219e95205Sopenharmony_ci 29319e95205Sopenharmony_ciRemoteNameBlock *GapGetRemoteNameBlock(void) 29419e95205Sopenharmony_ci{ 29519e95205Sopenharmony_ci return &g_gapMng.bredr.remoteNameBlock; 29619e95205Sopenharmony_ci} 29719e95205Sopenharmony_ci 29819e95205Sopenharmony_ciGAP_SecurityMode *GapGetSecurityMode(void) 29919e95205Sopenharmony_ci{ 30019e95205Sopenharmony_ci return &g_gapMng.bredr.secMode; 30119e95205Sopenharmony_ci} 30219e95205Sopenharmony_ci 30319e95205Sopenharmony_ciProfileSecurityBlock *GapGetProfileSecurityBlock(void) 30419e95205Sopenharmony_ci{ 30519e95205Sopenharmony_ci return &g_gapMng.bredr.profileSecBlock; 30619e95205Sopenharmony_ci} 30719e95205Sopenharmony_ci 30819e95205Sopenharmony_ciConnectionInfoBlock *GapGetConnectionInfoBlock(void) 30919e95205Sopenharmony_ci{ 31019e95205Sopenharmony_ci return &g_gapMng.bredr.connectionInfoBlock; 31119e95205Sopenharmony_ci} 31219e95205Sopenharmony_ci 31319e95205Sopenharmony_ciEncryptionBlock *GapGetEncryptionBlock(void) 31419e95205Sopenharmony_ci{ 31519e95205Sopenharmony_ci return &g_gapMng.bredr.encryptionBlock; 31619e95205Sopenharmony_ci} 31719e95205Sopenharmony_ci 31819e95205Sopenharmony_cibool GapIsBondMode(void) 31919e95205Sopenharmony_ci{ 32019e95205Sopenharmony_ci bool isBondMode; 32119e95205Sopenharmony_ci isBondMode = (g_gapMng.bredr.bondableMode == GAP_BONDABLE_MODE); 32219e95205Sopenharmony_ci return isBondMode; 32319e95205Sopenharmony_ci} 32419e95205Sopenharmony_ci#endif 32519e95205Sopenharmony_ci 32619e95205Sopenharmony_ci#ifdef GAP_LE_SUPPORT 32719e95205Sopenharmony_ci 32819e95205Sopenharmony_cibool GapIsLeEnable(void) 32919e95205Sopenharmony_ci{ 33019e95205Sopenharmony_ci return g_gapMng.le.isEnable; 33119e95205Sopenharmony_ci} 33219e95205Sopenharmony_ci 33319e95205Sopenharmony_cibool GapLeRolesCheck(uint8_t role) 33419e95205Sopenharmony_ci{ 33519e95205Sopenharmony_ci return !!(g_gapMng.le.local.role & role); 33619e95205Sopenharmony_ci} 33719e95205Sopenharmony_ci 33819e95205Sopenharmony_civoid GapFreeLeDeviceInfo(void *data) 33919e95205Sopenharmony_ci{ 34019e95205Sopenharmony_ci LeDeviceInfo *deviceInfo = data; 34119e95205Sopenharmony_ci 34219e95205Sopenharmony_ci AlarmCancel(deviceInfo->alarm); 34319e95205Sopenharmony_ci AlarmDelete(deviceInfo->alarm); 34419e95205Sopenharmony_ci if (deviceInfo->securityReq != NULL) { 34519e95205Sopenharmony_ci MEM_MALLOC.free(deviceInfo->securityReq); 34619e95205Sopenharmony_ci deviceInfo->securityReq = NULL; 34719e95205Sopenharmony_ci } 34819e95205Sopenharmony_ci if (deviceInfo->paramUpdateReq != NULL) { 34919e95205Sopenharmony_ci MEM_MALLOC.free(deviceInfo->paramUpdateReq); 35019e95205Sopenharmony_ci deviceInfo->paramUpdateReq = NULL; 35119e95205Sopenharmony_ci } 35219e95205Sopenharmony_ci MEM_MALLOC.free(deviceInfo); 35319e95205Sopenharmony_ci} 35419e95205Sopenharmony_ci 35519e95205Sopenharmony_civoid GapFreeLeSignatureRequest(void *data) 35619e95205Sopenharmony_ci{ 35719e95205Sopenharmony_ci MEM_MALLOC.free(data); 35819e95205Sopenharmony_ci} 35919e95205Sopenharmony_ci 36019e95205Sopenharmony_ciLeBondBlock *GapGetLeBondBlock(void) 36119e95205Sopenharmony_ci{ 36219e95205Sopenharmony_ci return &g_gapMng.le.bondBlock; 36319e95205Sopenharmony_ci} 36419e95205Sopenharmony_ci 36519e95205Sopenharmony_ciLeConnectionInfoBlock *GapGetLeConnectionInfoBlock(void) 36619e95205Sopenharmony_ci{ 36719e95205Sopenharmony_ci return &g_gapMng.le.connectionInfoBlock; 36819e95205Sopenharmony_ci} 36919e95205Sopenharmony_ci 37019e95205Sopenharmony_ciLeSignatureBlock *GapGetLeSignatureBlock(void) 37119e95205Sopenharmony_ci{ 37219e95205Sopenharmony_ci return &g_gapMng.le.signatureBlock; 37319e95205Sopenharmony_ci} 37419e95205Sopenharmony_ci 37519e95205Sopenharmony_ciLeRandomAddressBlock *GapGetLeRandomAddressBlock(void) 37619e95205Sopenharmony_ci{ 37719e95205Sopenharmony_ci return &g_gapMng.le.randomAddressBlock; 37819e95205Sopenharmony_ci} 37919e95205Sopenharmony_ci 38019e95205Sopenharmony_ciLeExAdvBlock *GapGetLeExAdvBlock(void) 38119e95205Sopenharmony_ci{ 38219e95205Sopenharmony_ci return &g_gapMng.le.exAdvBlock; 38319e95205Sopenharmony_ci} 38419e95205Sopenharmony_ci 38519e95205Sopenharmony_cibool GapIsLeBondableMode(void) 38619e95205Sopenharmony_ci{ 38719e95205Sopenharmony_ci return g_gapMng.le.local.bondableMode == GAP_BONDABLE_MODE; 38819e95205Sopenharmony_ci} 38919e95205Sopenharmony_ci 39019e95205Sopenharmony_ciLeLocalInfo *GapGetLeLocalInfo(void) 39119e95205Sopenharmony_ci{ 39219e95205Sopenharmony_ci return &g_gapMng.le.local; 39319e95205Sopenharmony_ci} 39419e95205Sopenharmony_ci 39519e95205Sopenharmony_ci#endif 39619e95205Sopenharmony_ci 39719e95205Sopenharmony_ci#ifdef GAP_BREDR_SUPPORT 39819e95205Sopenharmony_ci 39919e95205Sopenharmony_ciint GAP_SetScanMode(const GapDiscoverModeInfo *discoverInfo, const GapConnectableModeInfo *connectableInfo, 40019e95205Sopenharmony_ci GapSetScanModeResultCallback callback, void *context) 40119e95205Sopenharmony_ci{ 40219e95205Sopenharmony_ci int ret; 40319e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = NULL; 40419e95205Sopenharmony_ci 40519e95205Sopenharmony_ci LOG_INFO("%{public}s:discoverable:[%hhu][%hhu][%04x][%04x], connectable:[%hhu][%hhu][%04x][%04x]", 40619e95205Sopenharmony_ci __FUNCTION__, 40719e95205Sopenharmony_ci discoverInfo->mode, 40819e95205Sopenharmony_ci discoverInfo->type, 40919e95205Sopenharmony_ci discoverInfo->scanInterval, 41019e95205Sopenharmony_ci discoverInfo->scanWindow, 41119e95205Sopenharmony_ci connectableInfo->mode, 41219e95205Sopenharmony_ci connectableInfo->type, 41319e95205Sopenharmony_ci connectableInfo->scanInterval, 41419e95205Sopenharmony_ci connectableInfo->scanWindow); 41519e95205Sopenharmony_ci 41619e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 41719e95205Sopenharmony_ci return GAP_ERR_NOT_ENABLE; 41819e95205Sopenharmony_ci } 41919e95205Sopenharmony_ci 42019e95205Sopenharmony_ci if (discoverInfo->mode > GAP_DISCOVERABLE_MODE_GENERAL || discoverInfo->type > GAP_INQUIRY_SCAN_TYPE_INTERLACED || 42119e95205Sopenharmony_ci discoverInfo->scanInterval < GAP_SCAN_INTERVAL_RANGE_MIN || 42219e95205Sopenharmony_ci discoverInfo->scanInterval > GAP_SCAN_INTERVAL_RANGE_MAX || 42319e95205Sopenharmony_ci discoverInfo->scanWindow < GAP_SCAN_WINDOW_RANGE_MIN || discoverInfo->scanWindow > discoverInfo->scanInterval || 42419e95205Sopenharmony_ci connectableInfo->mode > GAP_CONNECTABLE_MODE || connectableInfo->type > GAP_PAGE_SCAN_TYPE_INTERLACED || 42519e95205Sopenharmony_ci connectableInfo->scanInterval < GAP_SCAN_INTERVAL_RANGE_MIN || 42619e95205Sopenharmony_ci connectableInfo->scanInterval > GAP_SCAN_INTERVAL_RANGE_MAX || 42719e95205Sopenharmony_ci connectableInfo->scanWindow < GAP_SCAN_WINDOW_RANGE_MIN || 42819e95205Sopenharmony_ci connectableInfo->scanWindow > connectableInfo->scanInterval) { 42919e95205Sopenharmony_ci return GAP_ERR_INVAL_PARAM; 43019e95205Sopenharmony_ci } 43119e95205Sopenharmony_ci 43219e95205Sopenharmony_ci scanModeBlock = GapGetScanModeBlock(); 43319e95205Sopenharmony_ci if (scanModeBlock->status != GAP_SCANMODE_STATUS_IDLE) { 43419e95205Sopenharmony_ci ret = GAP_ERR_INVAL_STATE; 43519e95205Sopenharmony_ci } else { 43619e95205Sopenharmony_ci (void)memcpy_s( 43719e95205Sopenharmony_ci &scanModeBlock->discoverMode, sizeof(GapDiscoverModeInfo), discoverInfo, sizeof(GapDiscoverModeInfo)); 43819e95205Sopenharmony_ci (void)memcpy_s(&scanModeBlock->connectableMode, 43919e95205Sopenharmony_ci sizeof(GapConnectableModeInfo), 44019e95205Sopenharmony_ci connectableInfo, 44119e95205Sopenharmony_ci sizeof(GapConnectableModeInfo)); 44219e95205Sopenharmony_ci scanModeBlock->callback = callback; 44319e95205Sopenharmony_ci scanModeBlock->context = context; 44419e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_CLOSING; 44519e95205Sopenharmony_ci 44619e95205Sopenharmony_ci ret = GapWriteScanEnable(); 44719e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 44819e95205Sopenharmony_ci LOG_WARN(""); 44919e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 45019e95205Sopenharmony_ci } 45119e95205Sopenharmony_ci } 45219e95205Sopenharmony_ci 45319e95205Sopenharmony_ci return ret; 45419e95205Sopenharmony_ci} 45519e95205Sopenharmony_ci 45619e95205Sopenharmony_cistatic int GapWriteScanEnable(void) 45719e95205Sopenharmony_ci{ 45819e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 45919e95205Sopenharmony_ci HciWriteScanEnableParam hciCmdParam; 46019e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 46119e95205Sopenharmony_ci uint8_t discoverMode = scanModeBlock->discoverMode.mode; 46219e95205Sopenharmony_ci uint8_t connectableMode = scanModeBlock->connectableMode.mode; 46319e95205Sopenharmony_ci int ret; 46419e95205Sopenharmony_ci 46519e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_CLOSING) { 46619e95205Sopenharmony_ci hciCmdParam.scanEnable = 0; 46719e95205Sopenharmony_ci ret = HCI_WriteScanEnable(&hciCmdParam); 46819e95205Sopenharmony_ci } else if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 46919e95205Sopenharmony_ci if (discoverMode != GAP_DISCOVERABLE_MODE_NON && connectableMode != GAP_CONNECTABLE_MODE_NON) { 47019e95205Sopenharmony_ci hciCmdParam.scanEnable = INQUIRY_SCAN_ENABLED_PAGE_SCAN_ENABLED; 47119e95205Sopenharmony_ci } else if (connectableMode != GAP_DISCOVERABLE_MODE_NON) { 47219e95205Sopenharmony_ci hciCmdParam.scanEnable = INQUIRY_SCAN_DISABLED_PAGE_SCAN_ENABLED; 47319e95205Sopenharmony_ci } else if (discoverMode != GAP_CONNECTABLE_MODE_NON) { 47419e95205Sopenharmony_ci hciCmdParam.scanEnable = INQUIRY_SCAN_ENABLED_PAGE_SCAN_DISABLED; 47519e95205Sopenharmony_ci } else { 47619e95205Sopenharmony_ci hciCmdParam.scanEnable = NO_SCANS_ENABLED; 47719e95205Sopenharmony_ci } 47819e95205Sopenharmony_ci ret = HCI_WriteScanEnable(&hciCmdParam); 47919e95205Sopenharmony_ci } else { 48019e95205Sopenharmony_ci ret = GAP_ERR_INVAL_STATE; 48119e95205Sopenharmony_ci } 48219e95205Sopenharmony_ci return ret; 48319e95205Sopenharmony_ci} 48419e95205Sopenharmony_ci 48519e95205Sopenharmony_ciNO_SANITIZE("cfi") void GapWriteScanEnableComplete(const HciWriteScanEnableReturnParam *param) 48619e95205Sopenharmony_ci{ 48719e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 48819e95205Sopenharmony_ci int ret = GAP_SUCCESS; 48919e95205Sopenharmony_ci GapSetScanModeResultCallback callback = NULL; 49019e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = NULL; 49119e95205Sopenharmony_ci uint8_t retStatus = param->status; 49219e95205Sopenharmony_ci 49319e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 49419e95205Sopenharmony_ci LOG_ERROR("Not Enable."); 49519e95205Sopenharmony_ci return; 49619e95205Sopenharmony_ci } 49719e95205Sopenharmony_ci 49819e95205Sopenharmony_ci scanModeBlock = GapGetScanModeBlock(); 49919e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_CLOSING) { 50019e95205Sopenharmony_ci if (retStatus == HCI_SUCCESS) { 50119e95205Sopenharmony_ci if (scanModeBlock->discoverMode.mode) { 50219e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_SETTING; 50319e95205Sopenharmony_ci ret = GapWriteInquiryScanActivity(); 50419e95205Sopenharmony_ci } else if (scanModeBlock->connectableMode.mode) { 50519e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_SETTING; 50619e95205Sopenharmony_ci ret = GapWritePageScanActivity(); 50719e95205Sopenharmony_ci } else { 50819e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 50919e95205Sopenharmony_ci callback = scanModeBlock->callback; 51019e95205Sopenharmony_ci } 51119e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 51219e95205Sopenharmony_ci LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 51319e95205Sopenharmony_ci retStatus = GAP_STATUS_FAILED; 51419e95205Sopenharmony_ci callback = scanModeBlock->callback; 51519e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 51619e95205Sopenharmony_ci } 51719e95205Sopenharmony_ci } else { 51819e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 51919e95205Sopenharmony_ci callback = scanModeBlock->callback; 52019e95205Sopenharmony_ci } 52119e95205Sopenharmony_ci } else if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 52219e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 52319e95205Sopenharmony_ci callback = scanModeBlock->callback; 52419e95205Sopenharmony_ci } else { 52519e95205Sopenharmony_ci LOG_WARN(""); 52619e95205Sopenharmony_ci } 52719e95205Sopenharmony_ci 52819e95205Sopenharmony_ci if (callback != NULL) { 52919e95205Sopenharmony_ci callback(retStatus, scanModeBlock->context); 53019e95205Sopenharmony_ci } 53119e95205Sopenharmony_ci} 53219e95205Sopenharmony_ci 53319e95205Sopenharmony_cistatic int GapWriteInquiryScanActivity(void) 53419e95205Sopenharmony_ci{ 53519e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 53619e95205Sopenharmony_ci int ret; 53719e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 53819e95205Sopenharmony_ci HciWriteInquiryScanActivityParam hciCmdParam; 53919e95205Sopenharmony_ci 54019e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 54119e95205Sopenharmony_ci hciCmdParam.inquiryScanInterval = scanModeBlock->discoverMode.scanInterval; 54219e95205Sopenharmony_ci hciCmdParam.inquiryScanWindow = scanModeBlock->discoverMode.scanWindow; 54319e95205Sopenharmony_ci ret = HCI_WriteInquiryScanActivity(&hciCmdParam); 54419e95205Sopenharmony_ci } else { 54519e95205Sopenharmony_ci ret = GAP_ERR_INVAL_STATE; 54619e95205Sopenharmony_ci } 54719e95205Sopenharmony_ci return ret; 54819e95205Sopenharmony_ci} 54919e95205Sopenharmony_ci 55019e95205Sopenharmony_civoid GapWriteInquiryScanActivityComplete(const HciWriteInquiryScanActivityReturnParam *param) 55119e95205Sopenharmony_ci{ 55219e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 55319e95205Sopenharmony_ci GapSetScanModeResultCallback callback = NULL; 55419e95205Sopenharmony_ci uint8_t retStatus = param->status; 55519e95205Sopenharmony_ci 55619e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 55719e95205Sopenharmony_ci LOG_ERROR("%sNot Enable.", ""); 55819e95205Sopenharmony_ci return; 55919e95205Sopenharmony_ci } 56019e95205Sopenharmony_ci 56119e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 56219e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 56319e95205Sopenharmony_ci if (retStatus == HCI_SUCCESS) { 56419e95205Sopenharmony_ci int ret = GapWriteInquiryScanType(); 56519e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 56619e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 56719e95205Sopenharmony_ci retStatus = GAP_STATUS_FAILED; 56819e95205Sopenharmony_ci callback = scanModeBlock->callback; 56919e95205Sopenharmony_ci LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 57019e95205Sopenharmony_ci } 57119e95205Sopenharmony_ci } else { 57219e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 57319e95205Sopenharmony_ci callback = scanModeBlock->callback; 57419e95205Sopenharmony_ci } 57519e95205Sopenharmony_ci } 57619e95205Sopenharmony_ci 57719e95205Sopenharmony_ci if (callback != NULL) { 57819e95205Sopenharmony_ci callback(retStatus, scanModeBlock->context); 57919e95205Sopenharmony_ci } 58019e95205Sopenharmony_ci} 58119e95205Sopenharmony_ci 58219e95205Sopenharmony_cistatic int GapWriteInquiryScanType(void) 58319e95205Sopenharmony_ci{ 58419e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 58519e95205Sopenharmony_ci int ret; 58619e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 58719e95205Sopenharmony_ci HciWriteInquiryScanTypeParam hciCmdParam; 58819e95205Sopenharmony_ci 58919e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 59019e95205Sopenharmony_ci hciCmdParam.scanType = scanModeBlock->discoverMode.type; 59119e95205Sopenharmony_ci ret = HCI_WriteInquiryScanType(&hciCmdParam); 59219e95205Sopenharmony_ci } else { 59319e95205Sopenharmony_ci ret = GAP_ERR_INVAL_STATE; 59419e95205Sopenharmony_ci } 59519e95205Sopenharmony_ci return ret; 59619e95205Sopenharmony_ci} 59719e95205Sopenharmony_ci 59819e95205Sopenharmony_civoid GapWriteInquiryScanTypeComplete(const HciWriteInquiryScanTypeReturnParam *param) 59919e95205Sopenharmony_ci{ 60019e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 60119e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = NULL; 60219e95205Sopenharmony_ci GapSetScanModeResultCallback callback = NULL; 60319e95205Sopenharmony_ci uint8_t retStatus = param->status; 60419e95205Sopenharmony_ci 60519e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 60619e95205Sopenharmony_ci LOG_ERROR("%sNot Enable.", ""); 60719e95205Sopenharmony_ci return; 60819e95205Sopenharmony_ci } 60919e95205Sopenharmony_ci 61019e95205Sopenharmony_ci scanModeBlock = GapGetScanModeBlock(); 61119e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 61219e95205Sopenharmony_ci if (retStatus == HCI_SUCCESS) { 61319e95205Sopenharmony_ci int ret = GapWriteCurrentIACLAP(); 61419e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 61519e95205Sopenharmony_ci LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 61619e95205Sopenharmony_ci callback = scanModeBlock->callback; 61719e95205Sopenharmony_ci retStatus = GAP_STATUS_FAILED; 61819e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 61919e95205Sopenharmony_ci } 62019e95205Sopenharmony_ci } else { 62119e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 62219e95205Sopenharmony_ci callback = scanModeBlock->callback; 62319e95205Sopenharmony_ci } 62419e95205Sopenharmony_ci } 62519e95205Sopenharmony_ci 62619e95205Sopenharmony_ci if (callback != NULL) { 62719e95205Sopenharmony_ci callback(retStatus, scanModeBlock->context); 62819e95205Sopenharmony_ci } 62919e95205Sopenharmony_ci} 63019e95205Sopenharmony_ci 63119e95205Sopenharmony_cistatic int GapWriteCurrentIACLAP(void) 63219e95205Sopenharmony_ci{ 63319e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 63419e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 63519e95205Sopenharmony_ci uint8_t discoverableMode = scanModeBlock->discoverMode.mode; 63619e95205Sopenharmony_ci uint8_t numCurrentIAC = 0; 63719e95205Sopenharmony_ci uint32_t iacLAP[CURRENT_IAC_MAX_NUM]; 63819e95205Sopenharmony_ci 63919e95205Sopenharmony_ci if (discoverableMode & GAP_DISCOVERABLE_MODE_GENERAL) { 64019e95205Sopenharmony_ci iacLAP[numCurrentIAC] = LAP_GENERAL_INQUIRY_ACCESS; 64119e95205Sopenharmony_ci numCurrentIAC++; 64219e95205Sopenharmony_ci } else if (discoverableMode & GAP_DISCOVERABLE_MODE_LIMITED) { 64319e95205Sopenharmony_ci iacLAP[numCurrentIAC] = LAP_GENERAL_INQUIRY_ACCESS; 64419e95205Sopenharmony_ci numCurrentIAC++; 64519e95205Sopenharmony_ci iacLAP[numCurrentIAC] = LAP_LIMITED_INQUIRY_ACCESS; 64619e95205Sopenharmony_ci numCurrentIAC++; 64719e95205Sopenharmony_ci } 64819e95205Sopenharmony_ci 64919e95205Sopenharmony_ci HciWriteCurrentIacLapParam param = { 65019e95205Sopenharmony_ci .numCurrentIAC = numCurrentIAC, 65119e95205Sopenharmony_ci .iacLAP = iacLAP, 65219e95205Sopenharmony_ci }; 65319e95205Sopenharmony_ci 65419e95205Sopenharmony_ci return HCI_WriteCurrentIacLap(¶m); 65519e95205Sopenharmony_ci} 65619e95205Sopenharmony_ci 65719e95205Sopenharmony_civoid GapWriteCurrentIACLAPComplete(const HciWriteCurrentIacLapReturnParam *param) 65819e95205Sopenharmony_ci{ 65919e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 66019e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = NULL; 66119e95205Sopenharmony_ci GapSetScanModeResultCallback callback = NULL; 66219e95205Sopenharmony_ci uint8_t retStatus = param->status; 66319e95205Sopenharmony_ci 66419e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 66519e95205Sopenharmony_ci LOG_ERROR("%sNot Enable.", ""); 66619e95205Sopenharmony_ci return; 66719e95205Sopenharmony_ci } 66819e95205Sopenharmony_ci 66919e95205Sopenharmony_ci scanModeBlock = GapGetScanModeBlock(); 67019e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 67119e95205Sopenharmony_ci if (retStatus == HCI_SUCCESS) { 67219e95205Sopenharmony_ci if (scanModeBlock->discoverMode.mode & GAP_INQUIRY_MODE_LIMITED) { 67319e95205Sopenharmony_ci g_gapMng.bredr.classOfDevice |= COD_LIMITED_DISCOVERABLE_BIT; 67419e95205Sopenharmony_ci } else { 67519e95205Sopenharmony_ci g_gapMng.bredr.classOfDevice &= ~COD_LIMITED_DISCOVERABLE_BIT; 67619e95205Sopenharmony_ci } 67719e95205Sopenharmony_ci 67819e95205Sopenharmony_ci int ret = GapWriteClassOfDevice(g_gapMng.bredr.classOfDevice); 67919e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 68019e95205Sopenharmony_ci LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 68119e95205Sopenharmony_ci retStatus = GAP_STATUS_FAILED; 68219e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 68319e95205Sopenharmony_ci callback = scanModeBlock->callback; 68419e95205Sopenharmony_ci } 68519e95205Sopenharmony_ci } else { 68619e95205Sopenharmony_ci callback = scanModeBlock->callback; 68719e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 68819e95205Sopenharmony_ci } 68919e95205Sopenharmony_ci } 69019e95205Sopenharmony_ci 69119e95205Sopenharmony_ci if (callback != NULL) { 69219e95205Sopenharmony_ci callback(retStatus, scanModeBlock->context); 69319e95205Sopenharmony_ci } 69419e95205Sopenharmony_ci} 69519e95205Sopenharmony_ci 69619e95205Sopenharmony_cistatic int GapWritePageScanActivity(void) 69719e95205Sopenharmony_ci{ 69819e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 69919e95205Sopenharmony_ci int ret; 70019e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 70119e95205Sopenharmony_ci HciWritePageScanActivityParam hciCmdParam; 70219e95205Sopenharmony_ci 70319e95205Sopenharmony_ci hciCmdParam.pageScanInterval = scanModeBlock->connectableMode.scanInterval; 70419e95205Sopenharmony_ci hciCmdParam.pageScanWindow = scanModeBlock->connectableMode.scanWindow; 70519e95205Sopenharmony_ci ret = HCI_WritePageScanActivity(&hciCmdParam); 70619e95205Sopenharmony_ci return ret; 70719e95205Sopenharmony_ci} 70819e95205Sopenharmony_ci 70919e95205Sopenharmony_civoid GapWritePageScanActivityComplete(const HciWritePageScanActivityReturnParam *param) 71019e95205Sopenharmony_ci{ 71119e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 71219e95205Sopenharmony_ci GapSetScanModeResultCallback callback = NULL; 71319e95205Sopenharmony_ci uint8_t retStatus = param->status; 71419e95205Sopenharmony_ci 71519e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 71619e95205Sopenharmony_ci LOG_ERROR("%sNot Enable.", ""); 71719e95205Sopenharmony_ci return; 71819e95205Sopenharmony_ci } 71919e95205Sopenharmony_ci 72019e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 72119e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 72219e95205Sopenharmony_ci if (retStatus == HCI_SUCCESS) { 72319e95205Sopenharmony_ci int ret = GapWritePageScanType(); 72419e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 72519e95205Sopenharmony_ci LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 72619e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 72719e95205Sopenharmony_ci callback = scanModeBlock->callback; 72819e95205Sopenharmony_ci retStatus = GAP_STATUS_FAILED; 72919e95205Sopenharmony_ci } 73019e95205Sopenharmony_ci } else { 73119e95205Sopenharmony_ci callback = scanModeBlock->callback; 73219e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 73319e95205Sopenharmony_ci } 73419e95205Sopenharmony_ci } 73519e95205Sopenharmony_ci 73619e95205Sopenharmony_ci if (callback != NULL) { 73719e95205Sopenharmony_ci callback(retStatus, scanModeBlock->context); 73819e95205Sopenharmony_ci } 73919e95205Sopenharmony_ci} 74019e95205Sopenharmony_ci 74119e95205Sopenharmony_cistatic int GapWritePageScanType(void) 74219e95205Sopenharmony_ci{ 74319e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 74419e95205Sopenharmony_ci int ret; 74519e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 74619e95205Sopenharmony_ci HciWritePageScanTypeParam hciCmdParam; 74719e95205Sopenharmony_ci 74819e95205Sopenharmony_ci hciCmdParam.pageScanType = scanModeBlock->connectableMode.type; 74919e95205Sopenharmony_ci ret = HCI_WritePageScanType(&hciCmdParam); 75019e95205Sopenharmony_ci return ret; 75119e95205Sopenharmony_ci} 75219e95205Sopenharmony_ci 75319e95205Sopenharmony_civoid GapWritePageScanTypeComplete(const HciWritePageScanTypeReturnParam *param) 75419e95205Sopenharmony_ci{ 75519e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 75619e95205Sopenharmony_ci GapSetScanModeResultCallback callback = NULL; 75719e95205Sopenharmony_ci uint8_t retStatus = param->status; 75819e95205Sopenharmony_ci 75919e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 76019e95205Sopenharmony_ci LOG_ERROR("%sNot Enable.", ""); 76119e95205Sopenharmony_ci return; 76219e95205Sopenharmony_ci } 76319e95205Sopenharmony_ci 76419e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = GapGetScanModeBlock(); 76519e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 76619e95205Sopenharmony_ci if (retStatus == HCI_SUCCESS) { 76719e95205Sopenharmony_ci int ret = GapWriteScanEnable(); 76819e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 76919e95205Sopenharmony_ci LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 77019e95205Sopenharmony_ci callback = scanModeBlock->callback; 77119e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 77219e95205Sopenharmony_ci retStatus = GAP_STATUS_FAILED; 77319e95205Sopenharmony_ci } 77419e95205Sopenharmony_ci } else { 77519e95205Sopenharmony_ci callback = scanModeBlock->callback; 77619e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 77719e95205Sopenharmony_ci } 77819e95205Sopenharmony_ci } 77919e95205Sopenharmony_ci 78019e95205Sopenharmony_ci if (callback != NULL) { 78119e95205Sopenharmony_ci callback(retStatus, scanModeBlock->context); 78219e95205Sopenharmony_ci } 78319e95205Sopenharmony_ci} 78419e95205Sopenharmony_ci 78519e95205Sopenharmony_civoid GapReadLocalOobExtendedDataComplete(const HciReadLocalOobExtendedDataReturnParam *param) 78619e95205Sopenharmony_ci{ 78719e95205Sopenharmony_ci if (param->status == HCI_SUCCESS) { 78819e95205Sopenharmony_ci (void)memcpy_s(g_gapMng.bredr.oobData256.C, GAP_OOB_DATA_CONFIRM_SIZE, param->c256, GAP_OOB_DATA_CONFIRM_SIZE); 78919e95205Sopenharmony_ci (void)memcpy_s(g_gapMng.bredr.oobData256.R, GAP_OOB_DATA_RANDOM_SIZE, param->r256, GAP_OOB_DATA_RANDOM_SIZE); 79019e95205Sopenharmony_ci (void)memcpy_s(g_gapMng.bredr.oobData192.C, GAP_OOB_DATA_CONFIRM_SIZE, param->c192, GAP_OOB_DATA_CONFIRM_SIZE); 79119e95205Sopenharmony_ci (void)memcpy_s(g_gapMng.bredr.oobData192.R, GAP_OOB_DATA_RANDOM_SIZE, param->r192, GAP_OOB_DATA_RANDOM_SIZE); 79219e95205Sopenharmony_ci } else { 79319e95205Sopenharmony_ci int ret = HCI_ReadLocalOOBData(); 79419e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 79519e95205Sopenharmony_ci LOG_WARN("%{public}s: Local OOB data read failed", __FUNCTION__); 79619e95205Sopenharmony_ci } 79719e95205Sopenharmony_ci } 79819e95205Sopenharmony_ci} 79919e95205Sopenharmony_ci 80019e95205Sopenharmony_civoid GapReadLocalOobDataComplete(const HciReadLocalOOBDataReturnParam *param) 80119e95205Sopenharmony_ci{ 80219e95205Sopenharmony_ci if (param->status == HCI_SUCCESS) { 80319e95205Sopenharmony_ci (void)memset_s(g_gapMng.bredr.oobData256.C, GAP_OOB_DATA_CONFIRM_SIZE, 0x00, GAP_OOB_DATA_CONFIRM_SIZE); 80419e95205Sopenharmony_ci (void)memset_s(g_gapMng.bredr.oobData256.R, GAP_OOB_DATA_RANDOM_SIZE, 0x00, GAP_OOB_DATA_RANDOM_SIZE); 80519e95205Sopenharmony_ci (void)memcpy_s(g_gapMng.bredr.oobData192.C, GAP_OOB_DATA_CONFIRM_SIZE, param->C, GAP_OOB_DATA_CONFIRM_SIZE); 80619e95205Sopenharmony_ci (void)memcpy_s(g_gapMng.bredr.oobData192.R, GAP_OOB_DATA_RANDOM_SIZE, param->R, GAP_OOB_DATA_RANDOM_SIZE); 80719e95205Sopenharmony_ci } else { 80819e95205Sopenharmony_ci (void)memset_s(g_gapMng.bredr.oobData256.C, GAP_OOB_DATA_CONFIRM_SIZE, 0x00, GAP_OOB_DATA_CONFIRM_SIZE); 80919e95205Sopenharmony_ci (void)memset_s(g_gapMng.bredr.oobData256.R, GAP_OOB_DATA_RANDOM_SIZE, 0x00, GAP_OOB_DATA_RANDOM_SIZE); 81019e95205Sopenharmony_ci (void)memset_s(g_gapMng.bredr.oobData192.C, GAP_OOB_DATA_CONFIRM_SIZE, 0x00, GAP_OOB_DATA_CONFIRM_SIZE); 81119e95205Sopenharmony_ci (void)memset_s(g_gapMng.bredr.oobData192.R, GAP_OOB_DATA_RANDOM_SIZE, 0x00, GAP_OOB_DATA_RANDOM_SIZE); 81219e95205Sopenharmony_ci } 81319e95205Sopenharmony_ci} 81419e95205Sopenharmony_ci 81519e95205Sopenharmony_ciint GapReadNewLocalOOBData(void) 81619e95205Sopenharmony_ci{ 81719e95205Sopenharmony_ci int ret; 81819e95205Sopenharmony_ci 81919e95205Sopenharmony_ci BtmLocalVersionInformation version; 82019e95205Sopenharmony_ci BTM_GetLocalVersionInformation(&version); 82119e95205Sopenharmony_ci if (version.hciVersion >= BLUETOOTH_CORE_SPECIFICATION_4_1) { 82219e95205Sopenharmony_ci ret = HCI_ReadLocalOOBExtendedData(); 82319e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 82419e95205Sopenharmony_ci LOG_WARN("%{public}s: Local OOB data read failed", __FUNCTION__); 82519e95205Sopenharmony_ci } 82619e95205Sopenharmony_ci } else { 82719e95205Sopenharmony_ci ret = HCI_ReadLocalOOBData(); 82819e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 82919e95205Sopenharmony_ci LOG_WARN("%{public}s: Local OOB data read failed", __FUNCTION__); 83019e95205Sopenharmony_ci } 83119e95205Sopenharmony_ci } 83219e95205Sopenharmony_ci 83319e95205Sopenharmony_ci return ret; 83419e95205Sopenharmony_ci} 83519e95205Sopenharmony_ci 83619e95205Sopenharmony_cibool GapIsKeyMissingRetry(void) 83719e95205Sopenharmony_ci{ 83819e95205Sopenharmony_ci return g_gapMng.bredr.keyMissingRetry; 83919e95205Sopenharmony_ci} 84019e95205Sopenharmony_ci 84119e95205Sopenharmony_ciint GAP_SetKeyMissingRetry(bool retry) 84219e95205Sopenharmony_ci{ 84319e95205Sopenharmony_ci g_gapMng.bredr.keyMissingRetry = retry; 84419e95205Sopenharmony_ci return GAP_SUCCESS; 84519e95205Sopenharmony_ci} 84619e95205Sopenharmony_ci 84719e95205Sopenharmony_ciint GAP_SetBondableMode(uint8_t bondableMode) 84819e95205Sopenharmony_ci{ 84919e95205Sopenharmony_ci LOG_INFO("%{public}s:bondable[%hhu]", __FUNCTION__, bondableMode); 85019e95205Sopenharmony_ci 85119e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 85219e95205Sopenharmony_ci return GAP_ERR_NOT_ENABLE; 85319e95205Sopenharmony_ci } 85419e95205Sopenharmony_ci 85519e95205Sopenharmony_ci g_gapMng.bredr.bondableMode = bondableMode; 85619e95205Sopenharmony_ci if (bondableMode == GAP_BONDABLE_MODE) { 85719e95205Sopenharmony_ci GapReadNewLocalOOBData(); 85819e95205Sopenharmony_ci } 85919e95205Sopenharmony_ci 86019e95205Sopenharmony_ci return GAP_SUCCESS; 86119e95205Sopenharmony_ci} 86219e95205Sopenharmony_ci 86319e95205Sopenharmony_cistatic void GapFreeRegSecInfo(void *data) 86419e95205Sopenharmony_ci{ 86519e95205Sopenharmony_ci MEM_MALLOC.free(data); 86619e95205Sopenharmony_ci} 86719e95205Sopenharmony_ci 86819e95205Sopenharmony_cistatic void GapFreeReqSecInfo(void *data) 86919e95205Sopenharmony_ci{ 87019e95205Sopenharmony_ci GapAuthenticationClearInfo(data); 87119e95205Sopenharmony_ci MEM_MALLOC.free(data); 87219e95205Sopenharmony_ci} 87319e95205Sopenharmony_ci 87419e95205Sopenharmony_cistatic void GapFreeDeviceInfo(void *data) 87519e95205Sopenharmony_ci{ 87619e95205Sopenharmony_ci DeviceInfo *devInfo = data; 87719e95205Sopenharmony_ci if (devInfo != NULL) { 87819e95205Sopenharmony_ci AlarmCancel(devInfo->alarm); 87919e95205Sopenharmony_ci AlarmDelete(devInfo->alarm); 88019e95205Sopenharmony_ci AlarmCancel(devInfo->aclAlarm); 88119e95205Sopenharmony_ci AlarmDelete(devInfo->aclAlarm); 88219e95205Sopenharmony_ci if (devInfo->waitEncryptAlarm != NULL) { 88319e95205Sopenharmony_ci AlarmCancel(devInfo->waitEncryptAlarm); 88419e95205Sopenharmony_ci AlarmDelete(devInfo->waitEncryptAlarm); 88519e95205Sopenharmony_ci } 88619e95205Sopenharmony_ci MEM_MALLOC.free(devInfo); 88719e95205Sopenharmony_ci } 88819e95205Sopenharmony_ci} 88919e95205Sopenharmony_ci 89019e95205Sopenharmony_ciint GAP_RegisterServiceSecurity(const BtAddr *addr, const GapServiceSecurityInfo *serviceInfo, uint16_t securityMode) 89119e95205Sopenharmony_ci{ 89219e95205Sopenharmony_ci int ret = GAP_SUCCESS; 89319e95205Sopenharmony_ci ListNode *node = NULL; 89419e95205Sopenharmony_ci ProfileSecurityInfo *regInfo = NULL; 89519e95205Sopenharmony_ci 89619e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 89719e95205Sopenharmony_ci return GAP_ERR_NOT_ENABLE; 89819e95205Sopenharmony_ci } 89919e95205Sopenharmony_ci 90019e95205Sopenharmony_ci ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock(); 90119e95205Sopenharmony_ci node = ListGetFirstNode(profileSecurityBlock->registerlist); 90219e95205Sopenharmony_ci while (node != 0) { 90319e95205Sopenharmony_ci regInfo = (ProfileSecurityInfo *)ListGetNodeData(node); 90419e95205Sopenharmony_ci if ((addr == NULL || GapIsEmptyAddr(addr->addr) || GapAddrCompare(addr, ®Info->addr)) && 90519e95205Sopenharmony_ci (regInfo->info.direction == serviceInfo->direction) && 90619e95205Sopenharmony_ci (regInfo->info.serviceId == serviceInfo->serviceId) && 90719e95205Sopenharmony_ci (regInfo->info.protocolId == serviceInfo->protocolId) && 90819e95205Sopenharmony_ci GapCompareChannelID(serviceInfo->protocolId, regInfo->info.channelId, serviceInfo->channelId)) { 90919e95205Sopenharmony_ci ret = GAP_ERR_REPEATED; 91019e95205Sopenharmony_ci LOG_WARN("Repeated Register Security %{public}d", serviceInfo->serviceId); 91119e95205Sopenharmony_ci break; 91219e95205Sopenharmony_ci } 91319e95205Sopenharmony_ci node = ListGetNextNode(node); 91419e95205Sopenharmony_ci } 91519e95205Sopenharmony_ci 91619e95205Sopenharmony_ci if (node == NULL) { 91719e95205Sopenharmony_ci regInfo = MEM_MALLOC.alloc(sizeof(ProfileSecurityInfo)); 91819e95205Sopenharmony_ci if (regInfo == NULL) { 91919e95205Sopenharmony_ci ret = GAP_ERR_OUT_OF_RES; 92019e95205Sopenharmony_ci } else { 92119e95205Sopenharmony_ci (void)memset_s(regInfo, sizeof(ProfileSecurityInfo), 0x00, sizeof(ProfileSecurityInfo)); 92219e95205Sopenharmony_ci if (addr != NULL) { 92319e95205Sopenharmony_ci (void)memcpy_s(®Info->addr, BT_ADDRESS_SIZE, addr, BT_ADDRESS_SIZE); 92419e95205Sopenharmony_ci } 92519e95205Sopenharmony_ci regInfo->info = *serviceInfo; 92619e95205Sopenharmony_ci regInfo->securityMode = securityMode; 92719e95205Sopenharmony_ci 92819e95205Sopenharmony_ci ListAddFirst(profileSecurityBlock->registerlist, regInfo); 92919e95205Sopenharmony_ci } 93019e95205Sopenharmony_ci } 93119e95205Sopenharmony_ci 93219e95205Sopenharmony_ci if (addr != NULL) { 93319e95205Sopenharmony_ci LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr)); 93419e95205Sopenharmony_ci } 93519e95205Sopenharmony_ci 93619e95205Sopenharmony_ci return ret; 93719e95205Sopenharmony_ci} 93819e95205Sopenharmony_ciint GAP_DeregisterServiceSecurity(const BtAddr *addr, const GapServiceSecurityInfo *serviceInfo) 93919e95205Sopenharmony_ci{ 94019e95205Sopenharmony_ci int ret = GAP_SUCCESS; 94119e95205Sopenharmony_ci ProfileSecurityBlock *profileSecurityBlock = NULL; 94219e95205Sopenharmony_ci ListNode *node = NULL; 94319e95205Sopenharmony_ci ProfileSecurityInfo *regInfo = NULL; 94419e95205Sopenharmony_ci 94519e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 94619e95205Sopenharmony_ci return GAP_ERR_NOT_ENABLE; 94719e95205Sopenharmony_ci } 94819e95205Sopenharmony_ci 94919e95205Sopenharmony_ci profileSecurityBlock = GapGetProfileSecurityBlock(); 95019e95205Sopenharmony_ci node = ListGetFirstNode(profileSecurityBlock->registerlist); 95119e95205Sopenharmony_ci while (node != 0) { 95219e95205Sopenharmony_ci regInfo = (ProfileSecurityInfo *)ListGetNodeData(node); 95319e95205Sopenharmony_ci if ((addr == NULL || GapIsEmptyAddr(addr->addr) || GapAddrCompare(addr, ®Info->addr)) && 95419e95205Sopenharmony_ci regInfo->info.direction == serviceInfo->direction && regInfo->info.serviceId == serviceInfo->serviceId && 95519e95205Sopenharmony_ci regInfo->info.protocolId == serviceInfo->protocolId && 95619e95205Sopenharmony_ci GapCompareChannelID(serviceInfo->protocolId, regInfo->info.channelId, serviceInfo->channelId)) { 95719e95205Sopenharmony_ci ListRemoveNode(profileSecurityBlock->registerlist, regInfo); 95819e95205Sopenharmony_ci break; 95919e95205Sopenharmony_ci } 96019e95205Sopenharmony_ci node = ListGetNextNode(node); 96119e95205Sopenharmony_ci } 96219e95205Sopenharmony_ci 96319e95205Sopenharmony_ci if (node == NULL) { 96419e95205Sopenharmony_ci LOG_WARN("%{public}s:not found", __FUNCTION__); 96519e95205Sopenharmony_ci ret = GAP_ERR_INVAL_PARAM; 96619e95205Sopenharmony_ci } 96719e95205Sopenharmony_ci 96819e95205Sopenharmony_ci if (addr != NULL) { 96919e95205Sopenharmony_ci LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr)); 97019e95205Sopenharmony_ci } 97119e95205Sopenharmony_ci 97219e95205Sopenharmony_ci return ret; 97319e95205Sopenharmony_ci} 97419e95205Sopenharmony_ci 97519e95205Sopenharmony_cibool GapFindConnectionDeviceByAddr(void *nodeData, void *param) 97619e95205Sopenharmony_ci{ 97719e95205Sopenharmony_ci DeviceInfo *deviceInfo = nodeData; 97819e95205Sopenharmony_ci BtAddr *addr = param; 97919e95205Sopenharmony_ci 98019e95205Sopenharmony_ci if (!memcmp(&deviceInfo->addr, addr, sizeof(BtAddr))) { 98119e95205Sopenharmony_ci return true; 98219e95205Sopenharmony_ci } 98319e95205Sopenharmony_ci 98419e95205Sopenharmony_ci return false; 98519e95205Sopenharmony_ci} 98619e95205Sopenharmony_ci 98719e95205Sopenharmony_cibool GapFindConnectionDeviceByHandle(void *nodeData, void *param) 98819e95205Sopenharmony_ci{ 98919e95205Sopenharmony_ci DeviceInfo *deviceInfo = nodeData; 99019e95205Sopenharmony_ci uint16_t handle = *(uint16_t *)param; 99119e95205Sopenharmony_ci 99219e95205Sopenharmony_ci if (handle == deviceInfo->handle) { 99319e95205Sopenharmony_ci return true; 99419e95205Sopenharmony_ci } 99519e95205Sopenharmony_ci 99619e95205Sopenharmony_ci return false; 99719e95205Sopenharmony_ci} 99819e95205Sopenharmony_ci 99919e95205Sopenharmony_cibool GapFindCmpListData(void *nodeData, void *param) 100019e95205Sopenharmony_ci{ 100119e95205Sopenharmony_ci return (nodeData == param); 100219e95205Sopenharmony_ci} 100319e95205Sopenharmony_ci 100419e95205Sopenharmony_civoid GapStopUseAclConnection(void *dev) 100519e95205Sopenharmony_ci{ 100619e95205Sopenharmony_ci DeviceInfo *device = ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindCmpListData, dev); 100719e95205Sopenharmony_ci if (device != NULL) { 100819e95205Sopenharmony_ci AlarmCancel(device->aclAlarm); 100919e95205Sopenharmony_ci BTM_AclRelease(device->handle); 101019e95205Sopenharmony_ci } 101119e95205Sopenharmony_ci} 101219e95205Sopenharmony_ci 101319e95205Sopenharmony_civoid GapUseAclConnectionTimeoutTask(void *ctx) 101419e95205Sopenharmony_ci{ 101519e95205Sopenharmony_ci DeviceInfo *dev = ((GapGeneralPointerInfo *)ctx)->pointer; 101619e95205Sopenharmony_ci 101719e95205Sopenharmony_ci GapStopUseAclConnection(dev); 101819e95205Sopenharmony_ci} 101919e95205Sopenharmony_ci 102019e95205Sopenharmony_civoid GapUseAclConnectionTimeout(void *dev) 102119e95205Sopenharmony_ci{ 102219e95205Sopenharmony_ci LOG_INFO("%{public}s: ", __FUNCTION__); 102319e95205Sopenharmony_ci GapGeneralPointerInfo *ctx = MEM_MALLOC.alloc(sizeof(GapGeneralPointerInfo)); 102419e95205Sopenharmony_ci if (ctx == NULL) { 102519e95205Sopenharmony_ci LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__); 102619e95205Sopenharmony_ci return; 102719e95205Sopenharmony_ci } 102819e95205Sopenharmony_ci 102919e95205Sopenharmony_ci ctx->pointer = dev; 103019e95205Sopenharmony_ci 103119e95205Sopenharmony_ci int ret = GapRunTaskUnBlockProcess(GapUseAclConnectionTimeoutTask, ctx, NULL); 103219e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 103319e95205Sopenharmony_ci LOG_ERROR("%{public}s: Task error:%{public}d.", __FUNCTION__, ret); 103419e95205Sopenharmony_ci } 103519e95205Sopenharmony_ci} 103619e95205Sopenharmony_ci 103719e95205Sopenharmony_civoid GapStartUseAclConnection(DeviceInfo *device, uint64_t timeMs) 103819e95205Sopenharmony_ci{ 103919e95205Sopenharmony_ci if (device != NULL) { 104019e95205Sopenharmony_ci AlarmCancel(device->aclAlarm); 104119e95205Sopenharmony_ci BTM_AclAddRef(device->handle); 104219e95205Sopenharmony_ci AlarmSet(device->aclAlarm, timeMs, GapUseAclConnectionTimeout, device); 104319e95205Sopenharmony_ci } 104419e95205Sopenharmony_ci} 104519e95205Sopenharmony_ci 104619e95205Sopenharmony_ciint GAP_GetLocalExtendedOOBData(GapOOBData *oobData192, GapOOBData *oobData256) 104719e95205Sopenharmony_ci{ 104819e95205Sopenharmony_ci int ret = GAP_SUCCESS; 104919e95205Sopenharmony_ci 105019e95205Sopenharmony_ci (void)memcpy_s(oobData192, sizeof(GapOOBData), &g_gapMng.bredr.oobData192, sizeof(GapOOBData)); 105119e95205Sopenharmony_ci (void)memcpy_s(oobData256, sizeof(GapOOBData), &g_gapMng.bredr.oobData256, sizeof(GapOOBData)); 105219e95205Sopenharmony_ci 105319e95205Sopenharmony_ci return ret; 105419e95205Sopenharmony_ci} 105519e95205Sopenharmony_ci 105619e95205Sopenharmony_ciint GAP_GetLocalAddr(BtAddr *addr) 105719e95205Sopenharmony_ci{ 105819e95205Sopenharmony_ci LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr)); 105919e95205Sopenharmony_ci 106019e95205Sopenharmony_ci return BTM_GetLocalAddr(addr); 106119e95205Sopenharmony_ci} 106219e95205Sopenharmony_ci 106319e95205Sopenharmony_ciint GAP_SetLocalName(const char *name, int length) 106419e95205Sopenharmony_ci{ 106519e95205Sopenharmony_ci HciWriteLocalNameParam param = {0}; 106619e95205Sopenharmony_ci 106719e95205Sopenharmony_ci LOG_INFO("%{public}s: name:%{public}s", __FUNCTION__, name); 106819e95205Sopenharmony_ci 106919e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 107019e95205Sopenharmony_ci return GAP_ERR_NOT_ENABLE; 107119e95205Sopenharmony_ci } 107219e95205Sopenharmony_ci 107319e95205Sopenharmony_ci (void)memcpy_s(param.localName, sizeof(param.localName), name, length); 107419e95205Sopenharmony_ci return HCI_WriteLocalName(¶m); 107519e95205Sopenharmony_ci} 107619e95205Sopenharmony_ci 107719e95205Sopenharmony_ciint GAP_SetClassOfDevice(uint32_t cod) 107819e95205Sopenharmony_ci{ 107919e95205Sopenharmony_ci LOG_INFO("%{public}s: cmd:%06x", __FUNCTION__, cod); 108019e95205Sopenharmony_ci 108119e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 108219e95205Sopenharmony_ci return GAP_ERR_NOT_ENABLE; 108319e95205Sopenharmony_ci } 108419e95205Sopenharmony_ci 108519e95205Sopenharmony_ci g_gapMng.bredr.classOfDevice = cod; 108619e95205Sopenharmony_ci 108719e95205Sopenharmony_ci return GapWriteClassOfDevice(cod); 108819e95205Sopenharmony_ci} 108919e95205Sopenharmony_ci 109019e95205Sopenharmony_cistatic int GapWriteClassOfDevice(uint32_t cod) 109119e95205Sopenharmony_ci{ 109219e95205Sopenharmony_ci HciWriteClassofDeviceParam param = { 109319e95205Sopenharmony_ci .classofDevice = COD_UINT_TO_ARRAY(cod), 109419e95205Sopenharmony_ci }; 109519e95205Sopenharmony_ci 109619e95205Sopenharmony_ci return HCI_WriteClassofDevice(¶m); 109719e95205Sopenharmony_ci} 109819e95205Sopenharmony_ci 109919e95205Sopenharmony_civoid GapWriteClassOfDeviceComplete(const HciWriteClassofDeviceReturnParam *param) 110019e95205Sopenharmony_ci{ 110119e95205Sopenharmony_ci LOG_DEBUG("%{public}s:", __FUNCTION__); 110219e95205Sopenharmony_ci ScanModeBlock *scanModeBlock = NULL; 110319e95205Sopenharmony_ci GapSetScanModeResultCallback callback = NULL; 110419e95205Sopenharmony_ci uint8_t retStatus = param->status; 110519e95205Sopenharmony_ci 110619e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 110719e95205Sopenharmony_ci LOG_ERROR("%sNot Enable.", ""); 110819e95205Sopenharmony_ci return; 110919e95205Sopenharmony_ci } 111019e95205Sopenharmony_ci 111119e95205Sopenharmony_ci scanModeBlock = GapGetScanModeBlock(); 111219e95205Sopenharmony_ci if (scanModeBlock->status == GAP_SCANMODE_STATUS_SETTING) { 111319e95205Sopenharmony_ci if (retStatus == HCI_SUCCESS) { 111419e95205Sopenharmony_ci int ret; 111519e95205Sopenharmony_ci if (scanModeBlock->connectableMode.mode) { 111619e95205Sopenharmony_ci ret = GapWritePageScanActivity(); 111719e95205Sopenharmony_ci } else { 111819e95205Sopenharmony_ci ret = GapWriteScanEnable(); 111919e95205Sopenharmony_ci } 112019e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 112119e95205Sopenharmony_ci LOG_ERROR("HCI Command Error ret = %{public}d.", ret); 112219e95205Sopenharmony_ci retStatus = GAP_STATUS_FAILED; 112319e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 112419e95205Sopenharmony_ci callback = scanModeBlock->callback; 112519e95205Sopenharmony_ci } 112619e95205Sopenharmony_ci } else { 112719e95205Sopenharmony_ci scanModeBlock->status = GAP_SCANMODE_STATUS_IDLE; 112819e95205Sopenharmony_ci callback = scanModeBlock->callback; 112919e95205Sopenharmony_ci } 113019e95205Sopenharmony_ci } 113119e95205Sopenharmony_ci 113219e95205Sopenharmony_ci if (callback != NULL) { 113319e95205Sopenharmony_ci callback(retStatus, scanModeBlock->context); 113419e95205Sopenharmony_ci } 113519e95205Sopenharmony_ci} 113619e95205Sopenharmony_ci 113719e95205Sopenharmony_ciint GAP_SetExtendedInquiryResponse(const uint8_t eir[GAP_EIR_SIZE_MAX]) 113819e95205Sopenharmony_ci{ 113919e95205Sopenharmony_ci int ret; 114019e95205Sopenharmony_ci HciWriteExtendedInquiryResponseParam hciCmdParam; 114119e95205Sopenharmony_ci 114219e95205Sopenharmony_ci LOG_INFO("%{public}s:", __FUNCTION__); 114319e95205Sopenharmony_ci 114419e95205Sopenharmony_ci if (GapIsBredrEnable() == false) { 114519e95205Sopenharmony_ci return GAP_ERR_NOT_ENABLE; 114619e95205Sopenharmony_ci } 114719e95205Sopenharmony_ci 114819e95205Sopenharmony_ci (void)memcpy_s(hciCmdParam.extendInquiryRes, sizeof(hciCmdParam.extendInquiryRes), eir, GAP_EIR_SIZE_MAX); 114919e95205Sopenharmony_ci hciCmdParam.fecRequired = GAP_EIR_FEC_REQUIRED; 115019e95205Sopenharmony_ci 115119e95205Sopenharmony_ci ret = HCI_WriteExtendedInquiryResponse(&hciCmdParam); 115219e95205Sopenharmony_ci 115319e95205Sopenharmony_ci return ret; 115419e95205Sopenharmony_ci} 115519e95205Sopenharmony_ci 115619e95205Sopenharmony_civoid GapSetExtendedInquiryResponseComplete(const HciWriteExtendedInquiryResponseReturnParam *param) 115719e95205Sopenharmony_ci{ 115819e95205Sopenharmony_ci if (param->status) { 115919e95205Sopenharmony_ci LOG_WARN("%{public}s:", __FUNCTION__); 116019e95205Sopenharmony_ci } 116119e95205Sopenharmony_ci} 116219e95205Sopenharmony_ci 116319e95205Sopenharmony_cistatic DeviceInfo *GapAllocDeviceInfo(const BtAddr *addr, const uint16_t handle) 116419e95205Sopenharmony_ci{ 116519e95205Sopenharmony_ci DeviceInfo *deviceInfo = MEM_MALLOC.alloc(sizeof(DeviceInfo)); 116619e95205Sopenharmony_ci if (deviceInfo == NULL) { 116719e95205Sopenharmony_ci LOG_ERROR("%{public}s:malloc error.", __FUNCTION__); 116819e95205Sopenharmony_ci } else { 116919e95205Sopenharmony_ci (void)memset_s(deviceInfo, sizeof(DeviceInfo), 0x00, sizeof(DeviceInfo)); 117019e95205Sopenharmony_ci deviceInfo->addr = *addr; 117119e95205Sopenharmony_ci deviceInfo->handle = handle; 117219e95205Sopenharmony_ci deviceInfo->status = GAP_DEV_SEC_STATUS_IDLE; 117319e95205Sopenharmony_ci deviceInfo->authenticationStatus = GAP_AUTH_STATUS_IDLE; 117419e95205Sopenharmony_ci deviceInfo->encryptionStatus = GAP_ENC_STATUS_IDLE; 117519e95205Sopenharmony_ci deviceInfo->inDedicatedBonding = false; 117619e95205Sopenharmony_ci deviceInfo->linkkeyType = GAP_LINK_KEY_TYPE_UNKNOWN; 117719e95205Sopenharmony_ci deviceInfo->remoteAuthReq = AUTHENTICATION_UNKNOWN_MITM; 117819e95205Sopenharmony_ci deviceInfo->alarm = AlarmCreate("gapSec", false); 117919e95205Sopenharmony_ci deviceInfo->aclAlarm = AlarmCreate("gapAcl", false); 118019e95205Sopenharmony_ci } 118119e95205Sopenharmony_ci 118219e95205Sopenharmony_ci return deviceInfo; 118319e95205Sopenharmony_ci} 118419e95205Sopenharmony_ci 118519e95205Sopenharmony_civoid GapAclConnectionComplete(const BtmAclConnectCompleteParam *param, void *context) 118619e95205Sopenharmony_ci{ 118719e95205Sopenharmony_ci ConnectionInfoBlock *connectionInfoBlock = NULL; 118819e95205Sopenharmony_ci ProfileSecurityBlock *profileSecurityBlock = NULL; 118919e95205Sopenharmony_ci DeviceInfo *deviceInfo = NULL; 119019e95205Sopenharmony_ci RequestSecInfo *reqInfo = NULL; 119119e95205Sopenharmony_ci connectionInfoBlock = GapGetConnectionInfoBlock(); 119219e95205Sopenharmony_ci profileSecurityBlock = GapGetProfileSecurityBlock(); 119319e95205Sopenharmony_ci if (param->status == HCI_SUCCESS) { 119419e95205Sopenharmony_ci deviceInfo = GapAllocDeviceInfo(param->addr, param->connectionHandle); 119519e95205Sopenharmony_ci if (deviceInfo == NULL) { 119619e95205Sopenharmony_ci LOG_ERROR("%{public}s:malloc error.", __FUNCTION__); 119719e95205Sopenharmony_ci } else { 119819e95205Sopenharmony_ci ListAddFirst(connectionInfoBlock->devicelist, deviceInfo); 119919e95205Sopenharmony_ci GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_CONNECT_COMP, param->status); 120019e95205Sopenharmony_ci if (*GapGetSecurityMode() != SEC_MODE_2) { 120119e95205Sopenharmony_ci GapIsRemoteDeviceSupportHostSecureSimplePairingAsync(&deviceInfo->addr); 120219e95205Sopenharmony_ci } 120319e95205Sopenharmony_ci GapRequestSecurityProcess(); 120419e95205Sopenharmony_ci } 120519e95205Sopenharmony_ci } else { 120619e95205Sopenharmony_ci ListNode *node = ListGetFirstNode(profileSecurityBlock->requestlist); 120719e95205Sopenharmony_ci while (node != 0) { 120819e95205Sopenharmony_ci reqInfo = ListGetNodeData(node); 120919e95205Sopenharmony_ci node = ListGetNextNode(node); 121019e95205Sopenharmony_ci if (!GapAddrCompare(&reqInfo->addr, param->addr)) { 121119e95205Sopenharmony_ci continue; 121219e95205Sopenharmony_ci } 121319e95205Sopenharmony_ci if (BtmInteropIsMatchedAddr(INTEROP_AUTO_RETRY_PAIRING, param->addr)) { 121419e95205Sopenharmony_ci GapAuthenticationRetry(NULL, reqInfo, param->status); 121519e95205Sopenharmony_ci continue; 121619e95205Sopenharmony_ci } 121719e95205Sopenharmony_ci 121819e95205Sopenharmony_ci reqInfo->status = GAP_SEC_REQ_STATUS_FAILED; 121919e95205Sopenharmony_ci reqInfo->hciStatus = param->status; 122019e95205Sopenharmony_ci if (reqInfo->info.serviceId == GAP) { 122119e95205Sopenharmony_ci GapDoAuthenticationCallback(reqInfo); 122219e95205Sopenharmony_ci } 122319e95205Sopenharmony_ci if (!reqInfo->doCallback) { 122419e95205Sopenharmony_ci reqInfo->doCallback = true; 122519e95205Sopenharmony_ci GapDoSecurityCallback(reqInfo); 122619e95205Sopenharmony_ci } 122719e95205Sopenharmony_ci } 122819e95205Sopenharmony_ci } 122919e95205Sopenharmony_ci} 123019e95205Sopenharmony_ci 123119e95205Sopenharmony_civoid GapAclDisconnectionComplete(uint8_t status, uint16_t connectionHandle, uint8_t reason, void *context) 123219e95205Sopenharmony_ci{ 123319e95205Sopenharmony_ci ConnectionInfoBlock *connectionInfoBlock = NULL; 123419e95205Sopenharmony_ci if (status == HCI_SUCCESS) { 123519e95205Sopenharmony_ci DeviceInfo *info = NULL; 123619e95205Sopenharmony_ci connectionInfoBlock = GapGetConnectionInfoBlock(); 123719e95205Sopenharmony_ci info = ListForEachData( 123819e95205Sopenharmony_ci connectionInfoBlock->devicelist, GapFindConnectionDeviceByHandle, (void *)&connectionHandle); 123919e95205Sopenharmony_ci if (info != NULL) { 124019e95205Sopenharmony_ci GapUpdateSecurityRequest(info, GAP_SEC_EVENT_ACL_DISCONNECT, reason); 124119e95205Sopenharmony_ci GapRequestSecurityProcess(); 124219e95205Sopenharmony_ci 124319e95205Sopenharmony_ci ListRemoveNode(connectionInfoBlock->devicelist, info); 124419e95205Sopenharmony_ci } 124519e95205Sopenharmony_ci } 124619e95205Sopenharmony_ci} 124719e95205Sopenharmony_ci 124819e95205Sopenharmony_ci#endif 124919e95205Sopenharmony_ci 125019e95205Sopenharmony_ci#ifdef GAP_LE_SUPPORT 125119e95205Sopenharmony_ci 125219e95205Sopenharmony_cibool GapAddrIsResolvablePrivateAddress(const BtAddr *addr) 125319e95205Sopenharmony_ci{ 125419e95205Sopenharmony_ci return (addr->type == BT_RANDOM_DEVICE_ADDRESS) && (addr->addr[5] & 0x40) && !(addr->addr[5] & 0x80); 125519e95205Sopenharmony_ci} 125619e95205Sopenharmony_ci 125719e95205Sopenharmony_cibool GapAddrIsStaticAddress(const BtAddr *addr) 125819e95205Sopenharmony_ci{ 125919e95205Sopenharmony_ci return (addr->type == BT_RANDOM_DEVICE_ADDRESS) && (addr->addr[5] & 0x40) && (addr->addr[5] & 0x80); 126019e95205Sopenharmony_ci} 126119e95205Sopenharmony_ci 126219e95205Sopenharmony_cibool GapAddrIsPublicAddress(const BtAddr *addr) 126319e95205Sopenharmony_ci{ 126419e95205Sopenharmony_ci return addr->type == BT_PUBLIC_DEVICE_ADDRESS; 126519e95205Sopenharmony_ci} 126619e95205Sopenharmony_ci 126719e95205Sopenharmony_cibool GapAddrIsIdentityAddress(const BtAddr *addr) 126819e95205Sopenharmony_ci{ 126919e95205Sopenharmony_ci return addr->type == BT_PUBLIC_IDENTITY_ADDRESS || addr->type == BT_RANDOM_IDENTITY_ADDRESS; 127019e95205Sopenharmony_ci} 127119e95205Sopenharmony_ci 127219e95205Sopenharmony_cibool GapFindLeConnectionDeviceByAddr(void *nodeData, void *param) 127319e95205Sopenharmony_ci{ 127419e95205Sopenharmony_ci LeDeviceInfo *deviceInfo = nodeData; 127519e95205Sopenharmony_ci BtAddr *addr = param; 127619e95205Sopenharmony_ci 127719e95205Sopenharmony_ci return GapAddrCompare(&deviceInfo->addr, addr); 127819e95205Sopenharmony_ci} 127919e95205Sopenharmony_ci 128019e95205Sopenharmony_cibool GapFindLeConnectionDeviceByHandle(void *nodeData, void *param) 128119e95205Sopenharmony_ci{ 128219e95205Sopenharmony_ci LeDeviceInfo *deviceInfo = nodeData; 128319e95205Sopenharmony_ci uint16_t *handle = (uint16_t *)param; 128419e95205Sopenharmony_ci 128519e95205Sopenharmony_ci return deviceInfo->handle == *handle; 128619e95205Sopenharmony_ci} 128719e95205Sopenharmony_ci 128819e95205Sopenharmony_ciint GAP_LeSetRole(uint8_t role) 128919e95205Sopenharmony_ci{ 129019e95205Sopenharmony_ci LOG_INFO("%{public}s: role[%02x]", __FUNCTION__, role); 129119e95205Sopenharmony_ci 129219e95205Sopenharmony_ci if (GapIsLeEnable() == false) { 129319e95205Sopenharmony_ci return GAP_ERR_NOT_ENABLE; 129419e95205Sopenharmony_ci } 129519e95205Sopenharmony_ci 129619e95205Sopenharmony_ci g_gapMng.le.local.role = role; 129719e95205Sopenharmony_ci if (GapLeRolesCheck(GAP_LE_ROLE_PREIPHERAL | GAP_LE_ROLE_CENTRAL) == true) { 129819e95205Sopenharmony_ci BtmKey key; 129919e95205Sopenharmony_ci BTM_GetLocalIdentityResolvingKey(&key); 130019e95205Sopenharmony_ci SMP_SetIRK(key.key); 130119e95205Sopenharmony_ci SMP_SetIdentAddr(&g_gapMng.le.local.addr); 130219e95205Sopenharmony_ci } 130319e95205Sopenharmony_ci 130419e95205Sopenharmony_ci return GAP_SUCCESS; 130519e95205Sopenharmony_ci} 130619e95205Sopenharmony_ci 130719e95205Sopenharmony_ciint GAP_LeSetStaticIdentityAddr(uint8_t addr[BT_ADDRESS_SIZE]) 130819e95205Sopenharmony_ci{ 130919e95205Sopenharmony_ci int ret; 131019e95205Sopenharmony_ci LeLocalInfo *localInfo = NULL; 131119e95205Sopenharmony_ci 131219e95205Sopenharmony_ci LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr)); 131319e95205Sopenharmony_ci 131419e95205Sopenharmony_ci if (GapIsLeEnable() == false) { 131519e95205Sopenharmony_ci return GAP_ERR_NOT_ENABLE; 131619e95205Sopenharmony_ci } 131719e95205Sopenharmony_ci 131819e95205Sopenharmony_ci localInfo = GapGetLeLocalInfo(); 131919e95205Sopenharmony_ci if (localInfo->addr.type == BT_PUBLIC_DEVICE_ADDRESS) { 132019e95205Sopenharmony_ci LOG_WARN("%{public}s: have public address " BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(localInfo->addr.addr)); 132119e95205Sopenharmony_ci localInfo->addr.type = BT_RANDOM_DEVICE_ADDRESS; 132219e95205Sopenharmony_ci } 132319e95205Sopenharmony_ci (void)memcpy_s(localInfo->addr.addr, BT_ADDRESS_SIZE, addr, BT_ADDRESS_SIZE); 132419e95205Sopenharmony_ci ret = SMP_SetIdentAddr(&localInfo->addr); 132519e95205Sopenharmony_ci 132619e95205Sopenharmony_ci return ret; 132719e95205Sopenharmony_ci} 132819e95205Sopenharmony_ci 132919e95205Sopenharmony_ciNO_SANITIZE("cfi") void GapGenerateRPAResult(uint8_t status, const uint8_t *addr) 133019e95205Sopenharmony_ci{ 133119e95205Sopenharmony_ci GenResPriAddrResult callback = NULL; 133219e95205Sopenharmony_ci void *context = NULL; 133319e95205Sopenharmony_ci 133419e95205Sopenharmony_ci if (GapGetLeRandomAddressBlock()->generationInfo.processing) { 133519e95205Sopenharmony_ci callback = GapGetLeRandomAddressBlock()->generationInfo.callback; 133619e95205Sopenharmony_ci context = GapGetLeRandomAddressBlock()->generationInfo.context; 133719e95205Sopenharmony_ci 133819e95205Sopenharmony_ci GapGetLeRandomAddressBlock()->generationInfo.processing = false; 133919e95205Sopenharmony_ci GapGetLeRandomAddressBlock()->generationInfo.callback = NULL; 134019e95205Sopenharmony_ci GapGetLeRandomAddressBlock()->generationInfo.context = NULL; 134119e95205Sopenharmony_ci } 134219e95205Sopenharmony_ci 134319e95205Sopenharmony_ci if (callback != NULL) { 134419e95205Sopenharmony_ci callback(status, addr, context); 134519e95205Sopenharmony_ci } 134619e95205Sopenharmony_ci} 134719e95205Sopenharmony_ci 134819e95205Sopenharmony_ciint GAP_LeGenResPriAddrAsync(GenResPriAddrResult callback, void *context) 134919e95205Sopenharmony_ci{ 135019e95205Sopenharmony_ci LOG_INFO("%{public}s:", __FUNCTION__); 135119e95205Sopenharmony_ci int ret; 135219e95205Sopenharmony_ci 135319e95205Sopenharmony_ci BtmKey localIRK = {0}; 135419e95205Sopenharmony_ci 135519e95205Sopenharmony_ci ret = BTM_GetLocalIdentityResolvingKey(&localIRK); 135619e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 135719e95205Sopenharmony_ci return ret; 135819e95205Sopenharmony_ci } 135919e95205Sopenharmony_ci 136019e95205Sopenharmony_ci ret = SMP_GenerateRPA(localIRK.key); 136119e95205Sopenharmony_ci if (ret != BT_SUCCESS) { 136219e95205Sopenharmony_ci return ret; 136319e95205Sopenharmony_ci } 136419e95205Sopenharmony_ci 136519e95205Sopenharmony_ci if (GapGetLeRandomAddressBlock()->generationInfo.processing == false) { 136619e95205Sopenharmony_ci GapGetLeRandomAddressBlock()->generationInfo.callback = callback; 136719e95205Sopenharmony_ci GapGetLeRandomAddressBlock()->generationInfo.context = context; 136819e95205Sopenharmony_ci GapGetLeRandomAddressBlock()->generationInfo.processing = true; 136919e95205Sopenharmony_ci } else { 137019e95205Sopenharmony_ci ret = GAP_ERR_INVAL_STATE; 137119e95205Sopenharmony_ci } 137219e95205Sopenharmony_ci 137319e95205Sopenharmony_ci return ret; 137419e95205Sopenharmony_ci} 137519e95205Sopenharmony_ci 137619e95205Sopenharmony_ci#endif 137719e95205Sopenharmony_ci 137819e95205Sopenharmony_ciModule g_gap = { 137919e95205Sopenharmony_ci .name = MODULE_NAME_GAP, 138019e95205Sopenharmony_ci .init = GapInitialize, 138119e95205Sopenharmony_ci .startup = GapEnable, 138219e95205Sopenharmony_ci .shutdown = GapDisable, 138319e95205Sopenharmony_ci .cleanup = GapFinalize, 138419e95205Sopenharmony_ci .dependencies = {MODULE_NAME_HCI, MODULE_NAME_L2CAP, MODULE_NAME_SMP}, 138519e95205Sopenharmony_ci}; 138619e95205Sopenharmony_ci 138719e95205Sopenharmony_ciMODULE_DECL(g_gap) 1388