diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2022-04-26 13:22:03 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2022-04-26 15:59:48 -0700 |
commit | 6da642225f5a4648efe538ee8723b1dd663cee3b (patch) | |
tree | bbff105dff4eb3ae0abea50d37c2abfd5ee5587f /monitor/packet.c | |
parent | 640d6b5c662d0f1c30f87bdb2be805fb40367c96 (diff) | |
download | bluez-6da642225f5a4648efe538ee8723b1dd663cee3b.tar.gz |
btmon: Add support for decoding Broadcast Audio Annoucements
This adds support for decoding Broadcast Audio Announcements as shown
on:
Basic Audio Profile / Profile Specification
Page 34 of 146
Table 3.14: Broadcast Source AD format when transmitting Broadcast
Audio Announcements
< HCI Command: LE Set Extended Advertising Data (0x08|0x0037) plen 36
Handle: 0x00
Operation: Complete extended advertising data (0x03)
Fragment preference: Minimize fragmentation (0x01)
Data length: 0x20
Service Data: Broadcast Audio Announcement (0x1852)
Broadcast ID: 904177 (0x0dcbf1)
Name (complete): Broadcast Audio Source
Diffstat (limited to 'monitor/packet.c')
-rw-r--r-- | monitor/packet.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/monitor/packet.c b/monitor/packet.c index 471b0dd4d..b376d5a8b 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -3301,11 +3301,44 @@ static void print_uuid128_list(const char *label, const void *data, } } +static void print_broadcast_annoucement(const uint8_t *data, uint8_t data_len) +{ + uint32_t bid; + + if (data_len < 3) { + print_hex_field(" Data", data, data_len); + return; + } + + bid = get_le24(data); + print_field("Broadcast ID: %u (0x%06x)", bid, bid); +} + +static const struct service_data_decoder { + uint16_t uuid; + void (*func)(const uint8_t *data, uint8_t data_len); +} service_data_decoders[] = { + { 0x1852, print_broadcast_annoucement } +}; + static void print_service_data(const uint8_t *data, uint8_t data_len) { uint16_t uuid = get_le16(&data[0]); + size_t i; print_field("Service Data: %s (0x%4.4x)", bt_uuid16_to_str(uuid), uuid); + + for (i = 0; i < ARRAY_SIZE(service_data_decoders); i++) { + const struct service_data_decoder *decoder; + + decoder = &service_data_decoders[i]; + + if (decoder->uuid == uuid) { + decoder->func(&data[2], data_len - 2); + return; + } + } + print_hex_field(" Data", &data[2], data_len - 2); } |