4545#include "ll_sw/lll.h"
4646#include "ll.h"
4747
48+ #include "isoal.h"
49+ #include "lll_conn_iso.h"
50+ #include "ull_conn_iso_internal.h"
51+ #include "ull_conn_iso_types.h"
52+ #include "ull_iso_types.h"
53+
4854#include "hci_internal.h"
4955
5056#include "hal/debug.h"
@@ -65,6 +71,93 @@ static sys_slist_t hbuf_pend;
6571static int32_t hbuf_count ;
6672#endif
6773
74+ #if defined(CONFIG_BT_CTLR_ADV_ISO ) || defined(CONFIG_BT_CTLR_SYNC_ISO ) || \
75+ defined(CONFIG_BT_CTLR_PERIPHERAL_ISO ) || defined(CONFIG_BT_CTLR_CENTRAL_ISO )
76+
77+ #define SDU_HCI_HDR_SIZE (BT_HCI_ISO_HDR_SIZE + BT_HCI_ISO_TS_DATA_HDR_SIZE)
78+
79+ isoal_status_t sink_sdu_alloc_hci (const struct isoal_sink * sink_ctx ,
80+ const struct isoal_pdu_rx * valid_pdu ,
81+ struct isoal_sdu_buffer * sdu_buffer )
82+ {
83+ ARG_UNUSED (sink_ctx );
84+ ARG_UNUSED (valid_pdu ); /* TODO copy valid pdu into netbuf ? */
85+
86+ struct net_buf * buf = bt_buf_get_rx (BT_BUF_ISO_IN , K_NO_WAIT );
87+
88+ if (buf ) {
89+ /* Reserve space for headers */
90+ net_buf_reserve (buf , SDU_HCI_HDR_SIZE );
91+
92+ sdu_buffer -> dbuf = buf ;
93+ sdu_buffer -> size = net_buf_tailroom (buf );
94+ } else {
95+ LL_ASSERT (0 );
96+ }
97+
98+ return ISOAL_STATUS_OK ;
99+ }
100+
101+
102+ isoal_status_t sink_sdu_emit_hci (const struct isoal_sink * sink_ctx ,
103+ const struct isoal_sdu_produced * valid_sdu )
104+ {
105+ struct ll_conn_iso_stream * cis ;
106+ uint16_t handle ;
107+ uint16_t handle_packed ;
108+ uint8_t ts , pb ;
109+ uint16_t len ;
110+ uint16_t packet_status_flag ;
111+ uint16_t slen , slen_packed ;
112+ struct bt_hci_iso_hdr * hdr ;
113+ struct bt_hci_iso_ts_data_hdr * data_hdr ;
114+
115+ struct net_buf * buf = (struct net_buf * ) valid_sdu -> contents .dbuf ;
116+
117+ if (buf ) {
118+ data_hdr = net_buf_push (buf , BT_HCI_ISO_TS_DATA_HDR_SIZE );
119+ hdr = net_buf_push (buf , BT_HCI_ISO_HDR_SIZE );
120+
121+ cis = sink_ctx -> session .cis ;
122+ handle = ll_conn_iso_stream_handle_get (cis );
123+
124+ pb = sink_ctx -> sdu_production .sdu_state ;
125+
126+ ts = 1 ; /*TODO: Always assume timestamp? */
127+ handle_packed = bt_iso_handle_pack (handle , pb , ts );
128+ len = sink_ctx -> sdu_production .sdu_written + BT_HCI_ISO_TS_DATA_HDR_SIZE ;
129+
130+ hdr -> handle = sys_cpu_to_le16 (handle_packed );
131+ hdr -> len = sys_cpu_to_le16 (len );
132+
133+ packet_status_flag = 0x0000 ; /* TODO: For now always assume "valid data" */
134+ slen = sink_ctx -> sdu_production .sdu_written ;
135+ slen_packed = bt_iso_pkt_len_pack (slen , packet_status_flag );
136+
137+ data_hdr -> ts = sys_cpu_to_le32 ((uint32_t ) valid_sdu -> timestamp );
138+ data_hdr -> data .sn = sys_cpu_to_le16 ((uint16_t ) valid_sdu -> seqn );
139+ data_hdr -> data .slen = sys_cpu_to_le16 (slen_packed );
140+
141+ /* send fragment up the chain */
142+ bt_recv (buf );
143+ }
144+
145+ return ISOAL_STATUS_OK ;
146+ }
147+
148+ isoal_status_t sink_sdu_write_hci (void * dbuf ,
149+ const uint8_t * pdu_payload ,
150+ const size_t consume_len )
151+ {
152+ struct net_buf * buf = (struct net_buf * ) dbuf ;
153+
154+ LL_ASSERT (buf );
155+ net_buf_add_mem (buf , pdu_payload , consume_len );
156+
157+ return ISOAL_STATUS_OK ;
158+ }
159+ #endif
160+
68161static struct net_buf * process_prio_evt (struct node_rx_pdu * node_rx ,
69162 uint8_t * evt_flags )
70163{
@@ -203,6 +296,33 @@ static inline struct net_buf *encode_node(struct node_rx_pdu *node_rx,
203296 hci_acl_encode (node_rx , buf );
204297 break ;
205298#endif
299+ #if defined(CONFIG_BT_CTLR_ADV_ISO ) || defined(CONFIG_BT_CTLR_SYNC_ISO ) || \
300+ defined(CONFIG_BT_CTLR_PERIPHERAL_ISO ) || defined(CONFIG_BT_CTLR_CENTRAL_ISO )
301+ case HCI_CLASS_ISO_DATA : {
302+ #if defined(CONFIG_BT_CTLR_PERIPHERAL_ISO ) || defined(CONFIG_BT_CTLR_CENTRAL_ISO )
303+ struct ll_conn_iso_stream * cis =
304+ ll_conn_iso_stream_get (node_rx -> hdr .handle );
305+ struct ll_iso_datapath * dp = cis -> datapath_out ;
306+ isoal_sink_handle_t sink = dp -> sink_hdl ;
307+
308+ if (dp -> path_id == BT_HCI_DATAPATH_ID_HCI ) {
309+ /* If HCI datapath pass to ISO AL here */
310+ struct isoal_pdu_rx pckt_meta = {
311+ .meta = & node_rx -> hdr .rx_iso_meta ,
312+ .pdu = (union isoal_pdu * ) & node_rx -> pdu [0 ]
313+ };
314+
315+ /* Pass the ISO PDU through ISO-AL */
316+ isoal_status_t err =
317+ isoal_rx_pdu_recombine (sink , & pckt_meta );
318+
319+ LL_ASSERT (err == ISOAL_STATUS_OK ); /* TODO handle err */
320+ }
321+ #endif
322+ break ;
323+ }
324+ #endif
325+
206326 default :
207327 LL_ASSERT (0 );
208328 break ;
@@ -225,6 +345,7 @@ static inline struct net_buf *process_node(struct node_rx_pdu *node_rx)
225345
226346 /* controller to host flow control enabled */
227347 switch (class ) {
348+ case HCI_CLASS_ISO_DATA :
228349 case HCI_CLASS_EVT_DISCARDABLE :
229350 case HCI_CLASS_EVT_REQUIRED :
230351 break ;
@@ -403,7 +524,6 @@ static void recv_thread(void *p1, void *p2, void *p3)
403524 net_buf_unref (buf );
404525 }
405526 }
406-
407527 k_yield ();
408528 }
409529}
0 commit comments