summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--emulator/btdev.c2
-rw-r--r--monitor/bt.h25
-rw-r--r--monitor/packet.c66
3 files changed, 68 insertions, 25 deletions
diff --git a/emulator/btdev.c b/emulator/btdev.c
index c4b132a1b..efc9e411b 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 21ee67fed..7d865c9ae 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 22a97978e..acec32b72 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",