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:
parent
6e01c6abb6
commit
5a1afaa47a
2 changed files with 72 additions and 0 deletions
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue