All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH BlueZ] device: wait GATT client ready before service accept() if no cache
@ 2023-02-23 19:14 Pauli Virtanen
  2023-02-23 20:40 ` [BlueZ] " bluez.test.bot
  2023-02-23 21:10 ` [PATCH BlueZ] " patchwork-bot+bluetooth
  0 siblings, 2 replies; 3+ messages in thread
From: Pauli Virtanen @ 2023-02-23 19:14 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Pauli Virtanen

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.
---

Notes:
    This fixes the issue with BAP client being broken when there is no GATT
    cache.
    
    On my setup, btd_settings_gatt_db_load often fails with EIO, even though
    the files are there. Apparently, in some cases the saved cache data is
    not loadable, need to figure out later why it happens.

 src/device.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/device.c b/src/device.c
index 28b93eb9a..d270421cc 100644
--- a/src/device.c
+++ b/src/device.c
@@ -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,
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-02-23 21:11 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-23 19:14 [PATCH BlueZ] device: wait GATT client ready before service accept() if no cache Pauli Virtanen
2023-02-23 20:40 ` [BlueZ] " bluez.test.bot
2023-02-23 21:10 ` [PATCH BlueZ] " patchwork-bot+bluetooth

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.