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

Commit aa0df37f authored by Michael Sun's avatar Michael Sun Committed by Gerrit Code Review
Browse files

Merge changes Icafe9fd5,I91f023a1,I37cd7b31 into main

* changes:
  btif: Improve ACL connection failure reporting
  btif: fix btif_dm lint error
  stack: add support to convert HCI error codes into bt_status
parents 731a8fec 597b95bf
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -461,7 +461,7 @@ static bool check_eir_appearance(tBTA_DM_SEARCH* p_search_data, uint16_t* p_appe
 *                  Populate p_remote_name, if provided and remote name found
 *
 ******************************************************************************/
static bool get_cached_remote_name(const RawAddress& bd_addr, uint8_t* p_remote_name,
static bool get_cached_remote_name(const RawAddress& bd_addr, bt_bdname_t* p_remote_name,
                                   uint8_t* p_remote_name_len) {
  bt_bdname_t bdname;
  bt_property_t prop_name;
@@ -471,7 +471,7 @@ static bool get_cached_remote_name(const RawAddress& bd_addr, uint8_t* p_remote_
  BTIF_STORAGE_FILL_PROPERTY(&prop_name, BT_PROPERTY_BDNAME, sizeof(bt_bdname_t), &bdname);
  if (btif_storage_get_remote_device_property(&bd_addr, &prop_name) == BT_STATUS_SUCCESS) {
    if (p_remote_name && p_remote_name_len) {
      strcpy((char*)p_remote_name, (char*)bdname.name);
      snprintf((char*)p_remote_name->name, sizeof(p_remote_name->name), "%s", (char*)bdname.name);
      *p_remote_name_len = strlen((char*)p_remote_name);
    }
    return true;
@@ -1334,7 +1334,7 @@ static void btif_dm_search_devices_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH*
      bdname.name[0] = 0;

      if (!check_eir_remote_name(p_search_data, bdname.name, &remote_name_len)) {
        get_cached_remote_name(p_search_data->inq_res.bd_addr, bdname.name, &remote_name_len);
        get_cached_remote_name(p_search_data->inq_res.bd_addr, &bdname, &remote_name_len);
      }

      /* Check EIR for services */
@@ -2211,8 +2211,9 @@ void btif_dm_acl_evt(tBTA_DM_ACL_EVT event, tBTA_DM_ACL* p_data) {

    case BTA_DM_LINK_UP_FAILED_EVT:
      GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb(
              BT_STATUS_FAIL, p_data->link_up_failed.bd_addr, BT_ACL_STATE_DISCONNECTED,
              p_data->link_up_failed.transport_link_type, p_data->link_up_failed.status,
              hci_error_to_bt_status(p_data->link_up_failed.status), p_data->link_up_failed.bd_addr,
              BT_ACL_STATE_DISCONNECTED, p_data->link_up_failed.transport_link_type,
              p_data->link_up_failed.status,
              btm_is_acl_locally_initiated() ? bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING
                                             : bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING,
              INVALID_ACL_HANDLE);
@@ -3128,39 +3129,40 @@ bool btif_dm_get_smp_config(tBTE_APPL_CFG* p_cfg) {
  char conf[64];
  char* pch;
  char* endptr;
  char* saveptr;

  strncpy(conf, recv->c_str(), 64);
  conf[63] = 0;  // null terminate

  pch = strtok(conf, ",");
  pch = strtok_r(conf, ",", &saveptr);
  if (pch != NULL) {
    p_cfg->ble_auth_req = (uint8_t)strtoul(pch, &endptr, 16);
  } else {
    return false;
  }

  pch = strtok(NULL, ",");
  pch = strtok_r(NULL, ",", &saveptr);
  if (pch != NULL) {
    p_cfg->ble_io_cap = (uint8_t)strtoul(pch, &endptr, 16);
  } else {
    return false;
  }

  pch = strtok(NULL, ",");
  pch = strtok_r(NULL, ",", &saveptr);
  if (pch != NULL) {
    p_cfg->ble_init_key = (uint8_t)strtoul(pch, &endptr, 16);
  } else {
    return false;
  }

  pch = strtok(NULL, ",");
  pch = strtok_r(NULL, ",", &saveptr);
  if (pch != NULL) {
    p_cfg->ble_resp_key = (uint8_t)strtoul(pch, &endptr, 16);
  } else {
    return false;
  }

  pch = strtok(NULL, ",");
  pch = strtok_r(NULL, ",", &saveptr);
  if (pch != NULL) {
    p_cfg->ble_max_key_size = (uint8_t)strtoul(pch, &endptr, 16);
  } else {
@@ -3773,7 +3775,8 @@ void btif_debug_bond_event_dump(int fd) {

    char eventtime[20];
    char temptime[20];
    struct tm* tstamp = localtime(&event->timestamp.tv_sec);
    struct tm buf;
    struct tm* tstamp = localtime_r(&event->timestamp.tv_sec, &buf);
    strftime(temptime, sizeof(temptime), "%H:%M:%S", tstamp);
    snprintf(eventtime, sizeof(eventtime), "%s.%03ld", temptime,
             event->timestamp.tv_nsec / 1000000);
+90 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <base/strings/stringprintf.h>
#include <bluetooth/log.h>
#include <hardware/bluetooth.h>

#include <cstdint>
#include <string>
@@ -124,6 +125,95 @@ inline std::string hci_error_code_text(const tHCI_ERROR_CODE& error_code) {
  }
}

inline bt_status_t hci_error_to_bt_status(const tHCI_ERROR_CODE& error_code) {
  switch (error_code) {
    case HCI_SUCCESS: /* 0x00 */
      return BT_STATUS_SUCCESS;
    case HCI_ERR_ILLEGAL_COMMAND: /* 0x01 */
      return BT_STATUS_UNSUPPORTED;
    case HCI_ERR_NO_CONNECTION: /* 0x02 */
      return BT_STATUS_NOT_READY;
    case HCI_ERR_HW_FAILURE: /* 0x03 */
      return BT_STATUS_FAIL;
    case HCI_ERR_PAGE_TIMEOUT: /* 0x04 */
      return BT_STATUS_TIMEOUT;
    case HCI_ERR_AUTH_FAILURE: /* 0x05 */
      return BT_STATUS_AUTH_FAILURE;
    case HCI_ERR_KEY_MISSING: /* 0x06 */
      return BT_STATUS_AUTH_FAILURE;
    case HCI_ERR_MEMORY_FULL: /* 0x07 */
      return BT_STATUS_NOMEM;
    case HCI_ERR_CONNECTION_TOUT: /* 0x08 */
      return BT_STATUS_TIMEOUT;
    case HCI_ERR_MAX_NUM_OF_CONNECTIONS: /* 0x09 */
      return BT_STATUS_FAIL;
    case HCI_ERR_MAX_NUM_OF_SCOS: /* 0x0A */
      return BT_STATUS_FAIL;
    case HCI_ERR_CONNECTION_EXISTS: /* 0x0B */
      return BT_STATUS_BUSY;
    case HCI_ERR_COMMAND_DISALLOWED: /* 0x0C */
      return BT_STATUS_UNSUPPORTED;
    case HCI_ERR_HOST_REJECT_RESOURCES: /* 0x0D */
      return BT_STATUS_BUSY;
    case HCI_ERR_HOST_REJECT_SECURITY: /* 0x0E */
      return BT_STATUS_AUTH_REJECTED;
    case HCI_ERR_HOST_REJECT_DEVICE: /* 0x0F */
      return BT_STATUS_AUTH_REJECTED;
    case HCI_ERR_HOST_TIMEOUT: /* 0x10 */
      return BT_STATUS_TIMEOUT;
    case HCI_ERR_ILLEGAL_PARAMETER_FMT: /* 0x12 */
      return BT_STATUS_PARM_INVALID;
    case HCI_ERR_PEER_USER: /* 0x13 */
      return BT_STATUS_RMT_DEV_DOWN;
    case HCI_ERR_REMOTE_LOW_RESOURCE: /* 0x14 */
      return BT_STATUS_RMT_DEV_DOWN;
    case HCI_ERR_REMOTE_POWER_OFF: /* 0x15 */
      return BT_STATUS_RMT_DEV_DOWN;
    case HCI_ERR_CONN_CAUSE_LOCAL_HOST: /* 0x16 */
      return BT_STATUS_DONE;
    case HCI_ERR_REPEATED_ATTEMPTS: /* 0x17 */
      return BT_STATUS_FAIL;
    case HCI_ERR_PAIRING_NOT_ALLOWED: /* 0x18 */
      return BT_STATUS_AUTH_REJECTED;
    case HCI_ERR_UNSUPPORTED_REM_FEATURE: /* 0x1A */
      return BT_STATUS_UNSUPPORTED;
    case HCI_ERR_UNSPECIFIED: /* 0x1F */
      return BT_STATUS_FAIL;
    case HCI_ERR_LMP_RESPONSE_TIMEOUT: /* 0x22 */
      return BT_STATUS_TIMEOUT;
    case HCI_ERR_LMP_ERR_TRANS_COLLISION: /* 0x23 */
      return BT_STATUS_FAIL;
    case HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE: /* 0x25 */
      return BT_STATUS_AUTH_REJECTED;
    case HCI_ERR_UNIT_KEY_USED: /* 0x26 */
      return BT_STATUS_AUTH_FAILURE;
    case HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED: /* 0x29 */
      return BT_STATUS_UNSUPPORTED;
    case HCI_ERR_DIFF_TRANSACTION_COLLISION: /* 0x2A */
      return BT_STATUS_FAIL;
    case HCI_ERR_INSUFFCIENT_SECURITY: /* 0x2F */
      return BT_STATUS_AUTH_REJECTED;
    case HCI_ERR_ROLE_SWITCH_PENDING: /* 0x32 */
      return BT_STATUS_BUSY;
    case HCI_ERR_ROLE_SWITCH_FAILED: /* 0x35 */
      return BT_STATUS_FAIL;
    case HCI_ERR_HOST_BUSY_PAIRING: /* 0x38 */
      return BT_STATUS_BUSY;
    case HCI_ERR_UNACCEPT_CONN_INTERVAL: /* 0x3B */
      return BT_STATUS_PARM_INVALID;
    case HCI_ERR_ADVERTISING_TIMEOUT: /* 0x3C */
      return BT_STATUS_TIMEOUT;
    case HCI_ERR_CONN_FAILED_ESTABLISHMENT: /* 0x3E */
      return BT_STATUS_FAIL;
    case HCI_ERR_LIMIT_REACHED: /* 0x43 */
      return BT_STATUS_FAIL;
    case HCI_ERR_CANCELLED_BY_LOCAL_HOST: /* 0x44 */
      return BT_STATUS_DONE;
    default:
      return BT_STATUS_FAIL;
  }
}

// Context equivalence
using tHCI_STATUS = tHCI_ERROR_CODE;
inline std::string hci_status_code_text(const tHCI_STATUS& status_code) {