Skip to content

Commit 913012a

Browse files
Frodevanfabiobaltieri
authored andcommitted
tests: bluetooth: tester: Add PBP support
Implements the PBP commands of the BTP specs, in order to support testing the PBP through autopts. This PR is in conjunction with the following PR in AutoPTS: auto-pts/auto-pts#1356 Signed-off-by: Frode van der Meeren <frode.vandermeeren@nordicsemi.no>
1 parent 23232e6 commit 913012a

File tree

8 files changed

+384
-29
lines changed

8 files changed

+384
-29
lines changed

tests/bluetooth/tester/overlay-le-audio.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,3 +167,6 @@ CONFIG_BT_TBS_SUPPORTED_FEATURES=3
167167

168168
# TMAP
169169
CONFIG_BT_TMAP=y
170+
171+
# PBP
172+
CONFIG_BT_PBP=y

tests/bluetooth/tester/src/audio/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,7 @@ endif()
6767
if(CONFIG_BT_TMAP)
6868
target_sources(app PRIVATE btp_tmap.c)
6969
endif()
70+
71+
if(CONFIG_BT_PBP)
72+
target_sources(app PRIVATE btp_pbp.c)
73+
endif()
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/* btp_pbp.c - Bluetooth PBP Tester */
2+
3+
/*
4+
* Copyright (c) 2025 Nordic Semiconductor ASA
5+
*
6+
* SPDX-License-Identifier: Apache-2.0
7+
*/
8+
9+
/* This is main.h */
10+
11+
#define BTP_PBP_READ_SUPPORTED_COMMANDS 0x01
12+
struct btp_pbp_read_supported_commands_rp {
13+
uint8_t data[0];
14+
} __packed;
15+
16+
#define BTP_PBP_SET_PUBLIC_BROADCAST_ANNOUNCEMENT 0x02
17+
struct btp_pbp_set_public_broadcast_announcement_cmd {
18+
uint8_t features;
19+
uint8_t metadata_len;
20+
uint8_t metadata[];
21+
} __packed;
22+
23+
#define BTP_PBP_SET_BROADCAST_NAME 0x03
24+
struct btp_pbp_set_broadcast_name_cmd {
25+
uint8_t name_len;
26+
uint8_t name[];
27+
} __packed;
28+
29+
#define BTP_PBP_BROADCAST_SCAN_START 0x04
30+
struct btp_pbp_broadcast_scan_start_cmd {
31+
} __packed;
32+
33+
#define BTP_PBP_BROADCAST_SCAN_STOP 0x05
34+
struct btp_pbp_broadcast_scan_stop_cmd {
35+
} __packed;
36+
37+
#define BTP_PBP_EV_PUBLIC_BROADCAST_ANOUNCEMENT_FOUND 0x80
38+
struct btp_pbp_ev_public_broadcast_anouncement_found_rp {
39+
bt_addr_le_t address;
40+
uint8_t broadcast_id[BT_AUDIO_BROADCAST_ID_SIZE];
41+
uint8_t advertiser_sid;
42+
uint16_t padv_interval;
43+
uint8_t pba_features;
44+
uint8_t broadcast_name_len;
45+
uint8_t broadcast_name[];
46+
} __packed;

tests/bluetooth/tester/src/audio/btp_cap.c

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -533,40 +533,37 @@ static int cap_broadcast_source_adv_setup(struct btp_bap_broadcast_local_source
533533
uint32_t *gap_settings)
534534
{
535535
int err;
536-
struct bt_le_adv_param param = *BT_LE_EXT_ADV_NCONN;
537-
uint32_t broadcast_id;
538536

539-
NET_BUF_SIMPLE_DEFINE(ad_buf, BT_UUID_SIZE_16 + BT_AUDIO_BROADCAST_ID_SIZE);
540537
NET_BUF_SIMPLE_DEFINE(base_buf, 128);
541538

542539
/* Broadcast Audio Streaming Endpoint advertising data */
543-
struct bt_data base_ad[2];
544540
struct bt_data per_ad;
545541

546-
err = bt_rand(&broadcast_id, BT_AUDIO_BROADCAST_ID_SIZE);
547-
if (err) {
548-
printk("Unable to generate broadcast ID: %d\n", err);
549-
550-
return -EINVAL;
551-
}
552-
553-
*gap_settings = BIT(BTP_GAP_SETTINGS_DISCOVERABLE) |
554-
BIT(BTP_GAP_SETTINGS_EXTENDED_ADVERTISING);
555-
/* Setup extended advertising data */
556-
net_buf_simple_add_le16(&ad_buf, BT_UUID_BROADCAST_AUDIO_VAL);
557-
net_buf_simple_add_le24(&ad_buf, source->broadcast_id);
558-
base_ad[0].type = BT_DATA_SVC_DATA16;
559-
base_ad[0].data_len = ad_buf.len;
560-
base_ad[0].data = ad_buf.data;
561-
base_ad[1].type = BT_DATA_NAME_COMPLETE;
562-
base_ad[1].data_len = sizeof(CONFIG_BT_DEVICE_NAME) - 1;
563-
base_ad[1].data = CONFIG_BT_DEVICE_NAME;
564-
err = tester_gap_create_adv_instance(&param, BTP_GAP_ADDR_TYPE_IDENTITY, base_ad, 2, NULL,
565-
0, gap_settings);
566-
if (err != 0) {
567-
LOG_DBG("Failed to create extended advertising instance: %d", err);
568-
569-
return -EINVAL;
542+
/* A more specialized adv instance may already have been created by another btp module */
543+
if (tester_gap_ext_adv_get() == NULL) {
544+
struct bt_le_adv_param param = *BT_LE_EXT_ADV_NCONN;
545+
struct bt_data base_ad[2];
546+
547+
NET_BUF_SIMPLE_DEFINE(ad_buf, BT_UUID_SIZE_16 + BT_AUDIO_BROADCAST_ID_SIZE);
548+
*gap_settings = BIT(BTP_GAP_SETTINGS_DISCOVERABLE) |
549+
BIT(BTP_GAP_SETTINGS_EXTENDED_ADVERTISING);
550+
/* Setup extended advertising data */
551+
net_buf_simple_add_le16(&ad_buf, BT_UUID_BROADCAST_AUDIO_VAL);
552+
net_buf_simple_add_le24(&ad_buf, source->broadcast_id);
553+
base_ad[0].type = BT_DATA_SVC_DATA16;
554+
base_ad[0].data_len = ad_buf.len;
555+
base_ad[0].data = ad_buf.data;
556+
base_ad[1].type = BT_DATA_NAME_COMPLETE;
557+
base_ad[1].data_len = sizeof(CONFIG_BT_DEVICE_NAME) - 1;
558+
base_ad[1].data = CONFIG_BT_DEVICE_NAME;
559+
560+
err = tester_gap_create_adv_instance(&param, BTP_GAP_ADDR_TYPE_IDENTITY, base_ad,
561+
2, NULL, 0, gap_settings);
562+
if (err != 0) {
563+
LOG_DBG("Failed to create extended advertising instance: %d", err);
564+
565+
return -EINVAL;
566+
}
570567
}
571568

572569
err = tester_gap_padv_configure(BT_LE_PER_ADV_PARAM(BT_GAP_PER_ADV_FAST_INT_MIN_2,

0 commit comments

Comments
 (0)