Linux bluetooth development
 help / color / mirror / Atom feed
* [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE
@ 2026-11-11 20:37 Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/5] shared/bap: Don't disconnect a CIS still configured for a link Luiz Augusto von Dentz
                   ` (20 more replies)
  0 siblings, 21 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

A remote initiator, e.g. a phone in a voice call, may enable the Source
ASE of a CIS shared with a Sink ASE and then switch to the Sink ASE
alone. The acceptor disconnected the CIS when the Source ASE detached
from it, although the linked Sink ASE was still configured for it, and
as the initiator does not request the CIS again, the Sink ASE was left
enabled without a CIS and the voice stayed silent.

Keep the CIS while another ASE is still configured for it. Unit tests
cover releasing an ASE of a CIS kept by its link, of a shared CIS and
switching the direction, and a functional test counts the CIS the
acceptor is asked to accept.

v2: Also tell the streams using the CIS of a linked stream when it is
    lost, not only the ones that hold it themselves.

v3: Hold the IO of a link when an ASE enabled again over the CIS its link
    kept uses it (new patch 2/5), so disabling the link doesn't free the CIS
    while the ASE streams. The functional test covers it, and counts the
    second CIS requested after teardown.
v2: Also tell the streams using the CIS of a linked stream when it is
    lost, not only the ones that hold it themselves.

Luiz Augusto von Dentz (5):
  shared/bap: Don't disconnect a CIS still configured for a link
  shared/bap: Hold the IO of a link when using it
  unit/test-bap: Add tests for a CIS shared by two ASEs
  doc/functional-bap: Document switching the direction of a CIS
  test: functional: Cover switching the direction of a CIS

 doc/functional-bap.rst      |  44 +++++++
 src/shared/bap.c            |  91 +++++++++++----
 test/functional/test_bap.py |  86 ++++++++++++++
 unit/test-bap.c             | 227 ++++++++++++++++++++++++++++++++++++
 4 files changed, 423 insertions(+), 25 deletions(-)

-- 
2.56.0


^ permalink raw reply	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 1/5] shared/bap: Don't disconnect a CIS still configured for a link
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-12  0:37   ` shared/bap: Don't disconnect a CIS still used by another ASE bluez.test.bot
  2026-11-11 20:37 ` [PATCH BlueZ v3 2/5] shared/bap: Hold the IO of a link when using it Luiz Augusto von Dentz
                   ` (19 subsequent siblings)
  20 siblings, 1 reply; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

When a stream was detached from its CIS, its link was detached as well
if in QoS Configured state, which disconnected the CIS. As a server,
this happened as soon as the client disabled the Source ASE of a
bidirectional CIS, while it may enable the Sink ASE right after over
the same CIS, e.g. when a phone switches a headset from its microphone
to its speaker in a voice call:

  > LE-ACL: Handle 2048 flags 0x02 dlen 10       #1155 18:59:04.179316
        ATT: Write Command (0x52) len 5
          Opcode: Disable (0x05)
            ASE ID: 0x03
  < HCI Command: Disconnect (0x01|0x0006) plen 3 #1157 18:59:04.179773
        Handle: 2304 (LE-CIS)
        Reason: Remote User Terminated Connection (0x13)
  > LE-ACL: Handle 2048 flags 0x02 dlen 17       #1164 18:59:04.201326
        ATT: Write Command (0x52) len 12
          Opcode: Enable (0x03)
            ASE ID: 0x01

The client does not establish the CIS again, so the Sink ASE stayed in
Enabling without a CIS and its transport never became pending, leaving
the speaker silent.

Leave the link attached, so the CIS is only disconnected once no
stream uses it anymore, by the client, or when it is released.

As the IO may then outlive the stream it was created for, its
disconnect handler no longer keeps a pointer to that stream, which may
have been freed, but cleans up every stream using the IO, e.g. moving a
Source ASE releasing to Codec Configured although the Sink ASE also
using the CIS was found first, holding a reference to each of them.

Fixes: b798cec4ca62 ("shared/bap: Add initial code for handling BAP")
Assisted-by: Claude:claude-opus-5-5
---
 src/shared/bap.c | 84 ++++++++++++++++++++++++++++++++++--------------
 1 file changed, 59 insertions(+), 25 deletions(-)

diff --git a/src/shared/bap.c b/src/shared/bap.c
index 8cb7fb40f16c..37d14bd77c90 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -1564,20 +1564,8 @@ static void bap_stream_update_io_links(struct bt_bap_stream *stream)
 	queue_find(bap->streams, bap_stream_io_link, stream);
 }
 
-static bool match_stream_io(const void *data, const void *user_data)
-{
-	const struct bt_bap_stream *stream = data;
-	const struct bt_bap_stream_io *io = user_data;
-
-	if (!stream->io)
-		return false;
-
-	return stream->io == io;
-}
-
 static bool bap_stream_io_detach(struct bt_bap_stream *stream)
 {
-	struct bt_bap_stream *link;
 	struct bt_bap_stream_io *io;
 
 	if (!stream->io)
@@ -1588,13 +1576,10 @@ static bool bap_stream_io_detach(struct bt_bap_stream *stream)
 	io = stream->io;
 	stream->io = NULL;
 
-	link = queue_find(stream->links, match_stream_io, io);
-	if (link) {
-		/* Detach link if in QoS state */
-		if (link->ep->state == BT_ASCS_ASE_STATE_QOS)
-			bap_stream_io_detach(link);
-	}
-
+	/* A link keeps the CIS, even in QoS state, as it may be enabled
+	 * next over the same CIS: it is detached in turn when it is
+	 * disabled, released or the CIS is disconnected.
+	 */
 	stream_io_unref(io);
 
 	return true;
@@ -3215,7 +3200,10 @@ static bool bap_stream_io_attach(struct bt_bap_stream *stream, int fd,
 
 	io->connecting = connecting;
 	stream->io = io;
-	io_set_disconnect_handler(io->io, stream_io_disconnected, stream, NULL);
+	/* The IO may outlive the stream it was created for, as long as a
+	 * link uses it, so the handler looks up the stream using it.
+	 */
+	io_set_disconnect_handler(io->io, stream_io_disconnected, io, NULL);
 
 	return true;
 }
@@ -7279,9 +7267,21 @@ bool bt_bap_match_bcast_sink_stream(const void *data, const void *user_data)
 	return stream->lpac->type == BT_BAP_BCAST_SINK;
 }
 
-static bool stream_io_disconnected(struct io *io, void *user_data)
+static void stream_io_collect(void *data, void *user_data)
 {
-	struct bt_bap_stream *stream = user_data;
+	struct bt_bap_stream *stream = data;
+	void **args = user_data;
+
+	if (stream_get_io(stream) == args[0])
+		queue_push_tail(args[1], bt_bap_stream_ref(stream));
+}
+
+static void stream_io_lost(void *data, void *user_data)
+{
+	struct bt_bap_stream *stream = data;
+
+	if (!bap_stream_valid(stream))
+		return;
 
 	DBG(stream->bap, "stream %p io disconnected", stream);
 
@@ -7289,9 +7289,9 @@ static bool stream_io_disconnected(struct io *io, void *user_data)
 	 * and PA Sync have been lost so switch to idle state to cleanup the
 	 * stream.
 	 */
-	if (stream->lpac->type == BT_BAP_BCAST_SINK) {
+	if (stream->lpac && stream->lpac->type == BT_BAP_BCAST_SINK) {
 		stream_set_state(stream, BT_BAP_STREAM_STATE_IDLE);
-		return false;
+		return;
 	}
 
 	switch (stream->ep->state) {
@@ -7304,8 +7304,42 @@ static bool stream_io_disconnected(struct io *io, void *user_data)
 		stream_set_state(stream, BT_BAP_STREAM_STATE_QOS);
 		break;
 	}
+}
+
+static void stream_io_clear(void *data, void *user_data)
+{
+	struct bt_bap_stream *stream = data;
+
+	if (bap_stream_valid(stream))
+		bt_bap_stream_set_io(stream, -1);
+}
+
+static bool stream_io_disconnected(struct io *io, void *user_data)
+{
+	struct bt_bap_stream_io *sio = user_data;
+	struct bt_bap *bap;
+	struct queue *streams;
+	void *args[2];
+
+	bap = bt_bap_ref_safe(sio->bap);
+	if (!bap)
+		return false;
+
+	/* Every stream using the CIS, e.g. a Sink and a Source ASE sharing
+	 * it, has to be cleaned up, and their state callbacks may release
+	 * them or change their links, so hold a reference to each of them.
+	 */
+	streams = queue_new();
+	args[0] = sio;
+	args[1] = streams;
+	queue_foreach(bap->streams, stream_io_collect, args);
+
+	queue_foreach(streams, stream_io_lost, NULL);
+	queue_foreach(streams, stream_io_clear, NULL);
+
+	queue_destroy(streams, bt_bap_stream_unref);
+	bt_bap_unref(bap);
 
-	bt_bap_stream_set_io(stream, -1);
 	return false;
 }
 
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 2/5] shared/bap: Hold the IO of a link when using it
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/5] shared/bap: Don't disconnect a CIS still configured for a link Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 3/5] unit/test-bap: Add tests for a CIS shared by two ASEs Luiz Augusto von Dentz
                   ` (18 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

An ASE enabled again over the CIS its link kept uses the IO of the link
without holding a reference of its own, so disabling the link, its last
other user, freed the CIS while the ASE was still streaming over it.
Hold the IO when taking it from a link.

Assisted-by: Claude:claude-opus-5-5
---
 src/shared/bap.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/shared/bap.c b/src/shared/bap.c
index 37d14bd77c90..5b892f370936 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -2794,6 +2794,13 @@ static struct bt_bap_stream_io *bap_ucast_get_io(struct bt_bap_stream *stream)
 
 	queue_foreach(stream->links, stream_find_io, &io);
 
+	/* The stream uses the IO of its link, e.g. when enabled again over the
+	 * CIS its link kept, so it has to hold it as well, as the link may be
+	 * its last other user.
+	 */
+	if (io)
+		stream->io = stream_io_ref(io);
+
 	return io;
 }
 
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 3/5] unit/test-bap: Add tests for a CIS shared by two ASEs
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/5] shared/bap: Don't disconnect a CIS still configured for a link Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 2/5] shared/bap: Hold the IO of a link when using it Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 4/5] doc/functional-bap: Document switching the direction of a CIS Luiz Augusto von Dentz
                   ` (17 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Configure a Sink and a Source ASE for the same CIS and enable the Source
ASE so the CIS is established, then cover:

- Releasing the Source ASE until its stream is freed while the Sink ASE
  keeps the CIS: once the CIS is disconnected, enabling the Sink ASE
  must not start streaming over it.
- Releasing the Source ASE, which has to be released once the CIS is
  disconnected, caching its codec configuration, although the Sink ASE
  configured first uses the CIS as well.
- Disabling the Source ASE and enabling the Sink ASE right after, as a
  phone does when switching a headset from its microphone to its
  speaker: the Sink ASE has to start streaming over the same CIS, which
  has to stay connected, as the client does not establish it again.

Assisted-by: Claude:claude-opus-5-5
---
 unit/test-bap.c | 227 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 227 insertions(+)

diff --git a/unit/test-bap.c b/unit/test-bap.c
index 99c5ae92e447..3713ad56c072 100644
--- a/unit/test-bap.c
+++ b/unit/test-bap.c
@@ -4728,6 +4728,230 @@ static void test_usr_scc_cis_loss(void)
 			SCC_SRC_ENABLING_CIS_LOSS);
 }
 
