Skip to content

Commit fae1d1a

Browse files
ciascairlubos
authored andcommitted
[nrf fromtree] bluetooth: tbs: Fix GTBS call handling and add (G)TBS bearer registration
Replaces the previous static bearer registration with a dynamic runtime registration flow driven by Auto-PTS. This allows the tester to create GTBS and TBS instances at runtime with complete metadata in the correct registration orders. Signed-off-by: Alex Ciascai <ciascai.alexandru@gmail.com> (cherry picked from commit d1f1173)
1 parent c65f6cd commit fae1d1a

5 files changed

Lines changed: 130 additions & 31 deletions

File tree

tests/bluetooth/tester/src/audio/btp/btp_tbs.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,18 @@ struct btp_tbs_set_signal_strength_cmd {
8080
struct btp_tbs_terminate_call_cmd {
8181
uint8_t index;
8282
} __packed;
83+
84+
#define BTP_TBS_REGISTER_BEARER 0x0c
85+
struct btp_tbs_register_bearer_cmd {
86+
uint8_t gtbs;
87+
uint8_t technology;
88+
uint16_t optional_opcodes;
89+
uint8_t provider_name_len;
90+
uint8_t uci_len;
91+
uint8_t uri_scheme_list_len;
92+
uint8_t strings[]; /* provider_name, uci, uri_scheme_list packed in order */
93+
} __packed;
94+
95+
struct btp_tbs_register_bearer_rp {
96+
uint8_t index;
97+
} __packed;

tests/bluetooth/tester/src/audio/btp_ccp.c

Lines changed: 76 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct bt_tbs_instance *tbs_inst;
3131
static uint8_t call_index;
3232
static uint8_t inst_ccid;
3333
static bool send_ev;
34+
static uint8_t tbs_register_bearer(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
3435

3536
static uint8_t ccp_supported_commands(const void *cmd, uint16_t cmd_len,
3637
void *rsp, uint16_t *rsp_len)
@@ -1092,6 +1093,11 @@ static struct bt_tbs_cb tbs_cbs = {
10921093
};
10931094

10941095
static const struct btp_handler tbs_handlers[] = {
1096+
{
1097+
.opcode = BTP_TBS_REGISTER_BEARER,
1098+
.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
1099+
.func = tbs_register_bearer,
1100+
},
10951101
{
10961102
.opcode = BTP_TBS_READ_SUPPORTED_COMMANDS,
10971103
.index = BTP_INDEX_NONE,
@@ -1152,50 +1158,89 @@ static const struct btp_handler tbs_handlers[] = {
11521158

11531159
uint8_t tester_init_tbs(void)
11541160
{
1155-
const struct bt_tbs_register_param gtbs_param = {
1156-
.provider_name = "Generic TBS",
1157-
.uci = "un000",
1158-
.uri_schemes_supported = "tel,skype",
1159-
.gtbs = true,
1160-
.authorization_required = false,
1161-
.technology = BT_TBS_TECHNOLOGY_3G,
1162-
.supported_features = CONFIG_BT_TBS_SUPPORTED_FEATURES,
1163-
};
1164-
const struct bt_tbs_register_param tbs_param = {
1165-
.provider_name = "TBS",
1166-
.uci = "un000",
1167-
.uri_schemes_supported = "tel,skype",
1168-
.gtbs = false,
1169-
.authorization_required = false,
1170-
/* Set different technologies per bearer */
1171-
.technology = BT_TBS_TECHNOLOGY_4G,
1172-
.supported_features = CONFIG_BT_TBS_SUPPORTED_FEATURES,
1173-
};
1174-
int err;
1175-
11761161
bt_tbs_register_cb(&tbs_cbs);
11771162

11781163
tester_register_command_handlers(BTP_SERVICE_ID_TBS, tbs_handlers,
11791164
ARRAY_SIZE(tbs_handlers));
11801165

1181-
err = bt_tbs_register_bearer(&gtbs_param);
1182-
if (err < 0) {
1183-
LOG_DBG("Failed to register GTBS: %d", err);
1166+
return BTP_STATUS_SUCCESS;
1167+
}
11841168

1169+
uint8_t tester_unregister_tbs(void)
1170+
{
1171+
return BTP_STATUS_SUCCESS;
1172+
}
1173+
1174+
static uint8_t tbs_register_bearer(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len)
1175+
{
1176+
const struct btp_tbs_register_bearer_cmd *cp = cmd;
1177+
const uint8_t *strings = cp->strings;
1178+
struct btp_tbs_register_bearer_rp *rp = rsp;
1179+
char provider_name[CONFIG_BT_TBS_MAX_PROVIDER_NAME_LENGTH + 1];
1180+
char uci[BT_TBS_MAX_UCI_SIZE];
1181+
char uri_scheme_list[CONFIG_BT_TBS_MAX_URI_LENGTH + 1];
1182+
1183+
if (cmd_len < sizeof(*cp)) {
1184+
LOG_DBG("Packet too short: %u", cmd_len);
11851185
return BTP_STATUS_FAILED;
11861186
}
11871187

1188-
err = bt_tbs_register_bearer(&tbs_param);
1189-
if (err < 0) {
1190-
LOG_DBG("Failed to register TBS: %d", err);
1188+
if (cmd_len != sizeof(*cp) + cp->provider_name_len +
1189+
cp->uci_len + cp->uri_scheme_list_len) {
1190+
LOG_DBG("Invalid length: %u", cmd_len);
1191+
return BTP_STATUS_FAILED;
1192+
}
11911193

1194+
if (cp->provider_name_len >= sizeof(provider_name)) {
1195+
LOG_DBG("Buffer overflow risk: provider_name_len=%u (max=%d)",
1196+
cp->provider_name_len, CONFIG_BT_TBS_MAX_PROVIDER_NAME_LENGTH);
11921197
return BTP_STATUS_FAILED;
11931198
}
11941199

1195-
return BTP_STATUS_SUCCESS;
1196-
}
1200+
if (cp->uci_len >= sizeof(uci)) {
1201+
LOG_DBG("Buffer overflow risk: uci_len=%u (max=%u)",
1202+
cp->uci_len, BT_TBS_MAX_UCI_SIZE - 1U);
1203+
return BTP_STATUS_FAILED;
1204+
}
1205+
1206+
if (cp->uri_scheme_list_len >= sizeof(uri_scheme_list)) {
1207+
LOG_DBG("Buffer overflow risk: uri_scheme_list_len=%u (max=%d)",
1208+
cp->uri_scheme_list_len, CONFIG_BT_TBS_MAX_URI_LENGTH);
1209+
return BTP_STATUS_FAILED;
1210+
}
1211+
1212+
/* Extract provider_name */
1213+
(void)memcpy(provider_name, strings, cp->provider_name_len);
1214+
provider_name[cp->provider_name_len] = '\0';
1215+
1216+
/* Extract uci */
1217+
(void)memcpy(uci, strings + cp->provider_name_len, cp->uci_len);
1218+
uci[cp->uci_len] = '\0';
1219+
1220+
/* Extract uri_scheme_list */
1221+
(void)memcpy(uri_scheme_list,
1222+
strings + cp->provider_name_len + cp->uci_len,
1223+
cp->uri_scheme_list_len);
1224+
uri_scheme_list[cp->uri_scheme_list_len] = '\0';
1225+
1226+
struct bt_tbs_register_param param = {
1227+
.provider_name = provider_name,
1228+
.uci = uci,
1229+
.uri_schemes_supported = uri_scheme_list,
1230+
.gtbs = cp->gtbs == 1U ? true : false,
1231+
.technology = cp->technology,
1232+
.supported_features = sys_le16_to_cpu(cp->optional_opcodes),
1233+
};
1234+
1235+
int index = bt_tbs_register_bearer(&param);
1236+
1237+
if (index < 0) {
1238+
return BTP_STATUS_FAILED;
1239+
}
1240+
1241+
/* Return the assigned index in the response */
1242+
rp->index = (uint8_t)index;
1243+
*rsp_len = sizeof(*rp);
11971244

1198-
uint8_t tester_unregister_tbs(void)
1199-
{
12001245
return BTP_STATUS_SUCCESS;
12011246
}

tests/bsim/bluetooth/tester/src/audio/ccp_peripheral.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ static void test_ccp_peripheral(void)
3232
bsim_btp_core_register(BTP_SERVICE_ID_GAP);
3333
bsim_btp_core_register(BTP_SERVICE_ID_TBS);
3434

35+
bsim_btp_tbs_register_bearer(true, BT_TBS_TECHNOLOGY_3G, BT_TBS_FEATURE_ALL,
36+
"GTBS Provider", "un000", "tel");
37+
bsim_btp_tbs_register_bearer(false, BT_TBS_TECHNOLOGY_3G, BT_TBS_FEATURE_ALL,
38+
"TBS Provider", "un000", "tel");
39+
3540
bsim_btp_gap_set_discoverable(BTP_GAP_GENERAL_DISCOVERABLE);
3641
bsim_btp_gap_start_advertising(0U, 0U, NULL, BT_HCI_OWN_ADDR_PUBLIC);
3742
bsim_btp_wait_for_gap_device_connected(&remote_addr);

tests/bsim/bluetooth/tester/src/bsim_btp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,6 +1670,8 @@ static bool is_valid_tbs_packet_len(const struct btp_hdr *hdr, struct net_buf_si
16701670
return buf_simple->len == 0U;
16711671
case BTP_TBS_SET_SIGNAL_STRENGTH:
16721672
return buf_simple->len == 0U;
1673+
case BTP_TBS_REGISTER_BEARER:
1674+
return buf_simple->len == sizeof(struct btp_tbs_register_bearer_rp);
16731675

16741676
/* No events */
16751677
default:

tests/bsim/bluetooth/tester/src/bsim_btp.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,38 @@ static inline void bsim_btp_wait_for_mcp_cmd_ntf(uint8_t *requested_opcode)
10921092
net_buf_unref(buf);
10931093
}
10941094

1095+
static inline void bsim_btp_tbs_register_bearer(
1096+
bool gtbs, uint8_t technology,
1097+
uint16_t optional_opcodes,
1098+
const char *provider_name,
1099+
const char *uci,
1100+
const char *uri_scheme_list)
1101+
{
1102+
struct btp_tbs_register_bearer_cmd *cmd;
1103+
struct btp_hdr *cmd_hdr;
1104+
1105+
NET_BUF_SIMPLE_DEFINE(cmd_buffer, BTP_MTU);
1106+
1107+
cmd_hdr = net_buf_simple_add(&cmd_buffer, sizeof(*cmd_hdr));
1108+
cmd_hdr->service = BTP_SERVICE_ID_TBS;
1109+
cmd_hdr->opcode = BTP_TBS_REGISTER_BEARER;
1110+
cmd_hdr->index = BTP_INDEX;
1111+
cmd = net_buf_simple_add(&cmd_buffer, sizeof(*cmd));
1112+
cmd->gtbs = gtbs ? 1U : 0U;
1113+
cmd->technology = technology;
1114+
cmd->optional_opcodes = sys_cpu_to_le16(optional_opcodes);
1115+
cmd->provider_name_len = strlen(provider_name);
1116+
cmd->uci_len = strlen(uci);
1117+
cmd->uri_scheme_list_len = strlen(uri_scheme_list);
1118+
net_buf_simple_add_mem(&cmd_buffer, provider_name, cmd->provider_name_len);
1119+
net_buf_simple_add_mem(&cmd_buffer, uci, cmd->uci_len);
1120+
net_buf_simple_add_mem(&cmd_buffer, uri_scheme_list, cmd->uri_scheme_list_len);
1121+
1122+
cmd_hdr->len = sys_cpu_to_le16(cmd_buffer.len - sizeof(*cmd_hdr));
1123+
1124+
bsim_btp_send_to_tester(cmd_buffer.data, cmd_buffer.len);
1125+
}
1126+
10951127
static inline void bsim_btp_tmap_discover(const bt_addr_le_t *address)
10961128
{
10971129
struct btp_tmap_discover_cmd *cmd;

0 commit comments

Comments
 (0)