Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92e8fe6c authored by David Duarte's avatar David Duarte
Browse files

Remove private_gatt flag

Bug: 290845890
Fix: 290845890
Flag: EXEMPT, removing legacy flag
Test: m com.android.btservices
Change-Id: Ic995239d9e1b6f2bda748148dade91b749bbbcd1
parent a20c2803
Loading
Loading
Loading
Loading
+4 −31
Original line number Diff line number Diff line
@@ -89,15 +89,13 @@ trait FlagHolder: Default {
    fn get_defaults_for_test() -> Self;
    fn parse(flags: Vec<String>) -> Self;
    fn dump(&self) -> BTreeMap<&'static str, String>;
    fn reconcile(self) -> Self;
}

macro_rules! init_flags_struct {
    (
     name: $name:ident
     flags: { $($flag:ident $(: $type:ty)? $(= $default:tt)?,)* }
     extra_parsed_flags: { $($extra_flag:tt => $extra_flag_fn:ident(_, _ $(,$extra_args:tt)*),)*}
     dependencies: { $($parent:ident => $child:ident),* }) => {
     extra_parsed_flags: { $($extra_flag:tt => $extra_flag_fn:ident(_, _ $(,$extra_args:tt)*),)*}) => {

        struct $name {
            $($flag : type_expand!($($type)?),)*
@@ -144,20 +142,7 @@ macro_rules! init_flags_struct {
                    }
                }

                init_flags.reconcile()
            }

            #[allow(unused_mut)]
            fn reconcile(mut self) -> Self {
                loop {
                    // dependencies can be specified in any order
                    $(if self.$parent && !self.$child {
                        self.$child = true;
                        continue;
                    })*
                    break;
                }
                self
                init_flags
            }
        }

