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

Commit 1096fc59 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "RootCanal: Implement additional commands for LL Privacy" am: 13e90a30

parents 025a2210 13e90a30
Loading
Loading
Loading
Loading
+30 −4
Original line number Diff line number Diff line
@@ -2165,6 +2165,32 @@ void DualModeController::LeReadResolvingListSize(CommandView command) {
      properties_.le_resolving_list_size));
}

void DualModeController::LeReadPeerResolvableAddress(CommandView command) {
  auto command_view = bluetooth::hci::LeReadPeerResolvableAddressView::Create(
      bluetooth::hci::LeSecurityCommandView::Create(command));
  ASSERT(command_view.IsValid());
  Address peer_resolvable_address;
  ErrorCode status = link_layer_controller_.LeReadPeerResolvableAddress(
      command_view.GetPeerIdentityAddressType(),
      command_view.GetPeerIdentityAddress(), &peer_resolvable_address);
  send_event_(
      bluetooth::hci::LeReadPeerResolvableAddressCompleteBuilder::Create(
          kNumCommandPackets, status, peer_resolvable_address));
}

void DualModeController::LeReadLocalResolvableAddress(CommandView command) {
  auto command_view = bluetooth::hci::LeReadLocalResolvableAddressView::Create(
      bluetooth::hci::LeSecurityCommandView::Create(command));
  ASSERT(command_view.IsValid());
  Address local_resolvable_address;
  ErrorCode status = link_layer_controller_.LeReadLocalResolvableAddress(
      command_view.GetPeerIdentityAddressType(),
      command_view.GetPeerIdentityAddress(), &local_resolvable_address);
  send_event_(
      bluetooth::hci::LeReadLocalResolvableAddressCompleteBuilder::Create(
          kNumCommandPackets, status, local_resolvable_address));
}

