Diff between 778e182c6438962ff641e66b1a867aa16bd27414 and 25dc0c5026442edee1ef0b987aca723ea3b593fb

Changed Files

File Additions Deletions Status
src/adapter.c +13 -0 modified
src/adapter.h +2 -0 modified
src/device.c +1 -1 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index 21c1bb6..606affd 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -7450,3 +7450,16 @@ void adapter_shutdown(void)
 	if (!adapter_remaining)
 		btd_exit();
 }
+
+/*
+ * Check if workaround for broken ATT server socket behavior is needed
+ * where we need to connect an ATT client socket before pairing to get
+ * early access to the ATT channel.
+ */
+bool btd_le_connect_before_pairing(void)
+{
+	if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 4))
+		return true;
+
+	return false;
+}
diff --git a/src/adapter.h b/src/adapter.h
index 8f4098a..737479f 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -225,3 +225,5 @@ gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter);
 void btd_adapter_for_each_device(struct btd_adapter *adapter,
 			void (*cb)(struct btd_device *device, void *data),
 			void *data);
+
+bool btd_le_connect_before_pairing(void);
diff --git a/src/device.c b/src/device.c
index 1499d1b..025743f 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1815,7 +1815,7 @@ static DBusMessage *pair_device(DBusConnection *conn, DBusMessage *msg,
 	 * this in the ATT connect callback)
 	 */
 	if (bdaddr_type != BDADDR_BREDR) {
-		if (!state->connected)
+		if (!state->connected && btd_le_connect_before_pairing())
 			err = device_connect_le(device);
 		else
 			err = adapter_create_bonding(adapter, &device->bdaddr,