Bluetooth: host: Add functions for periodic adv sync objects

Adds two functions:
1) Lookup periodic adv sync object by address
2) Get information about a periodic adv sync object.

These can be useful for the application verify if there is already an
existing sync to an periodic advertiser.

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
This commit is contained in:
Emil Gydesen 2021-03-24 15:53:04 +01:00 committed by Carles Cufí
commit 5a1afaa47a
2 changed files with 72 additions and 0 deletions

View file

@ -1290,6 +1290,43 @@ struct bt_le_per_adv_sync_param {
*/
uint8_t bt_le_per_adv_sync_get_index(struct bt_le_per_adv_sync *per_adv_sync);
/** @brief Advertising set info structure. */
struct bt_le_per_adv_sync_info {
/** Periodic Advertiser Address */
bt_addr_le_t addr;
/** Advertiser SID */
uint8_t sid;
/** Periodic advertising interval (N * 1.25 ms) */
uint16_t interval;
/** Advertiser PHY */
uint8_t phy;
};
/**
* @brief Get periodic adv sync information.
*
* @param per_adv_sync Periodic advertising sync object.
* @param info Periodic advertising sync info object
*
* @return Zero on success or (negative) error code on failure.
*/
int bt_le_per_adv_sync_get_info(struct bt_le_per_adv_sync *per_adv_sync,
struct bt_le_per_adv_sync_info *info);
/**
* @brief Look up an existing periodic advertising sync object by advertiser address.
*
* @param adv_addr Advertiser address.
* @param sid The advertising set ID.
*
* @return Periodic advertising sync object or NULL if not found.
*/
struct bt_le_per_adv_sync *bt_le_per_adv_sync_lookup_addr(const bt_addr_le_t *adv_addr,
uint8_t sid);
/**
* @brief Create a periodic advertising sync object.
*

View file

@ -7,6 +7,7 @@
#include <sys/types.h>
#include <sys/byteorder.h>
#include <sys/check.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/iso.h>
@ -1098,6 +1099,40 @@ uint8_t bt_le_per_adv_sync_get_index(struct bt_le_per_adv_sync *per_adv_sync)
return (uint8_t)index;
}
int bt_le_per_adv_sync_get_info(struct bt_le_per_adv_sync *per_adv_sync,
struct bt_le_per_adv_sync_info *info)
{
CHECKIF(per_adv_sync == NULL || info == NULL) {
return -EINVAL;
}
bt_addr_le_copy(&info->addr, &per_adv_sync->addr);
info->sid = per_adv_sync->sid;
info->phy = per_adv_sync->phy;
info->interval = per_adv_sync->interval;
return 0;
}
struct bt_le_per_adv_sync *bt_le_per_adv_sync_lookup_addr(const bt_addr_le_t *adv_addr,
uint8_t sid)
{
for (int i = 0; i < ARRAY_SIZE(per_adv_sync_pool); i++) {
struct bt_le_per_adv_sync *sync = &per_adv_sync_pool[i];
if (!atomic_test_bit(per_adv_sync_pool[i].flags,
BT_PER_ADV_SYNC_CREATED)) {
continue;
}
if (!bt_addr_le_cmp(&sync->addr, adv_addr) && sync->sid == sid) {
return sync;
}
}
return NULL;
}
int bt_le_per_adv_sync_create(const struct bt_le_per_adv_sync_param *param,
struct bt_le_per_adv_sync **out_sync)
{