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

Commit ad08c67b authored by Sonny Sasaka's avatar Sonny Sasaka
Browse files

Floss: Wire MSFT API in topshim

The topshim implementation of MSFT API connects Floss daemon into
libbluetooth's btif MSFT API.

Bug: 217272837
Tag: #floss
Test: Build Floss on Linux and Chrome OS
BYPASS_LONG_LINES_REASON: Bluetooth likes 120 lines

Change-Id: Ia9656875a9048007da27deb24a4a0b58f16b86d3
parent bd0e07ab
Loading
Loading
Loading
Loading
+67 −0
Original line number Diff line number Diff line
@@ -75,6 +75,45 @@ std::vector<ApcfCommand> ConvertApcfVec(const ::rust::Vec<RustApcfCommand>& rust
  return converted;
}

std::vector<uint8_t> ConvertRustByteArray(const ::rust::Vec<uint8_t>& bytes) {
  std::vector<uint8_t> converted;

  std::copy(bytes.begin(), bytes.end(), std::back_inserter(converted));

  return converted;
}

MsftAdvMonitorPattern ConvertAdvMonitorPattern(const RustMsftAdvMonitorPattern& pattern) {
  MsftAdvMonitorPattern converted = {
      .ad_type = pattern.ad_type,
      .start_byte = pattern.start_byte,
      .pattern = ConvertRustByteArray(pattern.pattern),
  };

  return converted;
}

std::vector<MsftAdvMonitorPattern> ConvertAdvMonitorPatterns(const ::rust::Vec<RustMsftAdvMonitorPattern>& patterns) {
  std::vector<MsftAdvMonitorPattern> converted;

  for (const auto& pattern : patterns) {
    converted.push_back(ConvertAdvMonitorPattern(pattern));
  }

  return converted;
}

MsftAdvMonitor ConvertAdvMonitor(const RustMsftAdvMonitor& monitor) {
  MsftAdvMonitor converted = {
      .rssi_threshold_high = monitor.rssi_high_threshold,
      .rssi_threshold_low = monitor.rssi_low_threshold,
      .rssi_threshold_low_time_interval = monitor.rssi_low_timeout,
      .rssi_sampling_period = monitor.rssi_sampling_period,
      .patterns = ConvertAdvMonitorPatterns(monitor.patterns),
  };
  return converted;
}

::btgatt_filt_param_setup_t ConvertRustFilterParam(const RustGattFilterParam& param) {
  ::btgatt_filt_param_setup_t converted = {
      .feat_seln = param.feat_seln,
@@ -206,6 +245,22 @@ void BleScannerIntf::ScanFilterEnable(bool enable) {
  scanner_intf_->ScanFilterEnable(enable, base::Bind(&BleScannerIntf::OnEnableCallback, base::Unretained(this)));
}

void BleScannerIntf::MsftAdvMonitorAdd(RustMsftAdvMonitor monitor) {
  scanner_intf_->MsftAdvMonitorAdd(
      internal::ConvertAdvMonitor(monitor),
      base::Bind(&BleScannerIntf::OnMsftAdvMonitorAddCallback, base::Unretained(this)));
}

void BleScannerIntf::MsftAdvMonitorRemove(uint8_t monitor_handle) {
  scanner_intf_->MsftAdvMonitorRemove(
      monitor_handle, base::Bind(&BleScannerIntf::OnMsftAdvMonitorRemoveCallback, base::Unretained(this)));
}

void BleScannerIntf::MsftAdvMonitorEnable(bool enable) {
  scanner_intf_->MsftAdvMonitorEnable(
      enable, base::Bind(&BleScannerIntf::OnMsftAdvMonitorEnableCallback, base::Unretained(this)));
}

void BleScannerIntf::SetScanParameters(uint8_t scanner_id, uint16_t scan_interval, uint16_t scan_window) {
  scanner_intf_->SetScanParameters(
      scanner_id,
@@ -292,6 +347,18 @@ void BleScannerIntf::OnFilterConfigCallback(
  rusty::gdscan_filter_config_callback(filter_index, filt_type, avbl_space, action, btm_status);
}

void BleScannerIntf::OnMsftAdvMonitorAddCallback(uint8_t monitor_handle, uint8_t status) {
  rusty::gdscan_msft_adv_monitor_add_callback(monitor_handle, status);
}

void BleScannerIntf::OnMsftAdvMonitorRemoveCallback(uint8_t status) {
  rusty::gdscan_msft_adv_monitor_remove_callback(status);
}

void BleScannerIntf::OnMsftAdvMonitorEnableCallback(uint8_t status) {
  rusty::gdscan_msft_adv_monitor_enable_callback(status);
}

void BleScannerIntf::OnPeriodicSyncStarted(
    int,
    uint8_t status,
+13 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ namespace topshim {
namespace rust {

struct RustApcfCommand;
struct RustMsftAdvMonitor;
struct RustGattFilterParam;
struct RustUuid;

@@ -101,6 +102,15 @@ class BleScannerIntf : public ScanningCallbacks {
  // Enable/disable scan filter. Gets responses via |OnEnableCallback|.
  void ScanFilterEnable(bool enable);

  // Adds an MSFT filter. Gets responses via |OnMsftAdvMonitorAddCallback|.
  void MsftAdvMonitorAdd(RustMsftAdvMonitor monitor);

  // Removes a previously added MSFT scan filter.
  void MsftAdvMonitorRemove(uint8_t monitor_handle);

  // Enables or disables MSFT advertisement monitor.
  void MsftAdvMonitorEnable(bool enable);

  // Sets the LE scan interval and window in units of N * 0.625 msec. The result
  // of this action is returned via |OnStatusCallback|.
  void SetScanParameters(uint8_t scanner_id, uint16_t scan_interval, uint16_t scan_window);
@@ -161,6 +171,9 @@ class BleScannerIntf : public ScanningCallbacks {
  void OnFilterParamSetupCallback(uint8_t scanner_id, uint8_t avbl_space, uint8_t action_type, uint8_t btm_status);
  void OnFilterConfigCallback(
      uint8_t filt_index, uint8_t filt_type, uint8_t avbl_space, uint8_t action, uint8_t btm_status);
  void OnMsftAdvMonitorAddCallback(uint8_t monitor_handle, uint8_t status);
  void OnMsftAdvMonitorRemoveCallback(uint8_t status);
  void OnMsftAdvMonitorEnableCallback(uint8_t status);

  BleScannerInterface* scanner_intf_;
};
+55 −0
Original line number Diff line number Diff line
@@ -83,6 +83,24 @@ pub mod ffi {
        irk: [u8; 16],
    }

    // Defined in C++ and needs a translation in shim.
    #[derive(Debug, Clone)]
    pub struct RustMsftAdvMonitorPattern {
        pub ad_type: u8,
        pub start_byte: u8,
        pub pattern: Vec<u8>,
    }

    // Defined in C++ and needs a translation in shim.
    #[derive(Debug, Clone)]
    pub struct RustMsftAdvMonitor {
        pub rssi_high_threshold: u8,
        pub rssi_low_threshold: u8,
        pub rssi_low_timeout: u8,
        pub rssi_sampling_period: u8,
        pub patterns: Vec<RustMsftAdvMonitorPattern>,
    }

    #[derive(Debug, Clone)]
    pub struct RustAdvertiseParameters {
        advertising_event_properties: u16,
@@ -144,6 +162,9 @@ pub mod ffi {
        );
        fn ScanFilterClear(self: Pin<&mut BleScannerIntf>, filter_index: u8);
        fn ScanFilterEnable(self: Pin<&mut BleScannerIntf>, enable: bool);
        fn MsftAdvMonitorAdd(self: Pin<&mut BleScannerIntf>, monitor: RustMsftAdvMonitor);
        fn MsftAdvMonitorRemove(self: Pin<&mut BleScannerIntf>, monitor_handle: u8);
        fn MsftAdvMonitorEnable(self: Pin<&mut BleScannerIntf>, enable: bool);
        fn SetScanParameters(
            self: Pin<&mut BleScannerIntf>,
            scanner_id: u8,
@@ -249,6 +270,9 @@ pub mod ffi {
            action: u8,
            btm_status: u8,
        );
        unsafe fn gdscan_msft_adv_monitor_add_callback(monitor_handle: u8, status: u8);
        unsafe fn gdscan_msft_adv_monitor_remove_callback(status: u8);
        unsafe fn gdscan_msft_adv_monitor_enable_callback(status: u8);
        unsafe fn gdscan_start_sync_callback(
            status: u8,
            sync_handle: u16,
@@ -366,6 +390,7 @@ pub mod ffi {
pub type AdvertisingTrackInfo = ffi::RustAdvertisingTrackInfo;
pub type GattFilterParam = ffi::RustGattFilterParam;
pub type ApcfCommand = ffi::RustApcfCommand;
pub type MsftAdvMonitor = ffi::RustMsftAdvMonitor;
pub type AdvertiseParameters = ffi::RustAdvertiseParameters;
pub type PeriodicAdvertisingParameters = ffi::RustPeriodicAdvertisingParameters;

@@ -900,6 +925,15 @@ pub enum GattScannerInbandCallbacks {
    /// Params: Filter Index, Filter Type, Available Space, Action, BTM Status
    FilterConfigCallback(u8, u8, u8, u8, u8),

    /// Params: Monitor handle, status
    MsftAdvMonitorAddCallback(u8, u8),

    /// Params: status
    MsftAdvMonitorRemoveCallback(u8),

    /// Params: status
    MsftAdvMonitorEnableCallback(u8),

    /// Params: Status, Sync Handle, Advertising Sid, Address Type, Address, Phy, Interval
    StartSyncCallback(u8, u16, u8, u8, RawAddress, u8, u16),

@@ -930,6 +964,15 @@ cb_variant!(GDScannerInbandCb,
cb_variant!(GDScannerInbandCb,
    gdscan_filter_config_callback -> GattScannerInbandCallbacks::FilterConfigCallback,
    u8, u8, u8, u8, u8);
cb_variant!(GDScannerInbandCb,
    gdscan_msft_adv_monitor_add_callback -> GattScannerInbandCallbacks::MsftAdvMonitorAddCallback,
    u8, u8);
cb_variant!(GDScannerInbandCb,
    gdscan_msft_adv_monitor_remove_callback -> GattScannerInbandCallbacks::MsftAdvMonitorRemoveCallback,
    u8);
cb_variant!(GDScannerInbandCb,
    gdscan_msft_adv_monitor_enable_callback -> GattScannerInbandCallbacks::MsftAdvMonitorEnableCallback,
    u8);
cb_variant!(GDScannerInbandCb,
gdscan_start_sync_callback -> GattScannerInbandCallbacks::StartSyncCallback,
u8, u16, u8, u8, *const RawAddress, u8, u16, {
@@ -1421,6 +1464,18 @@ impl BleScanner {
        mutcxxcall!(self, ScanFilterEnable, false);
    }

    pub fn msft_adv_monitor_add(&mut self, monitor: MsftAdvMonitor) {
        mutcxxcall!(self, MsftAdvMonitorAdd, monitor);
    }

    pub fn msft_adv_monitor_remove(&mut self, monitor_handle: u8) {
        mutcxxcall!(self, MsftAdvMonitorRemove, monitor_handle);
    }

    pub fn msft_adv_monitor_enable(&mut self, enable: bool) {
        mutcxxcall!(self, MsftAdvMonitorEnable, enable);
    }

    pub fn set_scan_parameters(&mut self, scanner_id: u8, scan_interval: u16, scan_window: u16) {
        mutcxxcall!(self, SetScanParameters, scanner_id, scan_interval, scan_window);
    }