* [PATCH BlueZ 1/6] btdev: Add support for Sync Flow Control
@ 2025-03-06 19:23 Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 2/6] btdev: send SCO setup events to bthost Pauli Virtanen
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Pauli Virtanen @ 2025-03-06 19:23 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Pauli Virtanen
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds support for Sync Flow Control by supporting command
Write Sync Flow Control Enable:
< HCI Command: Write Sync Fl.. (0x03|0x002f) plen 1
Flow control: Enabled (0x01)
> HCI Event: Command Complete (0x0e) plen 4
Write Sync Flow Control Enable (0x03|0x002f) ncmd 1
Status: Success (0x00)
To act according to the spec this enabled SCO data packets to be
properly processed and generate Number of Completed Packets event:
sco-tester[40]: < SCO Data TX:.. flags 0x00 dlen 9
> HCI Event: Number of Completed P.. (0x13) plen 5
Num handles: 1
Handle: 42 Address: 00:AA:01:01:00:00 (Intel Corporation)
---
emulator/btdev.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/emulator/btdev.c b/emulator/btdev.c
index ec52c5242..51cb60a41 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -203,6 +203,7 @@ struct btdev {
uint8_t ssp_debug_mode;
uint8_t secure_conn_support;
uint8_t host_flow_control;
+ uint8_t sco_flowctl;
uint8_t le_supported;
uint8_t le_simultaneous;
uint8_t le_event_mask[8];
@@ -2398,6 +2399,20 @@ static int cmd_read_tx_power_level(struct btdev *dev, const void *data,
return 0;
}
+static int cmd_write_sync_flowctl(struct btdev *dev, const void *data,
+ uint8_t len)
+{
+ const struct bt_hci_cmd_write_sync_flow_control *cmd = data;
+ uint8_t status = BT_HCI_ERR_SUCCESS;
+
+ dev->sco_flowctl = cmd->enable;
+
+ cmd_complete(dev, BT_HCI_CMD_WRITE_SYNC_FLOW_CONTROL, &status,
+ sizeof(status));
+
+ return 0;
+}
+
static int cmd_read_num_iac(struct btdev *dev, const void *data, uint8_t len)
{
struct bt_hci_rsp_read_num_supported_iac rsp;
@@ -2676,6 +2691,7 @@ static int cmd_enable_dut_mode(struct btdev *dev, const void *data,
CMD(BT_HCI_CMD_READ_VOICE_SETTING, cmd_read_voice, NULL), \
CMD(BT_HCI_CMD_WRITE_VOICE_SETTING, cmd_write_voice, NULL), \
CMD(BT_HCI_CMD_READ_TX_POWER, cmd_read_tx_power_level, NULL), \
+ CMD(BT_HCI_CMD_WRITE_SYNC_FLOW_CONTROL, cmd_write_sync_flowctl, NULL), \
CMD(BT_HCI_CMD_READ_NUM_SUPPORTED_IAC, cmd_read_num_iac, NULL), \
CMD(BT_HCI_CMD_READ_CURRENT_IAC_LAP, cmd_read_current_iac_lap, \
NULL), \
@@ -2739,6 +2755,7 @@ static void set_common_commands_bredr20(struct btdev *btdev)
btdev->commands[9] |= 0x04; /* Read Voice Setting */
btdev->commands[9] |= 0x08; /* Write Voice Setting */
btdev->commands[10] |= 0x04; /* Read TX Power Level */
+ btdev->commands[10] |= BIT(4); /* Write Sync Flow Control */
btdev->commands[11] |= 0x04; /* Read Number of Supported IAC */
btdev->commands[11] |= 0x08; /* Read Current IAC LAP */
btdev->commands[11] |= 0x10; /* Write Current IAC LAP */
@@ -7655,6 +7672,31 @@ static void send_acl(struct btdev *dev, const void *data, uint16_t len)
send_packet(conn->link->dev, iov, 3);
}
+static void send_sco(struct btdev *dev, const void *data, uint16_t len)
+{
+ struct bt_hci_acl_hdr *hdr;
+ struct iovec iov[2];
+ struct btdev_conn *conn;
+ uint8_t pkt_type = BT_H4_SCO_PKT;
+
+ /* Packet type */
+ iov[0].iov_base = &pkt_type;
+ iov[0].iov_len = sizeof(pkt_type);
+
+ iov[1].iov_base = hdr = (void *) (data);
+ iov[1].iov_len = len;
+
+ conn = queue_find(dev->conns, match_handle,
+ UINT_TO_PTR(acl_handle(hdr->handle)));
+ if (!conn)
+ return;
+
+ if (dev->sco_flowctl)
+ num_completed_packets(dev, conn->handle);
+
+ send_packet(conn->link->dev, iov, 2);
+}
+
static void send_iso(struct btdev *dev, const void *data, uint16_t len)
{
struct bt_hci_acl_hdr *hdr;
@@ -7702,6 +7744,9 @@ void btdev_receive_h4(struct btdev *btdev, const void *data, uint16_t len)
case BT_H4_ACL_PKT:
send_acl(btdev, data + 1, len - 1);
break;
+ case BT_H4_SCO_PKT:
+ send_sco(btdev, data + 1, len - 1);
+ break;
case BT_H4_ISO_PKT:
send_iso(btdev, data + 1, len - 1);
break;
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH BlueZ 2/6] btdev: send SCO setup events to bthost
2025-03-06 19:23 [PATCH BlueZ 1/6] btdev: Add support for Sync Flow Control Pauli Virtanen
@ 2025-03-06 19:23 ` Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 3/6] bthost: add hooks receiving SCO connections and data Pauli Virtanen
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Pauli Virtanen @ 2025-03-06 19:23 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Pauli Virtanen
Send required SCO setup events to bthost conns, so data can be passed to
the linked connection.
---
emulator/btdev.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/emulator/btdev.c b/emulator/btdev.c
index 51cb60a41..3542fdad5 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -1415,6 +1415,10 @@ done:
send_event(dev, BT_HCI_EVT_CONN_COMPLETE, &cc, sizeof(cc));
+ if (conn)
+ send_event(conn->link->dev, BT_HCI_EVT_CONN_COMPLETE,
+ &cc, sizeof(cc));
+
return 0;
}
@@ -2824,6 +2828,10 @@ static int cmd_enhanced_setup_sync_conn_complete(struct btdev *dev,
done:
send_event(dev, BT_HCI_EVT_SYNC_CONN_COMPLETE, &cc, sizeof(cc));
+ if (conn)
+ send_event(conn->link->dev, BT_HCI_EVT_SYNC_CONN_COMPLETE,
+ &cc, sizeof(cc));
+
return 0;
}
@@ -2870,6 +2878,10 @@ static int cmd_setup_sync_conn_complete(struct btdev *dev, const void *data,
done:
send_event(dev, BT_HCI_EVT_SYNC_CONN_COMPLETE, &cc, sizeof(cc));
+ if (conn)
+ send_event(conn->link->dev, BT_HCI_EVT_SYNC_CONN_COMPLETE,
+ &cc, sizeof(cc));
+
return 0;
}
@@ -7674,7 +7686,7 @@ static void send_acl(struct btdev *dev, const void *data, uint16_t len)
static void send_sco(struct btdev *dev, const void *data, uint16_t len)
{
- struct bt_hci_acl_hdr *hdr;
+ struct bt_hci_sco_hdr *hdr;
struct iovec iov[2];
struct btdev_conn *conn;
uint8_t pkt_type = BT_H4_SCO_PKT;
@@ -7694,7 +7706,8 @@ static void send_sco(struct btdev *dev, const void *data, uint16_t len)
if (dev->sco_flowctl)
num_completed_packets(dev, conn->handle);
- send_packet(conn->link->dev, iov, 2);
+ if (conn->link)
+ send_packet(conn->link->dev, iov, 2);
}
static void send_iso(struct btdev *dev, const void *data, uint16_t len)
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH BlueZ 3/6] bthost: add hooks receiving SCO connections and data
2025-03-06 19:23 [PATCH BlueZ 1/6] btdev: Add support for Sync Flow Control Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 2/6] btdev: send SCO setup events to bthost Pauli Virtanen
@ 2025-03-06 19:23 ` Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 4/6] sco-tester: check sent SCO data is received at bthost Pauli Virtanen
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Pauli Virtanen @ 2025-03-06 19:23 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Pauli Virtanen
Add hooks for new SCO connections and receiving SCO data. SCO
connection accept/reject flow remains unimplemented.
---
emulator/bthost.c | 130 +++++++++++++++++++++++++++++++++++++++++++++-
emulator/bthost.h | 10 ++++
monitor/bt.h | 1 +
3 files changed, 139 insertions(+), 2 deletions(-)
diff --git a/emulator/bthost.c b/emulator/bthost.c
index a76b02ecc..5db750aae 100644
--- a/emulator/bthost.c
+++ b/emulator/bthost.c
@@ -39,6 +39,8 @@
#define acl_handle(h) (h & 0x0fff)
#define acl_flags(h) (h >> 12)
+#define sco_flags_status(f) (f & 0x03)
+
#define iso_flags_pb(f) (f & 0x0003)
#define iso_flags_ts(f) ((f >> 2) & 0x0001)
#define iso_flags_pack(pb, ts) (((pb) & 0x03) | (((ts) & 0x01) << 2))
@@ -138,8 +140,14 @@ struct rfcomm_chan_hook {
struct rfcomm_chan_hook *next;
};
+struct sco_hook {
+ bthost_sco_hook_func_t func;
+ void *user_data;
+ bthost_destroy_func_t destroy;
+};
+
struct iso_hook {
- bthost_cid_hook_func_t func;
+ bthost_iso_hook_func_t func;
void *user_data;
bthost_destroy_func_t destroy;
};
@@ -155,6 +163,7 @@ struct btconn {
struct rcconn *rcconns;
struct cid_hook *cid_hooks;
struct rfcomm_chan_hook *rfcomm_chan_hooks;
+ struct sco_hook *sco_hook;
struct iso_hook *iso_hook;
struct btconn *next;
void *smp_data;
@@ -241,6 +250,8 @@ struct bthost {
void *cmd_complete_data;
bthost_new_conn_cb new_conn_cb;
void *new_conn_data;
+ bthost_new_conn_cb new_sco_cb;
+ void *new_sco_data;
bthost_accept_conn_cb accept_iso_cb;
bthost_new_conn_cb new_iso_cb;
void *new_iso_data;
@@ -326,9 +337,13 @@ static void btconn_free(struct btconn *conn)
free(hook);
}
+ if (conn->sco_hook && conn->sco_hook->destroy)
+ conn->sco_hook->destroy(conn->sco_hook->user_data);
+
if (conn->iso_hook && conn->iso_hook->destroy)
conn->iso_hook->destroy(conn->iso_hook->user_data);
+ free(conn->sco_hook);
free(conn->iso_hook);
free(conn->recv_data);
free(conn);
@@ -722,6 +737,30 @@ void bthost_add_cid_hook(struct bthost *bthost, uint16_t handle, uint16_t cid,
conn->cid_hooks = hook;
}
+void bthost_add_sco_hook(struct bthost *bthost, uint16_t handle,
+ bthost_sco_hook_func_t func, void *user_data,
+ bthost_destroy_func_t destroy)
+{
+ struct sco_hook *hook;
+ struct btconn *conn;
+
+ conn = bthost_find_conn(bthost, handle);
+ if (!conn || conn->sco_hook)
+ return;
+
+ hook = malloc(sizeof(*hook));
+ if (!hook)
+ return;
+
+ memset(hook, 0, sizeof(*hook));
+
+ hook->func = func;
+ hook->user_data = user_data;
+ hook->destroy = destroy;
+
+ conn->sco_hook = hook;
+}
+
void bthost_add_iso_hook(struct bthost *bthost, uint16_t handle,
bthost_iso_hook_func_t func, void *user_data,
bthost_destroy_func_t destroy)
@@ -1184,6 +1223,29 @@ static void init_conn(struct bthost *bthost, uint16_t handle,
}
}
+static void init_sco(struct bthost *bthost, uint16_t handle,
+ const uint8_t *bdaddr, uint8_t addr_type)
+{
+ struct btconn *conn;
+
+ bthost_debug(bthost, "SCO handle 0x%4.4x", handle);
+
+ conn = malloc(sizeof(*conn));
+ if (!conn)
+ return;
+
+ memset(conn, 0, sizeof(*conn));
+ conn->handle = handle;
+ memcpy(conn->bdaddr, bdaddr, 6);
+ conn->addr_type = addr_type;
+
+ conn->next = bthost->conns;
+ bthost->conns = conn;
+
+ if (bthost->new_sco_cb)
+ bthost->new_sco_cb(handle, bthost->new_sco_data);
+}
+
static void evt_conn_complete(struct bthost *bthost, const void *data,
uint8_t len)
{
@@ -1195,7 +1257,13 @@ static void evt_conn_complete(struct bthost *bthost, const void *data,
if (ev->status)
return;
- init_conn(bthost, le16_to_cpu(ev->handle), ev->bdaddr, BDADDR_BREDR);
+ if (ev->link_type == 0x00) {
+ init_sco(bthost, le16_to_cpu(ev->handle), ev->bdaddr,
+ BDADDR_BREDR);
+ } else if (ev->link_type == 0x01) {
+ init_conn(bthost, le16_to_cpu(ev->handle), ev->bdaddr,
+ BDADDR_BREDR);
+ }
}
static void evt_disconn_complete(struct bthost *bthost, const void *data,
@@ -1397,6 +1465,20 @@ static void evt_simple_pairing_complete(struct bthost *bthost, const void *data,
return;
}
+static void evt_sync_conn_complete(struct bthost *bthost, const void *data,
+ uint8_t len)
+{
+ const struct bt_hci_evt_sync_conn_complete *ev = data;
+
+ if (len < sizeof(*ev))
+ return;
+
+ if (ev->status)
+ return;
+
+ init_sco(bthost, le16_to_cpu(ev->handle), ev->bdaddr, BDADDR_BREDR);
+}
+
static void evt_le_conn_complete(struct bthost *bthost, const void *data,
uint8_t len)
{
@@ -1705,6 +1787,10 @@ static void process_evt(struct bthost *bthost, const void *data, uint16_t len)
evt_disconn_complete(bthost, param, hdr->plen);
break;
+ case BT_HCI_EVT_SYNC_CONN_COMPLETE:
+ evt_sync_conn_complete(bthost, param, hdr->plen);
+ break;
+
case BT_HCI_EVT_NUM_COMPLETED_PACKETS:
evt_num_completed_packets(bthost, param, hdr->plen);
break;
@@ -2947,6 +3033,36 @@ static void process_acl(struct bthost *bthost, const void *data, uint16_t len)
}
}
+static void process_sco(struct bthost *bthost, const void *data, uint16_t len)
+{
+ const struct bt_hci_sco_hdr *sco_hdr = data;
+ uint16_t handle, sco_len;
+ uint8_t status;
+ struct btconn *conn;
+ struct sco_hook *hook;
+
+ sco_len = le16_to_cpu(sco_hdr->dlen);
+ if (len != sizeof(*sco_hdr) + sco_len)
+ return;
+
+ handle = acl_handle(sco_hdr->handle);
+ status = sco_flags_status(acl_flags(sco_hdr->handle));
+
+ conn = bthost_find_conn(bthost, handle);
+ if (!conn) {
+ bthost_debug(bthost, "Unknown handle: 0x%4.4x", handle);
+ return;
+ }
+
+ bthost_debug(bthost, "SCO data: %u bytes", sco_len);
+
+ hook = conn->sco_hook;
+ if (!hook)
+ return;
+
+ hook->func(sco_hdr->data, sco_len, status, hook->user_data);
+}
+
static void process_iso_data(struct bthost *bthost, struct btconn *conn,
const void *data, uint16_t len)
{
@@ -3062,6 +3178,9 @@ void bthost_receive_h4(struct bthost *bthost, const void *data, uint16_t len)
case BT_H4_ACL_PKT:
process_acl(bthost, data + 1, len - 1);
break;
+ case BT_H4_SCO_PKT:
+ process_sco(bthost, data + 1, len - 1);
+ break;
case BT_H4_ISO_PKT:
process_iso(bthost, data + 1, len - 1);
break;
@@ -3085,6 +3204,13 @@ void bthost_set_connect_cb(struct bthost *bthost, bthost_new_conn_cb cb,
bthost->new_conn_data = user_data;
}
+void bthost_set_sco_cb(struct bthost *bthost, bthost_new_conn_cb cb,
+ void *user_data)
+{
+ bthost->new_sco_cb = cb;
+ bthost->new_sco_data = user_data;
+}
+
void bthost_set_iso_cb(struct bthost *bthost, bthost_accept_conn_cb accept,
bthost_new_conn_cb cb, void *user_data)
{
diff --git a/emulator/bthost.h b/emulator/bthost.h
index 2c5b0d516..405d66bf0 100644
--- a/emulator/bthost.h
+++ b/emulator/bthost.h
@@ -51,6 +51,9 @@ typedef void (*bthost_new_conn_cb) (uint16_t handle, void *user_data);
void bthost_set_connect_cb(struct bthost *bthost, bthost_new_conn_cb cb,
void *user_data);
+void bthost_set_sco_cb(struct bthost *bthost, bthost_new_conn_cb cb,
+ void *user_data);
+
void bthost_set_iso_cb(struct bthost *bthost, bthost_accept_conn_cb accept,
bthost_new_conn_cb cb, void *user_data);
@@ -69,6 +72,13 @@ typedef void (*bthost_cid_hook_func_t)(const void *data, uint16_t len,
void bthost_add_cid_hook(struct bthost *bthost, uint16_t handle, uint16_t cid,
bthost_cid_hook_func_t func, void *user_data);
+typedef void (*bthost_sco_hook_func_t)(const void *data, uint16_t len,
+ uint8_t status, void *user_data);
+
+void bthost_add_sco_hook(struct bthost *bthost, uint16_t handle,
+ bthost_sco_hook_func_t func, void *user_data,
+ bthost_destroy_func_t destroy);
+
typedef void (*bthost_iso_hook_func_t)(const void *data, uint16_t len,
void *user_data);
diff --git a/monitor/bt.h b/monitor/bt.h
index 6fb81abfe..e708e580f 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -523,6 +523,7 @@ struct bt_hci_acl_hdr {
struct bt_hci_sco_hdr {
uint16_t handle;
uint8_t dlen;
+ uint8_t data[];
} __attribute__ ((packed));
struct bt_hci_iso_hdr {
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH BlueZ 4/6] sco-tester: check sent SCO data is received at bthost
2025-03-06 19:23 [PATCH BlueZ 1/6] btdev: Add support for Sync Flow Control Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 2/6] btdev: send SCO setup events to bthost Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 3/6] bthost: add hooks receiving SCO connections and data Pauli Virtanen
@ 2025-03-06 19:23 ` Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 5/6] btdev: support disabling commands Pauli Virtanen
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Pauli Virtanen @ 2025-03-06 19:23 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Pauli Virtanen
When sending data, also check that the data is received by bthost.
---
tools/sco-tester.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 45 insertions(+), 2 deletions(-)
diff --git a/tools/sco-tester.c b/tools/sco-tester.c
index 7f37ca5cf..9886481ff 100644
--- a/tools/sco-tester.c
+++ b/tools/sco-tester.c
@@ -318,10 +318,51 @@ static void client_connectable_complete(uint16_t opcode, uint8_t status,
tester_setup_complete();
}
+static void bthost_recv_data(const void *buf, uint16_t len, uint8_t status,
+ void *user_data)
+{
+ struct test_data *data = user_data;
+ const struct sco_client_data *scodata = data->test_data;
+
+ --data->step;
+
+ tester_print("Client received %u bytes of data", len);
+
+ if (scodata->send_data && (scodata->data_len != len ||
+ memcmp(scodata->send_data, buf, len)))
+ tester_test_failed();
+ else if (!data->step)
+ tester_test_passed();
+}
+
+static void bthost_sco_disconnected(void *user_data)
+{
+ struct test_data *data = user_data;
+
+ tester_print("SCO handle 0x%04x disconnected", data->handle);
+
+ data->handle = 0x0000;
+}
+
+static void sco_new_conn(uint16_t handle, void *user_data)
+{
+ struct test_data *data = user_data;
+ struct bthost *host;
+
+ tester_print("New client connection with handle 0x%04x", handle);
+
+ data->handle = handle;
+
+ host = hciemu_client_get_host(data->hciemu);
+ bthost_add_sco_hook(host, data->handle, bthost_recv_data, data,
+ bthost_sco_disconnected);
+}
+
static void setup_powered_callback(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
struct test_data *data = tester_get_data();
+ const struct sco_client_data *scodata = data->test_data;
struct bthost *bthost;
if (status != MGMT_STATUS_SUCCESS) {
@@ -334,6 +375,9 @@ static void setup_powered_callback(uint8_t status, uint16_t length,
bthost = hciemu_client_get_host(data->hciemu);
bthost_set_cmd_complete_cb(bthost, client_connectable_complete, data);
bthost_write_scan_enable(bthost, 0x03);
+
+ if (scodata && scodata->send_data)
+ bthost_set_sco_cb(bthost, sco_new_conn, data);
}
static void setup_powered(const void *test_data)
@@ -740,8 +784,6 @@ static gboolean sco_connect_cb(GIOChannel *io, GIOCondition cond,
ssize_t ret = 0;
unsigned int count;
- data->step = 0;
-
sco_tx_timestamping(data, io);
tester_print("Writing %u*%u bytes of data",
@@ -751,6 +793,7 @@ static gboolean sco_connect_cb(GIOChannel *io, GIOCondition cond,
ret = write(sk, scodata->send_data, scodata->data_len);
if (scodata->data_len != ret)
break;
+ data->step++;
}
if (scodata->data_len != ret) {
tester_warn("Failed to write %u bytes: %zu %s (%d)",
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH BlueZ 5/6] btdev: support disabling commands
2025-03-06 19:23 [PATCH BlueZ 1/6] btdev: Add support for Sync Flow Control Pauli Virtanen
` (2 preceding siblings ...)
2025-03-06 19:23 ` [PATCH BlueZ 4/6] sco-tester: check sent SCO data is received at bthost Pauli Virtanen
@ 2025-03-06 19:23 ` Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 6/6] sco-tester: add tests for different SCO flow control modes Pauli Virtanen
2025-03-06 19:37 ` [BlueZ,1/6] btdev: Add support for Sync Flow Control bluez.test.bot
5 siblings, 0 replies; 7+ messages in thread
From: Pauli Virtanen @ 2025-03-06 19:23 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Pauli Virtanen
Add function to return command mask, so that it is possible to disable
some in tests if needed.
---
emulator/btdev.c | 5 +++++
emulator/btdev.h | 2 ++
emulator/hciemu.c | 14 ++++++++++++++
emulator/hciemu.h | 1 +
4 files changed, 22 insertions(+)
diff --git a/emulator/btdev.c b/emulator/btdev.c
index 3542fdad5..599df3430 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -7406,6 +7406,11 @@ uint8_t *btdev_get_features(struct btdev *btdev)
return btdev->features;
}
+uint8_t *btdev_get_commands(struct btdev *btdev)
+{
+ return btdev->commands;
+}
+
uint8_t btdev_get_scan_enable(struct btdev *btdev)
{
return btdev->scan_enable;
diff --git a/emulator/btdev.h b/emulator/btdev.h
index cad5f699f..a96c1a325 100644
--- a/emulator/btdev.h
+++ b/emulator/btdev.h
@@ -76,6 +76,8 @@ bool btdev_set_bdaddr(struct btdev *btdev, const uint8_t *bdaddr);
uint8_t *btdev_get_features(struct btdev *btdev);
+uint8_t *btdev_get_commands(struct btdev *btdev);
+
uint8_t btdev_get_scan_enable(struct btdev *btdev);
uint8_t btdev_get_le_scan_enable(struct btdev *btdev);
diff --git a/emulator/hciemu.c b/emulator/hciemu.c
index f13b4bda1..ccc57aada 100644
--- a/emulator/hciemu.c
+++ b/emulator/hciemu.c
@@ -528,6 +528,20 @@ uint8_t *hciemu_get_features(struct hciemu *hciemu)
return btdev_get_features(dev);
}
+uint8_t *hciemu_get_commands(struct hciemu *hciemu)
+{
+ struct btdev *dev;
+
+ if (!hciemu || !hciemu->vhci)
+ return NULL;
+
+ dev = vhci_get_btdev(hciemu->vhci);
+ if (!dev)
+ return NULL;
+
+ return btdev_get_commands(dev);
+}
+
const uint8_t *hciemu_get_central_bdaddr(struct hciemu *hciemu)
{
struct btdev *dev;
diff --git a/emulator/hciemu.h b/emulator/hciemu.h
index dba920fdd..9fbe34316 100644
--- a/emulator/hciemu.h
+++ b/emulator/hciemu.h
@@ -55,6 +55,7 @@ void hciemu_flush_client_events(struct hciemu *hciemu);
const char *hciemu_get_address(struct hciemu *hciemu);
uint8_t *hciemu_get_features(struct hciemu *hciemu);
+uint8_t *hciemu_get_commands(struct hciemu *hciemu);
const uint8_t *hciemu_get_central_bdaddr(struct hciemu *hciemu);
const uint8_t *hciemu_get_client_bdaddr(struct hciemu *hciemu);
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH BlueZ 6/6] sco-tester: add tests for different SCO flow control modes
2025-03-06 19:23 [PATCH BlueZ 1/6] btdev: Add support for Sync Flow Control Pauli Virtanen
` (3 preceding siblings ...)
2025-03-06 19:23 ` [PATCH BlueZ 5/6] btdev: support disabling commands Pauli Virtanen
@ 2025-03-06 19:23 ` Pauli Virtanen
2025-03-06 19:37 ` [BlueZ,1/6] btdev: Add support for Sync Flow Control bluez.test.bot
5 siblings, 0 replies; 7+ messages in thread
From: Pauli Virtanen @ 2025-03-06 19:23 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Pauli Virtanen
Change "SCO CVSD Send - Success" to send multiple packets.
Add tests
SCO CVSD Send No Flowctl - Success
SCO CVSD 1.1 Send - Success
SCO CVSD 1.1 Send No Flowctl - Success
---
tools/sco-tester.c | 39 ++++++++++++++++++++++++++++++++++-----
1 file changed, 34 insertions(+), 5 deletions(-)
diff --git a/tools/sco-tester.c b/tools/sco-tester.c
index 9886481ff..e6888348b 100644
--- a/tools/sco-tester.c
+++ b/tools/sco-tester.c
@@ -44,6 +44,7 @@ struct test_data {
int sk;
bool disable_esco;
bool enable_codecs;
+ bool disable_sco_flowctl;
int step;
uint16_t handle;
struct tx_tstamp_data tx_ts;
@@ -196,6 +197,16 @@ static void read_index_list_callback(uint8_t status, uint16_t length,
if (features)
features[3] &= ~0x80;
}
+
+ if (data->disable_sco_flowctl) {
+ uint8_t *commands;
+
+ tester_print("Disabling SCO flow control");
+
+ commands = hciemu_get_commands(data->hciemu);
+ if (commands)
+ commands[10] &= ~(BIT(3) | BIT(4));
+ }
}
static void test_pre_setup(const void *test_data)
@@ -240,7 +251,8 @@ static void test_data_free(void *test_data)
free(data);
}
-#define test_sco_full(name, data, setup, func, _disable_esco, _enable_codecs) \
+#define test_sco_full(name, data, setup, func, _disable_esco, _enable_codecs, \
+ _disable_sco_flowctl) \
do { \
struct test_data *user; \
user = malloc(sizeof(struct test_data)); \
@@ -254,19 +266,26 @@ static void test_data_free(void *test_data)
user->step = 0; \
user->disable_esco = _disable_esco; \
user->enable_codecs = _enable_codecs; \
+ user->disable_sco_flowctl = _disable_sco_flowctl; \
tester_add_full(name, data, \
test_pre_setup, setup, func, NULL, \
test_post_teardown, 2, user, test_data_free); \
} while (0)
#define test_sco(name, data, setup, func) \
- test_sco_full(name, data, setup, func, false, false)
+ test_sco_full(name, data, setup, func, false, false, false)
+
+#define test_sco_no_flowctl(name, data, setup, func) \
+ test_sco_full(name, data, setup, func, false, false, true)
#define test_sco_11(name, data, setup, func) \
- test_sco_full(name, data, setup, func, true, false)
+ test_sco_full(name, data, setup, func, true, false, false)
+
+#define test_sco_11_no_flowctl(name, data, setup, func) \
+ test_sco_full(name, data, setup, func, true, false, true)
#define test_offload_sco(name, data, setup, func) \
- test_sco_full(name, data, setup, func, false, true)
+ test_sco_full(name, data, setup, func, false, true, false)
static const struct sco_client_data connect_success = {
.expect_err = 0
@@ -290,7 +309,8 @@ const uint8_t data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
static const struct sco_client_data connect_send_success = {
.expect_err = 0,
.data_len = sizeof(data),
- .send_data = data
+ .send_data = data,
+ .repeat_send = 3
};
static const struct sco_client_data connect_send_tx_timestamping = {
@@ -1112,10 +1132,19 @@ int main(int argc, char *argv[])
test_sco("SCO CVSD Send - Success", &connect_send_success,
setup_powered, test_connect);
+ test_sco_no_flowctl("SCO CVSD Send No Flowctl - Success",
+ &connect_send_success, setup_powered, test_connect);
+
test_sco("SCO CVSD Send - TX Timestamping",
&connect_send_tx_timestamping,
setup_powered, test_connect);
+ test_sco_11("SCO CVSD 1.1 Send - Success", &connect_send_success,
+ setup_powered, test_connect);
+
+ test_sco_11_no_flowctl("SCO CVSD 1.1 Send No Flowctl - Success",
+ &connect_send_success, setup_powered, test_connect);
+
test_offload_sco("Basic SCO Get Socket Option - Offload - Success",
NULL, setup_powered, test_codecs_getsockopt);
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* RE: [BlueZ,1/6] btdev: Add support for Sync Flow Control
2025-03-06 19:23 [PATCH BlueZ 1/6] btdev: Add support for Sync Flow Control Pauli Virtanen
` (4 preceding siblings ...)
2025-03-06 19:23 ` [PATCH BlueZ 6/6] sco-tester: add tests for different SCO flow control modes Pauli Virtanen
@ 2025-03-06 19:37 ` bluez.test.bot
5 siblings, 0 replies; 7+ messages in thread
From: bluez.test.bot @ 2025-03-06 19:37 UTC (permalink / raw)
To: linux-bluetooth, pav
[-- Attachment #1: Type: text/plain, Size: 535 bytes --]
This is an automated email and please do not reply to this email.
Dear Submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
While preparing the CI tests, the patches you submitted couldn't be applied to the current HEAD of the repository.
----- Output -----
error: patch failed: emulator/btdev.c:1415
error: emulator/btdev.c: patch does not apply
hint: Use 'git am --show-current-patch' to see the failed patch
Please resolve the issue and submit the patches again.
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-03-06 19:37 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-06 19:23 [PATCH BlueZ 1/6] btdev: Add support for Sync Flow Control Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 2/6] btdev: send SCO setup events to bthost Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 3/6] bthost: add hooks receiving SCO connections and data Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 4/6] sco-tester: check sent SCO data is received at bthost Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 5/6] btdev: support disabling commands Pauli Virtanen
2025-03-06 19:23 ` [PATCH BlueZ 6/6] sco-tester: add tests for different SCO flow control modes Pauli Virtanen
2025-03-06 19:37 ` [BlueZ,1/6] btdev: Add support for Sync Flow Control bluez.test.bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox