in nimble/host/mesh/src/adv_ext.c [115:194]
static int adv_start(const struct ble_gap_ext_adv_params *param,
uint32_t timeout,
const struct bt_data *ad, size_t ad_len,
const struct bt_data *sd, size_t sd_len)
{
int err;
struct os_mbuf *ad_data;
struct os_mbuf *sd_data;
ad_data = os_msys_get_pkthdr(BLE_HS_ADV_MAX_SZ, 0);
assert(ad_data);
sd_data = os_msys_get_pkthdr(BLE_HS_ADV_MAX_SZ, 0);
assert(sd_data);
if (!adv.instance) {
BT_ERR("Mesh advertiser not enabled");
err = -ENODEV;
goto error;
}
if (atomic_test_and_set_bit(adv.flags, ADV_FLAG_ACTIVE)) {
BT_ERR("Advertiser is busy");
err = -EBUSY;
goto error;
}
if (atomic_test_bit(adv.flags, ADV_FLAG_UPDATE_PARAMS)) {
err = ble_gap_ext_adv_configure(BT_ID_DEFAULT, param, NULL,
ble_mesh_ext_adv_event_handler, NULL);
if (err) {
BT_ERR("Failed updating adv params: %d", err);
atomic_clear_bit(adv.flags, ADV_FLAG_ACTIVE);
goto error;
}
atomic_set_bit_to(adv.flags, ADV_FLAG_UPDATE_PARAMS,
param != &adv_param);
}
assert(ad_data);
err = os_mbuf_append(ad_data, ad, ad_len);
if (err) {
goto error;
}
err = ble_gap_ext_adv_set_data(BT_ID_DEFAULT, ad_data);
if (err) {
BT_ERR("Failed setting adv data: %d", err);
atomic_clear_bit(adv.flags, ADV_FLAG_ACTIVE);
goto error;
}
err = os_mbuf_append(sd_data, sd, sd_len);
if (err) {
goto error;
}
err = ble_gap_ext_adv_rsp_set_data(BT_ID_DEFAULT, sd_data);
if (err) {
BT_ERR("Failed setting scan response data: %d", err);
atomic_clear_bit(adv.flags, ADV_FLAG_ACTIVE);
goto error;
}
adv.timestamp = k_uptime_get();
err = ble_gap_ext_adv_start(BT_ID_DEFAULT, timeout, 0);
if (err) {
BT_ERR("Advertising failed: err %d", err);
atomic_clear_bit(adv.flags, ADV_FLAG_ACTIVE);
}
error:
if (ad_data) {
os_mbuf_free_chain(ad_data);
}
if (sd_data) {
os_mbuf_free_chain(sd_data);
}
return err;
}