void DualModeController::LeReadMaximumDataLength(CommandView command) {
  auto command_view = bluetooth::hci::LeReadMaximumDataLengthView::Create(
      bluetooth::hci::LeSecurityCommandView::Create(command));
@@ -3900,10 +3926,10 @@ const std::unordered_map<OpCode, DualModeController::CommandHandler>
         &DualModeController::LeClearResolvingList},
        {OpCode::LE_READ_RESOLVING_LIST_SIZE,
         &DualModeController::LeReadResolvingListSize},
        //{OpCode::LE_READ_PEER_RESOLVABLE_ADDRESS,
        //&DualModeController::LeReadPeerResolvableAddress},
        //{OpCode::LE_READ_LOCAL_RESOLVABLE_ADDRESS,
        //&DualModeController::LeReadLocalResolvableAddress},
        {OpCode::LE_READ_PEER_RESOLVABLE_ADDRESS,
         &DualModeController::LeReadPeerResolvableAddress},
        {OpCode::LE_READ_LOCAL_RESOLVABLE_ADDRESS,
         &DualModeController::LeReadLocalResolvableAddress},
        {OpCode::LE_SET_ADDRESS_RESOLUTION_ENABLE,
         &DualModeController::LeSetAddressResolutionEnable},
        {OpCode::LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT,
+5 −7
Original line number Diff line number Diff line
@@ -508,18 +508,16 @@ class DualModeController : public Device {
  // 7.8.35
  void LeWriteSuggestedDefaultDataLength(CommandView command);

  // 7.8.38
  // 7.8.38 - 7.8.41
  void LeAddDeviceToResolvingList(CommandView command);

  // 7.8.39
  void LeRemoveDeviceFromResolvingList(CommandView command);

  // 7.8.40
  void LeClearResolvingList(CommandView command);

  // 7.8.41
  void LeReadResolvingListSize(CommandView command);

  // 7.8.42 - 7.8.43
  void LeReadPeerResolvableAddress(CommandView command);
  void LeReadLocalResolvableAddress(CommandView command);

  // 7.8.44
  void LeSetAddressResolutionEnable(CommandView command);

+73 −6
Original line number Diff line number Diff line
@@ -190,11 +190,17 @@ std::optional<AddressWithType> LinkLayerController::ResolvePrivateAddress(
    return {};
  }

  for (auto const& entry : le_resolving_list_) {
  for (auto& entry : le_resolving_list_) {
    std::array<uint8_t, LinkLayerController::kIrkSize> const& used_irk =
        irk == IrkSelection::Local ? entry.local_irk : entry.peer_irk;

    if (address.IsRpaThatMatchesIrk(used_irk)) {
      // Update the peer resolvable address used for the peer
      // with the returned identity address.
      if (irk == IrkSelection::Peer) {
        entry.peer_resolvable_address = address.GetAddress();
      }

      return PeerIdentityAddress(entry.peer_identity_address,
                                 entry.peer_identity_address_type);
    }
@@ -210,13 +216,20 @@ LinkLayerController::GenerateResolvablePrivateAddress(AddressWithType address,
    return {};
  }

  for (auto const& entry : le_resolving_list_) {
  for (auto& entry : le_resolving_list_) {
    if (address.GetAddress() == entry.peer_identity_address &&
        address.ToPeerAddressType() == entry.peer_identity_address_type) {
      std::array<uint8_t, LinkLayerController::kIrkSize> const& used_irk =
          irk == IrkSelection::Local ? entry.local_irk : entry.peer_irk;
      Address local_resolvable_address = generate_rpa(used_irk);

      // Update the local resolvable address used for the peer
      // with the returned identity address.
      if (irk == IrkSelection::Local) {
        entry.local_resolvable_address = local_resolvable_address;
      }

      return AddressWithType{generate_rpa(used_irk),
      return AddressWithType{local_resolvable_address,
                             AddressType::RANDOM_DEVICE_ADDRESS};
    }
  }
@@ -498,9 +511,13 @@ ErrorCode LinkLayerController::LeAddDeviceToResolvingList(
    }
  }

  le_resolving_list_.emplace_back(
      ResolvingListEntry{peer_identity_address_type, peer_identity_address,
                         peer_irk, local_irk, PrivacyMode::NETWORK});
  le_resolving_list_.emplace_back(ResolvingListEntry{peer_identity_address_type,
                                                     peer_identity_address,
                                                     peer_irk,
                                                     local_irk,
                                                     PrivacyMode::NETWORK,
                                                     {},
                                                     {}});
  return ErrorCode::SUCCESS;
}

@@ -555,6 +572,56 @@ ErrorCode LinkLayerController::LeClearResolvingList() {
  return ErrorCode::SUCCESS;
}

// HCI command LE_Read_Peer_Resolvable_Address (Vol 4, Part E § 7.8.42).
ErrorCode LinkLayerController::LeReadPeerResolvableAddress(
    PeerAddressType peer_identity_address_type, Address peer_identity_address,
    Address* peer_resolvable_address) {
  for (auto const& entry : le_resolving_list_) {
    if (entry.peer_identity_address_type == peer_identity_address_type &&
        entry.peer_identity_address == peer_identity_address &&
        entry.peer_resolvable_address.has_value()) {
      *peer_resolvable_address = entry.peer_resolvable_address.value();
      return ErrorCode::SUCCESS;
    }
  }

  // When a Controller cannot find a Resolvable Private Address associated with
  // the Peer Identity Address, or if the Peer Identity Address cannot be found
  // in the resolving list, it shall return the error code
  // Unknown Connection Identifier (0x02).
  LOG_INFO(
      "peer identity address %s[%s] not found in the resolving list,"
      " or peer resolvable address unavailable",
      peer_identity_address.ToString().c_str(),
      PeerAddressTypeText(peer_identity_address_type).c_str());
  return ErrorCode::UNKNOWN_CONNECTION;
}

// HCI command LE_Read_Local_Resolvable_Address (Vol 4, Part E § 7.8.43).
ErrorCode LinkLayerController::LeReadLocalResolvableAddress(
    PeerAddressType peer_identity_address_type, Address peer_identity_address,
    Address* local_resolvable_address) {
  for (auto const& entry : le_resolving_list_) {
    if (entry.peer_identity_address_type == peer_identity_address_type &&
        entry.peer_identity_address == peer_identity_address &&
        entry.local_resolvable_address.has_value()) {
      *local_resolvable_address = entry.local_resolvable_address.value();
      return ErrorCode::SUCCESS;
    }
  }

  // When a Controller cannot find a Resolvable Private Address associated with
  // the Peer Identity Address, or if the Peer Identity Address cannot be found
  // in the resolving list, it shall return the error code
  // Unknown Connection Identifier (0x02).
  LOG_INFO(
      "peer identity address %s[%s] not found in the resolving list,"
      " or peer resolvable address unavailable",
      peer_identity_address.ToString().c_str(),
      PeerAddressTypeText(peer_identity_address_type).c_str());
  return ErrorCode::UNKNOWN_CONNECTION;
}

// HCI command LE_Set_Address_Resolution_Enable (Vol 4, Part E § 7.8.44).
ErrorCode LinkLayerController::LeSetAddressResolutionEnable(bool enable) {
  // This command shall not be used when:
+19 −0
Original line number Diff line number Diff line
@@ -450,6 +450,16 @@ class LinkLayerController {
  // HCI command LE_Clear_Resolving_List (Vol 4, Part E § 7.8.40).
  ErrorCode LeClearResolvingList();

  // HCI command LE_Read_Peer_Resolvable_Address (Vol 4, Part E § 7.8.42).
  ErrorCode LeReadPeerResolvableAddress(
      PeerAddressType peer_identity_address_type, Address peer_identity_address,
      Address* peer_resolvable_address);

  // HCI command LE_Read_Local_Resolvable_Address (Vol 4, Part E § 7.8.43).
  ErrorCode LeReadLocalResolvableAddress(
      PeerAddressType peer_identity_address_type, Address peer_identity_address,
      Address* local_resolvable_address);

  // HCI command LE_Set_Address_Resolution_Enable (Vol 4, Part E § 7.8.44).
  ErrorCode LeSetAddressResolutionEnable(bool enable);

@@ -949,6 +959,15 @@ class LinkLayerController {
    std::array<uint8_t, kIrkSize> peer_irk;
    std::array<uint8_t, kIrkSize> local_irk;
    bluetooth::hci::PrivacyMode privacy_mode;

    // Resolvable Private Address being used by the local device.
    // It is the last resolvable private address generated for
    // this identity address.
    std::optional<Address> local_resolvable_address;
    // Resolvable Private Address being used by the peer device.
    // It is the last resolvable private address received that resolved
    // to this identity address.
    std::optional<Address> peer_resolvable_address;
  };

  std::vector<ResolvingListEntry> le_resolving_list_;