public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
From: "Frédéric Danis" <frederic.danis@collabora.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ] shared/bap: Fix endpoint configuration
Date: Fri, 20 Feb 2026 16:55:25 +0100	[thread overview]
Message-ID: <20260220155525.860822-1-frederic.danis@collabora.com> (raw)

When a first local endpoint is created after connection to a remote
device this doesn't trigger the SelectProperties request because
bt_bap_bac ops are not yet set when bt_bap_select() is called.
Creating a second local endpoint allows to trigger SelectProperties
request for the first endpoint.

This commit fixes this behavior by setting the ops during bt_bap_pac
creation.
---
 profiles/audio/media.c |  4 +---
 src/shared/bap.c       | 11 ++++++++---
 src/shared/bap.h       | 30 +++++++++++++++++-------------
 unit/test-bap.c        | 34 ++++++++++++++++------------------
 4 files changed, 42 insertions(+), 37 deletions(-)

diff --git a/profiles/audio/media.c b/profiles/audio/media.c
index 772af1014..0b88c46f1 100644
--- a/profiles/audio/media.c
+++ b/profiles/audio/media.c
@@ -1363,7 +1363,7 @@ static bool endpoint_init_pac(struct media_endpoint *endpoint, uint8_t type,
 
 	endpoint->pac = bt_bap_add_vendor_pac(db, name, type, endpoint->codec,
 				endpoint->cid, endpoint->vid, &endpoint->qos,
-				&data, metadata);
+				&data, metadata, &pac_ops, endpoint);
 	if (!endpoint->pac) {
 		error("Unable to create PAC");
 		free(name);
@@ -1371,8 +1371,6 @@ static bool endpoint_init_pac(struct media_endpoint *endpoint, uint8_t type,
 		return false;
 	}
 
-	bt_bap_pac_set_ops(endpoint->pac, &pac_ops, endpoint);
-
 	DBG("PAC %s registered", name);
 
 	free(name);
diff --git a/src/shared/bap.c b/src/shared/bap.c
index 37b04c5c1..549c43c34 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -4129,7 +4129,9 @@ struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
 					uint8_t id, uint16_t cid, uint16_t vid,
 					struct bt_bap_pac_qos *qos,
 					struct iovec *data,
-					struct iovec *metadata)
+					struct iovec *metadata,
+					struct bt_bap_pac_ops *ops,
+					void *ops_user_data)
 {
 	struct bt_bap_db *bdb;
 	struct bt_bap_pac *pac;
@@ -4150,6 +4152,7 @@ struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
 	codec.vid = vid;
 
 	pac = bap_pac_new(bdb, name, type, &codec, qos, data, metadata);
+	bt_bap_pac_set_ops(pac, ops, ops_user_data);
 
 	switch (type) {
 	case BT_BAP_SINK:
@@ -4178,10 +4181,12 @@ struct bt_bap_pac *bt_bap_add_pac(struct gatt_db *db, const char *name,
 					uint8_t type, uint8_t id,
 					struct bt_bap_pac_qos *qos,
 					struct iovec *data,
-					struct iovec *metadata)
+					struct iovec *metadata,
+					struct bt_bap_pac_ops *ops,
+					void *ops_user_data)
 {
 	return bt_bap_add_vendor_pac(db, name, type, id, 0x0000, 0x0000, qos,
-							data, metadata);
+					data, metadata, ops, ops_user_data);
 }
 
 uint8_t bt_bap_pac_get_type(struct bt_bap_pac *pac)
diff --git a/src/shared/bap.h b/src/shared/bap.h
index c1b75949f..f7e25a93c 100644
--- a/src/shared/bap.h
+++ b/src/shared/bap.h
@@ -67,19 +67,6 @@ struct bt_bap_pac_qos {
 	uint16_t context;
 };
 
-struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
-					const char *name, uint8_t type,
-					uint8_t id, uint16_t cid, uint16_t vid,
-					struct bt_bap_pac_qos *qos,
-					struct iovec *data,
-					struct iovec *metadata);
-
-struct bt_bap_pac *bt_bap_add_pac(struct gatt_db *db, const char *name,
-					uint8_t type, uint8_t id,
-					struct bt_bap_pac_qos *qos,
-					struct iovec *data,
-					struct iovec *metadata);
-
 struct bt_bap_pac_ops {
 	int (*select)(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac,
 			uint32_t chan_alloc, struct bt_bap_pac_qos *qos,
@@ -92,6 +79,23 @@ struct bt_bap_pac_ops {
 	void (*clear)(struct bt_bap_stream *stream, void *user_data);
 };
 
+struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
+					const char *name, uint8_t type,
+					uint8_t id, uint16_t cid, uint16_t vid,
+					struct bt_bap_pac_qos *qos,
+					struct iovec *data,
+					struct iovec *metadata,
+					struct bt_bap_pac_ops *ops,
+					void *ops_user_data);
+
+struct bt_bap_pac *bt_bap_add_pac(struct gatt_db *db, const char *name,
+					uint8_t type, uint8_t id,
+					struct bt_bap_pac_qos *qos,
+					struct iovec *data,
+					struct iovec *metadata,
+					struct bt_bap_pac_ops *ops,
+					void *ops_user_data);
+
 bool bt_bap_pac_set_ops(struct bt_bap_pac *pac, struct bt_bap_pac_ops *ops,
 					void *user_data);
 
diff --git a/unit/test-bap.c b/unit/test-bap.c
index 3a67e7016..ab3996e22 100644
--- a/unit/test-bap.c
+++ b/unit/test-bap.c
@@ -686,12 +686,12 @@ static void test_setup_pacs(struct test_data *data)
 							BT_BAP_SINK, 0x0ff,
 							0x0001, 0x0001,
 							data->qos, data->caps,
-							NULL);
+							NULL, NULL, NULL);
 		else
 			data->snk = bt_bap_add_pac(data->db, "test-bap-snk",
 							BT_BAP_SINK, LC3_ID,
 							data->qos, data->caps,
-							NULL);
+							NULL, NULL, NULL);
 		g_assert(data->snk);
 	}
 
