monitor: Decode device flags mgmt ops and event
authorAbhishek Pandit-Subedi <abhishekpandit@chromium.org>
Mon, 6 Jul 2020 20:25:14 +0000 (13:25 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 12 Apr 2021 09:00:49 +0000 (14:30 +0530)
Add support for Get Device Flags and Set Device Flags mgmt operations
and Device Flags Changed mgmt event.

Sample trace:
@ MGMT Command: Set Device Flags (0x0050) plen 11     {0x0002} [hci0]
        LE Address: CD:F3:CD:13:C5:91 (Static)
        Current Flags: 0x00000000
@ MGMT Event: Device Flags Changed (0x002a) plen 15   {0x0001} [hci0]
        LE Address: CD:F3:CD:13:C5:91 (Static)
        Supported Flags: 0x00000001
          Remote Wakeup
        Current Flags: 0x00000000
@ MGMT Event: Device Flags Changed (0x002a) plen 15   {0x0004} [hci0]
        LE Address: CD:F3:CD:13:C5:91 (Static)
        Supported Flags: 0x00000001
          Remote Wakeup
        Current Flags: 0x00000000
@ MGMT Event: Device Flags Changed (0x002a) plen 15   {0x0003} [hci0]
        LE Address: CD:F3:CD:13:C5:91 (Static)
        Supported Flags: 0x00000001
          Remote Wakeup
        Current Flags: 0x00000000
@ MGMT Event: Command Complete (0x0001) plen 10       {0x0002} [hci0]
      Set Device Flags (0x0050) plen 7
        Status: Success (0x00)
        LE Address: CD:F3:CD:13:C5:91 (Static)

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
monitor/packet.c

index 74b9acc..120cc31 100755 (executable)
@@ -99,6 +99,7 @@
 #define COLOR_UNKNOWN_EXP_FEATURE_FLAG COLOR_WHITE_BG
 #define COLOR_UNKNOWN_ADV_FLAG         COLOR_WHITE_BG
 #define COLOR_UNKNOWN_PHY              COLOR_WHITE_BG
+#define COLOR_UNKNOWN_ADDED_DEVICE_FLAG        COLOR_WHITE_BG
 
 #define COLOR_PHY_PACKET               COLOR_BLUE
 
@@ -13095,6 +13096,56 @@ static void mgmt_set_exp_feature_rsp(const void *data, uint16_t size)
        mgmt_print_exp_feature(data);
 }
 
+static const struct bitfield_data mgmt_added_device_flags_table[] = {
+       { 0, "Remote Wakeup"    },
+       { }
+};
+
+static void mgmt_print_added_device_flags(char *label, uint32_t flags)
+{
+       uint32_t mask;
+
+       print_field("%s: 0x%8.8x", label, flags);
+       mask = print_bitfield(2, flags, mgmt_added_device_flags_table);
+       if (mask)
+               print_text(COLOR_UNKNOWN_ADDED_DEVICE_FLAG,
+                          "  Unknown Flags (0x%8.8x)", mask);
+}
+
+static void mgmt_get_device_flags_cmd(const void *data, uint16_t size)
+{
+       uint8_t type = get_u8(data + 6);
+
+       mgmt_print_address(data, type);
+}
+
+static void mgmt_get_device_flags_rsp(const void *data, uint16_t size)
+{
+       uint8_t type = get_u8(data + 6);
+       uint32_t supported_flags = get_le32(data + 7);
+       uint32_t current_flags = get_le32(data + 11);
+
+       mgmt_print_address(data, type);
+       mgmt_print_added_device_flags("Supported Flags", supported_flags);
+       mgmt_print_added_device_flags("Current Flags", current_flags);
+}
+
+static void mgmt_set_device_flags_cmd(const void *data, uint16_t size)
+{
+       uint8_t type = get_u8(data + 6);
+       uint32_t current_flags = get_le32(data + 7);
+
+       mgmt_print_address(data, type);
+       mgmt_print_added_device_flags("Current Flags", current_flags);
+}
+
+static void mgmt_set_device_flags_rsp(const void *data, uint16_t size)
+{
+       uint8_t type = get_u8(data + 6);
+
+       mgmt_print_address(data, type);
+}
+
 struct mgmt_data {
        uint16_t opcode;
        const char *str;
@@ -13320,6 +13371,12 @@ static const struct mgmt_data mgmt_command_table[] = {
        { 0x004a, "Set Experimental Feature",
                                mgmt_set_exp_feature_cmd, 17, true,
                                mgmt_set_exp_feature_rsp, 20, true },
+       { 0x004f, "Get Device Flags",
+                               mgmt_get_device_flags_cmd, 7, true,
+                               mgmt_get_device_flags_rsp, 15, true},
+       { 0x0050, "Set Device Flags",
+                               mgmt_set_device_flags_cmd, 11, true,
+                               mgmt_set_device_flags_rsp, 7, true},
        { }
 };
 
@@ -13710,6 +13767,17 @@ static void mgmt_exp_feature_changed_evt(const void *data, uint16_t size)
        mgmt_print_exp_feature(data);
 }
 
+static void mgmt_device_flags_changed_evt(const void *data, uint16_t size)
+{
+       uint8_t type = get_u8(data + 6);
+       uint32_t supported_flags = get_le32(data + 7);
+       uint32_t current_flags = get_le32(data + 11);
+
+       mgmt_print_address(data, type);
+       mgmt_print_added_device_flags("Supported Flags", supported_flags);
+       mgmt_print_added_device_flags("Current Flags", current_flags);
+}
+
 static const struct mgmt_data mgmt_event_table[] = {
        { 0x0001, "Command Complete",
                        mgmt_command_complete_evt, 3, false },
@@ -13789,6 +13857,8 @@ static const struct mgmt_data mgmt_event_table[] = {
                        mgmt_phy_changed_evt, 4, true },
        { 0x0027, "Experimental Feature Changed",
                        mgmt_exp_feature_changed_evt, 20, true },
+       { 0x002a, "Device Flags Changed",
+                       mgmt_device_flags_changed_evt, 15, true },
        { }
 };