Add support for the bt_hci_evt_le_cis_established_v2 event in the host. This provided additional information to the host and application about the CIS paramters. Especially the peripheral gets new an important information such as the SDU size and interval. Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
147 lines
3.6 KiB
C
147 lines
3.6 KiB
C
/** @file
|
|
* @brief Internal APIs for Bluetooth ISO handling.
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2020 Intel Corporation
|
|
* Copyright (c) 2021-2024 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <zephyr/bluetooth/conn.h>
|
|
#include <zephyr/bluetooth/buf.h>
|
|
#include <zephyr/bluetooth/iso.h>
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/net_buf.h>
|
|
#include <zephyr/sys/atomic.h>
|
|
#include <zephyr/sys/slist.h>
|
|
#include <zephyr/sys_clock.h>
|
|
|
|
struct iso_data {
|
|
/* Extend the bt_buf user data */
|
|
struct bt_buf_data buf_data;
|
|
|
|
/* Index into the bt_conn storage array */
|
|
uint8_t index;
|
|
|
|
/** ISO connection handle */
|
|
uint16_t handle;
|
|
};
|
|
|
|
enum bt_iso_cig_state {
|
|
BT_ISO_CIG_STATE_IDLE,
|
|
BT_ISO_CIG_STATE_CONFIGURED,
|
|
BT_ISO_CIG_STATE_ACTIVE,
|
|
BT_ISO_CIG_STATE_INACTIVE
|
|
};
|
|
|
|
struct bt_iso_cig {
|
|
/** List of ISO channels to setup as CIS (the CIG). */
|
|
sys_slist_t cis_channels;
|
|
|
|
/** Total number of CISes in the CIG. */
|
|
uint8_t num_cis;
|
|
|
|
/** The CIG ID */
|
|
uint8_t id;
|
|
|
|
/** The CIG state
|
|
*
|
|
* Refer to BT Core Spec 5.3, Vol 6, Part 6, Figure 4.63
|
|
*/
|
|
enum bt_iso_cig_state state;
|
|
};
|
|
|
|
enum {
|
|
BT_BIG_INITIALIZED,
|
|
|
|
/* Creating a BIG as a broadcaster */
|
|
BT_BIG_PENDING,
|
|
/* Creating a BIG as a receiver */
|
|
BT_BIG_SYNCING,
|
|
|
|
BT_BIG_NUM_FLAGS,
|
|
};
|
|
|
|
struct bt_iso_big {
|
|
/** List of ISO channels to setup as BIS (the BIG). */
|
|
sys_slist_t bis_channels;
|
|
|
|
/** Total number of BISes in the BIG. */
|
|
uint8_t num_bis;
|
|
|
|
/** The BIG handle */
|
|
uint8_t handle;
|
|
|
|
ATOMIC_DEFINE(flags, BT_BIG_NUM_FLAGS);
|
|
};
|
|
|
|
#define iso(buf) ((struct iso_data *)net_buf_user_data(buf))
|
|
|
|
/* Process ISO buffer */
|
|
void hci_iso(struct net_buf *buf);
|
|
|
|
/* Allocates RX buffer */
|
|
struct net_buf *bt_iso_get_rx(k_timeout_t timeout);
|
|
|
|
/** A callback used to notify about freed buffer in the iso rx pool. */
|
|
typedef void (*bt_iso_buf_rx_freed_cb_t)(void);
|
|
|
|
/** Set a callback to notify about freed buffer in the iso rx pool.
|
|
*
|
|
* @param cb Callback to notify about freed buffer in the iso rx pool. If NULL, the callback is
|
|
* disabled.
|
|
*/
|
|
void bt_iso_buf_rx_freed_cb_set(bt_iso_buf_rx_freed_cb_t cb);
|
|
|
|
/* Process CIS Established event */
|
|
void hci_le_cis_established(struct net_buf *buf);
|
|
void hci_le_cis_established_v2(struct net_buf *buf);
|
|
|
|
/* Process CIS Request event */
|
|
void hci_le_cis_req(struct net_buf *buf);
|
|
|
|
/** Process BIG complete event */
|
|
void hci_le_big_complete(struct net_buf *buf);
|
|
|
|
/** Process BIG terminate event */
|
|
void hci_le_big_terminate(struct net_buf *buf);
|
|
|
|
/** Process BIG sync established event */
|
|
void hci_le_big_sync_established(struct net_buf *buf);
|
|
|
|
/** Process BIG sync lost event */
|
|
void hci_le_big_sync_lost(struct net_buf *buf);
|
|
|
|
/* Notify ISO channels of a new connection */
|
|
void bt_iso_connected(struct bt_conn *iso);
|
|
|
|
/* Notify ISO channels of a disconnect event */
|
|
void bt_iso_disconnected(struct bt_conn *iso);
|
|
|
|
/* Notify ISO connected channels of security changed */
|
|
void bt_iso_security_changed(struct bt_conn *acl, uint8_t hci_status);
|
|
|
|
#if defined(CONFIG_BT_ISO_LOG_LEVEL_DBG)
|
|
void bt_iso_chan_set_state_debug(struct bt_iso_chan *chan,
|
|
enum bt_iso_state state,
|
|
const char *func, int line);
|
|
#define bt_iso_chan_set_state(_chan, _state) \
|
|
bt_iso_chan_set_state_debug(_chan, _state, __func__, __LINE__)
|
|
#else
|
|
void bt_iso_chan_set_state(struct bt_iso_chan *chan, enum bt_iso_state state);
|
|
#endif /* CONFIG_BT_ISO_LOG_LEVEL_DBG */
|
|
|
|
/* Process incoming data for a connection */
|
|
void bt_iso_recv(struct bt_conn *iso, struct net_buf *buf, uint8_t flags);
|
|
|
|
/* Whether the HCI ISO data packet contains a timestamp or not.
|
|
* Per spec, the TS flag can only be set for the first fragment.
|
|
*/
|
|
enum bt_iso_timestamp {
|
|
BT_ISO_TS_ABSENT = 0,
|
|
BT_ISO_TS_PRESENT,
|
|
};
|