monitor: Add support for Suspend and Resume events
authorAbhishek Pandit-Subedi <abhishekpandit@chromium.org>
Sat, 29 Aug 2020 01:02:09 +0000 (18:02 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 12 Apr 2021 09:00:50 +0000 (14:30 +0530)
Add support to pretty print Suspend and Resume mgmt events in btmon.

Example:

@ MGMT Event: Controller Suspended (0x002d) plen 1
        Suspend state: Page scanning and/or passive scanning (2)

@ MGMT Event: Controller Resumed (0x002e) plen 8
        Wake reason: Remote wake due to peer device connection (2)
        LE Address: CD:F3:CD:13:C5:9A (OUI CD-F3-CD)

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

index 120cc31..a992b2e 100755 (executable)
@@ -13551,6 +13551,9 @@ static void mgmt_device_disconnected_evt(const void *data, uint16_t size)
        case 0x04:
                str = "Connection terminated due to authentication failure";
                break;
+       case 0x05:
+               str = "Connection terminated by local host for suspend";
+               break;
        default:
                str = "Reserved";
                break;
@@ -13778,6 +13781,54 @@ static void mgmt_device_flags_changed_evt(const void *data, uint16_t size)
        mgmt_print_added_device_flags("Current Flags", current_flags);
 }
 
+static void mgmt_controller_suspend_evt(const void *data, uint16_t size)
+{
+       uint8_t state = get_u8(data);
+       char *str;
+
+       switch (state) {
+       case 0x0:
+               str = "Controller running (failed to suspend)";
+               break;
+       case 0x1:
+               str = "Disconnected and not scanning";
+               break;
+       case 0x2:
+               str = "Page scanning and/or passive scanning";
+               break;
+       default:
+               str = "Unknown suspend state";
+               break;
+       }
+
+       print_field("Suspend state: %s (%d)", str, state);
+}
+
+static void mgmt_controller_resume_evt(const void *data, uint16_t size)
+{
+       uint8_t addr_type = get_u8(data + 6);
+       uint8_t wake_reason = get_u8(data + 7);
+       char *str;
+
+       switch (wake_reason) {
+       case 0x0:
+               str = "Resume from non-Bluetooth wake source";
+               break;
+       case 0x1:
+               str = "Wake due to unexpected event";
+               break;
+       case 0x2:
+               str = "Remote wake due to peer device connection";
+               break;
+       default:
+               str = "Unknown wake reason";
+               break;
+       }
+
+       print_field("Wake reason: %s (%d)", str, wake_reason);
+       mgmt_print_address(data, addr_type);
+}
+
 static const struct mgmt_data mgmt_event_table[] = {
        { 0x0001, "Command Complete",
                        mgmt_command_complete_evt, 3, false },
@@ -13859,6 +13910,10 @@ static const struct mgmt_data mgmt_event_table[] = {
                        mgmt_exp_feature_changed_evt, 20, true },
        { 0x002a, "Device Flags Changed",
                        mgmt_device_flags_changed_evt, 15, true },
+       { 0x002d, "Controller Suspended",
+                       mgmt_controller_suspend_evt, 1, true },
+       { 0x002e, "Controller Resumed",
+                       mgmt_controller_resume_evt, 8, true },
        { }
 };