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(&param);
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, &regInfo->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(&regInfo->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, &regInfo->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(&param);
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(&param);
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