summaryrefslogtreecommitdiff
path: root/monitor
diff options
context:
space:
mode:
authorSathish Narasimman <sathish.narasimman@intel.com>2022-11-22 15:42:31 +0530
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-12-20 15:36:18 -0800
commit90a662392c6e9dfc25308b883d47ff1e8578646b (patch)
tree5bc2f33eb9f946906f0e9cfcd61a6f352648505f /monitor
parentb709058c60081de91927b04c6603f223a4119265 (diff)
downloadbluez-90a662392c6e9dfc25308b883d47ff1e8578646b.tar.gz
monitor/att: Add decoding support for CSIP
This adds decoding support for CSIS attributes: > ACL Data RX: Handle 3585 flags 0x02 dlen 7 ATT: Read Request (0x0a) len 2 Handle: 0x0017 Type: Set Identity Resolving Key (0x2b84) < ACL Data TX: Handle 3585 flags 0x00 dlen 22 ATT: Read Response (0x0b) len 17 Value: 01761fae703ed681f0c50b34155b6434fb Handle: 0x0017 Type: Set Identity Resolving Key (0x2b84) SIRK: 01761fae703ed681f0c50b34155b6434fb > ACL Data RX: Handle 3585 flags 0x02 dlen 7 ATT: Read Request (0x0a) len 2 Handle: 0x001b Type: Set Member Lock (0x2b86) < ACL Data TX: Handle 3585 flags 0x00 dlen 6 ATT: Read Response (0x0b) len 1 Value: 01 Handle: 0x001b Type: Set Member Lock (0x2b86) Locked (0x01) > ACL Data RX: Handle 3585 flags 0x02 dlen 7 ATT: Read Request (0x0a) len 2 Handle: 0x001e Type: Set Member Rank (0x2b87) < ACL Data TX: Handle 3585 flags 0x00 dlen 6 ATT: Read Response (0x0b) len 1 Value: 01 Handle: 0x001e Type: Set Member Rank (0x2b87) Rank: 0x01
Diffstat (limited to 'monitor')
-rw-r--r--monitor/att.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/monitor/att.c b/monitor/att.c
index 170b5d875..3b78884bc 100644
--- a/monitor/att.c
+++ b/monitor/att.c
@@ -1733,6 +1733,85 @@ static void pac_context_notify(const struct l2cap_frame *frame)
print_pac_context(frame);
}
+static void csip_rank_read(const struct l2cap_frame *frame)
+{
+ uint8_t rank;
+
+ if (!l2cap_frame_get_u8((void *)frame, &rank)) {
+ print_text(COLOR_ERROR, "Rank: invalid size");
+ goto done;
+ }
+
+ print_field(" Rank: 0x%02x", rank);
+
+done:
+ if (frame->size)
+ print_hex_field(" Data", frame->data, frame->size);
+}
+
+static void csip_lock_read(const struct l2cap_frame *frame)
+{
+ uint8_t lock;
+
+ if (!l2cap_frame_get_u8((void *)frame, &lock)) {
+ print_text(COLOR_ERROR, "Lock: invalid size");
+ goto done;
+ }
+
+ switch (lock) {
+ case 0x01:
+ print_field(" Locked (0x%02x)", lock);
+ break;
+ case 0x02:
+ print_field(" Unlocked (0x%02x)", lock);
+ break;
+ default:
+ print_field(" RFU (0x%02x)", lock);
+ break;
+ }
+
+done:
+ if (frame->size)
+ print_hex_field(" Data", frame->data, frame->size);
+}
+
+static void print_csip_size(const struct l2cap_frame *frame)
+{
+ uint8_t size;
+
+ if (!l2cap_frame_get_u8((void *)frame, &size)) {
+ print_text(COLOR_ERROR, "Size: invalid size");
+ goto done;
+ }
+ print_field(" Size: 0x%02x", size);
+
+done:
+ if (frame->size)
+ print_hex_field(" Data", frame->data, frame->size);
+}
+
+static void csip_size_read(const struct l2cap_frame *frame)
+{
+ print_csip_size(frame);
+}
+
+static void csip_size_notify(const struct l2cap_frame *frame)
+{
+ print_csip_size(frame);
+}
+
+static void csip_sirk_read(const struct l2cap_frame *frame)
+{
+ if (frame->size)
+ print_hex_field(" SIRK", frame->data, frame->size);
+}
+
+static void csip_sirk_notify(const struct l2cap_frame *frame)
+{
+ if (frame->size)
+ print_hex_field(" SIRK", frame->data, frame->size);
+}
+
static void print_vcs_state(const struct l2cap_frame *frame)
{
uint8_t vol_set, mute, chng_ctr;
@@ -2413,6 +2492,12 @@ struct gatt_handler {
GATT_HANDLER(0x2b7d, vol_state_read, NULL, vol_state_notify),
GATT_HANDLER(0x2b7e, NULL, vol_cp_write, NULL),
GATT_HANDLER(0x2b7f, vol_flag_read, NULL, vol_flag_notify),
+
+ GATT_HANDLER(0x2b84, csip_sirk_read, NULL, csip_sirk_notify),
+ GATT_HANDLER(0x2b85, csip_size_read, NULL, csip_size_notify),
+ GATT_HANDLER(0x2b86, csip_lock_read, NULL, NULL),
+ GATT_HANDLER(0x2b87, csip_rank_read, NULL, NULL),
+
GATT_HANDLER(0x2b93, mp_name_read, NULL, mp_name_notify),
GATT_HANDLER(0x2b96, NULL, NULL, track_changed_notify),
GATT_HANDLER(0x2b97, track_title_read, NULL, track_title_notify),