diff mbox series

[BlueZ] device: Fix airpods pairing

Message ID 20240405090050.1477187-1-frederic.danis@collabora.com
State New
Headers show
Series [BlueZ] device: Fix airpods pairing | expand

Commit Message

Frédéric Danis April 5, 2024, 9 a.m. UTC
Apple Airpods are discoverable and pairable in BREDR mode, but also
advertise in unconnectable mode in LE with the same Public address, at the
same time. As the pairing process uses the latest seen address, sometimes
it uses the LE Public address to pair, which fails.

This commit introduces the connectable state when selecting the bearer to
use for a connection. The last_seen value is used only for connectable
devices.
---
 src/device.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

bluez.test.bot@gmail.com April 5, 2024, 10:36 a.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=841718

---Test result---

Test Summary:
CheckPatch                    PASS      1.48 seconds
GitLint                       PASS      0.31 seconds
BuildEll                      PASS      24.53 seconds
BluezMake                     PASS      1617.20 seconds
MakeCheck                     PASS      12.91 seconds
MakeDistcheck                 PASS      176.72 seconds
CheckValgrind                 PASS      245.82 seconds
CheckSmatch                   PASS      349.97 seconds
bluezmakeextell               PASS      119.24 seconds
IncrementalBuild              PASS      1390.81 seconds
ScanBuild                     PASS      990.97 seconds



---
Regards,
Linux Bluetooth
diff mbox series

Patch

diff --git a/src/device.c b/src/device.c
index ac0b0e003..1d4b8ab36 100644
--- a/src/device.c
+++ b/src/device.c
@@ -2537,13 +2537,13 @@  static uint8_t select_conn_bearer(struct btd_device *dev)
 	if (dev->bdaddr_type == BDADDR_LE_RANDOM)
 		return dev->bdaddr_type;
 
-	if (dev->bredr_state.last_seen) {
+	if (dev->bredr_state.connectable && dev->bredr_state.last_seen) {
 		bredr_last = current - dev->bredr_state.last_seen;
 		if (bredr_last > SEEN_TRESHHOLD)
 			bredr_last = NVAL_TIME;
 	}
 
-	if (dev->le_state.last_seen) {
+	if (dev->le_state.connectable && dev->le_state.last_seen) {
 		le_last = current - dev->le_state.last_seen;
 		if (le_last > SEEN_TRESHHOLD)
 			le_last = NVAL_TIME;