Hi Luiz,
[ EXTERNAL EMAIL ]
Hi,
On Wed, Jun 11, 2025 at 4:57 AM Yang Li via B4 Relay
<devnull+yang.li.amlogic.com@xxxxxxxxxx> wrote:
From: Yang Li <yang.li@xxxxxxxxxxx>
If the BIS is encrypted as indicated in the BIG Info Report, the
broadcast code needs to be requested from the Assistant.
step 1: Broadcast_Code required
> HCI Event: LE Meta Event (0x3e) plen 20 #631 [hci0] 27.176606
LE Broadcast Isochronous Group Info Advertising Report (0x22)
Sync Handle: 0x0000
Number BIS: 2
NSE: 8
ISO Interval: 20.00 msec (0x0010)
BN: 2
PTO: 2
IRC: 2
Maximum PDU: 60
SDU Interval: 10000 us (0x002710)
Maximum SDU: 60
PHY: LE 2M (0x02)
Framing: Unframed (0x00)
Encryption: 0x01
< ACL Data TX: Handle 16 flags 0x00 dlen 44 #633 [hci0] 27.184478
ATT: Handle Value Notification (0x1b) len 39
Handle: 0x005f Type: Broadcast Receive State (0x2bc8)
Data[37]: 01016698a411bb13019f103b02010100000000110d03506978656c20395f32303938020502
Source_ID: 1
Source_Address_Type: 1
Source_Address: 13:BB:11:A4:98:66
Source_Adv_SID: 1
Broadcast_ID: 0x3b109f
PA_Sync_State: Synchronized to PA
BIG_Encryption: Broadcast_Code required
Num_Subgroups: 1
Subgroup #0:
BIS_Sync State: 0x00000000
Metadata: #0: len 0x0d type 0x03
Metadata: 50 69 78 65 6c 20 39 5f 32 30 39 38 Pixel 9_2098
Metadata: #1: len 0x02 type 0x05
Metadata: 02
> ACL Data RX: Handle 16 flags 0x02 dlen 25 #636 [hci0] 27.455744
ATT: Write Command (0x52) len 20
Handle: 0x0065 Type: Broadcast Audio Scan Control Point (0x2bc7)
Data[18]: 04013a4931614b3a2b7c4b7431722b666724
Opcode: Set Broadcast_Code (0x04)
Source_ID: 1
Broadcast_Code[16]: 3a4931614b3a2b7c4b7431722b666724
step 2: Set Broadcast Code when BIG Create Sync
< HCI Command: LE Broadcast Isoc.. (0x08|0x006b) plen 26 #641 [hci0] 27.669211
BIG Handle: 0x00
BIG Sync Handle: 0x0000
Encryption: Encrypted (0x01)
Broadcast Code[16]: 3a4931614b3a2b7c4b7431722b666724
Maximum Number Subevents: 0x00
Timeout: 20000 ms (0x07d0)
Number of BIS: 2
BIS ID: 0x01
BIS ID: 0x02
Fixes: https://github.com/bluez/bluez/issues/1306
---
Signed-off-by: Yang Li <yang.li@xxxxxxxxxxx>
---
profiles/audio/bass.c | 29 +++++++++++++++++++++++++++++
src/shared/bass.c | 29 ++++++++++++++---------------
2 files changed, 43 insertions(+), 15 deletions(-)
diff --git a/profiles/audio/bass.c b/profiles/audio/bass.c
index b27a3fc12..53fde43d6 100644
--- a/profiles/audio/bass.c
+++ b/profiles/audio/bass.c
@@ -427,13 +427,42 @@ static void bap_state_changed(struct bt_bap_stream *stream, uint8_t old_state,
}
}
+static void bass_req_bcode_cb(void *user_data, int err)
+{
+ struct bass_setup *setup = user_data;
+
+ if (!err) {
+ if (asprintf(&setup->path, "%s/bis%d",
+ device_get_path(setup->dg->device),
+ setup->bis) < 0)
+ return;
+
+ bt_bap_stream_set_user_data(setup->stream, setup->path);
+
+ bt_bap_stream_config(setup->stream, &setup->qos,
+ setup->config, NULL, NULL);
+ bt_bap_stream_metadata(setup->stream, setup->meta,
+ NULL, NULL);
+ }
+}
+
static void setup_configure_stream(struct bass_setup *setup)
{
+ uint8_t empty_bcode[BT_BASS_BCAST_CODE_SIZE] = {0};
+
setup->stream = bt_bap_stream_new(setup->dg->bap, setup->lpac, NULL,
&setup->qos, setup->config);
if (!setup->stream)
return;
+ if ((setup->qos.bcast.encryption) &&
+ (!memcmp(setup->qos.bcast.bcode->iov_base,
+ empty_bcode,
+ sizeof(empty_bcode)))) {
+ bass_req_bcode(setup->stream, bass_req_bcode_cb, setup, NULL);
+ return;
+ }
Let's add a comment on why we should ask for the bcode at this stage.
Will do.
+
if (asprintf(&setup->path, "%s/bis%d",
device_get_path(setup->dg->device),
setup->bis) < 0)
diff --git a/src/shared/bass.c b/src/shared/bass.c
index 7b9e0da63..11ad59e3b 100644
--- a/src/shared/bass.c
+++ b/src/shared/bass.c
@@ -964,6 +964,20 @@ static void bass_handle_set_bcast_code_op(struct bt_bass *bass,
gatt_db_attribute_write_result(attrib, id, 0x00);
+ for (entry = queue_get_entries(bass->cp_handlers); entry;
+ entry = entry->next) {
+ struct bt_bass_cp_handler *cb = entry->data;
+
+ if (cb->handler) {
+ ret = cb->handler(bcast_src,
+ BT_BASS_SET_BCAST_CODE,
+ params, cb->data);
+ if (ret)
+ DBG(bass, "Unable to handle Set "
+ "Broadcast Code operation");
+ }
+ }
+
if (!bass_trigger_big_sync(bcast_src)) {
bcast_src->enc = BT_BASS_BIG_ENC_STATE_DEC;
@@ -977,21 +991,6 @@ static void bass_handle_set_bcast_code_op(struct bt_bass *bass,
free(notif->iov_base);
free(notif);
- return;
- }
-
- for (entry = queue_get_entries(bass->cp_handlers); entry;
- entry = entry->next) {
- struct bt_bass_cp_handler *cb = entry->data;
-
- if (cb->handler) {
- ret = cb->handler(bcast_src,
- BT_BASS_SET_BCAST_CODE,
- params, cb->data);
- if (ret)
- DBG(bass, "Unable to handle Set "
- "Broadcast Code operation");
- }
}
}
Changes to shared shall be on its own patch, also please add some
explanation why you are moving the code above on the patch
description.
I will submit the modification of shared/bass.c in a separate commit.
There are two reasons for moving cb->handle earlier:
1. If the function returns directly in the attribute_notify section,
cb->handle may not be executed;
2. Executing cb->handle earlier allows the stream status to be processed
before notifying the client, saving time in the subsequent stream
processing.
---
base-commit: 95b72bbf1fe42216d02a5ebb99bd18e9b69b6064
change-id: 20250611-bass_for_encrypted_broadcast_source-f68417fdee73
Best regards,
--
Yang Li <yang.li@xxxxxxxxxxx>
--
Luiz Augusto von Dentz