diff options
author | Srinu Jella <sjella@codeaurora.org> | 2015-08-24 21:00:28 +0530 |
---|---|---|
committer | Michael Bestas <mkbestas@lineageos.org> | 2019-12-11 23:50:40 +0200 |
commit | 6e7a33562c327d84ca5ab3584e2d4245306bcac6 (patch) | |
tree | f835590c09fcf1f53e1bb659847d16dcdb3f4746 | |
parent | dab8168a54eba1619ed95cd302443abb18b59119 (diff) | |
download | android_system_bt-6e7a33562c327d84ca5ab3584e2d4245306bcac6.tar.gz android_system_bt-6e7a33562c327d84ca5ab3584e2d4245306bcac6.tar.bz2 android_system_bt-6e7a33562c327d84ca5ab3584e2d4245306bcac6.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 c1fe337f2..f1c85aa3f 100644 --- a/device/include/controller.h +++ b/device/include/controller.h @@ -85,6 +85,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 34c8afd35..d843932e7 100644 --- a/device/src/controller.cc +++ b/device/src/controller.cc @@ -84,6 +84,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; @@ -178,14 +179,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 @@ -443,6 +449,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; @@ -580,6 +592,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 e7cb47b0b..91caa7a34 100644 --- a/hci/include/hci_packet_factory.h +++ b/hci/include/hci_packet_factory.h @@ -46,6 +46,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 8878cb968..06af55773 100644 --- a/hci/include/hci_packet_parser.h +++ b/hci/include/hci_packet_parser.h @@ -83,6 +83,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 6aa1a239f..c053f6b17 100644 --- a/hci/src/hci_layer.cc +++ b/hci/src/hci_layer.cc @@ -672,7 +672,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 ca0fb5fa6..1cff9f6db 100644 --- a/hci/src/hci_packet_factory.cc +++ b/hci/src/hci_packet_factory.cc @@ -159,6 +159,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); @@ -220,7 +224,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 b1efd444d..3f4e46cb4 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, RawAddress* address_ptr) { uint8_t* stream = read_command_complete_header( @@ -281,7 +295,8 @@ static const hci_packet_parser_t interface = { parse_ble_read_maximum_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(); |