diff options
-rwxr-xr-x | device/include/controller.h | 1 | ||||
-rwxr-xr-x | device/src/controller.c | 24 | ||||
-rwxr-xr-x | hci/include/hci_packet_factory.h | 1 | ||||
-rwxr-xr-x | hci/include/hci_packet_parser.h | 4 | ||||
-rw-r--r-- | hci/src/hci_layer.c | 14 | ||||
-rwxr-xr-x | hci/src/hci_packet_factory.c | 7 | ||||
-rwxr-xr-x | hci/src/hci_packet_parser.c | 18 |
7 files changed, 62 insertions, 7 deletions
diff --git a/device/include/controller.h b/device/include/controller.h index 63ee7afad..7ad38d31e 100755 --- a/device/include/controller.h +++ b/device/include/controller.h @@ -76,6 +76,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 *no_codecs); + bool (*supports_ble_offload_features)(void); } controller_t; const controller_t *controller_get_interface(); diff --git a/device/src/controller.c b/device/src/controller.c index da739cd7f..df00d68c6 100755 --- a/device/src/controller.c +++ b/device/src/controller.c @@ -77,6 +77,7 @@ static uint8_t no_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; @@ -183,11 +184,17 @@ 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 @@ -391,6 +398,12 @@ static bool supports_ble_connection_parameters_request(void) { return HCI_LE_CONN_PARAM_REQ_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) { assert(readable); return acl_data_size_classic; @@ -487,7 +500,8 @@ static const controller_t interface = { get_ble_resolving_list_max_size, set_ble_resolving_list_max_size, - get_local_supported_codecs + get_local_supported_codecs, + supports_ble_offload_features }; const controller_t *controller_get_interface() { diff --git a/hci/include/hci_packet_factory.h b/hci/include/hci_packet_factory.h index ac6f12a04..0056817b6 100755 --- a/hci/include/hci_packet_factory.h +++ b/hci/include/hci_packet_factory.h @@ -41,6 +41,7 @@ typedef struct { BT_HDR *(*make_ble_read_suggested_default_data_length)(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 51d00eaec..796a5df86 100755 --- a/hci/include/hci_packet_parser.h +++ b/hci/include/hci_packet_parser.h @@ -96,6 +96,10 @@ typedef struct { BT_HDR *response, uint8_t *no_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.c b/hci/src/hci_layer.c index 94e154eed..6a8050b4b 100644 --- a/hci/src/hci_layer.c +++ b/hci/src/hci_layer.c @@ -750,6 +750,20 @@ static waiting_command_t *get_waiting_command(command_opcode_t opcode) { node = list_next(node)) { waiting_command_t *wait_entry = list_node(node); + if (!wait_entry || wait_entry->opcode != opcode) + continue; + + list_remove(commands_pending_response, wait_entry); + + pthread_mutex_unlock(&commands_pending_response_lock); + 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 = list_node(node); + if (!wait_entry || wait_entry->opcode != opcode) { if(((wait_entry->opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC) && ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC)) { diff --git a/hci/src/hci_packet_factory.c b/hci/src/hci_packet_factory.c index 96f578a70..d43d274bf 100755 --- a/hci/src/hci_packet_factory.c +++ b/hci/src/hci_packet_factory.c @@ -141,6 +141,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); @@ -198,7 +202,8 @@ static const hci_packet_factory_t interface = { make_ble_read_resolving_list_size, make_ble_read_suggested_default_data_length, 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() { diff --git a/hci/src/hci_packet_parser.c b/hci/src/hci_packet_parser.c index 58633d12e..252652853 100755 --- a/hci/src/hci_packet_parser.c +++ b/hci/src/hci_packet_parser.c @@ -87,6 +87,21 @@ 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) { @@ -253,7 +268,8 @@ static const hci_packet_parser_t interface = { parse_ble_read_local_supported_features_response, parse_ble_read_resolving_list_size_response, parse_ble_read_suggested_default_data_length_response, - 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() { |