+static void state_release_link(struct bt_bap_stream *stream,
+					uint8_t old_state, uint8_t new_state,
+					void *user_data)
+{
+	struct test_data *data = user_data;
+	int fds[2];
+	int err;
+
+	if (bt_bap_stream_get_dir(stream) != BT_BAP_SOURCE)
+		return;
+
+	switch (new_state) {
+	case BT_BAP_STREAM_STATE_ENABLING:
+		/* Establish the CIS for the Source ASE, which its linked Sink
+		 * ASE shares.
+		 */
+		err = socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0,
+									fds);
+		g_assert(err == 0);
+		g_assert(bt_bap_stream_io_connecting(stream, fds[0]) == 0);
+		data->fds[0][0] = fds[0];
+		data->fds[0][1] = fds[1];
+		break;
+	case BT_BAP_STREAM_STATE_IDLE:
+		/* Once the Source ASE is released and its stream freed,
+		 * disconnect the CIS the Sink ASE kept.
+		 */
+		if (data->fds[0][1] > 0) {
+			close(data->fds[0][1]);
+			data->fds[0][1] = -1;
+		}
+		break;
+	}
+}
+
+static struct test_config cfg_release_link = {
+	.cc = LC3_CONFIG_16_2,
+	.qos = LC3_QOS_16_2_1,
+	.snk = true,
+	.src = true,
+	.state_func = state_release_link,
+};
+
+#define QOS_16_2_1_DATA \
+	0x10, 0x27, 0x00, 0x00, 0x02, 0x28, 0x00, 0x02, 0x0a, 0x00, 0x40, \
+	0x9c, 0x00
+
+/* Sink and Source ASE configured for the same CIS: the Source ASE is
+ * enabled, disabled and released until its stream is freed, while the Sink
+ * ASE keeps the CIS, which is then disconnected. The Sink ASE is then
+ * enabled, without a CIS.
+ */
+#define SCC_RELEASE_LINK \
+	DISC_SRC_ASE_LC3, \
+	SCC_SNK(LC3_CONFIG_16_2_DATA), \
+	SCC_SRC(LC3_CONFIG_16_2_DATA), \
+	QOS_SNK(QOS_16_2_1_DATA), \
+	QOS_SRC(QOS_16_2_1_DATA), \
+	SRC_ENABLE, \
+	SRC_DISABLE, \
+	ASE_SRC_RELEASE_CC, \
+	ASE_SRC_RELEASE_IDLE, \
+	ENABLE_ASE(SNK_ID(0)), \
+	SNK_ENABLE_NOTIFY(0, 0)
+
+static void test_usr_scc_release_link(void)
+{
+	define_test("BAP/USR/SCC/BLUEZ-2 [USR Release ASE of a CIS kept by its "
+			"link]",
+			test_setup_server, test_server_state,
+			&cfg_release_link, SCC_RELEASE_LINK);
+}
+
+static gboolean disconnect_cis(gpointer user_data)
+{
+	struct test_data *data = user_data;
+
+	if (data->fds[0][1] > 0) {
+		close(data->fds[0][1]);
+		data->fds[0][1] = -1;
+	}
+
+	return FALSE;
+}
+
+static void state_release_cis(struct bt_bap_stream *stream,
+					uint8_t old_state, uint8_t new_state,
+					void *user_data)
+{
+	struct test_data *data = user_data;
+	int fds[2];
+	int err;
+
+	if (bt_bap_stream_get_dir(stream) != BT_BAP_SOURCE)
+		return;
+
+	switch (new_state) {
+	case BT_BAP_STREAM_STATE_ENABLING:
+		err = socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0,
+									fds);
+		g_assert(err == 0);
+		g_assert(bt_bap_stream_io_connecting(stream, fds[0]) == 0);
+		data->fds[0][0] = fds[0];
+		data->fds[0][1] = fds[1];
+		break;
+	case BT_BAP_STREAM_STATE_RELEASING:
+		/* The client disconnects the CIS once notified that the
+		 * Source ASE is releasing, while the Sink ASE is still
+		 * configured for it.
+		 */
+		g_timeout_add(50, disconnect_cis, data);
+		break;
+	}
+}
+
+static struct test_config cfg_release_cis = {
+	.cc = LC3_CONFIG_16_2,
+	.qos = LC3_QOS_16_2_1,
+	.snk = true,
+	.src = true,
+	.state_func = state_release_cis,
+};
+
+/* Sink and Source ASE configured for the same CIS: the Source ASE is
+ * enabled and released, and remains releasing until the CIS is
+ * disconnected, then it is released caching its codec configuration,
+ * although the Sink ASE, configured first, was using the CIS as well.
+ */
+#define SCC_RELEASE_CIS \
+	DISC_SRC_ASE_LC3, \
+	SCC_SNK(LC3_CONFIG_16_2_DATA), \
+	SCC_SRC(LC3_CONFIG_16_2_DATA), \
+	QOS_SNK(QOS_16_2_1_DATA), \
+	QOS_SRC(QOS_16_2_1_DATA), \
+	SRC_ENABLE, \
+	ASE_SRC_RELEASE, \
+	IOV_DATA(0x0a, SRC_HND(0)), \
+	IOV_DATA(0x0b, SRC_ID(0), 0x06), \
+	SCC_SRC_NOTIFY(0, LC3_CONFIG_16_2_DATA)
+
+static void test_usr_scc_release_cis(void)
+{
+	define_test("BAP/USR/SCC/BLUEZ-3 [USR Release ASE of a shared CIS]",
+			test_setup_server, test_server_state,
+			&cfg_release_cis, SCC_RELEASE_CIS);
+}
+
+static int switch_cis_fd = -1;
+
+static void state_switch_cis(struct bt_bap_stream *stream,
+					uint8_t old_state, uint8_t new_state,
+					void *user_data)
+{
+	struct test_data *data = user_data;
+	char buf;
+	int fds[2];
+	int err;
+	int fd;
+
+	switch (bt_bap_stream_get_dir(stream)) {
+	case BT_BAP_SOURCE:
+		if (new_state != BT_BAP_STREAM_STATE_ENABLING)
+			return;
+
+		/* Establish the CIS for the Source ASE, which its linked
+		 * Sink ASE shares.
+		 */
+		err = socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0,
+									fds);
+		g_assert(err == 0);
+		g_assert(bt_bap_stream_io_connecting(stream, fds[0]) == 0);
+		switch_cis_fd = fds[0];
+		data->fds[0][0] = fds[0];
+		data->fds[0][1] = fds[1];
+		break;
+	case BT_BAP_SINK:
+		if (new_state != BT_BAP_STREAM_STATE_STREAMING)
+			return;
+
+		/* The Sink ASE streams over the CIS established for the
+		 * Source ASE, which is still connected.
+		 */
+		fd = -1;
+		bt_bap_stream_io_is_connecting(stream, &fd);
+		g_assert(fd == switch_cis_fd);
+		err = recv(data->fds[0][1], &buf, 1, MSG_DONTWAIT | MSG_PEEK);
+		g_assert(err < 0 && errno == EAGAIN);
+		break;
+	}
+}
+
+static struct test_config cfg_switch_cis = {
+	.cc = LC3_CONFIG_16_2,
+	.qos = LC3_QOS_16_2_1,
+	.snk = true,
+	.src = true,
+	.state_func = state_switch_cis,
+};
+
+/* Sink and Source ASE configured for the same CIS: the Source ASE is
+ * enabled, establishing the CIS, then disabled, and the Sink ASE is
+ * enabled right after, as when switching a headset from its microphone to
+ * its speaker. The Sink ASE has to start streaming over the same CIS, as
+ * the client does not establish it again.
+ */
+#define SCC_SWITCH_CIS \
+	DISC_SRC_ASE_LC3, \
+	SCC_SNK(LC3_CONFIG_16_2_DATA), \
+	SCC_SRC(LC3_CONFIG_16_2_DATA), \
+	QOS_SNK(QOS_16_2_1_DATA), \
+	QOS_SRC(QOS_16_2_1_DATA), \
+	SRC_ENABLE, \
+	SRC_DISABLE, \
+	ENABLE_ASE(SNK_ID(0)), \
+	SNK_ENABLE_NOTIFY(0, 0), \
+	SNK_START_NOTIFY(0, 0)
+
+static void test_usr_scc_switch_cis(void)
+{
+	define_test("BAP/USR/SCC/BLUEZ-4 [USR Switch direction of a CIS]",
+			test_setup_server, test_server_state,
+			&cfg_switch_cis, SCC_SWITCH_CIS);
+}
+
 static struct test_config str_snk_ac2_8_1_1 = {
 	.cc = LC3_CONFIG_8_1_AC(1),
 	.qos = LC3_QOS_8_1_1_AC(1),
@@ -7589,6 +7813,9 @@ static void test_scc(void)
 	test_scc_disable();
 	test_scc_release();
 	test_usr_scc_cis_loss();
+	test_usr_scc_release_link();
+	test_usr_scc_release_cis();
+	test_usr_scc_switch_cis();
 	test_scc_metadata();
 	test_str_1_1_1_lc3();
 }
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 4/5] doc/functional-bap: Document switching the direction of a CIS
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (2 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 3/5] unit/test-bap: Add tests for a CIS shared by two ASEs Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 5/5] test: functional: Cover " Luiz Augusto von Dentz
                   ` (16 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Describe the test where the initiator disables the Source ASE of the
acceptor and enables its Sink ASE right after, over the same CIS, as a
phone may do when switching a headset from its microphone to its
speaker.

Assisted-by: Claude:claude-opus-5-5
---
 doc/functional-bap.rst | 44 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/doc/functional-bap.rst b/doc/functional-bap.rst
index fc367e0f9181..5bbae3817062 100644
--- a/doc/functional-bap.rst
+++ b/doc/functional-bap.rst
@@ -269,6 +269,50 @@ test_bap_unicast_duplex_enable_one
 	made active through its link, so the test checks the state of the
 	transport rather than the result of the acquisition.
 
+test_bap_unicast_duplex_switch
+------------------------------
+
+:Setup: As above, with both transports created and linked, and
+	desynchronized on the initiator.
+
+:Steps:
+	1. Initiator: ``transport.acquire <source transport>``.
+	2. Initiator: ``transport.release <source transport>``, then right
+	   after ``transport.acquire <sink transport>``.
+	3. Initiator: ``transport.acquire <source transport>`` again, then
+	   ``transport.release <sink transport>``.
+	4. Initiator: ``transport.release <source transport>``, then
+	   ``transport.acquire <source transport>``.
+
+:Expected:
+	1. The Source ASE transport moves to ``State: active`` on both hosts.
+	2. The Source ASE transport moves back to ``State: idle`` and the
+	   Sink ASE one to ``State: active`` on both hosts, over the CIS
+	   established in step 1, which neither host disconnects while the
+	   Sink ASE is still configured for it: the acceptor is asked to
+	   accept a single CIS up to this point.
+	3. The Source ASE transport moves to ``State: active`` again on both
+	   hosts, and stays so when the Sink ASE transport moves to
+	   ``State: idle``: the CIS is kept for its last user, and the
+	   acceptor is still asked to accept a single CIS.
+	4. Once neither ASE is enabled the CIS is disconnected, and the
+	   Source ASE transport moves to ``State: active`` again on both
+	   hosts, over a new CIS: the acceptor is asked to accept a second
+	   one.
+
+:Notes: Reproduces a remote initiator, e.g. a phone in a voice call,
+	switching a headset from its microphone to its speaker over the
+	same CIS. An acceptor disconnecting the CIS when the Source ASE is
+	disabled leaves the Sink ASE enabled without a CIS, as the
+	initiator does not establish it again, so the Sink ASE transport
+	never becomes pending.
+
+	`bluetoothd` as initiator establishes a new CIS when needed, so the
+	switch still succeeds when the acceptor disconnects the CIS, over a
+	second one. The test tells them apart by counting the CIS requests
+	seen by the controller of the acceptor, recorded with `btmon`,
+	rather than by the states of the transports.
+
 BROADCAST
 =========
 
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 5/5] test: functional: Cover switching the direction of a CIS
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (3 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 4/5] doc/functional-bap: Document switching the direction of a CIS Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 0/6] bap: Release cached ASEs on ClearConfiguration Luiz Augusto von Dentz
                   ` (15 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Have the initiator enable the Source ASE of the acceptor alone, then
disable it and enable its Sink ASE right after, over the same CIS, and
check that the Sink ASE transport becomes active on both sides. Then
disable it as well and enable the Source ASE again, which needs a new
CIS.

bluetoothd as initiator establishes a new CIS when needed, so the
switch also succeeds when the acceptor disconnects the CIS. Count the
CIS requests seen by the controller of the acceptor, recorded with
btmon, and check that the acceptor is asked to accept a single one for
the switch.

Assisted-by: Claude:claude-opus-5-5
---
 test/functional/test_bap.py | 86 +++++++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)

diff --git a/test/functional/test_bap.py b/test/functional/test_bap.py
index 324304204caf..086fc8e44d23 100644
--- a/test/functional/test_bap.py
+++ b/test/functional/test_bap.py
@@ -733,6 +733,92 @@ def test_bap_unicast_duplex_enable_one(duplex_hosts):
         assert state == "active", f"{path} {state} once the Sink ASE released"
 
 
+@pytest.fixture
+def acceptor_cis_count(hosts):
+    """
+    Function telling how many CIS the acceptor (host1) was asked to accept so
+    far, which bluetoothd does not report to the test: btmon records what the
+    controller of the acceptor sees.
+    """
+    btmon = find_exe("monitor", "btmon")
+    trace = "/tmp/acceptor-cis.btsnoop"
+
+    host = hosts[1]
+    host.pexpect.spawn([btmon, "-w", trace])
+
+    # btmon has started recording once the trace has its header
+    ready = f"until [ -s {trace} ]; do sleep 0.1; done; echo ready"
+    with host.pexpect.spawn(["sh", "-c", ready]) as ctl:
+        ctl.expect("ready")
+
+    def count():
+        events = (
+            f"{btmon} -r {trace} -P | grep -c 'LE Connected Isochronous Stream Request'"
+        )
+        with host.pexpect.spawn(["sh", "-c", events]) as ctl:
+            _, m = ctl.expect(r"(\d+)\r?\n")
+            return int(m[0])
+
+    yield count
+
+
+@duplex_host_config
+def test_bap_unicast_duplex_switch(duplex_hosts, acceptor_cis_count):
+    initiator, acceptor, to_sink, from_source, sink, source = duplex_hosts
+
+    desync(initiator, to_sink, from_source)
+
+    # Enable the remote Source ASE alone, as for the microphone of a
+    # voice call
+    initiator.send(f"transport.acquire {from_source}\n")
+    expect_all(initiator, [ACQUIRED, f"Transport {from_source} State: active"])
+    expect_all(acceptor, [ACQUIRED, f"Transport {source} State: active"])
+    assert acceptor_cis_count() == 1
+
+    # Disable it and enable the Sink ASE right after, over the same CIS
+    initiator.send(f"transport.release {from_source}\n")
+    expect_all(
+        initiator, ["Release successful", f"Transport {from_source} State: idle"]
+    )
+    expect_all(acceptor, [f"Transport {source} State: idle"])
+
+    initiator.send(f"transport.acquire {to_sink}\n")
+    expect_all(initiator, [ACQUIRED, f"Transport {to_sink} State: active"])
+    expect_all(acceptor, [ACQUIRED, f"Transport {sink} State: active"])
+
+    # The Sink ASE streams over the CIS of the Source ASE: the acceptor must
+    # not disconnect it, as the initiator does not have to request it again
+    assert acceptor_cis_count() == 1, "CIS requested again for the Sink ASE"
+
+    # Enable the Source ASE again over the same CIS, and disable the Sink
+    # ASE: the CIS has to stay for the Source ASE, which still streams
+    initiator.send(f"transport.acquire {from_source}\n")
+    expect_all(initiator, [ACQUIRED, f"Transport {from_source} State: active"])
+    expect_all(acceptor, [ACQUIRED, f"Transport {source} State: active"])
+
+    initiator.send(f"transport.release {to_sink}\n")
+    expect_all(initiator, ["Release successful", f"Transport {to_sink} State: idle"])
+    expect_all(acceptor, [f"Transport {sink} State: idle"])
+
+    time.sleep(2)
+    state = show_state(acceptor, source)
+    assert state == "active", f"{source} {state} after disabling the Sink ASE"
+    assert acceptor_cis_count() == 1, "CIS requested again for the Source ASE"
+
+    # Once neither is enabled the CIS is disconnected, so enabling one
+    # again needs a new CIS on both sides
+    initiator.send(f"transport.release {from_source}\n")
+    expect_all(
+        initiator, ["Release successful", f"Transport {from_source} State: idle"]
+    )
+    expect_all(acceptor, [f"Transport {source} State: idle"])
+
+    initiator.send(f"transport.acquire {from_source}\n")
+    expect_all(initiator, [ACQUIRED, f"Transport {from_source} State: active"])
+    expect_all(acceptor, [ACQUIRED, f"Transport {source} State: active"])
+    assert acceptor_cis_count() == 2, "CIS not requested again after teardown"
+
+
 # Broadcast code used by the broadcast scripts, see BCAST_CODE in
 # client/player.c
 BCAST_CODE = (
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 0/6] bap: Release cached ASEs on ClearConfiguration
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (4 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 5/5] test: functional: Cover " Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/6] shared/bap: Add bt_bap_foreach_stream and bt_bap_stream_get_rpac Luiz Augusto von Dentz
                   ` (14 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

An acceptor may keep an ASE in Codec Configured, caching its codec
configuration, once the initiator removes the transport. The initiator
then has no way to get rid of it, as it no longer has a transport to
release.

Release such cached ASEs on ClearConfiguration of an endpoint, and add
endpoint.clear to bluetoothctl to exercise it, with a functional test.

This series is independent of the other two.

v2: Wait for the release of the cached ASEs before replying to
    ClearConfiguration, validate the transport path of endpoint.clear and
    update the remote PAC of an ASE when it is reused (new patch 2/6).

v3: Reply to ClearConfiguration once the cached ASEs are idle, and
    report a failed release as an error.
v2: Wait for the release of the cached ASEs before replying, validate the
    transport path of endpoint.clear and update the remote PAC of an ASE
    when it is reused (new patch 2/6).

Luiz Augusto von Dentz (6):
  shared/bap: Add bt_bap_foreach_stream and bt_bap_stream_get_rpac
  shared/bap: Update the remote PAC when reusing an ASE
  bap: Release cached ASEs on ClearConfiguration of an endpoint
  client/player: Add endpoint.clear command
  doc/functional-bap: Document clearing a cached configuration
  test: functional: Cover clearing a cached configuration

 client/player.c               |  57 ++++++++++++
 doc/bluetoothctl-endpoint.rst |  20 +++++
 doc/functional-bap.rst        |  24 +++++
 profiles/audio/bap.c          | 159 ++++++++++++++++++++++++++++++++--
 src/shared/bap.c              |  32 +++++++
 src/shared/bap.h              |   8 ++
 test/functional/test_bap.py   |  23 +++++
 7 files changed, 314 insertions(+), 9 deletions(-)

-- 
2.56.0


^ permalink raw reply	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 1/6] shared/bap: Add bt_bap_foreach_stream and bt_bap_stream_get_rpac
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (5 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 0/6] bap: Release cached ASEs on ClearConfiguration Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-12  2:06   ` [BlueZ,v3,1/6] " bluez.test.bot
  2026-11-11 20:37 ` [PATCH BlueZ v3 2/6] shared/bap: Update the remote PAC when reusing an ASE Luiz Augusto von Dentz
                   ` (13 subsequent siblings)
  20 siblings, 1 reply; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Allow iterating over the streams of a session and getting the remote
PAC of a stream, so streams can be found by their remote endpoint.

Assisted-by: Claude:claude-opus-5-5
---
 src/shared/bap.c | 31 +++++++++++++++++++++++++++++++
 src/shared/bap.h |  8 ++++++++
 2 files changed, 39 insertions(+)

diff --git a/src/shared/bap.c b/src/shared/bap.c
index 8cb7fb40f16c..e45d12144acb 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -4740,6 +4740,14 @@ bool bt_bap_stream_is_client(struct bt_bap_stream *stream)
 	return stream->client;
 }
 
+struct bt_bap_pac *bt_bap_stream_get_rpac(struct bt_bap_stream *stream)
+{
+	if (!stream)
+		return NULL;
+
+	return stream->rpac;
+}
+
 uint8_t bt_bap_stream_get_type(struct bt_bap_stream *stream)
 {
 	if (!stream)
@@ -7020,6 +7028,29 @@ struct bt_bap *bt_bap_stream_get_session(struct bt_bap_stream *stream)
 	return stream->bap;
 }
 
