OSDN Git Service

Call gatt_disconnect if the LE connection is not established and no APP use it.
authorweichinweng <weichinweng@google.com>
Mon, 25 Mar 2019 05:51:10 +0000 (13:51 +0800)
committerweichinweng <weichinweng@google.com>
Mon, 22 Apr 2019 02:03:22 +0000 (10:03 +0800)
When the LE connection hold APP is removed, if the LE connection is not
established and no APP use it, we never free transport control block
(p_tcb) or close it. For BLE device that have not established and no APP
use it, will call gatt_disconnect to free p_tcb and go to close state.

Bug: 127908699
Test: GattConnectTest
Change-Id: Ifed10c67141cb4c9221478db759c5614714fff30
Merged-In: Ifed10c67141cb4c9221478db759c5614714fff30

stack/gatt/gatt_main.cc

index fa8c79c..cb7cd45 100644 (file)
@@ -332,14 +332,16 @@ void gatt_update_app_use_link_flag(tGATT_IF gatt_if, tGATT_TCB* p_tcb,
   // device, skip updating the device state.
   if (!gatt_update_app_hold_link_status(gatt_if, p_tcb, is_add)) return;
 
-  if (!check_acl_link ||
-      (BTM_GetHCIConnHandle(p_tcb->peer_bda, p_tcb->transport) ==
-       GATT_INVALID_ACL_HANDLE)) {
+  if (!check_acl_link) {
     return;
   }
 
+  bool is_valid_handle =
+      (BTM_GetHCIConnHandle(p_tcb->peer_bda, p_tcb->transport) !=
+       GATT_INVALID_ACL_HANDLE);
+
   if (is_add) {
-    if (p_tcb->att_lcid == L2CAP_ATT_CID) {
+    if (p_tcb->att_lcid == L2CAP_ATT_CID && is_valid_handle) {
       VLOG(1) << "disable link idle timer";
       /* acl link is connected disable the idle timeout */
       GATT_SetIdleTimeout(p_tcb->peer_bda, GATT_LINK_NO_IDLE_TIMEOUT,
@@ -348,7 +350,7 @@ void gatt_update_app_use_link_flag(tGATT_IF gatt_if, tGATT_TCB* p_tcb,
   } else {
     if (p_tcb->app_hold_link.empty()) {
       // acl link is connected but no application needs to use the link
-      if (p_tcb->att_lcid == L2CAP_ATT_CID) {
+      if (p_tcb->att_lcid == L2CAP_ATT_CID && is_valid_handle) {
         /* for fixed channel, set the timeout value to
            GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP seconds */
         VLOG(1) << " start link idle timer = "