summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSrinu Jella <sjella@codeaurora.org>2015-08-24 21:00:28 +0530
committerRashed Abdel-Tawab <rashed@linux.com>2017-10-28 18:23:18 -0700
commitc70e66c8c77b991ac0f9dfc2dec02a22ccb04dda (patch)
tree31d4f3738459c7382dd0e19dfbe43619b0de3444
parent1078b0fd3840ef7f492e3e2511e0611f9959f9d9 (diff)
downloadandroid_system_bt-c70e66c8c77b991ac0f9dfc2dec02a22ccb04dda.tar.gz
android_system_bt-c70e66c8c77b991ac0f9dfc2dec02a22ccb04dda.tar.bz2
android_system_bt-c70e66c8c77b991ac0f9dfc2dec02a22ccb04dda.zip
Bluetooth: Read BLE vendor capability to proceed on Secure conn
- Read BLE vendor capability to proceed on enablement of secure connection support from Host. - If BLE vendor capability is supported from the controller then secure connection is enabled from Host. CRs-Fixed: 1041642 Change-Id: I64e79d4e6fff7d9f1b0ea7272250e8155f5888e2
-rw-r--r--device/include/controller.h1
-rw-r--r--device/src/controller.cc27
-rw-r--r--hci/include/hci_packet_factory.h1
-rw-r--r--hci/include/hci_packet_parser.h3
-rw-r--r--hci/src/hci_layer.cc19
-rw-r--r--hci/src/hci_packet_factory.cc7
-rw-r--r--hci/src/hci_packet_parser.cc17
7 files changed, 66 insertions, 9 deletions
diff --git a/device/include/controller.h b/device/include/controller.h
index 7088764a1..3e882507c 100644
--- a/device/include/controller.h
+++ b/device/include/controller.h
@@ -84,6 +84,7 @@ typedef struct controller_t {
uint8_t (*get_ble_resolving_list_max_size)(void);
void (*set_ble_resolving_list_max_size)(int resolving_list_max_size);
uint8_t* (*get_local_supported_codecs)(uint8_t* number_of_codecs);
+ bool (*supports_ble_offload_features)(void);
uint8_t (*get_le_all_initiating_phys)(void);
} controller_t;
diff --git a/device/src/controller.cc b/device/src/controller.cc
index 1076bbf83..f12a95bd4 100644
--- a/device/src/controller.cc
+++ b/device/src/controller.cc
@@ -72,6 +72,7 @@ static uint8_t number_of_local_supported_codecs = 0;
static bool readable;
static bool ble_supported;
+static bool ble_offload_features_supported;
static bool simple_pairing_supported;
static bool secure_connections_supported;
@@ -166,14 +167,19 @@ static future_t* start_up(void) {
page_number++;
}
+ // read BLE offload features support from controller
+ response = AWAIT_COMMAND(packet_factory->make_ble_read_offload_features_support());
+ packet_parser->parse_ble_read_offload_features_response(response, &ble_offload_features_supported);
#if (SC_MODE_INCLUDED == TRUE)
- secure_connections_supported =
- HCI_SC_CTRLR_SUPPORTED(features_classic[2].as_array);
- if (secure_connections_supported) {
- response = AWAIT_COMMAND(
- packet_factory->make_write_secure_connections_host_support(
- HCI_SC_MODE_ENABLED));
- packet_parser->parse_generic_command_complete(response);
+ if(ble_offload_features_supported) {
+ secure_connections_supported =
+ HCI_SC_CTRLR_SUPPORTED(features_classic[2].as_array);
+ if (secure_connections_supported) {
+ response = AWAIT_COMMAND(
+ packet_factory->make_write_secure_connections_host_support(
+ HCI_SC_MODE_ENABLED));
+ packet_parser->parse_generic_command_complete(response);
+ }
}
#endif
@@ -414,6 +420,12 @@ static bool supports_ble_periodic_advertising(void) {
return HCI_LE_PERIODIC_ADVERTISING_SUPPORTED(features_ble.as_array);
}
+static bool supports_ble_offload_features(void) {
+ assert(readable);
+ assert(ble_supported);
+ return ble_offload_features_supported;
+}
+
static uint16_t get_acl_data_size_classic(void) {
CHECK(readable);
return acl_data_size_classic;
@@ -543,6 +555,7 @@ static const controller_t interface = {
get_ble_resolving_list_max_size,
set_ble_resolving_list_max_size,
get_local_supported_codecs,
+ supports_ble_offload_features,
get_le_all_initiating_phys};
const controller_t* controller_get_interface() {
diff --git a/hci/include/hci_packet_factory.h b/hci/include/hci_packet_factory.h
index ed189d627..3f62aedee 100644
--- a/hci/include/hci_packet_factory.h
+++ b/hci/include/hci_packet_factory.h
@@ -45,6 +45,7 @@ typedef struct {
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);
+ BT_HDR *(*make_ble_read_offload_features_support)(void);
} hci_packet_factory_t;
const hci_packet_factory_t* hci_packet_factory_get_interface();
diff --git a/hci/include/hci_packet_parser.h b/hci/include/hci_packet_parser.h
index b5117b912..520a5845b 100644
--- a/hci/include/hci_packet_parser.h
+++ b/hci/include/hci_packet_parser.h
@@ -78,6 +78,9 @@ typedef struct {
BT_HDR* response, uint8_t* number_of_local_supported_codecs,
uint8_t* local_supported_codecs);
+ void (*parse_ble_read_offload_features_response)(
+ BT_HDR *response,
+ bool *ble_offload_features_supported);
} hci_packet_parser_t;
const hci_packet_parser_t* hci_packet_parser_get_interface();
diff --git a/hci/src/hci_layer.cc b/hci/src/hci_layer.cc
index 563379f0d..05575989f 100644
--- a/hci/src/hci_layer.cc
+++ b/hci/src/hci_layer.cc
@@ -653,7 +653,26 @@ static waiting_command_t* get_waiting_command(command_opcode_t opcode) {
return wait_entry;
}
+ // look for any command complete with improper VS Opcode
+ for (const list_node_t *node = list_begin(commands_pending_response);
+ node != list_end(commands_pending_response);
+ node = list_next(node)) {
+ waiting_command_t *wait_entry =
+ reinterpret_cast<waiting_command_t*> (list_node(node));
+
+ if (wait_entry && (wait_entry->opcode != opcode) &&
+ (((wait_entry->opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC) &&
+ ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC))) {
+ LOG_DEBUG(LOG_TAG,"%s VS event found treat it as valid 0x%x", __func__, opcode);
+ }
+ else {
+ continue;
+ }
+
+ list_remove(commands_pending_response, wait_entry);
+ return wait_entry;
+ }
return NULL;
}
diff --git a/hci/src/hci_packet_factory.cc b/hci/src/hci_packet_factory.cc
index c3c4a60e3..adf5f38e8 100644
--- a/hci/src/hci_packet_factory.cc
+++ b/hci/src/hci_packet_factory.cc
@@ -155,6 +155,10 @@ static BT_HDR* make_read_local_supported_codecs(void) {
return make_command_no_params(HCI_READ_LOCAL_SUPPORTED_CODECS);
}
+static BT_HDR* make_ble_read_offload_features_support(void) {
+ return make_command_no_params(HCI_BLE_VENDOR_CAP_OCF);
+}
+
static BT_HDR* make_ble_set_event_mask(const bt_event_mask_t* event_mask) {
uint8_t* stream;
uint8_t parameter_size = sizeof(bt_event_mask_t);
@@ -215,7 +219,8 @@ static const hci_packet_factory_t interface = {
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};
+ make_read_local_supported_codecs,
+ make_ble_read_offload_features_support};
const hci_packet_factory_t* hci_packet_factory_get_interface() {
buffer_allocator = buffer_allocator_get_interface();
diff --git a/hci/src/hci_packet_parser.cc b/hci/src/hci_packet_parser.cc
index faf39397e..04928b17f 100644
--- a/hci/src/hci_packet_parser.cc
+++ b/hci/src/hci_packet_parser.cc
@@ -85,6 +85,20 @@ static void parse_read_local_supported_codecs_response(
buffer_allocator->free(response);
}
+static void parse_ble_read_offload_features_response(
+ BT_HDR *response,
+ bool *ble_offload_features_supported) {
+
+ uint8_t *stream = read_command_complete_header(response, NO_OPCODE_CHECKING, 0 /* bytes after */);
+ if(stream) {
+ *ble_offload_features_supported = true;
+ } else {
+ *ble_offload_features_supported = false;
+ }
+
+ buffer_allocator->free(response);
+}
+
static void parse_read_bd_addr_response(BT_HDR* response,
bt_bdaddr_t* address_ptr) {
uint8_t* stream = read_command_complete_header(
@@ -264,7 +278,8 @@ static const hci_packet_parser_t interface = {
parse_ble_read_suggested_default_data_length_response,
parse_ble_read_maximum_advertising_data_length,
parse_ble_read_number_of_supported_advertising_sets,
- parse_read_local_supported_codecs_response};
+ parse_read_local_supported_codecs_response,
+ parse_ble_read_offload_features_response};
const hci_packet_parser_t* hci_packet_parser_get_interface() {
buffer_allocator = buffer_allocator_get_interface();