From 274e37d677023c9526cb08f74c0909de718e36c5 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Thu, 20 Mar 2014 16:08:36 +0200 Subject: [PATCH] core: Ignore ATT errors when considering Pair() success Occasionally there may be errors in completing the service discovery process over ATT when pairing with an LE device. Since we will any way pick up from where we left off the next time we get connected it should be safe to return success for the Pair() method call as long as the actual pairing part was successful. --- src/device.c | 53 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/src/device.c b/src/device.c index 67c4e6d98..601dfdc26 100644 --- a/src/device.c +++ b/src/device.c @@ -3352,6 +3352,36 @@ static int service_by_range_cmp(gconstpointer a, gconstpointer b) return memcmp(&prim->range, range, sizeof(*range)); } +static void send_le_browse_response(struct browse_req *req) +{ + struct btd_device *dev = req->device; + struct bearer_state *state = &dev->le_state; + DBusMessage *reply, *msg = req->msg; + + if (!msg) + return; + + if (!dbus_message_is_method_call(msg, DEVICE_INTERFACE, "Pair")) { + reply = btd_error_failed(msg, "Service discovery failed"); + g_dbus_send_message(dbus_conn, reply); + return; + } + + if (!state->paired) { + reply = btd_error_failed(msg, "Not paired"); + g_dbus_send_message(dbus_conn, reply); + return; + } + + if (!dev->bredr_state.paired && dev->pending_paired) { + g_dbus_emit_property_changed(dbus_conn, dev->path, + DEVICE_INTERFACE, "Paired"); + dev->pending_paired = false; + } + + g_dbus_send_reply(dbus_conn, msg, DBUS_TYPE_INVALID); +} + static void find_included_cb(uint8_t status, GSList *includes, void *user_data) { struct included_search *search = user_data; @@ -3373,12 +3403,7 @@ static void find_included_cb(uint8_t status, GSList *includes, void *user_data) if (!req) goto complete; - if (req->msg) { - DBusMessage *reply; - reply = btd_error_failed(req->msg, "Disconnected"); - g_dbus_send_message(dbus_conn, reply); - } - + send_le_browse_response(req); device->browse = NULL; browse_request_free(req); @@ -3466,13 +3491,7 @@ static void primary_cb(uint8_t status, GSList *services, void *user_data) if (status) { struct btd_device *device = req->device; - if (req->msg) { - DBusMessage *reply; - reply = btd_error_failed(req->msg, - att_ecode2str(status)); - g_dbus_send_message(dbus_conn, reply); - } - + send_le_browse_response(req); device->browse = NULL; browse_request_free(req); return; @@ -3669,13 +3688,7 @@ static void att_browse_error_cb(const GError *gerr, gpointer user_data) struct btd_device *device = attcb->user_data; struct browse_req *req = device->browse; - if (req->msg) { - DBusMessage *reply; - - reply = btd_error_failed(req->msg, gerr->message); - g_dbus_send_message(dbus_conn, reply); - } - + send_le_browse_response(req); device->browse = NULL; browse_request_free(req); } -- 2.47.3