Line data Source code
1 1 : /**
2 : * @file
3 : * @brief Bluetooth ISO handling
4 : */
5 :
6 : /*
7 : * Copyright (c) 2020 Intel Corporation
8 : * Copyright (c) 2021-2024 Nordic Semiconductor ASA
9 : *
10 : * SPDX-License-Identifier: Apache-2.0
11 : */
12 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_ISO_H_
13 : #define ZEPHYR_INCLUDE_BLUETOOTH_ISO_H_
14 :
15 : /**
16 : * @brief Isochronous channels (ISO)
17 : * @defgroup bt_iso Isochronous channels (ISO)
18 : *
19 : * @since 2.3
20 : * @version 0.8.0
21 : *
22 : * @ingroup bluetooth
23 : * @{
24 : */
25 :
26 : #include <stdint.h>
27 :
28 : #include <zephyr/bluetooth/addr.h>
29 : #include <zephyr/bluetooth/bluetooth.h>
30 : #include <zephyr/bluetooth/buf.h>
31 : #include <zephyr/bluetooth/conn.h>
32 : #include <zephyr/bluetooth/hci.h>
33 : #include <zephyr/net_buf.h>
34 : #include <zephyr/sys/atomic.h>
35 : #include <zephyr/sys/slist.h>
36 : #include <zephyr/sys/util_macro.h>
37 : #include <zephyr/sys/slist.h>
38 :
39 : #ifdef __cplusplus
40 : extern "C" {
41 : #endif
42 :
43 : /**
44 : * @brief Headroom needed for outgoing ISO SDUs
45 : */
46 1 : #define BT_ISO_CHAN_SEND_RESERVE BT_BUF_ISO_SIZE(0)
47 :
48 : /**
49 : * @brief Helper to calculate needed buffer size for ISO SDUs.
50 : * Useful for creating buffer pools.
51 : *
52 : * @param mtu Required ISO SDU size
53 : *
54 : * @return Needed buffer size to match the requested ISO SDU MTU.
55 : */
56 1 : #define BT_ISO_SDU_BUF_SIZE(mtu) BT_BUF_ISO_SIZE(mtu)
57 :
58 : /**
59 : * Convert BIS index to bit
60 : *
61 : * The BIS indexes start from 0x01, so the lowest allowed bit is
62 : * BIT(0) that represents index 0x01. To synchronize to e.g. BIS
63 : * indexes 0x01 and 0x02, the bitfield value should be BIT(0) | BIT(1).
64 : * As a general notation, to sync to BIS index N use BIT(N - 1).
65 : */
66 1 : #define BT_ISO_BIS_INDEX_BIT(x) (BIT((x) - 1))
67 :
68 : /** Value to set the ISO data path over HCi. */
69 1 : #define BT_ISO_DATA_PATH_HCI 0x00
70 :
71 : /** Unknown SDU interval */
72 1 : #define BT_ISO_SDU_INTERVAL_UNKNOWN 0x000000U
73 : /** Minimum interval value in microseconds */
74 1 : #define BT_ISO_SDU_INTERVAL_MIN 0x0000FFU
75 : /** Maximum interval value in microseconds */
76 1 : #define BT_ISO_SDU_INTERVAL_MAX 0x0FFFFFU
77 : /** Minimum ISO interval (N * 1.25 ms) */
78 1 : #define BT_ISO_ISO_INTERVAL_MIN 0x0004U
79 : /** Maximum ISO interval (N * 1.25 ms) */
80 1 : #define BT_ISO_ISO_INTERVAL_MAX 0x0C80U
81 : /** Minimum latency value in milliseconds */
82 1 : #define BT_ISO_LATENCY_MIN 0x0005
83 : /** Maximum latency value in milliseconds */
84 1 : #define BT_ISO_LATENCY_MAX 0x0FA0
85 : /** Packets will be sent sequentially between the channels in the group */
86 1 : #define BT_ISO_PACKING_SEQUENTIAL 0x00
87 : /** Packets will be sent interleaved between the channels in the group */
88 1 : #define BT_ISO_PACKING_INTERLEAVED 0x01
89 : /** Packets may be framed or unframed */
90 1 : #define BT_ISO_FRAMING_UNFRAMED 0x00
91 : /** Packets are always framed */
92 1 : #define BT_ISO_FRAMING_FRAMED 0x01
93 : /** Maximum number of isochronous channels in a single group */
94 1 : #define BT_ISO_MAX_GROUP_ISO_COUNT 0x1F
95 : /** Minimum SDU size */
96 1 : #define BT_ISO_MIN_SDU 0x0001
97 : /** Maximum SDU size */
98 1 : #define BT_ISO_MAX_SDU 0x0FFF
99 : /** Minimum PDU size */
100 1 : #define BT_ISO_CONNECTED_PDU_MIN 0x0000U
101 : /** Minimum PDU size */
102 1 : #define BT_ISO_BROADCAST_PDU_MIN 0x0001U
103 : /** Maximum PDU size */
104 1 : #define BT_ISO_PDU_MAX 0x00FBU
105 : /** Minimum burst number */
106 1 : #define BT_ISO_BN_MIN 0x01U
107 : /** Maximum burst number */
108 1 : #define BT_ISO_BN_MAX 0x0FU
109 : /** Minimum flush timeout */
110 1 : #define BT_ISO_FT_MIN 0x01U
111 : /** Maximum flush timeout */
112 1 : #define BT_ISO_FT_MAX 0xFFU
113 : /** Minimum number of subevents */
114 1 : #define BT_ISO_NSE_MIN 0x01U
115 : /** Maximum number of subevents */
116 1 : #define BT_ISO_NSE_MAX 0x1FU
117 : /** Minimum BIG sync timeout value (N * 10 ms) */
118 1 : #define BT_ISO_SYNC_TIMEOUT_MIN 0x000A
119 : /** Maximum BIG sync timeout value (N * 10 ms) */
120 1 : #define BT_ISO_SYNC_TIMEOUT_MAX 0x4000
121 : /** Controller controlled maximum subevent count value */
122 1 : #define BT_ISO_SYNC_MSE_ANY 0x00
123 : /** Minimum BIG sync maximum subevent count value */
124 1 : #define BT_ISO_SYNC_MSE_MIN 0x01
125 : /** Maximum BIG sync maximum subevent count value */
126 1 : #define BT_ISO_SYNC_MSE_MAX 0x1F
127 : /** Maximum connected ISO retransmission value */
128 1 : #define BT_ISO_CONNECTED_RTN_MAX 0xFF
129 : /** Maximum broadcast ISO retransmission value */
130 1 : #define BT_ISO_BROADCAST_RTN_MAX 0x1E
131 : /** Broadcast code size */
132 1 : #define BT_ISO_BROADCAST_CODE_SIZE 16
133 : /** Lowest BIS index */
134 1 : #define BT_ISO_BIS_INDEX_MIN 0x01
135 : /** Highest BIS index */
136 1 : #define BT_ISO_BIS_INDEX_MAX 0x1F
137 : /** Minimum Immediate Repetition Count */
138 1 : #define BT_ISO_IRC_MIN 0x01U
139 : /** Maximum Immediate Repetition Count */
140 1 : #define BT_ISO_IRC_MAX 0x0FU
141 : /** Minimum pre-transmission offset */
142 1 : #define BT_ISO_PTO_MIN 0x00U
143 : /** Maximum pre-transmission offset */
144 1 : #define BT_ISO_PTO_MAX 0x0FU
145 : /** No subinterval */
146 1 : #define BT_ISO_SUBINTERVAL_NONE 0x00000000U
147 : /** Unknown subinterval */
148 1 : #define BT_ISO_SUBINTERVAL_UNKNOWN 0xFFFFFFFFU
149 :
150 : /**
151 : * @brief Check if ISO BIS bitfield is valid (BT_ISO_BIS_INDEX_BIT(1)|..|BT_ISO_BIS_INDEX_BIT(31))
152 : *
153 : * @param _bis_bitfield BIS index bitfield (uint32)
154 : */
155 1 : #define BT_ISO_VALID_BIS_BITFIELD(_bis_bitfield) \
156 : ((_bis_bitfield) != 0U && (_bis_bitfield) <= BIT_MASK(BT_ISO_BIS_INDEX_MAX))
157 :
158 : /**
159 : * @brief Life-span states of ISO channel. Used only by internal APIs dealing with setting channel
160 : * to proper state depending on operational context.
161 : */
162 1 : enum bt_iso_state {
163 : /** Channel disconnected */
164 : BT_ISO_STATE_DISCONNECTED,
165 : /** Channel is pending ACL encryption before connecting */
166 : BT_ISO_STATE_ENCRYPT_PENDING,
167 : /** Channel in connecting state */
168 : BT_ISO_STATE_CONNECTING,
169 : /** Channel ready for upper layer traffic on it */
170 : BT_ISO_STATE_CONNECTED,
171 : /** Channel in disconnecting state */
172 : BT_ISO_STATE_DISCONNECTING,
173 : };
174 :
175 :
176 : /**
177 : * @brief ISO Channel Type.
178 : */
179 1 : enum bt_iso_chan_type {
180 : BT_ISO_CHAN_TYPE_NONE, /**< No channel type */
181 : BT_ISO_CHAN_TYPE_CONNECTED, /**< Connected */
182 : BT_ISO_CHAN_TYPE_BROADCASTER, /**< Isochronous broadcaster */
183 : BT_ISO_CHAN_TYPE_SYNC_RECEIVER /**< Synchronized receiver */
184 : };
185 :
186 : /** @brief ISO Channel structure. */
187 1 : struct bt_iso_chan {
188 : /** Channel connection reference */
189 1 : struct bt_conn *iso;
190 : /** Channel operations reference */
191 1 : struct bt_iso_chan_ops *ops;
192 : /** Channel QoS reference */
193 1 : struct bt_iso_chan_qos *qos;
194 : /** Channel state */
195 1 : enum bt_iso_state state;
196 : #if (defined(CONFIG_BT_SMP) && defined(CONFIG_BT_ISO_UNICAST)) || defined(__DOXYGEN__)
197 : /**
198 : * @brief The required security level of the channel
199 : *
200 : * This value can be set as the central before connecting a CIS
201 : * with bt_iso_chan_connect().
202 : * The value is overwritten to @ref bt_iso_server::sec_level for the
203 : * peripheral once a channel has been accepted.
204 : *
205 : * Only available when @kconfig{CONFIG_BT_SMP} is enabled.
206 : */
207 1 : bt_security_t required_sec_level;
208 : #endif /* CONFIG_BT_SMP && CONFIG_BT_ISO_UNICAST */
209 : /** @internal Node used internally by the stack */
210 0 : sys_snode_t node;
211 : };
212 :
213 : /** @brief ISO Channel IO QoS structure. */
214 1 : struct bt_iso_chan_io_qos {
215 : /**
216 : * @brief Channel SDU.
217 : *
218 : * Value range is @ref BT_ISO_MIN_SDU to @ref BT_ISO_MAX_SDU.
219 : */
220 1 : uint16_t sdu;
221 : /**
222 : * @brief Channel PHY - See the BT_GAP_LE_PHY_* values.
223 : *
224 : * Setting @ref BT_GAP_LE_PHY_NONE is invalid.
225 : */
226 1 : uint8_t phy;
227 : /**
228 : * @brief Channel Retransmission Number.
229 : *
230 : * This value is ignored if any advanced ISO parameters are set.
231 : */
232 1 : uint8_t rtn;
233 : /**
234 : * @brief Channel data path reference
235 : *
236 : * Setting to NULL default to HCI data path (same as setting path.pid
237 : * to @ref BT_ISO_DATA_PATH_HCI).
238 : */
239 1 : struct bt_iso_chan_path *path;
240 :
241 : #if defined(CONFIG_BT_ISO_TEST_PARAMS) || defined(__DOXYGEN__)
242 : /**
243 : * @brief Maximum PDU size
244 : *
245 : * Maximum size, in octets, of the payload from link layer to link layer.
246 : *
247 : * Value range @ref BT_ISO_CONNECTED_PDU_MIN to @ref BT_ISO_PDU_MAX for connected ISO.
248 : *
249 : * Value range @ref BT_ISO_BROADCAST_PDU_MIN to @ref BT_ISO_PDU_MAX for broadcast ISO.
250 : */
251 1 : uint16_t max_pdu;
252 :
253 : /**
254 : * @brief Burst number
255 : *
256 : * Value range @ref BT_ISO_BN_MIN to @ref BT_ISO_BN_MAX.
257 : */
258 1 : uint8_t burst_number;
259 : #endif /* CONFIG_BT_ISO_TEST_PARAMS */
260 : };
261 :
262 : /** @brief ISO Channel QoS structure. */
263 1 : struct bt_iso_chan_qos {
264 : /**
265 : * @brief Channel Receiving QoS.
266 : *
267 : * Setting NULL disables data path @ref BT_HCI_DATAPATH_DIR_CTLR_TO_HOST.
268 : *
269 : * Can only be set for a connected isochronous channel, or a broadcast isochronous receiver.
270 : */
271 1 : struct bt_iso_chan_io_qos *rx;
272 : /**
273 : * @brief Channel Transmission QoS
274 : *
275 : * Setting NULL disables data path @ref BT_HCI_DATAPATH_DIR_HOST_TO_CTLR.
276 : *
277 : * Can only be set for a connected isochronous channel, or a broadcast
278 : * isochronous transmitter.
279 : */
280 1 : struct bt_iso_chan_io_qos *tx;
281 :
282 : #if defined(CONFIG_BT_ISO_TEST_PARAMS) || defined(__DOXYGEN__)
283 : /**
284 : * @brief Number of subevents
285 : *
286 : * Maximum number of subevents in each CIS or BIS event.
287 : *
288 : * Value range @ref BT_ISO_NSE_MIN to @ref BT_ISO_NSE_MAX.
289 : */
290 1 : uint8_t num_subevents;
291 : #endif /* CONFIG_BT_ISO_TEST_PARAMS */
292 : };
293 :
294 : /** @brief ISO Channel Data Path structure. */
295 1 : struct bt_iso_chan_path {
296 : /** Default path ID */
297 1 : uint8_t pid;
298 : /** Coding Format */
299 1 : uint8_t format;
300 : /** Company ID */
301 1 : uint16_t cid;
302 : /** Vendor-defined Codec ID */
303 1 : uint16_t vid;
304 : /** Controller Delay */
305 1 : uint32_t delay;
306 : /** Codec Configuration length*/
307 1 : uint8_t cc_len;
308 : /** Pointer to an array containing the Codec Configuration */
309 1 : uint8_t *cc;
310 : };
311 :
312 : /** ISO packet status flag bits */
313 1 : enum {
314 : /** The ISO packet is valid. */
315 : BT_ISO_FLAGS_VALID = BIT(0),
316 :
317 : /**
318 : * @brief The ISO packet may possibly contain errors.
319 : *
320 : * May be caused by a failed CRC check or if missing a part of the SDU.
321 : */
322 : BT_ISO_FLAGS_ERROR = BIT(1),
323 :
324 : /** The ISO packet was lost. */
325 : BT_ISO_FLAGS_LOST = BIT(2),
326 :
327 : /**
328 : * @brief Timestamp is valid
329 : *
330 : * If not set, then the bt_iso_recv_info.ts value is not valid, and
331 : * should not be used.
332 : */
333 : BT_ISO_FLAGS_TS = BIT(3)
334 : };
335 :
336 : /** @brief ISO Meta Data structure for received ISO packets. */
337 1 : struct bt_iso_recv_info {
338 : /**
339 : * @brief ISO timestamp
340 : *
341 : * Only valid if @p flags has the @ref BT_ISO_FLAGS_TS bit set.
342 : */
343 1 : uint32_t ts;
344 :
345 : /** ISO packet sequence number of the first fragment in the SDU */
346 1 : uint16_t seq_num;
347 :
348 : /** ISO packet flags bitfield (BT_ISO_FLAGS_*) */
349 1 : uint8_t flags;
350 : };
351 :
352 : /** @brief ISO Meta Data structure for transmitted ISO packets. */
353 1 : struct bt_iso_tx_info {
354 : /** CIG reference point or BIG anchor point of a transmitted SDU, in microseconds. */
355 1 : uint32_t ts;
356 :
357 : /** Time offset, in microseconds */
358 1 : uint32_t offset;
359 :
360 : /** Packet sequence number */
361 1 : uint16_t seq_num;
362 : };
363 :
364 :
365 : /** Opaque type representing an Connected Isochronous Group (CIG). */
366 : struct bt_iso_cig;
367 :
368 : /** @brief Connected Isochronous Group (CIG) parameters */
369 1 : struct bt_iso_cig_param {
370 : /** @brief Array of pointers to CIS channels */
371 1 : struct bt_iso_chan **cis_channels;
372 :
373 : /**
374 : * @brief Number of channels in @p cis_channels
375 : *
376 : * Maximum number of channels in a single group is @ref BT_ISO_MAX_GROUP_ISO_COUNT
377 : */
378 1 : uint8_t num_cis;
379 :
380 : /**
381 : * @brief Channel interval in us for SDUs sent from Central to Peripheral.
382 : *
383 : * Value range @ref BT_ISO_SDU_INTERVAL_MIN to @ref BT_ISO_SDU_INTERVAL_MAX.
384 : */
385 1 : uint32_t c_to_p_interval;
386 :
387 : /**
388 : * @brief Channel interval in us for SDUs sent from Peripheral to Central.
389 : *
390 : * Value range @ref BT_ISO_SDU_INTERVAL_MIN to @ref BT_ISO_SDU_INTERVAL_MAX.
391 : */
392 1 : uint32_t p_to_c_interval;
393 :
394 : /**
395 : * @brief Channel Latency in ms for SDUs sent from Central to Peripheral
396 : *
397 : * Value range @ref BT_ISO_LATENCY_MIN to @ref BT_ISO_LATENCY_MAX.
398 : *
399 : * This value is ignored if any advanced ISO parameters are set.
400 : */
401 1 : uint16_t c_to_p_latency;
402 :
403 : /**
404 : * @brief Channel Latency in ms for SDUs sent from Peripheral to Central
405 : *
406 : * Value range @ref BT_ISO_LATENCY_MIN to @ref BT_ISO_LATENCY_MAX.
407 : *
408 : * This value is ignored if any advanced ISO parameters are set.
409 : */
410 1 : uint16_t p_to_c_latency;
411 :
412 : /**
413 : * @brief Channel peripherals sleep clock accuracy Only for CIS
414 : *
415 : * Shall be worst case sleep clock accuracy of all the peripherals.
416 : * For possible values see the BT_GAP_SCA_* values.
417 : * If unknown for the peripherals, this should be set to @ref BT_GAP_SCA_UNKNOWN.
418 : */
419 1 : uint8_t sca;
420 :
421 : /**
422 : * @brief Channel packing mode.
423 : *
424 : * @ref BT_ISO_PACKING_SEQUENTIAL or @ref BT_ISO_PACKING_INTERLEAVED
425 : */
426 1 : uint8_t packing;
427 :
428 : /**
429 : * @brief Channel framing mode.
430 : *
431 : * @ref BT_ISO_FRAMING_UNFRAMED for unframed and @ref BT_ISO_FRAMING_FRAMED for framed.
432 : */
433 1 : uint8_t framing;
434 :
435 : #if defined(CONFIG_BT_ISO_TEST_PARAMS) || defined(__DOXYGEN__)
436 : /**
437 : * @brief Central to Peripheral flush timeout
438 : *
439 : * The flush timeout in multiples of ISO_Interval for each payload sent
440 : * from the Central to Peripheral.
441 : *
442 : * Value range from @ref BT_ISO_FT_MIN to @ref BT_ISO_FT_MAX
443 : */
444 1 : uint8_t c_to_p_ft;
445 :
446 : /**
447 : * @brief Peripheral to Central flush timeout
448 : *
449 : * The flush timeout in multiples of ISO_Interval for each payload sent
450 : * from the Peripheral to Central.
451 : *
452 : * Value range from @ref BT_ISO_FT_MIN to @ref BT_ISO_FT_MAX.
453 : */
454 1 : uint8_t p_to_c_ft;
455 :
456 : /**
457 : * @brief ISO interval
458 : *
459 : * Time between consecutive CIS anchor points.
460 : *
461 : * Value range from @ref BT_ISO_ISO_INTERVAL_MIN to @ref BT_ISO_ISO_INTERVAL_MAX.
462 : */
463 1 : uint16_t iso_interval;
464 : #endif /* CONFIG_BT_ISO_TEST_PARAMS */
465 : };
466 :
467 : /** ISO connection parameters structure */
468 1 : struct bt_iso_connect_param {
469 : /** The ISO channel to connect */
470 1 : struct bt_iso_chan *iso_chan;
471 :
472 : /** The ACL connection */
473 1 : struct bt_conn *acl;
474 : };
475 :
476 : /** Opaque type representing a Broadcast Isochronous Group (BIG). */
477 : struct bt_iso_big;
478 :
479 : /** @brief Broadcast Isochronous Group (BIG) creation parameters */
480 1 : struct bt_iso_big_create_param {
481 : /** Array of pointers to BIS channels */
482 1 : struct bt_iso_chan **bis_channels;
483 :
484 : /**
485 : * @brief Number of channels in @p bis_channels
486 : *
487 : * Maximum number of channels in a single group is @ref BT_ISO_MAX_GROUP_ISO_COUNT
488 : */
489 1 : uint8_t num_bis;
490 :
491 : /**
492 : * @brief Channel interval in us.
493 : *
494 : * Value range @ref BT_ISO_SDU_INTERVAL_MIN to @ref BT_ISO_SDU_INTERVAL_MAX.
495 : */
496 1 : uint32_t interval;
497 :
498 : /**
499 : * @brief Channel Latency in ms.
500 : *
501 : * Value range @ref BT_ISO_LATENCY_MIN to @ref BT_ISO_LATENCY_MAX.
502 : *
503 : * This value is ignored if any advanced ISO parameters are set.
504 : */
505 1 : uint16_t latency;
506 :
507 : /**
508 : * @brief Channel packing mode.
509 : *
510 : * @ref BT_ISO_PACKING_SEQUENTIAL or @ref BT_ISO_PACKING_INTERLEAVED
511 : */
512 1 : uint8_t packing;
513 :
514 : /**
515 : * @brief Channel framing mode.
516 : *
517 : * @ref BT_ISO_FRAMING_UNFRAMED for unframed and @ref BT_ISO_FRAMING_FRAMED for framed.
518 : */
519 1 : uint8_t framing;
520 :
521 : /** Whether or not to encrypt the streams. */
522 1 : bool encryption;
523 :
524 : /**
525 : * @brief Broadcast code
526 : *
527 : * The code used to derive the session key that is used to encrypt and decrypt BIS payloads.
528 : *
529 : * If the value is a string or the value is less than 16 octets,
530 : * the remaining octets shall be 0.
531 : *
532 : * Example:
533 : * The string "Broadcast Code" shall be
534 : * [42 72 6F 61 64 63 61 73 74 20 43 6F 64 65 00 00]
535 : */
536 1 : uint8_t bcode[BT_ISO_BROADCAST_CODE_SIZE];
537 :
538 : #if defined(CONFIG_BT_ISO_TEST_PARAMS) || defined(__DOXYGEN__)
539 : /**
540 : * @brief Immediate Repetition Count
541 : *
542 : * The number of times the scheduled payloads are transmitted in a given event.
543 : *
544 : * Value range from @ref BT_ISO_IRC_MIN to @ref BT_ISO_IRC_MAX.
545 : */
546 1 : uint8_t irc;
547 :
548 : /**
549 : * @brief Pre-transmission offset
550 : *
551 : * Offset used for pre-transmissions.
552 : *
553 : * Value range from @ref BT_ISO_PTO_MIN to @ref BT_ISO_PTO_MAX.
554 : */
555 1 : uint8_t pto;
556 :
557 : /**
558 : * @brief ISO interval
559 : *
560 : * Time between consecutive BIS anchor points.
561 : *
562 : * Value range from @ref BT_ISO_ISO_INTERVAL_MIN to @ref BT_ISO_ISO_INTERVAL_MAX.
563 : */
564 1 : uint16_t iso_interval;
565 : #endif /* CONFIG_BT_ISO_TEST_PARAMS */
566 : };
567 :
568 : /** @brief Broadcast Isochronous Group (BIG) Sync Parameters */
569 1 : struct bt_iso_big_sync_param {
570 : /** Array of pointers to BIS channels */
571 1 : struct bt_iso_chan **bis_channels;
572 :
573 : /**
574 : * @brief Number channels in @p bis_channels
575 : *
576 : * Maximum number of channels in a single group is @ref BT_ISO_MAX_GROUP_ISO_COUNT
577 : */
578 1 : uint8_t num_bis;
579 :
580 : /**
581 : * @brief Bitfield of the BISes to sync to
582 : *
583 : * Use @ref BT_ISO_BIS_INDEX_BIT to convert BIS indexes to a bitfield.
584 : *
585 : * To synchronize to e.g. BIS indexes 0x01 and 0x02, this can be set to
586 : * BT_ISO_BIS_INDEX_BIT(0x01) | BT_ISO_BIS_INDEX_BIT(0x02).
587 : */
588 1 : uint32_t bis_bitfield;
589 :
590 : /**
591 : * @brief Maximum subevents
592 : *
593 : * The MSE (Maximum Subevents) parameter is the maximum number of
594 : * subevents that a Controller should use to receive data payloads
595 : * in each interval for a BIS.
596 : *
597 : * Value range is @ref BT_ISO_SYNC_MSE_MIN to @ref BT_ISO_SYNC_MSE_MAX, or
598 : * @ref BT_ISO_SYNC_MSE_ANY to let the controller choose.
599 : */
600 1 : uint32_t mse;
601 :
602 : /**
603 : * @brief Synchronization timeout for the BIG (N * 10 MS)
604 : *
605 : * Value range is @ref BT_ISO_SYNC_TIMEOUT_MIN to @ref BT_ISO_SYNC_TIMEOUT_MAX.
606 : */
607 1 : uint16_t sync_timeout;
608 :
609 : /** Whether or not the streams of the BIG are encrypted */
610 1 : bool encryption;
611 :
612 : /**
613 : * @brief Broadcast code
614 : *
615 : * The code used to derive the session key that is used to encrypt and decrypt BIS payloads.
616 : *
617 : * If the value is a string or a the value is less than 16 octets,
618 : * the remaining octets shall be 0.
619 : *
620 : * Example:
621 : * The string "Broadcast Code" shall be
622 : * [42 72 6F 61 64 63 61 73 74 20 43 6F 64 65 00 00]
623 : */
624 1 : uint8_t bcode[BT_ISO_BROADCAST_CODE_SIZE];
625 : };
626 :
627 : /** @brief Broadcast Isochronous Group (BIG) information */
628 1 : struct bt_iso_biginfo {
629 : /** Address of the advertiser */
630 1 : const bt_addr_le_t *addr;
631 :
632 : /** Advertiser SID */
633 1 : uint8_t sid;
634 :
635 : /** Number of BISes in the BIG */
636 1 : uint8_t num_bis;
637 :
638 : /** Maximum number of subevents in each isochronous event */
639 1 : uint8_t sub_evt_count;
640 :
641 : /** Interval between two BIG anchor point (N * 1.25 ms) */
642 1 : uint16_t iso_interval;
643 :
644 : /** The number of new payloads in each BIS event */
645 1 : uint8_t burst_number;
646 :
647 : /** Offset used for pre-transmissions */
648 1 : uint8_t offset;
649 :
650 : /** The number of times a payload is transmitted in a BIS event */
651 1 : uint8_t rep_count;
652 :
653 : /** Maximum size, in octets, of the payload */
654 1 : uint16_t max_pdu;
655 :
656 : /** The interval, in microseconds, of periodic SDUs. */
657 1 : uint32_t sdu_interval;
658 :
659 : /** Maximum size of an SDU, in octets. */
660 1 : uint16_t max_sdu;
661 :
662 : /** Channel PHY */
663 1 : uint8_t phy;
664 :
665 : /** Channel framing mode */
666 1 : uint8_t framing;
667 :
668 : /** Whether or not the BIG is encrypted */
669 1 : bool encryption;
670 : };
671 :
672 : /** @brief ISO Channel operations structure. */
673 1 : struct bt_iso_chan_ops {
674 : /**
675 : * @brief Channel connected callback
676 : *
677 : * If this callback is provided it will be called whenever the connection completes.
678 : *
679 : * For a peripheral, the QoS values (see @ref bt_iso_chan_io_qos)
680 : * are set when this is called. The peripheral does not have any
681 : * information about the RTN though.
682 : *
683 : * @param chan The channel that has been connected
684 : */
685 1 : void (*connected)(struct bt_iso_chan *chan);
686 :
687 : /**
688 : * @brief Channel disconnected callback
689 : *
690 : * If this callback is provided it will be called whenever the
691 : * channel is disconnected, including when a connection gets
692 : * rejected or when setting security fails.
693 : *
694 : * @param chan The channel that has been Disconnected
695 : * @param reason BT_HCI_ERR_* reason for the disconnection.
696 : */
697 1 : void (*disconnected)(struct bt_iso_chan *chan, uint8_t reason);
698 :
699 : /**
700 : * @brief Channel alloc_buf callback
701 : *
702 : * If this callback is provided the channel will use it to allocate
703 : * buffers to store incoming data.
704 : *
705 : * @param chan The channel requesting a buffer.
706 : *
707 : * @return Allocated buffer.
708 : */
709 : struct net_buf *(*alloc_buf)(struct bt_iso_chan *chan);
710 :
711 : /**
712 : * @brief Channel recv callback
713 : *
714 : * @param chan The channel receiving data.
715 : * @param buf Buffer containing incoming data.
716 : * @param info Pointer to the metadata for the buffer. The lifetime of the
717 : * pointer is linked to the lifetime of the net_buf.
718 : * Metadata such as sequence number and timestamp can be
719 : * provided by the bluetooth controller.
720 : */
721 1 : void (*recv)(struct bt_iso_chan *chan, const struct bt_iso_recv_info *info,
722 : struct net_buf *buf);
723 :
724 : /**
725 : * @brief Channel sent callback
726 : *
727 : * This callback will be called once the controller marks the SDU
728 : * as completed. When the controller does so is implementation
729 : * dependent. It could be after the SDU is enqueued for transmission,
730 : * or after it is sent on air or flushed.
731 : *
732 : * @param chan The channel which has sent data.
733 : */
734 1 : void (*sent)(struct bt_iso_chan *chan);
735 : };
736 :
737 : /** @brief ISO Accept Info Structure */
738 1 : struct bt_iso_accept_info {
739 : /** The ACL connection that is requesting authorization */
740 1 : struct bt_conn *acl;
741 :
742 : /**
743 : * @brief The ID of the connected isochronous group (CIG) on the central
744 : *
745 : * The ID is unique per ACL
746 : */
747 1 : uint8_t cig_id;
748 :
749 : /**
750 : * @brief The ID of the connected isochronous stream (CIS) on the central
751 : *
752 : * This ID is unique within a CIG
753 : */
754 1 : uint8_t cis_id;
755 : };
756 :
757 : /** @brief ISO Server structure. */
758 1 : struct bt_iso_server {
759 : #if defined(CONFIG_BT_SMP) || defined(__DOXYGEN__)
760 : /**
761 : * @brief Required minimum security level.
762 : *
763 : * Only available when @kconfig{CONFIG_BT_SMP} is enabled.
764 : */
765 1 : bt_security_t sec_level;
766 : #endif /* CONFIG_BT_SMP */
767 :
768 : /**
769 : * @brief Server accept callback
770 : *
771 : * This callback is called whenever a new incoming connection requires authorization.
772 : *
773 : * @param info The ISO accept information structure
774 : * @param chan Pointer to receive the allocated channel
775 : *
776 : * @return 0 in case of success or negative value in case of error.
777 : */
778 1 : int (*accept)(const struct bt_iso_accept_info *info, struct bt_iso_chan **chan);
779 : };
780 :
781 : /**
782 : * @brief Register ISO server.
783 : *
784 : * Register ISO server, each new connection is authorized using the accept()
785 : * callback which in case of success shall allocate the channel structure
786 : * to be used by the new connection.
787 : *
788 : * @param server Server structure.
789 : *
790 : * @return 0 in case of success or negative value in case of error.
791 : */
792 1 : int bt_iso_server_register(struct bt_iso_server *server);
793 :
794 : /**
795 : * @brief Unregister ISO server.
796 : *
797 : * Unregister previously registered ISO server.
798 : *
799 : * @param server Server structure.
800 : *
801 : * @return 0 in case of success or negative value in case of error.
802 : */
803 1 : int bt_iso_server_unregister(struct bt_iso_server *server);
804 :
805 : /**
806 : * @brief Creates a CIG as a central
807 : *
808 : * This can called at any time, even before connecting to a remote device.
809 : * This must be called before any connected isochronous stream (CIS) channel can be connected.
810 : *
811 : * Once a CIG is created, the channels supplied in the @p param can be
812 : * connected using bt_iso_chan_connect().
813 : *
814 : * @param[in] param The parameters used to create and enable the CIG.
815 : * @param[out] out_cig Connected Isochronous Group object on success.
816 : *
817 : * @return 0 in case of success or negative value in case of error.
818 : */
819 1 : int bt_iso_cig_create(const struct bt_iso_cig_param *param, struct bt_iso_cig **out_cig);
820 :
821 : /**
822 : * @brief Reconfigure a CIG as a central
823 : *
824 : * This function can be used to update a CIG. It will update the group specific
825 : * parameters, and, if supplied, change the QoS parameters of the individual
826 : * CIS. If the cis_channels in @p param contains CIS that was not originally
827 : * in the call to bt_iso_cig_create(), these will be added to the group.
828 : * It is not possible to remove any CIS from the group after creation.
829 : *
830 : * This can be called at any time before connecting an ISO to a remote device.
831 : * Once any CIS in the group has connected, the group cannot be changed.
832 : *
833 : * Once a CIG is created, the channels supplied in the @p param can be
834 : * connected using bt_iso_chan_connect().
835 : *
836 : * @param cig Connected Isochronous Group object.
837 : * @param param The parameters used to reconfigure the CIG.
838 : *
839 : * @return 0 in case of success or negative value in case of error.
840 : */
841 1 : int bt_iso_cig_reconfigure(struct bt_iso_cig *cig, const struct bt_iso_cig_param *param);
842 :
843 : /**
844 : * @brief Terminates a CIG as a central
845 : *
846 : * All the CIS in the CIG shall be disconnected first.
847 : *
848 : * @param cig Pointer to the CIG structure.
849 : *
850 : * @return 0 in case of success or negative value in case of error.
851 : */
852 1 : int bt_iso_cig_terminate(struct bt_iso_cig *cig);
853 :
854 : /**
855 : * @brief Connect ISO channels on ACL connections
856 : *
857 : * Connect ISO channels. The ISO channels must have been initialized in a CIG
858 : * first by calling bt_iso_cig_create().
859 : *
860 : * Once the connection is completed the channels' connected() callback will be
861 : * called. If the connection is rejected disconnected() callback is called
862 : * instead.
863 : *
864 : * This function will also setup the ISO data path based on the @p path
865 : * parameter of the @ref bt_iso_chan_io_qos for each channel.
866 : *
867 : * @param param Pointer to a connect parameter array with the ISO and ACL pointers.
868 : * @param count Number of connect parameters.
869 : *
870 : * @retval 0 Successfully started the connecting procedure.
871 : *
872 : * @retval -EINVAL Invalid parameters were supplied.
873 : *
874 : * @retval -EBUSY Some ISO channels are already being connected.
875 : * It is not possible to have multiple outstanding connection requests.
876 : * May also be returned if @kconfig{CONFIG_BT_SMP} is enabled and a
877 : * pairing procedure is already in progress.
878 : *
879 : * @retval -ENOBUFS Not buffers available to send request to controller or if
880 : * @kconfig{CONFIG_BT_SMP} is enabled and no more keys could be stored.
881 : *
882 : * @retval -ENOMEM If @kconfig{CONFIG_BT_SMP} is enabled and no more keys
883 : * could be stored.
884 : *
885 : * @retval -EIO Controller rejected the request or if @kconfig{CONFIG_BT_SMP}
886 : * is enabled and pairing has timed out.
887 : *
888 : * @retval -ENOTCONN If @kconfig{CONFIG_BT_SMP} is enabled the ACL is not
889 : * connected.
890 : */
891 1 : int bt_iso_chan_connect(const struct bt_iso_connect_param *param, size_t count);
892 :
893 : /**
894 : * @brief Disconnect connected ISO channel
895 : *
896 : * Disconnect connected ISO channel.
897 : *
898 : * If the device is a central and the connection is pending it will be
899 : * canceled and as a result the channel bt_iso_chan_ops.disconnected() callback is called.
900 : *
901 : * If the device is a peripheral and the connection is pending it will be rejected, as a peripheral
902 : * shall wait for a CIS Established event (which may trigger a bt_iso_chan_ops.disconnected()
903 : * callback in case of an error).
904 : *
905 : * Regarding to input parameter, to get details see reference description
906 : * to bt_iso_chan_connect() API.
907 : *
908 : * @param chan Channel object.
909 : *
910 : * @return 0 in case of success or negative value in case of error.
911 : */
912 1 : int bt_iso_chan_disconnect(struct bt_iso_chan *chan);
913 :
914 : /**
915 : * @brief Send data to ISO channel without timestamp
916 : *
917 : * Send data from buffer to the channel. If credits are not available, buf will
918 : * be queued and sent as and when credits are received from peer.
919 : * Regarding to first input parameter, to get details see reference description
920 : * to bt_iso_chan_connect() API.
921 : *
922 : * @note Buffer ownership is transferred to the stack in case of success, in
923 : * case of an error the caller retains the ownership of the buffer.
924 : *
925 : * @param chan Channel object.
926 : * @param buf Buffer containing data to be sent.
927 : * @param seq_num Packet Sequence number. This value shall be incremented for
928 : * each call to this function and at least once per SDU
929 : * interval for a specific channel.
930 : *
931 : * @return Number of octets sent in case of success or negative value in case of error.
932 : */
933 1 : int bt_iso_chan_send(struct bt_iso_chan *chan, struct net_buf *buf, uint16_t seq_num);
934 :
935 : /**
936 : * @brief Send data to ISO channel with timestamp
937 : *
938 : * Send data from buffer to the channel. If credits are not available, buf will
939 : * be queued and sent as and when credits are received from peer.
940 : * Regarding to first input parameter, to get details see reference description
941 : * to bt_iso_chan_connect() API.
942 : *
943 : * @note Buffer ownership is transferred to the stack in case of success, in
944 : * case of an error the caller retains the ownership of the buffer.
945 : *
946 : * @param chan Channel object.
947 : * @param buf Buffer containing data to be sent.
948 : * @param seq_num Packet Sequence number. This value shall be incremented for
949 : * each call to this function and at least once per SDU
950 : * interval for a specific channel.
951 : * @param ts Timestamp of the SDU in microseconds (us).
952 : * This value can be used to transmit multiple
953 : * SDUs in the same SDU interval in a CIG or BIG.
954 : *
955 : * @return Number of octets sent in case of success or negative value in case of error.
956 : */
957 1 : int bt_iso_chan_send_ts(struct bt_iso_chan *chan, struct net_buf *buf, uint16_t seq_num,
958 : uint32_t ts);
959 :
960 : /** @brief ISO Unicast TX Info Structure */
961 1 : struct bt_iso_unicast_tx_info {
962 : /** The transport latency in us */
963 1 : uint32_t latency;
964 :
965 : /** The flush timeout (N * 1.25 ms) */
966 1 : uint32_t flush_timeout;
967 :
968 : /** The maximum PDU size in octets */
969 1 : uint16_t max_pdu;
970 :
971 : /** The transport PHY */
972 1 : uint8_t phy;
973 :
974 : /** The burst number */
975 1 : uint8_t bn;
976 :
977 : /** The maximum SDU size in octets
978 : *
979 : * May be set to @ref bt_iso_unicast_tx_info.max_pdu for peripherals if unknown
980 : */
981 1 : uint16_t max_sdu;
982 :
983 : /** The SDU interval in microseconds
984 : *
985 : * May be set to @ref BT_ISO_SDU_INTERVAL_UNKNOWN for if unknown.
986 : */
987 1 : uint32_t sdu_interval;
988 : };
989 :
990 : /** @brief ISO Unicast Info Structure */
991 1 : struct bt_iso_unicast_info {
992 : /** The maximum time in us for all PDUs of all CIS in a CIG event */
993 1 : uint32_t cig_sync_delay;
994 :
995 : /** The maximum time in us for all PDUs of this CIS in a CIG event */
996 1 : uint32_t cis_sync_delay;
997 :
998 : /**
999 : * @brief The subinterval in microseconds
1000 : *
1001 : * Will be @ref BT_ISO_SUBINTERVAL_NONE if there is no subinterval (NSE = 1).
1002 : * Will be @ref BT_ISO_SUBINTERVAL_UNKNOWN if unknown.
1003 : */
1004 1 : uint32_t subinterval;
1005 :
1006 : /** @brief TX information for the central to peripheral data path */
1007 1 : struct bt_iso_unicast_tx_info central;
1008 :
1009 : /** TX information for the peripheral to central data */
1010 1 : struct bt_iso_unicast_tx_info peripheral;
1011 : };
1012 :
1013 : /** @brief ISO Broadcaster Info Structure */
1014 1 : struct bt_iso_broadcaster_info {
1015 : /** The maximum time in us for all PDUs of all BIS in a BIG event */
1016 1 : uint32_t sync_delay;
1017 :
1018 : /** The transport latency in us */
1019 1 : uint32_t latency;
1020 :
1021 : /** Pre-transmission offset (N * 1.25 ms) */
1022 1 : uint32_t pto;
1023 :
1024 : /** The maximum PDU size in octets */
1025 1 : uint16_t max_pdu;
1026 :
1027 : /** The transport PHY */
1028 1 : uint8_t phy;
1029 :
1030 : /** The burst number */
1031 1 : uint8_t bn;
1032 :
1033 : /** Number of times a payload is transmitted in a BIS event */
1034 1 : uint8_t irc;
1035 : };
1036 :
1037 : /** @brief ISO Synchronized Receiver Info Structure */
1038 1 : struct bt_iso_sync_receiver_info {
1039 : /** The transport latency in us */
1040 1 : uint32_t latency;
1041 :
1042 : /** Pre-transmission offset (N * 1.25 ms) */
1043 1 : uint32_t pto;
1044 :
1045 : /** The maximum PDU size in octets */
1046 1 : uint16_t max_pdu;
1047 :
1048 : /** The burst number */
1049 1 : uint8_t bn;
1050 :
1051 : /** Number of times a payload is transmitted in a BIS event */
1052 1 : uint8_t irc;
1053 : };
1054 :
1055 : /** ISO channel Info Structure */
1056 1 : struct bt_iso_info {
1057 : /** Channel Type. */
1058 1 : enum bt_iso_chan_type type;
1059 :
1060 : /** The ISO interval (N * 1.25 ms) */
1061 1 : uint16_t iso_interval;
1062 :
1063 : /** The maximum number of subevents in each ISO event */
1064 1 : uint8_t max_subevent;
1065 :
1066 : /**
1067 : * @brief True if the channel is able to send data
1068 : *
1069 : * This is always true when @p type is @ref BT_ISO_CHAN_TYPE_BROADCASTER,
1070 : * and never true when @p type is @ref BT_ISO_CHAN_TYPE_SYNC_RECEIVER.
1071 : */
1072 1 : bool can_send;
1073 :
1074 : /**
1075 : * @brief True if the channel is able to recv data
1076 : *
1077 : * This is always true when @p type is @ref BT_ISO_CHAN_TYPE_SYNC_RECEIVER,
1078 : * and never true when @p type is @ref BT_ISO_CHAN_TYPE_BROADCASTER.
1079 : */
1080 1 : bool can_recv;
1081 :
1082 : /** Connection Type specific Info.*/
1083 : union {
1084 : #if defined(CONFIG_BT_ISO_UNICAST) || defined(__DOXYGEN__)
1085 : /** Unicast specific Info.
1086 : * Only available when @kconfig{CONFIG_BT_ISO_UNICAST} is enabled.
1087 : */
1088 1 : struct bt_iso_unicast_info unicast;
1089 : #endif /* CONFIG_BT_ISO_UNICAST */
1090 : #if defined(CONFIG_BT_ISO_BROADCASTER) || defined(__DOXYGEN__)
1091 : /** Broadcaster specific Info.
1092 : * Only available when @kconfig{CONFIG_BT_ISO_BROADCASTER} is enabled.
1093 : */
1094 1 : struct bt_iso_broadcaster_info broadcaster;
1095 : #endif /* CONFIG_BT_ISO_BROADCASTER */
1096 : #if defined(CONFIG_BT_ISO_SYNC_RECEIVER) || defined(__DOXYGEN__)
1097 : /** Sync receiver specific Info.
1098 : * Only available when @kconfig{CONFIG_BT_ISO_SYNC_RECEIVER} is enabled.
1099 : */
1100 1 : struct bt_iso_sync_receiver_info sync_receiver;
1101 : #endif /* CONFIG_BT_ISO_SYNC_RECEIVER */
1102 1 : };
1103 : };
1104 :
1105 : /**
1106 : * @brief Get ISO channel info
1107 : *
1108 : * @param chan Channel object.
1109 : * @param info Channel info object.
1110 : *
1111 : * @return Zero on success or (negative) error code on failure.
1112 : */
1113 1 : int bt_iso_chan_get_info(const struct bt_iso_chan *chan, struct bt_iso_info *info);
1114 :
1115 : /**
1116 : * @brief Get ISO transmission timing info
1117 : *
1118 : * @details Reads timing information for transmitted ISO packet on an ISO channel.
1119 : * The HCI_LE_Read_ISO_TX_Sync HCI command is used to retrieve this information
1120 : * from the controller.
1121 : *
1122 : * @note An SDU must have already been successfully transmitted on the ISO channel
1123 : * for this function to return successfully.
1124 : *
1125 : * @param[in] chan Channel object.
1126 : * @param[out] info Transmit info object.
1127 : *
1128 : * @return Zero on success or (negative) error code on failure.
1129 : */
1130 1 : int bt_iso_chan_get_tx_sync(const struct bt_iso_chan *chan, struct bt_iso_tx_info *info);
1131 :
1132 : /**
1133 : * @brief Struct to hold the Broadcast Isochronous Group callbacks
1134 : *
1135 : * These can be registered for usage with bt_iso_big_register_cb().
1136 : */
1137 1 : struct bt_iso_big_cb {
1138 : /**
1139 : * @brief The BIG has started and all of the streams are ready for data
1140 : *
1141 : * @param big The started BIG
1142 : */
1143 1 : void (*started)(struct bt_iso_big *big);
1144 :
1145 : /**
1146 : * @brief The BIG has stopped and none of the streams are ready for data
1147 : *
1148 : * @param big The stopped BIG
1149 : * @param reason The reason why the BIG stopped (see the BT_HCI_ERR_* values)
1150 : */
1151 1 : void (*stopped)(struct bt_iso_big *big, uint8_t reason);
1152 :
1153 : /** @internal Internally used field for list handling */
1154 : sys_snode_t _node;
1155 : };
1156 :
1157 : /**
1158 : * @brief Registers callbacks for Broadcast Sources
1159 : *
1160 : * @param cb Pointer to the callback structure.
1161 : *
1162 : * @retval 0 on success
1163 : * @retval -EINVAL if @p cb is NULL
1164 : * @retval -EEXIST if @p cb is already registered
1165 : */
1166 1 : int bt_iso_big_register_cb(struct bt_iso_big_cb *cb);
1167 :
1168 : /**
1169 : * @brief Creates a BIG as a broadcaster
1170 : *
1171 : * @param[in] padv Pointer to the periodic advertising object the BIGInfo shall be sent on.
1172 : * @param[in] param The parameters used to create and enable the BIG. The QOS parameters are
1173 : * determined by the QOS field of the first BIS in the BIS list of this
1174 : * parameter.
1175 : * @param[out] out_big Broadcast Isochronous Group object on success.
1176 : *
1177 : * @return 0 in case of success or negative value in case of error.
1178 : */
1179 1 : int bt_iso_big_create(struct bt_le_ext_adv *padv, struct bt_iso_big_create_param *param,
1180 : struct bt_iso_big **out_big);
1181 :
1182 : /**
1183 : * @brief Terminates a BIG as a broadcaster or receiver
1184 : *
1185 : * @param big Pointer to the BIG structure.
1186 : *
1187 : * @return 0 in case of success or negative value in case of error.
1188 : */
1189 1 : int bt_iso_big_terminate(struct bt_iso_big *big);
1190 :
1191 : /**
1192 : * @brief Creates a BIG as a receiver
1193 : *
1194 : * @param[in] sync Pointer to the periodic advertising sync object the BIGInfo was received on.
1195 : * @param[in] param The parameters used to create and enable the BIG sync.
1196 : * @param[out] out_big Broadcast Isochronous Group object on success.
1197 : *
1198 : * @return 0 in case of success or negative value in case of error.
1199 : */
1200 1 : int bt_iso_big_sync(struct bt_le_per_adv_sync *sync, struct bt_iso_big_sync_param *param,
1201 : struct bt_iso_big **out_big);
1202 :
1203 : #ifdef __cplusplus
1204 : }
1205 : #endif
1206 :
1207 : /**
1208 : * @}
1209 : */
1210 :
1211 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_ISO_H_ */
|