Diff between a0d075072dbc21f005408bbeafc68ba26991e80e and c4aec697076a986d5a6e9e57b4f03572d27c6c2d

Changed Files

File Additions Deletions Status
emulator/btdev.c +1 -1 modified
monitor/bt.h +19 -6 modified
monitor/packet.c +48 -18 modified

Full Patch

diff --git a/emulator/btdev.c b/emulator/btdev.c
index c4b132a..efc9e41 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -4653,7 +4653,7 @@ static int cmd_read_local_codec_caps(struct btdev *dev, const void *data,
 
 	memset(&rsp, 0, sizeof(rsp));
 
-	if (cmd->codec_id > 0x05)
+	if (cmd->codec.id > 0x05)
 		rsp.status = BT_HCI_ERR_INVALID_PARAMETERS;
 
 	cmd_complete(dev, BT_HCI_CMD_READ_LOCAL_CODEC_CAPS, &rsp, sizeof(rsp));
diff --git a/monitor/bt.h b/monitor/bt.h
index 21ee67f..7d865c9 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -1776,8 +1776,9 @@ struct bt_hci_rsp_read_local_pairing_options {
 #define BT_HCI_LOCAL_CODEC_LE_BIS		BIT(3)
 
 struct bt_hci_vnd_codec {
-	uint16_t company;
-	uint16_t id;
+	uint8_t  id;
+	uint16_t cid;
+	uint16_t vid;
 	uint8_t  transport;
 } __attribute__ ((packed));
 
@@ -1795,10 +1796,7 @@ struct bt_hci_rsp_read_local_codecs_v2 {
 #define BT_HCI_CMD_READ_LOCAL_CODEC_CAPS	0x100e
 #define BT_HCI_BIT_READ_LOCAL_CODEC_CAPS	BT_HCI_CMD_BIT(45, 3)
 struct bt_hci_cmd_read_local_codec_caps {
-	uint8_t  codec_id;
-	uint16_t codec_cid;
-	uint16_t codec_vid;
-	uint8_t  transport;
+	struct bt_hci_vnd_codec codec;
 	uint8_t  dir;
 } __attribute__ ((packed));
 
@@ -1813,6 +1811,21 @@ struct bt_hci_rsp_read_local_codec_caps {
 	struct bt_hci_codec_caps caps[0];
 } __attribute__ ((packed));
 
+#define BT_HCI_CMD_READ_LOCAL_CTRL_DELAY	0x100f
+#define BT_HCI_BIT_READ_LOCAL_CTRL_DELAY	BT_HCI_CMD_BIT(45, 4)
+struct bt_hci_cmd_read_local_ctrl_delay {
+	struct bt_hci_vnd_codec codec;
+	uint8_t  dir;
+	uint8_t  codec_cfg_len;
+	uint8_t  codec_cfg[0];
+} __attribute__ ((packed));
+
+struct bt_hci_rsp_read_local_ctrl_delay {
+	uint8_t  status;
+	uint8_t  min_delay[3];
+	uint8_t  max_delay[3];
+} __attribute__ ((packed));
+
 #define BT_HCI_CMD_READ_FAILED_CONTACT_COUNTER	0x1401
 struct bt_hci_cmd_read_failed_contact_counter {
 	uint16_t handle;
diff --git a/monitor/packet.c b/monitor/packet.c
index 22a9797..acec32b 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -5996,26 +5996,31 @@ static void print_path_direction(const char *prefix, uint8_t dir)
 	print_field("%s: %s (0x%2.2x)", prefix, str, dir);
 }
 
-static void read_local_codec_caps_cmd(const void *data, uint8_t size)
+static void print_vnd_codec(const char *label,
+				const struct bt_hci_vnd_codec *codec)
 {
-	const struct bt_hci_cmd_read_local_codec_caps *cmd = data;
 	uint8_t mask;
 
-	print_codec_id("Codec ID", cmd->codec_id);
+	print_codec_id(label, codec->id);
 
-	if (cmd->codec_id == 0xff) {
+	if (codec->id == 0xff) {
 		packet_print_company("Company Codec ID",
-					le16_to_cpu(cmd->codec_cid));
-		print_field("Vendor Codec ID: %d",
-					le16_to_cpu(cmd->codec_vid));
+					le16_to_cpu(codec->cid));
+		print_field("Vendor Codec ID: %d", le16_to_cpu(codec->vid));
 	}
 
-	print_field("Logical Transport Type: 0x%02x", cmd->transport);
-	mask = print_bitfield(2, cmd->transport, codec_transport_table);
+	print_field("Logical Transport Type: 0x%02x", codec->transport);
+	mask = print_bitfield(2, codec->transport, codec_transport_table);
 	if (mask)
 		print_text(COLOR_UNKNOWN_SERVICE_CLASS,
 				"  Unknown transport (0x%2.2x)", mask);
+}
+
+static void read_local_codec_caps_cmd(const void *data, uint8_t size)
+{
+	const struct bt_hci_cmd_read_local_codec_caps *cmd = data;
 
+	print_vnd_codec("Codec", &cmd->codec);
 	print_path_direction("Direction", cmd->dir);
 }
 
@@ -6047,6 +6052,33 @@ static void read_local_codec_caps_rsp(const void *data, uint8_t size)
 	}
 }
 
+static void read_local_ctrl_delay_cmd(const void *data, uint8_t size)
+{
+	const struct bt_hci_cmd_read_local_ctrl_delay *cmd = data;
+
+	print_vnd_codec("Codec", &cmd->codec);
+	print_path_direction("Direction", cmd->dir);
+	print_field("Length Codec Configuration: %u", cmd->codec_cfg_len);
+}
+
+static void print_usec_interval(const char *prefix, const uint8_t interval[3])
+{
+	uint32_t u24 = 0;
+
+	memcpy(&u24, interval, 3);
+	print_field("%s: %u us (0x%6.6x)", prefix, le32_to_cpu(u24),
+						le32_to_cpu(u24));
+}
+
+static void read_local_ctrl_delay_rsp(const void *data, uint8_t size)
+{
+	const struct bt_hci_rsp_read_local_ctrl_delay *rsp = data;
+
+	print_status(rsp->status);
+	print_usec_interval("Minimum Controller delay", rsp->min_delay);
+	print_usec_interval("Maximum Controller delay", rsp->max_delay);
+}
+
 static void read_local_pairing_options_rsp(const void *data, uint8_t size)
 {
 	const struct bt_hci_rsp_read_local_pairing_options *rsp = data;
@@ -7963,15 +7995,6 @@ static void print_cis_params(const void *data, int i)
 							cis->s_rtn);
 }
 
