hci: require ENABLE_LE_DATA_LENGTH_EXTENSION to enable max packet lenghts

This commit is contained in:
Matthias Ringwald 2017-07-07 22:34:48 +02:00
parent dcd678ba09
commit b435e06234
13 changed files with 53 additions and 20 deletions

View File

@ -66,21 +66,22 @@ LE_DEVICE_DB_PATH | Path to stored LE device information
### ENABLE_* directives {#sec:enableDirectives}
BTstack properties:
#define | Description
-----------------------------|---------------------------------------------
ENABLE_CLASSIC | Enable Classic related code in HCI and L2CAP
ENABLE_BLE | Enable BLE related code in HCI and L2CAP
ENABLE_EHCILL | Enable eHCILL low power mode on TI CC256x/WL18xx chipsets
ENABLE_LOG_DEBUG | Enable log_debug messages
ENABLE_LOG_ERROR | Enable log_error messages
ENABLE_LOG_INFO | Enable log_info messages
ENABLE_SCO_OVER_HCI | Enable SCO over HCI for chipsets (only TI CC256x/WL18xx, CSR + Broadcom H2/USB))
ENABLE_HFP_WIDE_BAND_SPEECH | Enable support for mSBC codec used in HFP profile for Wide-Band Speech
ENBALE_LE_PERIPHERAL | Enable support for LE Peripheral Role in HCI and Security Manager
ENBALE_LE_CENTRAL | Enable support for LE Central Role in HCI and Security Manager
ENABLE_LE_SECURE_CONNECTIONS | Enable LE Secure Connections using [mbed TLS library](https://tls.mbed.org)
ENABLE_LE_DATA_CHANNELS | Enable LE Data Channels in credit-based flow control mode
ENABLE_LE_SIGNED_WRITE | Enable LE Signed Writes in ATT/GATT
#define | Description
--------------------------------|---------------------------------------------
ENABLE_CLASSIC | Enable Classic related code in HCI and L2CAP
ENABLE_BLE | Enable BLE related code in HCI and L2CAP
ENABLE_EHCILL | Enable eHCILL low power mode on TI CC256x/WL18xx chipsets
ENABLE_LOG_DEBUG | Enable log_debug messages
ENABLE_LOG_ERROR | Enable log_error messages
ENABLE_LOG_INFO | Enable log_info messages
ENABLE_SCO_OVER_HCI | Enable SCO over HCI for chipsets (only TI CC256x/WL18xx, CSR + Broadcom H2/USB))
ENABLE_HFP_WIDE_BAND_SPEECH | Enable support for mSBC codec used in HFP profile for Wide-Band Speech
ENBALE_LE_PERIPHERAL | Enable support for LE Peripheral Role in HCI and Security Manager
ENBALE_LE_CENTRAL | Enable support for LE Central Role in HCI and Security Manager
ENABLE_LE_SECURE_CONNECTIONS | Enable LE Secure Connections using [mbed TLS library](https://tls.mbed.org)
ENABLE_LE_DATA_CHANNELS | Enable LE Data Channels in credit-based flow control mode
ENABLE_LE_DATA_LENGTH_EXTENSION | Enable LE Data Length Extension support
ENABLE_LE_SIGNED_WRITE | Enable LE Signed Writes in ATT/GATT
ENABLE_HCI_CONTROLLER_TO_HOST_FLOW_CONTROL | Enable HCI Controller to Host Flow Control, see below
ENABLE_CC256X_BAUDRATE_CHANGE_FLOWCONTROL_BUG_WORKAROUND | Enable workaround for bug in CC256x Flow Control during baud rate change, see chipset docs.

View File

@ -18,6 +18,7 @@
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_SECURE_CONNECTIONS
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_ERROR
#define ENABLE_LOG_INFO
#define ENABLE_SCO_OVER_HCI

View File

@ -18,6 +18,7 @@
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_SECURE_CONNECTIONS
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_ERROR
#define ENABLE_LOG_INFO
#define ENABLE_SCO_OVER_HCI

View File

@ -18,6 +18,7 @@
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_SECURE_CONNECTIONS
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_ERROR
#define ENABLE_LOG_INFO
#define ENABLE_SCO_OVER_HCI

View File

@ -18,6 +18,7 @@
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_SECURE_CONNECTIONS
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_ERROR
#define ENABLE_LOG_INFO
#define ENABLE_SCO_OVER_HCI

View File

@ -18,6 +18,7 @@
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_SECURE_CONNECTIONS
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_ERROR
#define ENABLE_LOG_INFO
#define ENABLE_SCO_OVER_HCI

View File

@ -12,6 +12,7 @@
#define ENABLE_BLE
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_INFO
#define ENABLE_LOG_ERROR

View File

@ -15,6 +15,7 @@
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_SECURE_CONNECTIONS
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_ERROR
#define ENABLE_LOG_INFO

View File

@ -16,6 +16,7 @@
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_SECURE_CONNECTIONS
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_ERROR
#define ENABLE_LOG_INFO
// #define ENABLE_LOG_DEBUG

View File

@ -18,6 +18,7 @@
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_SECURE_CONNECTIONS
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_ERROR
#define ENABLE_LOG_INFO
#define ENABLE_SCO_OVER_HCI

View File

@ -18,6 +18,7 @@
#define ENABLE_LE_CENTRAL
#define ENABLE_LE_PERIPHERAL
#define ENABLE_LE_SECURE_CONNECTIONS
#define ENABLE_LE_DATA_LENGTH_EXTENSION
#define ENABLE_LOG_ERROR
#define ENABLE_LOG_INFO
#define ENABLE_SCO_OVER_HCI

View File

@ -1297,15 +1297,19 @@ static void hci_initializing_run(void){
hci_stack->substate = HCI_INIT_W4_WRITE_LE_HOST_SUPPORTED;
hci_send_cmd(&hci_write_le_host_supported, 1, 0);
break;
#endif
#ifdef ENABLE_LE_DATA_LENGTH_EXTENSION
case HCI_INIT_LE_READ_MAX_DATA_LENGTH:
hci_stack->substate = HCI_INIT_W4_LE_READ_MAX_DATA_LENGTH;
hci_send_cmd(&hci_le_read_maximum_data_length);
break;
case HCI_INIT_LE_WRITE_SUGGESTED_DATA_LENGTH:
hci_stack->substate = HCI_INIT_W4_LE_WRITE_SUGGESTED_DATA_LENGTH;
// TODO: use values from read max data length
hci_send_cmd(&hci_le_write_suggested_default_data_length, 251, 2120);
hci_send_cmd(&hci_le_write_suggested_default_data_length, hci_stack->le_supported_max_tx_octets, hci_stack->le_supported_max_tx_time);
break;
#endif
#ifdef ENABLE_LE_CENTRAL
case HCI_INIT_READ_WHITE_LIST_SIZE:
hci_stack->substate = HCI_INIT_W4_READ_WHITE_LIST_SIZE;
@ -1316,7 +1320,6 @@ static void hci_initializing_run(void){
hci_stack->substate = HCI_INIT_W4_LE_SET_SCAN_PARAMETERS;
hci_send_cmd(&hci_le_set_scan_parameters, 1, 0x1e0, 0x30, hci_stack->le_own_addr_type, 0);
break;
#endif
#endif
default:
return;
@ -1558,13 +1561,25 @@ static void hci_initializing_event_handler(uint8_t * packet, uint16_t size){
case HCI_INIT_W4_LE_READ_BUFFER_SIZE:
// skip write le host if not supported (e.g. on LE only EM9301)
if (hci_stack->local_supported_commands[0] & 0x02) break;
// explicit fall through to reduce repetitions
#ifdef ENABLE_LE_DATA_LENGTH_EXTENSION
case HCI_INIT_W4_WRITE_LE_HOST_SUPPORTED:
if ((hci_stack->local_supported_commands[0] & 0x30) == 0x30){
hci_stack->substate = HCI_INIT_LE_READ_MAX_DATA_LENGTH;
return;
}
// explicit fall through to reduce repetitions
#endif
#ifdef ENABLE_LE_CENTRAL
hci_stack->substate = HCI_INIT_LE_READ_MAX_DATA_LENGTH;
hci_stack->substate = HCI_INIT_READ_WHITE_LIST_SIZE;
#else
hci_init_done();
#endif
return;
#endif
case HCI_INIT_W4_WRITE_LOCAL_NAME:
// skip write eir data if no eir data set
if (hci_stack->eir_data) break;
@ -1684,17 +1699,19 @@ static void event_handler(uint8_t *packet, int size){
}
log_info("hci_le_read_buffer_size: size %u, count %u", hci_stack->le_data_packets_length, hci_stack->le_acl_packets_total_num);
}
#endif
#ifdef ENABLE_LE_DATA_LENGTH_EXTENSION
if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_le_read_maximum_data_length)){
hci_stack->le_supported_max_tx_octets = little_endian_read_16(packet, 6);
hci_stack->le_supported_max_tx_time = little_endian_read_16(packet, 8);
log_info("hci_le_read_maximum_data_length: tx octets %u, tx time %u us", hci_stack->le_supported_max_tx_octets, hci_stack->le_supported_max_tx_time);
}
#endif
#ifdef ENABLE_LE_CENTRAL
if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_le_read_white_list_size)){
hci_stack->le_whitelist_capacity = packet[6];
log_info("hci_le_read_white_list_size: size %u", hci_stack->le_whitelist_capacity);
}
#endif
#endif
if (HCI_EVENT_IS_COMMAND_COMPLETE(packet, hci_read_bd_addr)) {
reverse_bd_addr(&packet[OFFSET_OF_DATA_IN_COMMAND_COMPLETE + 1],

View File

@ -598,6 +598,9 @@ typedef enum hci_init_state{
HCI_INIT_W4_LE_READ_BUFFER_SIZE,
HCI_INIT_WRITE_LE_HOST_SUPPORTED,
HCI_INIT_W4_WRITE_LE_HOST_SUPPORTED,
#endif
#ifdef ENABLE_LE_DATA_LENGTH_EXTENSION
HCI_INIT_LE_READ_MAX_DATA_LENGTH,
HCI_INIT_W4_LE_READ_MAX_DATA_LENGTH,
HCI_INIT_LE_WRITE_SUGGESTED_DATA_LENGTH,
@ -820,9 +823,11 @@ typedef struct {
bd_addr_t le_advertisements_direct_address;
#endif
#ifdef ENABLE_LE_DATA_LENGTH_EXTENSION
// LE Data Length
uint16_t le_supported_max_tx_octets;
uint16_t le_supported_max_tx_time;
#endif
// custom BD ADDR
bd_addr_t custom_bd_addr;