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");
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,