+struct stream_foreach_data {
+	bt_bap_stream_foreach_t func;
+	void *user_data;
+};
+
+static void stream_foreach(void *data, void *user_data)
+{
+	struct stream_foreach_data *d = user_data;
+
+	d->func(data, d->user_data);
+}
+
+void bt_bap_foreach_stream(struct bt_bap *bap, bt_bap_stream_foreach_t func,
+							void *user_data)
+{
+	struct stream_foreach_data d = { func, user_data };
+
+	if (!bap || !func)
+		return;
+
+	queue_foreach(bap->streams, stream_foreach, &d);
+}
+
 uint8_t bt_bap_stream_get_state(struct bt_bap_stream *stream)
 {
 	if (!stream)
diff --git a/src/shared/bap.h b/src/shared/bap.h
index 242bfbb39b30..00b74de0f272 100644
--- a/src/shared/bap.h
+++ b/src/shared/bap.h
@@ -124,6 +124,8 @@ uint8_t bt_bap_stream_get_type(struct bt_bap_stream *stream);
 
 bool bt_bap_stream_is_client(struct bt_bap_stream *stream);
 
+struct bt_bap_pac *bt_bap_stream_get_rpac(struct bt_bap_stream *stream);
+
 struct bt_bap_stream *bt_bap_pac_get_stream(struct bt_bap_pac *pac);
 
 /* Session related function */
@@ -172,6 +174,12 @@ const char *bt_bap_stream_statestr(uint8_t state);
 void bt_bap_foreach_pac(struct bt_bap *bap, uint8_t type,
 			bt_bap_pac_foreach_t func, void *user_data);
 
+typedef void (*bt_bap_stream_foreach_t)(struct bt_bap_stream *stream,
+							void *user_data);
+
+void bt_bap_foreach_stream(struct bt_bap *bap, bt_bap_stream_foreach_t func,
+							void *user_data);
+
 int bt_bap_pac_get_vendor_codec(struct bt_bap_pac *pac, uint8_t *id,
 				uint16_t *cid, uint16_t *vid,
 				struct iovec **data, struct iovec **metadata);
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 2/6] shared/bap: Update the remote PAC when reusing an ASE
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (6 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/6] shared/bap: Add bt_bap_foreach_stream and bt_bap_stream_get_rpac Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 3/6] bap: Release cached ASEs on ClearConfiguration of an endpoint Luiz Augusto von Dentz
                   ` (12 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

An ASE kept by a stream, e.g. one the server cached after its release,
may be reused for another remote PAC, which replaced the local PAC but
left the stream pointing to the previous remote one. Update it as well,
so that it matches the PAC the ASE is now configured for.

Assisted-by: Claude:claude-opus-5-5
---
 src/shared/bap.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/shared/bap.c b/src/shared/bap.c
index e45d12144acb..4fd4055565f7 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -6975,6 +6975,7 @@ static struct bt_bap_stream *bap_ucast_stream_new(struct bt_bap *bap,
 		 */
 		bap_stream_clear_cfm(stream);
 		stream->lpac = lpac;
+		stream->rpac = rpac;
 		util_iov_free(stream->cc, 1);
 		stream->cc = util_iov_dup(data, 1);
 		stream->need_reconfig = true;
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 3/6] bap: Release cached ASEs on ClearConfiguration of an endpoint
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (7 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 2/6] shared/bap: Update the remote PAC when reusing an ASE Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 4/6] client/player: Add endpoint.clear command Luiz Augusto von Dentz
                   ` (11 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Once a stream is released, the server may cache the codec configuration
of its ASE, leaving it in Codec Configured state, while the setup of
the stream is freed. ClearConfiguration only closed the streams that
have a setup, so it could not release such an ASE anymore.

When ClearConfiguration is given the path of the endpoint, also release
its streams in Codec Configured state that have no setup, as a client
may release an ASE in that state (ASCS Table 3.2, BAP 5.6.6).

Assisted-by: Claude:claude-opus-5-5
---
 profiles/audio/bap.c | 159 ++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 150 insertions(+), 9 deletions(-)

diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c
index a0e0ba60d817..507b910cf8ce 100644
--- a/profiles/audio/bap.c
+++ b/profiles/audio/bap.c
@@ -46,6 +46,7 @@
 #include "src/shared/gatt-client.h"
 #include "src/shared/gatt-server.h"
 #include "src/shared/bap.h"
+#include "src/shared/ascs.h"
 #include "src/shared/tmap.h"
 #include "src/shared/gmap.h"
 
@@ -138,6 +139,7 @@ struct bap_data {
 	struct queue *bcast;
 	struct queue *bcast_snks;
 	struct queue *server_streams;
+	struct queue *cached_releases;
 	GIOChannel *listen_io;
 	bool pa_synced;
 	unsigned int pa_timer;
@@ -149,6 +151,8 @@ struct bap_data {
 
 static struct queue *sessions;
 
+static void cached_release_cancel(void *data);
+
 static int setup_config(struct bap_setup *setup, bap_setup_ready_func_t cb,
 							void *user_data);
 static int bap_select_all(struct bap_data *data, bool reconfigure,
@@ -196,6 +200,7 @@ static void bap_data_free(struct bap_data *data)
 	queue_destroy(data->srcs, ep_unregister);
 	queue_destroy(data->bcast, ep_unregister);
 	queue_destroy(data->server_streams, NULL);
+	queue_destroy(data->cached_releases, cached_release_cancel);
 	data->bcast_snks = NULL;
 	queue_destroy(bcast_snks, setup_free);
 
@@ -996,8 +1001,9 @@ static int setup_close(struct bap_setup *setup, bap_setup_close_func_t cb,
 struct ep_close_data {
 	int remaining;
 	int count;
+	int err;
 	const char *path;
-	void (*cb)(int count, void *user_data);
+	void (*cb)(int count, int err, void *user_data);
 	void *user_data;
 };
 
@@ -1013,7 +1019,7 @@ static void ep_close_setup_cb(struct bap_setup *setup, void *user_data)
 		return;
 
 	if (epdata->cb)
-		epdata->cb(epdata->count, epdata->user_data);
+		epdata->cb(epdata->count, epdata->err, epdata->user_data);
 
 	free(epdata);
 }
@@ -1035,8 +1041,126 @@ static void ep_close_setup(void *data, void *user_data)
 		epdata->count++;
 }
 
+static struct bap_setup *bap_find_setup_by_stream(struct bap_data *data,
+					struct bt_bap_stream *stream);
+
+struct cached_release_data {
+	struct bap_ep *ep;
+	struct ep_close_data *epdata;
+};
+
+/* The release of a cached stream, done once the stream is idle */
+struct cached_release {
+	struct bt_bap_stream *stream;
+	struct ep_close_data *epdata;
+	int refs;
+	bool done;
+};
+
+static void cached_release_unref(struct cached_release *cr)
+{
+	if (--cr->refs)
+		return;
+
+	free(cr);
+}
+
+static void cached_release_done(struct cached_release *cr, int err)
+{
+	if (cr->done)
+		return;
+
+	cr->done = true;
+
+	if (err)
+		cr->epdata->err = err;
+
+	ep_close_setup_cb(NULL, cr->epdata);
+}
+
+static bool match_cached_release(const void *data, const void *match_data)
+{
+	const struct cached_release *cr = data;
+
+	return cr->stream == match_data;
+}
+
+static void bap_cached_release_idle(struct bap_data *data,
+					struct bt_bap_stream *stream)
+{
+	struct cached_release *cr;
+
+	cr = queue_remove_if(data->cached_releases, match_cached_release,
+								stream);
+	if (!cr)
+		return;
+
+	cached_release_done(cr, 0);
+	cached_release_unref(cr);
+}
+
+static void cached_release_cancel(void *data)
+{
+	struct cached_release *cr = data;
+
+	cached_release_done(cr, -ECANCELED);
+	cached_release_unref(cr);
+}
+
+static void ep_release_cached_cb(struct bt_bap_stream *stream, uint8_t code,
+					uint8_t reason, void *user_data)
+{
+	struct cached_release *cr = user_data;
+
+	/* The ASE is idle once it is notified, so only a failure completes
+	 * the release here.
+	 */
+	if (code != BT_ASCS_RSP_SUCCESS)
+		cached_release_done(cr, -EIO);
+
+	cached_release_unref(cr);
+}
+
+static void ep_release_cached(struct bt_bap_stream *stream, void *user_data)
+{
+	struct cached_release_data *data = user_data;
+	struct bap_ep *ep = data->ep;
+	struct cached_release *cr;
+
+	/* The server may have cached the codec configuration of a released
+	 * ASE, which has no setup anymore, so release it again.
+	 */
+	if (bt_bap_stream_get_rpac(stream) != ep->rpac ||
+			bt_bap_stream_get_state(stream) !=
+					BT_BAP_STREAM_STATE_CONFIG ||
+			bap_find_setup_by_stream(ep->data, stream))
+		return;
+
+	DBG("stream %p", stream);
+
+	cr = new0(struct cached_release, 1);
+	cr->stream = stream;
+	cr->epdata = data->epdata;
+	cr->refs = 2;
+
+	data->epdata->remaining++;
+
+	if (!ep->data->cached_releases)
+		ep->data->cached_releases = queue_new();
+
+	queue_push_tail(ep->data->cached_releases, cr);
+
+	if (!bt_bap_stream_release(stream, ep_release_cached_cb, cr)) {
+		queue_remove(ep->data->cached_releases, cr);
+		data->epdata->remaining--;
+		free(cr);
+	}
+}
+
 static void ep_close(struct bap_ep *ep, const char *transport_path,
-			void (*cb)(int count, void *user_data), void *user_data)
+			bool cached,
+			void (*cb)(int count, int err, void *user_data),
+			void *user_data)
 {
 	struct ep_close_data *epdata;
 
@@ -1051,6 +1175,15 @@ static void ep_close(struct bap_ep *ep, const char *transport_path,
 	if (ep)
 		queue_foreach(ep->setups, ep_close_setup, epdata);
 
+	/* The cached streams have to be released before replying, as an ASE
+	 * still being released can't be configured again.
+	 */
+	if (cached && ep && ep->rpac) {
+		struct cached_release_data data = { ep, epdata };
+
+		bt_bap_foreach_stream(ep->data->bap, ep_release_cached, &data);
+	}
+
 	epdata->path = NULL;
 	ep_close_setup_cb(NULL, epdata);
 }
@@ -1302,14 +1435,16 @@ struct clear_configuration_data {
 	bool all;
 };
 
-static void clear_configuration_cb(int count, void *user_data)
+static void clear_configuration_cb(int count, int err, void *user_data)
 {
 	struct clear_configuration_data *data = user_data;
 	DBusMessage *reply;
 
 	DBG("%p", data);
 
-	if (!data->all && count == 0)
+	if (err)
+		reply = btd_error_failed(data->msg, strerror(-err));
+	else if (!data->all && count == 0)
 		reply = btd_error_invalid_args(data->msg);
 	else
 		reply = dbus_message_new_method_return(data->msg);
@@ -1338,7 +1473,8 @@ static DBusMessage *clear_configuration(DBusConnection *conn, DBusMessage *msg,
 	cbdata->all = (path == NULL);
 
 	DBG("%p %s %s", cbdata, ep->path, path ? path : "NULL");
-	ep_close(ep, path, clear_configuration_cb, cbdata);
+
+	ep_close(ep, path, !path, clear_configuration_cb, cbdata);
 	return NULL;
 }
 
@@ -1403,7 +1539,7 @@ static void reconfigure_select_cb(int err, void *user_data)
 	free(data);
 }
 
-static void reconfigure_close_cb(int count, void *user_data)
+static void reconfigure_close_cb(int count, int err, void *user_data)
 {
 	struct reconfigure_data *data = user_data;
 
@@ -1424,7 +1560,7 @@ static void ep_close_if_reconfigure(void *obj, void *user_data)
 
 	if (ep->reconfigure) {
 		data->remaining++;
-		ep_close(ep, NULL, reconfigure_close_cb, data);
+		ep_close(ep, NULL, false, reconfigure_close_cb, data);
 	}
 }
 
@@ -1464,7 +1600,7 @@ static DBusMessage *reconfigure(DBusConnection *conn, DBusMessage *msg,
 	queue_foreach(data->snks, ep_close_if_reconfigure, cbdata);
 	queue_foreach(data->srcs, ep_close_if_reconfigure, cbdata);
 
-	reconfigure_close_cb(0, cbdata);
+	reconfigure_close_cb(0, 0, cbdata);
 	return NULL;
 }
 
@@ -3031,6 +3167,8 @@ static void bap_state(struct bt_bap_stream *stream, uint8_t old_state,
 			setup_free(setup);
 		else
 			queue_remove(data->server_streams, stream);
+
+		bap_cached_release_idle(data, stream);
 		break;
 	case BT_BAP_STREAM_STATE_CONFIG:
 		if (setup) {
@@ -4054,6 +4192,9 @@ static int bap_disconnect(struct btd_service *service)
 	queue_destroy(data->server_streams, NULL);
 	data->server_streams = NULL;
 
+	queue_destroy(data->cached_releases, cached_release_cancel);
+	data->cached_releases = NULL;
+
 	bt_bap_detach(data->bap);
 
 	btd_service_disconnecting_complete(service, 0);
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 4/6] client/player: Add endpoint.clear command
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (8 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 3/6] bap: Release cached ASEs on ClearConfiguration of an endpoint Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 5/6] doc/functional-bap: Document clearing a cached configuration Luiz Augusto von Dentz
                   ` (10 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Add a command calling ClearConfiguration on a remote endpoint, to close
the stream of a given transport or all the streams of the endpoint.

Assisted-by: Claude:claude-opus-5-5
---
 client/player.c               | 57 +++++++++++++++++++++++++++++++++++
 doc/bluetoothctl-endpoint.rst | 20 ++++++++++++
 2 files changed, 77 insertions(+)

diff --git a/client/player.c b/client/player.c
index 88221076c1e0..932338ef53a2 100644
--- a/client/player.c
+++ b/client/player.c
@@ -4030,6 +4030,60 @@ static void endpoint_set_config_bcast(struct endpoint_config *cfg)
 		config_endpoint_iso_group, cfg);
 }
 
+static void clear_endpoint_setup(DBusMessageIter *iter, void *user_data)
+{
+	const char *path = user_data;
+
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
+}
+
+static void clear_endpoint_reply(DBusMessage *message, void *user_data)
+{
+	DBusError error;
+
+	dbus_error_init(&error);
+
+	if (dbus_set_error_from_message(&error, message)) {
+		bt_shell_printf("Failed to clear configuration: %s\n",
+								error.name);
+		dbus_error_free(&error);
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+
+	bt_shell_printf("Configuration cleared\n");
+
+	return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+static void cmd_clear_endpoint(int argc, char *argv[])
+{
+	GDBusProxy *proxy;
+	const char *path;
+
+	proxy = g_dbus_proxy_lookup(endpoints, NULL, argv[1],
+						BLUEZ_MEDIA_ENDPOINT_INTERFACE);
+	if (!proxy) {
+		bt_shell_printf("Endpoint %s not found\n", argv[1]);
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+
+	/* The path of the endpoint itself clears all its transports */
+	path = argc > 2 ? argv[2] : g_dbus_proxy_get_path(proxy);
+
+	if (!dbus_validate_path(path, NULL)) {
+		bt_shell_printf("Invalid transport path %s\n", path);
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+
+	if (!g_dbus_proxy_method_call(proxy, "ClearConfiguration",
+					clear_endpoint_setup,
+					clear_endpoint_reply,
+					(void *) path, NULL)) {
+		bt_shell_printf("Failed to clear configuration\n");
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+}
+
 static void cmd_config_endpoint(int argc, char *argv[])
 {
 	struct endpoint_config *cfg;
@@ -4625,6 +4679,9 @@ static const struct bt_shell_menu endpoint_menu = {
 						cmd_config_endpoint,
 						"Configure Endpoint",
 						endpoint_generator },
+	{ "clear",        "<endpoint> [transport]", cmd_clear_endpoint,
+						"Clear Endpoint Configuration",
+						endpoint_generator },
 	{ "presets",      "<endpoint>/<UUID> [codec[:company]] [preset] "
 						"[codec config] [metadata]",
 						cmd_presets_endpoint,
diff --git a/doc/bluetoothctl-endpoint.rst b/doc/bluetoothctl-endpoint.rst
index 019e64e38452..ba30ef769ec4 100644
--- a/doc/bluetoothctl-endpoint.rst
+++ b/doc/bluetoothctl-endpoint.rst
@@ -154,6 +154,26 @@ Note:
 If the endpoint was registered by an audio server, it can't be configured from bluetoothctl.
 This must be done by the audio server as well.
 
+clear
+-----
+
+Clear Endpoint Configuration.
+
+:Usage: **> clear <endpoint> [transport]**
+:Uses: **org.bluez.MediaEndpoint(5)** method **ClearConfiguration**
+:<endpoint>: Path to the remote endpoint to clear
+:[transport]: Path to the transport whose stream to close (optional, all the
+	streams of the endpoint are closed if omitted)
+:Example Release all the streams of a remote endpoint:
+	| **> clear /org/bluez/hci0/dev_00_11_22_33_44_55/pac_sink0**
+:Example Release the stream of a single transport:
+	| **> clear /org/bluez/hci0/dev_00_11_22_33_44_55/pac_sink0 /org/bluez/hci0/dev_00_11_22_33_44_55/pac_sink0/fd0**
+
+Note:
+
+Clearing an endpoint whose codec configuration was cached by the remote, after
+its streams were released, releases them again.
+
 presets
 -------
 
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 5/6] doc/functional-bap: Document clearing a cached configuration
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (9 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 4/6] client/player: Add endpoint.clear command Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 6/6] test: functional: Cover " Luiz Augusto von Dentz
                   ` (9 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Describe the test where the initiator clears an endpoint twice, the
second time releasing the ASE whose codec configuration the acceptor
cached.

Assisted-by: Claude:claude-opus-5-5
---
 doc/functional-bap.rst | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/doc/functional-bap.rst b/doc/functional-bap.rst
index fc367e0f9181..eb04e6520aa8 100644
--- a/doc/functional-bap.rst
+++ b/doc/functional-bap.rst
@@ -230,6 +230,30 @@ test_bap_unicast_desync
 	single ASE of a CIS, so a failure of that one can be told apart
 	from a failure of the initiator to enable the ASEs separately.
 
+test_bap_unicast_clear_cached
+-----------------------------
+
+:Setup: As above, with both transports created.
+
+:Steps:
+	1. Initiator: ``endpoint.clear <remote PAC Source endpoint>``.
+	2. Initiator: ``endpoint.clear <remote PAC Source endpoint>`` again.
+
+:Expected:
+	1. ``Configuration cleared``, and the initiator removes the transport
+	   of the Source ASE, which the acceptor moves to Codec Configured,
+	   caching its codec configuration.
+	2. ``Configuration cleared``, and the initiator releases the Source
+	   ASE again from Codec Configured, so the acceptor moves it to Idle
+	   and removes its transport. The Sink ASE transports are left in
+	   ``State: idle``.
+
+:Notes: Releasing an ASE in the Codec Configured state is permitted
+	(ASCS Table 3.2, BAP 5.6.6) and is covered by BAP/UCL/SCC/BV-106-C
+	and BV-107-C. Without it, an initiator could not get rid of the
+	codec configuration an acceptor cached, as it no longer has a
+	transport for it.
+
 test_bap_unicast_duplex_enable_one
 ----------------------------------
 
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 6/6] test: functional: Cover clearing a cached configuration
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (10 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 5/6] doc/functional-bap: Document clearing a cached configuration Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 0/8] transport: Hand the owner over to a link still streaming Luiz Augusto von Dentz
                   ` (8 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Have the initiator clear its remote PAC Source endpoint twice, and
check that the acceptor removes the transport of the Source ASE once
released again from Codec Configured, leaving the Sink ASE alone.

Assisted-by: Claude:claude-opus-5-5
---
 test/functional/test_bap.py | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/test/functional/test_bap.py b/test/functional/test_bap.py
index 324304204caf..02f203b68667 100644
--- a/test/functional/test_bap.py
+++ b/test/functional/test_bap.py
@@ -698,6 +698,29 @@ def test_bap_unicast_desync(duplex_hosts):
     expect_all(initiator, [ACQUIRED, f"Transport {to_sink} State: active"])
 
 
+@duplex_host_config
+def test_bap_unicast_clear_cached(duplex_hosts):
+    initiator, acceptor, to_sink, from_source, sink, source = duplex_hosts
+
+    # Releasing the Source ASE removes the transport of the initiator,
+    # while the acceptor may cache the codec configuration of the ASE
+    remote = from_source.rsplit("/", 1)[0]
+    initiator.send(f"endpoint.clear {remote}\n")
+    expect_all(
+        initiator, [rf"DEL[^\]]*\] Transport {from_source}", "Configuration cleared"]
+    )
+
+    # Clearing it again releases the ASE from Codec Configured, so the
+    # acceptor does not keep it configured
+    initiator.send(f"endpoint.clear {remote}\n")
+    expect_all(initiator, ["Configuration cleared"])
+    expect_all(acceptor, [rf"DEL[^\]]*\] Transport {source}"])
+
+    # The other direction is left alone
+    assert show_state(acceptor, sink) == "idle"
+    assert show_state(initiator, to_sink) == "idle"
+
+
 @duplex_host_config
 def test_bap_unicast_duplex_enable_one(duplex_hosts):
     initiator, acceptor, to_sink, from_source, sink, source = duplex_hosts
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 0/8] transport: Hand the owner over to a link still streaming
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (11 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 6/6] test: functional: Cover " Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/8] " Luiz Augusto von Dentz
                   ` (7 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

When one ASE of a shared CIS is disabled alone, e.g. a microphone closed
while media keeps playing, the transport leaving streaming took the
owner, and so the state, of its linked transport with it: the audio
server stopped the stream of the other ASE while it kept receiving data.

Hand the owner over to a link still streaming instead (not while the
transport is being released or has a pending request), and clear the
owner of desynchronized links when removing it, which fixes a
use-after-free at teardown. A unit test and functional tests cover it.

This series applies on top of "shared/bap: Don't disconnect a CIS still
used by another ASE" (1-cis-switch), as the unit test reuses the test
helpers added there.

v2: Start the multiline comment of patch 3 on the line after /*. Rebased
    on v2 of the first series.

v3: Start the multiline comment of patch 1 on the line after /*, and
    rebase on v3 of the first series.
v2: Start the multiline comment of patch 3 on the line after /*.

Kannan J (2):
  transport: Hand the owner over to a link still streaming
  unit/test-bap: Add test for disabling one ASE of a shared CIS

Luiz Augusto von Dentz (6):
  transport: Clear the owner of desynchronized links when removing it
  transport: Don't hand the owner over while releasing
  doc/functional-bap: Document disabling one ASE of a shared owner
  test: functional: Cover disabling one ASE of a shared owner
  doc/functional-bap: Document releasing a shared owner
  test: functional: Cover releasing a shared owner

 doc/functional-bap.rst      | 58 ++++++++++++++++++++++++
 profiles/audio/transport.c  | 64 ++++++++++++++++++++++++--
 test/functional/test_bap.py | 66 +++++++++++++++++++++++++++
 unit/test-bap.c             | 90 +++++++++++++++++++++++++++++++++++++
 4 files changed, 275 insertions(+), 3 deletions(-)

-- 
2.56.0


^ permalink raw reply	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 1/8] transport: Hand the owner over to a link still streaming
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (12 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 0/8] transport: Hand the owner over to a link still streaming Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-12  2:13   ` [BlueZ,v3,1/8] " bluez.test.bot
  2026-11-11 20:37 ` [PATCH BlueZ v3 2/8] unit/test-bap: Add test for disabling one ASE of a shared CIS Luiz Augusto von Dentz
                   ` (6 subsequent siblings)
  20 siblings, 1 reply; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Kannan J <kannan.j@intel.com>

As a server, when the client enables both ASEs of a bidirectional CIS
the audio server acquires one transport and its link gets the same
owner. The client may then disable only one of the ASEs, e.g. the
Source ASE when the microphone is closed, while the Sink ASE keeps
streaming over the same CIS. Removing the owner of the disabled
transport then also cleared it from the link and freed it, and
suspending the transport set the link, no longer owned, to idle as
well:

  bap.c:ascs_ase_cp_write() Receiver Stop Ready
  transport.c:media_transport_remove_owner() fd1 Owner :1.1213
  transport.c:linked_transport_remove_owner() fd0 Owner :1.1213
  transport.c:transport_set_state() fd1: ACTIVE -> IDLE
  transport.c:transport_set_state() fd0: ACTIVE -> IDLE
  > org.bluez.MediaTransport1.Release
  < org.bluez.Error.NotAuthorized

The audio server stopped the stream of the Sink ASE, which kept
receiving data, and acquired it again on its next metadata update.

As a server, when a transport leaves streaming while a link sharing
its owner is still enabled, hand the owner over to the link and only
suspend the transport, so the link keeps its owner and its state.
---
 profiles/audio/transport.c | 54 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 52 insertions(+), 2 deletions(-)

diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 285db0d37554..279e378135ca 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
@@ -2431,6 +2431,54 @@ done:
 	return FALSE;
 }
 
+static bool match_link_shares_owner(const void *data, const void *user_data)
+{
+	struct bt_bap_stream *link = (void *)data;
+	struct media_transport *transport;
+
+	if (!bap_link_enabled(link))
+		return false;
+
+	transport = find_transport_by_bap_stream(link);
+
+	return transport && transport->owner == user_data;
+}
+
+/*
+ * As a server, the client disables each ASE of a shared CIS on its own, so a
+ * link still enabled keeps streaming and takes over the owner they shared.
+ */
+static bool bap_handover_owner(struct media_transport *transport)
+{
+	struct bap_transport *bap = transport->data;
+	struct media_owner *owner = transport->owner;
+	struct bt_bap_stream *stream;
+	struct media_transport *link;
+
+	if (!owner || !owner->watch || !bap->linked || bap->desync ||
+				bt_bap_stream_is_client(bap->stream))
+		return false;
+
+	stream = queue_find(bt_bap_stream_io_get_links(bap->stream),
+				match_link_shares_owner, owner);
+	if (!stream)
+		return false;
+
+	link = find_transport_by_bap_stream(stream);
+
+	DBG("Transport %s Owner %s handed over to %s", transport->path,
+						owner->name, link->path);
+
+	transport->owner = NULL;
+	if (owner->transport == transport)
+		owner->transport = link;
+
+	/* The link now has its own owner, so it keeps its state */
+	media_transport_suspend(transport, NULL);
+
+	return true;
+}
+
 static void bap_state_changed(struct bt_bap_stream *stream, uint8_t old_state,
 				uint8_t new_state, void *user_data)
 {
@@ -2460,7 +2508,8 @@ static void bap_state_changed(struct bt_bap_stream *stream, uint8_t old_state,
 			bap_update_qos(transport);
 		else if (bt_bap_stream_io_dir(stream) != BT_BAP_BCAST_SOURCE)
 			bap_update_bcast_qos(transport);
-		transport_update_playing(transport, FALSE);
+		if (!bap_handover_owner(transport))
+			transport_update_playing(transport, FALSE);
 		return;
 	case BT_BAP_STREAM_STATE_DISABLING:
 		return;
@@ -2480,7 +2529,8 @@ static void bap_state_changed(struct bt_bap_stream *stream, uint8_t old_state,
 	case BT_BAP_STREAM_STATE_RELEASING:
 		if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SINK)
 			return;
-		transport_update_playing(transport, FALSE);
+		if (!bap_handover_owner(transport))
+			transport_update_playing(transport, FALSE);
 		goto done;
 	}
 
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 2/8] unit/test-bap: Add test for disabling one ASE of a shared CIS
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (13 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/8] " Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-12  0:37   ` [BlueZ,v3,2/8] " bluez.test.bot
  2026-11-11 20:37 ` [PATCH BlueZ v3 3/8] transport: Clear the owner of desynchronized links when removing it Luiz Augusto von Dentz
                   ` (5 subsequent siblings)
  20 siblings, 1 reply; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Kannan J <kannan.j@intel.com>

Configure a Sink and a Source ASE for the same CIS and have both
streaming over it, then disable and stop only the Source ASE, as when
a call ends while media keeps playing. Once the Source ASE is back to
QoS Configured, the Sink ASE has to still be linked to it and streaming
over the same CIS, which has to stay connected.
---
 unit/test-bap.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 90 insertions(+)

diff --git a/unit/test-bap.c b/unit/test-bap.c
index 3713ad56c072..bfe98a885411 100644
--- a/unit/test-bap.c
+++ b/unit/test-bap.c
@@ -4952,6 +4952,95 @@ static void test_usr_scc_switch_cis(void)
 			&cfg_switch_cis, SCC_SWITCH_CIS);
 }
 
+static int disable_link_cis_fd = -1;
+
+static bool match_stream_dir(const void *data, const void *user_data)
+{
+	return bt_bap_stream_get_dir((void *)data) == PTR_TO_UINT(user_data);
+}
+
+static void state_disable_link(struct bt_bap_stream *stream,
+					uint8_t old_state, uint8_t new_state,
+					void *user_data)
+{
+	struct test_data *data = user_data;
+	struct bt_bap_stream *link;
+	char buf;
+	int fds[2];
+	int err;
+	int fd;
+
+	if (bt_bap_stream_get_dir(stream) != BT_BAP_SOURCE)
+		return;
+
+	switch (new_state) {
+	case BT_BAP_STREAM_STATE_ENABLING:
+		err = socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0,
+									fds);
+		g_assert(err == 0);
+		g_assert(bt_bap_stream_io_connecting(stream, fds[0]) == 0);
+		disable_link_cis_fd = fds[0];
+		data->fds[0][0] = fds[0];
+		data->fds[0][1] = fds[1];
+		break;
+	case BT_BAP_STREAM_STATE_QOS:
+		if (old_state != BT_BAP_STREAM_STATE_DISABLING)
+			return;
+
+		/* The Sink ASE is still streaming over the CIS, linked to the
+		 * Source ASE, so its transport has to stay acquired.
+		 */
+		link = queue_find(bt_bap_stream_io_get_links(stream),
+					match_stream_dir,
+					UINT_TO_PTR(BT_BAP_SINK));
+		g_assert(link);
+		g_assert(bt_bap_stream_get_state(link) ==
+					BT_BAP_STREAM_STATE_STREAMING);
+
+		fd = -1;
+		bt_bap_stream_io_is_connecting(link, &fd);
+		g_assert(fd == disable_link_cis_fd);
+		err = recv(data->fds[0][1], &buf, 1, MSG_DONTWAIT | MSG_PEEK);
+		g_assert(err < 0 && errno == EAGAIN);
+		break;
+	}
+}
+
+static struct test_config cfg_disable_link = {
+	.cc = LC3_CONFIG_16_2,
+	.qos = LC3_QOS_16_2_1,
+	.snk = true,
+	.src = true,
+	.state_func = state_disable_link,
+};
+
+/* Sink and Source ASE configured for the same CIS and both streaming: the
+ * Source ASE alone is disabled and stopped, as when a call ends while media
+ * keeps playing. The Sink ASE has to keep streaming over the same CIS.
+ */
+#define SCC_DISABLE_LINK \
+	DISC_SRC_ASE_LC3, \
+	SCC_SNK(LC3_CONFIG_16_2_DATA), \
+	SCC_SRC(LC3_CONFIG_16_2_DATA), \
+	QOS_SNK(QOS_16_2_1_DATA), \
+	QOS_SRC(QOS_16_2_1_DATA), \
+	SRC_ENABLE, \
+	SRC_START, \
+	ENABLE_ASE(SNK_ID(0)), \
+	SNK_ENABLE_NOTIFY(0, 0), \
+	SNK_START_NOTIFY(0, 0), \
+	SRC_DISABLE, \
+	IOV_DATA(0x52, CP_HND, 0x06, 0x01, SRC_ID(0)), \
+	ASE_CP_RSP(0x06, SRC_ID(0), 0x00, 0x00), \
+	QOS_SRC_NOTIFY(0, 0, QOS_16_2_1_DATA)
+
+static void test_usr_scc_disable_link(void)
+{
+	define_test("BAP/USR/SCC/BLUEZ-5 [USR Disable one ASE of a shared CIS]",
+			test_setup_server, test_server_state,
+			&cfg_disable_link, SCC_DISABLE_LINK);
+}
+
 static struct test_config str_snk_ac2_8_1_1 = {
 	.cc = LC3_CONFIG_8_1_AC(1),
 	.qos = LC3_QOS_8_1_1_AC(1),
@@ -7816,6 +7905,7 @@ static void test_scc(void)
 	test_usr_scc_release_link();
 	test_usr_scc_release_cis();
 	test_usr_scc_switch_cis();
+	test_usr_scc_disable_link();
 	test_scc_metadata();
 	test_str_1_1_1_lc3();
 }
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 3/8] transport: Clear the owner of desynchronized links when removing it
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (14 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 2/8] unit/test-bap: Add test for disabling one ASE of a shared CIS Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 4/8] transport: Don't hand the owner over while releasing Luiz Augusto von Dentz
                   ` (4 subsequent siblings)
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

The links of a transport are given its owner when it is acquired while
synchronized, but removing the owner only cleared them if the transport
was still synchronized. Setting Desynchronized in between left the links
with a pointer to the owner that was freed, which is used when the link
is freed in turn:

  media_request_reply() transport.c:282
  media_transport_remove_owner() transport.c:389
  media_transport_free() transport.c:1854

Clear the links that share the owner being removed regardless of
Desynchronized, as linked_transport_remove_owner() only does it for the
ones that actually have it.

Fixes: 1db06505df5a ("audio: Add ability to desynchronized linked transport")
Assisted-by: Claude:claude-opus-5-5
---
 profiles/audio/transport.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 279e378135ca..41aa8b78e3f3 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
@@ -370,7 +370,11 @@ static void transport_bap_remove_owner(struct media_transport *transport,
 {
 	struct bap_transport *bap = transport->data;
 
-	if (bap && bap->linked && !bap->desync)
+	/*
+	 * Also when desynchronized, as the links may have been given the owner
+	 * before, and the owner is about to be freed.
+	 */
+	if (bap && bap->linked)
 		queue_foreach(bt_bap_stream_io_get_links(bap->stream),
 				linked_transport_remove_owner, owner);
 }
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 4/8] transport: Don't hand the owner over while releasing
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (15 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 3/8] transport: Clear the owner of desynchronized links when removing it Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-12  0:37   ` [BlueZ,v3,4/8] " bluez.test.bot
  2026-11-11 20:37 ` [PATCH BlueZ v3 5/8] doc/functional-bap: Document disabling one ASE of a shared owner Luiz Augusto von Dentz
                   ` (3 subsequent siblings)
  20 siblings, 1 reply; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

