bluetooth: tester: Added support for testing CSIS.

- Initialisation of Coordinated Set Identification Service.
- Set and clear member lock.
- Get member RSI.

Signed-off-by: Henrik Eriksen <heri@demant.com>
This commit is contained in:
Henrik Eriksen 2023-05-26 15:27:11 +02:00 committed by Fabio Baltieri
commit 5bd46b91fd
7 changed files with 160 additions and 1 deletions

View file

@ -39,3 +39,7 @@ endif()
if(CONFIG_BT_HAS)
target_sources(app PRIVATE src/btp_has.c)
endif()
if (CONFIG_BT_CSIP_SET_MEMBER)
target_sources(app PRIVATE src/btp_csis.c)
endif()

View file

@ -48,3 +48,6 @@ CONFIG_BT_IAS_CLIENT=y
CONFIG_BT_HAS=y
CONFIG_BT_HAS_PRESET_COUNT=5
CONFIG_BT_HAS_PRESET_NAME_DYNAMIC=y
# CSIS
CONFIG_BT_CSIP_SET_MEMBER=y

View file

@ -24,6 +24,7 @@
#include "btp_ascs.h"
#include "btp_bap.h"
#include "btp_has.h"
#include "btp_csis.h"
#define BTP_MTU 1024
#define BTP_DATA_MAX_SIZE (BTP_MTU - sizeof(struct btp_hdr))
@ -47,8 +48,9 @@
#define BTP_SERVICE_ID_ASCS 13
#define BTP_SERVICE_ID_BAP 14
#define BTP_SERVICE_ID_HAS 15
#define BTP_SERVICE_ID_CSIS 17
#define BTP_SERVICE_ID_MAX BTP_SERVICE_ID_HAS
#define BTP_SERVICE_ID_MAX BTP_SERVICE_ID_CSIS
#define BTP_STATUS_SUCCESS 0x00
#define BTP_STATUS_FAILED 0x01

View file

@ -0,0 +1,30 @@
/* btp_csis.h - Bluetooth tester headers */
/*
* Copyright (c) 2023 Oticon
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/bluetooth/audio/csip.h>
/* CSIS commands */
#define BTP_CSIS_READ_SUPPORTED_COMMANDS 0x01
struct btp_csis_read_supported_commands_rp {
uint8_t data[0];
} __packed;
#define BTP_CSIS_SET_MEMBER_LOCK 0x02
struct btp_csis_set_member_lock_cmd {
bt_addr_le_t address;
uint8_t lock;
uint8_t force;
} __packed;
#define BTP_CSIS_GET_MEMBER_RSI 0x03
struct btp_csis_get_member_rsi_cmd {
bt_addr_le_t address;
} __packed;
struct btp_csis_get_member_rsi_rp {
uint8_t rsi[BT_CSIP_RSI_SIZE];
} __packed;

View file

@ -89,3 +89,6 @@ uint8_t tester_unregister_bap(void);
uint8_t tester_init_has(void);
uint8_t tester_unregister_has(void);
uint8_t tester_init_csis(void);
uint8_t tester_unregister_csis(void);

View file

