From f58215f418b2ec822b289237228d60b8cc070ed9 Mon Sep 17 00:00:00 2001 From: Chris Manton Date: Sat, 26 Sep 2020 16:07:41 -0700 Subject: [PATCH] Single out Register events LE_META_EVENT as special LE_META_EVENT is a special event that multiplexes LE events underneath and should not be exposed. Test Parameters: INIT_gd_hci=true Bug: 166280067 Tag: #refactor Test: gd/cert/run --host Test: ble paired 2 phones Test: act.py -tc BleCocTest Change-Id: Idf8dd9fa9e13fc9e2d1d7d89d6af0a16ec574b89 --- gd/hci/hci_layer.cc | 40 +++++++++++++++++++++++++++++++++------- gd/hci/hci_layer.h | 1 + 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/gd/hci/hci_layer.cc b/gd/hci/hci_layer.cc index e581f2436..c480fc1d7 100644 --- a/gd/hci/hci_layer.cc +++ b/gd/hci/hci_layer.cc @@ -171,6 +171,11 @@ struct HciLayer::impl { } void register_event(EventCode event, ContextualCallback handler) { + ASSERT_LOG( + event != EventCode::LE_META_EVENT, + "Can not register handler for %02hhx (%s)", + EventCode::LE_META_EVENT, + EventCodeText(EventCode::LE_META_EVENT).c_str()); ASSERT_LOG(event_handlers_.count(event) == 0, "Can not register a second handler for %02hhx (%s)", event, EventCodeText(event).c_str()); event_handlers_[event] = handler; @@ -180,6 +185,19 @@ struct HciLayer::impl { event_handlers_.erase(event_handlers_.find(event)); } + void register_le_meta_event(ContextualCallback handler) { + ASSERT_LOG( + event_handlers_.count(EventCode::LE_META_EVENT) == 0, + "Can not register a second handler for %02hhx (%s)", + EventCode::LE_META_EVENT, + EventCodeText(EventCode::LE_META_EVENT).c_str()); + event_handlers_[EventCode::LE_META_EVENT] = handler; + } + + void unregister_le_meta_event() { + unregister_event(EventCode::LE_META_EVENT); + } + void register_le_event(SubeventCode event, ContextualCallback handler) { ASSERT_LOG(subevent_handlers_.count(event) == 0, "Can not register a second handler for %02hhx (%s)", event, SubeventCodeText(event).c_str()); @@ -193,10 +211,11 @@ struct HciLayer::impl { void on_hci_event(EventPacketView event) { ASSERT(event.IsValid()); EventCode event_code = event.GetEventCode(); - if (event_handlers_.find(event_code) == event_handlers_.end()) { - LOG_DEBUG("Dropping unregistered event of type 0x%02hhx (%s)", event_code, EventCodeText(event_code).c_str()); - return; - } + ASSERT_LOG( + event_handlers_.find(event_code) != event_handlers_.end(), + "Unhandled event of type 0x%02hhx (%s)", + event_code, + EventCodeText(event_code).c_str()); event_handlers_[event_code].Invoke(event); } @@ -204,8 +223,11 @@ struct HciLayer::impl { LeMetaEventView meta_event_view = LeMetaEventView::Create(event); ASSERT(meta_event_view.IsValid()); SubeventCode subevent_code = meta_event_view.GetSubeventCode(); - ASSERT_LOG(subevent_handlers_.find(subevent_code) != subevent_handlers_.end(), - "Unhandled le event of type 0x%02hhx (%s)", subevent_code, SubeventCodeText(subevent_code).c_str()); + ASSERT_LOG( + subevent_handlers_.find(subevent_code) != subevent_handlers_.end(), + "Unhandled le subevent of type 0x%02hhx (%s)", + subevent_code, + SubeventCodeText(subevent_code).c_str()); subevent_handlers_[subevent_code].Invoke(meta_event_view); } @@ -276,6 +298,10 @@ void HciLayer::RegisterEventHandler(EventCode event, ContextualCallback handler) { + CallOn(impl_, &impl::register_le_meta_event, handler); +} + void HciLayer::UnregisterEventHandler(EventCode event) { CallOn(impl_, &impl::unregister_event, event); } @@ -369,8 +395,8 @@ void HciLayer::Start() { impl_->acl_queue_.GetDownEnd()->RegisterDequeue(handler, BindOn(impl_, &impl::on_outbound_acl_ready)); RegisterEventHandler(EventCode::COMMAND_COMPLETE, handler->BindOn(impl_, &impl::on_command_complete)); RegisterEventHandler(EventCode::COMMAND_STATUS, handler->BindOn(impl_, &impl::on_command_status)); + RegisterLeMetaEventHandler(handler->BindOn(impl_, &impl::on_le_meta_event)); if (bluetooth::common::InitFlags::GdCoreEnabled()) { - RegisterEventHandler(EventCode::LE_META_EVENT, handler->BindOn(impl_, &impl::on_le_meta_event)); RegisterEventHandler( EventCode::DISCONNECTION_COMPLETE, handler->BindOn(this, &HciLayer::on_disconnection_complete)); } diff --git a/gd/hci/hci_layer.h b/gd/hci/hci_layer.h index 812340505..da3335b65 100644 --- a/gd/hci/hci_layer.h +++ b/gd/hci/hci_layer.h @@ -97,6 +97,7 @@ class HciLayer : public Module, public CommandInterface { void Stop() override; virtual void Disconnect(uint16_t handle, ErrorCode reason); + virtual void RegisterLeMetaEventHandler(common::ContextualCallback event_handler); private: struct impl; -- 2.11.0