From 96aff16dd3e1ae22f091d49b381066cec759419a Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Thu, 10 Jun 2021 16:24:30 +0800 Subject: [PATCH] fix spp acceptor deadlock Closes: https://github.com/espressif/esp-idf/issues/6948 --- components/bt/host/bluedroid/hci/hci_hal_h4.c | 20 ++-------- .../bluedroid/stack/l2cap/include/l2c_int.h | 5 --- .../bt/host/bluedroid/stack/l2cap/l2c_utils.c | 37 ------------------- 3 files changed, 3 insertions(+), 59 deletions(-) diff --git a/components/bt/host/bluedroid/hci/hci_hal_h4.c b/components/bt/host/bluedroid/hci/hci_hal_h4.c index b6aa599efc..8410efb2c0 100644 --- a/components/bt/host/bluedroid/hci/hci_hal_h4.c +++ b/components/bt/host/bluedroid/hci/hci_hal_h4.c @@ -177,30 +177,16 @@ bool hci_hal_h4_task_post(uint32_t timeout) #if (C2H_FLOW_CONTROL_INCLUDED == TRUE) static void hci_packet_complete(BT_HDR *packet){ - uint8_t type, num_handle; + uint8_t type; uint16_t handle; - uint16_t handles[MAX_L2CAP_LINKS + 4]; - uint16_t num_packets[MAX_L2CAP_LINKS + 4]; + uint16_t num_packets = 1; uint8_t *stream = packet->data + packet->offset; - tL2C_LCB *p_lcb = NULL; STREAM_TO_UINT8(type, stream); if (type == DATA_TYPE_ACL/* || type == DATA_TYPE_SCO*/) { STREAM_TO_UINT16(handle, stream); handle = handle & HCI_DATA_HANDLE_MASK; - p_lcb = l2cu_find_lcb_by_handle(handle); - if (p_lcb) { - p_lcb->completed_packets++; - } - if (esp_vhci_host_check_send_available()){ - num_handle = l2cu_find_completed_packets(handles, num_packets); - if (num_handle > 0){ - btsnd_hcic_host_num_xmitted_pkts (num_handle, handles, num_packets); - } - } else { - //Send HCI_Host_Number_of_Completed_Packets next time. - } - + btsnd_hcic_host_num_xmitted_pkts(1, &handle, &num_packets); } } #endif ///C2H_FLOW_CONTROL_INCLUDED == TRUE diff --git a/components/bt/host/bluedroid/stack/l2cap/include/l2c_int.h b/components/bt/host/bluedroid/stack/l2cap/include/l2c_int.h index a504b3d34b..49014e582a 100644 --- a/components/bt/host/bluedroid/stack/l2cap/include/l2c_int.h +++ b/components/bt/host/bluedroid/stack/l2cap/include/l2c_int.h @@ -381,7 +381,6 @@ typedef struct t_l2c_linkcb { BOOLEAN is_aux; /* This variable used for BLE 5.0 or higher version when do auxiliary connection */ TIMER_LIST_ENT timer_entry; /* Timer list entry for timeout evt */ UINT16 handle; /* The handle used with LM */ - UINT16 completed_packets; /* The number of conpleted packets */ tL2C_CCB_Q ccb_queue; /* Queue of CCBs on this LCB */ @@ -677,10 +676,6 @@ extern void l2cu_send_peer_ble_credit_based_disconn_req(tL2C_CCB *p_ccb); #endif -#if (C2H_FLOW_CONTROL_INCLUDED == TRUE) -extern UINT8 l2cu_find_completed_packets(UINT16 *handles, UINT16 *num_packets); -#endif ///C2H_FLOW_CONTROL_INCLUDED == TRUE - extern BOOLEAN l2cu_initialize_fixed_ccb (tL2C_LCB *p_lcb, UINT16 fixed_cid, tL2CAP_FCR_OPTS *p_fcr); extern void l2cu_no_dynamic_ccbs (tL2C_LCB *p_lcb); extern void l2cu_process_fixed_chnl_resp (tL2C_LCB *p_lcb); diff --git a/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c b/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c index 2eaefe85b9..f77ab9ee71 100644 --- a/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c +++ b/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c @@ -112,9 +112,6 @@ tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding, tBT_TRANSPOR l2c_link_adjust_allocation(); } p_lcb->link_xmit_data_q = list_new(NULL); -#if (C2H_FLOW_CONTROL_INCLUDED == TRUE) - p_lcb->completed_packets = 0; -#endif ///C2H_FLOW_CONTROL_INCLUDED == TRUE return (p_lcb); } } @@ -289,10 +286,6 @@ void l2cu_release_lcb (tL2C_LCB *p_lcb) p_lcb->le_sec_pending_q = NULL; } #endif ///BLE_INCLUDED == TRUE - -#if (C2H_FLOW_CONTROL_INCLUDED == TRUE) - p_lcb->completed_packets = 0; -#endif ///C2H_FLOW_CONTROL_INCLUDED == TRUE } @@ -3204,36 +3197,6 @@ void l2cu_send_peer_ble_credit_based_disconn_req(tL2C_CCB *p_ccb) #endif /* BLE_INCLUDED == TRUE */ -#if (C2H_FLOW_CONTROL_INCLUDED == TRUE) -/******************************************************************************* -** -** Function l2cu_find_completed_packets -** -** Description Find the completed packets, -** Then set it to zero -** -** Returns The num of handles -** -*******************************************************************************/ -UINT8 l2cu_find_completed_packets(UINT16 *handles, UINT16 *num_packets) -{ - UINT8 num = 0; - list_node_t *p_node = NULL; - tL2C_LCB *p_lcb = NULL; - for (p_node = list_begin(l2cb.p_lcb_pool); p_node; p_node = list_next(p_node)) { - p_lcb = list_node(p_node); - if ((p_lcb->in_use) && (p_lcb->completed_packets > 0)) { - *(handles++) = p_lcb->handle; - *(num_packets++) = p_lcb->completed_packets; - num++; - p_lcb->completed_packets = 0; - } - } - - return num; -} -#endif ///C2H_FLOW_CONTROL_INCLUDED == TRUE - /******************************************************************************* ** Functions used by both Full and Light Stack ********************************************************************************/