[PATCHv3 17/17] android/tester: Replace pdu struct with iovec

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux