diff --git a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c index 3afd83036d..32b82f4e54 100644 --- a/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c +++ b/components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_ble.c @@ -51,6 +51,8 @@ static uint16_t btc_adv_list_count = 0; #endif #define BTC_GAP_BLE_ADV_RPT_QUEUE_IDX (1) +#define BTC_GAP_BLE_ADV_RPT_BATCH_SIZE (10) +#define BTC_GAP_BLE_ADV_RPT_QUEUE_LEN_MAX (200) #if (BLE_42_FEATURE_SUPPORT == TRUE) typedef struct { @@ -565,6 +567,9 @@ static void btc_gap_ble_adv_pkt_handler(void *arg) { btc_gap_ble_env_t *p_env = &btc_gap_ble_env; size_t pkts_to_process = pkt_queue_length(p_env->adv_rpt_queue); + if (pkts_to_process > BTC_GAP_BLE_ADV_RPT_BATCH_SIZE) { + pkts_to_process = BTC_GAP_BLE_ADV_RPT_BATCH_SIZE; + } for (size_t i = 0; i < pkts_to_process; i++) { pkt_linked_item_t *linked_pkt = pkt_queue_dequeue(p_env->adv_rpt_queue); @@ -596,6 +601,12 @@ static void btc_process_adv_rpt_pkt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_ btc_adv_list_count ++; #endif + // drop ADV packets if data queue length goes above threshold + btc_gap_ble_env_t *p_env = &btc_gap_ble_env; + if (pkt_queue_length(p_env->adv_rpt_queue) >= BTC_GAP_BLE_ADV_RPT_QUEUE_LEN_MAX) { + return; + } + pkt_linked_item_t *linked_pkt = osi_calloc(BT_PKT_LINKED_HDR_SIZE + sizeof(esp_ble_gap_cb_param_t)); if (linked_pkt == NULL) { return; @@ -617,7 +628,6 @@ static void btc_process_adv_rpt_pkt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_ memcpy(scan_rst->ble_adv, p_data->inq_res.p_eir, sizeof(scan_rst->ble_adv)); } while (0); - btc_gap_ble_env_t *p_env = &btc_gap_ble_env; pkt_queue_enqueue(p_env->adv_rpt_queue, linked_pkt); osi_thread_post_event(p_env->adv_rpt_ready, OSI_THREAD_MAX_TIMEOUT); } diff --git a/components/bt/host/bluedroid/hci/hci_hal_h4.c b/components/bt/host/bluedroid/hci/hci_hal_h4.c index a6e65b7cdf..c0b2f4dc4c 100644 --- a/components/bt/host/bluedroid/hci/hci_hal_h4.c +++ b/components/bt/host/bluedroid/hci/hci_hal_h4.c @@ -40,6 +40,7 @@ #define PACKET_TYPE_TO_INBOUND_INDEX(type) ((type) - 2) #define PACKET_TYPE_TO_INDEX(type) ((type) - 1) #define HCI_UPSTREAM_DATA_QUEUE_IDX (1) +#define HCI_HAL_BLE_ADV_RPT_QUEUE_LEN_MAX (200) extern bool BTU_check_queue_is_congest(void); @@ -407,6 +408,12 @@ static int host_recv_pkt_cb(uint8_t *data, uint16_t len) memcpy(pkt->data, data, len); fixed_queue_enqueue(hci_hal_env.rx_q, pkt, FIXED_QUEUE_MAX_TIMEOUT); } else { +#if !BLE_ADV_REPORT_FLOW_CONTROL + // drop the packets if pkt_queue length goes beyond upper limit + if (pkt_queue_length(hci_hal_env.adv_rpt_q) > HCI_HAL_BLE_ADV_RPT_QUEUE_LEN_MAX) { + return 0; + } +#endif pkt_size = BT_PKT_LINKED_HDR_SIZE + BT_HDR_SIZE + len; linked_pkt = (pkt_linked_item_t *) osi_calloc(pkt_size); if (!linked_pkt) { diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c index 8a8fd81471..dd25ec039f 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c @@ -57,6 +57,8 @@ #define MIN_ADV_LENGTH 2 #define BTM_VSC_CHIP_CAPABILITY_RSP_LEN_L_RELEASE 9 +#define BTM_BLE_GAP_ADV_RPT_BATCH_SIZE (10) + #if BTM_DYNAMIC_MEMORY == FALSE static tBTM_BLE_VSC_CB cmn_ble_gap_vsc_cb; #else @@ -3463,6 +3465,9 @@ static void btm_adv_pkt_handler(void *arg) tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; size_t pkts_to_process = pkt_queue_length(p_cb->adv_rpt_queue); + if (pkts_to_process > BTM_BLE_GAP_ADV_RPT_BATCH_SIZE) { + pkts_to_process = BTM_BLE_GAP_ADV_RPT_BATCH_SIZE; + } for (size_t i = 0; i < pkts_to_process; i++) { pkt_linked_item_t *linked_pkt = pkt_queue_dequeue(p_cb->adv_rpt_queue);