From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This tests setting SID for broadcast source in adition to existing test that was testing broadcast sink only, so this adds/updates the following test: ISO Broadcaster SID auto - Success ISO Broadcaster SID 0x01 - Success ISO Broadcaster Receiver SID auto - Success ISO Broadcaster Receiver SID 0x01 - Success --- emulator/bthost.c | 3 +- emulator/bthost.h | 2 +- tools/iso-tester.c | 74 ++++++++++++++++++++++++++++++++++++++++----- tools/mesh-tester.c | 2 +- tools/mgmt-tester.c | 4 +-- 5 files changed, 72 insertions(+), 13 deletions(-) diff --git a/emulator/bthost.c b/emulator/bthost.c index f53b4382d6f9..7ab4533d12b4 100644 --- a/emulator/bthost.c +++ b/emulator/bthost.c @@ -3467,7 +3467,7 @@ void bthost_set_scan_enable(struct bthost *bthost, uint8_t enable) &cp, sizeof(cp)); } -void bthost_set_ext_adv_params(struct bthost *bthost) +void bthost_set_ext_adv_params(struct bthost *bthost, uint8_t sid) { const uint8_t interval_20ms[] = { 0x20, 0x00, 0x00 }; struct bt_hci_cmd_le_set_ext_adv_params cp; @@ -3477,6 +3477,7 @@ void bthost_set_ext_adv_params(struct bthost *bthost) cp.evt_properties = cpu_to_le16(0x0013); memcpy(cp.min_interval, interval_20ms, sizeof(cp.min_interval)); memcpy(cp.max_interval, interval_20ms, sizeof(cp.max_interval)); + cp.sid = sid; send_command(bthost, BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS, &cp, sizeof(cp)); } diff --git a/emulator/bthost.h b/emulator/bthost.h index db640daff38a..456f631d51a0 100644 --- a/emulator/bthost.h +++ b/emulator/bthost.h @@ -113,7 +113,7 @@ void bthost_set_adv_enable(struct bthost *bthost, uint8_t enable); void bthost_set_ext_adv_data(struct bthost *bthost, const uint8_t *data, uint8_t len); -void bthost_set_ext_adv_params(struct bthost *bthost); +void bthost_set_ext_adv_params(struct bthost *bthost, uint8_t sid); void bthost_set_ext_adv_enable(struct bthost *bthost, uint8_t enable); void bthost_set_pa_params(struct bthost *bthost); void bthost_set_pa_data(struct bthost *bthost, const uint8_t *data, diff --git a/tools/iso-tester.c b/tools/iso-tester.c index 7bc0eb12c1c5..725fd3338c9f 100644 --- a/tools/iso-tester.c +++ b/tools/iso-tester.c @@ -1412,6 +1412,26 @@ static const struct iso_client_data bcast_1_1_16_2_1_send = { .base_len = sizeof(base_lc3_16_2_1), }; +static const struct iso_client_data bcast_16_2_1_send_sid = { + .qos = QOS_OUT_16_2_1, + .expect_err = 0, + .send = &send_16_2_1, + .bcast = true, + .base = base_lc3_16_2_1, + .base_len = sizeof(base_lc3_16_2_1), + .sid = 0xff, +}; + +static const struct iso_client_data bcast_16_2_1_send_sid1 = { + .qos = QOS_OUT_16_2_1, + .expect_err = 0, + .send = &send_16_2_1, + .bcast = true, + .base = base_lc3_16_2_1, + .base_len = sizeof(base_lc3_16_2_1), + .sid = 0x01, +}; + static const struct iso_client_data bcast_16_2_1_recv = { .qos = QOS_IN_16_2_1, .expect_err = 0, @@ -1439,6 +1459,16 @@ static const struct iso_client_data bcast_16_2_1_recv_sid = { .sid = 0xff, }; +static const struct iso_client_data bcast_16_2_1_recv_sid1 = { + .qos = QOS_IN_16_2_1, + .expect_err = 0, + .recv = &send_16_2_1, + .bcast = true, + .server = true, + .big = true, + .sid = 0x01, +}; + static const struct iso_client_data bcast_enc_16_2_1_recv = { .qos = QOS_IN_ENC_16_2_1, .expect_err = 0, @@ -1658,7 +1688,8 @@ static void setup_powered_callback(uint8_t status, uint16_t length, host = hciemu_client_host(client); bthost_set_cmd_complete_cb(host, client_connectable_complete, data); - bthost_set_ext_adv_params(host); + bthost_set_ext_adv_params(host, isodata->sid != 0xff ? + isodata->sid : 0x00); bthost_set_ext_adv_enable(host, 0x01); if (!isodata) @@ -1836,8 +1867,9 @@ end: static int create_iso_sock(struct test_data *data) { + const struct iso_client_data *isodata = data->test_data; const uint8_t *master_bdaddr; - struct sockaddr_iso addr; + struct sockaddr_iso *addr; int sk, err; sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET | SOCK_NONBLOCK, BTPROTO_ISO); @@ -1855,12 +1887,26 @@ static int create_iso_sock(struct test_data *data) return -ENODEV; } - memset(&addr, 0, sizeof(addr)); - addr.iso_family = AF_BLUETOOTH; - bacpy(&addr.iso_bdaddr, (void *) master_bdaddr); - addr.iso_bdaddr_type = BDADDR_LE_PUBLIC; + if (isodata->bcast && isodata->sid) { + addr = malloc(sizeof(*addr) + sizeof(*addr->iso_bc)); + memset(addr, 0, sizeof(*addr) + sizeof(*addr->iso_bc)); + addr->iso_family = AF_BLUETOOTH; + bacpy(&addr->iso_bdaddr, (void *) master_bdaddr); + addr->iso_bdaddr_type = BDADDR_LE_PUBLIC; + addr->iso_bc->bc_bdaddr_type = BDADDR_LE_PUBLIC; + addr->iso_bc->bc_sid = isodata->sid; + err = bind(sk, (struct sockaddr *) addr, sizeof(*addr) + + sizeof(*addr->iso_bc)); + } else { + addr = malloc(sizeof(*addr)); + memset(addr, 0, sizeof(*addr)); + addr->iso_family = AF_BLUETOOTH; + bacpy(&addr->iso_bdaddr, (void *) master_bdaddr); + addr->iso_bdaddr_type = BDADDR_LE_PUBLIC; + err = bind(sk, (struct sockaddr *) addr, sizeof(addr)); + } - if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + if (err < 0) { err = -errno; tester_warn("Can't bind socket: %s (%d)", strerror(errno), errno); @@ -2623,6 +2669,8 @@ static gboolean iso_connect(GIOChannel *io, GIOCondition cond, tester_test_failed(); return FALSE; } + + tester_print("SID: 0x%02x", addr.bc.bc_sid); } len = sizeof(sk_err); @@ -3886,14 +3934,24 @@ int main(int argc, char *argv[]) &bcast_1_1_16_2_1_send, setup_powered, test_bcast); + test_iso("ISO Broadcaster SID auto - Success", &bcast_16_2_1_send_sid, + setup_powered, + test_bcast); + test_iso("ISO Broadcaster SID 0x01 - Success", &bcast_16_2_1_send_sid1, + setup_powered, + test_bcast); test_iso("ISO Broadcaster Receiver - Success", &bcast_16_2_1_recv, setup_powered, test_bcast_recv); - test_iso("ISO Broadcaster Receiver SID 0xff - Success", + test_iso("ISO Broadcaster Receiver SID auto - Success", &bcast_16_2_1_recv_sid, setup_powered, test_bcast_recv); + test_iso("ISO Broadcaster Receiver SID 0x01 - Success", + &bcast_16_2_1_recv_sid1, + setup_powered, + test_bcast_recv); test_iso2("ISO Broadcaster Receiver2 - Success", &bcast_16_2_1_recv2, setup_powered, test_bcast_recv2); diff --git a/tools/mesh-tester.c b/tools/mesh-tester.c index d7b3b6f9b1db..848ccbe51a87 100644 --- a/tools/mesh-tester.c +++ b/tools/mesh-tester.c @@ -968,7 +968,7 @@ static void setup_bthost(void) if (data->hciemu_type == HCIEMU_TYPE_LE || test->client_enable_adv) { if (data->hciemu_type >= HCIEMU_TYPE_BREDRLE50) { - bthost_set_ext_adv_params(bthost); + bthost_set_ext_adv_params(bthost, 0x00); bthost_set_ext_adv_enable(bthost, 0x01); } else bthost_set_adv_enable(bthost, 0x01); diff --git a/tools/mgmt-tester.c b/tools/mgmt-tester.c index 030827cd51d1..a1d48152f23b 100644 --- a/tools/mgmt-tester.c +++ b/tools/mgmt-tester.c @@ -6169,7 +6169,7 @@ static void setup_bthost(void) if (data->hciemu_type == HCIEMU_TYPE_LE || test->client_enable_adv) { if (data->hciemu_type >= HCIEMU_TYPE_BREDRLE50) { - bthost_set_ext_adv_params(bthost); + bthost_set_ext_adv_params(bthost, 0x00); bthost_set_ext_adv_enable(bthost, 0x01); } else bthost_set_adv_enable(bthost, 0x01); @@ -11724,7 +11724,7 @@ static void trigger_device_found(void *user_data) bthost_set_adv_enable(bthost, 0x01); } else if (data->hciemu_type >= HCIEMU_TYPE_BREDRLE50) { - bthost_set_ext_adv_params(bthost); + bthost_set_ext_adv_params(bthost, 0x00); if (test->set_adv) bthost_set_ext_adv_data(bthost, test->adv_data, test->adv_data_len); -- 2.49.0