OSDN Git Service

rusty-gd: add stack start stubs, define shim library
authorZach Johnson <zachoverflow@google.com>
Tue, 1 Dec 2020 19:17:13 +0000 (11:17 -0800)
committerZach Johnson <zachoverflow@google.com>
Thu, 3 Dec 2020 00:54:36 +0000 (16:54 -0800)
to avoid duplicate symbols, all CXX FFI integrated into the native code
needs to be from a single library. Move init_flags FFI into libbt_shim
too.

Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost SimpleHalTest
Change-Id: I5207f4df903cf434b470be84133179b04d5c9483

15 files changed:
build/Android.bp
gd/Android.bp
gd/rust/common/Android.bp
gd/rust/common/src/init_flags.rs
gd/rust/common/src/lib.rs
gd/rust/shim/Android.bp [new file with mode: 0644]
gd/rust/shim/src/init_flags.rs [new file with mode: 0644]
gd/rust/shim/src/lib.rs [new file with mode: 0644]
gd/rust/shim/src/stack.rs [new file with mode: 0644]
main/Android.bp
main/shim/stack.cc
stack/test/fuzzers/Android.bp
test/headless/Android.bp
test/rootcanal/Android.bp
vendor_libs/test_vendor_lib/Android.bp

index d7643e9..ed2bdeb 100644 (file)
@@ -90,6 +90,9 @@ fluoride_defaults {
     },
     static_libs: [
         "libbluetooth_gd",
+        "libbluetooth_rust_interop",
+        "libbt_shim_ffi",
+        "libcxxbridge05",
     ],
     target: {
         darwin: {
@@ -97,9 +100,6 @@ fluoride_defaults {
             enabled: false,
         },
     },
-    generated_headers: [
-        "libbt_common_bridge_header",
-    ],
 }
 
 // Enables code coverage for a set of source files. Must be combined with
