You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ja...@apache.org on 2023/07/26 17:38:38 UTC
[mynewt-nimble] 09/12: apps/bttester: refactor GATT Client service
This is an automated email from the ASF dual-hosted git repository.
janc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit 7d25c1c71821ab15af415e0b26b5500d81825655
Author: Krzysztof Kopyściński <kr...@codecoup.pl>
AuthorDate: Thu Jul 13 09:09:38 2023 +0200
apps/bttester: refactor GATT Client service
Accomodated to new API.
---
apps/bttester/src/btp/btp_gattc.h | 3 +
apps/bttester/src/btp/bttester.h | 8 +-
apps/bttester/src/btp_core.c | 6 +
apps/bttester/src/btp_gatt_cl.c | 676 ++++++++++++++++++++------------------
4 files changed, 373 insertions(+), 320 deletions(-)
diff --git a/apps/bttester/src/btp/btp_gattc.h b/apps/bttester/src/btp/btp_gattc.h
index 7c642fdd6..76510b47a 100644
--- a/apps/bttester/src/btp/btp_gattc.h
+++ b/apps/bttester/src/btp/btp_gattc.h
@@ -34,6 +34,9 @@ struct btp_gattc_read_supported_commands_rp {
} __packed;
#define BTP_GATTC_EXCHANGE_MTU 0x02
+struct btp_gattc_exchange_mtu_cmd {
+ ble_addr_t address;
+} __packed;
#define BTP_GATTC_DISC_ALL_PRIM_SVCS 0x03
struct btp_gattc_disc_all_prim_svcs_cmd {
diff --git a/apps/bttester/src/btp/bttester.h b/apps/bttester/src/btp/bttester.h
index 0c8db52a4..c986a7e97 100644
--- a/apps/bttester/src/btp/bttester.h
+++ b/apps/bttester/src/btp/bttester.h
@@ -100,9 +100,6 @@ uint8_t
tester_init_gatt(void);
uint8_t
tester_unregister_gatt(void);
-void
-tester_handle_gattc(uint8_t opcode, uint8_t *data,
- uint16_t len);
int
tester_gattc_notify_rx_ev(uint16_t conn_handle, uint16_t attr_handle,
uint8_t indication, struct os_mbuf *om);
@@ -128,7 +125,10 @@ tester_init_mesh(void);
uint8_t
tester_unregister_mesh(void);
#endif /* MYNEWT_VAL(BLE_MESH) */
-
+uint8_t
+tester_init_gatt_cl(void);
+uint8_t
+tester_unregister_gatt_cl(void);
void
gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg);
diff --git a/apps/bttester/src/btp_core.c b/apps/bttester/src/btp_core.c
index fe1b8d445..35dcd824b 100644
--- a/apps/bttester/src/btp_core.c
+++ b/apps/bttester/src/btp_core.c
@@ -101,6 +101,9 @@ register_service(const void *cmd, uint16_t cmd_len,
case BTP_SERVICE_ID_MESH:
status = tester_init_mesh();
break;
+ case BTP_SERVICE_ID_GATTC:
+ status = tester_init_gatt_cl();
+ break;
#endif /* MYNEWT_VAL(BLE_MESH) */
default:
status = BTP_STATUS_FAILED;
@@ -148,6 +151,9 @@ unregister_service(const void *cmd, uint16_t cmd_len,
status = tester_unregister_mesh();
break;
#endif /* MYNEWT_VAL(BLE_MESH) */
+ case BTP_SERVICE_ID_GATTC:
+ status = tester_unregister_gatt_cl();
+ break;
default:
status = BTP_STATUS_FAILED;
break;
diff --git a/apps/bttester/src/btp_gatt_cl.c b/apps/bttester/src/btp_gatt_cl.c
index 0ba494a10..501c46030 100644
--- a/apps/bttester/src/btp_gatt_cl.c
+++ b/apps/bttester/src/btp_gatt_cl.c
@@ -149,31 +149,28 @@ fail:
return 0;
}
-static void
-exchange_mtu(uint8_t *data, uint16_t len)
+static uint8_t
+exchange_mtu(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
+ const struct btp_gattc_exchange_mtu_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
if (ble_gattc_exchange_mtu(conn.conn_handle,
tester_mtu_exchanged_ev,
NULL)) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_EXCHANGE_MTU,
- status);
+ return BTP_STATUS_SUCCESS;
}
static int
@@ -253,65 +250,58 @@ free:
return rc;
}
-static void
-disc_all_prim_svcs(uint8_t *data, uint16_t len)
+static uint8_t
+disc_all_prim_svcs(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
+ const struct btp_gattc_disc_all_prim_svcs_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
if (ble_gattc_disc_all_svcs(conn.conn_handle, disc_prim_svcs_cb,
(void *) BTP_GATTC_DISC_ALL_PRIM_RP)) {
discover_destroy();
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_ALL_PRIM_SVCS,
- status);
+ return BTP_STATUS_SUCCESS;
}
-static void
-disc_prim_uuid(uint8_t *data, uint16_t len)
+static uint8_t
+disc_prim_uuid(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_disc_prim_uuid_cmd *cmd = (void *) data;
+ const struct btp_gattc_disc_prim_uuid_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
ble_uuid_any_t uuid;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
- if (btp2bt_uuid(cmd->uuid, cmd->uuid_length, &uuid)) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ if (btp2bt_uuid(cp->uuid, cp->uuid_length, &uuid)) {
+ return BTP_STATUS_FAILED;
}
if (ble_gattc_disc_svc_by_uuid(conn.conn_handle,
&uuid.u, disc_prim_svcs_cb,
(void *) BTP_GATTC_DISC_PRIM_UUID_RP)) {
discover_destroy();
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_PRIM_UUID, status);
+ return BTP_STATUS_SUCCESS;
}
static int
@@ -396,38 +386,35 @@ free:
return rc;
}
-static void
-find_included(uint8_t *data, uint16_t len)
+static uint8_t
+find_included(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_find_included_cmd *cmd = (void *) data;
+ const struct btp_gattc_find_included_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
int service_handle_arg;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
- start_handle = le16toh(cmd->start_handle);
- end_handle = le16toh(cmd->end_handle);
+ start_handle = le16toh(cp->start_handle);
+ end_handle = le16toh(cp->end_handle);
service_handle_arg = start_handle;
if (ble_gattc_find_inc_svcs(conn.conn_handle, start_handle, end_handle,
find_included_cb,
(void *) service_handle_arg)) {
discover_destroy();
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_FIND_INCLUDED, status);
+ return BTP_STATUS_SUCCESS;
}
static int
@@ -512,26 +499,25 @@ free:
return rc;
}
-static void
-disc_all_chrc(uint8_t *data, uint16_t len)
+static uint8_t
+disc_all_chrc(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_disc_all_chrc_cmd *cmd = (void *) data;
+ const struct btp_gattc_disc_all_chrc_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
SYS_LOG_DBG("Conn find rsped");
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
- start_handle = le16toh(cmd->start_handle);
- end_handle = le16toh(cmd->end_handle);
+ start_handle = le16toh(cp->start_handle);
+ end_handle = le16toh(cp->end_handle);
rc = ble_gattc_disc_all_chrs(conn.conn_handle,
start_handle,
@@ -540,51 +526,45 @@ disc_all_chrc(uint8_t *data, uint16_t len)
(void *) BTP_GATTC_DISC_ALL_CHRC_RP);
if (rc) {
discover_destroy();
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_ALL_CHRC, status);
+ return BTP_STATUS_SUCCESS;
}
-static void
-disc_chrc_uuid(uint8_t *data, uint16_t len)
+static uint8_t
+disc_chrc_uuid(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_disc_chrc_uuid_cmd *cmd = (void *) data;
+ const struct btp_gattc_disc_chrc_uuid_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
ble_uuid_any_t uuid;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
- if (btp2bt_uuid(cmd->uuid, cmd->uuid_length, &uuid)) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ if (btp2bt_uuid(cp->uuid, cp->uuid_length, &uuid)) {
+ return BTP_STATUS_FAILED;
}
- start_handle = le16toh(cmd->start_handle);
- end_handle = le16toh(cmd->end_handle);
+ start_handle = le16toh(cp->start_handle);
+ end_handle = le16toh(cp->end_handle);
rc = ble_gattc_disc_chrs_by_uuid(conn.conn_handle, start_handle,
end_handle, &uuid.u, disc_chrc_cb,
(void *) BTP_GATTC_DISC_CHRC_UUID_RP);
if (rc) {
discover_destroy();
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_CHRC_UUID, status);
+ return BTP_STATUS_SUCCESS;
}
static int
@@ -665,25 +645,24 @@ free:
return rc;
}
-static void
-disc_all_desc(uint8_t *data, uint16_t len)
+static uint8_t
+disc_all_desc(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_disc_all_desc_cmd *cmd = (void *) data;
+ const struct btp_gattc_disc_all_desc_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
- start_handle = le16toh(cmd->start_handle) - 1;
- end_handle = le16toh(cmd->end_handle);
+ start_handle = le16toh(cp->start_handle) - 1;
+ end_handle = le16toh(cp->end_handle);
rc = ble_gattc_disc_all_dscs(conn.conn_handle,
start_handle,
@@ -695,12 +674,10 @@ disc_all_desc(uint8_t *data, uint16_t len)
if (rc) {
discover_destroy();
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_ALL_DESC, status);
+ return BTP_STATUS_SUCCESS;
}
static int
@@ -756,34 +733,31 @@ free:
return rc;
}
-static void
-read(uint8_t *data, uint16_t len)
+static uint8_t
+read(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_read_cmd *cmd = (void *) data;
+ const struct btp_gattc_read_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
/* Clear buffer */
read_destroy();
- if (ble_gattc_read(conn.conn_handle, le16toh(cmd->handle),
+ if (ble_gattc_read(conn.conn_handle, le16toh(cp->handle),
read_cb, (void *) BTP_GATTC_READ_RP)) {
read_destroy();
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ, status);
+ return BTP_STATUS_SUCCESS;
}
static int
@@ -857,41 +831,38 @@ free:
return rc;
}
-static void
-read_uuid(uint8_t *data, uint16_t len)
+static uint8_t
+read_uuid(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_read_uuid_cmd *cmd = (void *) data;
+ const struct btp_gattc_read_uuid_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
ble_uuid_any_t uuid;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
- if (btp2bt_uuid(cmd->uuid, cmd->uuid_length, &uuid)) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ if (btp2bt_uuid(cp->uuid, cp->uuid_length, &uuid)) {
+ return BTP_STATUS_FAILED;
}
/* Clear buffer */
read_destroy();
if (ble_gattc_read_by_uuid(conn.conn_handle,
- le16toh(cmd->start_handle),
- le16toh(cmd->end_handle), &uuid.u,
+ le16toh(cp->start_handle),
+ le16toh(cp->end_handle), &uuid.u,
read_uuid_cb, (void *) BTP_GATTC_READ_UUID_RP)) {
read_destroy();
- status = BTP_STATUS_FAILED;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_UUID, status);
+ return BTP_STATUS_SUCCESS;
}
static int
@@ -955,56 +926,53 @@ free:
return rc;
}
-static void
-read_long(uint8_t *data, uint16_t len)
+static uint8_t
+read_long(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_read_long_cmd *cmd = (void *) data;
+ const struct btp_gattc_read_long_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
/* Clear buffer */
read_destroy();
if (ble_gattc_read_long(conn.conn_handle,
- le16toh(cmd->handle),
- le16toh(cmd->offset),
+ le16toh(cp->handle),
+ le16toh(cp->offset),
read_long_cb, (void *) BTP_GATTC_READ_LONG_RP)) {
read_destroy();
- status = BTP_STATUS_FAILED;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_LONG, status);
+ return BTP_STATUS_SUCCESS;
}
-static void
-read_multiple(uint8_t *data, uint16_t len)
+static uint8_t
+read_multiple(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_read_multiple_cmd *cmd = (void *) data;
- uint16_t handles[cmd->handles_count];
+ const struct btp_gattc_read_multiple_cmd *cp = cmd;
+ uint16_t handles[cp->handles_count];
struct ble_gap_conn_desc conn;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc, i;
SYS_LOG_DBG("");
for (i = 0; i < ARRAY_SIZE(handles); i++) {
- handles[i] = le16toh(cmd->handles[i]);
+ handles[i] = le16toh(cp->handles[i]);
}
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
/* Clear buffer */
@@ -1012,41 +980,43 @@ read_multiple(uint8_t *data, uint16_t len)
if (ble_gattc_read_mult(conn.conn_handle,
handles,
- cmd->handles_count,
+ cp->handles_count,
read_cb,
(void *) BTP_GATTC_READ_MULTIPLE_RP)) {
read_destroy();
- status = BTP_STATUS_FAILED;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_MULTIPLE, status);
+ return BTP_STATUS_SUCCESS;
}
-static void
-write_without_rsp(uint8_t *data, uint16_t len, uint8_t op, bool sign)
+static uint8_t
+write_without_rsp(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_write_without_rsp_cmd *cmd = (void *) data;
+ const struct btp_gattc_write_without_rsp_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ if (cmd_len < sizeof(*cp) ||
+ cmd_len != sizeof(*cp) + le16toh(cp->data_length)) {
+ return BTP_STATUS_FAILED;
+ }
+
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
if (ble_gattc_write_no_rsp_flat(conn.conn_handle,
- le16toh(cmd->handle), cmd->data,
- le16toh(cmd->data_length))) {
- status = BTP_STATUS_FAILED;
+ le16toh(cp->handle), cp->data,
+ le16toh(cp->data_length))) {
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, op, status);
+ return BTP_STATUS_SUCCESS;
}
static int
@@ -1084,71 +1054,75 @@ free:
return rc;
}
-static void
-write(uint8_t *data, uint16_t len)
+static uint8_t
+write(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_write_cmd *cmd = (void *) data;
+ const struct btp_gattc_write_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ if (cmd_len < sizeof(*cp) ||
+ cmd_len != sizeof(*cp) + le16toh(cp->data_length)) {
+ return BTP_STATUS_FAILED;
+ }
+
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
- if (ble_gattc_write_flat(conn.conn_handle, le16toh(cmd->handle),
- cmd->data, le16toh(cmd->data_length),
+ if (ble_gattc_write_flat(conn.conn_handle, le16toh(cp->handle),
+ cp->data, le16toh(cp->data_length),
write_cb, (void *) BTP_GATTC_WRITE_RP)) {
- status = BTP_STATUS_FAILED;
+ return BTP_STATUS_FAILED;
}
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_WRITE, status);
+ return BTP_STATUS_SUCCESS;
}
-static void
-write_long(uint8_t *data, uint16_t len)
+static uint8_t
+write_long(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_write_long_cmd *cmd = (void *) data;
+ const struct btp_gattc_write_long_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
struct os_mbuf *om = NULL;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc = 0;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ if (cmd_len < sizeof(*cp) ||
+ cmd_len != sizeof(*cp) + le16toh(cp->data_length)) {
+ goto fail;
+ }
+
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
goto fail;
}
- om = ble_hs_mbuf_from_flat(cmd->data, le16toh(cmd->data_length));
+ om = ble_hs_mbuf_from_flat(cp->data, le16toh(cp->data_length));
if (!om) {
SYS_LOG_ERR("Insufficient resources");
- status = BTP_STATUS_FAILED;
goto fail;
}
rc = ble_gattc_write_long(conn.conn_handle,
- le16toh(cmd->handle),
- le16toh(cmd->offset),
+ le16toh(cp->handle),
+ le16toh(cp->offset),
om, write_cb,
(void *) BTP_GATTC_WRITE_LONG_RP);
- if (rc) {
- status = BTP_STATUS_FAILED;
- } else {
- goto rsp;
+ if (!rc) {
+ return BTP_STATUS_DELAY_REPLY;
}
fail:
SYS_LOG_ERR("Failed to send Write Long request, rc=%d", rc);
os_mbuf_free_chain(om);
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_WRITE_LONG, status);
+ return BTP_STATUS_FAILED;
}
static int
@@ -1187,49 +1161,46 @@ free:
return rc;
}
-static void
-reliable_write(uint8_t *data, uint16_t len)
+static uint8_t
+reliable_write(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_reliable_write_cmd *cmd = (void *) data;
+ const struct btp_gattc_reliable_write_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
struct ble_gatt_attr attr;
struct os_mbuf *om = NULL;
- uint8_t status = BTP_STATUS_SUCCESS;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto fail;
+ return BTP_STATUS_SUCCESS;
}
- om = ble_hs_mbuf_from_flat(cmd->data, le16toh(cmd->data_length));
+ om = ble_hs_mbuf_from_flat(cp->data, le16toh(cp->data_length));
/* This is required, because Nimble checks if
* the data is longer than offset
*/
- if (os_mbuf_extend(om, le16toh(cmd->offset) + 1) == NULL) {
- status = BTP_STATUS_FAILED;
- goto fail;
+ if (os_mbuf_extend(om, le16toh(cp->offset) + 1) == NULL) {
+ return BTP_STATUS_SUCCESS;
}
- attr.handle = le16toh(cmd->handle);
- attr.offset = le16toh(cmd->offset);
+ attr.handle = le16toh(cp->handle);
+ attr.offset = le16toh(cp->offset);
attr.om = om;
if (ble_gattc_write_reliable(conn.conn_handle, &attr, 1,
reliable_write_cb, NULL)) {
- status = BTP_STATUS_FAILED;
goto fail;
- } else {
- goto rsp;
}
+ return BTP_STATUS_SUCCESS;
+
fail:
os_mbuf_free_chain(om);
-rsp:
- tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_WRITE_LONG, status);
+
+ return BTP_STATUS_FAILED;
}
static int
@@ -1323,37 +1294,65 @@ disable_subscription(uint16_t conn_handle, uint16_t ccc_handle)
return 0;
}
-static void
-config_subscription(uint8_t *data, uint16_t len, uint8_t op)
+static uint8_t
+config_subscription_notif(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- const struct btp_gattc_cfg_notify_cmd *cmd = (void *) data;
+ const struct btp_gattc_cfg_notify_cmd *cp = cmd;
struct ble_gap_conn_desc conn;
- uint16_t ccc_handle = le16toh(cmd->ccc_handle);
- uint8_t status = BTP_STATUS_SUCCESS;
+ uint16_t ccc_handle = le16toh(cp->ccc_handle);
+ uint8_t status;
int rc;
SYS_LOG_DBG("");
- rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
if (rc) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ return BTP_STATUS_FAILED;
}
- if (cmd->enable) {
- uint16_t value;
+ if (cp->enable) {
+ if (enable_subscription(conn.conn_handle,
+ ccc_handle, 0x0001) == 0) {
+ return BTP_STATUS_SUCCESS;
+ }
- if (op == BTP_GATTC_CFG_NOTIFY) {
- value = 0x0001;
+ status = BTP_STATUS_FAILED;
+ } else {
+ if (disable_subscription(conn.conn_handle, ccc_handle) < 0) {
+ status = BTP_STATUS_FAILED;
} else {
- value = 0x0002;
+ status = BTP_STATUS_SUCCESS;
}
+ }
+
+ return status;
+}
+
+static uint8_t
+config_subscription_ind(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
+{
+ const struct btp_gattc_cfg_notify_cmd *cp = cmd;
+ struct ble_gap_conn_desc conn;
+ uint16_t ccc_handle = le16toh(cp->ccc_handle);
+ uint8_t status;
+ int rc;
+
+ SYS_LOG_DBG("");
+
+ rc = ble_gap_conn_find_by_addr(&cp->address, &conn);
+ if (rc) {
+ return BTP_STATUS_FAILED;
+ }
+ if (cp->enable) {
if (enable_subscription(conn.conn_handle,
- ccc_handle, value) != 0) {
- status = BTP_STATUS_FAILED;
- goto rsp;
+ ccc_handle, 0x0002) == 0) {
+ return BTP_STATUS_SUCCESS;
}
+
+ status = BTP_STATUS_FAILED;
} else {
if (disable_subscription(conn.conn_handle, ccc_handle) < 0) {
status = BTP_STATUS_FAILED;
@@ -1362,10 +1361,7 @@ config_subscription(uint8_t *data, uint16_t len, uint8_t op)
}
}
-rsp:
- SYS_LOG_DBG("Config subscription (op %u) status %u", op, status);
-
- tester_rsp(BTP_SERVICE_ID_GATTC, op, status);
+ return status;
}
int
@@ -1405,109 +1401,157 @@ fail:
return 0;
}
-static void
-supported_commands(uint8_t *data, uint16_t len)
+static uint8_t
+supported_commands(const void *cmd, uint16_t cmd_len,
+ void *rsp, uint16_t *rsp_len)
{
- uint8_t cmds[3];
- struct btp_gatt_read_supported_commands_rp *rp = (void *) cmds;
+ struct btp_gattc_read_supported_commands_rp *rp = rsp;
SYS_LOG_DBG("");
- memset(cmds, 0, sizeof(cmds));
-
- tester_set_bit(cmds, BTP_GATTC_READ_SUPPORTED_COMMANDS);
- tester_set_bit(cmds, BTP_GATTC_EXCHANGE_MTU);
- tester_set_bit(cmds, BTP_GATTC_DISC_ALL_PRIM_SVCS);
- tester_set_bit(cmds, BTP_GATTC_DISC_PRIM_UUID);
- tester_set_bit(cmds, BTP_GATTC_FIND_INCLUDED);
- tester_set_bit(cmds, BTP_GATTC_DISC_ALL_CHRC);
- tester_set_bit(cmds, BTP_GATTC_DISC_CHRC_UUID);
- tester_set_bit(cmds, BTP_GATTC_DISC_ALL_DESC);
- tester_set_bit(cmds, BTP_GATTC_READ);
- tester_set_bit(cmds, BTP_GATTC_READ_UUID);
- tester_set_bit(cmds, BTP_GATTC_READ_LONG);
- tester_set_bit(cmds, BTP_GATTC_READ_MULTIPLE);
- tester_set_bit(cmds, BTP_GATTC_WRITE_WITHOUT_RSP);
+ /* octet 0 */
+ tester_set_bit(rp->data, BTP_GATTC_READ_SUPPORTED_COMMANDS);
+ tester_set_bit(rp->data, BTP_GATTC_EXCHANGE_MTU);
+ tester_set_bit(rp->data, BTP_GATTC_DISC_ALL_PRIM_SVCS);
+ tester_set_bit(rp->data, BTP_GATTC_DISC_PRIM_UUID);
+ tester_set_bit(rp->data, BTP_GATTC_FIND_INCLUDED);
+ tester_set_bit(rp->data, BTP_GATTC_DISC_ALL_CHRC);
+ tester_set_bit(rp->data, BTP_GATTC_DISC_CHRC_UUID);
+ /* octet 1 */
+ tester_set_bit(rp->data, BTP_GATTC_DISC_ALL_DESC);
+ tester_set_bit(rp->data, BTP_GATTC_READ);
+ tester_set_bit(rp->data, BTP_GATTC_READ_UUID);
+ tester_set_bit(rp->data, BTP_GATTC_READ_LONG);
+ tester_set_bit(rp->data, BTP_GATTC_READ_MULTIPLE);
+ tester_set_bit(rp->data, BTP_GATTC_WRITE_WITHOUT_RSP);
#if 0
- tester_set_bit(cmds, BTP_GATTC_SIGNED_WRITE_WITHOUT_RSP);
+ tester_set_bit(rp->data, BTP_GATTC_SIGNED_WRITE_WITHOUT_RSP);
#endif
- tester_set_bit(cmds, BTP_GATTC_WRITE);
- tester_set_bit(cmds, BTP_GATTC_WRITE_LONG);
- tester_set_bit(cmds, BTP_GATTC_RELIABLE_WRITE);
- tester_set_bit(cmds, BTP_GATTC_CFG_NOTIFY);
- tester_set_bit(cmds, BTP_GATTC_CFG_INDICATE);
-
- tester_send(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_SUPPORTED_COMMANDS,
- (uint8_t *) rp, sizeof(cmds));
+ tester_set_bit(rp->data, BTP_GATTC_WRITE);
+ /* octet 2 */
+ tester_set_bit(rp->data, BTP_GATTC_WRITE_LONG);
+ tester_set_bit(rp->data, BTP_GATTC_RELIABLE_WRITE);
+ tester_set_bit(rp->data, BTP_GATTC_CFG_NOTIFY);
+ tester_set_bit(rp->data, BTP_GATTC_CFG_INDICATE);
+
+ *rsp_len = sizeof(*rp) + 3;
+
+ return BTP_STATUS_SUCCESS;
}
-void
-tester_handle_gattc(uint8_t opcode, uint8_t *data,
- uint16_t len)
-{
- switch (opcode) {
- case BTP_GATTC_READ_SUPPORTED_COMMANDS:
- supported_commands(data, len);
- return;
- case BTP_GATTC_EXCHANGE_MTU:
- exchange_mtu(data, len);
- return;
- case BTP_GATTC_DISC_ALL_PRIM_SVCS:
- disc_all_prim_svcs(data, len);
- return;
- case BTP_GATTC_DISC_PRIM_UUID:
- disc_prim_uuid(data, len);
- return;
- case BTP_GATTC_FIND_INCLUDED:
- find_included(data, len);
- return;
- case BTP_GATTC_DISC_ALL_CHRC:
- disc_all_chrc(data, len);
- return;
- case BTP_GATTC_DISC_CHRC_UUID:
- disc_chrc_uuid(data, len);
- return;
- case BTP_GATTC_DISC_ALL_DESC:
- disc_all_desc(data, len);
- return;
- case BTP_GATTC_READ:
- read(data, len);
- return;
- case BTP_GATTC_READ_UUID:
- read_uuid(data, len);
- return;
- case BTP_GATTC_READ_LONG:
- read_long(data, len);
- return;
- case BTP_GATTC_READ_MULTIPLE:
- read_multiple(data, len);
- return;
- case BTP_GATTC_WRITE_WITHOUT_RSP:
- write_without_rsp(data,
- len,
- opcode,
- false);
- return;
+
+static const struct btp_handler handlers[] = {
+ {
+ .opcode = BTP_GATTC_READ_SUPPORTED_COMMANDS,
+ .index = BTP_INDEX_NONE,
+ .expect_len = 0,
+ .func = supported_commands,
+ },
+ {
+ .opcode = BTP_GATTC_EXCHANGE_MTU,
+ .expect_len = sizeof(struct btp_gattc_exchange_mtu_cmd),
+ .func = exchange_mtu,
+ },
+ {
+ .opcode = BTP_GATTC_DISC_ALL_PRIM_SVCS,
+ .expect_len = sizeof(struct btp_gattc_disc_all_prim_svcs_cmd),
+ .func = disc_all_prim_svcs,
+ },
+ {
+ .opcode = BTP_GATTC_DISC_PRIM_UUID,
+ .expect_len = -1,
+ .func = disc_prim_uuid,
+ },
+ {
+ .opcode = BTP_GATTC_FIND_INCLUDED,
+ .expect_len = sizeof(struct btp_gattc_find_included_cmd),
+ .func = find_included,
+ },
+ {
+ .opcode = BTP_GATTC_DISC_ALL_CHRC,
+ .expect_len = sizeof(struct btp_gattc_disc_all_chrc_cmd),
+ .func = disc_all_chrc,
+ },
+ {
+ .opcode = BTP_GATTC_DISC_CHRC_UUID,
+ .expect_len = -1,
+ .func = disc_chrc_uuid,
+ },
+ {
+ .opcode = BTP_GATTC_DISC_ALL_DESC,
+ .expect_len = sizeof(struct btp_gattc_disc_all_desc_cmd),
+ .func = disc_all_desc,
+ },
+ {
+ .opcode = BTP_GATTC_READ,
+ .expect_len = sizeof(struct btp_gattc_read_cmd),
+ .func = read,
+ },
+ {
+ .opcode = BTP_GATTC_READ_UUID,
+ .expect_len = -1,
+ .func = read_uuid,
+ },
+ {
+ .opcode = BTP_GATTC_READ_LONG,
+ .expect_len = sizeof(struct btp_gattc_read_long_cmd),
+ .func = read_long,
+ },
+ {
+ .opcode = BTP_GATTC_READ_MULTIPLE,
+ .expect_len = -1,
+ .func = read_multiple,
+ },
+ {
+ .opcode = BTP_GATTC_WRITE_WITHOUT_RSP,
+ .expect_len = -1,
+ .func = write_without_rsp,
+ },
#if 0
- case BTP_GATTC_SIGNED_WRITE_WITHOUT_RSP:
- write_without_rsp(data, len, opcode, true);
- return;
+ {
+ .opcode = BTP_GATTC_SIGNED_WRITE_WITHOUT_RSP,
+ .expect_len = -1,
+ .func = write_signed_without_rsp,
+ },
#endif
- case BTP_GATTC_WRITE:
- write(data, len);
- return;
- case BTP_GATTC_WRITE_LONG:
- write_long(data, len);
- return;
- case BTP_GATTC_RELIABLE_WRITE:
- reliable_write(data, len);
- return;
- case BTP_GATTC_CFG_NOTIFY:
- case BTP_GATTC_CFG_INDICATE:
- config_subscription(data, len, opcode);
- return;
- default:
- tester_rsp(BTP_SERVICE_ID_GATTC, opcode, BTP_STATUS_UNKNOWN_CMD);
- return;
- }
-}
\ No newline at end of file
+ {
+ .opcode = BTP_GATTC_WRITE,
+ .expect_len = -1,
+ .func = write,
+ },
+ {
+ .opcode = BTP_GATTC_WRITE_LONG,
+ .expect_len = -1,
+ .func = write_long,
+ },
+ {
+ .opcode = BTP_GATTC_RELIABLE_WRITE,
+ .expect_len = -1,
+ .func = reliable_write,
+ },
+ {
+ .opcode = BTP_GATTC_CFG_NOTIFY,
+ .expect_len = sizeof(struct btp_gattc_cfg_notify_cmd),
+ .func = config_subscription_notif,
+ },
+ {
+ .opcode = BTP_GATTC_CFG_INDICATE,
+ .expect_len = sizeof(struct btp_gattc_cfg_notify_cmd),
+ .func = config_subscription_ind,
+ },
+};
+
+uint8_t
+tester_init_gatt_cl(void)
+{
+ tester_register_command_handlers(BTP_SERVICE_ID_GATTC, handlers,
+ ARRAY_SIZE(handlers));
+
+ return BTP_STATUS_SUCCESS;
+}
+
+uint8_t
+tester_unregister_gatt_cl(void)
+{
+ return BTP_STATUS_SUCCESS;
+}