@@ -318,10 +318,51 @@ static void client_connectable_complete(uint16_t opcode, uint8_t status,
tester_setup_complete();
}
+static void bthost_recv_data(const void *buf, uint16_t len, uint8_t status,
+ void *user_data)
+{
+ struct test_data *data = user_data;
+ const struct sco_client_data *scodata = data->test_data;
+
+ --data->step;
+
+ tester_print("Client received %u bytes of data", len);
+
+ if (scodata->send_data && (scodata->data_len != len ||
+ memcmp(scodata->send_data, buf, len)))
+ tester_test_failed();
+ else if (!data->step)
+ tester_test_passed();
+}
+
+static void bthost_sco_disconnected(void *user_data)
+{
+ struct test_data *data = user_data;
+
+ tester_print("SCO handle 0x%04x disconnected", data->handle);
+
+ data->handle = 0x0000;
+}
+
+static void sco_new_conn(uint16_t handle, void *user_data)
+{
+ struct test_data *data = user_data;
+ struct bthost *host;
+
+ tester_print("New client connection with handle 0x%04x", handle);
+
+ data->handle = handle;
+
+ host = hciemu_client_get_host(data->hciemu);
+ bthost_add_sco_hook(host, data->handle, bthost_recv_data, data,
+ bthost_sco_disconnected);
+}
+
static void setup_powered_callback(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
struct test_data *data = tester_get_data();
+ const struct sco_client_data *scodata = data->test_data;
struct bthost *bthost;
if (status != MGMT_STATUS_SUCCESS) {
@@ -334,6 +375,9 @@ static void setup_powered_callback(uint8_t status, uint16_t length,
bthost = hciemu_client_get_host(data->hciemu);
bthost_set_cmd_complete_cb(bthost, client_connectable_complete, data);
bthost_write_scan_enable(bthost, 0x03);
+
+ if (scodata && scodata->send_data)
+ bthost_set_sco_cb(bthost, sco_new_conn, data);
}
static void setup_powered(const void *test_data)
@@ -740,8 +784,6 @@ static gboolean sco_connect_cb(GIOChannel *io, GIOCondition cond,
ssize_t ret = 0;
unsigned int count;
- data->step = 0;
-
sco_tx_timestamping(data, io);
tester_print("Writing %u*%u bytes of data",
@@ -751,6 +793,7 @@ static gboolean sco_connect_cb(GIOChannel *io, GIOCondition cond,
ret = write(sk, scodata->send_data, scodata->data_len);
if (scodata->data_len != ret)
break;
+ data->step++;
}
if (scodata->data_len != ret) {
tester_warn("Failed to write %u bytes: %zu %s (%d)",