Re: [PATCH BlueZ bluez] BASS: support for encrypted broadcast source

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

> +
>         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.

>
> ---
> base-commit: 95b72bbf1fe42216d02a5ebb99bd18e9b69b6064
> change-id: 20250611-bass_for_encrypted_broadcast_source-f68417fdee73
>
> Best regards,
> --
> Yang Li <yang.li@xxxxxxxxxxx>
>
>
>


-- 
Luiz Augusto von Dentz





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux