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

This commit is contained in:
Rahul Tank
2025-01-08 21:38:38 +05:30
parent d7a585dcf0
commit 8e41b8752a
+22 -12
View File
@@ -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);