mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-31 19:24:33 +02:00
Merge branch 'bugfix/fix_some_ble_bugs_cjh_v5.3' into 'release/v5.3'
Fixed some BLE bugs 240812 (backport v5.3) See merge request espressif/esp-idf!32792
This commit is contained in:
@@ -46,6 +46,7 @@
|
|||||||
#define OSI_INITIAL_TRACE_LEVEL UC_BT_LOG_OSI_TRACE_LEVEL
|
#define OSI_INITIAL_TRACE_LEVEL UC_BT_LOG_OSI_TRACE_LEVEL
|
||||||
#define BLUFI_INITIAL_TRACE_LEVEL UC_BT_LOG_BLUFI_TRACE_LEVEL
|
#define BLUFI_INITIAL_TRACE_LEVEL UC_BT_LOG_BLUFI_TRACE_LEVEL
|
||||||
|
|
||||||
|
// MEMORY
|
||||||
#if UC_BT_BLE_DYNAMIC_ENV_MEMORY
|
#if UC_BT_BLE_DYNAMIC_ENV_MEMORY
|
||||||
#define BT_BLE_DYNAMIC_ENV_MEMORY TRUE
|
#define BT_BLE_DYNAMIC_ENV_MEMORY TRUE
|
||||||
#define BTC_DYNAMIC_MEMORY TRUE
|
#define BTC_DYNAMIC_MEMORY TRUE
|
||||||
@@ -64,6 +65,19 @@
|
|||||||
#define BT_BLE_DYNAMIC_ENV_MEMORY FALSE
|
#define BT_BLE_DYNAMIC_ENV_MEMORY FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if UC_HEAP_ALLOCATION_FROM_SPIRAM_FIRST
|
||||||
|
#define HEAP_ALLOCATION_FROM_SPIRAM_FIRST TRUE
|
||||||
|
#else
|
||||||
|
#define HEAP_ALLOCATION_FROM_SPIRAM_FIRST FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if UC_BT_ABORT_WHEN_ALLOCATION_FAILS
|
||||||
|
#define HEAP_ALLOCATION_FAILS_ABORT TRUE
|
||||||
|
#else
|
||||||
|
#define HEAP_ALLOCATION_FAILS_ABORT FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// HCI LOG
|
||||||
#if UC_BT_HCI_LOG_DEBUG_EN
|
#if UC_BT_HCI_LOG_DEBUG_EN
|
||||||
#define BT_HCI_LOG_INCLUDED UC_BT_HCI_LOG_DEBUG_EN
|
#define BT_HCI_LOG_INCLUDED UC_BT_HCI_LOG_DEBUG_EN
|
||||||
#else
|
#else
|
||||||
|
@@ -100,13 +100,26 @@
|
|||||||
#define UC_BT_BLUFI_ENABLE FALSE
|
#define UC_BT_BLUFI_ENABLE FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//MEMORY DEBUG
|
//MEMORY
|
||||||
#ifdef CONFIG_BT_BLUEDROID_MEM_DEBUG
|
#ifdef CONFIG_BT_BLUEDROID_MEM_DEBUG
|
||||||
#define UC_BT_BLUEDROID_MEM_DEBUG TRUE
|
#define UC_BT_BLUEDROID_MEM_DEBUG TRUE
|
||||||
#else
|
#else
|
||||||
#define UC_BT_BLUEDROID_MEM_DEBUG FALSE
|
#define UC_BT_BLUEDROID_MEM_DEBUG FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST
|
||||||
|
#define UC_HEAP_ALLOCATION_FROM_SPIRAM_FIRST CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST
|
||||||
|
#else
|
||||||
|
#define UC_HEAP_ALLOCATION_FROM_SPIRAM_FIRST FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BT_ABORT_WHEN_ALLOCATION_FAILS
|
||||||
|
#define UC_BT_ABORT_WHEN_ALLOCATION_FAILS CONFIG_BT_ABORT_WHEN_ALLOCATION_FAILS
|
||||||
|
#else
|
||||||
|
#define UC_BT_ABORT_WHEN_ALLOCATION_FAILS FALSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//HCI LOG
|
||||||
#ifdef CONFIG_BT_HCI_LOG_DEBUG_EN
|
#ifdef CONFIG_BT_HCI_LOG_DEBUG_EN
|
||||||
#define UC_BT_HCI_LOG_DEBUG_EN TRUE
|
#define UC_BT_HCI_LOG_DEBUG_EN TRUE
|
||||||
#else
|
#else
|
||||||
|
@@ -213,48 +213,33 @@ char *osi_strdup(const char *str)
|
|||||||
|
|
||||||
void *osi_malloc_func(size_t size)
|
void *osi_malloc_func(size_t size)
|
||||||
{
|
{
|
||||||
#if HEAP_MEMORY_DEBUG
|
void *p = osi_malloc_base(size);
|
||||||
void *p;
|
|
||||||
#if HEAP_ALLOCATION_FROM_SPIRAM_FIRST
|
if (size != 0 && p == NULL) {
|
||||||
p = heap_caps_malloc_prefer(size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL);
|
OSI_TRACE_ERROR("malloc failed (caller=%p size=%u)\n", __builtin_return_address(0), size);
|
||||||
#else
|
#if HEAP_ALLOCATION_FAILS_ABORT
|
||||||
p = malloc(size);
|
assert(0);
|
||||||
#endif /* #if HEAP_ALLOCATION_FROM_SPIRAM_FIRST */
|
#endif
|
||||||
osi_mem_dbg_record(p, size, __func__, __LINE__);
|
}
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
#else
|
|
||||||
#if HEAP_ALLOCATION_FROM_SPIRAM_FIRST
|
|
||||||
return heap_caps_malloc_prefer(size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL);
|
|
||||||
#else
|
|
||||||
return malloc(size);
|
|
||||||
#endif /* #if HEAP_ALLOCATION_FROM_SPIRAM_FIRST */
|
|
||||||
#endif /* #if HEAP_MEMORY_DEBUG */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *osi_calloc_func(size_t size)
|
void *osi_calloc_func(size_t size)
|
||||||
{
|
{
|
||||||
#if HEAP_MEMORY_DEBUG
|
void *p = osi_calloc_base(size);
|
||||||
void *p;
|
|
||||||
#if HEAP_ALLOCATION_FROM_SPIRAM_FIRST
|
if (size != 0 && p == NULL) {
|
||||||
p = heap_caps_calloc_prefer(1, size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL);
|
OSI_TRACE_ERROR("calloc failed (caller=%p size=%u)\n", __builtin_return_address(0), size);
|
||||||
#else
|
#if HEAP_ALLOCATION_FAILS_ABORT
|
||||||
p = calloc(1, size);
|
assert(0);
|
||||||
#endif /* #if HEAP_ALLOCATION_FROM_SPIRAM_FIRST */
|
#endif
|
||||||
osi_mem_dbg_record(p, size, __func__, __LINE__);
|
}
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
#else
|
|
||||||
#if HEAP_ALLOCATION_FROM_SPIRAM_FIRST
|
|
||||||
return heap_caps_calloc_prefer(1, size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL);
|
|
||||||
#else
|
|
||||||
return calloc(1, size);
|
|
||||||
#endif /* #if HEAP_ALLOCATION_FROM_SPIRAM_FIRST */
|
|
||||||
#endif /* #if HEAP_MEMORY_DEBUG */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void osi_free_func(void *ptr)
|
void osi_free_func(void *ptr)
|
||||||
{
|
{
|
||||||
#if HEAP_MEMORY_DEBUG
|
|
||||||
osi_mem_dbg_clean(ptr, __func__, __LINE__);
|
|
||||||
#endif
|
|
||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
|
@@ -122,13 +122,18 @@ do { \
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
// Memory alloc function without print and assertion
|
||||||
#if HEAP_ALLOCATION_FROM_SPIRAM_FIRST
|
#if HEAP_ALLOCATION_FROM_SPIRAM_FIRST
|
||||||
#define osi_malloc(size) heap_caps_malloc_prefer(size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL)
|
#define osi_malloc_base(size) heap_caps_malloc_prefer(size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL)
|
||||||
#define osi_calloc(size) heap_caps_calloc_prefer(1, size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL)
|
#define osi_calloc_base(size) heap_caps_calloc_prefer(1, size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL)
|
||||||
#else
|
#else
|
||||||
#define osi_malloc(size) malloc((size))
|
#define osi_malloc_base(size) malloc((size))
|
||||||
#define osi_calloc(size) calloc(1, (size))
|
#define osi_calloc_base(size) calloc(1, (size))
|
||||||
#endif /* #if HEAP_ALLOCATION_FROM_SPIRAM_FIRST */
|
#endif /* #if HEAP_ALLOCATION_FROM_SPIRAM_FIRST */
|
||||||
|
|
||||||
|
// Memory alloc function with print and assertion when fails
|
||||||
|
#define osi_malloc(size) osi_malloc_func((size))
|
||||||
|
#define osi_calloc(size) osi_calloc_func((size))
|
||||||
#define osi_free(p) free((p))
|
#define osi_free(p) free((p))
|
||||||
|
|
||||||
#endif /* HEAP_MEMORY_DEBUG */
|
#endif /* HEAP_MEMORY_DEBUG */
|
||||||
|
@@ -271,10 +271,10 @@ _err:
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < thread->work_queue_num; i++) {
|
for (int i = 0; i < thread->work_queue_num; i++) {
|
||||||
if (thread->work_queues[i]) {
|
if (thread->work_queues && thread->work_queues[i]) {
|
||||||
osi_work_queue_delete(thread->work_queues[i]);
|
osi_work_queue_delete(thread->work_queues[i]);
|
||||||
|
thread->work_queues[i] = NULL;
|
||||||
}
|
}
|
||||||
thread->work_queues[i] = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thread->work_queues) {
|
if (thread->work_queues) {
|
||||||
|
@@ -1223,3 +1223,10 @@ config BT_BLE_HIGH_DUTY_ADV_INTERVAL
|
|||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
This enable BLE high duty advertising interval feature
|
This enable BLE high duty advertising interval feature
|
||||||
|
|
||||||
|
config BT_ABORT_WHEN_ALLOCATION_FAILS
|
||||||
|
bool "Abort when memory allocation fails in BT/BLE stack"
|
||||||
|
depends on BT_BLUEDROID_ENABLED
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
This enables abort when memory allocation fails
|
||||||
|
@@ -110,6 +110,14 @@ typedef enum {
|
|||||||
ESP_BT_STATUS_HCI_CONN_TOUT_DUE_TO_MIC_FAILURE,
|
ESP_BT_STATUS_HCI_CONN_TOUT_DUE_TO_MIC_FAILURE,
|
||||||
ESP_BT_STATUS_HCI_CONN_FAILED_ESTABLISHMENT,
|
ESP_BT_STATUS_HCI_CONN_FAILED_ESTABLISHMENT,
|
||||||
ESP_BT_STATUS_HCI_MAC_CONNECTION_FAILED,
|
ESP_BT_STATUS_HCI_MAC_CONNECTION_FAILED,
|
||||||
|
ESP_BT_STATUS_HCI_CCA_REJECTED,
|
||||||
|
ESP_BT_STATUS_HCI_TYPE0_SUBMAP_NOT_DEFINED,
|
||||||
|
ESP_BT_STATUS_HCI_UNKNOWN_ADV_ID,
|
||||||
|
ESP_BT_STATUS_HCI_LIMIT_REACHED,
|
||||||
|
ESP_BT_STATUS_HCI_OPT_CANCEL_BY_HOST,
|
||||||
|
ESP_BT_STATUS_HCI_PKT_TOO_LONG,
|
||||||
|
ESP_BT_STATUS_HCI_TOO_LATE,
|
||||||
|
ESP_BT_STATUS_HCI_TOO_EARLY,
|
||||||
} esp_bt_status_t;
|
} esp_bt_status_t;
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -352,7 +352,7 @@ esp_bt_status_t btc_hci_to_esp_status(uint8_t hci_status)
|
|||||||
esp_bt_status_t btc_btm_status_to_esp_status (uint8_t btm_status)
|
esp_bt_status_t btc_btm_status_to_esp_status (uint8_t btm_status)
|
||||||
{
|
{
|
||||||
esp_bt_status_t esp_status = ESP_BT_STATUS_FAIL;
|
esp_bt_status_t esp_status = ESP_BT_STATUS_FAIL;
|
||||||
switch(btm_status){
|
switch(btm_status) {
|
||||||
case BTM_SUCCESS:
|
case BTM_SUCCESS:
|
||||||
esp_status = ESP_BT_STATUS_SUCCESS;
|
esp_status = ESP_BT_STATUS_SUCCESS;
|
||||||
break;
|
break;
|
||||||
@@ -381,7 +381,11 @@ esp_bt_status_t btc_btm_status_to_esp_status (uint8_t btm_status)
|
|||||||
esp_status = ESP_BT_STATUS_FAIL;
|
esp_status = ESP_BT_STATUS_FAIL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
esp_status = ESP_BT_STATUS_FAIL;
|
if (btm_status & BTM_HCI_ERROR) {
|
||||||
|
esp_status = ESP_BT_STATUS_BASE_FOR_HCI_ERR | (btm_status & 0x7F);
|
||||||
|
} else {
|
||||||
|
esp_status = ESP_BT_STATUS_FAIL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -381,20 +381,6 @@
|
|||||||
* Memory reference
|
* Memory reference
|
||||||
**********************************************************/
|
**********************************************************/
|
||||||
|
|
||||||
//MEMORY ALLOCATOR
|
|
||||||
#ifdef CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST
|
|
||||||
#define UC_HEAP_ALLOCATION_FROM_SPIRAM_FIRST CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST
|
|
||||||
#else
|
|
||||||
#define UC_HEAP_ALLOCATION_FROM_SPIRAM_FIRST FALSE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//MEMORY DEBUG
|
|
||||||
#ifdef CONFIG_BT_BLUEDROID_MEM_DEBUG
|
|
||||||
#define UC_BT_BLUEDROID_MEM_DEBUG CONFIG_BT_BLUEDROID_MEM_DEBUG
|
|
||||||
#else
|
|
||||||
#define UC_BT_BLUEDROID_MEM_DEBUG FALSE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//ESP COEXIST VSC
|
//ESP COEXIST VSC
|
||||||
#ifdef CONFIG_BT_BLUEDROID_ESP_COEX_VSC
|
#ifdef CONFIG_BT_BLUEDROID_ESP_COEX_VSC
|
||||||
#define UC_BT_BLUEDROID_ESP_COEX_VSC CONFIG_BT_BLUEDROID_ESP_COEX_VSC
|
#define UC_BT_BLUEDROID_ESP_COEX_VSC CONFIG_BT_BLUEDROID_ESP_COEX_VSC
|
||||||
|
@@ -2378,12 +2378,6 @@ The maximum number of payload octets that the local device can receive in a sing
|
|||||||
#define BTSNOOP_MEM FALSE
|
#define BTSNOOP_MEM FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UC_HEAP_ALLOCATION_FROM_SPIRAM_FIRST
|
|
||||||
#define HEAP_ALLOCATION_FROM_SPIRAM_FIRST TRUE
|
|
||||||
#else
|
|
||||||
#define HEAP_ALLOCATION_FROM_SPIRAM_FIRST FALSE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "common/bt_trace.h"
|
#include "common/bt_trace.h"
|
||||||
|
|
||||||
#endif /* BT_TARGET_H */
|
#endif /* BT_TARGET_H */
|
||||||
|
@@ -593,7 +593,7 @@ static int host_recv_pkt_cb(uint8_t *data, uint16_t len)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
pkt_size = BT_PKT_LINKED_HDR_SIZE + BT_HDR_SIZE + len;
|
pkt_size = BT_PKT_LINKED_HDR_SIZE + BT_HDR_SIZE + len;
|
||||||
linked_pkt = (pkt_linked_item_t *) osi_calloc(pkt_size);
|
linked_pkt = (pkt_linked_item_t *) osi_calloc_base(pkt_size);
|
||||||
if (!linked_pkt) {
|
if (!linked_pkt) {
|
||||||
#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE)
|
#if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE)
|
||||||
hci_adv_credits_consumed(1);
|
hci_adv_credits_consumed(1);
|
||||||
|
@@ -2148,7 +2148,7 @@ void btm_ble_create_ll_conn_complete (UINT8 status)
|
|||||||
tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(l2cb.ble_connecting_bda, BT_TRANSPORT_LE);
|
tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(l2cb.ble_connecting_bda, BT_TRANSPORT_LE);
|
||||||
/* Do not remove lcb if an LE link is already up as a peripheral */
|
/* Do not remove lcb if an LE link is already up as a peripheral */
|
||||||
if (p_lcb != NULL &&
|
if (p_lcb != NULL &&
|
||||||
!(p_lcb->link_role == HCI_ROLE_SLAVE && BTM_ACL_IS_CONNECTED(l2cb.ble_connecting_bda))) {
|
!(p_lcb->link_role == HCI_ROLE_SLAVE && BTM_LE_ACL_IS_CONNECTED(l2cb.ble_connecting_bda))) {
|
||||||
p_lcb->disc_reason = L2CAP_CONN_CANCEL;
|
p_lcb->disc_reason = L2CAP_CONN_CANCEL;
|
||||||
l2cu_release_lcb (p_lcb);
|
l2cu_release_lcb (p_lcb);
|
||||||
}
|
}
|
||||||
|
@@ -249,10 +249,10 @@ tBTM_STATUS BTM_BleSetPreferDefaultPhy(UINT8 tx_phy_mask, UINT8 rx_phy_mask)
|
|||||||
if ((err = btsnd_hcic_ble_set_prefered_default_phy(all_phys, tx_phy_mask, rx_phy_mask)) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_set_prefered_default_phy(all_phys, tx_phy_mask, rx_phy_mask)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("%s, fail to send the hci command, the error code = %s(0x%x)",
|
BTM_TRACE_ERROR("%s, fail to send the hci command, the error code = %s(0x%x)",
|
||||||
__func__, btm_ble_hci_status_to_str(err), err);
|
__func__, btm_ble_hci_status_to_str(err), err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
cb_params.set_perf_def_phy.status = err;
|
cb_params.set_perf_def_phy.status = status;
|
||||||
|
|
||||||
BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_DEFAULT_PHY_COMPLETE_EVT, &cb_params);
|
BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_DEFAULT_PHY_COMPLETE_EVT, &cb_params);
|
||||||
|
|
||||||
@@ -330,7 +330,7 @@ tBTM_STATUS BTM_BleSetExtendedAdvRandaddr(UINT8 instance, BD_ADDR rand_addr)
|
|||||||
if((err = btsnd_hcic_ble_set_extend_rand_address(instance, rand_addr)) != HCI_SUCCESS) {
|
if((err = btsnd_hcic_ble_set_extend_rand_address(instance, rand_addr)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("%s, fail to send the hci command, the error code = %s(0x%x)",
|
BTM_TRACE_ERROR("%s, fail to send the hci command, the error code = %s(0x%x)",
|
||||||
__func__, btm_ble_hci_status_to_str(err), err);
|
__func__, btm_ble_hci_status_to_str(err), err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
} else {
|
} else {
|
||||||
// set random address success, update address info
|
// set random address success, update address info
|
||||||
if(extend_adv_cb.inst[instance].configured && extend_adv_cb.inst[instance].connetable) {
|
if(extend_adv_cb.inst[instance].configured && extend_adv_cb.inst[instance].connetable) {
|
||||||
@@ -403,7 +403,7 @@ tBTM_STATUS BTM_BleSetExtendedAdvParams(UINT8 instance, tBTM_BLE_GAP_EXT_ADV_PAR
|
|||||||
params->primary_phy, params->max_skip,
|
params->primary_phy, params->max_skip,
|
||||||
params->secondary_phy, params->sid, params->scan_req_notif)) != HCI_SUCCESS) {
|
params->secondary_phy, params->sid, params->scan_req_notif)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE EA SetParams: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE EA SetParams: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -414,7 +414,7 @@ end:
|
|||||||
// update RPA address
|
// update RPA address
|
||||||
if((err = btsnd_hcic_ble_set_extend_rand_address(instance, rand_addr)) != HCI_SUCCESS) {
|
if((err = btsnd_hcic_ble_set_extend_rand_address(instance, rand_addr)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE EA SetParams: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE EA SetParams: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
} else {
|
} else {
|
||||||
// set addr success, update address info
|
// set addr success, update address info
|
||||||
BTM_UpdateAddrInfor(BLE_ADDR_RANDOM, rand_addr);
|
BTM_UpdateAddrInfor(BLE_ADDR_RANDOM, rand_addr);
|
||||||
@@ -452,23 +452,25 @@ tBTM_STATUS BTM_BleConfigExtendedAdvDataRaw(BOOLEAN is_scan_rsp, UINT8 instance,
|
|||||||
} else if (rem_len <= BTM_BLE_EXT_ADV_DATA_LEN_MAX) {
|
} else if (rem_len <= BTM_BLE_EXT_ADV_DATA_LEN_MAX) {
|
||||||
operation = BTM_BLE_ADV_DATA_OP_LAST_FRAG;
|
operation = BTM_BLE_ADV_DATA_OP_LAST_FRAG;
|
||||||
} else {
|
} else {
|
||||||
operation = BTM_BLE_ADV_DATA_OP_INTERMEDIATE_FRAG;
|
operation = BTM_BLE_ADV_DATA_OP_INTERMEDIATE_FRAG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!is_scan_rsp) {
|
if (!is_scan_rsp) {
|
||||||
if ((err = btsnd_hcic_ble_set_ext_adv_data(instance, operation, 0, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_set_ext_adv_data(instance, operation, 0, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE EA SetAdvData: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE EA SetAdvData: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((err = btsnd_hcic_ble_set_ext_adv_scan_rsp_data(instance, operation, 0, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_set_ext_adv_scan_rsp_data(instance, operation, 0, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE EA SetScanRspData: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE EA SetScanRspData: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rem_len -= send_data_len;
|
rem_len -= send_data_len;
|
||||||
data_offset += send_data_len;
|
data_offset += send_data_len;
|
||||||
} while (rem_len);
|
} while (rem_len);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@@ -522,7 +524,7 @@ tBTM_STATUS BTM_BleStartExtAdv(BOOLEAN enable, UINT8 num, tBTM_BLE_EXT_ADV *ext_
|
|||||||
if ((err = btsnd_hcic_ble_ext_adv_enable(enable, num, instance,
|
if ((err = btsnd_hcic_ble_ext_adv_enable(enable, num, instance,
|
||||||
duration, max_events)) != HCI_SUCCESS) {
|
duration, max_events)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE EA En=%d: cmd err=0x%x", enable, err);
|
BTM_TRACE_ERROR("LE EA En=%d: cmd err=0x%x", enable, err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
osi_free(instance);
|
osi_free(instance);
|
||||||
@@ -533,7 +535,7 @@ tBTM_STATUS BTM_BleStartExtAdv(BOOLEAN enable, UINT8 num, tBTM_BLE_EXT_ADV *ext_
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_ext_adv_enable(enable, num, NULL, NULL, NULL)) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_ext_adv_enable(enable, num, NULL, NULL, NULL)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE EA En=%d: cmd err=0x%x", enable, err);
|
BTM_TRACE_ERROR("LE EA En=%d: cmd err=0x%x", enable, err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
@@ -631,7 +633,7 @@ tBTM_STATUS BTM_BleExtAdvSetRemove(UINT8 instance)
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_remove_adv_set(instance)) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_remove_adv_set(instance)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE EAS Rm: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE EAS Rm: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
} else {
|
} else {
|
||||||
extend_adv_cb.inst[instance].configured = false;
|
extend_adv_cb.inst[instance].configured = false;
|
||||||
extend_adv_cb.inst[instance].legacy_pdu = false;
|
extend_adv_cb.inst[instance].legacy_pdu = false;
|
||||||
@@ -659,7 +661,7 @@ tBTM_STATUS BTM_BleExtAdvSetClear(void)
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_clear_adv_set()) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_clear_adv_set()) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE EAS Clr: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE EAS Clr: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
} else {
|
} else {
|
||||||
for (uint8_t i = 0; i < MAX_BLE_ADV_INSTANCE; i++) {
|
for (uint8_t i = 0; i < MAX_BLE_ADV_INSTANCE; i++) {
|
||||||
extend_adv_cb.inst[i].configured = false;
|
extend_adv_cb.inst[i].configured = false;
|
||||||
@@ -703,7 +705,7 @@ tBTM_STATUS BTM_BlePeriodicAdvSetParams(UINT8 instance, tBTM_BLE_Periodic_Adv_Pa
|
|||||||
if ((err= btsnd_hcic_ble_set_periodic_adv_params(instance, params->interval_min,
|
if ((err= btsnd_hcic_ble_set_periodic_adv_params(instance, params->interval_min,
|
||||||
params->interval_max, params->properties)) != HCI_SUCCESS) {
|
params->interval_max, params->properties)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE PA SetParams: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE PA SetParams: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@@ -756,10 +758,12 @@ tBTM_STATUS BTM_BlePeriodicAdvCfgDataRaw(UINT8 instance, UINT16 len, UINT8 *data
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_set_periodic_adv_data(instance, operation, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_set_periodic_adv_data(instance, operation, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE PA SetData: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE PA SetData: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
rem_len -= send_data_len;
|
rem_len -= send_data_len;
|
||||||
data_offset += send_data_len;
|
data_offset += send_data_len;
|
||||||
} while(rem_len);
|
} while(rem_len);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@@ -785,7 +789,7 @@ tBTM_STATUS BTM_BlePeriodicAdvEnable(UINT8 instance, UINT8 enable)
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_periodic_adv_enable(enable, instance)) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_periodic_adv_enable(enable, instance)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE PA En=%d: cmd err=0x%x", enable, err);
|
BTM_TRACE_ERROR("LE PA En=%d: cmd err=0x%x", enable, err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@@ -860,6 +864,7 @@ end:
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void btm_set_phy_callback(UINT8 status)
|
void btm_set_phy_callback(UINT8 status)
|
||||||
{
|
{
|
||||||
tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
|
tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
|
||||||
@@ -868,6 +873,7 @@ void btm_set_phy_callback(UINT8 status)
|
|||||||
BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_PHY_COMPLETE_EVT, &cb_params);
|
BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_PHY_COMPLETE_EVT, &cb_params);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void btm_create_sync_callback(UINT8 status)
|
void btm_create_sync_callback(UINT8 status)
|
||||||
{
|
{
|
||||||
tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
|
tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
|
||||||
@@ -903,7 +909,7 @@ tBTM_STATUS BTM_BlePeriodicAdvSyncCancel(void)
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_periodic_adv_create_sync_cancel()) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_periodic_adv_create_sync_cancel()) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE PA SyncCancel, cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE PA SyncCancel, cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
cb_params.status = status;
|
cb_params.status = status;
|
||||||
@@ -921,7 +927,7 @@ tBTM_STATUS BTM_BlePeriodicAdvSyncTerm(UINT16 sync_handle)
|
|||||||
|
|
||||||
if (( err = btsnd_hcic_ble_periodic_adv_term_sync(sync_handle)) != HCI_SUCCESS) {
|
if (( err = btsnd_hcic_ble_periodic_adv_term_sync(sync_handle)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE PA SyncTerm: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE PA SyncTerm: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
cb_params.status = status;
|
cb_params.status = status;
|
||||||
@@ -945,7 +951,7 @@ tBTM_STATUS BTM_BlePeriodicAdvAddDevToList(tBLE_ADDR_TYPE addr_type, BD_ADDR add
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_add_dev_to_periodic_adv_list(addr_type, addr, sid)) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_add_dev_to_periodic_adv_list(addr_type, addr, sid)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE PA AddDevToList: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE PA AddDevToList: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@@ -969,7 +975,7 @@ tBTM_STATUS BTM_BlePeriodicAdvRemoveDevFromList(tBLE_ADDR_TYPE addr_type, BD_ADD
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_rm_dev_from_periodic_adv_list(addr_type, addr, sid)) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_rm_dev_from_periodic_adv_list(addr_type, addr, sid)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE PA RmDevFromList: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE PA RmDevFromList: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@@ -987,7 +993,7 @@ tBTM_STATUS BTM_BlePeriodicAdvClearDev(void)
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_clear_periodic_adv_list()) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_clear_periodic_adv_list()) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE PA ClrDev: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE PA ClrDev: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
cb_params.status = status;
|
cb_params.status = status;
|
||||||
@@ -1039,7 +1045,7 @@ tBTM_STATUS BTM_BleSetExtendedScanParams(tBTM_BLE_EXT_SCAN_PARAMS *params)
|
|||||||
if ((err = btsnd_hcic_ble_set_ext_scan_params(params->own_addr_type, params->filter_policy, phy_mask, phy_count,
|
if ((err = btsnd_hcic_ble_set_ext_scan_params(params->own_addr_type, params->filter_policy, phy_mask, phy_count,
|
||||||
hci_params)) != HCI_SUCCESS) {
|
hci_params)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE ES SetParams: cmd err=0x%x", err);
|
BTM_TRACE_ERROR("LE ES SetParams: cmd err=0x%x", err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@@ -1065,7 +1071,7 @@ tBTM_STATUS BTM_BleExtendedScan(BOOLEAN enable, UINT16 duration, UINT16 period)
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_ext_scan_enable(enable, extend_adv_cb.scan_duplicate, duration, period)) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_ext_scan_enable(enable, extend_adv_cb.scan_duplicate, duration, period)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("LE ES En=%d: cmd err=0x%x", enable, err);
|
BTM_TRACE_ERROR("LE ES En=%d: cmd err=0x%x", enable, err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@@ -1401,7 +1407,7 @@ void BTM_BlePeriodicAdvRecvEnable(UINT16 sync_handle, UINT8 enable)
|
|||||||
|
|
||||||
if ((err = btsnd_hcic_ble_set_periodic_adv_recv_enable(sync_handle, enable)) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_set_periodic_adv_recv_enable(sync_handle, enable)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("%s cmd err=0x%x", __func__, err);
|
BTM_TRACE_ERROR("%s cmd err=0x%x", __func__, err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
cb_params.status = status;
|
cb_params.status = status;
|
||||||
@@ -1460,7 +1466,7 @@ void BTM_BleSetPeriodicAdvSyncTransParams(BD_ADDR bd_addr, UINT8 mode, UINT16 sk
|
|||||||
tHCI_STATUS err = HCI_SUCCESS;
|
tHCI_STATUS err = HCI_SUCCESS;
|
||||||
if ((err = btsnd_hcic_ble_set_default_periodic_adv_sync_trans_params(mode, skip, sync_timeout, cte_type)) != HCI_SUCCESS) {
|
if ((err = btsnd_hcic_ble_set_default_periodic_adv_sync_trans_params(mode, skip, sync_timeout, cte_type)) != HCI_SUCCESS) {
|
||||||
BTM_TRACE_ERROR("%s cmd err=0x%x", __func__, err);
|
BTM_TRACE_ERROR("%s cmd err=0x%x", __func__, err);
|
||||||
status = BTM_ILLEGAL_VALUE;
|
status = BTM_HCI_ERROR | err;
|
||||||
}
|
}
|
||||||
|
|
||||||
cb_params.set_past_params.status = status;
|
cb_params.set_past_params.status = status;
|
||||||
|
@@ -50,6 +50,7 @@ typedef char tBTM_LOC_BD_NAME[BTM_MAX_LOC_BD_NAME_LEN + 1];
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BTM_ACL_IS_CONNECTED(bda) (btm_bda_to_acl (bda, BT_TRANSPORT_BR_EDR) != NULL)
|
#define BTM_ACL_IS_CONNECTED(bda) (btm_bda_to_acl (bda, BT_TRANSPORT_BR_EDR) != NULL)
|
||||||
|
#define BTM_LE_ACL_IS_CONNECTED(bda) (btm_bda_to_acl (bda, BT_TRANSPORT_LE) != NULL)
|
||||||
|
|
||||||
/* Definitions for Server Channel Number (SCN) management
|
/* Definitions for Server Channel Number (SCN) management
|
||||||
*/
|
*/
|
||||||
|
@@ -75,6 +75,7 @@ enum {
|
|||||||
BTM_SET_STATIC_RAND_ADDR_FAIL, /* 25 Command failed */
|
BTM_SET_STATIC_RAND_ADDR_FAIL, /* 25 Command failed */
|
||||||
BTM_INVALID_STATIC_RAND_ADDR, /* 26 invalid static rand addr */
|
BTM_INVALID_STATIC_RAND_ADDR, /* 26 invalid static rand addr */
|
||||||
BTM_SEC_DEV_REC_REMOVED, /* 27 Device record relate to the bd_addr is removed */
|
BTM_SEC_DEV_REC_REMOVED, /* 27 Device record relate to the bd_addr is removed */
|
||||||
|
BTM_HCI_ERROR = 128, /* 128 HCI error code from controller (0x80) */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef uint8_t tBTM_STATUS;
|
typedef uint8_t tBTM_STATUS;
|
||||||
|
@@ -111,7 +111,7 @@ BOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda)
|
|||||||
p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, BT_TRANSPORT_LE);
|
p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, BT_TRANSPORT_LE);
|
||||||
/* Do not remove lcb if an LE link is already up as a peripheral */
|
/* Do not remove lcb if an LE link is already up as a peripheral */
|
||||||
if (p_lcb != NULL &&
|
if (p_lcb != NULL &&
|
||||||
!(p_lcb->link_role == HCI_ROLE_SLAVE && BTM_ACL_IS_CONNECTED(rem_bda))) {
|
!(p_lcb->link_role == HCI_ROLE_SLAVE && BTM_LE_ACL_IS_CONNECTED(rem_bda))) {
|
||||||
p_lcb->disc_reason = L2CAP_CONN_CANCEL;
|
p_lcb->disc_reason = L2CAP_CONN_CANCEL;
|
||||||
l2cu_release_lcb (p_lcb);
|
l2cu_release_lcb (p_lcb);
|
||||||
}
|
}
|
||||||
|
@@ -430,7 +430,7 @@ static void esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *par
|
|||||||
}
|
}
|
||||||
case ESP_GAP_BLE_EXT_SCAN_START_COMPLETE_EVT:
|
case ESP_GAP_BLE_EXT_SCAN_START_COMPLETE_EVT:
|
||||||
if (param->ext_scan_start.status != ESP_BT_STATUS_SUCCESS) {
|
if (param->ext_scan_start.status != ESP_BT_STATUS_SUCCESS) {
|
||||||
ESP_LOGE(GATTC_TAG, "scan start failed, error status = %x", param->scan_start_cmpl.status);
|
ESP_LOGE(GATTC_TAG, "scan start failed, error status = %x", param->ext_scan_start.status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ESP_LOGI(GATTC_TAG, "Scan start success");
|
ESP_LOGI(GATTC_TAG, "Scan start success");
|
||||||
|
Reference in New Issue
Block a user