From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> When reconnecting warnings could be seen due to services already existing which is a new behavior introduced by dbd6591bd1d0 ("main.conf: Add GATT.ExportClaimedServices"). --- src/gatt-client.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/gatt-client.c b/src/gatt-client.c index 6f22bbb490a7..da7c16fc14af 100644 --- a/src/gatt-client.c +++ b/src/gatt-client.c @@ -1968,12 +1968,33 @@ static void service_free(void *data) free(service); } +static bool match_service_handle(const void *a, const void *b) +{ + const struct service *service = a; + uint16_t start_handle = PTR_TO_UINT(b); + + return service->start_handle == start_handle; +} + static struct service *service_create(struct gatt_db_attribute *attr, struct btd_gatt_client *client) { struct service *service; const char *device_path = device_get_path(client->device); bt_uuid_t uuid; + uint16_t start_handle, end_handle; + bool primary; + + gatt_db_attribute_get_service_data(attr, &start_handle, + &end_handle, + &primary, + &uuid); + + /* Check if service is already on list then return NULL to skip it */ + service = queue_find(client->services, match_service_handle, + UINT_TO_PTR(start_handle)); + if (service) + return NULL; service = new0(struct service, 1); service->chrcs = queue_new(); @@ -2146,14 +2167,6 @@ static void export_service(struct gatt_db_attribute *attr, void *user_data) queue_push_tail(client->services, service); } -static bool match_service_handle(const void *a, const void *b) -{ - const struct service *service = a; - uint16_t start_handle = PTR_TO_UINT(b); - - return service->start_handle == start_handle; -} - struct update_incl_data { struct service *service; bool changed; -- 2.48.1