| /** @file |
| * @brief Bluetooth ISO handling |
| */ |
| |
| /* |
| * Copyright (c) 2020 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| #ifndef ZEPHYR_INCLUDE_BLUETOOTH_ISO_H_ |
| #define ZEPHYR_INCLUDE_BLUETOOTH_ISO_H_ |
| |
| /** |
| * @brief ISO |
| * @defgroup bt_iso ISO |
| * @ingroup bluetooth |
| * @{ |
| */ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include <sys/atomic.h> |
| #include <bluetooth/buf.h> |
| #include <bluetooth/conn.h> |
| #include <bluetooth/hci.h> |
| |
| /** @def BT_ISO_CHAN_SEND_RESERVE |
| * @brief Headroom needed for outgoing buffers |
| */ |
| #define BT_ISO_CHAN_SEND_RESERVE (CONFIG_BT_HCI_RESERVE + \ |
| BT_HCI_ISO_HDR_SIZE + \ |
| BT_HCI_ISO_DATA_HDR_SIZE) |
| |
| struct bt_iso_chan; |
| |
| /** @brief Life-span states of ISO channel. Used only by internal APIs |
| * dealing with setting channel to proper state depending on operational |
| * context. |
| */ |
| enum { |
| /** Channel disconnected */ |
| BT_ISO_DISCONNECTED, |
| /** Channel bound to a connection */ |
| BT_ISO_BOUND, |
| /** Channel in connecting state */ |
| BT_ISO_CONNECT, |
| /** Channel ready for upper layer traffic on it */ |
| BT_ISO_CONNECTED, |
| /** Channel in disconnecting state */ |
| BT_ISO_DISCONNECT, |
| }; |
| |
| /** @brief ISO Channel structure. */ |
| struct bt_iso_chan { |
| /** Channel connection reference */ |
| struct bt_conn *conn; |
| /** Channel operations reference */ |
| struct bt_iso_chan_ops *ops; |
| /** Channel QoS reference */ |
| struct bt_iso_chan_qos *qos; |
| /** Channel data path reference*/ |
| struct bt_iso_chan_path *path; |
| sys_snode_t node; |
| uint8_t state; |
| bt_security_t required_sec_level; |
| }; |
| |
| /** @brief Audio QoS direction */ |
| enum { |
| BT_ISO_CHAN_QOS_IN, |
| BT_ISO_CHAN_QOS_OUT, |
| BT_ISO_CHAN_QOS_INOUT |
| }; |
| |
| /** @brief ISO Channel QoS structure. */ |
| struct bt_iso_chan_qos { |
| /** @brief Channel direction |
| * |
| * Possible values: BT_ISO_CHAN_QOS_IN, BT_ISO_CHAN_QOS_OUT or |
| * BT_ISO_CHAN_QOS_INOUT. |
| */ |
| uint8_t dir; |
| /** Channel interval */ |
| uint32_t interval; |
| /** Channel SCA */ |
| uint8_t sca; |
| /** Channel packing mode */ |
| uint8_t packing; |
| /** Channel framing mode */ |
| uint8_t framing; |
| /** Channel Latency */ |
| uint16_t latency; |
| /** Channel SDU */ |
| uint8_t sdu; |
| /** Channel PHY */ |
| uint8_t phy; |
| /** Channel Retransmission Number */ |
| uint8_t rtn; |
| }; |
| |
| /** @brief ISO Channel Data Path structure. */ |
| struct bt_iso_chan_path { |
| /** Default path ID */ |
| uint8_t pid; |
| /** Coding Format */ |
| uint8_t format; |
| /** Company ID */ |
| uint16_t cid; |
| /** Vendor-defined Codec ID */ |
| uint16_t vid; |
| /** Controller Delay */ |
| uint32_t delay; |
| /** Codec Configuration length*/ |
| uint8_t cc_len; |
| /** Codec Configuration */ |
| uint8_t cc[0]; |
| }; |
| |
| /** @brief ISO Channel operations structure. */ |
| struct bt_iso_chan_ops { |
| /** @brief Channel connected callback |
| * |
| * If this callback is provided it will be called whenever the |
| * connection completes. |
| * |
| * @param chan The channel that has been connected |
| */ |
| void (*connected)(struct bt_iso_chan *chan); |
| |
| /** @brief Channel disconnected callback |
| * |
| * If this callback is provided it will be called whenever the |
| * channel is disconnected, including when a connection gets |
| * rejected. |
| * |
| * @param chan The channel that has been Disconnected |
| */ |
| void (*disconnected)(struct bt_iso_chan *chan); |
| |
| /** @brief Channel alloc_buf callback |
| * |
| * If this callback is provided the channel will use it to allocate |
| * buffers to store incoming data. |
| * |
| * @param chan The channel requesting a buffer. |
| * |
| * @return Allocated buffer. |
| */ |
| struct net_buf *(*alloc_buf)(struct bt_iso_chan *chan); |
| |
| /** @brief Channel recv callback |
| * |
| * @param chan The channel receiving data. |
| * @param buf Buffer containing incoming data. |
| */ |
| void (*recv)(struct bt_iso_chan *chan, struct net_buf *buf); |
| }; |
| |
| /** @brief ISO Server structure. */ |
| struct bt_iso_server { |
| /** Required minimim security level */ |
| bt_security_t sec_level; |
| |
| /** @brief Server accept callback |
| * |
| * This callback is called whenever a new incoming connection requires |
| * authorization. |
| * |
| * @param conn The connection that is requesting authorization |
| * @param chan Pointer to receive the allocated channel |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*accept)(struct bt_conn *conn, struct bt_iso_chan **chan); |
| }; |
| |
| /** @brief Register ISO server. |
| * |
| * Register ISO server, each new connection is authorized using the accept() |
| * callback which in case of success shall allocate the channel structure |
| * to be used by the new connection. |
| * |
| * @param server Server structure. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_iso_server_register(struct bt_iso_server *server); |
| |
| /** @brief Bind ISO channels |
| * |
| * Bind ISO channels with existing ACL connections, Channel objects passed |
| * (over an address of it) shouldn't be instantiated in application as |
| * standalone. |
| * |
| * @param conns Array of ACL connection objects |
| * @param num_conns Number of connection objects |
| * @param chans Array of ISO Channel objects to be created |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_iso_chan_bind(struct bt_conn **conns, uint8_t num_conns, |
| struct bt_iso_chan **chans); |
| |
| /** @brief Connect ISO channels |
| * |
| * Connect ISO channels, once the connection is completed each channel |
| * connected() callback will be called. If the connection is rejected |
| * disconnected() callback is called instead. |
| * Channel object passed (over an address of it) as second parameter shouldn't |
| * be instantiated in application as standalone. |
| * |
| * @param chans Array of ISO channel objects |
| * @param num_chans Number of channel objects |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_iso_chan_connect(struct bt_iso_chan **chans, uint8_t num_chans); |
| |
| /** @brief Disconnect ISO channel |
| * |
| * Disconnect ISO channel, if the connection is pending it will be |
| * canceled and as a result the channel disconnected() callback is called. |
| * Regarding to input parameter, to get details see reference description |
| * to bt_iso_chan_connect() API above. |
| * |
| * @param chan Channel object. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_iso_chan_disconnect(struct bt_iso_chan *chan); |
| |
| /** @brief Send data to ISO channel |
| * |
| * Send data from buffer to the channel. If credits are not available, buf will |
| * be queued and sent as and when credits are received from peer. |
| * Regarding to first input parameter, to get details see reference description |
| * to bt_iso_chan_connect() API above. |
| * |
| * @param chan Channel object. |
| * @param buf Buffer containing data to be sent. |
| * |
| * @return Bytes sent in case of success or negative value in case of error. |
| */ |
| int bt_iso_chan_send(struct bt_iso_chan *chan, struct net_buf *buf); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| /** |
| * @} |
| */ |
| |
| #endif /* ZEPHYR_INCLUDE_BLUETOOTH_ISO_H_ */ |