Просмотр исходного кода

fix(bt/bluedroid): Fixed BLE disconnect event report when disconnecting

chenjianhua 2 лет назад
Родитель
Сommit
b9e98b3e7f

+ 1 - 1
components/bt/host/bluedroid/bta/dm/bta_dm_act.c

@@ -5092,7 +5092,7 @@ void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_disconnect (tBTA_DM_MSG *p_data)
 {
-    L2CA_RemoveFixedChnl(L2CAP_ATT_CID, p_data->ble_disconnect.remote_bda);
+    L2CA_BleDisconnect(p_data->ble_disconnect.remote_bda);
 }
 
 /*******************************************************************************

+ 13 - 0
components/bt/host/bluedroid/stack/include/stack/l2c_api.h

@@ -1215,6 +1215,19 @@ extern BOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable);
 **
 *******************************************************************************/
 extern UINT8 L2CA_GetBleConnRole (BD_ADDR bd_addr);
+
+/*******************************************************************************
+**
+** Function         L2CA_BleDisconnect
+**
+** Description      This function use to disconnect LE connection.
+**
+** Parameters       BD Address of remote
+**
+** Returns          TRUE if disconnect successfully.
+**
+*******************************************************************************/
+extern BOOLEAN L2CA_BleDisconnect (BD_ADDR rem_bda);
 #endif /* (BLE_INCLUDED == TRUE) */
 
 /*******************************************************************************

+ 30 - 0
components/bt/host/bluedroid/stack/l2cap/l2c_api.c

@@ -1949,6 +1949,36 @@ BOOLEAN L2CA_RemoveFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda)
     return (TRUE);
 }
 
+#if BLE_INCLUDED == TRUE
+BOOLEAN L2CA_BleDisconnect (BD_ADDR rem_bda)
+{
+    tL2C_LCB    *p_lcb;
+    tGATT_TCB   *p_tcb;
+
+    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE);
+    if (p_lcb == NULL) {
+        return FALSE;
+    }
+
+    if (p_lcb->link_state != LST_CONNECTED) {
+        return FALSE;
+    }
+
+    p_lcb->disc_reason = HCI_ERR_CONN_CAUSE_LOCAL_HOST;
+    p_lcb->link_state = LST_DISCONNECTING;
+    btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER);
+
+    p_tcb = gatt_find_tcb_by_addr(rem_bda, BT_TRANSPORT_LE);
+    if (p_tcb == NULL) {
+        return FALSE;
+    }
+
+    gatt_set_ch_state(p_tcb, GATT_CH_CLOSING);
+
+    return TRUE;
+}
+#endif
+
 /*******************************************************************************
 **
 ** Function         L2CA_SetFixedChannelTout