OSDN Git Service

gd: Add monitor ability to receive packet credits
authorChris Manton <cmanton@google.com>
Tue, 6 Oct 2020 23:14:55 +0000 (16:14 -0700)
committerChris Manton <cmanton@google.com>
Thu, 8 Oct 2020 06:07:33 +0000 (06:07 +0000)
Primarily used for acl shim

Bug: 166280067
Tag: #refactor
Test: gd/cert/run --host
Change-Id: Iebd60d4e41b45895aed0f7daf60941a1dff2ff59

gd/hci/controller.cc
gd/hci/controller.h

index 8486ce7..b052ec0 100644 (file)
@@ -149,6 +149,9 @@ struct Controller::impl {
       uint16_t handle = completed_packets.connection_handle_;
       uint16_t credits = completed_packets.host_num_of_completed_packets_;
       acl_credits_callback_.Invoke(handle, credits);
+      if (!acl_monitor_credits_callback_.IsEmpty()) {
+        acl_monitor_credits_callback_.Invoke(handle, credits);
+      }
     }
   }
 
@@ -162,6 +165,26 @@ struct Controller::impl {
     acl_credits_callback_ = {};
   }
 
+  void register_completed_monitor_acl_packets_callback(CompletedAclPacketsCallback callback) {
+    ASSERT(acl_monitor_credits_callback_.IsEmpty());
+    acl_monitor_credits_callback_ = callback;
+  }
+
+  void unregister_completed_monitor_acl_packets_callback() {
+    ASSERT(!acl_monitor_credits_callback_.IsEmpty());
+    acl_monitor_credits_callback_ = {};
+  }
+
+  void register_monitor_completed_acl_packets_callback(CompletedAclPacketsCallback callback) {
+    ASSERT(acl_monitor_credits_callback_.IsEmpty());
+    acl_monitor_credits_callback_ = callback;
+  }
+
+  void unregister_monitor_completed_acl_packets_callback() {
+    ASSERT(!acl_monitor_credits_callback_.IsEmpty());
+    acl_monitor_credits_callback_ = {};
+  }
+
   void read_local_name_complete_handler(CommandCompleteView view) {
     auto complete_view = ReadLocalNameCompleteView::Create(view);
     ASSERT(complete_view.IsValid());
@@ -777,6 +800,7 @@ struct Controller::impl {
   HciLayer* hci_;
 
   CompletedAclPacketsCallback acl_credits_callback_{};
+  CompletedAclPacketsCallback acl_monitor_credits_callback_{};
   LocalVersionInformation local_version_information_;
   std::array<uint8_t, 64> local_supported_commands_;
   uint8_t maximum_page_number_;
@@ -813,6 +837,14 @@ void Controller::UnregisterCompletedAclPacketsCallback() {
   CallOn(impl_.get(), &impl::unregister_completed_acl_packets_callback);
 }
 
+void Controller::RegisterCompletedMonitorAclPacketsCallback(CompletedAclPacketsCallback cb) {
+  CallOn(impl_.get(), &impl::register_completed_monitor_acl_packets_callback, cb);
+}
+
+void Controller::UnregisterCompletedMonitorAclPacketsCallback() {
+  CallOn(impl_.get(), &impl::unregister_completed_monitor_acl_packets_callback);
+}
+
 std::string Controller::GetLocalName() const {
   return impl_->local_name_;
 }
index b76f25c..d353130 100644 (file)
@@ -37,6 +37,9 @@ class Controller : public Module {
 
   virtual void UnregisterCompletedAclPacketsCallback();
 
+  virtual void RegisterCompletedMonitorAclPacketsCallback(CompletedAclPacketsCallback cb);
+  virtual void UnregisterCompletedMonitorAclPacketsCallback();
+
   virtual std::string GetLocalName() const;
 
   virtual LocalVersionInformation GetLocalVersionInformation() const;