As a server, handing the owner over to a link still streaming also
happened when the audio server released the transport. Release sets the
transport to suspending before disabling its ASE, and disabling a Sink
ASE reaches the handover synchronously, before the request of Release
is installed. The handover cleared the owner of the transport, so the
removal of the owner by Release did nothing, and the link, which kept
the owner, was left owned and never moved to idle:

  transport_set_state() fd0: ACTIVE -> SUSPENDING
  bap_handover_owner() fd1 Owner :1.2 handed over to fd0
  transport_set_state() fd1: SUSPENDING -> IDLE

Don't hand the owner over when the transport is being released, as
Release removes the owner itself, nor when the owner has a request
pending, as it would stay with the link although it was made through
the transport, which is the one that completes it.

Assisted-by: Claude:claude-opus-5-5
---
 profiles/audio/transport.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 41aa8b78e3f3..ad2fc2c1cbf5 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
@@ -2459,8 +2459,12 @@ static bool bap_handover_owner(struct media_transport *transport)
 	struct bt_bap_stream *stream;
 	struct media_transport *link;
 
-	if (!owner || !owner->watch || !bap->linked || bap->desync ||
-				bt_bap_stream_is_client(bap->stream))
+	/* A pending request is answered through its transport, and a transport
+	 * being released has its owner removed by Release itself.
+	 */
+	if (!owner || owner->pending || !owner->watch || !bap->linked ||
+			bap->desync || bt_bap_stream_is_client(bap->stream) ||
+			transport->state == TRANSPORT_STATE_SUSPENDING)
 		return false;
 
 	stream = queue_find(bt_bap_stream_io_get_links(bap->stream),
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 5/8] doc/functional-bap: Document disabling one ASE of a shared owner
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (16 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 4/8] transport: Don't hand the owner over while releasing Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-12  0:37   ` [BlueZ,v3,5/8] " bluez.test.bot
  2026-11-11 20:37 ` [PATCH BlueZ v3 6/8] test: functional: Cover " Luiz Augusto von Dentz
                   ` (2 subsequent siblings)
  20 siblings, 1 reply; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Describe the test where the audio server of the acceptor acquires one
