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

Commit b2cdc2dd authored by Henri Chataing's avatar Henri Chataing
Browse files

RootCanal: Add controller properties for LE APCF

- Add the size of states used for LE APCF filtering
- Generate the LE vendor information v0.98
  using the information otherwise provided by the
  controller properties

Bug: 296143555
Test: m root-canal
Change-Id: I8a0b45555710921b15b745022f90932da0dca28e
parent 1d9c8da5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1973,6 +1973,7 @@ ControllerProperties::ControllerProperties(
      supports_csr_vendor_command = config.vendor().csr();
    }
    if (config.vendor().has_android()) {
      supports_le_get_vendor_capabilities_command = config.vendor().android();
      supports_le_apcf_vendor_command = config.vendor().android();
    }
  }
+11 −3
Original line number Diff line number Diff line
@@ -155,9 +155,17 @@ struct ControllerProperties {
  // LE Periodic Advertiser List Size (Vol 4, Part E § 7.8.73).
  uint8_t le_periodic_advertiser_list_size{8};

  // Vendor Information.
  // Provide parameters returned by vendor specific commands.
  std::vector<uint8_t> le_vendor_capabilities{};
  // Android Vendor Capabilities.
  // https://source.android.com/docs/core/connect/bluetooth/hci_requirements#vendor-specific-capabilities
  uint8_t le_apcf_filter_list_size{8};
  uint8_t le_apcf_num_of_tracked_advertisers{8};
  uint8_t le_apcf_broadcaster_address_filter_list_size{8};
  uint8_t le_apcf_service_uuid_filter_list_size{8};
  uint8_t le_apcf_service_solicitation_uuid_filter_list_size{8};
  uint8_t le_apcf_local_name_filter_list_size{8};
  uint8_t le_apcf_manufacturer_data_filter_list_size{8};
  uint8_t le_apcf_service_data_filter_list_size{8};
  uint8_t le_apcf_ad_type_filter_list_size{8};

  bool SupportsLMPFeature(bluetooth::hci::LMPFeaturesPage0Bits bit) const {
    return (lmp_features[0] & static_cast<uint64_t>(bit)) != 0;
+19 −13
Original line number Diff line number Diff line
@@ -2805,19 +2805,25 @@ void DualModeController::LeGetVendorCapabilities(CommandView command) {
    return;
  }

  std::vector<uint8_t> return_parameters = {
      static_cast<uint8_t>(ErrorCode::SUCCESS)};
  return_parameters.insert(return_parameters.end(),
                           properties_.le_vendor_capabilities.begin(),
                           properties_.le_vendor_capabilities.end());
  // Ensure a minimal size for vendor capabilities.
  if (return_parameters.size() < 9) {
    return_parameters.resize(9);
  }

  send_event_(bluetooth::hci::CommandCompleteBuilder::Create(
      kNumCommandPackets, OpCode::LE_GET_VENDOR_CAPABILITIES,
      std::move(return_parameters)));
  DEBUG(id_, "<< LE Get Vendor Capabilities");

  bluetooth::hci::VendorCapabilities_V_0_98 vendor_capabilities;
  vendor_capabilities.total_scan_results_storage_ = 0;
  vendor_capabilities.max_irk_list_sz_ = 16;
  vendor_capabilities.filtering_support_ =
      properties_.supports_le_apcf_vendor_command;
  vendor_capabilities.max_filter_ = properties_.le_apcf_filter_list_size;
  vendor_capabilities.activity_energy_info_support_ = 0;
  vendor_capabilities.total_num_of_advt_tracked_ =
      properties_.le_apcf_num_of_tracked_advertisers;
  vendor_capabilities.extended_scan_support_ = 0;
  vendor_capabilities.debug_logging_supported_ = 0;
  vendor_capabilities.a2dp_source_offload_capability_mask_ = 0;
  vendor_capabilities.bluetooth_quality_report_support_ = 0;

  send_event_(bluetooth::hci::LeGetVendorCapabilitiesCompleteBuilder::Create(
      kNumCommandPackets, ErrorCode::SUCCESS,
      vendor_capabilities.SerializeToBytes()));
}

void DualModeController::LeBatchScan(CommandView command) {
+39 −18
Original line number Diff line number Diff line
@@ -5633,7 +5633,12 @@ test LeGetVendorCapabilities {
  "\x53\xfd\x00",
}

struct BaseVendorCapabilities {
packet LeGetVendorCapabilitiesComplete : CommandComplete (command_op_code = LE_GET_VENDOR_CAPABILITIES) {
  status : ErrorCode,
  vendor_capabilities : 8[],
}

struct VendorCapabilities_V_0_96 {
  max_advt_instances: 8,
  offloaded_resolution_of_private_address: 8,
  total_scan_results_storage: 16,
@@ -5641,30 +5646,46 @@ struct BaseVendorCapabilities {
  filtering_support: 8,
  max_filter: 8,
  activity_energy_info_support: 8,
}

packet LeGetVendorCapabilitiesComplete : CommandComplete (command_op_code = LE_GET_VENDOR_CAPABILITIES) {
  status : ErrorCode,
  base_vendor_capabilities : BaseVendorCapabilities,
  _payload_,
}

packet LeGetVendorCapabilitiesComplete095 : LeGetVendorCapabilitiesComplete {
  version_supported: 16,
  _fixed_ = 0x6000 : 16, // v0.96
  total_num_of_advt_tracked: 16,
  extended_scan_support: 8,
  debug_logging_supported: 8,
  _payload_,
  le_address_generation_offloading_support: 8,
}

packet LeGetVendorCapabilitiesComplete096 : LeGetVendorCapabilitiesComplete095 {
  le_address_generation_offloading_support: 8,
  _payload_,
struct VendorCapabilities_V_0_98 {
  _reserved_ : 8,
  _reserved_ : 8,
  total_scan_results_storage: 16,
  max_irk_list_sz: 8,
  filtering_support: 8,
  max_filter: 8,
  activity_energy_info_support: 8,
  _fixed_ = 0x6200 : 16, // v0.98
  total_num_of_advt_tracked: 16,
  extended_scan_support: 8,
  debug_logging_supported: 8,
  _reserved_ : 8,
  a2dp_source_offload_capability_mask: 32,
  bluetooth_quality_report_support: 8,
}

packet LeGetVendorCapabilitiesComplete098 : LeGetVendorCapabilitiesComplete096 {
struct VendorCapabilities_V_1_03 {
  _reserved_ : 8,
  _reserved_ : 8,
  total_scan_results_storage: 16,
  max_irk_list_sz: 8,
  filtering_support: 8,
  max_filter: 8,
  activity_energy_info_support: 8,
  _fixed_ = 0x0301 : 16, // v1.03
  total_num_of_advt_tracked: 16,
  extended_scan_support: 8,
  debug_logging_supported: 8,
  _reserved_ : 8,
  a2dp_source_offload_capability_mask: 32,
  bluetooth_quality_report_support: 8
  bluetooth_quality_report_support: 8,
  dynamic_audio_buffer_support: 32,
}

// -----------------------------------------------------------------------------
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ pub mod hci {
    #![allow(clippy::all)]
    #![allow(unused)]
    #![allow(missing_docs)]
    #![allow(non_camel_case_types)]

    include!(concat!(env!("OUT_DIR"), "/hci_packets.rs"));