diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2020-05-06 01:26:27 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2020-05-06 01:26:27 +0200 |
commit | d9630510bf0ee0d7c0e4013a4b90ef09e88045e1 (patch) | |
tree | 28229a11db8073e172eb4b46ddce52213f47de79 /monitor | |
parent | ad7d415ecfd4c8b310e9e6bf89f8349bbf2d52bc (diff) | |
download | bluez-d9630510bf0ee0d7c0e4013a4b90ef09e88045e1.tar.gz |
monitor: Decode mgmt commands and event for experimental features
Diffstat (limited to 'monitor')
-rw-r--r-- | monitor/packet.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/monitor/packet.c b/monitor/packet.c index dc5903b16..d77d79093 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -97,6 +97,7 @@ #define COLOR_UNKNOWN_SETTINGS_BIT COLOR_WHITE_BG #define COLOR_UNKNOWN_ADDRESS_TYPE COLOR_WHITE_BG #define COLOR_UNKNOWN_DEVICE_FLAG COLOR_WHITE_BG +#define COLOR_UNKNOWN_EXP_FEATURE_FLAG COLOR_WHITE_BG #define COLOR_UNKNOWN_ADV_FLAG COLOR_WHITE_BG #define COLOR_UNKNOWN_PHY COLOR_WHITE_BG @@ -11962,6 +11963,26 @@ static void mgmt_print_oob_data(const void *data) print_randomizer_p256(data + 48); } +static const struct bitfield_data mgmt_exp_feature_flags_table[] = { + { 0, "Active" }, + { 1, "Settings change" }, + { } +}; + +static void mgmt_print_exp_feature(const void *data) +{ + uint32_t flags = get_le32(data + 16); + uint32_t mask; + + mgmt_print_uuid(data); + print_field("Flags: 0x%8.8x", flags); + + mask = print_bitfield(2, flags, mgmt_exp_feature_flags_table); + if (mask) + print_text(COLOR_UNKNOWN_EXP_FEATURE_FLAG, + " Unknown feature flag (0x%8.8x)", mask); +} + static void mgmt_null_cmd(const void *data, uint16_t size) { } @@ -13024,6 +13045,35 @@ static void mgmt_set_phy_cmd(const void *data, uint16_t size) mgmt_print_phys("Selected PHYs", selected_phys); } +static void mgmt_read_exp_features_info_rsp(const void *data, uint16_t size) +{ + uint16_t num_features = get_le16(data); + int i; + + print_field("Features: %u", num_features); + + if (size - 2 != num_features * 20) { + packet_hexdump(data + 2, size - 2); + return; + } + + for (i = 0; i < num_features; i++) + mgmt_print_exp_feature(data + 2 + (i * 20)); +} + +static void mgmt_set_exp_feature_cmd(const void *data, uint16_t size) +{ + uint8_t enable = get_u8(data + 16); + + mgmt_print_uuid(data); + print_enable("Action", enable); +} + +static void mgmt_set_exp_feature_rsp(const void *data, uint16_t size) +{ + mgmt_print_exp_feature(data); +} + struct mgmt_data { uint16_t opcode; const char *str; @@ -13243,6 +13293,12 @@ static const struct mgmt_data mgmt_command_table[] = { { 0x0045, "Set PHY Configuration", mgmt_set_phy_cmd, 4, true, mgmt_null_rsp, 0, true }, + { 0x0049, "Read Experimental Features Information", + mgmt_null_cmd, 0, true, + mgmt_read_exp_features_info_rsp, 2, false }, + { 0x004a, "Set Experimental Feature", + mgmt_set_exp_feature_cmd, 17, true, + mgmt_set_exp_feature_rsp, 20, true }, { } }; @@ -13628,6 +13684,11 @@ static void mgmt_phy_changed_evt(const void *data, uint16_t size) mgmt_print_phys("Selected PHYs", selected_phys); } +static void mgmt_exp_feature_changed_evt(const void *data, uint16_t size) +{ + mgmt_print_exp_feature(data); +} + static const struct mgmt_data mgmt_event_table[] = { { 0x0001, "Command Complete", mgmt_command_complete_evt, 3, false }, @@ -13705,6 +13766,8 @@ static const struct mgmt_data mgmt_event_table[] = { mgmt_ext_controller_info_changed_evt, 2, false }, { 0x0026, "PHY Configuration Changed", mgmt_phy_changed_evt, 4, true }, + { 0x0027, "Experimental Feature Changed", + mgmt_exp_feature_changed_evt, 20, true }, { } }; |