apps/bttester: refactor BTP handling

This commit refactors BTP handling to new model, where API is provided for
registration of handlers for BTP commands as callbacks. New API provides also
size check and common buffer for response.

Removes Controlle Index validation from BTP handlers, as these are always 0.

Corrected some formatting for variable declarations.

This refactors only core and GAP service into new API, rest of services will
not work but are compiled. They will be refactored in following commits.
This commit is contained in:
Krzysztof Kopyściński
2023-07-07 14:33:08 +02:00
committed by Szymon Janc
parent 32e39750d6
commit 2d4c591e27
11 changed files with 926 additions and 801 deletions
+8
View File
@@ -44,6 +44,7 @@
#define BTP_DATA_MAX_SIZE (BTP_MTU - sizeof(struct btp_hdr))
#define BTP_INDEX_NONE 0xff
#define BTP_INDEX 0x00
#define BTP_SERVICE_ID_CORE 0
#define BTP_SERVICE_ID_GAP 1
@@ -52,11 +53,18 @@
#define BTP_SERVICE_ID_MESH 4
#define BTP_SERVICE_ID_GATTC 6
#define BTP_SERVICE_ID_MAX BTP_SERVICE_ID_GATTC
#define BTP_STATUS_SUCCESS 0x00
#define BTP_STATUS_FAILED 0x01
#define BTP_STATUS_UNKNOWN_CMD 0x02
#define BTP_STATUS_NOT_READY 0x03
/* TODO indicate delay response, should be removed when all commands are
* converted to cmd+status+ev pattern
*/
#define BTP_STATUS_DELAY_REPLY 0xFF
#define SYS_LOG_DBG(fmt, ...) \
if (MYNEWT_VAL(BTTESTER_DEBUG)) { \
console_printf("[DBG] %s: " fmt "\n", \
+7
View File
@@ -121,6 +121,12 @@ struct btp_gap_start_advertising_cmd {
uint8_t scan_rsp_len;
uint8_t adv_data[0];
uint8_t scan_rsp[0];
/*
* This command is very unfortunate because it has two fields after variable
* data. Those needs to be handled explicitly by handler.
* uint32_t duration;
* uint8_t own_addr_type;
*/
} __packed;
struct btp_gap_start_advertising_rp {
uint32_t current_settings;
@@ -148,6 +154,7 @@ struct btp_gap_start_discovery_cmd {
struct btp_gap_connect_cmd {
uint8_t address_type;
uint8_t address[6];
uint8_t own_addr_type;
} __packed;
#define BTP_GAP_DISCONNECT 0x0f
+20 -12
View File
@@ -36,6 +36,7 @@
#else
#include "glue.h"
#endif
#include <sys/types.h>
static inline void
tester_set_bit(uint8_t *addr, unsigned int bit)
@@ -57,10 +58,21 @@ tester_test_bit(const uint8_t *addr, unsigned int bit)
void
tester_init(void);
void
tester_rsp(uint8_t service, uint8_t opcode, uint8_t index, uint8_t status);
tester_rsp(uint8_t service, uint8_t opcode, uint8_t status);
void
tester_send(uint8_t service, uint8_t opcode, uint8_t index, uint8_t *data,
size_t len);
tester_send(uint8_t service, uint8_t opcode, uint8_t *data, size_t len);
struct btp_handler {
uint8_t opcode;
uint8_t index;
ssize_t expect_len;
uint8_t (*func)(const void *cmd, uint16_t cmd_len,
void *rsp, uint16_t *rsp_len);
};
void tester_register_command_handlers(uint8_t service,
const struct btp_handler *handlers,
size_t num);
void
tester_send_buf(uint8_t service, uint8_t opcode, uint8_t index,
struct os_mbuf *buf);
@@ -70,20 +82,16 @@ tester_init_gap(void);
uint8_t
tester_unregister_gap(void);
void
tester_handle_gap(uint8_t opcode, uint8_t index, uint8_t *data,
uint16_t len);
void
tester_handle_core(uint8_t opcode, uint8_t index, uint8_t *data,
uint16_t len);
tester_init_core(void);
uint8_t
tester_init_gatt(void);
uint8_t
tester_unregister_gatt(void);
void
tester_handle_gatt(uint8_t opcode, uint8_t index, uint8_t *data,
tester_handle_gatt(uint8_t opcode, uint8_t *data,
uint16_t len);
void
tester_handle_gattc(uint8_t opcode, uint8_t index, uint8_t *data,
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,
@@ -103,7 +111,7 @@ tester_init_l2cap(void);
uint8_t
tester_unregister_l2cap(void);
void
tester_handle_l2cap(uint8_t opcode, uint8_t index, uint8_t *data,
tester_handle_l2cap(uint8_t opcode, uint8_t *data,
uint16_t len);
#endif
@@ -113,7 +121,7 @@ tester_init_mesh(void);
uint8_t
tester_unregister_mesh(void);
void
tester_handle_mesh(uint8_t opcode, uint8_t index, uint8_t *data, uint16_t len);
tester_handle_mesh(uint8_t opcode, uint8_t *data, uint16_t len);
#endif /* MYNEWT_VAL(BLE_MESH) */
void
+103 -73
View File
@@ -26,71 +26,80 @@
*/
#include "btp/btp.h"
#include "atomic.h"
static void
supported_commands(uint8_t *data, uint16_t len)
static ATOMIC_DEFINE(registered_services, BTP_SERVICE_ID_MAX);
static uint8_t
supported_commands(const void *cmd, uint16_t cmd_len,
void *rsp, uint16_t *rsp_len)
{
uint8_t buf[1];
struct core_read_supported_commands_rp *rp = (void *) buf;
struct btp_core_read_supported_commands_rp *rp = rsp;
memset(buf, 0, sizeof(buf));
tester_set_bit(rp->data, BTP_CORE_READ_SUPPORTED_COMMANDS);
tester_set_bit(rp->data, BTP_CORE_READ_SUPPORTED_SERVICES);
tester_set_bit(rp->data, BTP_CORE_REGISTER_SERVICE);
tester_set_bit(rp->data, BTP_CORE_UNREGISTER_SERVICE);
tester_set_bit(buf, BTP_CORE_READ_SUPPORTED_COMMANDS);
tester_set_bit(buf, BTP_CORE_READ_SUPPORTED_SERVICES);
tester_set_bit(buf, BTP_CORE_REGISTER_SERVICE);
tester_set_bit(buf, BTP_CORE_UNREGISTER_SERVICE);
*rsp_len = sizeof(*rp) + 1;
tester_send(BTP_SERVICE_ID_CORE, BTP_CORE_READ_SUPPORTED_COMMANDS,
BTP_INDEX_NONE, (uint8_t *) rp, sizeof(buf));
return BTP_STATUS_SUCCESS;
}
static void
supported_services(uint8_t *data, uint16_t len)
static uint8_t
supported_services(const void *cmd, uint16_t cmd_len,
void *rsp, uint16_t *rsp_len)
{
uint8_t buf[1];
struct core_read_supported_services_rp *rp = (void *) buf;
struct btp_core_read_supported_services_rp *rp = rsp;
memset(buf, 0, sizeof(buf));
tester_set_bit(buf, BTP_SERVICE_ID_CORE);
tester_set_bit(buf, BTP_SERVICE_ID_GAP);
tester_set_bit(buf, BTP_SERVICE_ID_GATT);
/* octet 0 */
tester_set_bit(rp->data, BTP_SERVICE_ID_CORE);
tester_set_bit(rp->data, BTP_SERVICE_ID_GAP);
tester_set_bit(rp->data, BTP_SERVICE_ID_GATT);
#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM)
tester_set_bit(buf, BTP_SERVICE_ID_L2CAP);
tester_set_bit(rp->data, BTP_SERVICE_ID_L2CAP);
#endif /* MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) */
#if MYNEWT_VAL(BLE_MESH)
tester_set_bit(buf, BTP_SERVICE_ID_MESH);
tester_set_bit(rp->data, BTP_SERVICE_ID_MESH);
#endif /* MYNEWT_VAL(BLE_MESH) */
tester_set_bit(buf, BTP_SERVICE_ID_GATTC);
tester_set_bit(rp->data, BTP_SERVICE_ID_GATTC);
tester_send(BTP_SERVICE_ID_CORE, BTP_CORE_READ_SUPPORTED_SERVICES,
BTP_INDEX_NONE, (uint8_t *) rp, sizeof(buf));
*rsp_len = sizeof(*rp) + 2;
return BTP_STATUS_SUCCESS;
}
static void
register_service(uint8_t *data, uint16_t len)
static uint8_t
register_service(const void *cmd, uint16_t cmd_len,
void *rsp, uint16_t *rsp_len)
{
struct core_register_service_cmd *cmd = (void *) data;
const struct btp_core_register_service_cmd *cp = cmd;
uint8_t status;
switch (cmd->id) {
/* invalid service */
if ((cp->id == BTP_SERVICE_ID_CORE) || (cp->id > BTP_SERVICE_ID_MAX)) {
return BTP_STATUS_FAILED;
}
/* already registered */
if (atomic_test_bit(registered_services, cp->id)) {
return BTP_STATUS_FAILED;
}
switch (cp->id) {
case BTP_SERVICE_ID_GAP:
status = tester_init_gap();
/* Rsp with success status will be handled by bt enable cb */
if (status == BTP_STATUS_FAILED) {
goto rsp;
}
return;
break;
case BTP_SERVICE_ID_GATT:
status = tester_init_gatt();
break;
#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM)
case BTP_SERVICE_ID_L2CAP:
case BTP_SERVICE_ID_L2CAP:
status = tester_init_l2cap();
break;
#endif /* MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) */
#if MYNEWT_VAL(BLE_MESH)
case BTP_SERVICE_ID_MESH:
case BTP_SERVICE_ID_MESH:
status = tester_init_mesh();
break;
#endif /* MYNEWT_VAL(BLE_MESH) */
@@ -99,18 +108,31 @@ register_service(uint8_t *data, uint16_t len)
break;
}
rsp:
tester_rsp(BTP_SERVICE_ID_CORE, BTP_CORE_REGISTER_SERVICE, BTP_INDEX_NONE,
status);
if (status == BTP_STATUS_SUCCESS) {
atomic_set_bit(registered_services, cp->id);
}
return status;
}
static void
unregister_service(uint8_t *data, uint16_t len)
static uint8_t
unregister_service(const void *cmd, uint16_t cmd_len,
void *rsp, uint16_t *rsp_len)
{
struct core_unregister_service_cmd *cmd = (void *) data;
const struct btp_core_unregister_service_cmd *cp = cmd;
uint8_t status;
switch (cmd->id) {
/* invalid service ID */
if ((cp->id == BTP_SERVICE_ID_CORE) || (cp->id > BTP_SERVICE_ID_MAX)) {
return BTP_STATUS_FAILED;
}
/* not registered */
if (!atomic_test_bit(registered_services, cp->id)) {
return BTP_STATUS_FAILED;
}
switch (cp->id) {
case BTP_SERVICE_ID_GAP:
status = tester_unregister_gap();
break;
@@ -118,12 +140,12 @@ unregister_service(uint8_t *data, uint16_t len)
status = tester_unregister_gatt();
break;
#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM)
case BTP_SERVICE_ID_L2CAP:
case BTP_SERVICE_ID_L2CAP:
status = tester_unregister_l2cap();
break;
#endif /* MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) */
#if MYNEWT_VAL(BLE_MESH)
case BTP_SERVICE_ID_MESH:
case BTP_SERVICE_ID_MESH:
status = tester_unregister_mesh();
break;
#endif /* MYNEWT_VAL(BLE_MESH) */
@@ -132,36 +154,44 @@ unregister_service(uint8_t *data, uint16_t len)
break;
}
tester_rsp(BTP_SERVICE_ID_CORE, BTP_CORE_UNREGISTER_SERVICE, BTP_INDEX_NONE,
status);
if (status == BTP_STATUS_SUCCESS) {
atomic_clear_bit(registered_services, cp->id);
}
return status;
}
static const struct btp_handler handlers[] = {
{
.opcode = BTP_CORE_READ_SUPPORTED_COMMANDS,
.index = BTP_INDEX_NONE,
.expect_len = 0,
.func = supported_commands,
},
{
.opcode = BTP_CORE_READ_SUPPORTED_SERVICES,
.index = BTP_INDEX_NONE,
.expect_len = 0,
.func = supported_services,
},
{
.opcode = BTP_CORE_REGISTER_SERVICE,
.index = BTP_INDEX_NONE,
.expect_len = sizeof(struct btp_core_register_service_cmd),
.func = register_service,
},
{
.opcode = BTP_CORE_UNREGISTER_SERVICE,
.index = BTP_INDEX_NONE,
.expect_len = sizeof(struct btp_core_unregister_service_cmd),
.func = unregister_service,
},
};
void
tester_handle_core(uint8_t opcode, uint8_t index, uint8_t *data,
uint16_t len)
tester_init_core(void)
{
if (index != BTP_INDEX_NONE) {
tester_rsp(BTP_SERVICE_ID_CORE, opcode, index,
BTP_STATUS_FAILED);
return;
}
switch (opcode) {
case BTP_CORE_READ_SUPPORTED_COMMANDS:
supported_commands(data, len);
return;
case BTP_CORE_READ_SUPPORTED_SERVICES:
supported_services(data, len);
return;
case BTP_CORE_REGISTER_SERVICE:
register_service(data, len);
return;
case BTP_CORE_UNREGISTER_SERVICE:
unregister_service(data, len);
return;
default:
tester_rsp(BTP_SERVICE_ID_CORE, opcode, BTP_INDEX_NONE,
BTP_STATUS_UNKNOWN_CMD);
return;
}
tester_register_command_handlers(BTP_SERVICE_ID_CORE, handlers,
ARRAY_SIZE(handlers));
atomic_set_bit(registered_services, BTP_SERVICE_ID_CORE);
}
File diff suppressed because it is too large Load Diff
+83 -98
View File
@@ -256,7 +256,7 @@ static void
attr_value_changed_ev(uint16_t handle, struct os_mbuf *data)
{
struct btp_gatt_attr_value_changed_ev *ev;
struct os_mbuf *buf = os_msys_get(0, 0);
struct os_mbuf *buf = os_msys_get(0, 0);
SYS_LOG_DBG("");
@@ -583,7 +583,7 @@ start_server(uint8_t *data, uint16_t len)
rp.db_attr_off = 0;
rp.db_attr_cnt = 0;
tester_send(BTP_SERVICE_ID_GATT, BTP_GATT_START_SERVER, CONTROLLER_INDEX,
tester_send(BTP_SERVICE_ID_GATT, BTP_GATT_START_SERVER,
(uint8_t *) &rp, sizeof(rp));
}
@@ -672,29 +672,29 @@ read_cb(uint16_t conn_handle,
struct ble_gatt_attr *attr,
void *arg)
{
struct btp_gatt_read_rp *rp = (void *) gatt_buf.buf;
uint8_t btp_opcode = (uint8_t) (int) arg;
struct btp_gatt_read_rp *rp = (void *) gatt_buf.buf;
uint8_t btp_opcode = (uint8_t) (int) arg;
SYS_LOG_DBG("status=%d", error->status);
if (error->status != 0 && error->status != BLE_HS_EDONE) {
rp->att_response = (uint8_t) BLE_HS_ATT_ERR(error->status);
tester_send(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
tester_send(BTP_SERVICE_ID_GATT, btp_opcode, gatt_buf.buf, gatt_buf
.len);
read_destroy();
return 0;
}
if (!gatt_buf_add(attr->om->om_data, attr->om->om_len)) {
tester_rsp(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
read_destroy();
return 0;
}
rp->data_length += attr->om->om_len;
tester_send(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
gatt_buf.buf, gatt_buf.len);
read_destroy();
return 0;
@@ -704,7 +704,7 @@ static void
read(uint8_t *data, uint16_t len)
{
const struct btp_gatt_read_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
int rc;
SYS_LOG_DBG("");
@@ -730,8 +730,7 @@ read(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_READ, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_READ, BTP_STATUS_FAILED);
}
static int
@@ -740,29 +739,29 @@ read_long_cb(uint16_t conn_handle,
struct ble_gatt_attr *attr,
void *arg)
{
struct btp_gatt_read_rp *rp = (void *) gatt_buf.buf;
uint8_t btp_opcode = (uint8_t) (int) arg;
struct btp_gatt_read_rp *rp = (void *) gatt_buf.buf;
uint8_t btp_opcode = (uint8_t) (int) arg;
SYS_LOG_DBG("status=%d", error->status);
if (error->status != 0 && error->status != BLE_HS_EDONE) {
rp->att_response = (uint8_t) BLE_HS_ATT_ERR(error->status);
tester_send(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
tester_send(BTP_SERVICE_ID_GATT, btp_opcode, gatt_buf.buf, gatt_buf
.len);
read_destroy();
return 0;
}
if (error->status == BLE_HS_EDONE) {
tester_send(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
tester_send(BTP_SERVICE_ID_GATT, btp_opcode, gatt_buf.buf, gatt_buf
.len);
read_destroy();
return 0;
}
if (gatt_buf_add(attr->om->om_data, attr->om->om_len) == NULL) {
tester_rsp(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
read_destroy();
return BLE_HS_ENOMEM;
}
@@ -776,7 +775,7 @@ static void
read_long(uint8_t *data, uint16_t len)
{
const struct btp_gatt_read_long_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
int rc;
SYS_LOG_DBG("");
@@ -804,15 +803,14 @@ read_long(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_READ_LONG, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_READ_LONG, BTP_STATUS_FAILED);
}
static void
read_multiple(uint8_t *data, uint16_t len)
{
const struct btp_gatt_read_multiple_cmd *cmd = (void *) data;
uint16_t handles[cmd->handles_count];
uint16_t handles[cmd->handles_count];
struct ble_gap_conn_desc conn;
int rc, i;
@@ -844,15 +842,14 @@ read_multiple(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_READ_MULTIPLE, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_READ_MULTIPLE, BTP_STATUS_FAILED);
}
static void
write_without_rsp(uint8_t *data, uint16_t len, uint8_t op, bool sign)
{
const struct btp_gatt_write_without_rsp_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -871,7 +868,7 @@ write_without_rsp(uint8_t *data, uint16_t len, uint8_t op, bool sign)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATT, op, CONTROLLER_INDEX, status);
tester_rsp(BTP_SERVICE_ID_GATT, op, status);
}
static int
@@ -885,7 +882,7 @@ write_rsp(uint16_t conn_handle, const struct ble_gatt_error *error,
SYS_LOG_DBG("");
tester_send(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, &err, sizeof(err));
&err, sizeof(err));
return 0;
}
@@ -893,7 +890,7 @@ static void
write(uint8_t *data, uint16_t len)
{
const struct btp_gatt_write_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
int rc;
SYS_LOG_DBG("");
@@ -912,15 +909,14 @@ write(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_WRITE, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_WRITE, BTP_STATUS_FAILED);
}
static void
write_long(uint8_t *data, uint16_t len)
{
const struct btp_gatt_write_long_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
struct os_mbuf *om = NULL;
int rc = 0;
@@ -949,8 +945,7 @@ write_long(uint8_t *data, uint16_t len)
fail:
SYS_LOG_ERR("Failed to send Write Long request, rc=%d", rc);
os_mbuf_free_chain(om);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_WRITE_LONG, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_WRITE_LONG, BTP_STATUS_FAILED);
}
static int
@@ -965,7 +960,7 @@ reliable_write_rsp(uint16_t conn_handle,
SYS_LOG_DBG("Reliable write status %d", err);
tester_send(BTP_SERVICE_ID_GATT, BTP_GATT_RELIABLE_WRITE,
CONTROLLER_INDEX, &err, sizeof(err));
&err, sizeof(err));
return 0;
}
@@ -973,7 +968,7 @@ static void
reliable_write(uint8_t *data, uint16_t len)
{
const struct btp_gatt_reliable_write_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
struct ble_gatt_attr attr;
struct os_mbuf *om = NULL;
int rc;
@@ -1007,8 +1002,7 @@ reliable_write(uint8_t *data, uint16_t len)
fail:
os_mbuf_free_chain(om);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_WRITE_LONG, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_WRITE_LONG, BTP_STATUS_FAILED);
}
static struct bt_gatt_subscribe_params {
@@ -1021,7 +1015,7 @@ static void
read_uuid(uint8_t *data, uint16_t len)
{
const struct btp_gatt_read_uuid_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
ble_uuid_any_t uuid;
int rc;
@@ -1054,8 +1048,7 @@ read_uuid(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_READ, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_READ, BTP_STATUS_FAILED);
}
static int
@@ -1064,8 +1057,8 @@ disc_prim_uuid_cb(uint16_t conn_handle,
const struct ble_gatt_svc *gatt_svc, void *arg)
{
struct btp_gatt_disc_prim_uuid_rp *rp = (void *) gatt_buf.buf;
struct btp_gatt_service *service;
const ble_uuid_any_t *uuid;
struct btp_gatt_service *service;
const ble_uuid_any_t *uuid;
uint8_t uuid_length;
uint8_t opcode = (uint8_t) (int) arg;
@@ -1073,14 +1066,13 @@ disc_prim_uuid_cb(uint16_t conn_handle,
if (error->status != 0 && error->status != BLE_HS_EDONE) {
tester_rsp(BTP_SERVICE_ID_GATT, opcode,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
discover_destroy();
return 0;
}
if (error->status == BLE_HS_EDONE) {
tester_send(BTP_SERVICE_ID_GATT, opcode,
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
tester_send(BTP_SERVICE_ID_GATT, opcode, gatt_buf.buf, gatt_buf.len);
discover_destroy();
return 0;
}
@@ -1091,7 +1083,7 @@ disc_prim_uuid_cb(uint16_t conn_handle,
service = gatt_buf_reserve(sizeof(*service) + uuid_length);
if (!service) {
tester_rsp(BTP_SERVICE_ID_GATT, opcode,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
discover_destroy();
return BLE_HS_ENOMEM;
}
@@ -1121,22 +1113,22 @@ disc_all_desc_cb(uint16_t conn_handle,
void *arg)
{
struct btp_gatt_disc_all_desc_rp *rp = (void *) gatt_buf.buf;
struct btp_gatt_descriptor *dsc;
const ble_uuid_any_t *uuid;
struct btp_gatt_descriptor *dsc;
const ble_uuid_any_t *uuid;
uint8_t uuid_length;
SYS_LOG_DBG("");
if (error->status != 0 && error->status != BLE_HS_EDONE) {
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_ALL_DESC,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
discover_destroy();
return 0;
}
if (error->status == BLE_HS_EDONE) {
tester_send(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_ALL_DESC,
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
tester_send(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_ALL_DESC, gatt_buf
.buf, gatt_buf.len);
discover_destroy();
return 0;
}
@@ -1147,7 +1139,7 @@ disc_all_desc_cb(uint16_t conn_handle,
dsc = gatt_buf_reserve(sizeof(*dsc) + uuid_length);
if (!dsc) {
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_ALL_DESC,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
discover_destroy();
return BLE_HS_ENOMEM;
}
@@ -1194,14 +1186,14 @@ disc_all_prim_svcs(uint8_t *data, uint16_t len)
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_ALL_PRIM_SVCS,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
}
static void
disc_all_desc(uint8_t *data, uint16_t len)
{
const struct btp_gatt_disc_all_desc_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
int rc;
@@ -1232,8 +1224,7 @@ disc_all_desc(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_ALL_DESC, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_ALL_DESC, BTP_STATUS_FAILED);
}
static int
@@ -1242,8 +1233,8 @@ find_included_cb(uint16_t conn_handle,
const struct ble_gatt_svc *gatt_svc, void *arg)
{
struct btp_gatt_find_included_rp *rp = (void *) gatt_buf.buf;
struct btp_gatt_included *included;
const ble_uuid_any_t *uuid;
struct btp_gatt_included *included;
const ble_uuid_any_t *uuid;
int service_handle = (int) arg;
uint8_t uuid_length;
@@ -1251,14 +1242,14 @@ find_included_cb(uint16_t conn_handle,
if (error->status != 0 && error->status != BLE_HS_EDONE) {
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_FIND_INCLUDED,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
discover_destroy();
return 0;
}
if (error->status == BLE_HS_EDONE) {
tester_send(BTP_SERVICE_ID_GATT, BTP_GATT_FIND_INCLUDED,
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
tester_send(BTP_SERVICE_ID_GATT, BTP_GATT_FIND_INCLUDED, gatt_buf
.buf, gatt_buf.len);
discover_destroy();
return 0;
}
@@ -1269,7 +1260,7 @@ find_included_cb(uint16_t conn_handle,
included = gatt_buf_reserve(sizeof(*included) + uuid_length);
if (!included) {
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_FIND_INCLUDED,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
discover_destroy();
return BLE_HS_ENOMEM;
}
@@ -1301,7 +1292,7 @@ disc_chrc_cb(uint16_t conn_handle,
{
struct btp_gatt_disc_chrc_rp *rp = (void *) gatt_buf.buf;
struct btp_gatt_characteristic *chrc;
const ble_uuid_any_t *uuid;
const ble_uuid_any_t *uuid;
uint8_t btp_opcode = (uint8_t) (int) arg;
uint8_t uuid_length;
@@ -1309,14 +1300,14 @@ disc_chrc_cb(uint16_t conn_handle,
if (error->status != 0 && error->status != BLE_HS_EDONE) {
tester_rsp(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
discover_destroy();
return 0;
}
if (error->status == BLE_HS_EDONE) {
tester_send(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
tester_send(BTP_SERVICE_ID_GATT, btp_opcode, gatt_buf.buf, gatt_buf
.len);
discover_destroy();
return 0;
}
@@ -1327,7 +1318,7 @@ disc_chrc_cb(uint16_t conn_handle,
chrc = gatt_buf_reserve(sizeof(*chrc) + uuid_length);
if (!chrc) {
tester_rsp(BTP_SERVICE_ID_GATT, btp_opcode,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
discover_destroy();
return BLE_HS_ENOMEM;
}
@@ -1354,7 +1345,7 @@ static void
disc_chrc_uuid(uint8_t *data, uint16_t len)
{
const struct btp_gatt_disc_chrc_uuid_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
ble_uuid_any_t uuid;
int rc;
@@ -1387,7 +1378,7 @@ disc_chrc_uuid(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_CHRC_UUID, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_CHRC_UUID,
BTP_STATUS_FAILED);
}
@@ -1395,7 +1386,7 @@ static void
disc_prim_uuid(uint8_t *data, uint16_t len)
{
const struct btp_gatt_disc_prim_uuid_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
ble_uuid_any_t uuid;
int rc;
@@ -1424,7 +1415,7 @@ disc_prim_uuid(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_PRIM_UUID, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_PRIM_UUID,
BTP_STATUS_FAILED);
}
@@ -1462,15 +1453,14 @@ disc_all_chrc(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_ALL_CHRC, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_DISC_ALL_CHRC, BTP_STATUS_FAILED);
}
static void
find_included(uint8_t *data, uint16_t len)
{
const struct btp_gatt_find_included_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
int service_handle_arg;
int rc;
@@ -1500,8 +1490,7 @@ find_included(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_FIND_INCLUDED, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_FIND_INCLUDED, BTP_STATUS_FAILED);
}
static int
@@ -1513,13 +1502,12 @@ exchange_func(uint16_t conn_handle,
if (error->status) {
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_EXCHANGE_MTU,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
return 0;
}
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_EXCHANGE_MTU, CONTROLLER_INDEX,
BTP_STATUS_SUCCESS);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_EXCHANGE_MTU, BTP_STATUS_SUCCESS);
return 0;
}
@@ -1544,7 +1532,7 @@ exchange_mtu(uint8_t *data, uint16_t len)
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_EXCHANGE_MTU,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
}
static int
@@ -1564,8 +1552,7 @@ enable_subscription(uint16_t conn_handle, uint16_t ccc_handle,
subscribe_params.ccc_handle = value;
tester_rsp(BTP_SERVICE_ID_GATT, op, CONTROLLER_INDEX,
BTP_STATUS_SUCCESS);
tester_rsp(BTP_SERVICE_ID_GATT, op, BTP_STATUS_SUCCESS);
return 0;
}
@@ -1595,7 +1582,7 @@ static void
config_subscription(uint8_t *data, uint16_t len, uint8_t op)
{
const struct btp_gatt_cfg_notify_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint16_t ccc_handle = sys_le16_to_cpu(cmd->ccc_handle);
uint8_t status;
int rc;
@@ -1604,8 +1591,7 @@ config_subscription(uint8_t *data, uint16_t len, uint8_t op)
rc = ble_gap_conn_find_by_addr((ble_addr_t *) data, &conn);
if (rc) {
tester_rsp(BTP_SERVICE_ID_GATT, op, CONTROLLER_INDEX,
BTP_STATUS_FAILED);
tester_rsp(BTP_SERVICE_ID_GATT, op, BTP_STATUS_FAILED);
return;
}
@@ -1635,7 +1621,7 @@ config_subscription(uint8_t *data, uint16_t len, uint8_t op)
SYS_LOG_DBG("Config subscription (op %u) status %u", op, status);
tester_rsp(BTP_SERVICE_ID_GATT, op, CONTROLLER_INDEX, status);
tester_rsp(BTP_SERVICE_ID_GATT, op, status);
}
#define BTP_PERM_F_READ 0x01
@@ -1678,8 +1664,8 @@ get_attrs(uint8_t *data, uint16_t len)
{
const struct btp_gatt_get_attributes_cmd *cmd = (void *) data;
struct btp_gatt_get_attributes_rp *rp;
struct btp_gatt_attr *gatt_attr;
struct os_mbuf *buf = os_msys_get(0, 0);
struct btp_gatt_attr *gatt_attr;
struct os_mbuf *buf = os_msys_get(0, 0);
uint16_t start_handle, end_handle;
struct ble_att_svr_entry *entry = NULL;
ble_uuid_any_t uuid;
@@ -1747,7 +1733,7 @@ get_attrs(uint8_t *data, uint16_t len)
goto free;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_GET_ATTRIBUTES, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_GET_ATTRIBUTES,
BTP_STATUS_FAILED);
free:
os_mbuf_free_chain(buf);
@@ -1757,8 +1743,8 @@ static void
get_attr_val(uint8_t *data, uint16_t len)
{
const struct btp_gatt_get_attribute_value_cmd *cmd = (void *) data;
struct btp_gatt_get_attribute_value_rp *rp;
struct ble_gap_conn_desc conn;
struct btp_gatt_get_attribute_value_rp *rp;
struct ble_gap_conn_desc conn;
struct os_mbuf *buf = os_msys_get(0, 0);
uint16_t handle = sys_cpu_to_le16(cmd->handle);
uint8_t out_att_err = 0;
@@ -1813,7 +1799,7 @@ change_database(uint8_t *data, uint16_t len)
ble_svc_gatt_changed(cmd->start_handle, cmd->end_handle);
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_CHANGE_DATABASE, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_GATT, BTP_GATT_CHANGE_DATABASE,
BTP_STATUS_SUCCESS);
return;
@@ -1822,7 +1808,7 @@ change_database(uint8_t *data, uint16_t len)
static void
supported_commands(uint8_t *data, uint16_t len)
{
uint8_t cmds[4];
uint8_t cmds[4];
struct btp_gatt_read_supported_commands_rp *rp = (void *) cmds;
SYS_LOG_DBG("");
@@ -1854,7 +1840,7 @@ supported_commands(uint8_t *data, uint16_t len)
tester_set_bit(cmds, BTP_GATT_CHANGE_DATABASE);
tester_send(BTP_SERVICE_ID_GATT, BTP_GATT_READ_SUPPORTED_COMMANDS,
CONTROLLER_INDEX, (uint8_t *) rp, sizeof(cmds));
(uint8_t *) rp, sizeof(cmds));
}
enum attr_type {
@@ -1864,7 +1850,7 @@ enum attr_type {
};
void
tester_handle_gatt(uint8_t opcode, uint8_t index, uint8_t *data,
tester_handle_gatt(uint8_t opcode, uint8_t *data,
uint16_t len)
{
switch (opcode) {
@@ -1941,8 +1927,7 @@ tester_handle_gatt(uint8_t opcode, uint8_t index, uint8_t *data,
get_attr_val(data, len);
return;
default:
tester_rsp(BTP_SERVICE_ID_GATT, opcode, index,
BTP_STATUS_UNKNOWN_CMD);
tester_rsp(BTP_SERVICE_ID_GATT, opcode, BTP_STATUS_UNKNOWN_CMD);
return;
}
}
@@ -1952,7 +1937,7 @@ tester_gatt_notify_rx_ev(uint16_t conn_handle, uint16_t attr_handle,
uint8_t indication, struct os_mbuf *om)
{
struct btp_gatt_notification_ev *ev;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
struct os_mbuf *buf = os_msys_get(0, 0);
const ble_addr_t *addr;
+49 -62
View File
@@ -124,7 +124,7 @@ tester_mtu_exchanged_ev(uint16_t conn_handle,
uint16_t mtu, void *arg)
{
struct btp_gattc_exchange_mtu_ev *ev;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
struct os_mbuf *buf = os_msys_get(0, 0);
const ble_addr_t *addr;
@@ -175,7 +175,7 @@ exchange_mtu(uint8_t *data, uint16_t len)
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_EXCHANGE_MTU,
CONTROLLER_INDEX, status);
status);
}
static int
@@ -184,9 +184,9 @@ disc_prim_svcs_cb(uint16_t conn_handle,
const struct ble_gatt_svc *gatt_svc, void *arg)
{
struct btp_gattc_disc_prim_svcs_rp *rp;
struct ble_gap_conn_desc conn;
struct btp_gatt_service *service;
const ble_uuid_any_t *uuid;
struct ble_gap_conn_desc conn;
struct btp_gatt_service *service;
const ble_uuid_any_t *uuid;
const ble_addr_t *addr;
uint8_t uuid_length;
struct os_mbuf *buf = os_msys_get(0, 0);
@@ -280,14 +280,14 @@ disc_all_prim_svcs(uint8_t *data, uint16_t len)
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_ALL_PRIM_SVCS,
CONTROLLER_INDEX, status);
status);
}
static void
disc_prim_uuid(uint8_t *data, uint16_t len)
{
const struct btp_gattc_disc_prim_uuid_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
ble_uuid_any_t uuid;
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -314,8 +314,7 @@ disc_prim_uuid(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_PRIM_UUID, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_PRIM_UUID, status);
}
static int
@@ -324,8 +323,8 @@ find_included_cb(uint16_t conn_handle,
const struct ble_gatt_svc *gatt_svc, void *arg)
{
struct btp_gattc_find_included_rp *rp;
struct btp_gatt_included *included;
const ble_uuid_any_t *uuid;
struct btp_gatt_included *included;
const ble_uuid_any_t *uuid;
int service_handle = (int) arg;
uint8_t uuid_length;
uint8_t err = (uint8_t) error->status;
@@ -405,7 +404,7 @@ static void
find_included(uint8_t *data, uint16_t len)
{
const struct btp_gattc_find_included_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
int service_handle_arg;
uint8_t status = BTP_STATUS_SUCCESS;
@@ -432,8 +431,7 @@ find_included(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_FIND_INCLUDED, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_FIND_INCLUDED, status);
}
static int
@@ -443,7 +441,7 @@ disc_chrc_cb(uint16_t conn_handle,
{
struct btp_gattc_disc_chrc_rp *rp;
struct btp_gatt_characteristic *chrc;
const ble_uuid_any_t *uuid;
const ble_uuid_any_t *uuid;
uint8_t uuid_length;
uint8_t opcode = (uint8_t) (int) arg;
uint8_t err = (uint8_t) error->status;
@@ -523,7 +521,7 @@ static void
disc_all_chrc(uint8_t *data, uint16_t len)
{
const struct btp_gattc_disc_all_chrc_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -552,15 +550,14 @@ disc_all_chrc(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_ALL_CHRC, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_ALL_CHRC, status);
}
static void
disc_chrc_uuid(uint8_t *data, uint16_t len)
{
const struct btp_gattc_disc_chrc_uuid_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
ble_uuid_any_t uuid;
uint8_t status = BTP_STATUS_SUCCESS;
@@ -592,8 +589,7 @@ disc_chrc_uuid(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_CHRC_UUID, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_CHRC_UUID, status);
}
static int
@@ -604,8 +600,8 @@ disc_all_desc_cb(uint16_t conn_handle,
void *arg)
{
struct btp_gattc_disc_all_desc_rp *rp;
struct btp_gatt_descriptor *dsc;
const ble_uuid_any_t *uuid;
struct btp_gatt_descriptor *dsc;
const ble_uuid_any_t *uuid;
uint8_t uuid_length;
uint8_t err = (uint8_t) error->status;
struct os_mbuf *buf = os_msys_get(0, 0);
@@ -679,7 +675,7 @@ static void
disc_all_desc(uint8_t *data, uint16_t len)
{
const struct btp_gattc_disc_all_desc_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint16_t start_handle, end_handle;
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -710,8 +706,7 @@ disc_all_desc(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_ALL_DESC, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_DISC_ALL_DESC, status);
}
static int
@@ -721,7 +716,7 @@ read_cb(uint16_t conn_handle,
void *arg)
{
struct btp_gattc_read_rp *rp;
uint8_t opcode = (uint8_t) (int) arg;
uint8_t opcode = (uint8_t) (int) arg;
struct os_mbuf *buf = os_msys_get(0, 0);
const ble_addr_t *addr;
struct ble_gap_conn_desc conn;
@@ -772,7 +767,7 @@ static void
read(uint8_t *data, uint16_t len)
{
const struct btp_gattc_read_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -795,8 +790,7 @@ read(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ, status);
}
static int
@@ -807,7 +801,7 @@ read_uuid_cb(uint16_t conn_handle,
{
struct btp_gattc_read_uuid_rp *rp;
struct btp_gatt_read_uuid_chr *chr;
uint8_t opcode = (uint8_t) (int) arg;
uint8_t opcode = (uint8_t) (int) arg;
uint8_t err = (uint8_t) error->status;
struct os_mbuf *buf = os_msys_get(0, 0);
const ble_addr_t *addr;
@@ -875,7 +869,7 @@ static void
read_uuid(uint8_t *data, uint16_t len)
{
const struct btp_gattc_read_uuid_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
ble_uuid_any_t uuid;
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -905,8 +899,7 @@ read_uuid(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_UUID, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_UUID, status);
}
static int
@@ -975,7 +968,7 @@ static void
read_long(uint8_t *data, uint16_t len)
{
const struct btp_gattc_read_long_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -999,15 +992,14 @@ read_long(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_LONG, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_LONG, status);
}
static void
read_multiple(uint8_t *data, uint16_t len)
{
const struct btp_gattc_read_multiple_cmd *cmd = (void *) data;
uint16_t handles[cmd->handles_count];
uint16_t handles[cmd->handles_count];
struct ble_gap_conn_desc conn;
uint8_t status = BTP_STATUS_SUCCESS;
int rc, i;
@@ -1037,15 +1029,14 @@ read_multiple(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_MULTIPLE, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_MULTIPLE, status);
}
static void
write_without_rsp(uint8_t *data, uint16_t len, uint8_t op, bool sign)
{
const struct btp_gattc_write_without_rsp_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -1064,7 +1055,7 @@ write_without_rsp(uint8_t *data, uint16_t len, uint8_t op, bool sign)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, op, CONTROLLER_INDEX, status);
tester_rsp(BTP_SERVICE_ID_GATTC, op, status);
}
static int
@@ -1073,7 +1064,7 @@ write_cb(uint16_t conn_handle, const struct ble_gatt_error *error,
void *arg)
{
struct btp_gattc_write_rp *rp;
uint8_t err = (uint8_t) error->status;
uint8_t err = (uint8_t) error->status;
uint8_t opcode = (uint8_t) (int) arg;
struct os_mbuf *buf = os_msys_get(0, 0);
const ble_addr_t *addr;
@@ -1107,7 +1098,7 @@ static void
write(uint8_t *data, uint16_t len)
{
const struct btp_gattc_write_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -1126,15 +1117,14 @@ write(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_WRITE, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_WRITE, status);
}
static void
write_long(uint8_t *data, uint16_t len)
{
const struct btp_gattc_write_long_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
struct os_mbuf *om = NULL;
uint8_t status = BTP_STATUS_SUCCESS;
int rc = 0;
@@ -1168,8 +1158,7 @@ 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, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_WRITE_LONG, status);
}
static int
@@ -1180,7 +1169,7 @@ reliable_write_cb(uint16_t conn_handle,
void *arg)
{
struct btp_gattc_write_rp *rp;
uint8_t err = (uint8_t) error->status;
uint8_t err = (uint8_t) error->status;
struct os_mbuf *buf = os_msys_get(0, 0);
const ble_addr_t *addr;
struct ble_gap_conn_desc conn;
@@ -1213,7 +1202,7 @@ static void
reliable_write(uint8_t *data, uint16_t len)
{
const struct btp_gattc_reliable_write_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
struct ble_gatt_attr attr;
struct os_mbuf *om = NULL;
uint8_t status = BTP_STATUS_SUCCESS;
@@ -1251,8 +1240,7 @@ reliable_write(uint8_t *data, uint16_t len)
fail:
os_mbuf_free_chain(om);
rsp:
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_WRITE_LONG, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_GATTC, BTP_GATTC_WRITE_LONG, status);
}
static int
@@ -1262,7 +1250,7 @@ subscribe_cb(uint16_t conn_handle,
void *arg)
{
struct btp_subscribe_rp *rp;
uint8_t err = (uint8_t) error->status;
uint8_t err = (uint8_t) error->status;
uint8_t opcode = (uint8_t) (int) arg;
struct os_mbuf *buf = os_msys_get(0, 0);
const ble_addr_t *addr;
@@ -1351,7 +1339,7 @@ static void
config_subscription(uint8_t *data, uint16_t len, uint8_t op)
{
const struct btp_gattc_cfg_notify_cmd *cmd = (void *) data;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
uint16_t ccc_handle = sys_le16_to_cpu(cmd->ccc_handle);
uint8_t status = BTP_STATUS_SUCCESS;
int rc;
@@ -1389,7 +1377,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, CONTROLLER_INDEX, status);
tester_rsp(BTP_SERVICE_ID_GATTC, op, status);
}
int
@@ -1397,7 +1385,7 @@ tester_gattc_notify_rx_ev(uint16_t conn_handle, uint16_t attr_handle,
uint8_t indication, struct os_mbuf *om)
{
struct btp_gattc_notification_ev *ev;
struct ble_gap_conn_desc conn;
struct ble_gap_conn_desc conn;
struct os_mbuf *buf = os_msys_get(0, 0);
const ble_addr_t *addr;
@@ -1434,7 +1422,7 @@ fail:
static void
supported_commands(uint8_t *data, uint16_t len)
{
uint8_t cmds[3];
uint8_t cmds[3];
struct btp_gatt_read_supported_commands_rp *rp = (void *) cmds;
SYS_LOG_DBG("");
@@ -1464,11 +1452,11 @@ supported_commands(uint8_t *data, uint16_t len)
tester_set_bit(cmds, BTP_GATTC_CFG_INDICATE);
tester_send(BTP_SERVICE_ID_GATTC, BTP_GATTC_READ_SUPPORTED_COMMANDS,
CONTROLLER_INDEX, (uint8_t *) rp, sizeof(cmds));
(uint8_t *) rp, sizeof(cmds));
}
void
tester_handle_gattc(uint8_t opcode, uint8_t index, uint8_t *data,
tester_handle_gattc(uint8_t opcode, uint8_t *data,
uint16_t len)
{
switch (opcode) {
@@ -1533,8 +1521,7 @@ tester_handle_gattc(uint8_t opcode, uint8_t index, uint8_t *data,
config_subscription(data, len, opcode);
return;
default:
tester_rsp(BTP_SERVICE_ID_GATTC, opcode, index,
BTP_STATUS_UNKNOWN_CMD);
tester_rsp(BTP_SERVICE_ID_GATTC, opcode, BTP_STATUS_UNKNOWN_CMD);
return;
}
}
+33 -33
View File
@@ -122,8 +122,8 @@ static void
recv_cb(uint16_t conn_handle, struct ble_l2cap_chan *chan,
struct os_mbuf *buf, void *arg)
{
struct btp_l2cap_data_received_ev *ev = (void *) recv_cb_buf;
struct channel *channel = find_channel(chan);
struct btp_l2cap_data_received_ev *ev = (void *) recv_cb_buf;
struct channel *channel = find_channel(chan);
assert(channel != NULL);
ev->chan_id = channel->chan_id;
@@ -136,7 +136,7 @@ recv_cb(uint16_t conn_handle, struct ble_l2cap_chan *chan,
os_mbuf_copydata(buf, 0, ev->data_length, ev->data);
tester_send(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_EV_DATA_RECEIVED,
CONTROLLER_INDEX, recv_cb_buf, sizeof(*ev) + ev->data_length);
recv_cb_buf, sizeof(*ev) + ev->data_length);
tester_l2cap_coc_recv(chan, buf);
}
@@ -147,10 +147,10 @@ unstalled_cb(uint16_t conn_handle, struct ble_l2cap_chan *chan,
{
if (status) {
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_SEND_DATA,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
BTP_STATUS_FAILED);
} else {
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_SEND_DATA,
CONTROLLER_INDEX, BTP_STATUS_SUCCESS);
BTP_STATUS_SUCCESS);
}
}
@@ -160,7 +160,7 @@ reconfigured_ev(uint16_t conn_handle, struct ble_l2cap_chan *chan,
int status)
{
struct btp_l2cap_reconfigured_ev ev;
struct channel *channel;
struct channel *channel;
if (status != 0) {
return;
@@ -176,7 +176,7 @@ reconfigured_ev(uint16_t conn_handle, struct ble_l2cap_chan *chan,
ev.our_mps = chan_info->our_l2cap_mtu;
tester_send(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_EV_RECONFIGURED,
CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
(uint8_t *) &ev, sizeof(ev));
}
static void
@@ -184,7 +184,7 @@ connected_cb(uint16_t conn_handle, struct ble_l2cap_chan *chan,
struct ble_l2cap_chan_info *chan_info, void *arg)
{
struct btp_l2cap_connected_ev ev;
struct ble_gap_conn_desc desc;
struct ble_gap_conn_desc desc;
struct channel *channel = find_channel(chan);
if (channel == NULL) {
@@ -206,7 +206,7 @@ connected_cb(uint16_t conn_handle, struct ble_l2cap_chan *chan,
sizeof(ev.address));
}
tester_send(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_EV_CONNECTED, CONTROLLER_INDEX,
tester_send(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_EV_CONNECTED,
(uint8_t *) &ev, sizeof(ev));
}
@@ -215,7 +215,7 @@ disconnected_cb(uint16_t conn_handle, struct ble_l2cap_chan *chan,
struct ble_l2cap_chan_info *chan_info, void *arg)
{
struct btp_l2cap_disconnected_ev ev;
struct ble_gap_conn_desc desc;
struct ble_gap_conn_desc desc;
struct channel *channel;
memset(&ev, 0, sizeof(struct btp_l2cap_disconnected_ev));
@@ -235,7 +235,7 @@ disconnected_cb(uint16_t conn_handle, struct ble_l2cap_chan *chan,
}
tester_send(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_EV_DISCONNECTED,
CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
(uint8_t *) &ev, sizeof(ev));
}
static int
@@ -407,9 +407,9 @@ static void
connect(uint8_t *data, uint16_t len)
{
const struct btp_l2cap_connect_cmd *cmd = (void *) data;
uint8_t rp_buf[sizeof(struct btp_l2cap_connect_rp) + cmd->num];
struct btp_l2cap_connect_rp *rp = (void *) rp_buf;
struct ble_gap_conn_desc desc;
uint8_t rp_buf[sizeof(struct btp_l2cap_connect_rp) + cmd->num];
struct btp_l2cap_connect_rp *rp = (void *) rp_buf;
struct ble_gap_conn_desc desc;
struct channel *chan;
struct os_mbuf *sdu_rx[cmd->num];
ble_addr_t *addr = (void *) data;
@@ -481,13 +481,13 @@ connect(uint8_t *data, uint16_t len)
goto fail;
}
tester_send(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_CONNECT, CONTROLLER_INDEX,
tester_send(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_CONNECT,
(uint8_t *) rp, sizeof(rp_buf));
return;
fail:
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_CONNECT, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_CONNECT,
BTP_STATUS_FAILED);
}
@@ -495,7 +495,7 @@ static void
disconnect(const uint8_t *data, uint16_t len)
{
const struct btp_l2cap_disconnect_cmd *cmd = (void *) data;
struct channel *chan;
struct channel *chan;
uint8_t status;
int err;
@@ -513,15 +513,15 @@ disconnect(const uint8_t *data, uint16_t len)
status = BTP_STATUS_SUCCESS;
rsp:
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_DISCONNECT, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_DISCONNECT,
status);
}
static void
send_data(const uint8_t *data, uint16_t len)
{
const struct btp_l2cap_send_data_cmd *cmd = (void *) data;
struct os_mbuf *sdu_tx = NULL;
const struct btp_l2cap_send_data_cmd *cmd = (void *) data;
struct os_mbuf *sdu_tx = NULL;
int rc;
uint16_t data_len = sys_le16_to_cpu(cmd->data_len);
struct channel *chan = get_channel(cmd->chan_id);
@@ -550,7 +550,7 @@ send_data(const uint8_t *data, uint16_t len)
/* ble_l2cap_send takes ownership of the sdu */
rc = ble_l2cap_send(chan->chan, sdu_tx);
if (rc == 0 || rc == BLE_HS_ESTALLED) {
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_SEND_DATA, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_SEND_DATA,
BTP_STATUS_SUCCESS);
return;
}
@@ -559,7 +559,7 @@ send_data(const uint8_t *data, uint16_t len)
os_mbuf_free_chain(sdu_tx);
fail:
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_SEND_DATA, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_SEND_DATA,
BTP_STATUS_FAILED);
}
@@ -582,12 +582,12 @@ listen(const uint8_t *data, uint16_t len)
goto fail;
}
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_LISTEN, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_LISTEN,
BTP_STATUS_SUCCESS);
return;
fail:
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_LISTEN, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_LISTEN,
BTP_STATUS_FAILED);
}
@@ -595,7 +595,7 @@ static void
credits(uint8_t *data, uint16_t len)
{
const struct btp_l2cap_credits_cmd *cmd = (void *) data;
struct os_mbuf *sdu;
struct os_mbuf *sdu;
int rc;
struct channel *channel = get_channel(cmd->chan_id);
@@ -613,11 +613,11 @@ credits(uint8_t *data, uint16_t len)
if (rc != 0) {
goto fail;
}
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_CREDITS, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_CREDITS,
BTP_STATUS_SUCCESS);
return;
fail:
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_CREDITS, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_CREDITS,
BTP_STATUS_FAILED);
}
@@ -658,19 +658,19 @@ reconfigure(const uint8_t *data, uint16_t len)
goto fail;
}
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_RECONFIGURE, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_RECONFIGURE,
BTP_STATUS_SUCCESS);
return;
fail:
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_RECONFIGURE, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_RECONFIGURE,
BTP_STATUS_FAILED);
}
static void
supported_commands(uint8_t *data, uint16_t len)
{
uint8_t cmds[1];
uint8_t cmds[1];
struct btp_l2cap_read_supported_commands_rp *rp = (void *) cmds;
memset(cmds, 0, sizeof(cmds));
@@ -683,11 +683,11 @@ supported_commands(uint8_t *data, uint16_t len)
tester_set_bit(cmds, BTP_L2CAP_RECONFIGURE);
tester_send(BTP_SERVICE_ID_L2CAP, BTP_L2CAP_READ_SUPPORTED_COMMANDS,
CONTROLLER_INDEX, (uint8_t *) rp, sizeof(cmds));
(uint8_t *) rp, sizeof(cmds));
}
void
tester_handle_l2cap(uint8_t opcode, uint8_t index, uint8_t *data,
tester_handle_l2cap(uint8_t opcode, uint8_t *data,
uint16_t len)
{
switch (opcode) {
@@ -713,7 +713,7 @@ tester_handle_l2cap(uint8_t opcode, uint8_t index, uint8_t *data,
credits(data, len);
return;
default:
tester_rsp(BTP_SERVICE_ID_L2CAP, opcode, index,
tester_rsp(BTP_SERVICE_ID_L2CAP, opcode,
BTP_STATUS_UNKNOWN_CMD);
return;
}
+44 -47
View File
@@ -284,7 +284,7 @@ link_open(bt_mesh_prov_bearer_t bearer)
}
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_PROV_LINK_OPEN,
CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
(uint8_t *) &ev, sizeof(ev));
}
static void
@@ -308,7 +308,7 @@ link_close(bt_mesh_prov_bearer_t bearer)
}
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_PROV_LINK_CLOSED,
CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
(uint8_t *) &ev, sizeof(ev));
}
static int
@@ -322,7 +322,7 @@ output_number(bt_mesh_output_action_t action, uint32_t number)
ev.number = sys_cpu_to_le32(number);
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_OUT_NUMBER_ACTION,
CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
(uint8_t *) &ev, sizeof(ev));
return 0;
}
@@ -331,7 +331,7 @@ static int
output_string(const char *str)
{
struct btp_mesh_out_string_action_ev *ev;
struct os_mbuf *buf = NET_BUF_SIMPLE(BTP_DATA_MAX_SIZE);
struct os_mbuf *buf = NET_BUF_SIMPLE(BTP_DATA_MAX_SIZE);
SYS_LOG_DBG("str %s", str);
@@ -361,7 +361,7 @@ input(bt_mesh_input_action_t action, uint8_t size)
ev.action = sys_cpu_to_le16(action);
ev.size = size;
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_IN_ACTION, CONTROLLER_INDEX,
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_IN_ACTION,
(uint8_t *) &ev, sizeof(ev));
return 0;
@@ -379,7 +379,7 @@ prov_complete(uint16_t net_idx, uint16_t addr)
net.local = addr;
net.dst = addr;
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_PROVISIONED, CONTROLLER_INDEX,
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_PROVISIONED,
NULL, 0);
}
@@ -426,7 +426,7 @@ config_prov(uint8_t *data, uint16_t len)
prov.input_actions = sys_le16_to_cpu(cmd->in_actions);
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_CONFIG_PROVISIONING,
CONTROLLER_INDEX, BTP_STATUS_SUCCESS);
BTP_STATUS_SUCCESS);
}
static void
@@ -445,7 +445,7 @@ provision_node(uint8_t *data, uint16_t len)
net_key_idx = sys_le16_to_cpu(cmd->net_key_idx);
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_PROVISION_NODE,
CONTROLLER_INDEX, BTP_STATUS_SUCCESS);
BTP_STATUS_SUCCESS);
}
static void
@@ -477,8 +477,7 @@ init(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_INIT, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_INIT, status);
}
static void
@@ -488,15 +487,15 @@ reset(uint8_t *data, uint16_t len)
bt_mesh_reset();
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_RESET, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_RESET,
BTP_STATUS_SUCCESS);
}
static void
input_number(uint8_t *data, uint16_t len)
{
const struct btp_mesh_input_number_cmd *cmd = (void *) data;
uint8_t status = BTP_STATUS_SUCCESS;
const struct btp_mesh_input_number_cmd *cmd = (void *) data;
uint8_t status = BTP_STATUS_SUCCESS;
uint32_t number;
int err;
@@ -509,15 +508,14 @@ input_number(uint8_t *data, uint16_t len)
status = BTP_STATUS_FAILED;
}
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_INPUT_NUMBER, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_INPUT_NUMBER, status);
}
static void
input_string(uint8_t *data, uint16_t len)
{
const struct btp_mesh_input_string_cmd *cmd = (void *) data;
uint8_t status = BTP_STATUS_SUCCESS;
const struct btp_mesh_input_string_cmd *cmd = (void *) data;
uint8_t status = BTP_STATUS_SUCCESS;
uint8_t str_auth[16];
int err;
@@ -541,8 +539,7 @@ input_string(uint8_t *data, uint16_t len)
}
rsp:
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_INPUT_STRING, CONTROLLER_INDEX,
status);
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_INPUT_STRING, status);
}
static void
@@ -554,7 +551,7 @@ ivu_test_mode(uint8_t *data, uint16_t len)
bt_mesh_iv_update_test(cmd->enable ? true : false);
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_IVU_TEST_MODE, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_IVU_TEST_MODE,
BTP_STATUS_SUCCESS);
}
@@ -570,7 +567,7 @@ ivu_toggle_state(uint8_t *data, uint16_t len)
SYS_LOG_ERR("Failed to toggle the IV Update state");
}
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_IVU_TOGGLE_STATE, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_IVU_TOGGLE_STATE,
result ? BTP_STATUS_SUCCESS : BTP_STATUS_FAILED);
}
@@ -589,7 +586,7 @@ lpn(uint8_t *data, uint16_t len)
SYS_LOG_ERR("Failed to toggle LPN (err %d)", err);
}
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_LPN, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_LPN,
err ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS);
}
@@ -605,7 +602,7 @@ lpn_poll(uint8_t *data, uint16_t len)
SYS_LOG_ERR("Failed to send poll msg (err %d)", err);
}
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_LPN_POLL, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_LPN_POLL,
err ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS);
}
@@ -613,7 +610,7 @@ static void
net_send(uint8_t *data, uint16_t len)
{
struct btp_mesh_net_send_cmd *cmd = (void *) data;
struct os_mbuf *msg = NET_BUF_SIMPLE(UINT8_MAX);
struct os_mbuf *msg = NET_BUF_SIMPLE(UINT8_MAX);
struct bt_mesh_msg_ctx ctx = {
.net_idx = net.net_idx,
.app_idx = vnd_app_key_idx,
@@ -638,7 +635,7 @@ net_send(uint8_t *data, uint16_t len)
SYS_LOG_ERR("Failed to send (err %d)", err);
}
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_NET_SEND, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_NET_SEND,
err ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS);
os_mbuf_free_chain(msg);
@@ -648,8 +645,8 @@ static void
health_generate_faults(uint8_t *data, uint16_t len)
{
struct btp_mesh_health_generate_faults_rp *rp;
struct os_mbuf *buf = NET_BUF_SIMPLE(sizeof(*rp) + sizeof(cur_faults) +
sizeof(reg_faults));
struct os_mbuf *buf = NET_BUF_SIMPLE(sizeof(*rp) + sizeof(cur_faults) +
sizeof(reg_faults));
uint8_t some_faults[] = {0x01, 0x02, 0x03, 0xff, 0x06};
uint8_t cur_faults_count, reg_faults_count;
@@ -682,14 +679,14 @@ health_clear_faults(uint8_t *data, uint16_t len)
bt_mesh_fault_update(&elements[0]);
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_HEALTH_CLEAR_FAULTS,
CONTROLLER_INDEX, BTP_STATUS_SUCCESS);
BTP_STATUS_SUCCESS);
}
static void
model_send(uint8_t *data, uint16_t len)
{
struct btp_mesh_model_send_cmd *cmd = (void *) data;
struct os_mbuf *msg = NET_BUF_SIMPLE(UINT8_MAX);
struct os_mbuf *msg = NET_BUF_SIMPLE(UINT8_MAX);
struct bt_mesh_msg_ctx ctx = {
.net_idx = net.net_idx,
.app_idx = BT_MESH_KEY_DEV,
@@ -728,7 +725,7 @@ model_send(uint8_t *data, uint16_t len)
}
fail:
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_MODEL_SEND, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_MODEL_SEND,
err ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS);
os_mbuf_free_chain(msg);
@@ -739,8 +736,8 @@ fail:
static void
lpn_subscribe(uint8_t *data, uint16_t len)
{
struct btp_mesh_lpn_subscribe_cmd *cmd = (void *) data;
uint16_t address = sys_le16_to_cpu(cmd->address);
struct btp_mesh_lpn_subscribe_cmd *cmd = (void *) data;
uint16_t address = sys_le16_to_cpu(cmd->address);
int err;
SYS_LOG_DBG("address 0x%04x", address);
@@ -750,15 +747,15 @@ lpn_subscribe(uint8_t *data, uint16_t len)
SYS_LOG_ERR("Failed to subscribe (err %d)", err);
}
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_LPN_SUBSCRIBE, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_LPN_SUBSCRIBE,
err ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS);
}
static void
lpn_unsubscribe(uint8_t *data, uint16_t len)
{
struct btp_mesh_lpn_unsubscribe_cmd *cmd = (void *) data;
uint16_t address = sys_le16_to_cpu(cmd->address);
struct btp_mesh_lpn_unsubscribe_cmd *cmd = (void *) data;
uint16_t address = sys_le16_to_cpu(cmd->address);
int err;
SYS_LOG_DBG("address 0x%04x", address);
@@ -768,7 +765,7 @@ lpn_unsubscribe(uint8_t *data, uint16_t len)
SYS_LOG_ERR("Failed to unsubscribe (err %d)", err);
}
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_LPN_UNSUBSCRIBE, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_LPN_UNSUBSCRIBE,
err ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS);
}
@@ -784,7 +781,7 @@ rpl_clear(uint8_t *data, uint16_t len)
SYS_LOG_ERR("Failed to clear RPL (err %d)", err);
}
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_RPL_CLEAR, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_RPL_CLEAR,
err ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS);
}
@@ -802,12 +799,12 @@ proxy_identity_enable(uint8_t *data, uint16_t len)
SYS_LOG_ERR("Failed to enable proxy identity (err %d)", err);
}
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_PROXY_IDENTITY, CONTROLLER_INDEX,
tester_rsp(BTP_SERVICE_ID_MESH, BTP_MESH_PROXY_IDENTITY,
err ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS);
}
void
tester_handle_mesh(uint8_t opcode, uint8_t index, uint8_t *data, uint16_t len)
tester_handle_mesh(uint8_t opcode, uint8_t *data, uint16_t len)
{
switch (opcode) {
case BTP_MESH_READ_SUPPORTED_COMMANDS:
@@ -870,7 +867,7 @@ tester_handle_mesh(uint8_t opcode, uint8_t index, uint8_t *data, uint16_t len)
proxy_identity_enable(data, len);
break;
default:
tester_rsp(BTP_SERVICE_ID_MESH, opcode, index,
tester_rsp(BTP_SERVICE_ID_MESH, opcode,
BTP_STATUS_UNKNOWN_CMD);
break;
}
@@ -884,7 +881,7 @@ net_recv_ev(uint8_t ttl,
const void *payload,
size_t payload_len)
{
struct os_mbuf *buf = NET_BUF_SIMPLE(UINT8_MAX);
struct os_mbuf *buf = NET_BUF_SIMPLE(UINT8_MAX);
struct btp_mesh_net_recv_ev *ev;
SYS_LOG_DBG("ttl 0x%02x ctl 0x%02x src 0x%04x dst 0x%04x "
@@ -964,14 +961,14 @@ invalid_bearer_cb(uint8_t opcode)
SYS_LOG_DBG("opcode 0x%02x", opcode);
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_INVALID_BEARER,
CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
(uint8_t *) &ev, sizeof(ev));
}
static void
incomp_timer_exp_cb(void)
{
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_INCOMP_TIMER_EXP,
CONTROLLER_INDEX, NULL, 0);
NULL, 0);
}
static struct bt_test_cb bt_test_cb = {
@@ -996,20 +993,20 @@ lpn_established(uint16_t friend_addr)
friend_addr, lpn->queue_size, lpn->recv_win);
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_LPN_ESTABLISHED,
CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
(uint8_t *) &ev, sizeof(ev));
}
static void
lpn_terminated(uint16_t friend_addr)
{
struct bt_mesh_lpn *lpn = &bt_mesh.lpn;
struct btp_mesh_lpn_terminated_ev ev = {lpn->sub->net_idx, friend_addr};
struct bt_mesh_lpn *lpn = &bt_mesh.lpn;
struct btp_mesh_lpn_terminated_ev ev = {lpn->sub->net_idx, friend_addr};
SYS_LOG_DBG("Friendship (as LPN) lost with Friend "
"0x%04x", friend_addr);
tester_send(BTP_SERVICE_ID_MESH, BTP_MESH_EV_LPN_TERMINATED,
CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
(uint8_t *) &ev, sizeof(ev));
}
void
+94 -46
View File
@@ -47,15 +47,60 @@ struct btp_buf {
uint8_t data[BTP_MTU];
struct btp_hdr hdr;
};
uint8_t rsp[BTP_MTU];
};
static struct btp_buf cmd_buf[CMD_QUEUED];
static struct {
const struct btp_handler *handlers;
uint8_t num;
} service_handler[BTP_SERVICE_ID_MAX + 1];
static void
tester_send_with_index(uint8_t service, uint8_t opcode, uint8_t index,
uint8_t *data, size_t len);
static void
tester_rsp_with_index(uint8_t service, uint8_t opcode, uint8_t index,
uint8_t status);
void
tester_register_command_handlers(uint8_t service,
const struct btp_handler *handlers,
size_t num)
{
__ASSERT_NO_MSG(service <= BTP_SERVICE_ID_MAX);
__ASSERT_NO_MSG(service_handler[service].handlers == NULL);
service_handler[service].handlers = handlers;
service_handler[service].num = num;
}
static const struct btp_handler *
find_btp_handler(uint8_t service, uint8_t opcode)
{
if ((service > BTP_SERVICE_ID_MAX) ||
(service_handler[service].handlers == NULL)) {
return NULL;
}
for (uint8_t i = 0; i < service_handler[service].num; i++) {
if (service_handler[service].handlers[i].opcode == opcode) {
return &service_handler[service].handlers[i];
}
}
return NULL;
}
static void
cmd_handler(struct os_event *ev)
{
const struct btp_handler *btp;
uint16_t len;
struct btp_buf *cmd;
uint8_t status;
uint16_t rsp_len = 0;
if (!ev || !ev->ev_arg) {
return;
@@ -71,43 +116,30 @@ cmd_handler(struct os_event *ev)
sizeof(cmd->hdr) + len));
}
/* TODO
* verify if service is registered before calling handler
*/
btp = find_btp_handler(cmd->hdr.service, cmd->hdr.opcode);
if (btp) {
if (btp->index != cmd->hdr.index) {
status = BTP_STATUS_FAILED;
} else if ((btp->expect_len >= 0) && (btp->expect_len != len)) {
status = BTP_STATUS_FAILED;
} else {
status = btp->func(cmd->hdr.data, len,
cmd->rsp, &rsp_len);
}
switch (cmd->hdr.service) {
case BTP_SERVICE_ID_CORE:
tester_handle_core(cmd->hdr.opcode, cmd->hdr.index,
cmd->hdr.data, len);
break;
case BTP_SERVICE_ID_GAP:
tester_handle_gap(cmd->hdr.opcode, cmd->hdr.index,
cmd->hdr.data, len);
break;
case BTP_SERVICE_ID_GATT:
tester_handle_gatt(cmd->hdr.opcode, cmd->hdr.index,
cmd->hdr.data, len);
break;
#if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM)
case BTP_SERVICE_ID_L2CAP:
tester_handle_l2cap(cmd->hdr.opcode, cmd->hdr.index,
cmd->hdr.data, len);
break;
#endif /* MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM) */
#if MYNEWT_VAL(BLE_MESH)
case BTP_SERVICE_ID_MESH:
tester_handle_mesh(cmd->hdr.opcode, cmd->hdr.index,
cmd->hdr.data, len);
break;
#endif /* MYNEWT_VAL(BLE_MESH) */
case BTP_SERVICE_ID_GATTC:
tester_handle_gattc(cmd->hdr.opcode, cmd->hdr.index,
cmd->hdr.data, len);
break;
default:
tester_rsp(cmd->hdr.service, cmd->hdr.opcode,
cmd->hdr.index, BTP_STATUS_FAILED);
break;
__ASSERT_NO_MSG((rsp_len + sizeof(struct btp_hdr)) <= BTP_MTU);
} else {
status = BTP_STATUS_UNKNOWN_CMD;
}
if (status != BTP_STATUS_DELAY_REPLY) {
if ((status == BTP_STATUS_SUCCESS) && rsp_len > 0) {
tester_send_with_index(cmd->hdr.service, cmd->hdr.opcode,
cmd->hdr.index, cmd->rsp, rsp_len);
} else {
tester_rsp_with_index(cmd->hdr.service, cmd->hdr.opcode,
cmd->hdr.index, status);
}
}
os_eventq_put(&avail_queue, ev);
@@ -191,20 +223,23 @@ tester_init(void)
bttester_pipe_register(buf->data, BTP_MTU, recv_cb);
tester_send(BTP_SERVICE_ID_CORE, BTP_CORE_EV_IUT_READY, BTP_INDEX_NONE,
NULL, 0);
/* core service is always available */
tester_init_core();
tester_send_with_index(BTP_SERVICE_ID_CORE, BTP_CORE_EV_IUT_READY,
BTP_INDEX_NONE, NULL, 0);
}
void
tester_send(uint8_t service, uint8_t opcode, uint8_t index, uint8_t *data,
size_t len)
static void
tester_send_with_index(uint8_t service, uint8_t opcode, uint8_t index,
uint8_t *data, size_t len)
{
struct btp_hdr msg;
msg.service = service;
msg.opcode = opcode;
msg.index = index;
msg.len = len;
msg.len = sys_cpu_to_le16(len);
bttester_pipe_send((uint8_t *) &msg, sizeof(msg));
if (data && len) {
@@ -238,16 +273,29 @@ tester_send_buf(uint8_t service, uint8_t opcode, uint8_t index,
}
}
void
tester_rsp(uint8_t service, uint8_t opcode, uint8_t index, uint8_t status)
static void
tester_rsp_with_index(uint8_t service, uint8_t opcode, uint8_t index,
uint8_t status)
{
struct btp_status s;
if (status == BTP_STATUS_SUCCESS) {
tester_send(service, opcode, index, NULL, 0);
tester_send_with_index(service, opcode, index, NULL, 0);
return;
}
s.code = status;
tester_send(service, BTP_STATUS, index, (uint8_t *) &s, sizeof(s));
tester_send_with_index(service, BTP_STATUS, index, (uint8_t *) &s, sizeof(s));
}
void
tester_send(uint8_t service, uint8_t opcode, uint8_t *data, size_t len)
{
tester_send_with_index(service, opcode, BTP_INDEX, data, len);
}
void
tester_rsp(uint8_t service, uint8_t opcode, uint8_t status)
{
tester_rsp_with_index(service, opcode, BTP_INDEX, status);
}
+19
View File
@@ -67,4 +67,23 @@ net_buf_simple_push(struct os_mbuf *om, uint8_t len);
const char *
bt_hex(const void *buf, size_t len);
/**
* INTERNAL_HIDDEN @endcond
*/
/**
* @brief Define an array of atomic variables.
*
* This macro defines an array of atomic variables containing at least
* @a num_bits bits.
*
* @note
* If used from file scope, the bits of the array are initialized to zero;
* if used from within a function, the bits are left uninitialized.
*
* @param name Name of array of atomic variables.
* @param num_bits Number of bits needed.
*/
#define ATOMIC_DEFINE(name, num_bits) \
atomic_t name[1 + ((num_bits) - 1) / ATOMIC_BITS]
#endif /* __GLUE_H__ */