":BluetoothHciSources",
":BluetoothL2capSources",
":BluetoothPacketSources",
+ ":BluetoothShimSources",
":BluetoothSmpSources",
],
generated_headers: [
--- /dev/null
+filegroup {
+ name: "BluetoothShimSources",
+ srcs: [
+ "stack.cc",
+ ],
+}
--- /dev/null
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+/**
+ * Legacy stack manipulation methods to allow the legacy stack to start
+ * and stop the stack, and to provide Gd shim stack module API access.
+ */
+namespace bluetooth {
+namespace shim {
+
+struct IStack {
+ virtual void Start() = 0;
+ virtual void Stop() = 0;
+
+ virtual ~IStack() {}
+};
+
+IStack* GetGabeldorscheStack();
+
+} // namespace shim
+} // namespace bluetooth
--- /dev/null
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+/**
+ * This common file provides the only visibility from the legacy stack into GD stack.
+ *
+ * Only interfaces or APIs should be exported.
+ *
+ * Only common data structures should be used to pass data between the stacks.
+ *
+ */
+#include "gd/shim/istack.h"
--- /dev/null
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "bt_gd"
+
+#include "shim/stack.h"
+#include "hal/hci_hal.h"
+#include "hci/acl_manager.h"
+#include "hci/classic_security_manager.h"
+#include "l2cap/l2cap_layer.h"
+#include "os/log.h"
+#include "os/thread.h"
+#include "stack_manager.h"
+
+using ::bluetooth::os::Thread;
+
+struct bluetooth::shim::Stack::impl {
+ void Start() {
+ if (is_running_) {
+ LOG_ERROR("%s Gd stack already running", __func__);
+ return;
+ }
+
+ LOG_INFO("%s Starting Gd stack", __func__);
+ ModuleList modules;
+ modules.add<::bluetooth::hal::HciHal>();
+ modules.add<::bluetooth::hci::AclManager>();
+ modules.add<::bluetooth::hci::ClassicSecurityManager>();
+ modules.add<::bluetooth::l2cap::L2capLayer>();
+
+ stack_thread_ = new Thread("gd_stack_thread", Thread::Priority::NORMAL);
+ stack_manager_.StartUp(&modules, stack_thread_);
+ // TODO(cmanton) Gd stack has spun up another thread with no
+ // ability to ascertain the completion
+ is_running_ = true;
+ LOG_INFO("%s Successfully toggled Gd stack", __func__);
+ }
+
+ void Stop() {
+ if (!is_running_) {
+ LOG_ERROR("%s Gd stack not running", __func__);
+ return;
+ }
+
+ stack_manager_.ShutDown();
+ delete stack_thread_;
+ is_running_ = false;
+ LOG_INFO("%s Successfully shut down Gd stack", __func__);
+ }
+
+ private:
+ os::Thread* stack_thread_ = nullptr;
+ bool is_running_ = false;
+ StackManager stack_manager_;
+};
+
+bluetooth::shim::Stack::Stack() {
+ pimpl_ = std::make_unique<impl>();
+ LOG_INFO("%s Created gd stack", __func__);
+}
+
+void bluetooth::shim::Stack::Start() {
+ pimpl_->Start();
+}
+
+void bluetooth::shim::Stack::Stop() {
+ pimpl_->Stop();
+}
+
+bluetooth::shim::IStack* bluetooth::shim::GetGabeldorscheStack() {
+ static IStack* instance = new Stack();
+ return instance;
+}
--- /dev/null
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <memory>
+
+#include "shim/istack.h"
+
+/**
+ * The shim layer implementation on the Gd stack side.
+ */
+namespace bluetooth {
+namespace shim {
+
+class Stack : public IStack {
+ public:
+ Stack();
+ ~Stack() = default;
+
+ void Start() override; // IStack
+ void Stop() override; // IStack
+
+ private:
+ struct impl;
+ std::unique_ptr<impl> pimpl_;
+
+ Stack(const Stack&) = delete;
+ void operator=(const Stack&) = delete;
+};
+
+} // namespace shim
+} // namespace bluetooth
// Bluetooth main HW module / shared library for target
// ========================================================
-cc_library_shared {
- name: "libbluetooth",
- defaults: ["fluoride_defaults"],
- header_libs: ["libbluetooth_headers"],
- export_header_lib_headers: ["libbluetooth_headers"],
+filegroup {
+ name: "LibBluetoothSources",
srcs: [
- // platform specific
"bte_conf.cc",
"bte_init.cc",
"bte_init_cpp_logging.cc",
"bte_logmsg.cc",
"bte_main.cc",
+ "shim/entry.cc",
+ "shim/shim.cc",
"stack_config.cc",
+ ]
+}
+
+cc_library_shared {
+ name: "libbluetooth",
+ defaults: ["fluoride_defaults"],
+ header_libs: ["libbluetooth_headers"],
+ export_header_lib_headers: ["libbluetooth_headers"],
+ srcs: [
+ ":LibBluetoothSources",
],
include_dirs: [
"system/bt",
"libFraunhoferAAC",
"libg722codec",
"libudrv-uipc",
+ "libbluetooth_gd", // Gabeldorsche
],
whole_static_libs: [
"libbt-bta",
defaults: ["fluoride_defaults"],
srcs: [
- "bte_conf.cc",
- "bte_init.cc",
- "bte_init_cpp_logging.cc",
- "bte_logmsg.cc",
- "bte_main.cc",
- "stack_config.cc",
+ ":LibBluetoothSources",
+ "shim/entry_for_test.cc",
],
include_dirs: [
"system/bt",
#include "osi/include/future.h"
#include "osi/include/log.h"
#include "osi/include/osi.h"
+#include "shim/shim.h"
#include "stack_config.h"
/*******************************************************************************
void bte_main_enable() {
APPL_TRACE_DEBUG("%s", __func__);
- module_start_up(get_module(BTSNOOP_MODULE));
- module_start_up(get_module(HCI_MODULE));
+ if (bluetooth::shim::is_gd_shim_enabled()) {
+ LOG_INFO(LOG_TAG, "%s Gd shim module enabled", __func__);
+ } else {
+ module_start_up(get_module(BTSNOOP_MODULE));
+ module_start_up(get_module(HCI_MODULE));
+ }
BTU_StartUp();
}
void bte_main_disable(void) {
APPL_TRACE_DEBUG("%s", __func__);
- module_shut_down(get_module(HCI_MODULE));
- module_shut_down(get_module(BTSNOOP_MODULE));
+ if (bluetooth::shim::is_gd_shim_enabled()) {
+ LOG_INFO(LOG_TAG, "%s Gd shim module enabled", __func__);
+ module_shut_down(get_module(GD_SHIM_MODULE));
+ } else {
+ module_shut_down(get_module(HCI_MODULE));
+ module_shut_down(get_module(BTSNOOP_MODULE));
+ }
BTU_ShutDown();
}
--- /dev/null
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "main/shim/entry.h"
+#include "gd/shim/only_include_this_file_into_legacy_stack___ever.h"
+#include "osi/include/future.h"
+
+using bluetooth::shim::GetGabeldorscheStack;
+
+future_t* bluetooth::shim::StartGabeldorscheStack() {
+ GetGabeldorscheStack()->Start();
+ return (future_t*)nullptr;
+}
+
+future_t* bluetooth::shim::StopGabeldorscheStack() {
+ GetGabeldorscheStack()->Stop();
+ return (future_t*)nullptr;
+}
--- /dev/null
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+/**
+ * Entrypoints called into Gabeldorsche from legacy stack
+ *
+ * Any marshalling/unmarshalling, data transformation of APIs to
+ * or from the Gabeldorsche stack may be placed here.
+ *
+ * The idea is to effectively provide a binary interface to prevent cross
+ * contamination of data structures and the like between the stacks.
+ *
+ * **ABSOLUTELY** No reference to Gabeldorsche stack other than well defined
+ * interfaces may be made here
+ */
+
+#include "gd/shim/only_include_this_file_into_legacy_stack___ever.h"
+#include "osi/include/future.h"
+
+namespace bluetooth {
+namespace shim {
+
+future_t* StartGabeldorscheStack();
+future_t* StopGabeldorscheStack();
+
+} // namespace shim
+} // namespace bluetooth
--- /dev/null
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gd/shim/only_include_this_file_into_legacy_stack___ever.h"
+#include "main/shim/entry.h"
+
+/**
+ * Entrypoints for stubbed bluetooth test library
+ *
+ * Gd stack is not supported using legacy test modes
+ */
+bluetooth::shim::IStack* bluetooth::shim::GetGabeldorscheStack() {
+ return (bluetooth::shim::IStack*)nullptr;
+}
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#include "main/shim/shim.h"
+#include "main/shim/entry.h"
+
+// TODO(cmanton) Connect this flag to an external input
+#if 1
+static bool gd_shim_enabled_ = false;
+#else
+static bool gd_shim_enabled_ = true;
+#endif
+
+EXPORT_SYMBOL extern const module_t gd_shim_module = {
+ .name = GD_SHIM_MODULE,
+ .init = NULL,
+ .start_up = bluetooth::shim::StartGabeldorscheStack,
+ .shut_down = bluetooth::shim::StopGabeldorscheStack,
+ .clean_up = NULL,
+ .dependencies = {NULL}};
+
+bool bluetooth::shim::is_gd_shim_enabled() { return gd_shim_enabled_; }
--- /dev/null
+/******************************************************************************
+ *
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+/**
+ * Gabeldorsche related legacy-only-stack-side expansion and support code.
+ */
+#include "btcore/include/module.h"
+#include "main/shim/entry.h"
+
+static const char GD_SHIM_MODULE[] = "gd_shim_module";
+
+namespace bluetooth {
+namespace shim {
+
+bool is_gd_shim_enabled();
+
+} // namespace shim
+} // namespace bluetooth