summaryrefslogtreecommitdiff
path: root/monitor
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2021-02-25 15:20:28 -0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2021-03-02 16:22:25 -0800
commit9180ceb0c36a65971596fb3efc70b2e958f2327b (patch)
treec6a178369b25748b427542b4dfeaef80d67a7c9d /monitor
parent1f8bab677d4c464a3a75e4ee4daa3ad1333268bc (diff)
downloadbluez-9180ceb0c36a65971596fb3efc70b2e958f2327b.tar.gz
monitor: Add support for decoding Read Local Supported Codec Capabilities
< HCI Command: Read Local Supported Codec Capabilities (0x04|0x000e) plen 7 Codec ID: mSBC (0x05) Logical Transport Type: 0x02 Codec supported over BR/EDR SCO and eSCO Direction: Input (Host to Controller) (0x00) > HCI Event: Command Complete (0x0e) plen 5 Read Local Supported Codec Capabilities (0x04|0x000e) ncmd 1 Status: Success (0x00) Number of codec capabilities: 0
Diffstat (limited to 'monitor')
-rw-r--r--monitor/bt.h21
-rw-r--r--monitor/packet.c98
2 files changed, 101 insertions, 18 deletions
diff --git a/monitor/bt.h b/monitor/bt.h
index afb0deaf5..21ee67fed 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -1792,6 +1792,27 @@ struct bt_hci_rsp_read_local_codecs_v2 {
struct bt_hci_codec codec[0];
} __attribute__ ((packed));
+#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;
+ uint8_t dir;
+} __attribute__ ((packed));
+
+struct bt_hci_codec_caps {
+ uint8_t len;
+ uint8_t data[0];
+} __attribute__ ((packed));
+
+struct bt_hci_rsp_read_local_codec_caps {
+ uint8_t status;
+ uint8_t num;
+ struct bt_hci_codec_caps caps[0];
+} __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 bacbe2c53..22a97978e 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -5977,6 +5977,76 @@ static void read_local_codecs_rsp_v2(const void *data, uint8_t size)
print_field("Number of vendor codecs: %d", num_vnd_codecs);
}
+static void print_path_direction(const char *prefix, uint8_t dir)
+{
+ const char *str;
+
+ switch (dir) {
+ case 0x00:
+ str = "Input (Host to Controller)";
+ break;
+ case 0x01:
+ str = "Output (Controller to Host)";
+ break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ print_field("%s: %s (0x%2.2x)", prefix, str, dir);
+}
+
+static void read_local_codec_caps_cmd(const void *data, uint8_t size)
+{
+ const struct bt_hci_cmd_read_local_codec_caps *cmd = data;
+ uint8_t mask;
+
+ print_codec_id("Codec ID", cmd->codec_id);
+
+ if (cmd->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));
+ }
+
+ print_field("Logical Transport Type: 0x%02x", cmd->transport);
+ mask = print_bitfield(2, cmd->transport, codec_transport_table);
+ if (mask)
+ print_text(COLOR_UNKNOWN_SERVICE_CLASS,
+ " Unknown transport (0x%2.2x)", mask);
+
+ print_path_direction("Direction", cmd->dir);
+}
+
+static void read_local_codec_caps_rsp(const void *data, uint8_t size)
+{
+ const struct bt_hci_rsp_read_local_codec_caps *rsp = data;
+ uint8_t i;
+
+ print_status(rsp->status);
+ print_field("Number of codec capabilities: %d", rsp->num);
+
+ data += sizeof(rsp);
+ size -= sizeof(rsp);
+
+ for (i = 0; i < rsp->num; i++) {
+ const struct bt_hci_codec_caps *caps = data;
+
+ if (size < sizeof(caps)) {
+ print_field("Invalid capabilities: %u < %zu",
+ size, sizeof(caps));
+ return;
+ }
+
+ print_field(" Capabilities #%u:", i);
+ packet_hexdump(caps->data, caps->len);
+
+ data += caps->len;
+ size -= caps->len;
+ }
+}
+
static void read_local_pairing_options_rsp(const void *data, uint8_t size)
{
const struct bt_hci_rsp_read_local_pairing_options *rsp = data;
@@ -8150,22 +8220,6 @@ static void le_big_term_sync_cmd(const void *data, uint8_t size)
print_field("BIG Handle: 0x%2.2x", cmd->handle);
}
-static void print_iso_dir(const char *prefix, uint8_t dir)
-{
- switch (dir) {
- case 0x00:
- print_field("%s: Input (Host to Controller) (0x%2.2x)",
- prefix, dir);
- return;
- case 0x01:
- print_field("%s: Output (Controller to Host) (0x%2.2x)",
- prefix, dir);
- return;
- default:
- print_field("%s: Unknown (0x%2.2x)", prefix, dir);
- }
-}
-
static void print_iso_path(const char *prefix, uint8_t path)
{
switch (path) {
@@ -8185,7 +8239,7 @@ static void le_setup_iso_path_cmd(const void *data, uint8_t size)
const struct bt_hci_cmd_le_setup_iso_path *cmd = data;
print_field("Handle: %d", le16_to_cpu(cmd->handle));
- print_iso_dir("Data Path Direction", cmd->direction);
+ print_path_direction("Data Path Direction", cmd->direction);
print_iso_path("Data Path", cmd->path);
print_codec_id("Coding Format", cmd->codec);
packet_print_company("Company Codec ID", le16_to_cpu(cmd->codec_cid));
@@ -8213,7 +8267,7 @@ static void le_remove_iso_path_cmd(const void *data, uint8_t size)
const struct bt_hci_cmd_le_remove_iso_path *cmd = data;
print_field("Connection Handle: %d", le16_to_cpu(cmd->handle));
- print_iso_dir("Data Path Direction", cmd->direction);
+ print_path_direction("Data Path Direction", cmd->direction);
}
static void le_req_peer_sca_cmd(const void *data, uint8_t size)
@@ -8753,6 +8807,14 @@ static const struct opcode_data opcode_table[] = {
read_local_codecs_rsp_v2,
sizeof(struct bt_hci_rsp_read_local_codecs_v2), false
},
+ { BT_HCI_CMD_READ_LOCAL_CODEC_CAPS, BT_HCI_BIT_READ_LOCAL_CODEC_CAPS,
+ "Read Local Supported Codec Capabilities",
+ read_local_codec_caps_cmd,
+ sizeof(struct bt_hci_cmd_read_local_codec_caps), true,
+ read_local_codec_caps_rsp,
+ sizeof(struct bt_hci_rsp_read_local_codec_caps), false
+ },
+
/* OGF 5 - Status Parameter */
{ 0x1401, 122, "Read Failed Contact Counter",
read_failed_contact_counter_cmd, 2, true,