#define COLOR_UNKNOWN_ADDRESS_TYPE COLOR_WHITE_BG
#define COLOR_UNKNOWN_DEVICE_FLAG COLOR_WHITE_BG
#define COLOR_UNKNOWN_ADV_FLAG COLOR_WHITE_BG
+#define COLOR_UNKNOWN_PHY COLOR_WHITE_BG
#define COLOR_PHY_PACKET COLOR_BLUE
{ 9, "3-DH3 may not be used" },
{ 10, "DM3 may be used" },
{ 11, "DH3 may be used" },
- { 12, "3-DH5 may not be used" },
+ { 12, "2-DH5 may not be used" },
{ 13, "3-DH5 may not be used" },
{ 14, "DM5 may be used" },
{ 15, "DH5 may be used" },
{ 13, "Privacy" },
{ 14, "Controller Configuration"},
{ 15, "Static Address" },
+ { 16, "PHY Configuration" },
{ }
};
print_appearance(appearance);
}
+static const struct bitfield_data mgmt_phy_table[] = {
+ { 0, "BR 1M 1SLOT" },
+ { 1, "BR 1M 3SLOT" },
+ { 2, "BR 1M 5SLOT" },
+ { 3, "EDR 2M 1SLOT" },
+ { 4, "EDR 2M 3SLOT" },
+ { 5, "EDR 2M 5SLOT" },
+ { 6, "EDR 3M 1SLOT" },
+ { 7, "EDR 3M 3SLOT" },
+ { 8, "EDR 3M 5SLOT" },
+ { 9, "LE 1M TX" },
+ { 10, "LE 1M RX" },
+ { 11, "LE 2M TX" },
+ { 12, "LE 2M RX" },
+ { 13, "LE CODED TX" },
+ { 14, "LE CODED RX" },
+ { }
+};
+
+static void mgmt_print_phys(const char *label, uint16_t phys)
+{
+ uint16_t mask;
+
+ print_field("%s: 0x%4.4x", label, phys);
+
+ mask = print_bitfield(2, phys, mgmt_phy_table);
+ if (mask)
+ print_text(COLOR_UNKNOWN_PHY, " Unknown PHYs"
+ " (0x%8.8x)", mask);
+}
+
+static void mgmt_get_phy_rsp(const void *data, uint16_t size)
+{
+ uint32_t supported_phys = get_le32(data);
+ uint32_t configurable_phys = get_le32(data + 4);
+ uint32_t selected_phys = get_le32(data + 8);
+
+ mgmt_print_phys("Supported PHYs", supported_phys);
+ mgmt_print_phys("Configurable PHYs", configurable_phys);
+ mgmt_print_phys("Selected PHYs", selected_phys);
+}
+
+static void mgmt_set_phy_cmd(const void *data, uint16_t size)
+{
+ uint32_t selected_phys = get_le32(data);
+
+ mgmt_print_phys("Selected PHYs", selected_phys);
+}
+
struct mgmt_data {
uint16_t opcode;
const char *str;
{ 0x0043, "Set Appearance",
mgmt_set_apperance_cmd, 2, true,
mgmt_null_rsp, 0, true },
+ { 0x0044, "Get PHY Configuration",
+ mgmt_null_cmd, 0, true,
+ mgmt_get_phy_rsp, 12, true },
+ { 0x0045, "Set PHY Configuration",
+ mgmt_set_phy_cmd, 4, true,
+ mgmt_null_rsp, 0, true },
{ }
};
print_eir(data + 2, size - 2, false);
}
+static void mgmt_phy_changed_evt(const void *data, uint16_t size)
+{
+ uint32_t selected_phys = get_le32(data);
+
+ mgmt_print_phys("Selected PHYs", selected_phys);
+}
+
static const struct mgmt_data mgmt_event_table[] = {
{ 0x0001, "Command Complete",
mgmt_command_complete_evt, 3, false },
mgmt_advertising_removed_evt, 1, true },
{ 0x0025, "Extended Controller Information Changed",
mgmt_ext_controller_info_changed_evt, 2, false },
+ { 0x0026, "PHY Configuration Changed",
+ mgmt_phy_changed_evt, 4, true },
{ }
};