diff options
author | Srinu Jella <sjella@codeaurora.org> | 2015-08-24 21:00:28 +0530 |
---|---|---|
committer | Rashed Abdel-Tawab <rashed@linux.com> | 2017-10-28 18:23:18 -0700 |
commit | c70e66c8c77b991ac0f9dfc2dec02a22ccb04dda (patch) | |
tree | 31d4f3738459c7382dd0e19dfbe43619b0de3444 | |
parent | 1078b0fd3840ef7f492e3e2511e0611f9959f9d9 (diff) | |
download | android_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.h | 1 | ||||
-rw-r--r-- | device/src/controller.cc | 27 | ||||
-rw-r--r-- | hci/include/hci_packet_factory.h | 1 | ||||
-rw-r--r-- | hci/include/hci_packet_parser.h | 3 | ||||
-rw-r--r-- | hci/src/hci_layer.cc | 19 | ||||
-rw-r--r-- | hci/src/hci_packet_factory.cc | 7 | ||||
-rw-r--r-- | hci/src/hci_packet_parser.cc | 17 |
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(); |