fix(nimble): Reset data length global variables upon disconnection

This commit is contained in:
Rahul Tank
2025-01-10 17:51:09 +05:30
parent 9f89f5a039
commit fea7a9ba26
+19 -12
View File
@@ -293,8 +293,10 @@ static int ble_gap_conn_cancel_tx(void);
static int ble_gap_disc_enable_tx(int enable, int filter_duplicates);
#endif
uint16_t g_max_tx_time, g_max_rx_time;
uint16_t g_max_tx_octets, g_max_rx_octets;
uint16_t g_max_tx_time[MYNEWT_VAL(BLE_MAX_CONNECTIONS) + 1];
uint16_t g_max_rx_time[MYNEWT_VAL(BLE_MAX_CONNECTIONS) + 1 ];
uint16_t g_max_tx_octets[MYNEWT_VAL(BLE_MAX_CONNECTIONS) + 1];
uint16_t g_max_rx_octets[MYNEWT_VAL(BLE_MAX_CONNECTIONS) + 1];
STATS_SECT_DECL(ble_gap_stats) ble_gap_stats;
STATS_NAME_START(ble_gap_stats)
@@ -1464,6 +1466,11 @@ ble_gap_conn_broken(uint16_t conn_handle, int reason)
ble_hs_atomic_conn_delete(conn_handle);
g_max_tx_time[conn_handle] = 0;
g_max_rx_time[conn_handle] = 0;
g_max_tx_octets[conn_handle] = 0;
g_max_rx_octets[conn_handle] = 0;
event.type = BLE_GAP_EVENT_DISCONNECT;
event.disconnect.reason = reason;
@@ -2557,13 +2564,13 @@ ble_gap_rx_data_len_change(const struct ble_hci_ev_le_subev_data_len_chg *ev)
event.data_len_chg.max_tx_time = le16toh(ev->max_tx_time);
event.data_len_chg.max_rx_time = le16toh(ev->max_rx_time);
g_max_tx_octets[conn_handle] = event.data_len_chg.max_tx_octets;
g_max_rx_octets[conn_handle] = event.data_len_chg.max_rx_octets;
g_max_tx_time[conn_handle] = event.data_len_chg.max_tx_time;
g_max_rx_time[conn_handle] = event.data_len_chg.max_rx_time;
ble_gap_event_listener_call(&event);
ble_gap_call_conn_event_cb(&event, conn_handle);
g_max_tx_octets = event.data_len_chg.max_tx_octets;
g_max_rx_octets = event.data_len_chg.max_rx_octets;
g_max_tx_time = event.data_len_chg.max_tx_time;
g_max_rx_time = event.data_len_chg.max_rx_time;
#endif
}
@@ -7154,16 +7161,16 @@ int ble_gap_set_data_len(uint16_t conn_handle, uint16_t tx_octets, uint16_t tx_t
* If yes, then just return event to host indicating success
* since controller will not send any event in this scenario
*/
if (g_max_tx_time == tx_time && g_max_tx_octets == tx_octets) {
if (g_max_tx_time[conn_handle] == tx_time && g_max_tx_octets[conn_handle] == tx_octets) {
struct ble_gap_event event;
memset(&event, 0, sizeof event);
event.type = BLE_GAP_EVENT_DATA_LEN_CHG;
event.data_len_chg.max_tx_octets = g_max_tx_octets;
event.data_len_chg.max_rx_octets = g_max_rx_octets;
event.data_len_chg.max_tx_time = g_max_tx_time;
event.data_len_chg.max_rx_time = g_max_rx_time;
event.data_len_chg.max_tx_octets = g_max_tx_octets[conn_handle];
event.data_len_chg.max_rx_octets = g_max_rx_octets[conn_handle];
event.data_len_chg.max_tx_time = g_max_tx_time[conn_handle];
event.data_len_chg.max_rx_time = g_max_rx_time[conn_handle];
event.data_len_chg.conn_handle = conn_handle;
ble_gap_event_listener_call(&event);