RootCanal: AddressResolutionEnable

Bug: 202018502
Test: cert/run
Tag: #feature
Change-Id: I46f5745efabe8edfdbdf4cbcf05447283a3a225c
diff --git a/vendor_libs/test_vendor_lib/model/controller/dual_mode_controller.cc b/vendor_libs/test_vendor_lib/model/controller/dual_mode_controller.cc
index 654aeac..6cd3fc5 100644
--- a/vendor_libs/test_vendor_lib/model/controller/dual_mode_controller.cc
+++ b/vendor_libs/test_vendor_lib/model/controller/dual_mode_controller.cc
@@ -1611,12 +1611,16 @@
 }
 
 void DualModeController::LeSetAddressResolutionEnable(CommandView command) {
-    // NOP
-    auto payload =
-      std::make_unique<bluetooth::packet::RawBuilder>(std::vector<uint8_t>(
-          {static_cast<uint8_t>(bluetooth::hci::ErrorCode::SUCCESS)}));
-  send_event_(bluetooth::hci::CommandCompleteBuilder::Create(
-      kNumCommandPackets, command.GetOpCode(), std::move(payload)));
+  auto command_view = gd_hci::LeSetAddressResolutionEnableView::Create(
+      gd_hci::LeSecurityCommandView::Create(
+          gd_hci::SecurityCommandView::Create(command)));
+  ASSERT(command_view.IsValid());
+  auto status = link_layer_controller_.LeSetAddressResolutionEnable(
+      command_view.GetAddressResolutionEnable() ==
+      bluetooth::hci::Enable::ENABLED);
+  send_event_(
+      bluetooth::hci::LeSetAddressResolutionEnableCompleteBuilder::Create(
+          kNumCommandPackets, status));
 }
 
 void DualModeController::LeSetResovalablePrivateAddressTimeout(CommandView command) {
diff --git a/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.cc b/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.cc
index dc1ffbb..2be1c2c 100644
--- a/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.cc
+++ b/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.cc
@@ -2878,6 +2878,15 @@
   return ErrorCode::SUCCESS;
 }
 
+ErrorCode LinkLayerController::LeSetAddressResolutionEnable(bool enable) {
+  if (ResolvingListBusy()) {
+    return ErrorCode::COMMAND_DISALLOWED;
+  }
+
+  le_resolving_list_enabled_ = enable;
+  return ErrorCode::SUCCESS;
+}
+
 ErrorCode LinkLayerController::LeResolvingListClear() {
   if (ResolvingListBusy()) {
     return ErrorCode::COMMAND_DISALLOWED;
diff --git a/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.h b/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.h
index 8693add..f3ab298 100644
--- a/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.h
+++ b/vendor_libs/test_vendor_lib/model/controller/link_layer_controller.h
@@ -181,6 +181,7 @@
   bool LeConnectListContainsDevice(Address addr, uint8_t addr_type);
   bool LeConnectListFull();
   bool ResolvingListBusy();
+  ErrorCode LeSetAddressResolutionEnable(bool enable);
   ErrorCode LeResolvingListClear();
   ErrorCode LeResolvingListAddDevice(Address addr, uint8_t addr_type,
                                      std::array<uint8_t, kIrkSize> peerIrk,
@@ -463,6 +464,7 @@
     std::array<uint8_t, kIrkSize> local_irk;
   };
   std::vector<ResolvingListEntry> le_resolving_list_;
+  bool le_resolving_list_enabled_{false};
 
   std::array<LeAdvertiser, 7> advertisers_;