static int adv_start()

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;
}