149 lines
3.8 KiB
C
149 lines
3.8 KiB
C
/** @file
|
|
* @brief Internal APIs for Bluetooth ISO handling.
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2020 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <bluetooth/iso.h>
|
|
|
|
#define BT_ISO_DATA_PATH_DISABLED 0xFF
|
|
|
|
struct iso_data {
|
|
/** BT_BUF_ISO_IN */
|
|
uint8_t type;
|
|
|
|
/* Index into the bt_conn storage array */
|
|
uint8_t index;
|
|
|
|
/** ISO connection handle */
|
|
uint16_t handle;
|
|
|
|
/** ISO timestamp */
|
|
uint32_t ts;
|
|
};
|
|
|
|
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 {
|
|
/** Array of ISO channels to setup as BIS (the BIG). */
|
|
struct bt_iso_chan **bis;
|
|
|
|
/** 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))
|
|
|
|
#if defined(CONFIG_BT_ISO_MAX_CHAN)
|
|
extern struct bt_conn iso_conns[CONFIG_BT_ISO_MAX_CHAN];
|
|
#endif
|
|
|
|
/* Process ISO buffer */
|
|
void hci_iso(struct net_buf *buf);
|
|
|
|
/* Allocates RX buffer */
|
|
struct net_buf *bt_iso_get_rx(k_timeout_t timeout);
|
|
|
|
/* Create new ISO connecting */
|
|
struct bt_conn *iso_new(void);
|
|
|
|
/* Process CIS Estabilished event */
|
|
void hci_le_cis_estabilished(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 */
|
|
int bt_iso_accept(struct bt_conn *conn);
|
|
|
|
/* Notify ISO channels of a new connection */
|
|
void bt_iso_connected(struct bt_conn *conn);
|
|
|
|
/* Notify ISO channels of a disconnect event */
|
|
void bt_iso_disconnected(struct bt_conn *conn);
|
|
|
|
/* Allocate ISO PDU */
|
|
#if defined(CONFIG_NET_BUF_LOG)
|
|
struct net_buf *bt_iso_create_pdu_timeout_debug(struct net_buf_pool *pool,
|
|
size_t reserve,
|
|
k_timeout_t timeout,
|
|
const char *func, int line);
|
|
#define bt_iso_create_pdu_timeout(_pool, _reserve, _timeout) \
|
|
bt_iso_create_pdu_timeout_debug(_pool, _reserve, _timeout, \
|
|
__func__, __LINE__)
|
|
|
|
#define bt_iso_create_pdu(_pool, _reserve) \
|
|
bt_iso_create_pdu_timeout_debug(_pool, _reserve, K_FOREVER, \
|
|
__func__, __line__)
|
|
#else
|
|
struct net_buf *bt_iso_create_pdu_timeout(struct net_buf_pool *pool,
|
|
size_t reserve, k_timeout_t timeout);
|
|
|
|
#define bt_iso_create_pdu(_pool, _reserve) \
|
|
bt_iso_create_pdu_timeout(_pool, _reserve, K_FOREVER)
|
|
#endif
|
|
|
|
/* Allocate ISO Fragment */
|
|
#if defined(CONFIG_NET_BUF_LOG)
|
|
struct net_buf *bt_iso_create_frag_timeout_debug(size_t reserve,
|
|
k_timeout_t timeout,
|
|
const char *func, int line);
|
|
|
|
#define bt_iso_create_frag_timeout(_reserve, _timeout) \
|
|
bt_iso_create_frag_timeout_debug(_reserve, _timeout, \
|
|
__func__, __LINE__)
|
|
|
|
#define bt_iso_create_frag(_reserve) \
|
|
bt_iso_create_frag_timeout_debug(_reserve, K_FOREVER, \
|
|
__func__, __LINE__)
|
|
#else
|
|
struct net_buf *bt_iso_create_frag_timeout(size_t reserve, k_timeout_t timeout);
|
|
|
|
#define bt_iso_create_frag(_reserve) \
|
|
bt_iso_create_frag_timeout(_reserve, K_FOREVER)
|
|
#endif
|
|
|
|
#if defined(CONFIG_BT_DEBUG_ISO)
|
|
void bt_iso_chan_set_state_debug(struct bt_iso_chan *chan, uint8_t 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, uint8_t state);
|
|
#endif /* CONFIG_BT_DEBUG_ISO */
|
|
|
|
/* Process incoming data for a connection */
|
|
void bt_iso_recv(struct bt_conn *conn, struct net_buf *buf, uint8_t flags);
|
|
|
|
struct bt_conn_iso *bt_conn_iso(struct bt_conn *conn);
|