/******************************************************************************* ** ** Function L2CA_CancelBleConnectReq ** ** Description Cancel a pending connection attempt to a BLE device. ** ** Parameters: BD Address of remote ** ** Return value: TRUE if connection was cancelled ** *******************************************************************************/ BOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda) { tL2C_LCB *p_lcb; BOOLEAN rem_lcb = TRUE; /* There can be only one BLE connection request outstanding at a time */ if (btm_ble_get_conn_st() == BLE_CONN_IDLE) { L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - no connection pending"); return(FALSE); } if (memcmp (rem_bda, l2cb.ble_connecting_bda, BD_ADDR_LEN)) { L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - different BDA Connecting: %08x%04x Cancel: %08x%04x", (l2cb.ble_connecting_bda[0]<<24)+(l2cb.ble_connecting_bda[1]<<16)+(l2cb.ble_connecting_bda[2]<<8)+l2cb.ble_connecting_bda[3], (l2cb.ble_connecting_bda[4]<<8)+l2cb.ble_connecting_bda[5], (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]); btm_ble_dequeue_direct_conn_req(rem_bda); return(FALSE); } if (btsnd_hcic_ble_create_conn_cancel()) { p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, BT_TRANSPORT_LE); /*Do not remove lcb if a LE link is already up as peripheral*/ if(p_lcb != NULL && p_lcb->link_role == HCI_ROLE_SLAVE && BTM_ACL_IS_CONNECTED(rem_bda)) { rem_lcb = FALSE; } if (rem_lcb && p_lcb != NULL) { p_lcb->disc_reason = L2CAP_CONN_CANCEL; l2cu_release_lcb (p_lcb); } /* update state to be cancel, wait for connection cancel complete */ btm_ble_set_conn_st (BLE_CONN_CANCEL); return(TRUE); } else return(FALSE); }
/******************************************************************************* ** ** Function L2CA_CancelBleConnectReq ** ** Description Cancel a pending connection attempt to a BLE device. ** ** Parameters: BD Address of remote ** ** Return value: TRUE if connection was cancelled ** *******************************************************************************/ BOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda) { tL2C_LCB *p_lcb; /* There can be only one BLE connection request outstanding at a time */ //changed check for BLE_CONN_IDLE instead of incorrect BLE_DIR_CONN for no pending connection if (btm_ble_get_conn_st() == BLE_CONN_IDLE) { L2CAP_TRACE_WARNING0 ("L2CA_CancelBleConnectReq - no connection pending"); return(FALSE); } if (memcmp (rem_bda, l2cb.ble_connecting_bda, BD_ADDR_LEN)) { L2CAP_TRACE_WARNING4 ("L2CA_CancelBleConnectReq - different BDA Connecting: %08x%04x Cancel: %08x%04x", (l2cb.ble_connecting_bda[0]<<24)+(l2cb.ble_connecting_bda[1]<<16)+(l2cb.ble_connecting_bda[2]<<8)+l2cb.ble_connecting_bda[3], (l2cb.ble_connecting_bda[4]<<8)+l2cb.ble_connecting_bda[5], (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]); return(FALSE); } if (btsnd_hcic_ble_create_conn_cancel()) { if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda)) != NULL) { p_lcb->disc_reason = L2CAP_CONN_CANCEL; l2cu_release_lcb (p_lcb); } /* update conn state to IDLE */ btm_ble_set_conn_st (BLE_CONN_IDLE); return(TRUE); } else return(FALSE); }
/******************************************************************************* ** ** Function l2cble_create_conn ** ** Description This function initiates an acl connection via HCI ** ** Returns TRUE if successful, FALSE if connection not started. ** *******************************************************************************/ BOOLEAN l2cble_create_conn (tL2C_LCB *p_lcb) { tBTM_BLE_CONN_ST conn_st = btm_ble_get_conn_st(); BOOLEAN rt = FALSE; /* There can be only one BLE connection request outstanding at a time */ if (conn_st == BLE_CONN_IDLE) { rt = l2cble_init_direct_conn(p_lcb); } else { L2CAP_TRACE_WARNING1 ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st); btm_ble_enqueue_direct_conn_req(p_lcb); if (conn_st == BLE_BG_CONN) btm_ble_suspend_bg_conn(); rt = TRUE; } return rt; }