Skip to content

Commit 256401e

Browse files
sjanckartben
authored andcommitted
tests: Bluetooth: Tester: Add support for PAST
This adds support for BTP commands and events required for running PAST tests. struct btp_gap_ev_periodic_transfer_received_ev is also adjusted to match BTP specification. Signed-off-by: Szymon Janc <szymon.janc@codecoup.pl>
1 parent 821e9f3 commit 256401e

File tree

3 files changed

+192
-6
lines changed

3 files changed

+192
-6
lines changed

tests/bluetooth/tester/prj.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ CONFIG_BT_GATT_DYNAMIC_DB=y
4040
CONFIG_BT_EXT_ADV=y
4141
CONFIG_BT_PER_ADV=y
4242
CONFIG_BT_PER_ADV_SYNC=y
43+
CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER=y
44+
CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER=y
4345
CONFIG_BT_RX_STACK_SIZE=4096
4446

4547
CONFIG_BT_TESTING=y

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,8 @@ struct btp_gap_padv_sync_transfer_start_cmd {
313313
uint16_t service_data;
314314
} __packed;
315315

316+
#define BTP_GAP_PADV_SYNC_TRANSFER_RECV_FLAG_REPORTS_DISABLED 0x01
317+
316318
#define BTP_GAP_PADV_SYNC_TRANSFER_RECV 0x29
317319
struct btp_gap_padv_sync_transfer_recv_cmd {
318320
bt_addr_le_t address;
@@ -464,13 +466,10 @@ struct btp_gap_ev_periodic_report_ev {
464466

465467
#define BTP_GAP_EV_PERIODIC_TRANSFER_RECEIVED 0x90
466468
struct btp_gap_ev_periodic_transfer_received_ev {
469+
bt_addr_le_t adv_address;
467470
uint16_t sync_handle;
468-
uint8_t tx_power;
469-
uint8_t rssi;
470-
uint8_t cte_type;
471-
uint8_t data_status;
472-
uint8_t data_len;
473-
uint8_t data[];
471+
uint8_t status;
472+
bt_addr_le_t peer_address;
474473
} __packed;
475474

476475
#define BTP_GAP_EV_ENCRYPTION_CHANGE 0x91

tests/bluetooth/tester/src/btp_gap.c

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,6 +1873,30 @@ static void pa_sync_synced_cb(struct bt_le_per_adv_sync *sync,
18731873
{
18741874
LOG_DBG("");
18751875

1876+
/* sync transfer received */
1877+
if (IS_ENABLED(CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER) && info->conn != NULL) {
1878+
struct btp_gap_ev_periodic_transfer_received_ev ev;
1879+
struct bt_conn_info conn_info;
1880+
1881+
if (pa_sync != NULL) {
1882+
return;
1883+
}
1884+
1885+
pa_sync = sync;
1886+
1887+
bt_conn_get_info(info->conn, &conn_info);
1888+
1889+
bt_addr_le_copy(&ev.adv_address, &sync->addr);
1890+
ev.sync_handle = sys_cpu_to_le16(sync->handle);
1891+
ev.status = 0;
1892+
bt_addr_le_copy(&ev.peer_address, conn_info.le.dst);
1893+
1894+
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PERIODIC_TRANSFER_RECEIVED,
1895+
&ev, sizeof(ev));
1896+
return;
1897+
}
1898+
1899+
/* locally initiated */
18761900
if (sync == pa_sync) {
18771901
struct btp_gap_ev_periodic_sync_established_ev ev;
18781902

@@ -1904,9 +1928,43 @@ static void pa_sync_terminated_cb(struct bt_le_per_adv_sync *sync,
19041928
}
19051929
}
19061930

1931+
static struct net_buf_simple *periodic_adv_buf =
1932+
NET_BUF_SIMPLE(sizeof(struct btp_gap_ev_periodic_report_ev) + UINT8_MAX);
1933+
1934+
static void pa_sync_recv_cb(struct bt_le_per_adv_sync *sync,
1935+
const struct bt_le_per_adv_sync_recv_info *info,
1936+
struct net_buf_simple *buf)
1937+
{
1938+
struct btp_gap_ev_periodic_report_ev *ev;
1939+
1940+
LOG_DBG("");
1941+
1942+
/* cleanup */
1943+
net_buf_simple_init(periodic_adv_buf, 0);
1944+
1945+
ev = net_buf_simple_add(periodic_adv_buf, sizeof(*ev));
1946+
1947+
ev->sync_handle = sys_cpu_to_le16(sync->handle);
1948+
ev->rssi = info->rssi;
1949+
ev->cte_type = info->cte_type;
1950+
1951+
/* TODO BTP has fragmented data (as in HCI) */
1952+
if (buf->len > UINT8_MAX) {
1953+
ev->data_len = UINT8_MAX;
1954+
} else {
1955+
ev->data_len = buf->len;
1956+
}
1957+
1958+
memcpy(net_buf_simple_add(periodic_adv_buf, ev->data_len), buf->data, ev->data_len);
1959+
1960+
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PERIODIC_REPORT,
1961+
ev, sizeof(*ev) + ev->data_len);
1962+
}
1963+
19071964
static struct bt_le_per_adv_sync_cb pa_sync_cb = {
19081965
.synced = pa_sync_synced_cb,
19091966
.term = pa_sync_terminated_cb,
1967+
.recv = pa_sync_recv_cb,
19101968
};
19111969

19121970
#if defined(CONFIG_BT_PER_ADV)
@@ -2164,6 +2222,114 @@ static uint8_t padv_create_sync(const void *cmd, uint16_t cmd_len,
21642222

21652223
return BTP_STATUS_VAL(err);
21662224
}
2225+
2226+
#if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER)
2227+
static uint8_t padv_sync_transfer_set_info(const void *cmd, uint16_t cmd_len,
2228+
void *rsp, uint16_t *rsp_len)
2229+
{
2230+
const struct btp_gap_padv_sync_transfer_set_info_cmd *cp = cmd;
2231+
struct bt_le_ext_adv *ext_adv = tester_gap_ext_adv_get(0);
2232+
struct bt_conn *conn;
2233+
int err;
2234+
2235+
if (ext_adv == NULL) {
2236+
return BTP_STATUS_FAILED;
2237+
}
2238+
2239+
if (cp->address.type == BTP_BR_ADDRESS_TYPE) {
2240+
return BTP_STATUS_FAILED;
2241+
}
2242+
2243+
conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
2244+
if (conn == NULL) {
2245+
return BTP_STATUS_FAILED;
2246+
}
2247+
2248+
err = bt_le_per_adv_set_info_transfer(ext_adv, conn,
2249+
sys_le16_to_cpu(cp->service_data));
2250+
2251+
bt_conn_unref(conn);
2252+
2253+
if (err < 0) {
2254+
return BTP_STATUS_FAILED;
2255+
}
2256+
2257+
return BTP_STATUS_SUCCESS;
2258+
}
2259+
2260+
static uint8_t padv_padv_sync_transfer_start(const void *cmd, uint16_t cmd_len,
2261+
void *rsp, uint16_t *rsp_len)
2262+
{
2263+
const struct btp_gap_padv_sync_transfer_start_cmd *cp = cmd;
2264+
struct bt_conn *conn;
2265+
int err;
2266+
2267+
if (pa_sync == NULL) {
2268+
return BTP_STATUS_FAILED;
2269+
}
2270+
2271+
if (cp->address.type == BTP_BR_ADDRESS_TYPE) {
2272+
return BTP_STATUS_FAILED;
2273+
}
2274+
2275+
conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
2276+
if (conn == NULL) {
2277+
return BTP_STATUS_FAILED;
2278+
}
2279+
2280+
err = bt_le_per_adv_sync_transfer(pa_sync, conn,
2281+
sys_le16_to_cpu(cp->service_data));
2282+
2283+
bt_conn_unref(conn);
2284+
2285+
if (err < 0) {
2286+
return BTP_STATUS_FAILED;
2287+
}
2288+
2289+
return BTP_STATUS_SUCCESS;
2290+
}
2291+
#endif /* defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER) */
2292+
2293+
#if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER)
2294+
static uint8_t padv_padv_sync_transfer_recv(const void *cmd, uint16_t cmd_len,
2295+
void *rsp, uint16_t *rsp_len)
2296+
{
2297+
const struct btp_gap_padv_sync_transfer_recv_cmd *cp = cmd;
2298+
struct bt_le_per_adv_sync_transfer_param param = {0};
2299+
struct bt_conn *conn;
2300+
int err;
2301+
2302+
if (pa_sync != NULL) {
2303+
return BTP_STATUS_FAILED;
2304+
}
2305+
2306+
if (cp->address.type == BTP_BR_ADDRESS_TYPE) {
2307+
return BTP_STATUS_FAILED;
2308+
}
2309+
2310+
conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
2311+
if (conn == NULL) {
2312+
return BTP_STATUS_FAILED;
2313+
}
2314+
2315+
param.skip = sys_le16_to_cpu(cp->skip);
2316+
param.timeout = sys_le16_to_cpu(cp->sync_timeout);
2317+
2318+
if ((cp->flags & BTP_GAP_PADV_SYNC_TRANSFER_RECV_FLAG_REPORTS_DISABLED) != 0) {
2319+
param.options |= BT_LE_PER_ADV_SYNC_TRANSFER_OPT_REPORTING_INITIALLY_DISABLED;
2320+
}
2321+
2322+
err = bt_le_per_adv_sync_transfer_subscribe(conn, &param);
2323+
2324+
bt_conn_unref(conn);
2325+
2326+
if (err < 0) {
2327+
return BTP_STATUS_FAILED;
2328+
}
2329+
2330+
return BTP_STATUS_SUCCESS;
2331+
}
2332+
#endif /* defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER) */
21672333
#endif /* defined(CONFIG_BT_PER_ADV) */
21682334

21692335
#if defined(CONFIG_BT_RPA_TIMEOUT_DYNAMIC)
@@ -2350,6 +2516,25 @@ static const struct btp_handler handlers[] = {
23502516
.expect_len = sizeof(struct btp_gap_padv_create_sync_cmd),
23512517
.func = padv_create_sync,
23522518
},
2519+
#if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER)
2520+
{
2521+
.opcode = BTP_GAP_PADV_SYNC_TRANSFER_SET_INFO,
2522+
.expect_len = sizeof(struct btp_gap_padv_sync_transfer_set_info_cmd),
2523+
.func = padv_sync_transfer_set_info,
2524+
},
2525+
{
2526+
.opcode = BTP_GAP_PADV_SYNC_TRANSFER_START,
2527+
.expect_len = sizeof(struct btp_gap_padv_sync_transfer_start_cmd),
2528+
.func = padv_padv_sync_transfer_start,
2529+
},
2530+
#endif /* defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER) */
2531+
#if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER)
2532+
{
2533+
.opcode = BTP_GAP_PADV_SYNC_TRANSFER_RECV,
2534+
.expect_len = sizeof(struct btp_gap_padv_sync_transfer_recv_cmd),
2535+
.func = padv_padv_sync_transfer_recv,
2536+
},
2537+
#endif /* defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER) */
23532538
#endif /* defined(CONFIG_BT_PER_ADV) */
23542539
#endif /* defined(CONFIG_BT_EXT_ADV) */
23552540
#if defined(CONFIG_BT_RPA_TIMEOUT_DYNAMIC)

0 commit comments

Comments
 (0)