I/O vectors are now supported on bthost API.
---
android/tester-gatt.c | 68 ++++++++++++++++++++++++------------------------
android/tester-hidhost.c | 10 +++----
android/tester-main.c | 25 ++++++++++--------
android/tester-main.h | 16 +++++-------
4 files changed, 58 insertions(+), 61 deletions(-)
diff --git a/android/tester-gatt.c b/android/tester-gatt.c
index 1460329..81ae257 100644
--- a/android/tester-gatt.c
+++ b/android/tester-gatt.c
@@ -137,8 +137,8 @@ static struct gatt_search_service_data search_services_1 = {
.filter_uuid = NULL,
};
-static const struct pdu exchange_mtu_req_pdu = raw_pdu(0x02, 0xa0, 0x02);
-static const struct pdu exchange_mtu_resp_pdu = raw_pdu(0x03, 0xa0, 0x02);
+static const struct iovec exchange_mtu_req_pdu = raw_pdu(0x02, 0xa0, 0x02);
+static const struct iovec exchange_mtu_resp_pdu = raw_pdu(0x03, 0xa0, 0x02);
static struct bt_action_data bearer_type = {
.bearer_type = BDADDR_LE_PUBLIC,
@@ -368,7 +368,7 @@ static struct set_write_params set_write_param_3 = {
.status = 0x01
};
-static struct pdu search_service[] = {
+static struct iovec search_service[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -376,7 +376,7 @@ static struct pdu search_service[] = {
null_pdu
};
-static struct pdu search_service_2[] = {
+static struct iovec search_service_2[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -386,13 +386,13 @@ static struct pdu search_service_2[] = {
null_pdu
};
-static struct pdu search_service_3[] = {
+static struct iovec search_service_3[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x01, 0x08, 0x01, 0x00, 0x0a),
null_pdu
};
-static struct pdu get_characteristic_1[] = {
+static struct iovec get_characteristic_1[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -404,7 +404,7 @@ static struct pdu get_characteristic_1[] = {
null_pdu
};
-static struct pdu get_descriptor_1[] = {
+static struct iovec get_descriptor_1[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -420,7 +420,7 @@ static struct pdu get_descriptor_1[] = {
null_pdu
};
-static struct pdu get_descriptor_2[] = {
+static struct iovec get_descriptor_2[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -436,7 +436,7 @@ static struct pdu get_descriptor_2[] = {
null_pdu
};
-static struct pdu get_descriptor_3[] = {
+static struct iovec get_descriptor_3[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -450,7 +450,7 @@ static struct pdu get_descriptor_3[] = {
null_pdu
};
-static struct pdu get_included_1[] = {
+static struct iovec get_included_1[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -462,7 +462,7 @@ static struct pdu get_included_1[] = {
null_pdu
};
-static struct pdu get_included_2[] = {
+static struct iovec get_included_2[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -477,7 +477,7 @@ static struct pdu get_included_2[] = {
null_pdu
};
-static struct pdu get_included_3[] = {
+static struct iovec get_included_3[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -487,7 +487,7 @@ static struct pdu get_included_3[] = {
null_pdu
};
-static struct pdu read_characteristic_1[] = {
+static struct iovec read_characteristic_1[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -501,7 +501,7 @@ static struct pdu read_characteristic_1[] = {
null_pdu
};
-static struct pdu read_characteristic_2[] = {
+static struct iovec read_characteristic_2[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -515,7 +515,7 @@ static struct pdu read_characteristic_2[] = {
null_pdu
};
-static struct pdu read_descriptor_1[] = {
+static struct iovec read_descriptor_1[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -533,7 +533,7 @@ static struct pdu read_descriptor_1[] = {
null_pdu
};
-static struct pdu read_descriptor_2[] = {
+static struct iovec read_descriptor_2[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -551,7 +551,7 @@ static struct pdu read_descriptor_2[] = {
null_pdu
};
-static struct pdu write_characteristic_1[] = {
+static struct iovec write_characteristic_1[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -564,7 +564,7 @@ static struct pdu write_characteristic_1[] = {
null_pdu
};
-static struct pdu write_characteristic_2[] = {
+static struct iovec write_characteristic_2[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -578,7 +578,7 @@ static struct pdu write_characteristic_2[] = {
null_pdu
};
-static struct pdu write_characteristic_3[] = {
+static struct iovec write_characteristic_3[] = {
raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
raw_pdu(0x11, 0x06, 0x01, 0x00, 0x10, 0x00, 0x00, 0x18),
raw_pdu(0x10, 0x11, 0x00, 0xff, 0xff, 0x00, 0x28),
@@ -847,16 +847,16 @@ static void gatt_cid_hook_cb(const void *data, uint16_t len, void *user_data)
struct bthost *bthost = hciemu_client_get_host(t_data->hciemu);
struct emu_l2cap_cid_data *cid_data = user_data;
const uint8_t *pdu = data;
- struct pdu *gatt_pdu = queue_peek_head(t_data->pdus);
+ struct iovec *gatt_pdu = queue_peek_head(t_data->pdus);
switch (pdu[0]) {
case L2CAP_ATT_EXCHANGE_MTU_REQ:
tester_print("Exchange MTU request received.");
- if (!memcmp(exchange_mtu_req_pdu.data, pdu, len))
- bthost_send_cid(bthost, cid_data->handle, cid_data->cid,
- exchange_mtu_resp_pdu.data,
- exchange_mtu_resp_pdu.size);
+ if (!memcmp(exchange_mtu_req_pdu.iov_base, pdu, len))
+ bthost_send_cid_v(bthost, cid_data->handle,
+ cid_data->cid,
+ &exchange_mtu_resp_pdu, 1);
break;
case L2CAP_ATT_EXCHANGE_MTU_RSP:
@@ -864,29 +864,29 @@ static void gatt_cid_hook_cb(const void *data, uint16_t len, void *user_data)
break;
default:
- if (!gatt_pdu || !gatt_pdu->data) {
+ if (!gatt_pdu || !gatt_pdu->iov_base) {
tester_print("Unknown ATT packet.");
break;
}
- if (gatt_pdu->size != len) {
+ if (gatt_pdu->iov_len != len) {
tester_print("Size of incoming frame is not valid");
- tester_print("Expected size = %d incoming size = %d",
- gatt_pdu->size, len);
+ tester_print("Expected size = %zd incoming size = %d",
+ gatt_pdu->iov_len, len);
break;
}
- if (memcmp(gatt_pdu->data, data, len)) {
+ if (memcmp(gatt_pdu->iov_base, data, len)) {
tester_print("Incoming data mismatch");
break;
}
queue_pop_head(t_data->pdus);
gatt_pdu = queue_pop_head(t_data->pdus);
- if (!gatt_pdu || !gatt_pdu->data)
+ if (!gatt_pdu || !gatt_pdu->iov_base)
break;
- bthost_send_cid(bthost, cid_data->handle, cid_data->cid,
- gatt_pdu->data, gatt_pdu->size);
+ bthost_send_cid_v(bthost, cid_data->handle, cid_data->cid,
+ gatt_pdu, 1);
break;
}
@@ -933,9 +933,9 @@ static void init_pdus(void)
struct test_data *data = tester_get_data();
struct step *current_data_step = queue_peek_head(data->steps);
struct step *step = g_new0(struct step, 1);
- struct pdu *pdu = current_data_step->set_data;
+ struct iovec *pdu = current_data_step->set_data;
- while (pdu->data) {
+ while (pdu->iov_base) {
queue_push_tail(data->pdus, pdu);
pdu++;
}
diff --git a/android/tester-hidhost.c b/android/tester-hidhost.c
index 4c8b4c6..a9d7bd9 100644
--- a/android/tester-hidhost.c
+++ b/android/tester-hidhost.c
@@ -139,20 +139,18 @@ static void hid_prepare_reply_protocol_mode(struct emu_l2cap_cid_data *cid_data)
{
struct test_data *t_data = tester_get_data();
struct bthost *bthost = hciemu_client_get_host(t_data->hciemu);
- const struct pdu pdu = raw_pdu(0xa0, 0x00);
+ const struct iovec pdu = raw_pdu(0xa0, 0x00);
- bthost_send_cid(bthost, cid_data->handle, cid_data->cid, pdu.data,
- pdu.size);
+ bthost_send_cid_v(bthost, cid_data->handle, cid_data->cid, &pdu, 1);
}
static void hid_prepare_reply_report(struct emu_l2cap_cid_data *cid_data)
{
struct test_data *t_data = tester_get_data();
struct bthost *bthost = hciemu_client_get_host(t_data->hciemu);
- const struct pdu pdu = raw_pdu(0xa2, 0x01, 0x00);
+ const struct iovec pdu = raw_pdu(0xa2, 0x01, 0x00);
- bthost_send_cid(bthost, cid_data->handle, cid_data->cid, pdu.data,
- pdu.size);
+ bthost_send_cid_v(bthost, cid_data->handle, cid_data->cid, &pdu, 1);
}
static void hid_ctrl_cid_hook_cb(const void *data, uint16_t len,
diff --git a/android/tester-main.c b/android/tester-main.c
index c728f05..41abf6d 100644
--- a/android/tester-main.c
+++ b/android/tester-main.c
@@ -2141,27 +2141,30 @@ static void emu_generic_cid_hook_cb(const void *data, uint16_t len,
struct bthost *bthost = hciemu_client_get_host(t_data->hciemu);
int i;
- for (i = 0; pdus[i].rsp.data; i++) {
- if (pdus[i].req.data) {
- if (pdus[i].req.size != len)
+ for (i = 0; pdus[i].rsp.iov_base; i++) {
+ if (pdus[i].req.iov_base) {
+ if (pdus[i].req.iov_len != len)
continue;
- if (memcmp(pdus[i].req.data, data, len))
+ if (memcmp(pdus[i].req.iov_base, data, len))
continue;
}
- if (pdus[i].rsp.data) {
+ if (pdus[i].rsp.iov_base) {
/* overwrite transaction id if its sdp pdu */
if (cid_data->is_sdp) {
- pdus[i].rsp.data[1] = ((uint8_t *) data)[1];
- pdus[i].rsp.data[2] = ((uint8_t *) data)[2];
+ ((uint8_t *) pdus[i].rsp.iov_base)[1] =
+ ((uint8_t *) data)[1];
+ ((uint8_t *) pdus[i].rsp.iov_base)[2] =
+ ((uint8_t *) data)[2];
}
- util_hexdump('>', pdus[i].rsp.data, pdus[i].rsp.size,
- print_data, NULL);
+ util_hexdump('>', pdus[i].rsp.iov_base,
+ pdus[i].rsp.iov_len, print_data, NULL);
+
+ bthost_send_cid_v(bthost, cid_data->handle,
+ cid_data->cid, &pdus[i].rsp, 1);
- bthost_send_cid(bthost, cid_data->handle, cid_data->cid,
- pdus[i].rsp.data, pdus[i].rsp.size);
}
}
}
diff --git a/android/tester-main.h b/android/tester-main.h
index 560277a..1b679d6 100644
--- a/android/tester-main.h
+++ b/android/tester-main.h
@@ -33,6 +33,7 @@
#include <sys/wait.h>
#include <libgen.h>
#include <sys/signalfd.h>
+#include <sys/uio.h>
#include "lib/bluetooth.h"
#include "lib/mgmt.h"
@@ -56,25 +57,20 @@
#include <hardware/bt_gatt_client.h>
#include <hardware/bt_gatt_server.h>
-struct pdu {
- uint8_t *data;
- uint16_t size;
-};
-
struct pdu_set {
- struct pdu req;
- struct pdu rsp;
+ struct iovec req;
+ struct iovec rsp;
};
#define raw_data(args...) ((unsigned char[]) { args })
#define raw_pdu(args...) \
{ \
- .data = raw_data(args), \
- .size = sizeof(raw_data(args)), \
+ .iov_base = raw_data(args), \
+ .iov_len = sizeof(raw_data(args)), \
}
-#define null_pdu { .data = NULL }
+#define null_pdu { .iov_base = NULL }
#define TEST_CASE_BREDR(text, ...) { \
HCIEMU_TYPE_BREDR, \
--
1.9.1