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

Commit cf9a76d6 authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

LE Extended Advertising

This patch checks if LE Extended Advertising, and LE Periodic Advertising
features are supported. Also if they are supported, it will read number of
avaliable advertisers, and maximum advertisement data size supported by
controller.

Bug: 30622771
Test: sl4a ConcurrentBleAdvertisingTest
Change-Id: Iabfda3dd081519ed70c99eb4290667e10790e047
parent 44028670
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@ typedef struct controller_t {
  bool (*supports_ble_packet_extension)(void);
  bool (*supports_ble_connection_parameters_request)(void);
  bool (*supports_ble_privacy)(void);
  bool (*supports_ble_extended_advertising)(void);
  bool (*supports_ble_periodic_advertising)(void);

  // Get the cached acl data sizes for the controller.
  uint16_t (*get_acl_data_size_classic)(void);
@@ -66,6 +68,8 @@ typedef struct controller_t {
  uint16_t (*get_acl_packet_size_ble)(void);

  uint16_t (*get_ble_default_data_packet_length)(void);
  uint16_t (*get_ble_maxium_advertising_data_length)(void);
  uint8_t (*get_ble_number_of_supported_advertising_sets)(void);

  // Get the number of acl packets the controller can buffer.
  uint16_t (*get_acl_buffer_count_classic)(void);
+42 −0
Original line number Diff line number Diff line
@@ -65,6 +65,8 @@ static uint8_t ble_resolving_list_max_size;
static uint8_t ble_supported_states[BLE_SUPPORTED_STATES_SIZE];
static bt_device_features_t features_ble;
static uint16_t ble_suggested_default_data_length;
static uint16_t ble_maxium_advertising_data_length;
static uint8_t ble_number_of_supported_advertising_sets;
static uint8_t local_supported_codecs[MAX_LOCAL_SUPPORTED_CODECS_SIZE];
static uint8_t number_of_local_supported_codecs = 0;

@@ -216,6 +218,18 @@ static future_t* start_up(void) {
          response, &ble_suggested_default_data_length);
    }

    if (HCI_LE_EXTENDED_ADVERTISING_SUPPORTED(features_ble.as_array)) {
      response = AWAIT_COMMAND(
          packet_factory->make_ble_read_maximum_advertising_data_length());
      packet_parser->parse_ble_read_maximum_advertising_data_length(
          response, &ble_maxium_advertising_data_length);

      response = AWAIT_COMMAND(
          packet_factory->make_ble_read_number_of_supported_advertising_sets());
      packet_parser->parse_ble_read_number_of_supported_advertising_sets(
          response, &ble_number_of_supported_advertising_sets);
    }

    // Set the ble event mask next
    response =
        AWAIT_COMMAND(packet_factory->make_ble_set_event_mask(&BLE_EVENT_MASK));
@@ -363,6 +377,18 @@ static bool supports_ble_connection_parameters_request(void) {
  return HCI_LE_CONN_PARAM_REQ_SUPPORTED(features_ble.as_array);
}

static bool supports_ble_extended_advertising(void) {
  assert(readable);
  assert(ble_supported);
  return HCI_LE_EXTENDED_ADVERTISING_SUPPORTED(features_ble.as_array);
}

static bool supports_ble_periodic_advertising(void) {
  assert(readable);
  assert(ble_supported);
  return HCI_LE_PERIODIC_ADVERTISING_SUPPORTED(features_ble.as_array);
}

static uint16_t get_acl_data_size_classic(void) {
  assert(readable);
  return acl_data_size_classic;
@@ -390,6 +416,18 @@ static uint16_t get_ble_suggested_default_data_length(void) {
  return ble_suggested_default_data_length;
}

static uint16_t get_ble_maxium_advertising_data_length(void) {
  assert(readable);
  assert(ble_supported);
  return ble_maxium_advertising_data_length;
}

static uint8_t get_ble_number_of_supported_advertising_sets(void) {
  assert(readable);
  assert(ble_supported);
  return ble_number_of_supported_advertising_sets;
}

static uint16_t get_acl_buffer_count_classic(void) {
  assert(readable);
  return acl_buffer_count_classic;
@@ -448,6 +486,8 @@ static const controller_t interface = {
    supports_ble_packet_extension,
    supports_ble_connection_parameters_request,
    supports_ble_privacy,
    supports_ble_extended_advertising,
    supports_ble_periodic_advertising,

    get_acl_data_size_classic,
    get_acl_data_size_ble,
@@ -455,6 +495,8 @@ static const controller_t interface = {
    get_acl_packet_size_classic,
    get_acl_packet_size_ble,
    get_ble_suggested_default_data_length,
    get_ble_maxium_advertising_data_length,
    get_ble_number_of_supported_advertising_sets,

    get_acl_buffer_count_classic,
    get_acl_buffer_count_ble,
+2 −0
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ typedef struct {
  BT_HDR* (*make_ble_read_local_supported_features)(void);
  BT_HDR* (*make_ble_read_resolving_list_size)(void);
  BT_HDR* (*make_ble_read_suggested_default_data_length)(void);
  BT_HDR* (*make_ble_read_maximum_advertising_data_length)(void);
  BT_HDR* (*make_ble_read_number_of_supported_advertising_sets)(void);
  BT_HDR* (*make_ble_set_event_mask)(const bt_event_mask_t* event_mask);
  BT_HDR* (*make_read_local_supported_codecs)(void);
} hci_packet_factory_t;
+6 −0
Original line number Diff line number Diff line
@@ -68,6 +68,12 @@ typedef struct {
  void (*parse_ble_read_suggested_default_data_length_response)(
      BT_HDR* response, uint16_t* ble_default_packet_length_ptr);

  void (*parse_ble_read_maximum_advertising_data_length)(
      BT_HDR* response, uint16_t* ble_maximum_advertising_data_length_ptr);

  void (*parse_ble_read_number_of_supported_advertising_sets)(
      BT_HDR* response, uint8_t* ble_number_of_supported_advertising_sets_ptr);

  void (*parse_read_local_supported_codecs_response)(
      BT_HDR* response, uint8_t* number_of_local_supported_codecs,
      uint8_t* local_supported_codecs);
+11 −0
Original line number Diff line number Diff line
@@ -142,6 +142,15 @@ static BT_HDR* make_ble_read_suggested_default_data_length(void) {
  return make_command_no_params(HCI_BLE_READ_DEFAULT_DATA_LENGTH);
}

static BT_HDR* make_ble_read_maximum_advertising_data_length(void) {
  return make_command_no_params(HCI_LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH);
}

static BT_HDR* make_ble_read_number_of_supported_advertising_sets(void) {
  return make_command_no_params(
      HCI_LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS);
}

static BT_HDR* make_read_local_supported_codecs(void) {
  return make_command_no_params(HCI_READ_LOCAL_SUPPORTED_CODECS);
}
@@ -203,6 +212,8 @@ static const hci_packet_factory_t interface = {
    make_ble_read_local_supported_features,
    make_ble_read_resolving_list_size,
    make_ble_read_suggested_default_data_length,
    make_ble_read_maximum_advertising_data_length,
    make_ble_read_number_of_supported_advertising_sets,
    make_ble_set_event_mask,
    make_read_local_supported_codecs};

Loading