transport of a bidirectional CIS, its link sharing the owner, and the
initiator then disables only the Source ASE.

Assisted-by: Claude:claude-opus-5-5
---
 doc/functional-bap.rst | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/doc/functional-bap.rst b/doc/functional-bap.rst
index 5bbae3817062..ca8e1ed14e2c 100644
--- a/doc/functional-bap.rst
+++ b/doc/functional-bap.rst
@@ -313,6 +313,39 @@ test_bap_unicast_duplex_switch
 	seen by the controller of the acceptor, recorded with `btmon`,
 	rather than by the states of the transports.
 
+test_bap_unicast_duplex_disable_one
+-----------------------------------
+
+:Setup: As above, with both transports created and linked.
+
+:Steps:
+	1. Initiator: ``transport.acquire <source transport>``, without
+	   desynchronizing, so both ASEs are enabled together.
+	2. Initiator: ``transport.desync <source transport> on``, then
+	   ``transport.release <source transport>``.
+	3. Acceptor: ``transport.show <sink transport>``.
+
+:Expected:
+	1. ``Acquire successful: fd <fd> MTU <read>:<write>`` on both hosts,
+	   and both transports of the acceptor move to ``State: active``:
+	   `bluetoothctl` acquires one of them as an audio server would,
+	   and its link shares the owner.
+	2. ``Release successful``, and the transport of the Source ASE moves
+	   to ``State: idle`` on both hosts.
+	3. The transport of the Sink ASE is still ``State: active``.
+
+:Notes: Reproduces a remote initiator, e.g. a phone ending a call,
+	disabling the Source ASE of a headset while the Sink ASE keeps
+	receiving media. The transport of the Source ASE leaving streaming
+	used to take the owner, and so the state, of its link with it: the
+	audio server stopped the stream of the Sink ASE, which kept
+	receiving data, and acquired it again on its next update.
+
+	The initiator has to acquire the transport without having set
+	``Desynchronized``, as that is what makes the acceptor share the
+	owner between the two transports, and set it only to disable the
+	ASEs one at a time.
+
 BROADCAST
 =========
 
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 6/8] test: functional: Cover disabling one ASE of a shared owner
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (17 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 5/8] doc/functional-bap: Document disabling one ASE of a shared owner Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-12  0:37   ` [BlueZ,v3,6/8] " bluez.test.bot
  2026-11-11 20:37 ` [PATCH BlueZ v3 7/8] doc/functional-bap: Document releasing " Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 8/8] test: functional: Cover " Luiz Augusto von Dentz
  20 siblings, 1 reply; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Have the initiator acquire the transport of the Source ASE without