-static void print_usec_interval(const char *prefix, const uint8_t interval[3])
-{
-	uint32_t u24 = 0;
-
-	memcpy(&u24, interval, 3);
-	print_field("%s: %u us (0x%6.6x)", prefix, le32_to_cpu(u24),
-						le32_to_cpu(u24));
-}
-
 static void le_set_cig_params_cmd(const void *data, uint8_t size)
 {
 	const struct bt_hci_cmd_le_set_cig_params *cmd = data;
@@ -8814,6 +8837,13 @@ static const struct opcode_data opcode_table[] = {
 		read_local_codec_caps_rsp,
 		sizeof(struct bt_hci_rsp_read_local_codec_caps), false
 	},
+	{ BT_HCI_CMD_READ_LOCAL_CTRL_DELAY, BT_HCI_BIT_READ_LOCAL_CTRL_DELAY,
+		"Read Local Supported Controller Delay",
+		read_local_ctrl_delay_cmd,
+		sizeof(struct bt_hci_cmd_read_local_ctrl_delay), false,
+		read_local_ctrl_delay_rsp,
+		sizeof(struct bt_hci_rsp_read_local_ctrl_delay), true
+	},
 
 	/* OGF 5 - Status Parameter */
 	{ 0x1401, 122, "Read Failed Contact Counter",