From dde9ff1e1989698c4502e3c8fea2b7ddfa85caf8 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Tue, 29 Dec 2020 15:12:03 +0100 Subject: [PATCH] gatt_client/att_server: track mtu exchanged in hci_connection->att_connection --- src/ble/att_db.c | 1 + src/ble/att_db.h | 1 + src/ble/gatt_client.c | 11 ++++++++++- src/hci.c | 6 +++++- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ble/att_db.c b/src/ble/att_db.c index a3d19b3bc..0cd5ba4de 100644 --- a/src/ble/att_db.c +++ b/src/ble/att_db.c @@ -369,6 +369,7 @@ static uint16_t handle_exchange_mtu_request(att_connection_t * att_connection, u // find min(local max mtu, remote mtu) >= ATT_DEFAULT_MTU and use as mtu for this connection uint16_t min_mtu = btstack_min(client_rx_mtu, att_connection->max_mtu); uint16_t new_mtu = btstack_max(ATT_DEFAULT_MTU, min_mtu); + att_connection->mtu_exchanged = true; att_connection->mtu = new_mtu; response_buffer[0] = ATT_EXCHANGE_MTU_RESPONSE; diff --git a/src/ble/att_db.h b/src/ble/att_db.h index 7c36faf81..f12ff993e 100644 --- a/src/ble/att_db.h +++ b/src/ble/att_db.h @@ -109,6 +109,7 @@ typedef struct att_connection { hci_con_handle_t con_handle; uint16_t mtu; // initialized to ATT_DEFAULT_MTU (23), negotiated during MTU exchange uint16_t max_mtu; // local maximal L2CAP_MTU, set to l2cap_max_le_mtu() + bool mtu_exchanged; uint8_t encryption_key_size; uint8_t authenticated; uint8_t authorized; diff --git a/src/ble/gatt_client.c b/src/ble/gatt_client.c index 4c25b8d28..8c8805ecb 100644 --- a/src/ble/gatt_client.c +++ b/src/ble/gatt_client.c @@ -1319,8 +1319,17 @@ static void gatt_client_att_packet_handler(uint8_t packet_type, uint16_t handle, if (size < 3u) break; uint16_t remote_rx_mtu = little_endian_read_16(packet, 1); uint16_t local_rx_mtu = l2cap_max_le_mtu(); - gatt_client->mtu = (remote_rx_mtu < local_rx_mtu) ? remote_rx_mtu : local_rx_mtu; + uint16_t mtu = (remote_rx_mtu < local_rx_mtu) ? remote_rx_mtu : local_rx_mtu; + + // set gatt client mtu + gatt_client->mtu = mtu; gatt_client->mtu_state = MTU_EXCHANGED; + + // set per connection mtu state + hci_connection_t * hci_connection = hci_connection_for_handle(handle); + hci_connection->att_connection.mtu = gatt_client->mtu; + hci_connection->att_connection.mtu_exchanged = true; + emit_gatt_mtu_exchanged_result_event(gatt_client, gatt_client->mtu); break; } diff --git a/src/hci.c b/src/hci.c index 1c819075c..d1dca9ea0 100644 --- a/src/hci.c +++ b/src/hci.c @@ -2221,7 +2221,11 @@ static void event_handle_le_connection_complete(const uint8_t * packet){ } #endif - // TODO: store - role, peer address type, conn_interval, conn_latency, supervision timeout, master clock + // init unenhanced att bearer mtu + conn->att_connection.mtu = ATT_DEFAULT_MTU; + conn->att_connection.mtu_exchanged = false; + + // TODO: store - role, peer address type, conn_interval, conn_latency, supervision timeout, master clock // restart timer // btstack_run_loop_set_timer(&conn->timeout, HCI_CONNECTION_TIMEOUT_MS);