Component/bt: send data length request by host after read feature complete

This commit is contained in:
zhiweijian 2018-01-16 12:14:11 +08:00
parent 2b089968fe
commit 137d407e66
10 changed files with 38 additions and 11 deletions

View File

@ -66,6 +66,7 @@ static uint8_t ble_resolving_list_max_size;
static uint8_t ble_supported_states[BLE_SUPPORTED_STATES_SIZE]; static uint8_t ble_supported_states[BLE_SUPPORTED_STATES_SIZE];
static bt_device_features_t features_ble; static bt_device_features_t features_ble;
static uint16_t ble_suggested_default_data_length; static uint16_t ble_suggested_default_data_length;
static uint16_t ble_suggested_default_data_txtime;
static bool readable; static bool readable;
static bool ble_supported; static bool ble_supported;
@ -228,7 +229,8 @@ static void start_up(void)
response = AWAIT_COMMAND(packet_factory->make_ble_read_suggested_default_data_length()); response = AWAIT_COMMAND(packet_factory->make_ble_read_suggested_default_data_length());
packet_parser->parse_ble_read_suggested_default_data_length_response( packet_parser->parse_ble_read_suggested_default_data_length_response(
response, response,
&ble_suggested_default_data_length); &ble_suggested_default_data_length,
&ble_suggested_default_data_txtime);
} }
// Set the ble event mask next // Set the ble event mask next
@ -404,6 +406,13 @@ static uint16_t get_ble_suggested_default_data_length(void)
return ble_suggested_default_data_length; return ble_suggested_default_data_length;
} }
static uint16_t get_ble_suggested_default_data_txtime(void)
{
assert(readable);
assert(ble_supported);
return ble_suggested_default_data_txtime;
}
static uint16_t get_acl_buffer_count_classic(void) static uint16_t get_acl_buffer_count_classic(void)
{ {
assert(readable); assert(readable);
@ -472,6 +481,7 @@ static const controller_t interface = {
get_acl_packet_size_classic, get_acl_packet_size_classic,
get_acl_packet_size_ble, get_acl_packet_size_ble,
get_ble_suggested_default_data_length, get_ble_suggested_default_data_length,
get_ble_suggested_default_data_txtime,
get_acl_buffer_count_classic, get_acl_buffer_count_classic,
get_acl_buffer_count_ble, get_acl_buffer_count_ble,

View File

@ -69,6 +69,7 @@ typedef struct controller_t {
uint16_t (*get_acl_packet_size_ble)(void); uint16_t (*get_acl_packet_size_ble)(void);
uint16_t (*get_ble_default_data_packet_length)(void); uint16_t (*get_ble_default_data_packet_length)(void);
uint16_t (*get_ble_default_data_packet_txtime)(void);
// Get the number of acl packets the controller can buffer. // Get the number of acl packets the controller can buffer.
uint16_t (*get_acl_buffer_count_classic)(void); uint16_t (*get_acl_buffer_count_classic)(void);

View File

@ -183,11 +183,13 @@ static void parse_ble_read_resolving_list_size_response(
static void parse_ble_read_suggested_default_data_length_response( static void parse_ble_read_suggested_default_data_length_response(
BT_HDR *response, BT_HDR *response,
uint16_t *ble_default_packet_length_ptr) uint16_t *ble_default_packet_length_ptr,
uint16_t *ble_default_packet_txtime_ptr)
{ {
uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_DEFAULT_DATA_LENGTH, 2 /* bytes after */); uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_DEFAULT_DATA_LENGTH, 2 /* bytes after */);
STREAM_TO_UINT8(*ble_default_packet_length_ptr, stream); STREAM_TO_UINT16(*ble_default_packet_length_ptr, stream);
STREAM_TO_UINT16(*ble_default_packet_txtime_ptr, stream);
buffer_allocator->free(response); buffer_allocator->free(response);
} }

View File

@ -90,7 +90,8 @@ typedef struct {
void (*parse_ble_read_suggested_default_data_length_response)( void (*parse_ble_read_suggested_default_data_length_response)(
BT_HDR *response, BT_HDR *response,
uint16_t *ble_default_packet_length_ptr uint16_t *ble_default_packet_length_ptr,
uint16_t *ble_default_packet_txtime_ptr
); );
} hci_packet_parser_t; } hci_packet_parser_t;

View File

@ -907,6 +907,11 @@ void btm_read_remote_version_complete (UINT8 *p)
} }
#if BLE_INCLUDED == TRUE #if BLE_INCLUDED == TRUE
if (p_acl_cb->transport == BT_TRANSPORT_LE) { if (p_acl_cb->transport == BT_TRANSPORT_LE) {
if (HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl_cb->peer_le_features)) {
uint16_t data_length = controller_get_interface()->get_ble_default_data_packet_length();
uint16_t data_txtime = controller_get_interface()->get_ble_default_data_packet_txtime();
btsnd_hcic_ble_set_data_length(p_acl_cb->hci_handle, data_length, data_txtime);
}
l2cble_notify_le_connection (p_acl_cb->remote_addr); l2cble_notify_le_connection (p_acl_cb->remote_addr);
} }
#endif #endif

View File

@ -812,7 +812,7 @@ tBTM_STATUS BTM_SetBleDataLength(BD_ADDR bd_addr, UINT16 tx_pdu_length)
} }
if (!HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl->peer_le_features)) { if (!HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl->peer_le_features)) {
BTM_TRACE_DEBUG("%s failed, peer does not support request", __FUNCTION__); BTM_TRACE_ERROR("%s failed, peer does not support request", __FUNCTION__);
return BTM_PEER_LE_DATA_LEN_UNSUPPORTED; return BTM_PEER_LE_DATA_LEN_UNSUPPORTED;
} }

View File

@ -3350,6 +3350,11 @@ void btm_ble_read_remote_features_complete(UINT8 *p)
else{ else{
if (p_acl_cb->transport == BT_TRANSPORT_LE) { if (p_acl_cb->transport == BT_TRANSPORT_LE) {
if (HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl_cb->peer_le_features)) {
uint16_t data_length = controller_get_interface()->get_ble_default_data_packet_length();
uint16_t data_txtime = controller_get_interface()->get_ble_default_data_packet_txtime();
btsnd_hcic_ble_set_data_length(p_acl_cb->hci_handle, data_length, data_txtime);
}
l2cble_notify_le_connection (p_acl_cb->remote_addr); l2cble_notify_le_connection (p_acl_cb->remote_addr);
} }
} }

View File

@ -989,8 +989,10 @@ void gatt_process_mtu_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT16 len, UINT
p_tcb->payload_size = mtu; p_tcb->payload_size = mtu;
} }
} }
/* host will set packet data length to 251 automatically if remote device support set packet data length,
l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size); so l2cble_set_fixed_channel_tx_data_length() is not necessary.
l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size);
*/
gatt_end_operation(p_clcb, status, NULL); gatt_end_operation(p_clcb, status, NULL);
} }
/******************************************************************************* /*******************************************************************************

View File

@ -929,9 +929,10 @@ static void gatts_process_mtu_req (tGATT_TCB *p_tcb, UINT16 len, UINT8 *p_data)
p_tcb->payload_size = mtu; p_tcb->payload_size = mtu;
} }
GATT_TRACE_ERROR("MTU request PDU with MTU size %d\n", p_tcb->payload_size); /* host will set packet data length to 251 automatically if remote device support set packet data length,
so l2cble_set_fixed_channel_tx_data_length() is not necessary.
l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size); l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size);
*/
if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_MTU, (tGATT_SR_MSG *) &p_tcb->payload_size)) != NULL) { if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_MTU, (tGATT_SR_MSG *) &p_tcb->payload_size)) != NULL) {
attp_send_sr_msg (p_tcb, p_buf); attp_send_sr_msg (p_tcb, p_buf);

@ -1 +1 @@
Subproject commit 4c0d1e8941ebc2d43962d92509c17b664db2c7da Subproject commit 459d8f8e1921c9e82d8f0a9b1ecf44fc3699139d