Restart vsc advertising after 300 ms 62/213762/1
authorinjun.yang <injun.yang@samsung.com>
Wed, 11 Sep 2019 06:02:55 +0000 (15:02 +0900)
committerinjun.yang <injun.yang@samsung.com>
Wed, 11 Sep 2019 06:02:55 +0000 (15:02 +0900)
Change-Id: I4399f413a771a23235564d94568c92026a08b709
Signed-off-by: injun.yang <injun.yang@samsung.com>
src/adapter.c

index 3ee29cc..8e9da5f 100644 (file)
@@ -11924,11 +11924,31 @@ static void device_name_update_callback(uint16_t index, uint16_t length,
        eir_data_free(&eir_data);
 }
 
+struct multi_adv_data {
+       struct btd_adapter *adapter;
+       uint8_t slot_id;
+};
+
+static gboolean multi_adv_start_timeout_cb(gpointer user_data)
+{
+       struct multi_adv_data *data = user_data;
+       struct btd_adapter *adapter = data->adapter;
+       dbus_bool_t err;
+
+       err = adapter_le_enable_multi_adv(adapter, TRUE, data->slot_id);
+       if (!err)
+               advertising_state_changed(adapter, data->slot_id, FALSE);
+
+       g_free(data);
+       return FALSE;
+}
+
 static void multi_adv_state_change_callback(uint16_t index, uint16_t length,
                                        const void *param, void *user_data)
 {
        const struct mgmt_ev_vendor_specific_multi_adv_state_changed *ev = param;
        struct btd_adapter *adapter = user_data;
+       struct multi_adv_data *data;
 
        if (length < sizeof(*ev)) {
                error("Too small adv state change event");
@@ -11939,8 +11959,15 @@ static void multi_adv_state_change_callback(uint16_t index, uint16_t length,
                ev->adv_instance, ev->state_change_reason, ev->connection_handle);
 
        if ((ev->adv_instance > 0 && ev->adv_instance < adapter_le_get_max_adv_instance()) &&
-                       ev->state_change_reason == 0)
-               adapter_le_enable_multi_adv(adapter, TRUE, ev->adv_instance);
+                       ev->state_change_reason == 0) {
+               /* advertising is stopped by controller, it should be enabled again.
+               * If fails, state should be changed to FALSE */
+               data = g_new0(struct multi_adv_data, 1);
+               data->adapter = adapter;
+               data->slot_id = ev->adv_instance;
+
+               g_timeout_add(300, multi_adv_start_timeout_cb, data);
+       }
 }
 
 static void le_conn_update_completed_callback(uint16_t index, uint16_t length,