Re: [PATCH BlueZ bluez v3] bap: Start BIG sync after receiving BIGInfo

Yang Li <[email protected]> Wed, 29 Jul 2026 09:19:26 +0800
Newsgroups org.kernel.vger.linux-bluetooth
Message-ID <[email protected]>
Hi,
> [ EXTERNAL EMAIL ]
>
> On Tue, 2026-07-28 at 14:26 +0800, Yang Li via B4 Relay wrote:
>> From: Yang Li <[email protected]>
>>
>> The current implementation starts BIG sync before receiving a BIGInfo
>> report. According to the Bluetooth Core Specification, BIG sync
>> should
>> only be initiated after BIGInfo has been received.
>>
>> Starting BIG sync too early may cause unexpected controller behavior.
>>
>> Trigger BIG sync from the BIGInfo callback, following the same
>> approach
>> used by the short PA flow.
>>
>> Fixes: https://github.com/bluez/bluez/issues/2345
>>
>> Signed-off-by: Yang Li <[email protected]>
>> ---
>> Changes in v3:
>> - Fixed coding style warning.
>> - Link to v2:
>> https://patch.msgid.link/[email protected]
>>
>> Changes in v2:
>> - Fixed build error.
>> - Link to v1:
>> https://patch.msgid.link/[email protected]
>> ---
>>   profiles/audio/bap.c | 25 +++++++++++++++++++++----
>>   1 file changed, 21 insertions(+), 4 deletions(-)
>>
>> diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c
>> index dd4b3c8ff..473e4cfc2 100644
>> --- a/profiles/audio/bap.c
>> +++ b/profiles/audio/bap.c
>> @@ -3650,7 +3650,8 @@ static void setup_refresh_qos(void *data, void
>> *user_data)
>>        setup->qos = *bt_bap_stream_get_qos(stream);
>>   }
>>
>> -static void iso_do_big_sync(GIOChannel *io, void *user_data)
>> +static gboolean iso_do_big_sync(GIOChannel *io, GIOCondition cond,
>> +                                             void *user_data)
> The return here is for:
> "The function should return FALSE if the event source should be
> removed."
> Not success or failure.
>
> See:
> https://docs.gtk.org/glib/callback.IOFunc.html
> https://docs.gtk.org/glib/func.io_add_watch.html


Well, I got it, but this patch has been applied, I will send the new one 
to fix it.

>
>>   {
>>        GError *err = NULL;
>>        struct bap_setup *setup = user_data;
>> @@ -3659,7 +3660,7 @@ static void iso_do_big_sync(GIOChannel *io,
>> void *user_data)
>>        struct bt_iso_qos qos;
>>        struct queue *links = bt_bap_stream_io_get_links(setup-
>>> stream);
>> -     DBG("PA Sync done");
>> +     DBG("BIG info received, do BIG sync");
>>
>>        g_io_channel_unref(data->listen_io);
>>        g_io_channel_shutdown(data->listen_io, TRUE, NULL);
>> @@ -3682,6 +3683,7 @@ static void iso_do_big_sync(GIOChannel *io,
>> void *user_data)
>>                        BT_IO_OPT_INVALID)) {
>>                error("bt_io_set: %s", err->message);
>>                g_error_free(err);
>> +             return FALSE;
> This is wrong, this should be TRUE or better G_SOURCE_REMOVE.
>
>>        }
>>
>>        if (!bt_io_bcast_accept(io,
>> @@ -3692,16 +3694,31 @@ static void iso_do_big_sync(GIOChannel *io,
>> void *user_data)
>>                        iso_bc_addr.bc_bis, BT_IO_OPT_INVALID)) {
>>                error("bt_io_bcast_accept: %s", err->message);
>>                g_error_free(err);
>> +             return FALSE;
> Here too.
>
>>        }
>> +
>> +     return TRUE;
>> +}
>> +
>> +static void long_pa_sync_confirm_cb(GIOChannel *io, void *user_data)
>> +{
>> +     struct bap_setup *setup = user_data;
>> +     struct bap_data *data = setup->data;
>> +
>> +     DBG("Long PA Sync done");
>> +
>> +     /* store io and add watch that will call iso_do_big_sync */
>> +     data->io_id = g_io_add_watch(io, G_IO_OUT, iso_do_big_sync,
>> +                                                     setup);
>>   }
>>
>>   static void pa_and_big_sync(struct bap_setup *setup)
>>   {
>>        GError *err = NULL;
>>        struct bap_data *bap_data = setup->data;
>> -
>>        DBG("Create PA sync with this source");
>> -     bap_data->listen_io = bt_io_listen(NULL, iso_do_big_sync,
>> setup,
>> +
>> +     bap_data->listen_io = bt_io_listen(NULL,
>> long_pa_sync_confirm_cb, setup,
>>                        NULL, &err,
>>                        BT_IO_OPT_SOURCE_BDADDR,
>>                        btd_adapter_get_address(bap_data->adapter),
>>
>> ---
>> base-commit: 89d477bb5494eef0b24e5667be62f854da250a97
>> change-id: 20260724-big_sync-45c24ec09121
>>
>> Best regards,