From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> Upon reconnecting the attributes may already be available from cache which mean the client would be able to issue commands while discovery is not complete thus btd_gatt_client_ready was not called yet. To fix now btd_gatt_client_ready is split into btd_gatt_client_connected which is called whenever connected leaving btd_gatt_client_ready to only deal with exporting services found during the discovery. --- src/device.c | 2 ++ src/gatt-client.c | 24 +++++++++++++++++------- src/gatt-client.h | 1 + 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/device.c b/src/device.c index dc362d9..2102f23 100644 --- a/src/device.c +++ b/src/device.c @@ -4602,6 +4602,8 @@ static void gatt_client_init(struct btd_device *device) } device->gatt_cache_used = !gatt_db_isempty(device->db); + + btd_gatt_client_connected(device->client_dbus); } static void gatt_server_init(struct btd_device *device, struct gatt_db *db) diff --git a/src/gatt-client.c b/src/gatt-client.c index d8a3429..225aa42 100644 --- a/src/gatt-client.c +++ b/src/gatt-client.c @@ -1825,20 +1825,14 @@ fail: void btd_gatt_client_ready(struct btd_gatt_client *client) { - struct bt_gatt_client *gatt; - if (!client) return; - gatt = btd_device_get_gatt_client(client->device); - if (!gatt) { + if (!client->gatt) { error("GATT client not initialized"); return; } - bt_gatt_client_unref(client->gatt); - client->gatt = bt_gatt_client_ref(gatt); - client->ready = true; DBG("GATT client ready"); @@ -1852,6 +1846,22 @@ void btd_gatt_client_ready(struct btd_gatt_client *client) queue_foreach(client->all_notify_clients, register_notify, client); } +void btd_gatt_client_connected(struct btd_gatt_client *client) +{ + struct bt_gatt_client *gatt; + + gatt = btd_device_get_gatt_client(client->device); + if (!gatt) { + error("GATT client not initialized"); + return; + } + + DBG("Device connected."); + + bt_gatt_client_unref(client->gatt); + client->gatt = bt_gatt_client_ref(gatt); +} + void btd_gatt_client_service_added(struct btd_gatt_client *client, struct gatt_db_attribute *attrib) { diff --git a/src/gatt-client.h b/src/gatt-client.h index a18db17..92a9255 100644 --- a/src/gatt-client.h +++ b/src/gatt-client.h @@ -23,6 +23,7 @@ struct btd_gatt_client *btd_gatt_client_new(struct btd_device *device); void btd_gatt_client_destroy(struct btd_gatt_client *client); void btd_gatt_client_ready(struct btd_gatt_client *client); +void btd_gatt_client_connected(struct btd_gatt_client *client); void btd_gatt_client_service_added(struct btd_gatt_client *client, struct gatt_db_attribute *attrib); void btd_gatt_client_service_removed(struct btd_gatt_client *client, -- 2.4.3 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html