blob: e67d3bb6fe8ecce45072c56cbf68499a19444e17 [file] [log] [blame]
/* Copyright (c) 2023 Nordic Semiconductor ASA
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdint.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/l2cap.h>
#include <zephyr/bluetooth/uuid.h>
#include <zephyr/kernel.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/__assert.h>
struct bt_testlib_adv_ctx {
struct bt_conn **result;
struct k_condvar done;
};
/* Context pool (with capacity of one). */
static K_SEM_DEFINE(g_ctx_free, 1, 1);
static K_MUTEX_DEFINE(g_ctx_lock);
static struct bt_testlib_adv_ctx *g_ctx;
static void connected_cb(struct bt_le_ext_adv *adv, struct bt_le_ext_adv_connected_info *info)
{
k_mutex_lock(&g_ctx_lock, K_FOREVER);
if (g_ctx->result) {
*g_ctx->result = bt_conn_ref(info->conn);
}
k_condvar_signal(&g_ctx->done);
k_mutex_unlock(&g_ctx_lock);
}
int bt_testlib_adv_conn(struct bt_conn **conn, int id, uint32_t adv_options)
{
int api_err;
struct bt_le_ext_adv *adv = NULL;
struct bt_le_adv_param param = {};
struct bt_testlib_adv_ctx ctx = {
.result = conn,
};
static const struct bt_le_ext_adv_cb cb = {
.connected = connected_cb,
};
param.id = id;
param.interval_min = BT_GAP_ADV_FAST_INT_MIN_1;
param.interval_max = BT_GAP_ADV_FAST_INT_MAX_1;
param.options |= BT_LE_ADV_OPT_CONNECTABLE;
param.options |= adv_options;
k_condvar_init(&ctx.done);
k_sem_take(&g_ctx_free, K_FOREVER);
k_mutex_lock(&g_ctx_lock, K_FOREVER);
g_ctx = &ctx;
api_err = bt_le_ext_adv_create(&param, &cb, &adv);
if (!api_err) {
api_err = bt_le_ext_adv_start(adv, BT_LE_EXT_ADV_START_DEFAULT);
}
if (!api_err) {
k_condvar_wait(&ctx.done, &g_ctx_lock, K_FOREVER);
}
/* Delete adv before giving semaphore so that it's potentially available
* for the next taker of the semaphore.
*/
if (adv) {
bt_le_ext_adv_delete(adv);
}
g_ctx = NULL;
k_mutex_unlock(&g_ctx_lock);
k_sem_give(&g_ctx_free);
return api_err;
}