Skip to content

Commit efb5c09

Browse files
mkasenbergcarlescufi
authored andcommitted
bluetooth: tester: Add support for BAP broadcast
Support for BAP/BSRC and BAP/BSNK test cases. Add partial support for GAP/PADV as periodic advertising is needed for BAP/BSRC tests and they can share common code. Signed-off-by: Magdalena Kasenberg <[email protected]>
1 parent 28ed48c commit efb5c09

File tree

8 files changed

+1443
-80
lines changed

8 files changed

+1443
-80
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ CONFIG_BT_MICP_MIC_DEV_AICS_INSTANCE_COUNT=1
2525
CONFIG_BT_MICP_MIC_CTLR=y
2626
CONFIG_BT_MICP_MIC_CTLR_MAX_AICS_INST=1
2727

28+
# Broadcast Source
29+
CONFIG_BT_BAP_BROADCAST_SOURCE=y
30+
CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT=2
31+
CONFIG_BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT=2
32+
CONFIG_BT_ISO_TX_BUF_COUNT=4
33+
34+
# Broadcast Sink
35+
CONFIG_BT_BAP_SCAN_DELEGATOR=y
36+
CONFIG_BT_BAP_BROADCAST_SINK=y
37+
CONFIG_BT_BAP_BROADCAST_SNK_STREAM_COUNT=2
38+
CONFIG_BT_BAP_BROADCAST_SNK_SUBGROUP_COUNT=2
39+
2840
# ASCS
2941
CONFIG_BT_ASCS_ASE_SNK_COUNT=2
3042
CONFIG_BT_ASCS_ASE_SRC_COUNT=2

tests/bluetooth/tester/src/btp.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ static struct {
5050
size_t num;
5151
} service_handler[BTP_SERVICE_ID_MAX + 1];
5252

53+
static struct net_buf_simple *rsp_buf = NET_BUF_SIMPLE(BTP_MTU);
54+
static K_MUTEX_DEFINE(rsp_buf_mutex);
55+
5356
static void tester_send_with_index(uint8_t service, uint8_t opcode, uint8_t index,
5457
const uint8_t *data, size_t len);
5558
static void tester_rsp_with_index(uint8_t service, uint8_t opcode, uint8_t index,
@@ -241,6 +244,34 @@ void tester_init(void)
241244
BTP_INDEX_NONE, NULL, 0);
242245
}
243246

