From 2f853e4d86d887a37750ae09c91f59344df5a5e7 Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Mon, 9 Jun 2025 00:32:14 +0300 Subject: [PATCH] shared/bap: detach ucast io on RELEASING and unlink streams MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When RELEASING, ucast stream QoS becomes invalid and client stream transport can no longer be acquired. Client shall close the CIS when ASE is RELEASING (BAP v1.0.2 ยง5.6.6). As client, detach IO when RELEASING. Clear the stream links, as the QoS is no longer valid. Even if caching config the ASE may be reused for different purpose, and stream will anyway be reconfigured & re-linked as needed. Also clear the stream transport, as it's not in acquirable state, and its configuration may change after this. This makes BAP Client to have existing transports only for streams that are >= QOS. (BAP Server is not changed here.) --- src/shared/bap.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/shared/bap.c b/src/shared/bap.c index 854855f6b..fda1e3560 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -1508,6 +1508,13 @@ static void bap_stream_state_changed(struct bt_bap_stream *stream) if (stream->client) bt_bap_stream_stop(stream, stream_stop_complete, NULL); break; + case BT_ASCS_ASE_STATE_RELEASING: + if (stream->client) { + bap_stream_clear_cfm(stream); + bap_stream_io_detach(stream); + bt_bap_stream_io_unlink(stream, NULL); + } + break; } } @@ -2623,6 +2630,30 @@ static int bap_ucast_io_link(struct bt_bap_stream *stream, return 0; } +static void stream_unlink_ucast(void *data) +{ + struct bt_bap_stream *link = data; + + DBG(link->bap, "stream %p unlink", link); + + queue_destroy(link->links, NULL); + link->links = NULL; +} + +static int bap_ucast_io_unlink(struct bt_bap_stream *stream, + struct bt_bap_stream *link) +{ + if (!stream) + return -EINVAL; + + queue_destroy(stream->links, stream_unlink_ucast); + stream->links = NULL; + + DBG(stream->bap, "stream %p unlink", stream); + return 0; + +} + static void stream_link(void *data, void *user_data) { struct bt_bap_stream *stream = (void *)data; @@ -2728,7 +2759,7 @@ static const struct bt_bap_stream_ops stream_ops[] = { bap_ucast_release, bap_ucast_detach, bap_ucast_set_io, bap_ucast_get_io, bap_ucast_io_dir, bap_ucast_io_link, - NULL), + bap_ucast_io_unlink), STREAM_OPS(BT_BAP_SOURCE, bap_ucast_set_state, bap_ucast_get_state, bap_ucast_config, bap_ucast_qos, bap_ucast_enable, @@ -2738,7 +2769,7 @@ static const struct bt_bap_stream_ops stream_ops[] = { bap_ucast_release, bap_ucast_detach, bap_ucast_set_io, bap_ucast_get_io, bap_ucast_io_dir, bap_ucast_io_link, - NULL), + bap_ucast_io_unlink), STREAM_OPS(BT_BAP_BCAST_SINK, bap_bcast_set_state, bap_bcast_get_state, bap_bcast_config, bap_bcast_qos, bap_bcast_sink_enable, -- 2.47.3