Refactor the broadcaster multiple sample so that it can be reused as bsim test to verify Extended advertisement chaining. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
114 lines
3.3 KiB
C
114 lines
3.3 KiB
C
/*
|
|
* Copyright (c) 2022 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/sys/printk.h>
|
|
#include <zephyr/bluetooth/bluetooth.h>
|
|
|
|
/* Maximum supported AD data length, use a value supported by the Controller,
|
|
* Bluetooth Core Specification define minimum of 31 bytes will be supported by
|
|
* all Controllers, can be a maximum of 1650 bytes when supported.
|
|
*/
|
|
#if defined(CONFIG_BT_CTLR_ADV_DATA_LEN_MAX)
|
|
#define BT_AD_DATA_LEN_MAX CONFIG_BT_CTLR_ADV_DATA_LEN_MAX
|
|
#else
|
|
#define BT_AD_DATA_LEN_MAX 31U
|
|
#endif
|
|
|
|
/* Size of AD data format length field in octets */
|
|
#define BT_AD_DATA_FORMAT_LEN_SIZE 1U
|
|
|
|
/* Size of AD data format type field in octets */
|
|
#define BT_AD_DATA_FORMAT_TYPE_SIZE 1U
|
|
|
|
/* Maximum value of AD data format length field (8-bit) */
|
|
#define BT_AD_DATA_FORMAT_LEN_MAX 255U
|
|
|
|
/* Device name length, size minus one null character */
|
|
#define BT_DEVICE_NAME_LEN (sizeof(CONFIG_BT_DEVICE_NAME) - 1U)
|
|
|
|
/* Device name length in AD data format, 2 bytes for length and type overhead */
|
|
#define BT_DEVICE_NAME_AD_DATA_LEN (BT_AD_DATA_FORMAT_LEN_SIZE + \
|
|
BT_AD_DATA_FORMAT_TYPE_SIZE + \
|
|
BT_DEVICE_NAME_LEN)
|
|
|
|
/* Maximum manufacturer data length, considering ad data format overhead and
|
|
* the included device name in ad data format.
|
|
*/
|
|
#define BT_MFG_DATA_LEN_MAX (MIN((BT_AD_DATA_FORMAT_LEN_MAX - \
|
|
BT_AD_DATA_FORMAT_TYPE_SIZE), \
|
|
(BT_AD_DATA_LEN_MAX - \
|
|
BT_AD_DATA_FORMAT_LEN_SIZE - \
|
|
BT_AD_DATA_FORMAT_TYPE_SIZE)))
|
|
#define BT_MFG_DATA_LEN (MIN(BT_MFG_DATA_LEN_MAX, \
|
|
(BT_AD_DATA_LEN_MAX - \
|
|
BT_AD_DATA_FORMAT_LEN_SIZE - \
|
|
BT_AD_DATA_FORMAT_TYPE_SIZE - \
|
|
BT_DEVICE_NAME_AD_DATA_LEN)))
|
|
|
|
static uint8_t mfg_data[BT_MFG_DATA_LEN] = { 0xFF, 0xFF, };
|
|
|
|
static const struct bt_data ad[] = {
|
|
BT_DATA(BT_DATA_MANUFACTURER_DATA, mfg_data, sizeof(mfg_data)),
|
|
};
|
|
|
|
static struct bt_le_ext_adv *adv[CONFIG_BT_EXT_ADV_MAX_ADV_SET];
|
|
|
|
int broadcaster_multiple(void)
|
|
{
|
|
struct bt_le_adv_param adv_param = {
|
|
.id = BT_ID_DEFAULT,
|
|
.sid = 0U, /* Supply unique SID when creating advertising set */
|
|
.secondary_max_skip = 0U,
|
|
.options = (BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_USE_NAME),
|
|
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2,
|
|
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2,
|
|
.peer = NULL,
|
|
};
|
|
int err;
|
|
|
|
/* Initialize the Bluetooth Subsystem */
|
|
err = bt_enable(NULL);
|
|
if (err) {
|
|
printk("Bluetooth init failed (err %d)\n", err);
|
|
return err;
|
|
}
|
|
|
|
for (int index = 0; index < CONFIG_BT_EXT_ADV_MAX_ADV_SET; index++) {
|
|
/* Use advertising set instance index as SID */
|
|
adv_param.sid = index;
|
|
|
|
/* Create a non-connectable non-scannable advertising set */
|
|
err = bt_le_ext_adv_create(&adv_param, NULL, &adv[index]);
|
|
if (err) {
|
|
printk("Failed to create advertising set %d (err %d)\n",
|
|
index, err);
|
|
return err;
|
|
}
|
|
|
|
/* Set extended advertising data */
|
|
err = bt_le_ext_adv_set_data(adv[index], ad, ARRAY_SIZE(ad),
|
|
NULL, 0);
|
|
if (err) {
|
|
printk("Failed to set advertising data for set %d "
|
|
"(err %d)\n", index, err);
|
|
return err;
|
|
}
|
|
|
|
/* Start extended advertising set */
|
|
err = bt_le_ext_adv_start(adv[index],
|
|
BT_LE_EXT_ADV_START_DEFAULT);
|
|
if (err) {
|
|
printk("Failed to start extended advertising set %d "
|
|
"(err %d)\n", index, err);
|
|
return err;
|
|
}
|
|
|
|
printk("Started Extended Advertising Set %d.\n", index);
|
|
}
|
|
|
|
return 0;
|
|
}
|