From 8e41b8752a79ea10e75b45626941497228c3d011 Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Tue, 7 Jan 2025 19:12:53 +0530 Subject: [PATCH] fix(nimble): Reset data length global variables upon disconnection --- nimble/host/src/ble_gap.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/nimble/host/src/ble_gap.c b/nimble/host/src/ble_gap.c index fc1e885ff..a8c11b238 100644 --- a/nimble/host/src/ble_gap.c +++ b/nimble/host/src/ble_gap.c @@ -311,8 +311,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) @@ -1526,6 +1528,12 @@ ble_gap_conn_broken(uint16_t conn_handle, int reason) ble_hs_atomic_conn_delete(conn_handle); + printf("In %s, conn_handle %d \n", __func__, 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; @@ -2692,13 +2700,14 @@ 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); + printf("In %s , conn_handle : %d \n", __func__, conn_handle); + 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 } @@ -7772,16 +7781,17 @@ ble_gap_set_data_len(uint16_t conn_handle, uint16_t tx_octets, * 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) { + printf("In %s, conn_handle: %d \n", __func__, conn_handle); + 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);