@@ -175,8 +160,7 @@ macro_rules! init_flags_struct {
macro_rules! init_flags_getters {
    (
     flags: { $($flag:ident $(: $type:ty)? $(= $default:tt)?,)* }
     extra_parsed_flags: { $($extra_flag:tt => $extra_flag_fn:ident(_, _ $(,$extra_args:tt)*),)*}
     dependencies: { $($parent:ident => $child:ident),* }) => {
     extra_parsed_flags: { $($extra_flag:tt => $extra_flag_fn:ident(_, _ $(,$extra_args:tt)*),)*}) => {

        $(create_getter_fn!($flag $($type)?);)*

@@ -239,7 +223,6 @@ init_flags!(
        irk_rotation,
        leaudio_targeted_announcement_reconnection_mode = true,
        pbap_pse_dynamic_version_upgrade = false,
        private_gatt = true,
        redact_log = true,
        sco_codec_select_lc3 = true,
        sco_codec_timeout_clear,
@@ -257,9 +240,6 @@ init_flags!(
    extra_parsed_flags: {
        "--hci" => parse_hci_adapter(_, _),
    }
    dependencies: {
        always_use_private_gatt_for_debugging => private_gatt
    }
);

lazy_static! {
@@ -302,11 +282,7 @@ mod tests {
    #[test]
    fn simple_flag() {
        let _guard = ASYNC_LOCK.lock().unwrap();
        test_load(vec![
            "INIT_private_gatt=false", //override a default flag
            "INIT_gatt_robust_caching_server=true",
        ]);
        assert!(!private_gatt_is_enabled());
        test_load(vec!["INIT_gatt_robust_caching_server=true"]);
        assert!(gatt_robust_caching_server_is_enabled());
    }
    #[test]
@@ -315,10 +291,8 @@ mod tests {
        test_load(vec![
            "foo=bar=?",                                // vec length
            "foo=bar",                                  // flag not save
            "INIT_private_gatt=not_false",              // parse error but has default value
            "INIT_gatt_robust_caching_server=not_true", // parse error
        ]);
        assert!(private_gatt_is_enabled());
        assert!(!gatt_robust_caching_server_is_enabled());
    }
    #[test]
@@ -345,7 +319,6 @@ mod tests {
            cat,
        }
        extra_parsed_flags: {}
        dependencies: {}
    );

    #[test]
+0 −1
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ mod ffi {
        fn irk_rotation_is_enabled() -> bool;
        fn leaudio_targeted_announcement_reconnection_mode_is_enabled() -> bool;
        fn pbap_pse_dynamic_version_upgrade_is_enabled() -> bool;
        fn private_gatt_is_enabled() -> bool;
        fn redact_log_is_enabled() -> bool;
        fn sco_codec_select_lc3_is_enabled() -> bool;
        fn sco_codec_timeout_clear_is_enabled() -> bool;
+50 −92
Original line number Diff line number Diff line
@@ -30,39 +30,6 @@ namespace bluetooth {
namespace shim {
namespace arbiter {

class PassthroughAclArbiter : public AclArbiter {
 public:
  virtual void OnLeConnect(uint8_t tcb_idx, uint16_t advertiser_id) override {
    // no-op
  }

  virtual void OnLeDisconnect(uint8_t tcb_idx) override {
    // no-op
  }

  virtual InterceptAction InterceptAttPacket(uint8_t tcb_idx,
                                             const BT_HDR* packet) override {
    return InterceptAction::FORWARD;
  }

  virtual void OnOutgoingMtuReq(uint8_t tcb_idx) override {
    // no-op
  }

  virtual void OnIncomingMtuResp(uint8_t tcb_idx, size_t mtu) {
    // no-op
  }

  virtual void OnIncomingMtuReq(uint8_t tcb_idx, size_t mtu) {
    // no-op
  }

  static PassthroughAclArbiter& Get() {
    static auto singleton = PassthroughAclArbiter();
    return singleton;
  }
};

namespace {
struct RustArbiterCallbacks {
  ::rust::Fn<void(uint8_t tcb_idx, uint8_t advertiser)> on_le_connect;
@@ -77,20 +44,18 @@ struct RustArbiterCallbacks {
RustArbiterCallbacks callbacks_{};
}  // namespace

class RustGattAclArbiter : public AclArbiter {
 public:
  virtual void OnLeConnect(uint8_t tcb_idx, uint16_t advertiser_id) override {
void AclArbiter::OnLeConnect(uint8_t tcb_idx, uint16_t advertiser_id) {
  log::info("Notifying Rust of LE connection");
  callbacks_.on_le_connect(tcb_idx, advertiser_id);
}

  virtual void OnLeDisconnect(uint8_t tcb_idx) override {
void AclArbiter::OnLeDisconnect(uint8_t tcb_idx) {
  log::info("Notifying Rust of LE disconnection");
  callbacks_.on_le_disconnect(tcb_idx);
}

  virtual InterceptAction InterceptAttPacket(uint8_t tcb_idx,
                                             const BT_HDR* packet) override {
InterceptAction AclArbiter::InterceptAttPacket(uint8_t tcb_idx,
                                               const BT_HDR* packet) {
  log::debug("Intercepting ATT packet and forwarding to Rust");

  uint8_t* packet_start = (uint8_t*)(packet + 1) + packet->offset;
@@ -101,26 +66,27 @@ class RustGattAclArbiter : public AclArbiter {
  return callbacks_.intercept_packet(tcb_idx, std::move(vec));
}

  virtual void OnOutgoingMtuReq(uint8_t tcb_idx) override {
void AclArbiter::OnOutgoingMtuReq(uint8_t tcb_idx) {
  log::debug("Notifying Rust of outgoing MTU request");
  callbacks_.on_outgoing_mtu_req(tcb_idx);
}

  virtual void OnIncomingMtuResp(uint8_t tcb_idx, size_t mtu) {
void AclArbiter::OnIncomingMtuResp(uint8_t tcb_idx, size_t mtu) {
  log::debug("Notifying Rust of incoming MTU response {}", mtu);
  callbacks_.on_incoming_mtu_resp(tcb_idx, mtu);
}

  virtual void OnIncomingMtuReq(uint8_t tcb_idx, size_t mtu) {
void AclArbiter::OnIncomingMtuReq(uint8_t tcb_idx, size_t mtu) {
  log::debug("Notifying Rust of incoming MTU request {}", mtu);
  callbacks_.on_incoming_mtu_req(tcb_idx, mtu);
}

  void SendPacketToPeer(uint8_t tcb_idx, ::rust::Vec<uint8_t> buffer) {
void AclArbiter::SendPacketToPeer(uint8_t tcb_idx,
                                  ::rust::Vec<uint8_t> buffer) {
  tGATT_TCB* p_tcb = gatt_get_tcb_by_idx(tcb_idx);
  if (p_tcb != nullptr) {
      BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR) + buffer.size() +
                                          L2CAP_MIN_OFFSET);
    BT_HDR* p_buf =
        (BT_HDR*)osi_malloc(sizeof(BT_HDR) + buffer.size() + L2CAP_MIN_OFFSET);
    if (p_buf == nullptr) {
      log::fatal("OOM when sending packet");
    }
@@ -134,12 +100,6 @@ class RustGattAclArbiter : public AclArbiter {
  }
}

  static RustGattAclArbiter& Get() {
    static auto singleton = RustGattAclArbiter();
    return singleton;
  }
};

void StoreCallbacksFromRust(
    ::rust::Fn<void(uint8_t tcb_idx, uint8_t advertiser)> on_le_connect,
    ::rust::Fn<void(uint8_t tcb_idx)> on_le_disconnect,
@@ -154,16 +114,14 @@ void StoreCallbacksFromRust(
}

void SendPacketToPeer(uint8_t tcb_idx, ::rust::Vec<uint8_t> buffer) {
  do_in_main_thread(FROM_HERE,
                    base::BindOnce(&RustGattAclArbiter::SendPacketToPeer,
                                   base::Unretained(&RustGattAclArbiter::Get()),
  do_in_main_thread(FROM_HERE, base::BindOnce(&AclArbiter::SendPacketToPeer,
                                              base::Unretained(&GetArbiter()),
                                              tcb_idx, std::move(buffer)));
}

AclArbiter& GetArbiter() {
  return common::init_flags::private_gatt_is_enabled()
             ? static_cast<AclArbiter&>(RustGattAclArbiter::Get())
             : static_cast<AclArbiter&>(PassthroughAclArbiter::Get());
  static auto singleton = AclArbiter();
  return singleton;
}

}  // namespace arbiter
+9 −8
Original line number Diff line number Diff line
@@ -39,19 +39,20 @@ enum class InterceptAction {

class AclArbiter {
 public:
  virtual void OnLeConnect(uint8_t tcb_idx, uint16_t advertiser_id) = 0;
  virtual void OnLeDisconnect(uint8_t tcb_idx) = 0;
  virtual InterceptAction InterceptAttPacket(uint8_t tcb_idx,
                                             const BT_HDR* packet) = 0;
  void OnLeConnect(uint8_t tcb_idx, uint16_t advertiser_id);
  void OnLeDisconnect(uint8_t tcb_idx);
  InterceptAction InterceptAttPacket(uint8_t tcb_idx, const BT_HDR* packet);

  virtual void OnOutgoingMtuReq(uint8_t tcb_idx) = 0;
  virtual void OnIncomingMtuResp(uint8_t tcb_idx, size_t mtu) = 0;
  virtual void OnIncomingMtuReq(uint8_t tcb_idx, size_t mtu) = 0;
  void OnOutgoingMtuReq(uint8_t tcb_idx);
  void OnIncomingMtuResp(uint8_t tcb_idx, size_t mtu);
  void OnIncomingMtuReq(uint8_t tcb_idx, size_t mtu);

  void SendPacketToPeer(uint8_t tcb_idx, ::rust::Vec<uint8_t> buffer);

  AclArbiter() = default;
  AclArbiter(AclArbiter&& other) = default;
  AclArbiter& operator=(AclArbiter&& other) = default;
  virtual ~AclArbiter() = default;
  ~AclArbiter() = default;
};

void StoreCallbacksFromRust(
+12 −19
Original line number Diff line number Diff line
@@ -20,32 +20,25 @@ namespace bluetooth {
namespace shim {
namespace arbiter {

class MockAclArbiter : public AclArbiter {
 public:
  virtual void OnLeConnect(uint8_t /* tcb_idx */,
                           uint16_t /* advertiser_id */) override {}
void AclArbiter::OnLeConnect(uint8_t /* tcb_idx */,
                             uint16_t /* advertiser_id */) {}

  virtual void OnLeDisconnect(uint8_t /* tcb_idx */) override {}
void AclArbiter::OnLeDisconnect(uint8_t /* tcb_idx */) {}

  virtual InterceptAction InterceptAttPacket(
      uint8_t /* tcb_idx */, const BT_HDR* /* packet */) override {
InterceptAction AclArbiter::InterceptAttPacket(uint8_t /* tcb_idx */,
                                               const BT_HDR* /* packet */) {
  return InterceptAction::FORWARD;
}

  virtual void OnOutgoingMtuReq(uint8_t /* tcb_idx */) override {}
void AclArbiter::OnOutgoingMtuReq(uint8_t /* tcb_idx */) {}

  virtual void OnIncomingMtuResp(uint8_t /* tcb_idx */, size_t /* mtu */) {}
void AclArbiter::OnIncomingMtuResp(uint8_t /* tcb_idx */, size_t /* mtu */) {}

  virtual void OnIncomingMtuReq(uint8_t /* tcb_idx */, size_t /* mtu */) {}

  static MockAclArbiter& Get() {
    static auto singleton = MockAclArbiter();
    return singleton;
  }
};
void AclArbiter::OnIncomingMtuReq(uint8_t /* tcb_idx */, size_t /* mtu */) {}

AclArbiter& GetArbiter() {
  return static_cast<AclArbiter&>(MockAclArbiter::Get());
  static auto singleton = AclArbiter();
  return singleton;
}

}  // namespace arbiter