From a5ee41a24f65e53f4398b90a5cb8cb819843860b Mon Sep 17 00:00:00 2001 From: Lukasz Rymanowski Date: Mon, 10 Mar 2014 00:06:36 +0100 Subject: [PATCH] android: Cancel all pending confirm name before stop discovery If user wants to cancel discovery we should remove all the confirm name requests from mgmt queues. It is in order to make sure that stop discovery have a free way to reach kernel. This improves scenario when there is a big inflow of device found events and mgmt queues become full of confirm name requests. In such case stop discovery might stack in the queue. --- android/bluetooth.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/android/bluetooth.c b/android/bluetooth.c index aee0c5638..041f922b4 100644 --- a/android/bluetooth.c +++ b/android/bluetooth.c @@ -2470,6 +2470,14 @@ static bool start_discovery(void) return false; } +static void cancel_pending_confirm_name(gpointer data, gpointer user_data) +{ + struct device *dev = data; + + mgmt_cancel(mgmt_if, dev->confirm_id); + dev->confirm_id = 0; +} + static bool stop_discovery(void) { struct mgmt_cp_stop_discovery cp; @@ -2484,6 +2492,9 @@ static bool stop_discovery(void) DBG("type=0x%x", cp.type); + /* Lets drop all confirm name request as we don't need it anymore */ + g_slist_foreach(cached_devices, cancel_pending_confirm_name, NULL); + if (mgmt_send(mgmt_if, MGMT_OP_STOP_DISCOVERY, adapter.index, sizeof(cp), &cp, NULL, NULL, NULL) > 0) return true; -- 2.47.3