Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d52d4149 authored by WENTAO WANG's avatar WENTAO WANG Committed by Andre Eisenbach
Browse files

Fix LE cancel open when physical connection is established but not ready

Issue:
Cancel open does not work when the physical connection is established
but negotiation is not finished.

Fix:
Close the physical connection and release resources when fitting in this
situation.

Bug: 64230040
Test: test_cancel_open_ble_process
Change-Id: Ia23b5f3aab427b333d9d484b97e4cd4ff49f5319
parent df494282
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include "btu.h"
#include "device/include/controller.h"
#include "hcimsgs.h"
#include "l2c_api.h"
#include "l2c_int.h"
#include "l2cdefs.h"
#include "osi/include/osi.h"
@@ -52,11 +53,19 @@ static void l2cble_start_conn_update(tL2C_LCB* p_lcb);
 *
 ******************************************************************************/
bool L2CA_CancelBleConnectReq(const RawAddress& rem_bda) {
  tL2C_LCB* p_lcb;

  tL2C_LCB* p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, BT_TRANSPORT_LE);
  /* There can be only one BLE connection request outstanding at a time */
  if (btm_ble_get_conn_st() == BLE_CONN_IDLE) {
    L2CAP_TRACE_WARNING("%s - no connection pending", __func__);
    tACL_CONN* p_acl = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE);
    if (p_acl) {
      if (p_lcb != NULL &&
          p_lcb->link_state == LST_CONNECTING && !l2cb.is_ble_connecting) {
        L2CAP_TRACE_WARNING("%s - disconnecting the LE link", __func__);
        L2CA_RemoveFixedChnl(L2CAP_ATT_CID, rem_bda);
        return (true);
      }
    }
    return (false);
  }

@@ -71,7 +80,6 @@ bool L2CA_CancelBleConnectReq(const RawAddress& rem_bda) {

  btsnd_hcic_ble_create_conn_cancel();

  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 */
  if (p_lcb != NULL &&
      !(p_lcb->link_role == HCI_ROLE_SLAVE &&
+22 −12
Original line number Diff line number Diff line
@@ -1619,7 +1619,8 @@ void l2cu_release_ccb(tL2C_CCB* p_ccb) {
  p_ccb->in_use = false;

  /* If no channels on the connection, start idle timeout */
  if ((p_lcb) && p_lcb->in_use && (p_lcb->link_state == LST_CONNECTED)) {
  if ((p_lcb) && p_lcb->in_use) {
    if (p_lcb->link_state == LST_CONNECTED) {
      if (!p_lcb->ccb_queue.p_first_ccb) {
        // Closing a security channel on LE device should not start connection
        // timeout
@@ -1632,6 +1633,15 @@ void l2cu_release_ccb(tL2C_CCB* p_ccb) {
        /* Link is still active, adjust channel quotas. */
        l2c_link_adjust_chnl_allocation();
      }
    } else if (p_lcb->link_state == LST_CONNECTING && !l2cb.is_ble_connecting) {
      if (!p_lcb->ccb_queue.p_first_ccb) {
        if (p_lcb->transport == BT_TRANSPORT_LE &&
            p_ccb->local_cid == L2CAP_ATT_CID) {
          L2CAP_TRACE_WARNING("%s - disconnecting the LE link", __func__);
          l2cu_no_dynamic_ccbs(p_lcb);
        }
      }
    }
  }
}