Add the LE discovery timeout function 32/99232/1
authorLee Hyuk <hyuk0512.lee@samsung.com>
Tue, 22 Nov 2016 07:53:55 +0000 (16:53 +0900)
committerLee Hyuk <hyuk0512.lee@samsung.com>
Tue, 22 Nov 2016 07:53:55 +0000 (16:53 +0900)
Change-Id: I64650314c506845775a78c918a2f31ff478275aa
Signed-off-by: Lee Hyuk <hyuk0512.lee@samsung.com>
src/adapter.c

index f80948f..37297ed 100644 (file)
@@ -284,6 +284,9 @@ struct btd_adapter {
 
        GSList *discovery_found;        /* list of found devices */
        guint discovery_idle_timeout;   /* timeout between discovery runs */
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+       guint le_discovery_idle_timeout;        /* timeout between le discovery runs */
+#endif
        guint passive_scan_timeout;     /* timeout between passive scans */
        guint temp_devices_timeout;     /* timeout for temporary devices */
 
@@ -1969,6 +1972,47 @@ static void start_le_discovery_complete(uint8_t status, uint16_t length,
 }
 #endif
 
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+static gboolean start_le_discovery_timeout(gpointer user_data)
+{
+       struct btd_adapter *adapter = user_data;
+       uint8_t new_type;
+
+       DBG("");
+
+       adapter->discovery_idle_timeout = 0;
+
+       new_type = SCAN_TYPE_LE;
+
+       if (adapter->discovery_enable == 0x01) {
+               /*
+                * If there is an already running discovery and it has the
+                * same type, then just keep it.
+                */
+
+               if ((adapter->discovery_type & new_type) == SCAN_TYPE_LE) {
+                       if (adapter->le_discovering)
+                               return FALSE;
+
+                       adapter->le_discovering = true;
+                       g_dbus_emit_property_changed(dbus_conn, adapter->path,
+                                       ADAPTER_INTERFACE, "LEDiscovering");
+
+                       return FALSE;
+               }
+       }
+
+       struct mgmt_cp_start_discovery cp;
+
+       cp.type = new_type;
+       mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
+                       adapter->dev_id, sizeof(cp), &cp,
+                       start_le_discovery_complete, adapter, NULL);
+
+       return FALSE;
+}
+#endif
+
 static gboolean start_discovery_timeout(gpointer user_data)
 {
        struct btd_adapter *adapter = user_data;
@@ -1982,60 +2026,31 @@ static gboolean start_discovery_timeout(gpointer user_data)
        adapter->discovery_idle_timeout = 0;
 
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-       if (adapter->disc_type == BT_DISC_TYPE_BREDR_ONLY)
-               new_type = SCAN_TYPE_BREDR;
-       else if (adapter->disc_type == BT_DISC_TYPE_LE_ONLY)
-               new_type = SCAN_TYPE_LE;
-       else if (adapter->disc_type == BT_DISC_TYPE_LE_BREDR)
-               new_type = SCAN_TYPE_DUAL;
-       else
-               new_type = 0;
+       new_type = SCAN_TYPE_BREDR;
 
        if (adapter->discovery_enable == 0x01) {
                /*
                 * If there is an already running discovery and it has the
                 * same type, then just keep it.
                 */
-               if (adapter->disc_type == BT_DISC_TYPE_BREDR_ONLY) {
-                       if ((adapter->discovery_type & new_type) == SCAN_TYPE_BREDR) {
-                               if (adapter->discovering)
-                                       return FALSE;
-
-                               adapter->discovering = true;
-                               g_dbus_emit_property_changed(dbus_conn, adapter->path,
-                                               ADAPTER_INTERFACE, "Discovering");
-
+               if ((adapter->discovery_type & new_type) == SCAN_TYPE_BREDR) {
+                       if (adapter->discovering)
                                return FALSE;
-                       }
-
-               }  else if (adapter->disc_type == BT_DISC_TYPE_LE_ONLY) {
-                       if ((adapter->discovery_type & new_type) == SCAN_TYPE_LE) {
-                               if (adapter->le_discovering)
-                                       return FALSE;
 
-                               adapter->le_discovering = true;
-                               g_dbus_emit_property_changed(dbus_conn, adapter->path,
-                                               ADAPTER_INTERFACE, "LEDiscovering");
+                       adapter->discovering = true;
+                       g_dbus_emit_property_changed(dbus_conn, adapter->path,
+                                       ADAPTER_INTERFACE, "Discovering");
 
-                               return FALSE;
-                       }
+                       return FALSE;
                }
        }
 
-       DBG("adapter->disc_type [%d]", adapter->disc_type);
        struct mgmt_cp_start_discovery cp;
-       if (adapter->disc_type == BT_DISC_TYPE_BREDR_ONLY) {
-               cp.type = new_type;
-               mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
-                                       adapter->dev_id, sizeof(cp), &cp,
-                                       start_discovery_complete, adapter, NULL);
+       cp.type = new_type;
+       mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
+                               adapter->dev_id, sizeof(cp), &cp,
+                               start_discovery_complete, adapter, NULL);
 
-       } else if (adapter->disc_type == BT_DISC_TYPE_LE_ONLY) {
-               cp.type = new_type;
-               mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
-                                       adapter->dev_id, sizeof(cp), &cp,
-                                       start_le_discovery_complete, adapter, NULL);
-       }
 #else
        /* If we're doing filtered discovery, it must be quickly restarted */
        adapter->no_scan_restart_delay = !!adapter->current_discovery_filter;
@@ -2113,6 +2128,33 @@ static gboolean start_discovery_timeout(gpointer user_data)
        return FALSE;
 }
 
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+static void trigger_start_le_discovery(struct btd_adapter *adapter, guint delay)
+{
+
+       DBG("");
+
+       cancel_passive_scanning(adapter);
+
+       if (adapter->le_discovery_idle_timeout > 0) {
+               g_source_remove(adapter->le_discovery_idle_timeout);
+               adapter->le_discovery_idle_timeout = 0;
+       }
+
+       /*
+        * If the controller got powered down in between, then ensure
+        * that we do not keep trying to restart discovery.
+        *
+        * This is safe-guard and should actually never trigger.
+        */
+       if (!(adapter->current_settings & MGMT_SETTING_POWERED))
+               return;
+
+       adapter->le_discovery_idle_timeout = g_timeout_add_seconds(delay,
+                                       start_le_discovery_timeout, adapter);
+}
+#endif
+
 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay)
 {
 
@@ -2655,7 +2697,7 @@ static void discovery_destroy(void *user_data)
        if (adapter->discovery_list)
                return;
 
-#ifdef __TIZEN_PATCH__
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
        hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
 #else
        adapter->discovery_type = 0x00;
@@ -3975,7 +4017,7 @@ static DBusMessage *adapter_start_le_discovery(DBusConnection *conn,
         * discovery in idle phase exists, it will be restarted right
         * away.
         */
-       trigger_start_discovery(adapter, 0);
+       trigger_start_le_discovery(adapter, 0);
 
        return dbus_message_new_method_return(msg);
 }