case bluetooth::hci::EventCode::USER_PASSKEY_NOTIFICATION:
case bluetooth::hci::EventCode::KEYPRESS_NOTIFICATION:
case bluetooth::hci::EventCode::REMOTE_HOST_SUPPORTED_FEATURES_NOTIFICATION:
- case bluetooth::hci::EventCode::LE_META_EVENT:
case bluetooth::hci::EventCode::NUMBER_OF_COMPLETED_DATA_BLOCKS:
case bluetooth::hci::EventCode::VENDOR_SPECIFIC:
return true;
+ case bluetooth::hci::EventCode::LE_META_EVENT: // Private to hci
+ return false;
}
return false;
};
+bool is_valid_subevent_code(uint8_t subevent_code_raw) {
+ auto subevent_code =
+ static_cast<bluetooth::hci::SubeventCode>(subevent_code_raw);
+ switch (subevent_code) {
+ case bluetooth::hci::SubeventCode::CONNECTION_COMPLETE:
+ case bluetooth::hci::SubeventCode::CONNECTION_UPDATE_COMPLETE:
+ case bluetooth::hci::SubeventCode::DATA_LENGTH_CHANGE:
+ case bluetooth::hci::SubeventCode::ENHANCED_CONNECTION_COMPLETE:
+ case bluetooth::hci::SubeventCode::PHY_UPDATE_COMPLETE:
+ case bluetooth::hci::SubeventCode::READ_REMOTE_FEATURES_COMPLETE:
+ case bluetooth::hci::SubeventCode::REMOTE_CONNECTION_PARAMETER_REQUEST:
+ case bluetooth::hci::SubeventCode::READ_LOCAL_P256_PUBLIC_KEY_COMPLETE:
+ case bluetooth::hci::SubeventCode::GENERATE_DHKEY_COMPLETE:
+ case bluetooth::hci::SubeventCode::DIRECTED_ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::EXTENDED_ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::PERIODIC_ADVERTISING_SYNC_ESTABLISHED:
+ case bluetooth::hci::SubeventCode::PERIODIC_ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::PERIODIC_ADVERTISING_SYNC_LOST:
+ case bluetooth::hci::SubeventCode::SCAN_TIMEOUT:
+ case bluetooth::hci::SubeventCode::ADVERTISING_SET_TERMINATED:
+ case bluetooth::hci::SubeventCode::SCAN_REQUEST_RECEIVED:
+ case bluetooth::hci::SubeventCode::CHANNEL_SELECTION_ALGORITHM:
+ case bluetooth::hci::SubeventCode::CONNECTIONLESS_IQ_REPORT:
+ case bluetooth::hci::SubeventCode::CONNECTION_IQ_REPORT:
+ case bluetooth::hci::SubeventCode::CTE_REQUEST_FAILED:
+ case bluetooth::hci::SubeventCode::
+ PERIODIC_ADVERTISING_SYNC_TRANSFER_RECEIVED:
+ case bluetooth::hci::SubeventCode::CIS_ESTABLISHED:
+ case bluetooth::hci::SubeventCode::CIS_REQUEST:
+ case bluetooth::hci::SubeventCode::CREATE_BIG_COMPLETE:
+ case bluetooth::hci::SubeventCode::TERMINATE_BIG_COMPLETE:
+ case bluetooth::hci::SubeventCode::BIG_SYNC_ESTABLISHED:
+ case bluetooth::hci::SubeventCode::BIG_SYNC_LOST:
+ case bluetooth::hci::SubeventCode::REQUEST_PEER_SCA_COMPLETE:
+ case bluetooth::hci::SubeventCode::PATH_LOSS_THRESHOLD:
+ case bluetooth::hci::SubeventCode::TRANSMIT_POWER_REPORTING:
+ case bluetooth::hci::SubeventCode::BIG_INFO_ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::LONG_TERM_KEY_REQUEST:
+ return true;
+ default:
+ return false;
+ }
+}
+
static bool event_already_registered_in_hci_layer(
bluetooth::hci::EventCode event_code) {
switch (event_code) {
}
}
+static bool event_already_registered_in_acl_layer(
+ bluetooth::hci::EventCode event_code) {
+ for (auto event : bluetooth::hci::AclConnectionEvents) {
+ if (event == event_code) {
+ return bluetooth::shim::is_gd_acl_enabled();
+ }
+ }
+ return false;
+}
+
+static bool subevent_already_registered_in_le_hci_layer(
+ bluetooth::hci::SubeventCode subevent_code) {
+ switch (subevent_code) {
+ case bluetooth::hci::SubeventCode::CONNECTION_COMPLETE:
+ case bluetooth::hci::SubeventCode::CONNECTION_UPDATE_COMPLETE:
+ case bluetooth::hci::SubeventCode::DATA_LENGTH_CHANGE:
+ case bluetooth::hci::SubeventCode::ENHANCED_CONNECTION_COMPLETE:
+ case bluetooth::hci::SubeventCode::PHY_UPDATE_COMPLETE:
+ case bluetooth::hci::SubeventCode::REMOTE_CONNECTION_PARAMETER_REQUEST:
+ return bluetooth::shim::is_gd_acl_enabled();
+
+ case bluetooth::hci::SubeventCode::READ_REMOTE_FEATURES_COMPLETE:
+ case bluetooth::hci::SubeventCode::READ_LOCAL_P256_PUBLIC_KEY_COMPLETE:
+ case bluetooth::hci::SubeventCode::GENERATE_DHKEY_COMPLETE:
+ case bluetooth::hci::SubeventCode::DIRECTED_ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::EXTENDED_ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::PERIODIC_ADVERTISING_SYNC_ESTABLISHED:
+ case bluetooth::hci::SubeventCode::PERIODIC_ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::PERIODIC_ADVERTISING_SYNC_LOST:
+ case bluetooth::hci::SubeventCode::SCAN_TIMEOUT:
+ case bluetooth::hci::SubeventCode::ADVERTISING_SET_TERMINATED:
+ case bluetooth::hci::SubeventCode::SCAN_REQUEST_RECEIVED:
+ case bluetooth::hci::SubeventCode::CHANNEL_SELECTION_ALGORITHM:
+ case bluetooth::hci::SubeventCode::CONNECTIONLESS_IQ_REPORT:
+ case bluetooth::hci::SubeventCode::CONNECTION_IQ_REPORT:
+ case bluetooth::hci::SubeventCode::CTE_REQUEST_FAILED:
+ case bluetooth::hci::SubeventCode::
+ PERIODIC_ADVERTISING_SYNC_TRANSFER_RECEIVED:
+ case bluetooth::hci::SubeventCode::CIS_ESTABLISHED:
+ case bluetooth::hci::SubeventCode::CIS_REQUEST:
+ case bluetooth::hci::SubeventCode::CREATE_BIG_COMPLETE:
+ case bluetooth::hci::SubeventCode::TERMINATE_BIG_COMPLETE:
+ case bluetooth::hci::SubeventCode::BIG_SYNC_ESTABLISHED:
+ case bluetooth::hci::SubeventCode::BIG_SYNC_LOST:
+ case bluetooth::hci::SubeventCode::REQUEST_PEER_SCA_COMPLETE:
+ case bluetooth::hci::SubeventCode::PATH_LOSS_THRESHOLD:
+ case bluetooth::hci::SubeventCode::TRANSMIT_POWER_REPORTING:
+ case bluetooth::hci::SubeventCode::BIG_INFO_ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::ADVERTISING_REPORT:
+ case bluetooth::hci::SubeventCode::LONG_TERM_KEY_REQUEST:
+ default:
+ return false;
+ }
+}
+
static bool event_already_registered_in_le_advertising_manager(
bluetooth::hci::EventCode event_code) {
for (auto event : bluetooth::hci::AclConnectionEvents) {
&event_packet_view));
}
+static void subevent_callback(
+ bluetooth::hci::LeMetaEventView le_meta_event_view) {
+ if (!send_data_upwards) {
+ return;
+ }
+ send_data_upwards.Run(FROM_HERE, WrapPacketAndCopy(MSG_HC_TO_STACK_HCI_EVT,
+ &le_meta_event_view));
+}
+
static void set_data_cb(
base::Callback<void(const base::Location&, BT_HDR*)> send_data_cb) {
send_data_upwards = std::move(send_data_cb);
continue;
}
auto event_code = static_cast<bluetooth::hci::EventCode>(event_code_raw);
- if (event_already_registered_in_hci_layer(event_code)) {
+ if (event_already_registered_in_acl_layer(event_code)) {
+ continue;
+ } else if (event_already_registered_in_hci_layer(event_code)) {
continue;
} else if (event_already_registered_in_le_advertising_manager(event_code)) {
continue;
event_code, handler->Bind(event_callback));
}
+ for (uint8_t subevent_code_raw = 0; subevent_code_raw < 0xFF;
+ subevent_code_raw++) {
+ if (!is_valid_subevent_code(subevent_code_raw)) {
+ continue;
+ }
+ auto subevent_code =
+ static_cast<bluetooth::hci::SubeventCode>(subevent_code_raw);
+ if (subevent_already_registered_in_le_hci_layer(subevent_code)) {
+ continue;
+ }
+
+ auto handler = bluetooth::shim::GetGdShimHandler();
+ bluetooth::shim::GetHciLayer()->RegisterLeEventHandler(
+ subevent_code, handler->Bind(subevent_callback));
+ }
+
+ if (bluetooth::shim::is_gd_acl_enabled()) {
+ return;
+ }
+
hci_queue_end = bluetooth::shim::GetHciLayer()->GetAclQueueEnd();
// if gd advertising enabled, hci_queue_end will be register in