index 116c324..d425951 100644 (file)
@@ -76,7 +76,6 @@ cc_defaults {
     name: "gd_clang_tidy",
     tidy: true,
     tidy_checks: [
-        "cppcoreguidelines-pro-type-member-init",
         "clang-analyzer-core.CallAndMessage",
         "clang-analyzer-optin.cplusplus.UninitializedObject",
         "-google*",
@@ -154,7 +153,6 @@ cc_defaults {
         "BluetoothGeneratedDumpsysDataSchema_h",
         "BluetoothGeneratedDumpsysBundledSchema_h",
         "BluetoothGeneratedPackets_h",
-        "libbt_common_bridge_header",
     ],
     shared_libs: [
         "libchrome",
@@ -164,26 +162,10 @@ cc_defaults {
     static_libs: [
         "libbluetooth-protos",
         "libbluetooth_rust_interop",
-        "libbt_common_ffi",
+        "libbt_shim_ffi",
         "libcxxbridge05",
     ],
-}
-
-cc_library_static {
-    name: "libbluetooth_rust_interop",
-    generated_headers: ["libbt_common_bridge_header"],
-    generated_sources: ["libbt_common_bridge_code"],
-    cflags: [
-        "-Wno-unused-const-variable",
-    ],
-    host_supported: true,
-    apex_available: [
-        "//apex_available:platform",
-        "com.android.bluetooth.updatable",
-    ],
-    static_libs: [
-        "libbt_common_ffi",
-    ],
+    export_static_lib_headers: [ "libbluetooth_rust_interop" ],
 }
 
 cc_library {
@@ -242,6 +224,9 @@ cc_binary {
         "libbluetooth-protos",
         "libbluetooth_gd",
         "libflatbuffers-cpp",
+        "libbluetooth_rust_interop",
+        "libbt_shim_ffi",
+        "libcxxbridge05",
     ],
     shared_libs: [
         "libbacktrace",
@@ -330,6 +315,9 @@ cc_test {
         "libc++fs",
         "libflatbuffers-cpp",
         "libgmock",
+        "libbluetooth_rust_interop",
+        "libbt_shim_ffi",
+        "libcxxbridge05",
     ],
     shared_libs: [
         "libchrome",
@@ -360,6 +348,11 @@ cc_test {
         address: true,
         cfi: true,
     },
+    static_libs: [
+        "libbluetooth_rust_interop",
+        "libbt_shim_ffi",
+        "libcxxbridge05",
+    ],
 }
 
 cc_defaults {
@@ -375,6 +368,9 @@ cc_defaults {
         "libchrome",
         "libgmock",
         "libgtest",
+        "libbluetooth_rust_interop",
+        "libbt_shim_ffi",
+        "libcxxbridge05",
     ],
     host_supported: true,
     generated_headers: [
index 2a77c98..040b269 100644 (file)
@@ -1,6 +1,5 @@
-rust_defaults {
-    name: "libbt_common_defaults",
-    stem: "libbt_common",
+rust_library {
+    name: "libbt_common",
     crate_name: "bt_common",
     srcs: ["src/lib.rs"],
     edition: "2018",
@@ -28,16 +27,6 @@ rust_defaults {
     host_supported: true,
 }
 
-rust_library {
-    name: "libbt_common",
-    defaults: ["libbt_common_defaults"],
-}
-
-rust_ffi_static {
-    name: "libbt_common_ffi",
-    defaults: ["libbt_common_defaults"],
-}
-
 rust_test_host {
     name: "libbt_common_inline_tests",
     srcs: ["src/lib.rs"],
@@ -50,22 +39,7 @@ rust_test_host {
         "libenv_logger",
         "libcxx",
     ],
+    proc_macros: [
+        "libpaste",
+    ],
 }
-
-genrule {
-    name: "libbt_common_bridge_header",
-    tools: ["cxxbridge"],
-    cmd: "$(location cxxbridge) $(in) --header > $(out)",
-    srcs: ["src/init_flags.rs"],
-    out: ["src/init_flags.rs.h"],
-}
-
-genrule {
-    name: "libbt_common_bridge_code",
-    tools: ["cxxbridge"],
-    cmd: "$(location cxxbridge) $(in) >> $(out)",
-    srcs: ["src/init_flags.rs"],
-    out: ["init_flags.cc"],
-}
-
-
index b550c34..9367f90 100644 (file)
@@ -2,24 +2,6 @@ use log::{error, info};
 use paste::paste;
 use std::sync::Mutex;
 
-#[cxx::bridge(namespace = bluetooth::common::init_flags)]
-mod ffi {
-    extern "Rust" {
-        fn load(flags: Vec<String>);
-        fn set_all_for_testing();
-
-        fn gd_core_is_enabled() -> bool;
-        fn gd_security_is_enabled() -> bool;
-        fn gd_advertising_is_enabled() -> bool;
-        fn gd_acl_is_enabled() -> bool;
-        fn gd_l2cap_is_enabled() -> bool;
-        fn gd_hci_is_enabled() -> bool;
-        fn gd_controller_is_enabled() -> bool;
-        fn gatt_robust_caching_is_enabled() -> bool;
-        fn btaa_hci_is_enabled() -> bool;
-    }
-}
-
 macro_rules! init_flags {
     (flags: { $($flag:ident),* }, dependencies: { $($parent:ident => $child:ident),* }) => {
         #[derive(Default)]
@@ -27,6 +9,7 @@ macro_rules! init_flags {
             $($flag: bool,)*
         }
 
+        /// Sets all flags to true, for testing
         pub fn set_all_for_testing() {
             *FLAGS.lock().unwrap() = InitFlags { $($flag: true,)* };
         }
@@ -81,6 +64,7 @@ macro_rules! init_flags {
 
         paste! {
             $(
+                #[allow(missing_docs)]
                 pub fn [<$flag _is_enabled>]() -> bool {
                     FLAGS.lock().unwrap().$flag
                 }
@@ -99,7 +83,8 @@ init_flags!(
         gd_hci,
         gd_controller,
         gatt_robust_caching,
-        btaa_hci
+        btaa_hci,
+        gd_rust
     },
     dependencies: {
         gd_core => gd_security,
@@ -113,12 +98,11 @@ lazy_static! {
     static ref FLAGS: Mutex<InitFlags> = Mutex::new(InitFlags::default());
 }
 
-fn load(flags: Vec<String>) {
+/// Loads the flag values from the passed-in vector of string values
+pub fn load(flags: Vec<String>) {
     crate::init_logging();
 
     let flags = InitFlags::parse(flags);
     flags.log();
     *FLAGS.lock().unwrap() = flags;
 }
-
-
index ca1e1cc..051bf10 100644 (file)
@@ -12,7 +12,8 @@ mod ready;
 #[macro_use]
 mod asserts;
 
-mod init_flags;
+/// Provides runtime configured-at-startup flags
+pub mod init_flags;
 
 /// Inits logging for Android
 #[cfg(target_os = "android")]
@@ -30,5 +31,6 @@ pub fn init_logging() {
     env_logger::Builder::new()
         .filter(None, log::LevelFilter::Debug)
         .parse_default_env()
-        .init();
+        .try_init()
+        .ok();
 }
diff --git a/gd/rust/shim/Android.bp b/gd/rust/shim/Android.bp
new file mode 100644 (file)
index 0000000..c4035db
--- /dev/null
@@ -0,0 +1,64 @@
+rust_ffi_static {
+    name: "libbt_shim_ffi",
+    crate_name: "bt_shim",
+    srcs: ["src/lib.rs"],
+    rustlibs: [
+        "libbt_hal",
+        "libbt_hci",
+        "libbt_common",
+        "libcxx",
+    ],
+    host_supported: true,
+}
+
+cc_library_static {
+    name: "libbluetooth_rust_interop",
+    generated_headers: ["libbt_init_flags_bridge_header", "libbt_shim_bridge_header"],
+    generated_sources: ["libbt_init_flags_bridge_code", "libbt_shim_bridge_code"],
+    export_generated_headers: ["libbt_init_flags_bridge_header", "libbt_shim_bridge_header"],
+    cflags: [
+        "-Wno-unused-const-variable",
+    ],
+    host_supported: true,
+    apex_available: [
+        "//apex_available:platform",
+        "com.android.bluetooth.updatable",
+    ],
+    static_libs: [
+        "libbt_shim_ffi",
+    ],
+}
+
+genrule {
+    name: "libbt_shim_bridge_header",
+    tools: ["cxxbridge"],
+    cmd: "$(location cxxbridge) $(in) --header > $(out)",
+    srcs: ["src/stack.rs"],
+    out: ["src/stack.rs.h"],
+}
+
+genrule {
+    name: "libbt_shim_bridge_code",
+    tools: ["cxxbridge"],
+    cmd: "$(location cxxbridge) $(in) >> $(out)",
+    srcs: ["src/stack.rs"],
+    out: ["stack.cc"],
+}
+
+genrule {
+    name: "libbt_init_flags_bridge_header",
+    tools: ["cxxbridge"],
+    cmd: "$(location cxxbridge) $(in) --header > $(out)",
+    srcs: ["src/init_flags.rs"],
+    out: ["src/init_flags.rs.h"],
+}
+
+genrule {
+    name: "libbt_init_flags_bridge_code",
+    tools: ["cxxbridge"],
+    cmd: "$(location cxxbridge) $(in) >> $(out)",
+    srcs: ["src/init_flags.rs"],
+    out: ["init_flags.cc"],
+}
+
+
diff --git a/gd/rust/shim/src/init_flags.rs b/gd/rust/shim/src/init_flags.rs
new file mode 100644 (file)
index 0000000..e598af6
--- /dev/null
@@ -0,0 +1,20 @@
+#[cxx::bridge(namespace = bluetooth::common::init_flags)]
+mod ffi {
+    extern "Rust" {
+        fn load(flags: Vec<String>);
+        fn set_all_for_testing();
+
+        fn gd_core_is_enabled() -> bool;
+        fn gd_security_is_enabled() -> bool;
+        fn gd_advertising_is_enabled() -> bool;
+        fn gd_acl_is_enabled() -> bool;
+        fn gd_l2cap_is_enabled() -> bool;
+        fn gd_hci_is_enabled() -> bool;
+        fn gd_controller_is_enabled() -> bool;
+        fn gatt_robust_caching_is_enabled() -> bool;
+        fn btaa_hci_is_enabled() -> bool;
+        fn gd_rust_is_enabled() -> bool;
+    }
+}
+
+use bt_common::init_flags::*;
diff --git a/gd/rust/shim/src/lib.rs b/gd/rust/shim/src/lib.rs
new file mode 100644 (file)
index 0000000..bf75103
--- /dev/null
@@ -0,0 +1,4 @@
+//! The main entry point for the legacy C++ code
+
+mod stack;
+mod init_flags;
diff --git a/gd/rust/shim/src/stack.rs b/gd/rust/shim/src/stack.rs
new file mode 100644 (file)
index 0000000..89dc97a
--- /dev/null
@@ -0,0 +1,15 @@
+//! Stack management
+
+#[cxx::bridge(namespace = bluetooth::rust::stack)]
+mod ffi {
+    extern "Rust" {
+        fn start();
+        fn stop();
+    }
+}
+
+pub fn start() {
+}
+
+pub fn stop() {
+}
index 7673b8b..5df610c 100644 (file)
@@ -112,7 +112,7 @@ cc_library_shared {
         "libudrv-uipc",
         "libbluetooth_gd", // Gabeldorsche
         "libbluetooth_rust_interop",
-        "libbt_common_ffi",
+        "libbt_shim_ffi",
         "libcxxbridge05",
     ],
     whole_static_libs: [
index 0387604..2c9c730 100644 (file)
@@ -45,6 +45,7 @@
 #include "main/shim/le_advertising_manager.h"
 #include "main/shim/shim.h"
 #include "main/shim/stack.h"
+#include "src/stack.rs.h"
 
 namespace bluetooth {
 namespace shim {
@@ -67,6 +68,11 @@ void Stack::StartIdleMode() {
 }
 
 void Stack::StartEverything() {
+  if (common::init_flags::gd_rust_is_enabled()) {
+    rust::stack::start();
+    return;
+  }
+
   std::lock_guard<std::recursive_mutex> lock(mutex_);
   ASSERT_LOG(!is_running_, "%s Gd stack already running", __func__);
   LOG_INFO("%s Starting Gd stack", __func__);
@@ -146,6 +152,11 @@ void Stack::Start(ModuleList* modules) {
 }
 
 void Stack::Stop() {
+  if (common::init_flags::gd_rust_is_enabled()) {
+    rust::stack::stop();
+    return;
+  }
+
   std::lock_guard<std::recursive_mutex> lock(mutex_);
   if (!common::init_flags::gd_core_is_enabled()) {
     bluetooth::shim::hci_on_shutting_down();
index 4b10b77..aa2f8a8 100644 (file)
@@ -29,6 +29,7 @@ cc_defaults {
         "libudrv-uipc",
         "libbt-protos-lite",
         "libbluetooth_gd",
+        "libcxxbridge05",
     ],
     shared_libs: [
         "libbinder",
index 16b322d..4cd4dc8 100644 (file)
@@ -40,6 +40,9 @@ cc_test {
         "libprotobuf-cpp-lite",
         "libudrv-uipc",
         "libz",
+        "libbluetooth_rust_interop",
+        "libbt_shim_ffi",
+        "libcxxbridge05",
     ],
     shared_libs: [
         "android.hardware.bluetooth.a2dp@1.0",
index 1094afc..a4dfac8 100644 (file)
@@ -45,6 +45,7 @@ cc_binary {
     generated_headers: [
         "RootCanalGeneratedPackets_h",
         "BluetoothGeneratedPackets_h",
+        "libbt_init_flags_bridge_header",
     ],
     static_libs: [
         "android.hardware.bluetooth-async",
@@ -93,6 +94,7 @@ cc_library_shared {
     generated_headers: [
         "RootCanalGeneratedPackets_h",
         "BluetoothGeneratedPackets_h",
+        "libbt_init_flags_bridge_header",
     ],
     static_libs: [
         "android.hardware.bluetooth-async",
index 12162e3..77e57cf 100644 (file)
@@ -57,6 +57,7 @@ cc_library_static {
     generated_headers: [
         "RootCanalGeneratedPackets_h",
         "BluetoothGeneratedPackets_h",
+        "libbt_init_flags_bridge_header",
     ],
     include_dirs: [
         "system/bt",