diff mbox series

[BlueZ] device: wait GATT client ready before service accept() if no cache

Message ID 6387d20af8252ea1198c81afe728a9f67cd6bf77.1677179059.git.pav@iki.fi (mailing list archive)
State Accepted
Commit 46a5d2beccb2ea73f28502950f52032cf4811d37
Headers show
Series [BlueZ] device: wait GATT client ready before service accept() if no cache | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
tedd_an/CheckPatch success CheckPatch PASS
tedd_an/GitLint fail WARNING: I3 - ignore-body-lines: gitlint will be switching from using Python regex 'match' (match beginning) to 'search' (match anywhere) semantics. Please review your ignore-body-lines.regex option accordingly. To remove this warning, set general.regex-style-search=True. More details: https://jorisroovers.github.io/gitlint/configuration/#regex-style-search 21: B2 Line has trailing whitespace: " "
tedd_an/BuildEll success Build ELL PASS
tedd_an/BluezMake success Bluez Make PASS
tedd_an/MakeCheck success Bluez Make Check PASS
tedd_an/MakeDistcheck success Make Distcheck PASS
tedd_an/CheckValgrind success Check Valgrind PASS
tedd_an/CheckSmatch success CheckSparse PASS
tedd_an/bluezmakeextell success Make External ELL PASS
tedd_an/IncrementalBuild success Incremental Build PASS
tedd_an/ScanBuild success Scan Build PASS

Commit Message

Pauli Virtanen Feb. 23, 2023, 7:14 p.m. UTC
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(-)

Comments

bluez.test.bot@gmail.com Feb. 23, 2023, 8:40 p.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=724435

---Test result---

Test Summary:
CheckPatch                    PASS      0.49 seconds
GitLint                       FAIL      0.59 seconds
BuildEll                      PASS      26.78 seconds
BluezMake                     PASS      970.99 seconds
MakeCheck                     PASS      11.77 seconds
MakeDistcheck                 PASS      151.46 seconds
CheckValgrind                 PASS      245.01 seconds
CheckSmatch                   PASS      328.16 seconds
bluezmakeextell               PASS      98.01 seconds
IncrementalBuild              PASS      875.90 seconds
ScanBuild                     PASS      1023.96 seconds

Details
##############################
Test: GitLint - FAIL
Desc: Run gitlint
Output:
[BlueZ] device: wait GATT client ready before service accept() if no cache

WARNING: I3 - ignore-body-lines: gitlint will be switching from using Python regex 'match' (match beginning) to 'search' (match anywhere) semantics. Please review your ignore-body-lines.regex option accordingly. To remove this warning, set general.regex-style-search=True. More details: https://jorisroovers.github.io/gitlint/configuration/#regex-style-search
21: B2 Line has trailing whitespace: "    "


---
Regards,
Linux Bluetooth
patchwork-bot+bluetooth@kernel.org Feb. 23, 2023, 9:10 p.m. UTC | #2
Hello:

This patch was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:

On Thu, 23 Feb 2023 19:14:44 +0000 you wrote:
> 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.
> 
> [...]

Here is the summary with links:
  - [BlueZ] device: wait GATT client ready before service accept() if no cache
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=46a5d2beccb2

You are awesome, thank you!
diff mbox series

Patch

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,