Skip to content

Commit

Permalink
device: wait GATT client ready before service accept() if no cache
Browse files Browse the repository at this point in the history
On device ATT attach, do not immediately call accept() for profiles, if
there is no cached data in GATT database. Instead, wait for service
resolution to complete, as likely accept() cannot succeed before that.

Several profiles (bap, vcp, midi, deviceinfo) assume that GATT
attributes are available when their accept() is called, returning
success even if not.  In this case, the services never find the remote
attributes and are not operable.  Other profiles (hog, batt, ...) fail
their accept which prompts core to retry after discovery, and work
correctly also in this case.

Fix the failing services by waiting for service resolution as necessary,
so profiles can assume the GATT DB has some content.
  • Loading branch information
pv authored and Vudentz committed Feb 23, 2023
1 parent 1106b28 commit 46a5d2b
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions src/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -5155,10 +5155,11 @@ static void gatt_client_init(struct btd_device *device)
g_attrib_attach_client(device->attrib, device->client);

/*
* Notify notify existing service about the new connection so they can
* react to notifications while discovering services
* If we have cache, notify existing service about the new connection
* so they can react to notifications while discovering services
*/
device_accept_gatt_profiles(device);
if (!gatt_db_isempty(device->db))
device_accept_gatt_profiles(device);

device->gatt_ready_id = bt_gatt_client_ready_register(device->client,
gatt_client_ready_cb,
Expand Down

0 comments on commit 46a5d2b

Please sign in to comment.