Loading tools/rootcanal/model/controller/dual_mode_controller.cc +30 −4 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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, Loading tools/rootcanal/model/controller/dual_mode_controller.h +5 −7 Original line number Diff line number Diff line Loading @@ -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); Loading tools/rootcanal/model/controller/link_layer_controller.cc +73 −6 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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}; } } Loading Loading @@ -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; } Loading Loading @@ -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: Loading tools/rootcanal/model/controller/link_layer_controller.h +19 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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_; Loading Loading
tools/rootcanal/model/controller/dual_mode_controller.cc +30 −4 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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, Loading
tools/rootcanal/model/controller/dual_mode_controller.h +5 −7 Original line number Diff line number Diff line Loading @@ -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); Loading
tools/rootcanal/model/controller/link_layer_controller.cc +73 −6 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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}; } } Loading Loading @@ -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; } Loading Loading @@ -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: Loading
tools/rootcanal/model/controller/link_layer_controller.h +19 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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_; Loading