@ -77,6 +77,9 @@ static uint8_t supported_services(const void *cmd, uint16_t cmd_len,
#if defined(CONFIG_BT_HAS) || defined(CONFIG_BT_HAS_CLIENT)
tester_set_bit(rp->data, BTP_SERVICE_ID_HAS);
#endif /* CONFIG_BT_HAS */
#if defined(CONFIG_BT_CSIP_SET_MEMBER)
tester_set_bit(rp->data, BTP_SERVICE_ID_CSIS);
#endif /* CONFIG_BT_CSIP_SET_MEMBER */
*rsp_len = sizeof(*rp) + 2;
@ -148,6 +151,11 @@ static uint8_t register_service(const void *cmd, uint16_t cmd_len,
status = tester_init_has();
break;
#endif /* CONFIG_BT_HAS */
#if defined(CONFIG_BT_CSIP_SET_MEMBER)
case BTP_SERVICE_ID_CSIS:
status = tester_init_csis();
break;
#endif /* CONFIG_BT_CSIP_SET_MEMBER */
default:
LOG_WRN("unknown id: 0x%02x", cp->id);
status = BTP_STATUS_FAILED;
@ -226,6 +234,11 @@ static uint8_t unregister_service(const void *cmd, uint16_t cmd_len,
status = tester_unregister_has();
break;
#endif /* CONFIG_BT_HAS */
#if defined(CONFIG_BT_CSIP_SET_MEMBER)
case BTP_SERVICE_ID_CSIS:
status = tester_unregister_csis();
break;
#endif /* CONFIG_BT_CSIP_SET_MEMBER */
default:
LOG_WRN("unknown id: 0x%x", cp->id);
status = BTP_STATUS_FAILED;

View file

@ -0,0 +1,104 @@
/* btp_csis.c - Bluetooth CSIS Tester */
/*
* Copyright (c) 2023 Oticon
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/bluetooth/audio/csip.h>
#include "btp/btp.h"
#include "zephyr/sys/byteorder.h"
#include <zephyr/logging/log.h>
#define LOG_MODULE_NAME bttester_csis
LOG_MODULE_REGISTER(LOG_MODULE_NAME, CONFIG_BTTESTER_LOG_LEVEL);
#define BTP_STATUS_VAL(err) (err) ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS
static struct bt_csip_set_member_svc_inst *csis_svc_inst;
static uint8_t csis_supported_commands(const void *cmd, uint16_t cmd_len,
void *rsp, uint16_t *rsp_len)
{
struct btp_csis_read_supported_commands_rp *rp = rsp;
/* octet 0 */
tester_set_bit(rp->data, BTP_CSIS_READ_SUPPORTED_COMMANDS);
tester_set_bit(rp->data, BTP_CSIS_SET_MEMBER_LOCK);
tester_set_bit(rp->data, BTP_CSIS_GET_MEMBER_RSI);
*rsp_len = sizeof(*rp) + 1;
return BTP_STATUS_SUCCESS;
}
static uint8_t csis_set_member_lock(const void *cmd, uint16_t cmd_len,
void *rsp, uint16_t *rsp_len)
{
const struct btp_csis_set_member_lock_cmd *cp = cmd;
int err = -1;
if (csis_svc_inst) {
err = bt_csip_set_member_lock(csis_svc_inst, cp->lock, cp->force);
}
return BTP_STATUS_VAL(err);
}
static uint8_t csis_get_member_rsi(const void *cmd, uint16_t cmd_len,
void *rsp, uint16_t *rsp_len)
{
struct btp_csis_get_member_rsi_rp *rp = rsp;
int err = -1;
if (csis_svc_inst) {
err = bt_csip_set_member_generate_rsi(csis_svc_inst, rp->rsi);
}
*rsp_len = sizeof(*rp);
return BTP_STATUS_VAL(err);
}
static const struct btp_handler csis_handlers[] = {
{
.opcode = BTP_CSIS_READ_SUPPORTED_COMMANDS,
.index = BTP_INDEX_NONE,
.expect_len = 0,
.func = csis_supported_commands
},
{
.opcode = BTP_CSIS_SET_MEMBER_LOCK,
.expect_len = sizeof(struct btp_csis_set_member_lock_cmd),
.func = csis_set_member_lock
},
{
.opcode = BTP_CSIS_GET_MEMBER_RSI,
.expect_len = sizeof(struct btp_csis_get_member_rsi_cmd),
.func = csis_get_member_rsi
}
};
uint8_t tester_init_csis(void)
{
const struct bt_csip_set_member_register_param register_params = {
.set_size = 1,
.set_sirk = { 0xB8, 0x03, 0xEA, 0xC6, 0xAF, 0xBB, 0x65, 0xA2,
0x5A, 0x41, 0xF1, 0x53, 0x05, 0x68, 0x8E, 0x83 },
.lockable = true,
.rank = 1,
.cb = NULL
};
int err = bt_csip_set_member_register(&register_params, &csis_svc_inst);
tester_register_command_handlers(BTP_SERVICE_ID_CSIS, csis_handlers,
ARRAY_SIZE(csis_handlers));
return BTP_STATUS_VAL(err);
}
uint8_t tester_unregister_csis(void)
{
return BTP_STATUS_SUCCESS;
}