From 727cf85d5c710193df9b386b2a87afccbbc766ff Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 12 Aug 2016 11:20:10 +0300 Subject: [PATCH 2/7] core/device: Fix not connecting services properly Device.Connect shall check if the service discovery is pending or no service have been connected yet before switching to LE otherwise these services may never be connected. --- src/device.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/device.c b/src/device.c index 7f40af44cd01..460a9980fc63 100644 --- a/src/device.c +++ b/src/device.c @@ -1779,9 +1779,18 @@ static DBusMessage *dev_connect(DBusConnection *conn, DBusMessage *msg, struct btd_device *dev = user_data; uint8_t bdaddr_type; - if (dev->bredr_state.connected) - bdaddr_type = dev->bdaddr_type; - else if (dev->le_state.connected && dev->bredr) + if (dev->bredr_state.connected) { + /* + * Check if services have been resolved and there is at list + * one connected before switching to connect LE. + */ + if (dev->bredr_state.svc_resolved && + find_service_with_state(dev->services, + BTD_SERVICE_STATE_CONNECTED)) + bdaddr_type = dev->bdaddr_type; + else + bdaddr_type = BDADDR_BREDR; + } else if (dev->le_state.connected && dev->bredr) bdaddr_type = BDADDR_BREDR; else bdaddr_type = select_conn_bearer(dev);