Skip to content

Commit 98982c6

Browse files
authored
Merge pull request #9441 from dhalbert/nordic-fix-mtu-negotiation
nordic: fix BLE MTU negotation
2 parents 2f62612 + f2f5d9b commit 98982c6

File tree

3 files changed

+118
-13
lines changed

3 files changed

+118
-13
lines changed

ports/nordic/bluetooth/ble_drv.c

Lines changed: 104 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,112 @@
1818
#include "py/gc.h"
1919
#include "py/misc.h"
2020
#include "py/mpstate.h"
21+
#include "mpconfigport.h"
2122

2223
#if CIRCUITPY_SERIAL_BLE && CIRCUITPY_VERBOSE_BLE
2324
#include "supervisor/shared/bluetooth/serial.h"
2425
#endif
2526

27+
#if CIRCUITPY_VERBOSE_BLE
28+
const char *ble_drv_evt_name(uint32_t evt) {
29+
switch (evt) {
30+
case BLE_GAP_EVT_CONNECTED:
31+
return "BLE_GAP_EVT_CONNECTED";
32+
case BLE_GAP_EVT_DISCONNECTED:
33+
return "BLE_GAP_EVT_DISCONNECTED";
34+
case BLE_GAP_EVT_CONN_PARAM_UPDATE:
35+
return "BLE_GAP_EVT_CONN_PARAM_UPDATE";
36+
case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
37+
return "BLE_GAP_EVT_SEC_PARAMS_REQUEST";
38+
case BLE_GAP_EVT_SEC_INFO_REQUEST:
39+
return "BLE_GAP_EVT_SEC_INFO_REQUEST";
40+
case BLE_GAP_EVT_PASSKEY_DISPLAY:
41+
return "BLE_GAP_EVT_PASSKEY_DISPLAY";
42+
case BLE_GAP_EVT_KEY_PRESSED:
43+
return "BLE_GAP_EVT_KEY_PRESSED";
44+
case BLE_GAP_EVT_AUTH_KEY_REQUEST:
45+
return "BLE_GAP_EVT_AUTH_KEY_REQUEST";
46+
case BLE_GAP_EVT_LESC_DHKEY_REQUEST:
47+
return "BLE_GAP_EVT_LESC_DHKEY_REQUEST";
48+
case BLE_GAP_EVT_AUTH_STATUS:
49+
return "BLE_GAP_EVT_AUTH_STATUS";
50+
case BLE_GAP_EVT_CONN_SEC_UPDATE:
51+
return "BLE_GAP_EVT_CONN_SEC_UPDATE";
52+
case BLE_GAP_EVT_TIMEOUT:
53+
return "BLE_GAP_EVT_TIMEOUT";
54+
case BLE_GAP_EVT_RSSI_CHANGED:
55+
return "BLE_GAP_EVT_RSSI_CHANGED";
56+
case BLE_GAP_EVT_ADV_REPORT:
57+
return "BLE_GAP_EVT_ADV_REPORT";
58+
case BLE_GAP_EVT_SEC_REQUEST:
59+
return "BLE_GAP_EVT_SEC_REQUEST";
60+
case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
61+
return "BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST";
62+
case BLE_GAP_EVT_SCAN_REQ_REPORT:
63+
return "BLE_GAP_EVT_SCAN_REQ_REPORT";
64+
case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
65+
return "BLE_GAP_EVT_PHY_UPDATE_REQUEST";
66+
case BLE_GAP_EVT_PHY_UPDATE:
67+
return "BLE_GAP_EVT_PHY_UPDATE";
68+
case BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST:
69+
return "BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST";
70+
case BLE_GAP_EVT_DATA_LENGTH_UPDATE:
71+
return "BLE_GAP_EVT_DATA_LENGTH_UPDATE";
72+
case BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT:
73+
return "BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT";
74+
case BLE_GAP_EVT_ADV_SET_TERMINATED:
75+
return "BLE_GAP_EVT_ADV_SET_TERMINATED";
76+
77+
case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP:
78+
return "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP";
79+
case BLE_GATTC_EVT_REL_DISC_RSP:
80+
return "BLE_GATTC_EVT_REL_DISC_RSP";
81+
case BLE_GATTC_EVT_CHAR_DISC_RSP:
82+
return "BLE_GATTC_EVT_CHAR_DISC_RSP";
83+
case BLE_GATTC_EVT_DESC_DISC_RSP:
84+
return "BLE_GATTC_EVT_DESC_DISC_RSP";
85+
case BLE_GATTC_EVT_ATTR_INFO_DISC_RSP:
86+
return "BLE_GATTC_EVT_ATTR_INFO_DISC_RSP";
87+
case BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP:
88+
return "BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP";
89+
case BLE_GATTC_EVT_READ_RSP:
90+
return "BLE_GATTC_EVT_READ_RSP";
91+
case BLE_GATTC_EVT_CHAR_VALS_READ_RSP:
92+
return "BLE_GATTC_EVT_CHAR_VALS_READ_RSP";
93+
case BLE_GATTC_EVT_WRITE_RSP:
94+
return "BLE_GATTC_EVT_WRITE_RSP";
95+
case BLE_GATTC_EVT_HVX:
96+
return "BLE_GATTC_EVT_HVX";
97+
case BLE_GATTC_EVT_EXCHANGE_MTU_RSP:
98+
return "BLE_GATTC_EVT_EXCHANGE_MTU_RSP";
99+
case BLE_GATTC_EVT_TIMEOUT:
100+
return "BLE_GATTC_EVT_TIMEOUT";
101+
case BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE:
102+
return "BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE";
103+
104+
case BLE_GATTS_EVT_WRITE:
105+
return "BLE_GATTS_EVT_WRITE";
106+
case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST:
107+
return "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST";
108+
case BLE_GATTS_EVT_SYS_ATTR_MISSING:
109+
return "BLE_GATTS_EVT_SYS_ATTR_MISSING";
110+
case BLE_GATTS_EVT_HVC:
111+
return "BLE_GATTS_EVT_HVC";
112+
case BLE_GATTS_EVT_SC_CONFIRM:
113+
return "BLE_GATTS_EVT_SC_CONFIRM";
114+
case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST:
115+
return "BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST";
116+
case BLE_GATTS_EVT_TIMEOUT:
117+
return "BLE_GATTS_EVT_TIMEOUT";
118+
case BLE_GATTS_EVT_HVN_TX_COMPLETE:
119+
return "BLE_GATTS_EVT_HVN_TX_COMPLETE";
120+
121+
default:
122+
return "unknown EVT";
123+
}
124+
};
125+
#endif
126+
26127
nrf_nvic_state_t nrf_nvic_state = { 0 };
27128

28129
// Flag indicating progress of internal flash operation.
@@ -143,14 +244,11 @@ void SD_EVT_IRQHandler(void) {
143244
}
144245

145246
ble_evt_t *event = (ble_evt_t *)m_ble_evt_buf;
247+
146248
#if CIRCUITPY_VERBOSE_BLE
147249
size_t eid = event->header.evt_id;
148-
if (eid != 0x1d) {
149-
if (BLE_GAP_EVT_BASE <= eid && eid <= BLE_GAP_EVT_LAST) {
150-
mp_printf(&mp_plat_print, "BLE GAP event: %d\n", eid - BLE_GAP_EVT_BASE);
151-
} else {
152-
mp_printf(&mp_plat_print, "BLE event: 0x%04x\n", event->header.evt_id);
153-
}
250+
if (eid != BLE_GAP_EVT_ADV_REPORT) {
251+
mp_printf(&mp_plat_print, "BLE event: %s (0x%04x)\n", ble_drv_evt_name(eid), eid);
154252
}
155253
#endif
156254

ports/nordic/common-hal/_bleio/Adapter.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -668,15 +668,20 @@ mp_obj_t common_hal_bleio_adapter_connect(bleio_adapter_obj_t *self, bleio_addre
668668
}
669669
}
670670

671-
// Negotiate for better PHY, larger MTU and data lengths since we are the central. These are
672-
// nice-to-haves so ignore any errors.
671+
// Negotiate for better PHY, larger MTU and data lengths since we are the central.
672+
// The peer may decline, which is its prerogative.
673673
ble_gap_phys_t const phys = {
674674
.rx_phys = BLE_GAP_PHY_AUTO,
675675
.tx_phys = BLE_GAP_PHY_AUTO,
676676
};
677677
sd_ble_gap_phy_update(conn_handle, &phys);
678-
sd_ble_gattc_exchange_mtu_request(conn_handle, BLE_GATTS_VAR_ATTR_LEN_MAX);
679-
sd_ble_gap_data_length_update(conn_handle, NULL, NULL);
678+
// The MTU size passed here has to match the value passed in the BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST
679+
// event handler in Connection.c, per the SD doc:
680+
// "The value must be equal to Server RX MTU size given in
681+
// sd_ble_gatts_exchange_mtu_reply if an ATT_MTU exchange has
682+
// already been performed in the other direction."
683+
check_nrf_error(sd_ble_gattc_exchange_mtu_request(conn_handle, BLE_GATTS_VAR_ATTR_LEN_MAX));
684+
check_nrf_error(sd_ble_gap_data_length_update(conn_handle, NULL, NULL));
680685

681686
// Make the connection object and return it.
682687
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {

ports/nordic/common-hal/_bleio/Connection.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,15 @@ bool connection_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
113113
if (self->mtu > 0) {
114114
new_mtu = self->mtu;
115115
}
116-
117116
self->mtu = new_mtu;
118-
sd_ble_gatts_exchange_mtu_reply(self->conn_handle, new_mtu);
117+
// The MTU size passed here has to match the value passed in Adapter.c, per the SD doc:
118+
// "The value must be equal to Client RX MTU size given in
119+
// sd_ble_gattc_exchange_mtu_request if an ATT_MTU exchange has
120+
// already been performed in the other direction."
121+
check_nrf_error(sd_ble_gatts_exchange_mtu_reply(self->conn_handle, BLE_GATTS_VAR_ATTR_LEN_MAX));
119122
break;
120123
}
121124

122-
123125
case BLE_GATTC_EVT_EXCHANGE_MTU_RSP: {
124126
ble_gattc_evt_exchange_mtu_rsp_t *response =
125127
&ble_evt->evt.gattc_evt.params.exchange_mtu_rsp;

0 commit comments

Comments
 (0)