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

Commit 1c8840b8 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "IBluetoothManager: Update createBondOutOfBand interface" am: c01f3192

Original change: https://android-review.googlesource.com/c/platform/system/bt/+/1559439

Change-Id: I74b3a1e3e8208933e1e920b40091bf3b38e9e519
parents deb98159 c01f3192
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -68,7 +68,8 @@ interface IBluetooth
    int getProfileConnectionState(int profile);

    BluetoothDevice[] getBondedDevices();
    boolean createBond(in BluetoothDevice device, in int transport, in OobData oobData);
    boolean createBond(in BluetoothDevice device, in int transport, in OobData p192Data,
    in OobData p256Data);
    boolean cancelBondProcess(in BluetoothDevice device);
    boolean removeBond(in BluetoothDevice device);
    int getBondState(in BluetoothDevice device);
+2 −1
Original line number Diff line number Diff line
@@ -95,7 +95,8 @@ void btif_dm_create_bond(const RawAddress bd_addr, int transport) {
  mock_function_count_map[__func__]++;
}
void btif_dm_create_bond_out_of_band(const RawAddress bd_addr, int transport,
                                     const bt_out_of_band_data_t oob_data) {
                                     const bt_oob_data_t p192_data,
                                     const bt_oob_data_t p256_data) {
  mock_function_count_map[__func__]++;
}
void btif_dm_enable_service(tBTA_SERVICE_ID service_id, bool enable) {
+4 −2
Original line number Diff line number Diff line
@@ -230,8 +230,10 @@ void btif_dm_create_bond(const RawAddress bd_addr, int transport);
 * Description      Initiate bonding with the specified device using OOB data.
 *
 ******************************************************************************/
void btif_dm_create_bond_out_of_band(const RawAddress bd_addr, int transport,
                                     const bt_out_of_band_data_t oob_data);
void btif_dm_create_bond_out_of_band(const RawAddress bd_addr,
                                     tBT_TRANSPORT transport,
                                     const bt_oob_data_t p192_data,
                                     const bt_oob_data_t p256_data);

/*******************************************************************************
 *
+5 −3
Original line number Diff line number Diff line
@@ -307,12 +307,14 @@ static int create_bond(const RawAddress* bd_addr, int transport) {
}

static int create_bond_out_of_band(const RawAddress* bd_addr, int transport,
                                   const bt_out_of_band_data_t* oob_data) {
                                   const bt_oob_data_t* p192_data,
                                   const bt_oob_data_t* p256_data) {
  if (!interface_ready()) return BT_STATUS_NOT_READY;
  if (btif_dm_pairing_is_busy()) return BT_STATUS_BUSY;

  do_in_main_thread(FROM_HERE, base::BindOnce(btif_dm_create_bond_out_of_band,
                                              *bd_addr, transport, *oob_data));
  do_in_main_thread(FROM_HERE,
                    base::BindOnce(btif_dm_create_bond_out_of_band, *bd_addr,
                                   transport, *p192_data, *p256_data));
  return BT_STATUS_SUCCESS;
}

+64 −31
Original line number Diff line number Diff line
@@ -148,7 +148,10 @@ typedef struct {
/* this structure holds optional OOB data for remote device */
typedef struct {
  RawAddress bdaddr;       /* peer bdaddr */
  bt_out_of_band_data_t oob_data;
  tBT_TRANSPORT transport; /* BR/EDR or LE */
  int data_present;        /* What type(s) of OOB Data present */
  bt_oob_data_t p192_data; /* P192 Data or empty */
  bt_oob_data_t p256_data; /* P256 Data or empty */
} btif_dm_oob_cb_t;

typedef struct { unsigned int manufact_id; } skip_sdp_entry_t;
@@ -1859,24 +1862,55 @@ void btif_dm_create_bond(const RawAddress bd_addr, int transport) {
 *                  data
 *
 ******************************************************************************/
void btif_dm_create_bond_out_of_band(const RawAddress bd_addr, int transport,
                                     const bt_out_of_band_data_t oob_data) {
void btif_dm_create_bond_out_of_band(const RawAddress bd_addr,
                                     tBT_TRANSPORT transport,
                                     const bt_oob_data_t p192_data,
                                     const bt_oob_data_t p256_data) {
  bt_oob_data_t empty_data;
  memset(&empty_data, 0, sizeof(empty_data));

  oob_cb.bdaddr = bd_addr;
  memcpy(&oob_cb.oob_data, &oob_data, sizeof(bt_out_of_band_data_t));
  oob_cb.transport = transport;
  oob_cb.data_present = (int)BTM_OOB_NONE;
  if (memcmp(&p192_data, &empty_data, sizeof(p192_data)) != 0) {
    memcpy(&oob_cb.p192_data, &p192_data, sizeof(bt_oob_data_t));
    oob_cb.data_present = (int)BTM_OOB_PRESENT_192;
  }
  if (memcmp(&p256_data, &empty_data, sizeof(p256_data)) != 0) {
    memcpy(&oob_cb.p256_data, &p256_data, sizeof(bt_oob_data_t));
    if (oob_cb.data_present == (int)BTM_OOB_PRESENT_192) {
      oob_cb.data_present = (int)BTM_OOB_PRESENT_192_AND_256;
    } else {
      oob_cb.data_present = (int)BTM_OOB_PRESENT_256;
    }
  }

  uint8_t empty[] = {0, 0, 0, 0, 0, 0, 0};
  // If LE Bluetooth Device Address is provided, use provided address type
  // value.
  if (memcmp(oob_data.le_bt_dev_addr, empty, 7) != 0) {
  // TODO(181889116): Upgrade to support p256 (for now we just ignore P256)
  // because the controllers do not yet support it.
  switch (transport) {
    case BT_TRANSPORT_BR_EDR:
      // TODO(182162589): Flesh out classic impl in legacy BTMSec
      // Nothing to do yet, but not an error
      break;
    case BT_TRANSPORT_LE:
      // If we have an address, lets get the type
      if (memcmp(p192_data.address, empty, 7) != 0) {
        /* byte no 7 is address type in LE Bluetooth Address OOB data */
        tBLE_ADDR_TYPE address_type =
        static_cast<tBLE_ADDR_TYPE>(oob_data.le_bt_dev_addr[6]);
    if (address_type == BLE_ADDR_PUBLIC || address_type == BLE_ADDR_RANDOM) {
            static_cast<tBLE_ADDR_TYPE>(p192_data.address[6]);
        if (address_type == BLE_ADDR_PUBLIC ||
            address_type == BLE_ADDR_RANDOM) {
          // bd_addr->address is already reversed, so use it instead of
      // oob_data->le_bt_dev_addr
          // oob_data->address
          BTM_SecAddBleDevice(bd_addr, BT_DEVICE_TYPE_BLE, address_type);
        }
      }
      break;
    default:
      LOG_ERROR("Invalid transport: %d", transport);
      return;
  }

  BTIF_TRACE_EVENT("%s: bd_addr=%s, transport=%d", __func__,
                   bd_addr.ToString().c_str(), transport);
@@ -1890,7 +1924,6 @@ void btif_dm_create_bond_out_of_band(const RawAddress bd_addr, int transport,
 * Description      Initiate bonding with the specified device
 *
 ******************************************************************************/

void btif_dm_cancel_bond(const RawAddress bd_addr) {
  BTIF_TRACE_EVENT("%s: bd_addr=%s", __func__, bd_addr.ToString().c_str());

@@ -2157,7 +2190,7 @@ void btif_dm_proc_io_rsp(UNUSED_ATTR const RawAddress& bd_addr,
}

void btif_dm_set_oob_for_io_req(tBTM_OOB_DATA* p_has_oob_data) {
  if (is_empty_128bit(oob_cb.oob_data.c192)) {
  if (is_empty_128bit(oob_cb.p192_data.c)) {
    *p_has_oob_data = false;
  } else {
    *p_has_oob_data = true;
@@ -2168,8 +2201,8 @@ void btif_dm_set_oob_for_io_req(tBTM_OOB_DATA* p_has_oob_data) {
void btif_dm_set_oob_for_le_io_req(const RawAddress& bd_addr,
                                   tBTM_OOB_DATA* p_has_oob_data,
                                   tBTM_LE_AUTH_REQ* p_auth_req) {
  if (!is_empty_128bit(oob_cb.oob_data.le_sc_c) &&
      !is_empty_128bit(oob_cb.oob_data.le_sc_r)) {
  if (!is_empty_128bit(oob_cb.p192_data.c) &&
      !is_empty_128bit(oob_cb.p192_data.r)) {
    /* We have LE SC OOB data */

    /* make sure OOB data is for this particular device */
@@ -2181,7 +2214,7 @@ void btif_dm_set_oob_for_le_io_req(const RawAddress& bd_addr,
      BTIF_TRACE_WARNING("%s: remote address didn't match OOB data address",
                         __func__);
    }
  } else if (!is_empty_128bit(oob_cb.oob_data.sm_tk)) {
  } else if (!is_empty_128bit(oob_cb.p192_data.sm_tk)) {
    /* We have security manager TK */

    /* make sure OOB data is for this particular device */
@@ -2208,7 +2241,7 @@ void btif_dm_load_local_oob(void) {
  osi_property_get("service.brcm.bt.oob", prop_oob, "3");
  BTIF_TRACE_DEBUG("%s: prop_oob = %s", __func__, prop_oob);
  if (prop_oob[0] != '3') {
    if (is_empty_128bit(oob_cb.oob_data.c192)) {
    if (is_empty_128bit(oob_cb.p192_data.c)) {
      BTIF_TRACE_DEBUG("%s: read OOB, call BTA_DmLocalOob()", __func__);
      BTA_DmLocalOob();
    }
@@ -2222,10 +2255,10 @@ void btif_dm_proc_loc_oob(bool valid, const Octet16& c, const Octet16& r) {
  const char* path = NULL;
  char prop_oob[PROPERTY_VALUE_MAX];
  BTIF_TRACE_DEBUG("%s: valid=%d", __func__, valid);
  if (is_empty_128bit(oob_cb.oob_data.c192) && valid) {
  if (is_empty_128bit(oob_cb.p192_data.c) && valid) {
    BTIF_TRACE_DEBUG("save local OOB data in memory");
    memcpy(oob_cb.oob_data.c192, c.data(), OCTET16_LEN);
    memcpy(oob_cb.oob_data.r192, r.data(), OCTET16_LEN);
    memcpy(oob_cb.p192_data.c, c.data(), OCTET16_LEN);
    memcpy(oob_cb.p192_data.r, r.data(), OCTET16_LEN);
    osi_property_get("service.brcm.bt.oob", prop_oob, "3");
    BTIF_TRACE_DEBUG("%s: prop_oob = %s", __func__, prop_oob);
    if (prop_oob[0] == '1')
@@ -2650,7 +2683,7 @@ static void btif_dm_ble_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type) {
   * btif_dm_set_oob_for_le_io_req, but check here again. If it's not present
   * do nothing, pairing will timeout.
   */
  if (is_empty_128bit(oob_cb.oob_data.sm_tk)) {
  if (is_empty_128bit(oob_cb.p192_data.sm_tk)) {
    return;
  }

@@ -2670,7 +2703,7 @@ static void btif_dm_ble_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type) {
  pairing_cb.is_le_only = true;
  pairing_cb.is_le_nc = false;

  BTM_BleOobDataReply(req_oob_type->bd_addr, 0, 16, oob_cb.oob_data.sm_tk);
  BTM_BleOobDataReply(req_oob_type->bd_addr, 0, 16, oob_cb.p192_data.sm_tk);
}

static void btif_dm_ble_sc_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type) {
@@ -2682,8 +2715,8 @@ static void btif_dm_ble_sc_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type) {
   * btif_dm_set_oob_for_le_io_req, but check here again. If it's not present
   * do nothing, pairing will timeout.
   */
  if (is_empty_128bit(oob_cb.oob_data.le_sc_c) &&
      is_empty_128bit(oob_cb.oob_data.le_sc_r)) {
  if (is_empty_128bit(oob_cb.p192_data.c) &&
      is_empty_128bit(oob_cb.p192_data.r)) {
    BTIF_TRACE_WARNING("%s: LE SC OOB data is empty", __func__);
    return;
  }
@@ -2705,8 +2738,8 @@ static void btif_dm_ble_sc_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type) {
      true;  // TODO: we can derive classic pairing from this one
  pairing_cb.is_le_nc = false;

  BTM_BleSecureConnectionOobDataReply(
      req_oob_type->bd_addr, oob_cb.oob_data.le_sc_c, oob_cb.oob_data.le_sc_r);
  BTM_BleSecureConnectionOobDataReply(req_oob_type->bd_addr, oob_cb.p192_data.c,
                                      oob_cb.p192_data.r);
}

void btif_dm_update_ble_remote_properties(const RawAddress& bd_addr,
Loading