Bluetooth: Tester: Add TMAP tests support

Adding support for TMAP tests.

Signed-off-by: Agata Figiel <agata.figiel@codecoup.pl>
This commit is contained in:
Agata Figiel 2024-02-05 10:07:35 +01:00 committed by Alberto Escolar
commit 19610233e2
7 changed files with 160 additions and 1 deletions

View file

@ -90,3 +90,7 @@ endif()
if(CONFIG_BT_TBS OR CONFIG_BT_GTBS)
target_sources(app PRIVATE src/btp_ccp.c)
endif()
if(CONFIG_BT_TMAP)
target_sources(app PRIVATE src/btp_tmap.c)
endif()

View file

@ -142,3 +142,6 @@ CONFIG_BT_GTBS=y
CONFIG_BT_TBS=y
CONFIG_BT_TBS_MAX_CALLS=10
CONFIG_BT_TBS_SUPPORTED_FEATURES=3
# TMAP
CONFIG_BT_TMAP=y

View file

@ -36,6 +36,7 @@
#include "btp_csip.h"
#include "btp_cap.h"
#include "btp_tbs.h"
#include "btp_tmap.h"
#define BTP_MTU 1024
#define BTP_DATA_MAX_SIZE (BTP_MTU - sizeof(struct btp_hdr))
@ -71,8 +72,9 @@
#define BTP_SERVICE_ID_CSIP 25
#define BTP_SERVICE_ID_CAP 26
#define BTP_SERVICE_ID_TBS 27
#define BTP_SERVICE_ID_TMAP 28
#define BTP_SERVICE_ID_MAX BTP_SERVICE_ID_TBS
#define BTP_SERVICE_ID_MAX BTP_SERVICE_ID_TMAP
#define BTP_STATUS_SUCCESS 0x00
#define BTP_STATUS_FAILED 0x01

View file

@ -0,0 +1,26 @@
/* btp_tmap.h - Bluetooth tester headers */
/*
* Copyright (c) 2024 Codecoup
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/types.h>
/* TMAP commands */
#define BTP_TMAP_READ_SUPPORTED_COMMANDS 0x01
struct btp_tmap_read_supported_commands_rp {
uint8_t data[0];
} __packed;
#define BTP_TMAP_DISCOVER 0x02
struct btp_tmap_discover_cmd {
bt_addr_le_t address;
} __packed;
#define BT_TMAP_EV_DISCOVERY_COMPLETE 0x80
struct btp_tmap_discovery_complete_ev {
bt_addr_le_t address;
uint8_t status;
uint16_t role;
} __packed;

View file

@ -132,3 +132,6 @@ uint8_t tester_unregister_hap(void);
uint8_t tester_init_tbs(void);
uint8_t tester_unregister_tbs(void);
uint8_t tester_init_tmap(void);
uint8_t tester_unregister_tmap(void);

View file

@ -104,6 +104,9 @@ static uint8_t supported_services(const void *cmd, uint16_t cmd_len,
#if defined(CONFIG_BT_TBS) || defined(CONFIG_BT_GTBS)
tester_set_bit(rp->data, BTP_SERVICE_ID_TBS);
#endif /*CONFIG_BT_TBS */
#if defined(CONFIG_BT_TMAP)
tester_set_bit(rp->data, BTP_SERVICE_ID_TMAP);
#endif /* CONFIG_BT_TMAP */
*rsp_len = sizeof(*rp) + 2;
@ -237,6 +240,11 @@ static uint8_t register_service(const void *cmd, uint16_t cmd_len,
status = tester_init_tbs();
break;
#endif /* CONFIG_BT_TBS */
#if defined(CONFIG_BT_TMAP)
case BTP_SERVICE_ID_TMAP:
status = tester_init_tmap();
break;
#endif /* CONFIG_BT_TMAP */
default:
LOG_WRN("unknown id: 0x%02x", cp->id);
status = BTP_STATUS_FAILED;
@ -374,6 +382,11 @@ static uint8_t unregister_service(const void *cmd, uint16_t cmd_len,
status = tester_unregister_tbs();
break;
#endif /* CONFIG_BT_TBS */
#if defined(CONFIG_BT_TMAP)
case BTP_SERVICE_ID_TMAP:
status = tester_unregister_tmap();
break;
#endif /* CONFIG_BT_TMAP */
default:
LOG_WRN("unknown id: 0x%x", cp->id);
status = BTP_STATUS_FAILED;

View file

@ -0,0 +1,108 @@
/* btp_tmap.c - Bluetooth TMAP Tester */
/*
* Copyright (c) 2024 Codecoup
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/bluetooth/audio/tmap.h>
#include "btp/btp.h"
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(bttester_tmap, CONFIG_BTTESTER_LOG_LEVEL);
static uint8_t read_supported_commands(const void *cmd, uint16_t cmd_len, void *rsp,
uint16_t *rsp_len)
{
struct btp_tmap_read_supported_commands_rp *rp = rsp;
tester_set_bit(rp->data, BTP_TMAP_READ_SUPPORTED_COMMANDS);
tester_set_bit(rp->data, BTP_TMAP_DISCOVER);
*rsp_len = sizeof(*rp) + 1;
return BTP_STATUS_SUCCESS;
}
static void tmap_discover_cb(enum bt_tmap_role role, struct bt_conn *conn, int err)
{
struct btp_tmap_discovery_complete_ev ev;
if (err) {
LOG_ERR("Discovery failed (%d)", err);
}
bt_addr_le_copy(&ev.address, bt_conn_get_dst(conn));
ev.status = err;
ev.role = role;
tester_event(BTP_SERVICE_ID_TMAP, BT_TMAP_EV_DISCOVERY_COMPLETE, &ev, sizeof(ev));
}
static const struct bt_tmap_cb tmap_cb = {
.discovery_complete = tmap_discover_cb,
};
static uint8_t tmap_discover(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len)
{
const struct btp_tmap_discover_cmd *cp = cmd;
struct bt_conn *conn;
int err;
conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
if (!conn) {
LOG_ERR("Unknown connection");
return BTP_STATUS_FAILED;
}
err = bt_tmap_discover(conn, &tmap_cb);
if (err != 0) {
LOG_ERR("Failed to discover remote TMAP: %d", err);
}
bt_conn_unref(conn);
return BTP_STATUS_VAL(err);
}
static const struct btp_handler tmap_handlers[] = {
{
.opcode = BTP_TMAP_READ_SUPPORTED_COMMANDS,
.index = BTP_INDEX_NONE,
.expect_len = 0,
.func = read_supported_commands,
},
{
.opcode = BTP_TMAP_DISCOVER,
.expect_len = sizeof(struct btp_tmap_discover_cmd),
.func = tmap_discover,
},
};
uint8_t tester_init_tmap(void)
{
const enum bt_tmap_role role = (BT_TMAP_CG_SUPPORTED ? BT_TMAP_ROLE_CG : 0U) |
(BT_TMAP_CT_SUPPORTED ? BT_TMAP_ROLE_CT : 0U) |
(BT_TMAP_UMS_SUPPORTED ? BT_TMAP_ROLE_UMS : 0U) |
(BT_TMAP_UMR_SUPPORTED ? BT_TMAP_ROLE_UMR : 0U) |
(BT_TMAP_BMS_SUPPORTED ? BT_TMAP_ROLE_BMS : 0U) |
(BT_TMAP_BMR_SUPPORTED ? BT_TMAP_ROLE_BMR : 0U);
int err;
err = bt_tmap_register(role);
if (err != 0) {
LOG_ERR("Failed to register TMAP (err %d)", err);
return BTP_STATUS_FAILED;
}
tester_register_command_handlers(BTP_SERVICE_ID_TMAP, tmap_handlers,
ARRAY_SIZE(tmap_handlers));
return BTP_STATUS_SUCCESS;
}
uint8_t tester_unregister_tmap(void)
{
return BTP_STATUS_SUCCESS;
}