* [PATCH BlueZ v2 2/4] unit/test-hfp: Add Operator name test for HF
2025-09-15 16:34 [PATCH BlueZ v2 1/4] shared/hfp: Add Operator name support Frédéric Danis
@ 2025-09-15 16:34 ` Frédéric Danis
2025-09-15 16:34 ` [PATCH BlueZ v2 3/4] shared/hfp: Add Call Line Identification support Frédéric Danis
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Frédéric Danis @ 2025-09-15 16:34 UTC (permalink / raw)
To: linux-bluetooth
This add the following test:
- HFP/HF/PSI/BV-04-C
Verify that the HF can query the currently selected operator name.
Improve MINIMAL_SLC_SESSION macro to be able to set the service, call,
callsetup and callheld indicators at connection time.
---
v1->v2 : Move some changes to patch 1 to fix unit/test-hfp in this patch
unit/test-hfp.c | 43 ++++++++++++++++++++++++++++++++++---------
1 file changed, 34 insertions(+), 9 deletions(-)
diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index 2a85ec575..8ab6c7bf5 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -699,7 +699,7 @@ static void test_hf_robustness(gconstpointer data)
context_quit(context);
}
-#define MINIMAL_SLC_SESSION \
+#define MINIMAL_SLC_SESSION(service, call, callsetup, callheld) \
raw_pdu('\r', '\n', '+', 'B', 'R', 'S', 'F', ':', \
' ', '0', '\r', '\n'), \
frg_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \
@@ -722,8 +722,8 @@ static void test_hf_robustness(gconstpointer data)
frg_pdu('\r', '\n'), \
frg_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \
raw_pdu('\r', '\n', '+', 'C', 'I', 'N', 'D', ':', ' '), \
- frg_pdu('0', ',', '0', ',', '0', ',', '0', ',', '5'), \
- frg_pdu(',', '0', ',', '5', '\r', '\n'), \
+ frg_pdu(service, ',', call, ',', callsetup, ',', callheld, ','), \
+ frg_pdu('5', ',', '0', ',', '5', '\r', '\n'), \
frg_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \
raw_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \
raw_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \
@@ -750,7 +750,13 @@ static void hf_update_indicator(enum hfp_indicator indicator, uint32_t val,
if (!context->session.completed) {
switch (indicator) {
case HFP_INDICATOR_SERVICE:
- g_assert_cmpint(val, ==, 0);
+ if (g_str_equal(test_name, "/HFP/HF/PSI/BV-03-C") ||
+ g_str_equal(test_name, "/HFP/HF/TRS/BV-01-C") ||
+ g_str_equal(test_name,
+ "/hfp_hf/test_session_minimal"))
+ g_assert_cmpint(val, ==, 0);
+ else
+ g_assert_cmpint(val, ==, 1);
break;
case HFP_INDICATOR_CALL:
g_assert_cmpint(val, ==, 0);
@@ -794,9 +800,22 @@ static void hf_update_indicator(enum hfp_indicator indicator, uint32_t val,
}
}
+static void hf_update_operator(const char *operator_name, void *user_data)
+{
+ struct context *context = user_data;
+ const char *test_name = context->data->test_name;
+
+ if (tester_use_debug())
+ tester_debug("operator updated: %s", operator_name);
+
+ if (g_str_equal(test_name, "/HFP/HF/PSI/BV-04-C"))
+ g_assert_cmpstr(operator_name, ==, "TEST");
+}
+
static struct hfp_hf_callbacks hf_session_callbacks = {
.session_ready = hf_session_ready_cb,
.update_indicator = hf_update_indicator,
+ .update_operator = hf_update_operator,
};
static void test_hf_session_done(enum hfp_result res, enum hfp_error cme_err,
@@ -1001,13 +1020,13 @@ int main(int argc, char *argv[])
define_hf_test("/hfp_hf/test_session_minimal", test_hf_session,
NULL, test_hf_session_done,
- MINIMAL_SLC_SESSION,
+ MINIMAL_SLC_SESSION('0', '0', '0', '0'),
data_end());
/* Transfer Signal Strength Indication - HF */
define_hf_test("/HFP/HF/PSI/BV-01-C", test_hf_session,
NULL, test_hf_session_done,
- MINIMAL_SLC_SESSION,
+ MINIMAL_SLC_SESSION('1', '0', '0', '0'),
frg_pdu('\r', '\n', '+', 'C', 'I', 'E', 'V', ':'),
frg_pdu(' ', '5', ',', '3', '\r', '\n'),
data_end());
@@ -1015,7 +1034,7 @@ int main(int argc, char *argv[])
/* Transfer Roaming Status Indication - HF */
define_hf_test("/HFP/HF/PSI/BV-02-C", test_hf_session,
NULL, test_hf_session_done,
- MINIMAL_SLC_SESSION,
+ MINIMAL_SLC_SESSION('1', '0', '0', '0'),
frg_pdu('\r', '\n', '+', 'C', 'I', 'E', 'V', ':'),
frg_pdu(' ', '6', ',', '1', '\r', '\n'),
frg_pdu('\r', '\n', '+', 'C', 'I', 'E', 'V', ':'),
@@ -1025,15 +1044,21 @@ int main(int argc, char *argv[])
/* Transfer Battery Level Indication - HF */
define_hf_test("/HFP/HF/PSI/BV-03-C", test_hf_session,
NULL, test_hf_session_done,
- MINIMAL_SLC_SESSION,
+ MINIMAL_SLC_SESSION('0', '0', '0', '0'),
frg_pdu('\r', '\n', '+', 'C', 'I', 'E', 'V', ':'),
frg_pdu(' ', '7', ',', '3', '\r', '\n'),
data_end());
+ /* Transfer Operator name - HF */
+ define_hf_test("/HFP/HF/PSI/BV-04-C", test_hf_session,
+ NULL, test_hf_session_done,
+ MINIMAL_SLC_SESSION('1', '0', '0', '0'),
+ data_end());
+
/* Transfer Registration Status - HF */
define_hf_test("/HFP/HF/TRS/BV-01-C", test_hf_session,
NULL, test_hf_session_done,
- MINIMAL_SLC_SESSION,
+ MINIMAL_SLC_SESSION('0', '0', '0', '0'),
frg_pdu('\r', '\n', '+', 'C', 'I', 'E', 'V', ':'),
frg_pdu(' ', '1', ',', '1', '\r', '\n'),
frg_pdu('\r', '\n', '+', 'C', 'I', 'E', 'V', ':'),
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH BlueZ v2 3/4] shared/hfp: Add Call Line Identification support
2025-09-15 16:34 [PATCH BlueZ v2 1/4] shared/hfp: Add Operator name support Frédéric Danis
2025-09-15 16:34 ` [PATCH BlueZ v2 2/4] unit/test-hfp: Add Operator name test for HF Frédéric Danis
@ 2025-09-15 16:34 ` Frédéric Danis
2025-09-15 16:34 ` [PATCH BlueZ v2 4/4] unit/test-hfp: Add Call Line Identification test for HF Frédéric Danis
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Frédéric Danis @ 2025-09-15 16:34 UTC (permalink / raw)
To: linux-bluetooth
Send AT+CLIP=1 at the end of the SLC creation to enable CLIP event.
Register +CLIP handler to call the update_call_line_id callback on event.
During incoming call notifications, i.e. after +CIEV:<callsetup>,1
event which creates a new call object, the reception of +CLIP event
will update the line_id and type of the call object.
---
v1->v2 : Move changes from patch 4 to fix unit/test-hfp
src/shared/hfp.c | 238 ++++++++++++++++++++++++++++++++++++++++++++++-
src/shared/hfp.h | 20 ++++
unit/test-hfp.c | 3 +-
3 files changed, 257 insertions(+), 4 deletions(-)
diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index f94df90f1..29b467ae3 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -18,6 +18,7 @@
#include <string.h>
#include <stdarg.h>
#include <ctype.h>
+#include <limits.h>
#include "src/shared/util.h"
#include "src/shared/ringbuf.h"
@@ -29,7 +30,7 @@
hfp_debug(_hfp->debug_callback, _hfp->debug_data, "%s:%s() " fmt, \
__FILE__, __func__, ## arg)
-#define HFP_HF_FEATURES (HFP_HF_FEAT_ESCO_S4_T2)
+#define HFP_HF_FEATURES (HFP_HF_FEAT_CLIP | HFP_HF_FEAT_ESCO_S4_T2)
struct hfp_gw {
int ref_count;
@@ -100,6 +101,7 @@ struct hfp_hf {
bool roaming;
uint8_t battchg;
+ struct queue *calls;
};
struct cmd_handler {
@@ -128,6 +130,15 @@ struct event_handler {
hfp_hf_result_func_t callback;
};
+struct hf_call {
+ uint id;
+ enum hfp_call_status status;
+ char *line_id;
+ uint type;
+
+ struct hfp_hf *hfp;
+};
+
static void hfp_debug(hfp_debug_func_t debug_func, void *debug_data,
const char *format, ...)
{
@@ -1303,6 +1314,7 @@ struct hfp_hf *hfp_hf_new(int fd)
hfp->event_handlers = queue_new();
hfp->cmd_queue = queue_new();
+ hfp->calls = queue_new();
hfp->writer_active = false;
if (!io_set_read_handler(hfp->io, hf_can_read_data, hfp,
@@ -1329,6 +1341,18 @@ struct hfp_hf *hfp_hf_ref(struct hfp_hf *hfp)
return hfp;
}
+static void remove_call_cb(void *user_data)
+{
+ struct hf_call *call = user_data;
+ struct hfp_hf *hfp = call->hfp;
+
+ if (hfp->callbacks && hfp->callbacks->call_removed)
+ hfp->callbacks->call_removed(call->id, hfp->callbacks_data);
+
+ free(call->line_id);
+ free(call);
+}
+
void hfp_hf_unref(struct hfp_hf *hfp)
{
if (!hfp)
@@ -1361,6 +1385,9 @@ void hfp_hf_unref(struct hfp_hf *hfp)
queue_destroy(hfp->cmd_queue, free);
hfp->cmd_queue = NULL;
+ queue_destroy(hfp->calls, remove_call_cb);
+ hfp->calls = NULL;
+
if (!hfp->in_disconnect) {
free(hfp);
return;
@@ -1568,6 +1595,44 @@ bool hfp_hf_disconnect(struct hfp_hf *hfp)
return io_shutdown(hfp->io);
}
+static bool call_id_match(const void *data, const void *match_data)
+{
+ const struct hf_call *call = data;
+ uint id = PTR_TO_UINT(match_data);
+
+ return (call->id == id);
+}
+
+static uint next_call_index(struct hfp_hf *hfp)
+{
+ for (uint i = 1; i < UINT_MAX; i++) {
+ if (!queue_find(hfp->calls, call_id_match, UINT_TO_PTR(i)))
+ return i;
+ }
+
+ return 0;
+}
+
+static struct hf_call *call_new(struct hfp_hf *hfp, unsigned int id,
+ enum hfp_call_status status,
+ char *number)
+{
+ struct hf_call *call;
+
+ call = new0(struct hf_call, 1);
+ call->id = id;
+ call->status = status;
+ call->line_id = number;
+ call->hfp = hfp;
+ queue_push_tail(hfp->calls, call);
+
+ if (hfp->callbacks && hfp->callbacks->call_added)
+ hfp->callbacks->call_added(call->id, call->status,
+ hfp->callbacks_data);
+
+ return call;
+}
+
static void ciev_service_cb(uint8_t val, void *user_data)
{
struct hfp_hf *hfp = user_data;
@@ -1599,9 +1664,40 @@ static void ciev_call_cb(uint8_t val, void *user_data)
}
}
+static bool call_outgoing_match(const void *data, const void *match_data)
+{
+ const struct hf_call *call = data;
+
+ return (call->status == CALL_STATUS_DIALING ||
+ call->status == CALL_STATUS_ALERTING);
+}
+
+static bool call_incoming_match(const void *data, const void *match_data)
+{
+ const struct hf_call *call = data;
+
+ return (call->status == CALL_STATUS_INCOMING);
+}
+
+static bool call_setup_match(const void *data, const void *match_data)
+{
+ return (call_outgoing_match(data, match_data) ||
+ call_incoming_match(data, match_data));
+}
+
+static bool call_active_match(const void *data, const void *match_data)
+{
+ const struct hf_call *call = data;
+
+ return (call->status == CALL_STATUS_ACTIVE);
+}
+
static void ciev_callsetup_cb(uint8_t val, void *user_data)
{
struct hfp_hf *hfp = user_data;
+ struct hf_call *call;
+ uint id;
+ enum hfp_call_status status;
DBG(hfp, "%u", val);
@@ -1610,6 +1706,57 @@ static void ciev_callsetup_cb(uint8_t val, void *user_data)
DBG(hfp, "hf: Incorrect call setup state: %u", val);
return;
}
+
+ switch (val) {
+ case CIND_CALLSETUP_NONE:
+ /* remove call in setup phase */
+ queue_remove_all(hfp->calls, call_setup_match, hfp,
+ remove_call_cb);
+ break;
+ case CIND_CALLSETUP_INCOMING:
+ if (queue_length(hfp->calls) != 0) {
+ DBG(hfp, "hf: Call already exists");
+ return;
+ }
+
+ id = next_call_index(hfp);
+ if (id == 0) {
+ DBG(hfp, "hf: No new call index available");
+ return;
+ }
+ call_new(hfp, id, CALL_STATUS_INCOMING, NULL);
+ break;
+ case CIND_CALLSETUP_DIALING:
+ case CIND_CALLSETUP_ALERTING:
+ if (val == CIND_CALLSETUP_DIALING)
+ status = CALL_STATUS_DIALING;
+ else
+ status = CALL_STATUS_ALERTING;
+
+ if (queue_find(hfp->calls, call_active_match, NULL)) {
+ DBG(hfp, "hf: Error: active call");
+ return;
+ }
+
+ call = queue_find(hfp->calls, call_outgoing_match, NULL);
+ if (call && call->status != status) {
+ call->status = status;
+ if (hfp->callbacks &&
+ hfp->callbacks->call_status_updated)
+ hfp->callbacks->call_status_updated(call->id,
+ call->status,
+ hfp->callbacks_data);
+ return;
+ }
+
+ id = next_call_index(hfp);
+ if (id == 0) {
+ DBG(hfp, "hf: No new call index available");
+ return;
+ }
+ call_new(hfp, id, status, NULL);
+ break;
+ }
}
static void ciev_callheld_cb(uint8_t val, void *user_data)
@@ -1733,7 +1880,45 @@ static void cops_cb(struct hfp_context *context, void *user_data)
hfp->callbacks->update_operator(name, hfp->callbacks_data);
}
-static void cops_resp(enum hfp_result result, enum hfp_error cme_err,
+static void clip_cb(struct hfp_context *context, void *user_data)
+{
+ struct hfp_hf *hfp = user_data;
+ char number[255];
+ unsigned int type;
+ struct hf_call *call;
+
+ DBG(hfp, "");
+
+ if (!hfp_context_get_string(context, number, sizeof(number))) {
+ DBG(hfp, "hf: Could not get string");
+ return;
+ }
+
+ if (!hfp_context_get_number(context, &type))
+ return;
+
+ call = queue_find(hfp->calls, call_incoming_match, NULL);
+ if (!call) {
+ DBG(hfp, "hf: no incoming call");
+ return;
+ }
+
+ if (call->line_id && strcmp(call->line_id, number) == 0 &&
+ call->type == type)
+ return;
+
+ if (call->line_id)
+ free(call->line_id);
+ call->line_id = strdup(number);
+ call->type = type;
+
+ if (hfp->callbacks && hfp->callbacks->call_line_id_updated)
+ hfp->callbacks->call_line_id_updated(call->id, call->line_id,
+ call->type,
+ hfp->callbacks_data);
+}
+
+static void clip_resp(enum hfp_result result, enum hfp_error cme_err,
void *user_data)
{
struct hfp_hf *hfp = user_data;
@@ -1741,7 +1926,7 @@ static void cops_resp(enum hfp_result result, enum hfp_error cme_err,
DBG(hfp, "");
if (result != HFP_RESULT_OK) {
- DBG(hfp, "hf: COPS? error: %d", result);
+ DBG(hfp, "hf: CLIP error: %d", result);
goto failed;
}
@@ -1757,6 +1942,34 @@ failed:
hfp->callbacks_data);
}
+static void cops_resp(enum hfp_result result, enum hfp_error cme_err,
+ void *user_data)
+{
+ struct hfp_hf *hfp = user_data;
+
+ DBG(hfp, "");
+
+ if (result != HFP_RESULT_OK) {
+ DBG(hfp, "hf: COPS? error: %d", result);
+ goto failed;
+ }
+
+ /* SLC creation done, continue with default setup */
+ if (!hfp_hf_send_command(hfp, clip_resp, hfp,
+ "AT+CLIP=1")) {
+ DBG(hfp, "hf: Could not send AT+CLIP=1");
+ result = HFP_RESULT_ERROR;
+ goto failed;
+ }
+
+ return;
+
+failed:
+ if (hfp->callbacks->session_ready)
+ hfp->callbacks->session_ready(result, cme_err,
+ hfp->callbacks_data);
+}
+
static void cops_conf_resp(enum hfp_result result, enum hfp_error cme_err,
void *user_data)
{
@@ -1807,6 +2020,7 @@ static void slc_cmer_resp(enum hfp_result result, enum hfp_error cme_err,
/* Register unsolicited results handlers */
hfp_hf_register(hfp, ciev_cb, "+CIEV", hfp, NULL);
+ hfp_hf_register(hfp, clip_cb, "+CLIP", hfp, NULL);
hfp_hf_register(hfp, cops_cb, "+COPS", hfp, NULL);
return;
@@ -2135,3 +2349,21 @@ bool hfp_hf_session(struct hfp_hf *hfp)
return hfp_hf_send_command(hfp, slc_brsf_resp, hfp,
"AT+BRSF=%u", HFP_HF_FEATURES);
}
+
+const char *hfp_hf_call_get_number(struct hfp_hf *hfp, uint id)
+{
+ struct hf_call *call;
+
+ DBG(hfp, "");
+
+ if (!hfp)
+ return false;
+
+ call = queue_find(hfp->calls, call_id_match, UINT_TO_PTR(id));
+ if (!call) {
+ DBG(hfp, "hf: no call with id: %u", id);
+ return false;
+ }
+
+ return call->line_id;
+}
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index 27f6d2d7c..fec63c150 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -114,6 +114,16 @@ enum hfp_call_held {
CIND_CALLHELD_HOLD
};
+enum hfp_call_status {
+ CALL_STATUS_ACTIVE = 0,
+ CALL_STATUS_HELD,
+ CALL_STATUS_DIALING,
+ CALL_STATUS_ALERTING,
+ CALL_STATUS_INCOMING,
+ CALL_STATUS_WAITING,
+ CALL_STATUS_RESPONSE_AND_HOLD
+};
+
struct hfp_context;
typedef void (*hfp_result_func_t)(struct hfp_context *context,
@@ -191,6 +201,14 @@ struct hfp_hf_callbacks {
void (*update_indicator)(enum hfp_indicator indicator, uint32_t val,
void *user_data);
void (*update_operator)(const char *operator_name, void *user_data);
+
+ void (*call_added)(uint id, enum hfp_call_status status,
+ void *user_data);
+ void (*call_removed)(uint id, void *user_data);
+ void (*call_status_updated)(uint id, enum hfp_call_status status,
+ void *user_data);
+ void (*call_line_id_updated)(uint id, const char *number, uint type,
+ void *user_data);
};
struct hfp_hf *hfp_hf_new(int fd);
@@ -216,3 +234,5 @@ bool hfp_hf_session_register(struct hfp_hf *hfp,
struct hfp_hf_callbacks *callbacks,
void *callbacks_data);
bool hfp_hf_session(struct hfp_hf *hfp);
+
+const char *hfp_hf_call_get_number(struct hfp_hf *hfp, uint id);
diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index 8ab6c7bf5..f22a687d5 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -730,7 +730,8 @@ static void test_hf_robustness(gconstpointer data)
raw_pdu('\r', '\n', '+', 'C', 'O', 'P', 'S', ':', ' '), \
frg_pdu('0', ',', '0', ',', '\"', 'T', 'E', 'S', 'T'), \
frg_pdu('\"', '\r', '\n'), \
- frg_pdu('\r', '\n', 'O', 'K', '\r', '\n')
+ frg_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \
+ raw_pdu('\r', '\n', 'O', 'K', '\r', '\n')
static void hf_session_ready_cb(enum hfp_result res, enum hfp_error cme_err,
void *user_data)
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH BlueZ v2 4/4] unit/test-hfp: Add Call Line Identification test for HF
2025-09-15 16:34 [PATCH BlueZ v2 1/4] shared/hfp: Add Operator name support Frédéric Danis
2025-09-15 16:34 ` [PATCH BlueZ v2 2/4] unit/test-hfp: Add Operator name test for HF Frédéric Danis
2025-09-15 16:34 ` [PATCH BlueZ v2 3/4] shared/hfp: Add Call Line Identification support Frédéric Danis
@ 2025-09-15 16:34 ` Frédéric Danis
2025-09-15 18:05 ` [BlueZ,v2,1/4] shared/hfp: Add Operator name support bluez.test.bot
2025-09-17 13:30 ` [PATCH BlueZ v2 1/4] " patchwork-bot+bluetooth
4 siblings, 0 replies; 6+ messages in thread
From: Frédéric Danis @ 2025-09-15 16:34 UTC (permalink / raw)
To: linux-bluetooth
This add the following test:
- HFP/HF/CLI/BV-01-C
Verify that the HF receives the caller ID.
---
v1->v2 : Move some changes to patch 3 to fix unit/test-hfp in this patch
unit/test-hfp.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index f22a687d5..060230196 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -813,10 +813,44 @@ static void hf_update_operator(const char *operator_name, void *user_data)
g_assert_cmpstr(operator_name, ==, "TEST");
}
+static void hf_call_added(uint id, enum hfp_call_status status,
+ void *user_data)
+{
+ struct context *context = user_data;
+ const char *test_name = context->data->test_name;
+
+ if (tester_use_debug())
+ tester_debug("call %d added: status %u", id, status);
+
+ if (g_str_equal(test_name, "/HFP/HF/CLI/BV-01-C")) {
+ g_assert_cmpint(id, ==, 1);
+ g_assert_cmpint(status, ==, CALL_STATUS_INCOMING);
+ }
+}
+
+static void hf_call_line_id_updated(uint id, const char *number,
+ unsigned int type,
+ void *user_data)
+{
+ struct context *context = user_data;
+ const char *str;
+
+ if (tester_use_debug())
+ tester_debug("call %d line id updated: %s, %u", id, number,
+ type);
+ g_assert_cmpint(id, ==, 1);
+ g_assert_cmpstr(number, ==, "1234567");
+ g_assert_cmpint(type, ==, 129);
+ str = hfp_hf_call_get_number(context->hfp_hf, id);
+ g_assert_cmpstr(number, ==, str);
+}
+
static struct hfp_hf_callbacks hf_session_callbacks = {
.session_ready = hf_session_ready_cb,
.update_indicator = hf_update_indicator,
.update_operator = hf_update_operator,
+ .call_added = hf_call_added,
+ .call_line_id_updated = hf_call_line_id_updated,
};
static void test_hf_session_done(enum hfp_result res, enum hfp_error cme_err,
@@ -1024,6 +1058,18 @@ int main(int argc, char *argv[])
MINIMAL_SLC_SESSION('0', '0', '0', '0'),
data_end());
+ /* Calling Line Identification - HF */
+ define_hf_test("/HFP/HF/CLI/BV-01-C", test_hf_session,
+ NULL, test_hf_session_done,
+ MINIMAL_SLC_SESSION('1', '0', '0', '0'),
+ frg_pdu('\r', '\n', '+', 'C', 'I', 'E', 'V', ':', ' ',
+ '3', ',', '1', '\r', '\n'),
+ frg_pdu('\r', '\n', 'R', 'I', 'N', 'G', '\r', '\n'),
+ frg_pdu('\r', '\n', '+', 'C', 'L', 'I', 'P', ':',
+ '\"', '1', '2', '3', '4', '5', '6', '7', '\"',
+ ',', '1', '2', '9', ',', ',', '\r', '\n'),
+ data_end());
+
/* Transfer Signal Strength Indication - HF */
define_hf_test("/HFP/HF/PSI/BV-01-C", test_hf_session,
NULL, test_hf_session_done,
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* RE: [BlueZ,v2,1/4] shared/hfp: Add Operator name support
2025-09-15 16:34 [PATCH BlueZ v2 1/4] shared/hfp: Add Operator name support Frédéric Danis
` (2 preceding siblings ...)
2025-09-15 16:34 ` [PATCH BlueZ v2 4/4] unit/test-hfp: Add Call Line Identification test for HF Frédéric Danis
@ 2025-09-15 18:05 ` bluez.test.bot
2025-09-17 13:30 ` [PATCH BlueZ v2 1/4] " patchwork-bot+bluetooth
4 siblings, 0 replies; 6+ messages in thread
From: bluez.test.bot @ 2025-09-15 18:05 UTC (permalink / raw)
To: linux-bluetooth, frederic.danis
[-- Attachment #1: Type: text/plain, Size: 1262 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=1002593
---Test result---
Test Summary:
CheckPatch PENDING 0.32 seconds
GitLint PENDING 0.40 seconds
BuildEll PASS 20.37 seconds
BluezMake PASS 2704.90 seconds
MakeCheck PASS 20.31 seconds
MakeDistcheck PASS 183.99 seconds
CheckValgrind PASS 235.42 seconds
CheckSmatch PASS 306.75 seconds
bluezmakeextell PASS 129.04 seconds
IncrementalBuild PENDING 0.34 seconds
ScanBuild PASS 913.73 seconds
Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:
##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH BlueZ v2 1/4] shared/hfp: Add Operator name support
2025-09-15 16:34 [PATCH BlueZ v2 1/4] shared/hfp: Add Operator name support Frédéric Danis
` (3 preceding siblings ...)
2025-09-15 18:05 ` [BlueZ,v2,1/4] shared/hfp: Add Operator name support bluez.test.bot
@ 2025-09-17 13:30 ` patchwork-bot+bluetooth
4 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+bluetooth @ 2025-09-17 13:30 UTC (permalink / raw)
To: =?utf-8?b?RnLDqWTDqXJpYyBEYW5pcyA8ZnJlZGVyaWMuZGFuaXNAY29sbGFib3JhLmNvbT4=?=
Cc: linux-bluetooth
Hello:
This series was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:
On Mon, 15 Sep 2025 18:34:24 +0200 you wrote:
> Send AT+COPS=3,0 at the end of the SLC creation to set the format of
> the operator selection to long alphanumeric, then query the currently
> selected operator name from the AG.
>
> Register +COPS handler to call the update_operator callback on event.
> ---
> v1->v2 : Move changes from patch 2 to fix unit/test-hfp
>
> [...]
Here is the summary with links:
- [BlueZ,v2,1/4] shared/hfp: Add Operator name support
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=b8d3e4c510b8
- [BlueZ,v2,2/4] unit/test-hfp: Add Operator name test for HF
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=fb32f3a27fbd
- [BlueZ,v2,3/4] shared/hfp: Add Call Line Identification support
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=889139e0a1af
- [BlueZ,v2,4/4] unit/test-hfp: Add Call Line Identification test for HF
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=430b8b1b024b
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 6+ messages in thread