@@ -702,12 +702,12 @@ static void test_setup_pacs(struct test_data *data)
 							BT_BAP_SOURCE, 0x0ff,
 							0x0001, 0x0001,
 							data->qos, data->caps,
-							NULL);
+							NULL, NULL, NULL);
 		else
 			data->src = bt_bap_add_pac(data->db, "test-bap-src",
 							BT_BAP_SOURCE, LC3_ID,
 							data->qos, data->caps,
-							NULL);
+							NULL, NULL, NULL);
 		g_assert(data->src);
 	}
 }
@@ -753,30 +753,28 @@ static void test_setup_server(const void *user_data)
 		data->snk = bt_bap_add_vendor_pac(db, "test-bap-snk",
 							BT_BAP_SINK, 0x0ff,
 							0x0001, 0x0001,
-							data->qos, NULL,
-							NULL);
+							data->qos, NULL, NULL,
+							&ucast_pac_ops, NULL);
 	else
 		data->snk = bt_bap_add_pac(db, "test-bap-snk", BT_BAP_SINK,
 							LC3_ID, data->qos,
-							data->caps, NULL);
+							data->caps, NULL,
+							&ucast_pac_ops, NULL);
 	g_assert(data->snk);
 
-	bt_bap_pac_set_ops(data->snk, &ucast_pac_ops, NULL);
-
 	if (data->cfg && data->cfg->vs)
 		data->src = bt_bap_add_vendor_pac(db, "test-bap-snk",
 							BT_BAP_SOURCE, 0x0ff,
 							0x0001, 0x0001,
-							data->qos, NULL,
-							NULL);
+							data->qos, NULL, NULL,
+							&ucast_pac_ops, NULL);
 	else
 		data->src = bt_bap_add_pac(db, "test-bap-src", BT_BAP_SOURCE,
 							LC3_ID, data->qos,
-							data->caps, NULL);
+							data->caps, NULL,
+							&ucast_pac_ops, NULL);
 	g_assert(data->src);
 
-	bt_bap_pac_set_ops(data->src, &ucast_pac_ops, NULL);
-
 	att = bt_att_new(io_get_fd(io), false);
 	g_assert(att);
 
@@ -1052,13 +1050,13 @@ static void test_bcast_config(struct test_data *data)
 							BT_BAP_BCAST_SOURCE,
 							0x0ff, 0x0000, 0x0000,
 							NULL, data->caps,
-							NULL);
+							NULL, NULL, NULL);
 		else
 			data->bsrc = bt_bap_add_pac(data->db, "test-bap-bsrc",
 							BT_BAP_BCAST_SOURCE,
 							LC3_ID,
 							NULL, data->caps,
-							NULL);
+							NULL, NULL, NULL);
 
 		g_assert(data->bsrc);
 	}
@@ -1073,13 +1071,13 @@ static void test_bcast_config(struct test_data *data)
 							BT_BAP_BCAST_SINK,
 							0xff, 0x0000, 0x0000,
 							NULL, data->caps,
-							NULL);
+							NULL, NULL, NULL);
 		else
 			data->bsnk = bt_bap_add_pac(data->db, "test-bap-bsnk",
 							BT_BAP_BCAST_SINK,
 							LC3_ID,
 							NULL, data->caps,
-							NULL);
+							NULL, NULL, NULL);
 
 		g_assert(data->bsnk);
 	}
-- 
2.43.0


             reply	other threads:[~2026-02-20 15:55 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-20 15:55 Frédéric Danis [this message]
2026-02-20 17:06 ` [BlueZ] shared/bap: Fix endpoint configuration bluez.test.bot
2026-02-20 17:30 ` [PATCH BlueZ] " Luiz Augusto von Dentz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260220155525.860822-1-frederic.danis@collabora.com \
    --to=frederic.danis@collabora.com \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox