Skip to content

Commit 80eeeb3

Browse files
committed
Bluetooth: CCP: Server: Add support for get UCI
Add support for getting the UCI. For now the UCI will be duplicated by the TBS implementation, but will be optimizied in the future so only one copy of the UCI exists. Signed-off-by: Emil Gydesen <[email protected]>
1 parent 15cc6b7 commit 80eeeb3

File tree

7 files changed

+141
-3
lines changed

7 files changed

+141
-3
lines changed

doc/connectivity/bluetooth/shell/audio/ccp.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ to :code:`0` which is the GTBS bearer.
2424
init : Initialize CCP Call Control Server
2525
set_bearer_name : Set bearer name [index] <name>
2626
get_bearer_name : Get bearer name [index]
27+
get_bearer_name : Get bearer UCI [index]
2728
2829
2930
Example Usage
@@ -58,6 +59,15 @@ Setting and getting the bearer name
5859
uart:~$ ccp_call_control_server get_bearer_name 1
5960
Bearer[1] name: New TBS name
6061
62+
Getting the bearer UCI
63+
----------------------
64+
65+
.. code-block:: console
66+
67+
uart:~$ ccp_call_control_server get_bearer_uci
68+
Bearer[0] UCI: un999
69+
uart:~$ ccp_call_control_server get_bearer_name 1
70+
Bearer[1] UCI: skype
6171
6272
Call Control Client
6373
*******************