desynchronizing, so both ASEs are enabled together and bluetoothctl on
the acceptor acquires one transport, as an audio server would, its link
sharing the owner. Then desynchronize and release the transport to
disable the Source ASE alone, as when a microphone is closed while media
keeps playing, and check that the transport of the Sink ASE stays
active, as its ASE keeps streaming.

Assisted-by: Claude:claude-opus-5-5
---
 test/functional/test_bap.py | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/test/functional/test_bap.py b/test/functional/test_bap.py
index 086fc8e44d23..13e969a4a845 100644
--- a/test/functional/test_bap.py
+++ b/test/functional/test_bap.py
@@ -819,6 +819,40 @@ def test_bap_unicast_duplex_switch(duplex_hosts, acceptor_cis_count):
     assert acceptor_cis_count() == 2, "CIS not requested again after teardown"
 
 
+@duplex_host_config
+def test_bap_unicast_duplex_disable_one(duplex_hosts):
+    initiator, acceptor, to_sink, from_source, sink, source = duplex_hosts
+
+    # Acquire the transport of the Source ASE without desynchronizing, so
+    # both ASEs are enabled together and bluetoothctl on the acceptor, as an
+    # audio server would, acquires one transport, whose link shares the
+    # owner
+    initiator.send(f"transport.acquire {from_source}\n")
+    expect_all(initiator, [ACQUIRED, f"Transport {from_source} State: active"])
+    expect_all(
+        acceptor,
+        [
+            ACQUIRED,
+            f"Transport {source} State: active",
+            f"Transport {sink} State: active",
+        ],
+    )
+
+    # Disable the Source ASE alone, as when a microphone is closed while
+    # media keeps playing
+    desync(initiator, to_sink, from_source)
+    initiator.send(f"transport.release {from_source}\n")
+    expect_all(
+        initiator, ["Release successful", f"Transport {from_source} State: idle"]
+    )
+    expect_all(acceptor, [f"Transport {source} State: idle"])
+
+    # The Sink ASE keeps streaming, so its transport has to stay active
+    time.sleep(2)
+    state = show_state(acceptor, sink)
+    assert state == "active", f"{sink} {state} while its ASE keeps streaming"
+
+
 # Broadcast code used by the broadcast scripts, see BCAST_CODE in
 # client/player.c
 BCAST_CODE = (
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 7/8] doc/functional-bap: Document releasing a shared owner
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (18 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 6/8] test: functional: Cover " Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  2026-11-11 20:37 ` [PATCH BlueZ v3 8/8] test: functional: Cover " Luiz Augusto von Dentz
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Describe the test where the audio server of the acceptor releases the
transport it acquired, whose link shares the owner.

Assisted-by: Claude:claude-opus-5-5
---
 doc/functional-bap.rst | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/doc/functional-bap.rst b/doc/functional-bap.rst
index ca8e1ed14e2c..739d64b7170f 100644
--- a/doc/functional-bap.rst
+++ b/doc/functional-bap.rst
@@ -346,6 +346,31 @@ test_bap_unicast_duplex_disable_one
 	owner between the two transports, and set it only to disable the
 	ASEs one at a time.
 
+test_bap_unicast_duplex_release_shared
+--------------------------------------
+
+:Setup: As above, with both transports created and linked.
+
+:Steps:
+	1. Initiator: ``transport.acquire <sink transport>``, without
+	   desynchronizing, so both ASEs are enabled together.
+	2. Acceptor: ``transport.release <sink transport>``.
+
+:Expected:
+	1. ``Acquire successful: fd <fd> MTU <read>:<write>`` on both hosts,
+	   and both transports of the acceptor move to ``State: active``:
+	   `bluetoothctl` acquires the Sink ASE one as an audio server
+	   would, and its link shares the owner.
+	2. ``Release successful``, and both transports of the acceptor move
+	   to ``State: idle``.
+
+:Notes: The audio server releasing the transport it acquired has to
+	release the linked one with it, even though a transport leaving
+	streaming hands its owner over to a link that is still streaming
+	(see the previous test): a transport that is being released has its
+	owner removed by ``Release`` itself, so the link, which shares it,
+	has to follow, or it stays owned and never goes idle.
+
 BROADCAST
 =========
 
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [PATCH BlueZ v3 8/8] test: functional: Cover releasing a shared owner
  2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
                   ` (19 preceding siblings ...)
  2026-11-11 20:37 ` [PATCH BlueZ v3 7/8] doc/functional-bap: Document releasing " Luiz Augusto von Dentz
@ 2026-11-11 20:37 ` Luiz Augusto von Dentz
  20 siblings, 0 replies; 29+ messages in thread
From: Luiz Augusto von Dentz @ 2026-11-11 20:37 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Have the initiator acquire the transport of the Sink ASE without
desynchronizing, so both ASEs are enabled together and bluetoothctl on
the acceptor acquires its transport, as an audio server would, its link
sharing the owner, then release it and check that both transports move
to idle.

Assisted-by: Claude:claude-opus-5-5
---
 test/functional/test_bap.py | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/test/functional/test_bap.py b/test/functional/test_bap.py
index 13e969a4a845..09bcfe9436ee 100644
--- a/test/functional/test_bap.py
+++ b/test/functional/test_bap.py
@@ -853,6 +853,38 @@ def test_bap_unicast_duplex_disable_one(duplex_hosts):
     assert state == "active", f"{sink} {state} while its ASE keeps streaming"
 
 
+@duplex_host_config
+def test_bap_unicast_duplex_release_shared(duplex_hosts):
+    initiator, acceptor, to_sink, from_source, sink, source = duplex_hosts
+
+    # Acquire the transport of the Sink ASE without desynchronizing, so both
+    # ASEs are enabled together and bluetoothctl on the acceptor, as an
+    # audio server would, acquires the Sink ASE transport, its link sharing
+    # the owner
+    initiator.send(f"transport.acquire {to_sink}\n")
+    expect_all(initiator, [ACQUIRED, f"Transport {to_sink} State: active"])
+    expect_all(
+        acceptor,
+        [
+            ACQUIRED,
+            f"Transport {source} State: active",
+            f"Transport {sink} State: active",
+        ],
+    )
+
+    # Release the transport it acquired: its link shares the owner, so it
+    # has to be released along with it
+    acceptor.send(f"transport.release {sink}\n")
+    expect_all(
+        acceptor,
+        [
+            "Release successful",
+            f"Transport {sink} State: idle",
+            f"Transport {source} State: idle",
+        ],
+    )
+
+
 # Broadcast code used by the broadcast scripts, see BCAST_CODE in
 # client/player.c
 BCAST_CODE = (
-- 
2.56.0


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* RE: shared/bap: Don't disconnect a CIS still used by another ASE
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/5] shared/bap: Don't disconnect a CIS still configured for a link Luiz Augusto von Dentz
@ 2026-11-12  0:37   ` bluez.test.bot
  0 siblings, 0 replies; 29+ messages in thread
From: bluez.test.bot @ 2026-11-12  0:37 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz

[-- Attachment #1: Type: text/plain, Size: 842 bytes --]

This is an automated email and please do not reply to this email.

Dear Submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
While preparing the CI tests, the patches you submitted couldn't be applied to the current HEAD of the repository.

----- Output -----

error: patch failed: doc/functional-bap.rst:346
error: doc/functional-bap.rst: patch does not apply
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"

Please resolve the issue and submit the patches again.


---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 29+ messages in thread

* RE: [BlueZ,v3,2/8] unit/test-bap: Add test for disabling one ASE of a shared CIS
  2026-11-11 20:37 ` [PATCH BlueZ v3 2/8] unit/test-bap: Add test for disabling one ASE of a shared CIS Luiz Augusto von Dentz
@ 2026-11-12  0:37   ` bluez.test.bot
  0 siblings, 0 replies; 29+ messages in thread
From: bluez.test.bot @ 2026-11-12  0:37 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz

[-- Attachment #1: Type: text/plain, Size: 829 bytes --]

This is an automated email and please do not reply to this email.

Dear Submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
While preparing the CI tests, the patches you submitted couldn't be applied to the current HEAD of the repository.

----- Output -----

error: patch failed: unit/test-bap.c:4952
error: unit/test-bap.c: patch does not apply
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"

Please resolve the issue and submit the patches again.


---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 29+ messages in thread

* RE: [BlueZ,v3,4/8] transport: Don't hand the owner over while releasing
  2026-11-11 20:37 ` [PATCH BlueZ v3 4/8] transport: Don't hand the owner over while releasing Luiz Augusto von Dentz
@ 2026-11-12  0:37   ` bluez.test.bot
  0 siblings, 0 replies; 29+ messages in thread
From: bluez.test.bot @ 2026-11-12  0:37 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz

[-- Attachment #1: Type: text/plain, Size: 851 bytes --]

This is an automated email and please do not reply to this email.

Dear Submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
While preparing the CI tests, the patches you submitted couldn't be applied to the current HEAD of the repository.

----- Output -----

error: patch failed: profiles/audio/transport.c:2459
error: profiles/audio/transport.c: patch does not apply
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"

Please resolve the issue and submit the patches again.


---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 29+ messages in thread

* RE: [BlueZ,v3,5/8] doc/functional-bap: Document disabling one ASE of a shared owner
  2026-11-11 20:37 ` [PATCH BlueZ v3 5/8] doc/functional-bap: Document disabling one ASE of a shared owner Luiz Augusto von Dentz
@ 2026-11-12  0:37   ` bluez.test.bot
  0 siblings, 0 replies; 29+ messages in thread
From: bluez.test.bot @ 2026-11-12  0:37 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz

[-- Attachment #1: Type: text/plain, Size: 842 bytes --]

This is an automated email and please do not reply to this email.

Dear Submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
While preparing the CI tests, the patches you submitted couldn't be applied to the current HEAD of the repository.

----- Output -----

error: patch failed: doc/functional-bap.rst:313
error: doc/functional-bap.rst: patch does not apply
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"

Please resolve the issue and submit the patches again.


---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 29+ messages in thread

* RE: [BlueZ,v3,6/8] test: functional: Cover disabling one ASE of a shared owner
  2026-11-11 20:37 ` [PATCH BlueZ v3 6/8] test: functional: Cover " Luiz Augusto von Dentz
@ 2026-11-12  0:37   ` bluez.test.bot
  0 siblings, 0 replies; 29+ messages in thread
From: bluez.test.bot @ 2026-11-12  0:37 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz

[-- Attachment #1: Type: text/plain, Size: 852 bytes --]

This is an automated email and please do not reply to this email.

Dear Submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
While preparing the CI tests, the patches you submitted couldn't be applied to the current HEAD of the repository.

----- Output -----

error: patch failed: test/functional/test_bap.py:819
error: test/functional/test_bap.py: patch does not apply
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"

Please resolve the issue and submit the patches again.


---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 29+ messages in thread

* RE: [BlueZ,v3,1/6] shared/bap: Add bt_bap_foreach_stream and bt_bap_stream_get_rpac
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/6] shared/bap: Add bt_bap_foreach_stream and bt_bap_stream_get_rpac Luiz Augusto von Dentz
@ 2026-11-12  2:06   ` bluez.test.bot
  0 siblings, 0 replies; 29+ messages in thread
From: bluez.test.bot @ 2026-11-12  2:06 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz

[-- Attachment #1: Type: text/plain, Size: 32259 bytes --]

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/series/1208728/

---Test result---

Test Summary:
CheckPatch                    PASS      0.49 seconds
GitLint                       PASS      0.33 seconds
BuildEll                      PASS      16.57 seconds
BluezMake                     PASS      234.81 seconds
MakeCheck                     PASS      12.70 seconds
MakeDistcheck                 PASS      122.24 seconds
CheckValgrind                 PASS      281.06 seconds
CheckSmatch                   WARNING   243.42 seconds
bluezmakeextell               PASS      82.40 seconds
TestFunctional                FAIL      3133.25 seconds
IncrementalBuild              PASS      258.00 seconds
ScanBuild                     PASS      902.23 seconds

Details
##############################
Test: CheckSmatch - WARNING
Desc: Run smatch tool with source
Output:
src/shared/bap.c:317:25: warning: array of flexible structuressrc/shared/bap.c: note: in included file:./src/shared/ascs.h:88:25: warning: array of flexible structuressrc/shared/bap.c:317:25: warning: array of flexible structuressrc/shared/bap.c: note: in included file:./src/shared/ascs.h:88:25: warning: array of flexible structuressrc/shared/bap.c:317:25: warning: array of flexible structuressrc/shared/bap.c: note: in included file:./src/shared/ascs.h:88:25: warning: array of flexible structures
##############################
Test: TestFunctional - FAIL
Desc: Run test-functional
Output:
FAIL functional.test_adv_monitor::test_adv_monitor_GHSA_hhgc_hfgf_8m4x[hosts1-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_show[hosts16-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_list[hosts16-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_script_show[hosts16-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_script_list[hosts16-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_btmgmt::test_btmgmt_info[hosts19-vm1]: AssertionError: assert 'addr 00:00:00:00:00:00' in '\x1b[0;91mReading hci0 info failed with status 0x11 (Invalid Index)\n\x1b[0m'
     +  where '\x1b[0;91mReading hci0 info failed with status 0x11 (Invalid Index)\n\x1b[0m' = CompletedProcess(args=['/home/runner/work/bluez/bluez/src/src/tools/btmgmt', '--index', '0', 'info'], returncode=0, stdout='\x1b[0;91mReading hci0 info failed with status 0x11 (Invalid Index)\n\x1b[0m').stdout
FAIL functional.test_a2dp::test_a2dp_transport_created[hosts0-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_a2dp::test_a2dp_transport_acquire[hosts0-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_a2dp::test_a2dp_disconnect_during_setconf[hosts0-vm2-accept]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_a2dp::test_a2dp_disconnect_during_setconf[hosts0-vm2-reject]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_a2dp::test_a2dp_reconnect_pending_disconnect[hosts0-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_connect[hosts12-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_conn_params[hosts12-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_connectable[hosts12-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_pair[hosts12-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_bredr_pair[hosts13-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_conn_update[hosts14-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_not_connectable[hosts15-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_pair_bredr[hosts17-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_pair_le[hosts18-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_agent::test_agent_pair_bredr[accept-hosts2-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_agent::test_agent_pair_bredr[reject-hosts2-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_hog::test_hog[no-sci-hosts20-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_hog::test_hog[sci-hosts20-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_mpris_proxy::test_mpris_proxy_playback_control[bredr-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_mpris_proxy::test_mpris_proxy_track_control[bredr-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_obex::test_obex_ftp_list[hosts24-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_obex::test_obex_ftp_get[hosts24-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_obex::test_obexctl_list[hosts24-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_avrcp::test_avrcp_GHSA_m2vx_pw5f_rc8v[hosts3-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_created[hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_acquire[hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_resume[0-hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_resume[0.1-hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_resume[1.0-hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_reconfigure_metadata[empty-hosts5-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_reconfigure_metadata[media-hosts5-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_desync[hosts6-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_duplex_enable_one[hosts6-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_transport_created[lc3-hosts7-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_transport_created[pbp-hosts7-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_transport_acquire[lc3-hosts7-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_transport_acquire[pbp-hosts7-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bass_past_transport_acquire[hosts9-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_set_transport_created[hosts10-vm3-sc]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_set_transport_created[hosts10-vm3-legacy]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_set_transport_acquire[hosts10-vm3]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bass_past_earbuds_transport_acquire[hosts11-vm3]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_earbuds_transport_created[hosts8-vm3]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_earbuds_transport_acquire[hosts8-vm3]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_mpris_proxy::test_mpris_proxy_playback_control[le-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_mpris_proxy::test_mpris_proxy_track_control[le-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"


https://github.com/bluez/bluez/pull/2802

---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 29+ messages in thread

* RE: [BlueZ,v3,1/8] transport: Hand the owner over to a link still streaming
  2026-11-11 20:37 ` [PATCH BlueZ v3 1/8] " Luiz Augusto von Dentz
@ 2026-11-12  2:13   ` bluez.test.bot
  0 siblings, 0 replies; 29+ messages in thread
From: bluez.test.bot @ 2026-11-12  2:13 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz

[-- Attachment #1: Type: text/plain, Size: 31656 bytes --]

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/series/1208733/

---Test result---

Test Summary:
CheckPatch                    PASS      0.42 seconds
GitLint                       PASS      0.29 seconds
BuildEll                      PASS      20.29 seconds
BluezMake                     PASS      290.73 seconds
MakeCheck                     PASS      2.96 seconds
MakeDistcheck                 PASS      146.38 seconds
CheckValgrind                 PASS      152.93 seconds
CheckSmatch                   PASS      289.98 seconds
bluezmakeextell               PASS      95.92 seconds
TestFunctional                FAIL      3234.47 seconds
IncrementalBuild              PASS      292.67 seconds
ScanBuild                     PASS      1066.55 seconds

Details
##############################
Test: TestFunctional - FAIL
Desc: Run test-functional
Output:
FAIL functional.test_adv_monitor::test_adv_monitor_GHSA_hhgc_hfgf_8m4x[hosts1-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_show[hosts16-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_list[hosts16-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_script_show[hosts16-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_script_list[hosts16-vm1]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_btmgmt::test_btmgmt_info[hosts19-vm1]: AssertionError: assert 'addr 00:00:00:00:00:00' in '\x1b[0;91mReading hci0 info failed with status 0x11 (Invalid Index)\n\x1b[0m'
     +  where '\x1b[0;91mReading hci0 info failed with status 0x11 (Invalid Index)\n\x1b[0m' = CompletedProcess(args=['/home/runner/work/bluez/bluez/src/src/tools/btmgmt', '--index', '0', 'info'], returncode=0, stdout='\x1b[0;91mReading hci0 info failed with status 0x11 (Invalid Index)\n\x1b[0m').stdout
FAIL functional.test_a2dp::test_a2dp_transport_created[hosts0-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_a2dp::test_a2dp_transport_acquire[hosts0-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_a2dp::test_a2dp_disconnect_during_setconf[hosts0-vm2-accept]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_a2dp::test_a2dp_disconnect_during_setconf[hosts0-vm2-reject]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_a2dp::test_a2dp_reconnect_pending_disconnect[hosts0-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_connect[hosts12-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_conn_params[hosts12-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_connectable[hosts12-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_pair[hosts12-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_bredr_pair[hosts13-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_conn_update[hosts14-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bearer::test_bearer_le_not_connectable[hosts15-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_pair_bredr[hosts17-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bluetoothctl::test_bluetoothctl_pair_le[hosts18-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_agent::test_agent_pair_bredr[accept-hosts2-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_agent::test_agent_pair_bredr[reject-hosts2-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_hog::test_hog[no-sci-hosts20-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_hog::test_hog[sci-hosts20-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_mpris_proxy::test_mpris_proxy_playback_control[bredr-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_mpris_proxy::test_mpris_proxy_track_control[bredr-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_obex::test_obex_ftp_list[hosts24-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_obex::test_obex_ftp_get[hosts24-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_obex::test_obexctl_list[hosts24-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_avrcp::test_avrcp_GHSA_m2vx_pw5f_rc8v[hosts3-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_created[hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_acquire[hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_resume[0-hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_resume[0.1-hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_transport_resume[1.0-hosts4-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_reconfigure_metadata[empty-hosts5-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_reconfigure_metadata[media-hosts5-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_desync[hosts6-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_duplex_enable_one[hosts6-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_transport_created[lc3-hosts7-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_transport_created[pbp-hosts7-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_transport_acquire[lc3-hosts7-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_transport_acquire[pbp-hosts7-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bass_past_transport_acquire[hosts9-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_set_transport_created[hosts10-vm3-sc]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_set_transport_created[hosts10-vm3-legacy]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_unicast_set_transport_acquire[hosts10-vm3]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bass_past_earbuds_transport_acquire[hosts11-vm3]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_earbuds_transport_created[hosts8-vm3]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_bap::test_bap_broadcast_earbuds_transport_acquire[hosts8-vm3]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_mpris_proxy::test_mpris_proxy_playback_control[le-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"
FAIL functional.test_mpris_proxy::test_mpris_proxy_track_control[le-vm2]: failed on setup with "pytest_bluezenv.rpc.RemoteError: load failed
    Remote traceback:
        Traceback (most recent call last):
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/rpc.py", line 102, in server_stream
            result = method(*msg["a"], **msg["kw"])
          File "/usr/local/lib/python3.14/dist-packages/pytest_bluezenv/../pytest_bluezenv/env.py", line 238, in wait_load
            raise RuntimeError("load failed")
        RuntimeError: load failed"


https://github.com/bluez/bluez/pull/2807

---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2026-11-12  2:13 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-11 20:37 [PATCH BlueZ v3 0/5] shared/bap: Don't disconnect a CIS still used by another ASE Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 1/5] shared/bap: Don't disconnect a CIS still configured for a link Luiz Augusto von Dentz
2026-11-12  0:37   ` shared/bap: Don't disconnect a CIS still used by another ASE bluez.test.bot
2026-11-11 20:37 ` [PATCH BlueZ v3 2/5] shared/bap: Hold the IO of a link when using it Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 3/5] unit/test-bap: Add tests for a CIS shared by two ASEs Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 4/5] doc/functional-bap: Document switching the direction of a CIS Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 5/5] test: functional: Cover " Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 0/6] bap: Release cached ASEs on ClearConfiguration Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 1/6] shared/bap: Add bt_bap_foreach_stream and bt_bap_stream_get_rpac Luiz Augusto von Dentz
2026-11-12  2:06   ` [BlueZ,v3,1/6] " bluez.test.bot
2026-11-11 20:37 ` [PATCH BlueZ v3 2/6] shared/bap: Update the remote PAC when reusing an ASE Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 3/6] bap: Release cached ASEs on ClearConfiguration of an endpoint Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 4/6] client/player: Add endpoint.clear command Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 5/6] doc/functional-bap: Document clearing a cached configuration Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 6/6] test: functional: Cover " Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 0/8] transport: Hand the owner over to a link still streaming Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 1/8] " Luiz Augusto von Dentz
2026-11-12  2:13   ` [BlueZ,v3,1/8] " bluez.test.bot
2026-11-11 20:37 ` [PATCH BlueZ v3 2/8] unit/test-bap: Add test for disabling one ASE of a shared CIS Luiz Augusto von Dentz
2026-11-12  0:37   ` [BlueZ,v3,2/8] " bluez.test.bot
2026-11-11 20:37 ` [PATCH BlueZ v3 3/8] transport: Clear the owner of desynchronized links when removing it Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 4/8] transport: Don't hand the owner over while releasing Luiz Augusto von Dentz
2026-11-12  0:37   ` [BlueZ,v3,4/8] " bluez.test.bot
2026-11-11 20:37 ` [PATCH BlueZ v3 5/8] doc/functional-bap: Document disabling one ASE of a shared owner Luiz Augusto von Dentz
2026-11-12  0:37   ` [BlueZ,v3,5/8] " bluez.test.bot
2026-11-11 20:37 ` [PATCH BlueZ v3 6/8] test: functional: Cover " Luiz Augusto von Dentz
2026-11-12  0:37   ` [BlueZ,v3,6/8] " bluez.test.bot
2026-11-11 20:37 ` [PATCH BlueZ v3 7/8] doc/functional-bap: Document releasing " Luiz Augusto von Dentz
2026-11-11 20:37 ` [PATCH BlueZ v3 8/8] test: functional: Cover " Luiz Augusto von Dentz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox