From f179ff75b79376a45aaf87acffc38ef0dc05801a Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 19 Jan 2013 23:56:41 -0800 Subject: [PATCH] core: Allow passive scanning to update existing devices During the passive scan, do not create new devices or update temporary ones. However update of existing paired devices is desired. --- src/adapter.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index a6364e2cc..c9cc47646 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -3961,14 +3961,7 @@ static void update_found_devices(struct btd_adapter *adapter, struct eir_data eir_data; char addr[18]; int err; - GSList *l; - - /* - * If no client has requested discovery, then also do not send - * out signals for new devices. - */ - if (!adapter->discovery_list) - return; + GSList *list; memset(&eir_data, 0, sizeof(eir_data)); err = eir_parse(&eir_data, data, data_len); @@ -3990,12 +3983,20 @@ static void update_found_devices(struct btd_adapter *adapter, ba2str(bdaddr, addr); - l = g_slist_find_custom(adapter->devices, bdaddr, - (GCompareFunc) device_bdaddr_cmp); - if (l) - dev = l->data; - else + list = g_slist_find_custom(adapter->devices, bdaddr, device_bdaddr_cmp); + if (!list) { + /* + * If no client has requested discovery, then do not + * create new device objects. + */ + if (!adapter->discovery_list) { + eir_data_free(&eir_data); + return; + } + dev = adapter_create_device(adapter, addr, bdaddr_type); + } else + dev = list->data; if (!dev) { error("Unable to create object for found device %s", addr); @@ -4003,6 +4004,15 @@ static void update_found_devices(struct btd_adapter *adapter, return; } + /* + * If no client has requested discovery, then only update + * already paired devices (skip temporary ones). + */ + if (device_is_temporary(dev) && !adapter->discovery_list) { + eir_data_free(&eir_data); + return; + } + device_set_legacy(dev, legacy); device_set_rssi(dev, rssi); @@ -4019,6 +4029,13 @@ static void update_found_devices(struct btd_adapter *adapter, eir_data_free(&eir_data); + /* + * Only if at least one client has requested discovery, maintain + * list of found devices and name confirming for legacy devices. + */ + if (!adapter->discovery_list) + return; + if (g_slist_find(adapter->discovery_found, dev)) return; -- 2.47.3