Re: [PATCH v2 1/2] client: add public-broadcast advertising command

Luiz Augusto von Dentz
2026-04-24T14:44:12Z

Hi,

On Fri, Apr 24, 2026 at 10:19 AM raghu447 <raghavendra.rao@collabora.com> wrote:
>
> From: raghavendra <raghavendra.rao@collabora.com>
>
> ---
> client/advertising.c | 71 ++++++++++++++++++++++++++++++++++++++++++++
> client/advertising.h | 2 ++
> client/main.c | 19 ++++++++++++
> 3 files changed, 92 insertions(+)
>
> diff --git a/client/advertising.c b/client/advertising.c
> index f9df1b855..fc51f8193 100644
> --- a/client/advertising.c
> +++ b/client/advertising.c
> @@ -20,6 +20,9 @@
> #include <string.h>
> #include <errno.h>
>
> +#include "bluetooth/bluetooth.h"
> +#include "bluetooth/uuid.h"
> +
> #include "gdbus/gdbus.h"
> #include "src/shared/util.h"
> #include "src/shared/shell.h"
> @@ -27,6 +30,7 @@
>
> #define AD_PATH "/org/bluez/advertising"
> #define AD_IFACE "org.bluez.LEAdvertisement1"
> +#define AD_PUBLIC_BROADCAST_UUID "0x1856"

Forgot to mention, we don't seem to have a decoder for 0x1856, would
you like to create one so we can actually see what is being programmed
on btmon? That will probably require extending the
monitor/packet.c:service_data_decoders

> struct ad_data {
> uint8_t data[245];
> @@ -1005,6 +1009,73 @@ static void ad_clear_data(int type)
> memset(&ad.data[type], 0, sizeof(ad.data[type]));
> }
>
> +static bool ad_is_public_broadcast_uuid(const char *uuid)
> +{
> + return uuid && !bt_uuid_strcmp(uuid, AD_PUBLIC_BROADCAST_UUID);
> +}
> +
> +static const char *ad_public_broadcast_state(void)
> +{
> + if (!ad_is_public_broadcast_uuid(ad.service[AD_TYPE_AD].uuid))
> + return NULL;
> +
> + if (ad.service[AD_TYPE_AD].data.len != 2)
> + return NULL;
> +
> + if (ad.service[AD_TYPE_AD].data.data[0] == 0x02 &&
> + ad.service[AD_TYPE_AD].data.data[1] == 0x00)
> + return "sq";
> +
> + if (ad.service[AD_TYPE_AD].data.data[0] == 0x04 &&
> + ad.service[AD_TYPE_AD].data.data[1] == 0x00)
> + return "hq";
> +
> + return NULL;
> +}
> +
> +void ad_advertise_public_broadcast(DBusConnection *conn, int argc, char *argv[])
> +{
> + struct ad_data data = {
> + .data = { 0x00, 0x00 },
> + .len = 2,
> + };
> + const char *state;
> +
> + if (argc < 2) {
> + state = ad_public_broadcast_state();
> + if (state)
> + bt_shell_printf("Public Broadcast: %s\n", state);
> + else
> + bt_shell_printf("Public Broadcast not set\n");
> +
> + return bt_shell_noninteractive_quit(EXIT_SUCCESS);
> + }
> +
> + if (!strlen(argv[1])) {
> + bt_shell_printf("Public broadcast value cannot be empty\n");
> + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> + }
> +
> + if (!strcasecmp(argv[1], "sq"))
> + data.data[0] = 0x02;
> + else if (!strcasecmp(argv[1], "hq"))
> + data.data[0] = 0x04;
> + else {
> + bt_shell_printf("Invalid argument: accepted values are sq or hq\n");
> + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> + }
> +
> + ad_clear_service(AD_TYPE_AD);
> +
> + ad.service[AD_TYPE_AD].uuid = g_strdup(AD_PUBLIC_BROADCAST_UUID);
> + ad.service[AD_TYPE_AD].data = data;
> +
> + g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE,
> + prop_names.service[AD_TYPE_AD]);
> +
> + return bt_shell_noninteractive_quit(EXIT_SUCCESS);
> +}
> +
> void ad_advertise_data(DBusConnection *conn, int type, int argc, char *argv[])
> {
> char *endptr = NULL;
> diff --git a/client/advertising.h b/client/advertising.h
> index 9d124c7af..98f1bc524 100644
> --- a/client/advertising.h
> +++ b/client/advertising.h
> @@ -34,6 +34,8 @@ void ad_advertise_local_appearance(DBusConnection *conn, long int *value);
> void ad_advertise_duration(DBusConnection *conn, long int *value);
> void ad_advertise_timeout(DBusConnection *conn, long int *value);
> void ad_advertise_data(DBusConnection *conn, int type, int argc, char *argv[]);
> +void ad_advertise_public_broadcast(DBusConnection *conn, int argc,
> + char *argv[]);
> void ad_disable_data(DBusConnection *conn, int type);
> void ad_advertise_discoverable(DBusConnection *conn, dbus_bool_t *value);
> void ad_advertise_discoverable_timeout(DBusConnection *conn, long int *value);
> diff --git a/client/main.c b/client/main.c
> index 57fa13888..5fd21c80d 100644
> --- a/client/main.c
> +++ b/client/main.c
> @@ -2920,6 +2920,17 @@ static char *scan_generator(const char *text, int state)
> return argument_generator(text, state, scan_arguments);
> }
>
> +static const char *public_broadcast_arguments[] = {
> + "sq",
> + "hq",
> + NULL
> +};
> +
> +static char *public_broadcast_generator(const char *text, int state)
> +{
> + return argument_generator(text, state, public_broadcast_arguments);
> +}
> +
> static void cmd_advertise(int argc, char *argv[])
> {
> dbus_bool_t enable;
> @@ -2970,6 +2981,11 @@ static void cmd_advertise_data(int argc, char *argv[])
> ad_advertise_data(dbus_conn, AD_TYPE_AD, argc, argv);
> }
>
> +static void cmd_advertise_public_broadcast(int argc, char *argv[])
> +{
> + ad_advertise_public_broadcast(dbus_conn, argc, argv);
> +}
> +
> static void cmd_advertise_sr_uuids(int argc, char *argv[])
> {
> ad_advertise_uuids(dbus_conn, AD_TYPE_SRD, argc, argv);
> @@ -3653,6 +3669,9 @@ static const struct bt_shell_menu advertise_menu = {
> "Set/Get advertise manufacturer data" },
> { "data", "[type] [data=xx xx ...]", cmd_advertise_data,
> "Set/Get advertise data" },
> + { "public-broadcast", "[sq/hq]", cmd_advertise_public_broadcast,
> + "Set/Get BLE Audio Public Broadcast Announcement",
> + public_broadcast_generator },
> { "sr-uuids", "[uuid1 uuid2 ...]", cmd_advertise_sr_uuids,
> "Set/Get scan response uuids" },
> { "sr-solicit", "[uuid1 uuid2 ...]", cmd_advertise_sr_solicit,
> --
> 2.53.0
>
>

--
Luiz Augusto von Dentz