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

Commit a42c77f8 authored by David Duarte's avatar David Duarte
Browse files

RootCanal: Construct LMP Features with constants

This removes the magic value and permit us to
modify the features more easily

Test: m root-canal
Change-Id: I166c1134586e0fd8e98922573c6e66fcca3a4522
parent 68b67486
Loading
Loading
Loading
Loading
+98 −0
Original line number Diff line number Diff line
@@ -2581,6 +2581,104 @@ test ReadLocalExtendedFeatures {
  "\x04\x10\x01\x02",
}

enum LMPFeaturesPage0Bits: 64 {
  // Byte 0
  LMP_3_SLOT_PACKETS = 0x01,
  LMP_5_SLOT_PACKETS = 0x02,
  ENCRYPTION         = 0x04,
  SLOT_OFFSET        = 0x08,
  TIMING_ACCURACY    = 0x10,
  ROLE_SWITCH        = 0x20,
  HOLD_MODE          = 0x40,
  SNIFF_MODE         = 0x80,

  // Byte 1
  POWER_CONTROL_REQUESTS           = 0x0200,
  CHANNEL_QUALITY_DRIVEN_DATA_RATE = 0x0400,
  SCO_LINK                         = 0x0800,
  HV2_PACKETS                      = 0x1000,
  HV3_PACKETS                      = 0x2000,
  M_LAW_LOG_SYNCHRONOUS_DATA       = 0x4000,
  A_LAW_LOG_SYNCHRONOUS_DATA       = 0x8000,

  // Byte 2
  CVSD_SYNCHRONOUS_DATA                  = 0x010000,
  PAGING_PARAMETER_NEGOTIATION           = 0x020000,
  POWER_CONTROL                          = 0x040000,
  TRANSPARENT_SYNCHRONOUS_DATA           = 0x080000,
  FLOW_CONTROL_LAG_LEAST_SIGNIFICANT_BIT = 0x100000,
  FLOW_CONTROL_LAG_MIDDLE_BIT            = 0x200000,
  FLOW_CONTROL_LAG_MOST_SIGNIFICANT_BIT  = 0x400000,
  BROADCAST_ENCRYPTION                   = 0x800000,

  // Byte 3
  ENHANCED_DATA_RATE_ACL_2_MB_S_MODE = 0x02000000,
  ENHANCED_DATA_RATE_ACL_3_MB_S_MODE = 0x04000000,
  ENHANCED_INQUIRY_SCAN              = 0x08000000,
  INTERLACED_INQUIRY_SCAN            = 0x10000000,
  INTERLACED_PAGE_SCAN               = 0x20000000,
  RSSI_WITH_INQUIRY_RESULTS          = 0x40000000,
  EXTENDED_SCO_LINK                  = 0x80000000,

  // Byte 4
  EV4_PACKETS                               = 0x0100000000,
  EV5_PACKETS                               = 0x0200000000,
  AFH_CAPABLE_PERIPHERAL                    = 0x0800000000,
  AFH_CLASSIFICATION_PERIPHERAL             = 0x1000000000,
  BR_EDR_NOT_SUPPORTED                      = 0x2000000000,
  LE_SUPPORTED_CONTROLLER                   = 0x4000000000,
  LMP_3_SLOT_ENHANCED_DATA_RATE_ACL_PACKETS = 0x8000000000,

  // Byte 5
  LMP_5_SLOT_ENHANCED_DATA_RATE_ACL_PACKETS  = 0x010000000000,
  SNIFF_SUBRATING                            = 0x020000000000,
  PAUSE_ENCRYPTION                           = 0x040000000000,
  AFH_CAPABLE_CENTRAL                        = 0x080000000000,
  AFH_CLASSIFICATION_CENTRAL                 = 0x100000000000,
  ENHANCED_DATA_RATE_ESCO_2_MB_S_MODE        = 0x200000000000,
  ENHANCED_DATA_RATE_ESCO_3_MB_S_MODE        = 0x400000000000,
  LMP_3_SLOT_ENHANCED_DATA_RATE_ESCO_PACKETS = 0x800000000000,

  // Byte 6
  EXTENDED_INQUIRY_RESPONSE          = 0x01000000000000,
  SIMULTANEOUS_LE_AND_BR_CONTROLLER  = 0x02000000000000,
  SECURE_SIMPLE_PAIRING_CONTROLLER   = 0x08000000000000,
  ENCAPSULATED_PDU                   = 0x10000000000000,
  ERRONEOUS_DATA_REPORTING           = 0x20000000000000,
  NON_FLUSHABLE_PACKET_BOUNDARY_FLAG = 0x40000000000000,

  // Byte 7
  HCI_LINK_SUPERVISION_TIMEOUT_CHANGED_EVENT = 0x0100000000000000,
  VARIABLE_INQUIRY_TX_POWER_LEVEL            = 0x0200000000000000,
  ENHANCED_POWER_CONTROL                     = 0x0400000000000000,
  EXTENDED_FEATURES                          = 0x8000000000000000,
}

enum LMPFeaturesPage1Bits: 64 {
  // Byte 0
  SECURE_SIMPLE_PAIRING_HOST_SUPPORT = 0x01,
  LE_SUPPORTED_HOST                  = 0x02,
  SIMULTANEOUS_LE_AND_BR_HOST        = 0x04,
  SECURE_CONNECTIONS_HOST_SUPPORT    = 0x08,
}

enum LMPFeaturesPage2Bits: 64 {
  // Byte 0
  CONNECTIONLESS_PERIPHERAL_BROADCAST_TRANSMITTER_OPERATION = 0x01,
  CONNECTIONLESS_PERIPHERAL_BROADCAST_RECEIVER_OPERATION    = 0x02,
  SYNCHRONIZATION_TRAIN                                     = 0x04,
  SYNCHRONIZATION_SCAN                                      = 0x08,
  HCI_INQUIRY_RESPONSE_NOTIFICATION_EVENT                   = 0x10,
  GENERALIZED_INTERLACED_SCAN                               = 0x20,
  COARSE_CLOCK_ADJUSTMENT                                   = 0x40,

  // Byte 1
  SECURE_CONNECTIONS_CONTROLLER_SUPPORT = 0x0100,
  PING                                  = 0x0200,
  SLOT_AVAILABILITY_MASK                = 0x0400,
  TRAIN_NUDGING                         = 0x0800,
}

packet ReadLocalExtendedFeaturesComplete : CommandComplete (command_op_code = READ_LOCAL_EXTENDED_FEATURES) {
  status : ErrorCode,
  page_number : 8,
+79 −1
Original line number Diff line number Diff line
@@ -30,6 +30,83 @@ namespace test_vendor_lib {
using ::bluetooth::hci::Address;
using ::bluetooth::hci::ClassOfDevice;
using ::bluetooth::hci::EventCode;
using ::bluetooth::hci::LMPFeaturesPage0Bits;
using ::bluetooth::hci::LMPFeaturesPage1Bits;

static constexpr uint64_t Page0LmpFeatures() {
  LMPFeaturesPage0Bits features[] = {
      LMPFeaturesPage0Bits::LMP_3_SLOT_PACKETS,
      LMPFeaturesPage0Bits::LMP_5_SLOT_PACKETS,
      LMPFeaturesPage0Bits::ENCRYPTION,
      LMPFeaturesPage0Bits::SLOT_OFFSET,
      LMPFeaturesPage0Bits::TIMING_ACCURACY,
      LMPFeaturesPage0Bits::ROLE_SWITCH,
      LMPFeaturesPage0Bits::HOLD_MODE,
      LMPFeaturesPage0Bits::SNIFF_MODE,
      LMPFeaturesPage0Bits::POWER_CONTROL_REQUESTS,
      LMPFeaturesPage0Bits::CHANNEL_QUALITY_DRIVEN_DATA_RATE,
      LMPFeaturesPage0Bits::SCO_LINK,
      LMPFeaturesPage0Bits::HV2_PACKETS,
      LMPFeaturesPage0Bits::HV3_PACKETS,
      LMPFeaturesPage0Bits::M_LAW_LOG_SYNCHRONOUS_DATA,
      LMPFeaturesPage0Bits::A_LAW_LOG_SYNCHRONOUS_DATA,
      LMPFeaturesPage0Bits::CVSD_SYNCHRONOUS_DATA,
      LMPFeaturesPage0Bits::PAGING_PARAMETER_NEGOTIATION,
      LMPFeaturesPage0Bits::POWER_CONTROL,
      LMPFeaturesPage0Bits::TRANSPARENT_SYNCHRONOUS_DATA,
      LMPFeaturesPage0Bits::BROADCAST_ENCRYPTION,
      LMPFeaturesPage0Bits::ENHANCED_DATA_RATE_ACL_2_MB_S_MODE,
      LMPFeaturesPage0Bits::ENHANCED_DATA_RATE_ACL_3_MB_S_MODE,
      LMPFeaturesPage0Bits::ENHANCED_INQUIRY_SCAN,
      LMPFeaturesPage0Bits::INTERLACED_INQUIRY_SCAN,
      LMPFeaturesPage0Bits::INTERLACED_PAGE_SCAN,
      LMPFeaturesPage0Bits::RSSI_WITH_INQUIRY_RESULTS,
      LMPFeaturesPage0Bits::EXTENDED_SCO_LINK,
      LMPFeaturesPage0Bits::EV4_PACKETS,
      LMPFeaturesPage0Bits::EV5_PACKETS,
      LMPFeaturesPage0Bits::AFH_CAPABLE_PERIPHERAL,
      LMPFeaturesPage0Bits::AFH_CLASSIFICATION_PERIPHERAL,
      LMPFeaturesPage0Bits::LE_SUPPORTED_CONTROLLER,
      LMPFeaturesPage0Bits::LMP_3_SLOT_ENHANCED_DATA_RATE_ACL_PACKETS,
      LMPFeaturesPage0Bits::LMP_5_SLOT_ENHANCED_DATA_RATE_ACL_PACKETS,
      LMPFeaturesPage0Bits::SNIFF_SUBRATING,
      LMPFeaturesPage0Bits::PAUSE_ENCRYPTION,
      LMPFeaturesPage0Bits::AFH_CAPABLE_CENTRAL,
      LMPFeaturesPage0Bits::AFH_CLASSIFICATION_CENTRAL,
      LMPFeaturesPage0Bits::ENHANCED_DATA_RATE_ESCO_2_MB_S_MODE,
      LMPFeaturesPage0Bits::ENHANCED_DATA_RATE_ESCO_3_MB_S_MODE,
      LMPFeaturesPage0Bits::LMP_3_SLOT_ENHANCED_DATA_RATE_ESCO_PACKETS,
      LMPFeaturesPage0Bits::EXTENDED_INQUIRY_RESPONSE,
      LMPFeaturesPage0Bits::SIMULTANEOUS_LE_AND_BR_CONTROLLER,
      LMPFeaturesPage0Bits::SECURE_SIMPLE_PAIRING_CONTROLLER,
      LMPFeaturesPage0Bits::ENCAPSULATED_PDU,
      LMPFeaturesPage0Bits::NON_FLUSHABLE_PACKET_BOUNDARY_FLAG,
      LMPFeaturesPage0Bits::HCI_LINK_SUPERVISION_TIMEOUT_CHANGED_EVENT,
      LMPFeaturesPage0Bits::VARIABLE_INQUIRY_TX_POWER_LEVEL,
      LMPFeaturesPage0Bits::ENHANCED_POWER_CONTROL,
      LMPFeaturesPage0Bits::EXTENDED_FEATURES};

  uint64_t value = 0;
  for (unsigned i = 0; i < sizeof(features) / sizeof(*features); i++)
    value |= static_cast<uint64_t>(features[i]);
  return value;
}

static_assert(Page0LmpFeatures() == 0x875bffdbfe8ffeff,
              "Invalid page 0 features");

static constexpr uint64_t Page1LmpFeatures() {
  LMPFeaturesPage1Bits features[] = {
      LMPFeaturesPage1Bits::SIMULTANEOUS_LE_AND_BR_HOST,
  };

  uint64_t value = 0;
  for (unsigned i = 0; i < sizeof(features) / sizeof(*features); i++)
    value |= static_cast<uint64_t>(features[i]);
  return value;
}

static_assert(Page1LmpFeatures() == 0x04, "Invalid page 1 features");

class DeviceProperties {
 public:
@@ -410,7 +487,8 @@ class DeviceProperties {
  std::vector<uint8_t> supported_codecs_;
  std::vector<uint32_t> vendor_specific_codecs_;
  std::array<uint8_t, 64> supported_commands_;
  std::vector<uint64_t> extended_features_{{0x875bffdbfe8ffeff, 0x04}};
  std::array<uint64_t, 2> extended_features_{
      {Page0LmpFeatures(), Page1LmpFeatures()}};
  ClassOfDevice class_of_device_{{0, 0, 0}};
  std::vector<uint8_t> extended_inquiry_data_;
  std::array<uint8_t, 248> name_{};