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

Commit 5367eb82 authored by Himanshu Rawat's avatar Himanshu Rawat
Browse files

Cache CoD during LE pairing

Class of device is not updated during LE pairing. This change now
ensures that the class of device is extracted through BTM interface and
updated in the device properties.

Test: mmm packages/modules/Bluetooth
Flag: com.android.bluetooth.flags.read_le_appearance
Bug: 286334644
Bug: 362367900
Change-Id: If90284e14061457916d07aa1280fafce12835246
parent 36f5a88c
Loading
Loading
Loading
Loading
+20 −4
Original line number Diff line number Diff line
@@ -666,6 +666,11 @@ static tBTM_STATUS bta_dm_ble_smp_cback(tBTM_LE_EVT event, const RawAddress& bda
    return tBTM_STATUS::BTM_NOT_AUTHORIZED;
  }

  DEV_CLASS dev_class = get_btm_client_interface().security.BTM_SecReadDevClass(bda);
  if (!com::android::bluetooth::flags::read_le_appearance()) {
    dev_class = kDevClassEmpty;
  }

  switch (event) {
    case BTM_LE_IO_REQ_EVT:
      ble_io_req(bda, &p_data->io_req.io_cap, &p_data->io_req.oob_data, &p_data->io_req.auth_req,
@@ -678,6 +683,7 @@ static tBTM_STATUS bta_dm_ble_smp_cback(tBTM_LE_EVT event, const RawAddress& bda
      sec_event.ble_req.bd_addr = bda;
      bd_name_from_char_pointer(sec_event.ble_req.bd_name,
                                get_btm_client_interface().security.BTM_SecReadDevName(bda));
      sec_event.ble_req.dev_class = dev_class;
      bta_dm_sec_cb.p_sec_cback(BTA_DM_BLE_CONSENT_REQ_EVT, &sec_event);
      break;

@@ -685,6 +691,7 @@ static tBTM_STATUS bta_dm_ble_smp_cback(tBTM_LE_EVT event, const RawAddress& bda
      sec_event.ble_req.bd_addr = bda;
      bd_name_from_char_pointer(sec_event.ble_req.bd_name,
                                get_btm_client_interface().security.BTM_SecReadDevName(bda));
      sec_event.ble_req.dev_class = dev_class;
      bta_dm_sec_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event);
      break;

@@ -692,29 +699,38 @@ static tBTM_STATUS bta_dm_ble_smp_cback(tBTM_LE_EVT event, const RawAddress& bda
      sec_event.key_notif.bd_addr = bda;
      bd_name_from_char_pointer(sec_event.key_notif.bd_name,
                                get_btm_client_interface().security.BTM_SecReadDevName(bda));
      sec_event.key_notif.dev_class = dev_class;
      sec_event.key_notif.passkey = p_data->key_notif;
      bta_dm_sec_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event);
      break;

    case BTM_LE_KEY_REQ_EVT:
      sec_event.ble_req.bd_addr = bda;
      sec_event.pin_req.bd_addr = bda;
      bd_name_from_char_pointer(sec_event.pin_req.bd_name,
                                get_btm_client_interface().security.BTM_SecReadDevName(bda));
      sec_event.pin_req.dev_class = dev_class;
      bta_dm_sec_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event);
      break;

    case BTM_LE_OOB_REQ_EVT:
      sec_event.ble_req.bd_addr = bda;
      sec_event.rmt_oob.bd_addr = bda;
      bd_name_from_char_pointer(sec_event.rmt_oob.bd_name,
                                get_btm_client_interface().security.BTM_SecReadDevName(bda));
      sec_event.rmt_oob.dev_class = dev_class;
      bta_dm_sec_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
      break;

    case BTM_LE_NC_REQ_EVT:
      sec_event.key_notif.bd_addr = bda;
      bd_name_clear(sec_event.key_notif.bd_name);
      bd_name_from_char_pointer(sec_event.key_notif.bd_name,
                                get_btm_client_interface().security.BTM_SecReadDevName(bda));
      sec_event.key_notif.dev_class = dev_class;
      sec_event.key_notif.passkey = p_data->key_notif;
      bta_dm_sec_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event);
      break;

    case BTM_LE_SC_OOB_REQ_EVT:
      sec_event.ble_req.bd_addr = bda;
      sec_event.rmt_oob.bd_addr = bda;
      bta_dm_sec_cb.p_sec_cback(BTA_DM_BLE_SC_OOB_REQ_EVT, &sec_event);
      break;

+6 −0
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ typedef struct {
  RawAddress bd_addr;  /* BD address peer device. */
  DEV_CLASS dev_class; /* Class of Device */
  BD_NAME bd_name;     /* Name of peer device. */

  bool min_16_digit;   /* true if the pin returned must be at least 16 digits */
} tBTA_DM_PIN_REQ;

@@ -121,7 +122,10 @@ enum class tBTA_DM_BLE_SEC_GRANT {

/* Structure associated with BTA_DM_BLE_SEC_REQ_EVT */
typedef struct {
  /* Note: First 3 data members must be, bd_addr, dev_class, and bd_name in
   * order */
  RawAddress bd_addr; /* peer address */
  DEV_CLASS dev_class;
  BD_NAME bd_name;    /* peer device name */
} tBTA_DM_BLE_SEC_REQ;

@@ -169,6 +173,7 @@ typedef struct {
  RawAddress bd_addr;         /* peer address */
  DEV_CLASS dev_class;        /* peer CoD */
  BD_NAME bd_name;            /* peer device name */

  uint32_t num_val;           /* the numeric value for comparison. If just_works, do not
                                 show this number to UI */
  bool just_works;            /* true, if "Just Works" association model */
@@ -185,6 +190,7 @@ typedef struct {
  RawAddress bd_addr;  /* peer address */
  DEV_CLASS dev_class; /* peer CoD */
  BD_NAME bd_name;     /* peer device name */

  uint32_t passkey;    /* the numeric value for comparison. If just_works, do not
                          show this number to UI */
} tBTA_DM_SP_KEY_NOTIF;
+12 −12
Original line number Diff line number Diff line
@@ -275,7 +275,7 @@ static btif_dm_metadata_cb_t metadata_cb{.le_audio_cache{40}};
static void btif_dm_cb_create_bond(const RawAddress bd_addr, tBT_TRANSPORT transport);
static void btif_dm_cb_create_bond_le(const RawAddress bd_addr, tBLE_ADDR_TYPE addr_type);
static btif_dm_local_key_cb_t ble_local_key_cb;
static void btif_dm_ble_key_notif_evt(tBTA_DM_SP_KEY_NOTIF* p_ssp_key_notif);
static void btif_dm_ble_passkey_notif_evt(tBTA_DM_SP_KEY_NOTIF* p_ssp_key_notif);
static void btif_dm_ble_auth_cmpl_evt(tBTA_DM_AUTH_CMPL* p_auth_cmpl);
static void btif_dm_ble_passkey_req_evt(tBTA_DM_PIN_REQ* p_pin_req);
static void btif_dm_ble_key_nc_req_evt(tBTA_DM_SP_KEY_NOTIF* p_notif_req);
@@ -2126,7 +2126,7 @@ void btif_dm_sec_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) {
      break;
    case BTA_DM_BLE_PASSKEY_NOTIF_EVT:
      log::verbose("BTA_DM_BLE_PASSKEY_NOTIF_EVT");
      btif_dm_ble_key_notif_evt(&p_data->key_notif);
      btif_dm_ble_passkey_notif_evt(&p_data->key_notif);
      break;
    case BTA_DM_BLE_PASSKEY_REQ_EVT:
      log::verbose("BTA_DM_BLE_PASSKEY_REQ_EVT");
@@ -3223,7 +3223,7 @@ bool btif_dm_proc_rmt_oob(const RawAddress& bd_addr, Octet16* p_c, Octet16* p_r)
  return true;
}

static void btif_dm_ble_key_notif_evt(tBTA_DM_SP_KEY_NOTIF* p_ssp_key_notif) {
static void btif_dm_ble_passkey_notif_evt(tBTA_DM_SP_KEY_NOTIF* p_ssp_key_notif) {
  RawAddress bd_addr;
  int dev_type;

@@ -3233,8 +3233,8 @@ static void btif_dm_ble_key_notif_evt(tBTA_DM_SP_KEY_NOTIF* p_ssp_key_notif) {
  if (!btif_get_device_type(p_ssp_key_notif->bd_addr, &dev_type)) {
    dev_type = BT_DEVICE_TYPE_BLE;
  }
  btif_update_remote_properties(p_ssp_key_notif->bd_addr, p_ssp_key_notif->bd_name, kDevClassEmpty,
                                (tBT_DEVICE_TYPE)dev_type);
  btif_update_remote_properties(p_ssp_key_notif->bd_addr, p_ssp_key_notif->bd_name,
                                p_ssp_key_notif->dev_class, (tBT_DEVICE_TYPE)dev_type);
  bd_addr = p_ssp_key_notif->bd_addr;

  bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);
@@ -3510,7 +3510,7 @@ static void btif_dm_ble_sec_req_evt(tBTA_DM_BLE_SEC_REQ* p_ble_req, bool is_cons
  if (!btif_get_device_type(p_ble_req->bd_addr, &dev_type)) {
    dev_type = BT_DEVICE_TYPE_BLE;
  }
  btif_update_remote_properties(p_ble_req->bd_addr, p_ble_req->bd_name, kDevClassEmpty,
  btif_update_remote_properties(p_ble_req->bd_addr, p_ble_req->bd_name, p_ble_req->dev_class,
                                (tBT_DEVICE_TYPE)dev_type);

  RawAddress bd_addr = p_ble_req->bd_addr;
@@ -3546,7 +3546,7 @@ static void btif_dm_ble_passkey_req_evt(tBTA_DM_PIN_REQ* p_pin_req) {
  if (!btif_get_device_type(p_pin_req->bd_addr, &dev_type)) {
    dev_type = BT_DEVICE_TYPE_BLE;
  }
  btif_update_remote_properties(p_pin_req->bd_addr, p_pin_req->bd_name, kDevClassEmpty,
  btif_update_remote_properties(p_pin_req->bd_addr, p_pin_req->bd_name, p_pin_req->dev_class,
                                (tBT_DEVICE_TYPE)dev_type);

  RawAddress bd_addr = p_pin_req->bd_addr;
@@ -3569,7 +3569,7 @@ static void btif_dm_ble_key_nc_req_evt(tBTA_DM_SP_KEY_NOTIF* p_notif_req) {
  log::verbose("addr:{}", bd_addr);

  /* Remote name update */
  btif_update_remote_properties(p_notif_req->bd_addr, p_notif_req->bd_name, kDevClassEmpty,
  btif_update_remote_properties(p_notif_req->bd_addr, p_notif_req->bd_name, p_notif_req->dev_class,
                                BT_DEVICE_TYPE_BLE);

  bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);
@@ -3603,8 +3603,8 @@ static void btif_dm_ble_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type) {
  }

  /* Remote name update */
  btif_update_remote_properties(req_oob_type->bd_addr, req_oob_type->bd_name, kDevClassEmpty,
                                BT_DEVICE_TYPE_BLE);
  btif_update_remote_properties(req_oob_type->bd_addr, req_oob_type->bd_name,
                                req_oob_type->dev_class, BT_DEVICE_TYPE_BLE);

  bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);
  pairing_cb.is_ssp = false;
@@ -3654,8 +3654,8 @@ static void btif_dm_ble_sc_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type) {
  }

  /* Remote name update */
  btif_update_remote_properties(req_oob_type->bd_addr, oob_data_to_use.device_name, kDevClassEmpty,
                                BT_DEVICE_TYPE_BLE);
  btif_update_remote_properties(req_oob_type->bd_addr, oob_data_to_use.device_name,
                                req_oob_type->dev_class, BT_DEVICE_TYPE_BLE);

  bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);
  pairing_cb.is_ssp = false;