Skip to content

Commit 8e4bfb2

Browse files
anhmoltlemrey
authored andcommitted
lib: ble_conn_params: fix att_mtu_get function returning wrong value
Function ble_conn_params_att_mtu_get would incorrectly return the value CONFIG_NRF_SDH_BLE_GATT_MAX_MTU_SIZE before an ATT MTU exchange procedure was started. The correct value is 23. The default ATT MTU size. Function ble_conn_params_att_mtu_get would also return an incorrect value if function ble_conn_params_att_mtu_set would fail to send an MTU exchange request with sd_ble_gattc_exchange_mtu_request returning NRF_ERROR_INVALID_STATE. This will happen if calling sd_ble_gattc_exchange_mtu_request and an ATT MTU exchange have already completed. Fix these two issues by introducing a extra att_mtu_pending state. Signed-off-by: Andreas Moltumyr <[email protected]>
1 parent 6e19440 commit 8e4bfb2

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

lib/ble_conn_params/att_mtu.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,20 @@ extern void ble_conn_params_event_send(const struct ble_conn_params_evt *evt);
1616

1717
static struct {
1818
uint16_t att_mtu;
19+
uint16_t att_mtu_desired;
1920
uint8_t att_mtu_exchange_pending : 1;
2021
} links[CONFIG_NRF_SDH_BLE_TOTAL_LINK_COUNT] = {
2122
[0 ... CONFIG_NRF_SDH_BLE_TOTAL_LINK_COUNT - 1] = {
22-
.att_mtu = CONFIG_BLE_CONN_PARAMS_ATT_MTU,
23+
.att_mtu = BLE_GATT_ATT_MTU_DEFAULT,
24+
.att_mtu_desired = CONFIG_BLE_CONN_PARAMS_ATT_MTU,
2325
}
2426
};
2527

2628
static void mtu_exchange_request(uint16_t conn_handle, int idx)
2729
{
2830
int err;
2931

30-
err = sd_ble_gattc_exchange_mtu_request(conn_handle, links[idx].att_mtu);
32+
err = sd_ble_gattc_exchange_mtu_request(conn_handle, links[idx].att_mtu_desired);
3133
if (!err) {
3234
return;
3335
}
@@ -47,7 +49,7 @@ static void on_exchange_mtu_req_evt(uint16_t conn_handle, int idx,
4749
int err;
4850

4951
/* Determine the lowest ATT MTU between our own desired ATT MTU and the peer's. */
50-
links[idx].att_mtu = MIN(evt->client_rx_mtu, links[idx].att_mtu);
52+
links[idx].att_mtu = MIN(evt->client_rx_mtu, links[idx].att_mtu_desired);
5153
links[idx].att_mtu_exchange_pending = false;
5254

5355
LOG_INF("Peer %#x requested ATT MTU of %u bytes", conn_handle, evt->client_rx_mtu);
@@ -77,7 +79,7 @@ static void on_exchange_mtu_rsp_evt(uint16_t conn_handle, int idx,
7779
const ble_gattc_evt_exchange_mtu_rsp_t *evt)
7880
{
7981
/* Determine the lowest ATT MTU between our own desired ATT MTU and the peer's. */
80-
links[idx].att_mtu = MIN(evt->server_rx_mtu, links[idx].att_mtu);
82+
links[idx].att_mtu = MIN(evt->server_rx_mtu, links[idx].att_mtu_desired);
8183
links[idx].att_mtu_exchange_pending = false;
8284

8385
LOG_INF("ATT MTU set to %u bytes for peer %#x", links[idx].att_mtu, conn_handle);
@@ -98,7 +100,7 @@ static void on_connected(uint16_t conn_handle, int idx, const ble_gap_evt_connec
98100

99101
if (IS_ENABLED(CONFIG_BLE_CONN_PARAMS_INITIATE_ATT_MTU_EXCHANGE)) {
100102
LOG_INF("Initiating ATT MTU exchange procedure (%u -> %u bytes) for peer %#x",
101-
BLE_GATT_ATT_MTU_DEFAULT, links[idx].att_mtu, conn_handle);
103+
links[idx].att_mtu, links[idx].att_mtu_desired, conn_handle);
102104

103105
mtu_exchange_request(conn_handle, idx);
104106
}
@@ -108,7 +110,8 @@ static void on_disconnected(uint16_t conn_handle, int idx)
108110
{
109111
ARG_UNUSED(conn_handle);
110112

111-
links[idx].att_mtu = CONFIG_BLE_CONN_PARAMS_ATT_MTU;
113+
links[idx].att_mtu = BLE_GATT_ATT_MTU_DEFAULT;
114+
links[idx].att_mtu_desired = CONFIG_BLE_CONN_PARAMS_ATT_MTU;
112115
links[idx].att_mtu_exchange_pending = false;
113116
}
114117

@@ -163,12 +166,11 @@ int ble_conn_params_att_mtu_set(uint16_t conn_handle, uint16_t att_mtu)
163166
return -EINVAL;
164167
}
165168

166-
if (att_mtu < BLE_GATT_ATT_MTU_DEFAULT ||
167-
att_mtu > CONFIG_NRF_SDH_BLE_GATT_MAX_MTU_SIZE) {
169+
if (att_mtu < BLE_GATT_ATT_MTU_DEFAULT || CONFIG_BLE_CONN_PARAMS_ATT_MTU < att_mtu) {
168170
return -EINVAL;
169171
}
170172

171-
links[idx].att_mtu = att_mtu;
173+
links[idx].att_mtu_desired = att_mtu;
172174
mtu_exchange_request(conn_handle, idx);
173175

174176
return 0;

0 commit comments

Comments
 (0)