include/zephyr/bluetooth/audio/ccp.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,19 @@ int bt_ccp_call_control_server_set_bearer_provider_name(
119119
int bt_ccp_call_control_server_get_bearer_provider_name(
120120
struct bt_ccp_call_control_server_bearer *bearer, const char **name);
121121

122+
/**
123+
* @brief Get the bearer provider name.
124+
*
125+
* @param[in] bearer The bearer to get the name for.
126+
* @param[out] uci Pointer that will be updated to be the bearer uci.
127+
*
128+
* @retval 0 Success
129+
* @retval -EINVAL @p bearer or @p name is NULL
130+
* @retval -EFAULT @p bearer is not registered
131+
*/
132+
int bt_ccp_call_control_server_get_bearer_uci(struct bt_ccp_call_control_server_bearer *bearer,
133+
const char **uci);
134+
122135
/** @} */ /* End of group bt_ccp_call_control_server */
123136

124137
/**

include/zephyr/bluetooth/audio/tbs.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,14 @@ extern "C" {
194194
* whenever the client should perform on action on the GTBS instance of the
195195
* server, rather than any of the specific Telephone Bearer Service instances.
196196
*/
197-
#define BT_TBS_GTBS_INDEX 0xFF
197+
#define BT_TBS_GTBS_INDEX 0xFF
198+
199+
/** Maximum size of bearer uniform caller identifier (UCI)
200+
*
201+
* Includes the NULL terminator.
202+
* Allowed values are defined by Bluetooth Assigned Numbers.
203+
*/
204+
#define BT_TBS_MAX_UCI_SIZE 6
198205

199206
/** @brief Opaque Telephone Bearer Service instance. */
200207
struct bt_tbs_instance;

subsys/bluetooth/audio/ccp_call_control_server.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ LOG_MODULE_REGISTER(bt_ccp_call_control_server, CONFIG_BT_CCP_CALL_CONTROL_SERVE
2121
/* A service instance can either be a GTBS or a TBS instance */
2222
struct bt_ccp_call_control_server_bearer {
2323
char provider_name[CONFIG_BT_ccp_call_control_server_PROVIDER_NAME_MAX_LENGTH + 1];
24+
char uci[BT_TBS_MAX_UCI_SIZE];
2425
uint8_t tbs_index;
2526
bool registered;
2627
};
@@ -73,6 +74,7 @@ int bt_ccp_call_control_server_register_bearer(const struct bt_tbs_register_para
7374
free_bearer->tbs_index = (uint8_t)ret;
7475
(void)utf8_lcpy(free_bearer->provider_name, param->provider_name,
7576
sizeof(free_bearer->provider_name));
77+
(void)utf8_lcpy(free_bearer->uci, param->uci, sizeof(free_bearer->uci));
7678
*bearer = free_bearer;
7779

7880
return 0;
@@ -173,3 +175,29 @@ int bt_ccp_call_control_server_get_bearer_provider_name(
173175

174176
return 0;
175177
}
178+
179+
int bt_ccp_call_control_server_get_bearer_uci(struct bt_ccp_call_control_server_bearer *bearer,
180+
const char **uci)
181+
{
182+
CHECKIF(bearer == NULL) {
183+
LOG_DBG("bearer is NULL");
184+
185+
return -EINVAL;
186+
}
187+
188+
CHECKIF(uci == NULL) {
189+
LOG_DBG("uci is NULL");
190+
191+
return -EINVAL;
192+
}
193+
194+
if (!bearer->registered) {
195+
LOG_DBG("Bearer %p not registered", bearer);
196+
197+
return -EFAULT;
198+
}
199+
200+
*uci = bearer->uci;
201+
202+
return 0;
203+
}

subsys/bluetooth/audio/shell/ccp_call_control_server.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,32 @@ static int cmd_ccp_call_control_server_get_bearer_name(const struct shell *sh, s
155155
return 0;
156156
}
157157

158+
static int cmd_ccp_call_control_server_get_bearer_uci(const struct shell *sh, size_t argc,
159+
char *argv[])
160+
{
161+
unsigned long index = 0;
162+
const char *uci;
163+
int err = 0;
164+
165+
if (argc > 1) {
166+
index = validate_and_get_index(sh, argv[1]);
167+
if (index < 0) {
168+
return index;
169+
}
170+
}
171+
172+
err = bt_ccp_call_control_server_get_bearer_uci(bearers[index], &uci);
173+
if (err != 0) {
174+
shell_error(sh, "Failed to get bearer[%lu] UCI: %d", index, err);
175+
176+
return -ENOEXEC;
177+
}
178+
179+
shell_print(sh, "Bearer[%lu] UCI: %s", index, uci);
180+
181+
return 0;
182+
}
183+
158184
static int cmd_ccp_call_control_server(const struct shell *sh, size_t argc, char **argv)
159185
{
160186
if (argc > 1) {
@@ -174,6 +200,8 @@ SHELL_STATIC_SUBCMD_SET_CREATE(ccp_call_control_server_cmds,
174200
cmd_ccp_call_control_server_set_bearer_name, 2, 1),
175201
SHELL_CMD_ARG(get_bearer_name, NULL, "Get bearer name [index]",
176202
cmd_ccp_call_control_server_get_bearer_name, 1, 1),
203+
SHELL_CMD_ARG(get_bearer_uci, NULL, "Get bearer UCI [index]",
204+
cmd_ccp_call_control_server_get_bearer_uci, 1, 1),
177205
SHELL_SUBCMD_SET_END);
178206

179207
SHELL_CMD_ARG_REGISTER(ccp_call_control_server, &ccp_call_control_server_cmds,

subsys/bluetooth/audio/tbs_internal.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include <zephyr/sys/atomic.h>
2222
#include <zephyr/types.h>
2323

24-
#define BT_TBS_MAX_UCI_SIZE 6
2524
#define BT_TBS_MIN_URI_LEN 3 /* a:b */
2625
#define BT_TBS_FREE_CALL_INDEX 0
2726

tests/bluetooth/audio/ccp_call_control_server/src/main.c

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
DEFINE_FFF_GLOBALS;
2828

2929
#define DEFAULT_BEARER_NAME "test"
30+
#define DEFAULT_BEARER_UCI "un999"
3031

3132
struct ccp_call_control_server_test_suite_fixture {
3233
/** Need 1 additional bearer than the max to trigger some corner cases */
@@ -84,7 +85,7 @@ static void register_default_bearer(struct ccp_call_control_server_test_suite_fi
8485
{
8586
const struct bt_tbs_register_param register_param = {
8687
.provider_name = DEFAULT_BEARER_NAME,
87-
.uci = "un999",
88+
.uci = DEFAULT_BEARER_UCI,
8889
.uri_schemes_supported = "tel",
8990
.gtbs = true,
9091
.authorization_required = false,
@@ -409,3 +410,55 @@ static ZTEST_F(ccp_call_control_server_test_suite,
409410
err = bt_ccp_call_control_server_get_bearer_provider_name(fixture->bearers[0], NULL);
410411
zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
411412
}
413+
414+
static ZTEST_F(ccp_call_control_server_test_suite, test_bt_ccp_call_control_server_get_bearer_uci)
415+
{
416+
const char *res_bearer_name;
417+
int err;
418+
419+
register_default_bearer(fixture);
420+
421+
err = bt_ccp_call_control_server_get_bearer_uci(fixture->bearers[0], &res_bearer_name);
422+
zassert_equal(err, 0, "Unexpected return value %d", err);
423+
424+
zassert_str_equal(DEFAULT_BEARER_UCI, res_bearer_name, "%s != %s", DEFAULT_BEARER_UCI,
425+
res_bearer_name);
426+
}
427+
428+
static ZTEST_F(ccp_call_control_server_test_suite,
429+
test_bt_ccp_call_control_server_get_bearer_uci_inval_not_registered)
430+
{
431+
const char *res_bearer_name;
432+
int err;
433+
434+
/* Register and unregister bearer to get a valid pointer but where it is unregistered*/
435+
register_default_bearer(fixture);
436+
err = bt_ccp_call_control_server_unregister_bearer(fixture->bearers[0]);
437+
zassert_equal(err, 0, "Unexpected return value %d", err);
438+
439+
err = bt_ccp_call_control_server_get_bearer_uci(fixture->bearers[0], &res_bearer_name);
440+
zassert_equal(err, -EFAULT, "Unexpected return value %d", err);
441+
}
442+
443+
static ZTEST_F(ccp_call_control_server_test_suite,
444+
test_bt_ccp_call_control_server_get_bearer_uci_inval_null_bearer)
445+
{
446+
const char *res_bearer_name;
447+
int err;
448+
449+
register_default_bearer(fixture);
450+
451+
err = bt_ccp_call_control_server_get_bearer_uci(NULL, &res_bearer_name);
452+
zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
453+
}
454+
455+
static ZTEST_F(ccp_call_control_server_test_suite,
456+
test_bt_ccp_call_control_server_get_bearer_uci_inval_null_name)
457+
{
458+
int err;
459+
460+
register_default_bearer(fixture);
461+
462+
err = bt_ccp_call_control_server_get_bearer_uci(fixture->bearers[0], NULL);
463+
zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
464+
}

0 commit comments

Comments
 (0)