247+
int tester_rsp_buffer_lock(void)
248+
{
249+
if (k_mutex_lock(&rsp_buf_mutex, Z_FOREVER) != 0) {
250+
LOG_ERR("Cannot lock rsp_ring_buf");
251+
252+
return -EACCES;
253+
}
254+
255+
return 0;
256+
}
257+
258+
void tester_rsp_buffer_unlock(void)
259+
{
260+
k_mutex_unlock(&rsp_buf_mutex);
261+
}
262+
263+
void tester_rsp_buffer_free(void)
264+
{
265+
net_buf_simple_init(rsp_buf, 0);
266+
}
267+
268+
void tester_rsp_buffer_allocate(size_t len, uint8_t **data)
269+
{
270+
tester_rsp_buffer_free();
271+
272+
*data = net_buf_simple_add(rsp_buf, len);
273+
}
274+
244275
static void tester_send_with_index(uint8_t service, uint8_t opcode, uint8_t index,
245276
const uint8_t *data, size_t len)
246277
{

tests/bluetooth/tester/src/btp/btp_ascs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ struct btp_ascs_configure_codec_cmd {
1919
uint8_t coding_format;
2020
uint16_t vid;
2121
uint16_t cid;
22-
uint8_t ltvs_len;
23-
uint8_t ltvs[0];
22+
uint8_t cc_ltvs_len;
23+
uint8_t cc_ltvs[0];
2424
} __packed;
2525

2626
#define BTP_ASCS_CONFIGURE_QOS 0x03

tests/bluetooth/tester/src/btp/btp_bap.h

Lines changed: 123 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@
77
*/
88

99
/* BAP commands */
10-
#define BTP_BAP_READ_SUPPORTED_COMMANDS 0x01
10+
#define BTP_BAP_READ_SUPPORTED_COMMANDS 0x01
1111
struct btp_bap_read_supported_commands_rp {
1212
uint8_t data[0];
1313
} __packed;
1414

15-
#define BTP_BAP_DISCOVER 0x02
15+
#define BTP_BAP_DISCOVER 0x02
1616
struct btp_bap_discover_cmd {
1717
bt_addr_le_t address;
1818
} __packed;
1919

2020
#define BTP_BAP_DISCOVERY_STATUS_SUCCESS 0x00
2121
#define BTP_BAP_DISCOVERY_STATUS_FAILED 0x01
2222

23-
#define BTP_BAP_SEND 0x03
23+
#define BTP_BAP_SEND 0x03
2424
struct btp_bap_send_cmd {
2525
bt_addr_le_t address;
2626
uint8_t ase_id;
@@ -32,14 +32,91 @@ struct btp_bap_send_rp {
3232
uint8_t data_len;
3333
} __packed;
3434

35+
#define BTP_BAP_BROADCAST_SOURCE_SETUP 0x04
36+
struct btp_bap_broadcast_source_setup_cmd {
37+
uint8_t streams_per_subgroup;
38+
uint8_t subgroups;
39+
uint8_t sdu_interval[3];
40+
uint8_t framing;
41+
uint16_t max_sdu;
42+
uint8_t retransmission_num;
43+
uint16_t max_transport_latency;
44+
uint8_t presentation_delay[3];
45+
uint8_t coding_format;
46+
uint16_t vid;
47+
uint16_t cid;
48+
uint8_t cc_ltvs_len;
49+
uint8_t cc_ltvs[];
50+
} __packed;
51+
struct btp_bap_broadcast_source_setup_rp {
52+
uint32_t gap_settings;
53+
uint8_t broadcast_id[3];
54+
} __packed;
55+
56+
#define BTP_BAP_BROADCAST_SOURCE_RELEASE 0x05
57+
struct btp_bap_broadcast_source_release_cmd {
58+
uint8_t broadcast_id[3];
59+
} __packed;
60+
61+
#define BTP_BAP_BROADCAST_ADV_START 0x06
62+
struct btp_bap_broadcast_adv_start_cmd {
63+
uint8_t broadcast_id[3];
64+
} __packed;
65+
66+
#define BTP_BAP_BROADCAST_ADV_STOP 0x07
67+
struct btp_bap_broadcast_adv_stop_cmd {
68+
uint8_t broadcast_id[3];
69+
} __packed;
70+
71+
#define BTP_BAP_BROADCAST_SOURCE_START 0x08
72+
struct btp_bap_broadcast_source_start_cmd {
73+
uint8_t broadcast_id[3];
74+
} __packed;
75+
76+
#define BTP_BAP_BROADCAST_SOURCE_STOP 0x09
77+
struct btp_bap_broadcast_source_stop_cmd {
78+
uint8_t broadcast_id[3];
79+
} __packed;
80+
81+
#define BTP_BAP_BROADCAST_SINK_SETUP 0x0a
82+
struct btp_bap_broadcast_sink_setup_cmd {
83+
} __packed;
84+
85+
#define BTP_BAP_BROADCAST_SINK_RELEASE 0x0b
86+
struct btp_bap_broadcast_sink_release_cmd {
87+
} __packed;
88+
89+
#define BTP_BAP_BROADCAST_SCAN_START 0x0c
90+
struct btp_bap_broadcast_scan_start_cmd {
91+
} __packed;
92+
93+
#define BTP_BAP_BROADCAST_SCAN_STOP 0x0d
94+
struct btp_bap_broadcast_scan_stop_cmd {
95+
} __packed;
96+
97+
#define BTP_BAP_BROADCAST_SINK_SYNC 0x0e
98+
struct btp_bap_broadcast_sink_sync_cmd {
99+
bt_addr_le_t address;
100+
uint8_t broadcast_id[3];
101+
uint8_t advertiser_sid;
102+
uint16_t skip;
103+
uint16_t sync_timeout;
104+
} __packed;
105+
106+
#define BTP_BAP_BROADCAST_SINK_STOP 0x0f
107+
struct btp_bap_broadcast_sink_stop_cmd {
108+
bt_addr_le_t address;
109+
uint8_t broadcast_id[3];
110+
} __packed;
111+
35112
/* BAP events */
36-
#define BTP_BAP_EV_DISCOVERY_COMPLETED 0x80
113+
#define BTP_BAP_EV_DISCOVERY_COMPLETED 0x80
37114
struct btp_bap_discovery_completed_ev {
38115
bt_addr_le_t address;
39116
uint8_t status;
40117
} __packed;
41118

42-
#define BTP_BAP_EV_CODEC_CAP_FOUND 0x81
119+
#define BTP_BAP_EV_CODEC_CAP_FOUND 0x81
43120
struct btp_bap_codec_cap_found_ev {
44121
bt_addr_le_t address;
45122
uint8_t dir;
@@ -50,17 +127,55 @@ struct btp_bap_codec_cap_found_ev {
50127
uint8_t channel_counts;
51128
} __packed;
52129

53-
#define BTP_BAP_EV_ASE_FOUND 0x82
130+
#define BTP_BAP_EV_ASE_FOUND 0x82
54131
struct btp_ascs_ase_found_ev {
55132
bt_addr_le_t address;
56133
uint8_t dir;
57134
uint8_t ase_id;
58135
} __packed;
59136

60-
#define BTP_BAP_EV_STREAM_RECEIVED 0x83
137+
#define BTP_BAP_EV_STREAM_RECEIVED 0x83
61138
struct btp_bap_stream_received_ev {
62139
bt_addr_le_t address;
63140
uint8_t ase_id;
64141
uint8_t data_len;
65-
uint8_t data[0];
142+
uint8_t data[];
143+
} __packed;
144+
145+
#define BTP_BAP_EV_BAA_FOUND 0x84
146+
struct btp_bap_baa_found_ev {
147+
bt_addr_le_t address;
148+
uint8_t broadcast_id[3];
149+
uint8_t advertiser_sid;
150+
uint16_t padv_interval;
151+
} __packed;
152+
153+
#define BTP_BAP_EV_BIS_FOUND 0x85
154+
struct btp_bap_bis_found_ev {
155+
bt_addr_le_t address;
156+
uint8_t broadcast_id[3];
157+
uint8_t presentation_delay[3];
158+
uint8_t subgroup_id;
159+
uint8_t bis_id;
160+
uint8_t coding_format;
161+
uint16_t vid;
162+
uint16_t cid;
163+
uint8_t cc_ltvs_len;
164+
uint8_t cc_ltvs[];
165+
} __packed;
166+
167+
#define BTP_BAP_EV_BIS_SYNCED 0x86
168+
struct btp_bap_bis_syned_ev {
169+
bt_addr_le_t address;
170+
uint8_t broadcast_id[3];
171+
uint8_t bis_id;
172+
} __packed;
173+
174+
#define BTP_BAP_EV_BIS_STREAM_RECEIVED 0x87
175+
struct btp_bap_bis_stream_received_ev {
176+
bt_addr_le_t address;
177+
uint8_t broadcast_id[3];
178+
uint8_t bis_id;
179+
uint8_t data_len;
180+
uint8_t data[];
66181
} __packed;

tests/bluetooth/tester/src/btp/btp_gap.h

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ struct btp_gap_set_bondable_rp {
101101
uint32_t current_settings;
102102
} __packed;
103103

104+
#define BTP_GAP_ADDR_TYPE_IDENTITY 0
105+
#define BTP_GAP_ADDR_TYPE_RESOLVABLE_PRIVATE 1
106+
#define BTP_GAP_ADDR_TYPE_NON_RESOLVABLE_PRIVATE 2
107+
104108
#define BTP_GAP_START_ADVERTISING 0x0a
105109
struct btp_gap_start_advertising_cmd {
106110
uint8_t adv_data_len;
@@ -233,7 +237,7 @@ struct btp_gap_set_mitm {
233237
#define BTP_GAP_SET_FILTER_LIST 0x1c
234238
struct btp_gap_set_filter_list {
235239
uint8_t cnt;
236-
bt_addr_le_t addr[0];
240+
bt_addr_le_t addr[];
237241
} __packed;
238242

239243
#define BTP_GAP_SET_PRIVACY 0x1d
@@ -249,6 +253,69 @@ struct btp_gap_set_extended_advertising_rp {
249253
uint32_t current_settings;
250254
} __packed;
251255

256+
#define BTP_GAP_PADV_CONFIGURE 0x22
257+
/* bitmap of flags*/
258+
#define BTP_GAP_PADV_INCLUDE_TX_POWER BIT(0)
259+
struct btp_gap_padv_configure_cmd {
260+
uint8_t flags;
261+
uint16_t interval_min;
262+
uint16_t interval_max;
263+
} __packed;
264+
struct btp_gap_padv_configure_rp {
265+
uint32_t current_settings;
266+
} __packed;
267+
268+
#define BTP_GAP_PADV_START 0x23
269+
struct btp_gap_padv_start_cmd {
270+
uint8_t flags;
271+
} __packed;
272+
struct btp_gap_padv_start_rp {
273+
uint32_t current_settings;
274+
} __packed;
275+
276+
#define BTP_GAP_PADV_STOP 0x24
277+
struct btp_gap_padv_stop_cmd {
278+
} __packed;
279+
struct btp_gap_padv_stop_rp {
280+
uint32_t current_settings;
281+
} __packed;
282+
283+
#define BTP_GAP_PADV_SET_DATA 0x25
284+
struct btp_gap_padv_set_data_cmd {
285+
uint16_t data_len;
286+
uint8_t data[];
287+
} __packed;
288+
289+
#define BTP_GAP_PADV_CREATE_SYNC 0x26
290+
struct btp_gap_padv_create_sync_cmd {
291+
bt_addr_le_t address;
292+
uint8_t advertiser_sid;
293+
uint16_t skip;
294+
uint16_t sync_timeout;
295+
uint8_t flags;
296+
} __packed;
297+
298+
#define BTP_GAP_PADV_SYNC_TRANSFER_SET_INFO 0x27
299+
struct btp_gap_padv_sync_transfer_set_info_cmd {
300+
bt_addr_le_t address;
301+
uint16_t service_data;
302+
} __packed;
303+
304+
#define BTP_GAP_PADV_SYNC_TRANSFER_START 0x28
305+
struct btp_gap_padv_sync_transfer_start_cmd {
306+
uint16_t sync_handle;
307+
bt_addr_le_t address;
308+
uint16_t service_data;
309+
} __packed;
310+
311+
#define BTP_GAP_PADV_SYNC_TRANSFER_RECV 0x29
312+
struct btp_gap_padv_sync_transfer_recv_cmd {
313+
bt_addr_le_t address;
314+
uint16_t skip;
315+
uint16_t sync_timeout;
316+
uint8_t flags;
317+
} __packed;
318+
252319
/* events */
253320
#define BTP_GAP_EV_NEW_SETTINGS 0x80
254321
struct btp_gap_new_settings_ev {
@@ -337,3 +404,57 @@ struct btp_gap_bond_pairing_failed_ev {
337404
bt_addr_le_t address;
338405
uint8_t reason;
339406
} __packed;
407+
408+
#define BTP_GAP_EV_PERIODIC_SYNC_ESTABLISHED 0x8d
409+
struct btp_gap_ev_periodic_sync_established_ev {
410+
bt_addr_le_t address;
411+
uint16_t sync_handle;
412+
uint8_t status;
413+
} __packed;
414+
415+
#define BTP_GAP_EV_PERIODIC_SYNC_LOST 0x8e
416+
struct btp_gap_ev_periodic_sync_lost_ev {
417+
uint16_t sync_handle;
418+
uint8_t reason;
419+
} __packed;
420+
421+
#define BTP_GAP_EV_PERIODIC_REPORT 0x8f
422+
struct btp_gap_ev_periodic_report_ev {
423+
uint16_t sync_handle;
424+
uint8_t tx_power;
425+
uint8_t rssi;
426+
uint8_t cte_type;
427+
uint8_t data_status;
428+
uint8_t data_len;
429+
uint8_t data[];
430+
} __packed;
431+
432+
#define BTP_GAP_EV_PERIODIC_TRANSFER_RECEIVED 0x90
433+
struct btp_gap_ev_periodic_transfer_received_ev {
434+
uint16_t sync_handle;
435+
uint8_t tx_power;
436+
uint8_t rssi;
437+
uint8_t cte_type;
438+
uint8_t data_status;
439+
uint8_t data_len;
440+
uint8_t data[];
441+
} __packed;
442+
443+
#if defined(CONFIG_BT_EXT_ADV)
444+
struct bt_le_per_adv_param;
445+
struct bt_le_per_adv_sync_param;
446+
struct bt_le_adv_param;
447+
struct bt_data;
448+
struct bt_le_ext_adv *tester_gap_ext_adv_get(void);
449+
struct bt_le_per_adv_sync *tester_gap_padv_get(void);
450+
int tester_gap_create_adv_instance(struct bt_le_adv_param *param, uint8_t own_addr_type,
451+
const struct bt_data *ad, size_t ad_len,
452+
const struct bt_data *sd, size_t sd_len, uint32_t *settings);
453+
int tester_gap_stop_ext_adv(void);
454+
int tester_gap_start_ext_adv(void);
455+
int tester_gap_padv_configure(const struct bt_le_per_adv_param *param);
456+
int tester_gap_padv_set_data(struct bt_data *per_ad, uint8_t ad_len);
457+
int tester_gap_padv_start(void);
458+
int tester_gap_padv_stop(void);
459+
int tester_padv_create_sync(struct bt_le_per_adv_sync_param *create_params);
460+
#endif /* defined(CONFIG_BT_EXT_ADV) */

0 commit comments

Comments
 (0)