gatt: Fix not cleaning up device state properly
Luiz Augusto von Dentz
maintainerPATCH v2 1/1 gatt: Fix not cleaning up device state properly
From: Luiz Augusto von Dentz <[email protected]>
If the device is removed locally device_free would end up calling bt_att_unref which won't trigger any disconnect callback necessary to remove device states.
---
v2: Fix glib warning if att is already disconnected.
src/device.c | 3 +++ src/gatt-database.c | 29 +++++++++++++++++++++++++++++ src/gatt-database.h | 2 ++ 3 files changed, 34 insertions(+)
src/device.c +3 -0
@@ -580,6 +580,9 @@ static void gatt_server_cleanup(struct btd_device *device)bt_gatt_server_unref (device->server); device->server =NULL ; + +btd_gatt_database_att_disconnected ( +btd_adapter_get_database (device->adapter), device->att); }static void attio_cleanup (struct btd_device *device)
src/gatt-database.c +29 -0
@@ -357,6 +357,11 @@ static bool get_dst_info(struct bt_att *att, bdaddr_t *dst, uint8_t *dst_type) {GIOChannel *io =NULL ;GError *gerr =NULL ; +int fd; + + fd =bt_att_get_fd (att); +if (fd <0 ) +return false; io =g_io_channel_unix_new (bt_att_get_fd (att));if (!io)
@@ -3349,6 +3354,30 @@ void btd_gatt_database_att_connected(struct btd_gatt_database *database, state->pending =NULL ; } +void btd_gatt_database_att_disconnected (struct btd_gatt_database *database, +struct bt_att *att) +{ +struct device_state *state; +bdaddr_t bdaddr; +uint8_t bdaddr_type; + +DBG ("" ); + +if (!get_dst_info (att, &bdaddr, &bdaddr_type)) +return ; + + state =find_device_state (database, &bdaddr, bdaddr_type); +if (!state) +return ; + +if (state->disc_id) { +bt_att_unregister_disconnect (att, state->disc_id); + state->disc_id =0 ; + } + +att_disconnected (0 , state); +} +static void restore_ccc (struct btd_gatt_database *database,const bdaddr_t *addr,uint8_t addr_type,uint16_t value) {
src/gatt-database.h +2 -0
@@ -25,5 +25,7 @@ void btd_gatt_database_destroy(struct btd_gatt_database *database);struct gatt_db *btd_gatt_database_get_db (struct btd_gatt_database *database);void btd_gatt_database_att_connected (struct btd_gatt_database *database,struct bt_att *att); +void btd_gatt_database_att_disconnected (struct btd_gatt_database *database, +struct bt_att *att);void btd_gatt_database_restore_svc_chng_ccc (struct btd_gatt_database *database);
Signature · 1 line
2.17.1