From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This reduces the duplicated code around printing bitfields. --- monitor/display.h | 22 +++ monitor/l2cap.c | 32 +--- monitor/packet.c | 381 ++++++++-------------------------------------- 3 files changed, 92 insertions(+), 343 deletions(-) diff --git a/monitor/display.h b/monitor/display.h index b85f37b9a..12d13f873 100644 --- a/monitor/display.h +++ b/monitor/display.h @@ -23,6 +23,7 @@ */ #include <stdbool.h> +#include <inttypes.h> bool use_color(void); @@ -64,6 +65,27 @@ do { \ #define print_field(fmt, args...) \ print_indent(8, COLOR_OFF, "", "", COLOR_OFF, fmt, ## args) +struct bitfield_data { + uint64_t bit; + const char *str; +}; + +inline uint64_t print_bitfield(int indent, uint64_t val, + const struct bitfield_data *table) +{ + uint64_t mask = val; + int i; + + for (i = 0; table[i].str; i++) { + if (val & (((uint64_t) 1) << table[i].bit)) { + print_field("%*c%s", indent, ' ', table[i].str); + mask &= ~(((uint64_t) 1) << table[i].bit); + } + } + + return mask; +} + int num_columns(void); void open_pager(void); diff --git a/monitor/l2cap.c b/monitor/l2cap.c index c85934af1..ef2a14410 100644 --- a/monitor/l2cap.c +++ b/monitor/l2cap.c @@ -916,10 +916,7 @@ static void print_info_result(uint16_t result) print_field("Result: %s (0x%4.4x)", str, le16_to_cpu(result)); } -static struct { - uint8_t bit; - const char *str; -} features_table[] = { +static const struct bitfield_data features_table[] = { { 0, "Flow control mode" }, { 1, "Retransmission mode" }, { 2, "Bi-directional QoS" }, @@ -936,26 +933,16 @@ static struct { static void print_features(uint32_t features) { - uint32_t mask = features; - int i; + uint32_t mask; print_field("Features: 0x%8.8x", features); - for (i = 0; features_table[i].str; i++) { - if (features & (1 << features_table[i].bit)) { - print_field(" %s", features_table[i].str); - mask &= ~(1 << features_table[i].bit); - } - } - + mask = print_bitfield(2, features, features_table); if (mask) print_field(" Unknown features (0x%8.8x)", mask); } -static struct { - uint16_t cid; - const char *str; -} channels_table[] = { +static const struct bitfield_data channels_table[] = { { 0x0000, "Null identifier" }, { 0x0001, "L2CAP Signaling (BR/EDR)" }, { 0x0002, "Connectionless reception" }, @@ -970,18 +957,11 @@ static struct { static void print_channels(uint64_t channels) { - uint64_t mask = channels; - int i; + uint64_t mask; print_field("Channels: 0x%16.16" PRIx64, channels); - for (i = 0; channels_table[i].str; i++) { - if (channels & (1 << channels_table[i].cid)) { - print_field(" %s", channels_table[i].str); - mask &= ~(1 << channels_table[i].cid); - } - } - + mask = print_bitfield(2, channels, channels_table); if (mask) print_field(" Unknown channels (0x%8.8" PRIx64 ")", mask); } diff --git a/monitor/packet.c b/monitor/packet.c index 6798373bc..d69d6a020 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -750,10 +750,7 @@ static void print_phy_handle(uint8_t phy_handle) print_field("Physical handle: %d", phy_handle); } -static const struct { - uint8_t bit; - const char *str; -} pkt_type_table[] = { +static const struct bitfield_data pkt_type_table[] = { { 1, "2-DH1 may not be used" }, { 2, "3-DH1 may not be used" }, { 3, "DM1 may be used" }, @@ -771,29 +768,17 @@ static const struct { static void print_pkt_type(uint16_t pkt_type) { - uint16_t mask; - int i; - - print_field("Packet type: 0x%4.4x", le16_to_cpu(pkt_type)); + uint16_t mask = le16_to_cpu(pkt_type); - mask = le16_to_cpu(pkt_type); - - for (i = 0; pkt_type_table[i].str; i++) { - if (le16_to_cpu(pkt_type) & (1 << pkt_type_table[i].bit)) { - print_field(" %s", pkt_type_table[i].str); - mask &= ~(1 << pkt_type_table[i].bit); - } - } + print_field("Packet type: 0x%4.4x", mask); + mask = print_bitfield(2, mask, pkt_type_table); if (mask) print_text(COLOR_UNKNOWN_PKT_TYPE_BIT, " Unknown packet types (0x%4.4x)", mask); } -static const struct { - uint8_t bit; - const char *str; -} pkt_type_sco_table[] = { +static const struct bitfield_data pkt_type_sco_table[] = { { 0, "HV1 may be used" }, { 1, "HV2 may be used" }, { 2, "HV3 may be used" }, @@ -809,20 +794,11 @@ static const struct { static void print_pkt_type_sco(uint16_t pkt_type) { - uint16_t mask; - int i; - - print_field("Packet type: 0x%4.4x", le16_to_cpu(pkt_type)); + uint16_t mask = le16_to_cpu(pkt_type); - mask = le16_to_cpu(pkt_type); - - for (i = 0; pkt_type_sco_table[i].str; i++) { - if (le16_to_cpu(pkt_type) & (1 << pkt_type_sco_table[i].bit)) { - print_field(" %s", pkt_type_sco_table[i].str); - mask &= ~(1 << pkt_type_sco_table[i].bit); - } - } + print_field("Packet type: 0x%4.4x", mask); + mask = print_bitfield(2, mask, pkt_type_sco_table); if (mask) print_text(COLOR_UNKNOWN_PKT_TYPE_BIT, " Unknown packet types (0x%4.4x)", mask); @@ -885,10 +861,7 @@ static void print_encrypt_mode(uint8_t mode) print_field("Mode: %s (0x%2.2x)", str, mode); } -static const struct { - uint8_t bit; - const char *str; -} svc_class_table[] = { +static const struct bitfield_data svc_class_table[] = { { 0, "Positioning (Location identification)" }, { 1, "Networking (LAN, Ad hoc)" }, { 2, "Rendering (Printing, Speaker)" }, @@ -1084,15 +1057,7 @@ static void print_dev_class(const uint8_t *dev_class) return; } - mask = dev_class[2]; - - for (i = 0; svc_class_table[i].str; i++) { - if (dev_class[2] & (1 << svc_class_table[i].bit)) { - print_field(" %s", svc_class_table[i].str); - mask &= ~(1 << svc_class_table[i].bit); - } - } - + mask = print_bitfield(2, dev_class[2], svc_class_table); if (mask) print_text(COLOR_UNKNOWN_SERVICE_CLASS, " Unknown service class (0x%2.2x)", mask); @@ -2536,12 +2501,7 @@ static void print_commands(const uint8_t *commands) } } -struct features_data { - uint8_t bit; - const char *str; -}; - -static const struct features_data features_page0[] = { +static const struct bitfield_data features_page0[] = { { 0, "3 slot packets" }, { 1, "5 slot packets" }, { 2, "Encryption" }, @@ -2601,7 +2561,7 @@ static const struct features_data features_page0[] = { { } }; -static const struct features_data features_page1[] = { +static const struct bitfield_data features_page1[] = { { 0, "Secure Simple Pairing (Host Support)" }, { 1, "LE Supported (Host)" }, { 2, "Simultaneous LE and BR/EDR (Host)" }, @@ -2609,7 +2569,7 @@ static const struct features_data features_page1[] = { { } }; -static const struct features_data features_page2[] = { +static const struct bitfield_data features_page2[] = { { 0, "Connectionless Slave Broadcast - Master" }, { 1, "Connectionless Slave Broadcast - Slave" }, { 2, "Synchronization Train" }, @@ -2624,7 +2584,7 @@ static const struct features_data features_page2[] = { { } }; -static const struct features_data features_le[] = { +static const struct bitfield_data features_le[] = { { 0, "LE Encryption" }, { 1, "Connection Parameter Request Procedure" }, { 2, "Extended Reject Indication" }, @@ -2648,7 +2608,7 @@ static const struct features_data features_le[] = { static void print_features(uint8_t page, const uint8_t *features_array, uint8_t type) { - const struct features_data *features_table = NULL; + const struct bitfield_data *features_table = NULL; uint64_t mask, features = 0; char str[41]; int i; @@ -2686,15 +2646,7 @@ static void print_features(uint8_t page, const uint8_t *features_array, if (!features_table) return; - mask = features; - - for (i = 0; features_table[i].str; i++) { - if (features & (((uint64_t) 1) << features_table[i].bit)) { - print_field(" %s", features_table[i].str); - mask &= ~(((uint64_t) 1) << features_table[i].bit); - } - } - + mask = print_bitfield(2, features, features_table); if (mask) print_text(COLOR_UNKNOWN_FEATURE_BIT, " Unknown features " "(0x%16.16" PRIx64 ")", mask); @@ -2724,10 +2676,7 @@ void packet_print_features_ll(const uint8_t *features) #define LE_STATE_SLAVE_SLAVE 0x0800 #define LE_STATE_MASTER_SLAVE 0x1000 -static const struct { - uint8_t bit; - const char *str; -} le_states_desc_table[] = { +static const struct bitfield_data le_states_desc_table[] = { { 0, "Scannable Advertising State" }, { 1, "Connectable Advertising State" }, { 2, "Non-connectable Advertising State" }, @@ -2890,10 +2839,7 @@ static void print_encrypted_diversifier(uint16_t ediv) print_field("Encrypted diversifier: 0x%4.4x", le16_to_cpu(ediv)); } -static const struct { - uint8_t bit; - const char *str; -} events_table[] = { +static const struct bitfield_data events_table[] = { { 0, "Inquiry Complete" }, { 1, "Inquiry Result" }, { 2, "Connection Complete" }, @@ -2949,7 +2895,8 @@ static const struct { { } }; -static void print_event_mask(const uint8_t *events_array) +static void print_event_mask(const uint8_t *events_array, + const struct bitfield_data *table) { uint64_t mask, events = 0; int i; @@ -2959,24 +2906,13 @@ static void print_event_mask(const uint8_t *events_array) print_field("Mask: 0x%16.16" PRIx64, events); - mask = events; - - for (i = 0; events_table[i].str; i++) { - if (events & (((uint64_t) 1) << events_table[i].bit)) { - print_field(" %s", events_table[i].str); - mask &= ~(((uint64_t) 1) << events_table[i].bit); - } - } - + mask = print_bitfield(2, events, table); if (mask) print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask " "(0x%16.16" PRIx64 ")", mask); } -static const struct { - uint8_t bit; - const char *str; -} events_page2_table[] = { +static const struct bitfield_data events_page2_table[] = { { 0, "Physical Link Complete" }, { 1, "Channel Selected" }, { 2, "Disconnection Physical Link Complete" }, @@ -3005,34 +2941,7 @@ static const struct { { } }; -static void print_event_mask_page2(const uint8_t *events_array) -{ - uint64_t mask, events = 0; - int i; - - for (i = 0; i < 8; i++) - events |= ((uint64_t) events_array[i]) << (i * 8); - - print_field("Mask: 0x%16.16" PRIx64, events); - - mask = events; - - for (i = 0; events_page2_table[i].str; i++) { - if (events & (((uint64_t) 1) << events_page2_table[i].bit)) { - print_field(" %s", events_page2_table[i].str); - mask &= ~(((uint64_t) 1) << events_page2_table[i].bit); - } - } - - if (mask) - print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask " - "(0x%16.16" PRIx64 ")", mask); -} - -static const struct { - uint8_t bit; - const char *str; -} events_le_table[] = { +static const struct bitfield_data events_le_table[] = { { 0, "LE Connection Complete" }, { 1, "LE Advertising Report" }, { 2, "LE Connection Update Complete" }, @@ -3056,30 +2965,6 @@ static const struct { { } }; -static void print_event_mask_le(const uint8_t *events_array) -{ - uint64_t mask, events = 0; - int i; - - for (i = 0; i < 8; i++) - events |= ((uint64_t) events_array[i]) << (i * 8); - - print_field("Mask: 0x%16.16" PRIx64, events); - - mask = events; - - for (i = 0; events_le_table[i].str; i++) { - if (events & (((uint64_t) 1) << events_le_table[i].bit)) { - print_field(" %s", events_le_table[i].str); - mask &= ~(((uint64_t) 1) << events_le_table[i].bit); - } - } - - if (mask) - print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask " - "(0x%16.16" PRIx64 ")", mask); -} - static void print_fec(uint8_t fec) { const char *str; @@ -3354,10 +3239,7 @@ static void print_uuid128_list(const char *label, const void *data, } } -static const struct { - uint8_t bit; - const char *str; -} eir_flags_table[] = { +static const struct bitfield_data eir_flags_table[] = { { 0, "LE Limited Discoverable Mode" }, { 1, "LE General Discoverable Mode" }, { 2, "BR/EDR Not Supported" }, @@ -3366,10 +3248,7 @@ static const struct { { } }; -static const struct { - uint8_t bit; - const char *str; -} eir_3d_table[] = { +static const struct bitfield_data eir_3d_table[] = { { 0, "Association Notification" }, { 1, "Battery Level Reporting" }, { 2, "Send Battery Level Report on Start-up Synchronization" }, @@ -3377,10 +3256,7 @@ static const struct { { } }; -static const struct { - uint8_t bit; - const char *str; -} mesh_oob_table[] = { +static const struct bitfield_data mesh_oob_table[] = { { 0, "Other" }, { 1, "Electronic / URI" }, { 2, "2D machine-readable code" }, @@ -3399,7 +3275,6 @@ static const struct { static void print_mesh_beacon(const uint8_t *data, uint8_t len) { uint16_t oob; - int i; print_hex_field("Mesh Beacon", data, len); @@ -3419,10 +3294,7 @@ static void print_mesh_beacon(const uint8_t *data, uint8_t len) oob = get_be16(data + 17); print_field(" OOB Information: 0x%4.4x", oob); - for (i = 0; mesh_oob_table[i].str; i++) { - if (oob & (1 << mesh_oob_table[i].bit)) - print_field(" %s", mesh_oob_table[i].str); - } + print_bitfield(4, oob, mesh_oob_table); if (len < 23) { packet_hexdump(data + 18, len - 18); @@ -3626,7 +3498,6 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le) uint8_t data_len; char name[239], label[100]; uint8_t flags, mask; - int i; /* Check for the end of EIR */ if (field_len == 0) @@ -3645,18 +3516,10 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le) switch (eir[1]) { case BT_EIR_FLAGS: flags = *data; - mask = flags; print_field("Flags: 0x%2.2x", flags); - for (i = 0; eir_flags_table[i].str; i++) { - if (flags & (1 << eir_flags_table[i].bit)) { - print_field(" %s", - eir_flags_table[i].str); - mask &= ~(1 << eir_flags_table[i].bit); - } - } - + mask = print_bitfield(2, flags, eir_flags_table); if (mask) print_text(COLOR_UNKNOWN_SERVICE_CLASS, " Unknown flags (0x%2.2x)", mask); @@ -3822,18 +3685,10 @@ static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le) break; flags = *data; - mask = flags; print_field(" Features: 0x%2.2x", flags); - for (i = 0; eir_3d_table[i].str; i++) { - if (flags & (1 << eir_3d_table[i].bit)) { - print_field(" %s", - eir_3d_table[i].str); - mask &= ~(1 << eir_3d_table[i].bit); - } - } - + mask = print_bitfield(4, flags, eir_3d_table); if (mask) print_text(COLOR_UNKNOWN_FEATURE_BIT, " Unknown features (0x%2.2x)", mask); @@ -4838,7 +4693,7 @@ static void set_event_mask_cmd(const void *data, uint8_t size) { const struct bt_hci_cmd_set_event_mask *cmd = data; - print_event_mask(cmd->mask); + print_event_mask(cmd->mask, events_table); } static void set_event_filter_cmd(const void *data, uint8_t size) @@ -5584,7 +5439,7 @@ static void set_event_mask_page2_cmd(const void *data, uint8_t size) { const struct bt_hci_cmd_set_event_mask_page2 *cmd = data; - print_event_mask_page2(cmd->mask); + print_event_mask(cmd->mask, events_page2_table); } static void read_location_data_rsp(const void *data, uint8_t size) @@ -6261,7 +6116,7 @@ static void le_set_event_mask_cmd(const void *data, uint8_t size) { const struct bt_hci_cmd_le_set_event_mask *cmd = data; - print_event_mask_le(cmd->mask); + print_event_mask(cmd->mask, events_le_table); } static void le_read_buffer_size_rsp(const void *data, uint8_t size) @@ -6826,20 +6681,14 @@ static void le_read_phy_rsp(const void *data, uint8_t size) print_le_phy("RX PHY", rsp->rx_phy); } -static const struct { - uint8_t bit; - const char *str; -} le_phys[] = { +static const struct bitfield_data le_phys[] = { { 0, "LE 1M" }, { 1, "LE 2M" }, { 2, "LE Coded"}, { } }; -static const struct { - uint8_t bit; - const char *str; -} le_phy_preference[] = { +static const struct bitfield_data le_phy_preference[] = { { 0, "No TX PHY preference" }, { 1, "No RX PHY preference" }, { } @@ -6848,18 +6697,11 @@ static const struct { static void print_le_phys_preference(uint8_t all_phys, uint8_t tx_phys, uint8_t rx_phys) { - int i; - uint8_t mask = all_phys; + uint8_t mask; print_field("All PHYs preference: 0x%2.2x", all_phys); - for (i = 0; le_phy_preference[i].str; i++) { - if (all_phys & (((uint8_t) 1) << le_phy_preference[i].bit)) { - print_field(" %s", le_phy_preference[i].str); - mask &= ~(((uint64_t) 1) << le_phy_preference[i].bit); - } - } - + mask = print_bitfield(2, all_phys, le_phy_preference); if (mask) print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved" " (0x%2.2x)", mask); @@ -6867,13 +6709,7 @@ static void print_le_phys_preference(uint8_t all_phys, uint8_t tx_phys, print_field("TX PHYs preference: 0x%2.2x", tx_phys); mask = tx_phys; - for (i = 0; le_phys[i].str; i++) { - if (tx_phys & (((uint8_t) 1) << le_phys[i].bit)) { - print_field(" %s", le_phys[i].str); - mask &= ~(((uint64_t) 1) << le_phys[i].bit); - } - } - + mask = print_bitfield(2, tx_phys, le_phys); if (mask) print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved" " (0x%2.2x)", mask); @@ -6881,13 +6717,7 @@ static void print_le_phys_preference(uint8_t all_phys, uint8_t tx_phys, print_field("RX PHYs preference: 0x%2.2x", rx_phys); mask = rx_phys; - for (i = 0; le_phys[i].str; i++) { - if (rx_phys & (((uint8_t) 1) << le_phys[i].bit)) { - print_field(" %s", le_phys[i].str); - mask &= ~(((uint64_t) 1) << le_phys[i].bit); - } - } - + mask = print_bitfield(2, rx_phys, le_phys); if (mask) print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved" " (0x%2.2x)", mask); @@ -6986,10 +6816,7 @@ static void le_set_adv_set_rand_addr(const void *data, uint8_t size) print_addr("Advertising random address", cmd->bdaddr, 0x00); } -static const struct { - uint8_t bit; - const char *str; -} ext_adv_properties_table[] = { +static const struct bitfield_data ext_adv_properties_table[] = { { 0, "Connectable" }, { 1, "Scannable" }, { 2, "Directed" }, @@ -7258,29 +7085,18 @@ static void le_remove_adv_set_cmd(const void *data, uint8_t size) print_handle(cmd->handle); } -static const struct { - uint8_t bit; - const char *str; -} periodic_adv_properties_table[] = { +static const struct bitfield_data periodic_adv_properties_table[] = { { 6, "Include TxPower" }, { } }; static void print_periodic_adv_properties(uint16_t flags) { - uint16_t mask = flags; - int i; + uint16_t mask; print_field("Properties: 0x%4.4x", flags); - for (i = 0; periodic_adv_properties_table[i].str; i++) { - if (flags & (1 << periodic_adv_properties_table[i].bit)) { - print_field(" %s", - periodic_adv_properties_table[i].str); - mask &= ~(1 << periodic_adv_properties_table[i].bit); - } - } - + mask = print_bitfield(2, flags, periodic_adv_properties_table); if (mask) print_text(COLOR_UNKNOWN_ADV_FLAG, " Unknown advertising properties (0x%4.4x)", @@ -7335,10 +7151,7 @@ static void le_set_periodic_adv_enable_cmd(const void *data, uint8_t size) print_handle(cmd->handle); } -static const struct { - uint8_t bit; - const char *str; -} ext_scan_phys_table[] = { +static const struct bitfield_data ext_scan_phys_table[] = { { 0, "LE 1M" }, { 2, "LE Coded" }, { } @@ -7397,13 +7210,10 @@ static void le_set_ext_scan_enable_cmd(const void *data, uint8_t size) le16_to_cpu(cmd->period)); } -static const struct { - uint8_t bit; - const char *str; -} ext_conn_phys_table[] = { +static const struct bitfield_data ext_conn_phys_table[] = { { 0, "LE 1M" }, { 1, "LE 2M" }, - { 2, "LE Coded" }, + { 2, "LE Coded" }, { } }; @@ -9478,10 +9288,7 @@ static void le_phy_update_complete_evt(const void *data, uint8_t size) print_le_phy("RX PHY", evt->rx_phy); } -static const struct { - uint8_t bit; - const char *str; -} ext_adv_report_evt_type[] = { +static const struct bitfield_data ext_adv_report_evt_type[] = { { 0, "Connectable" }, { 1, "Scannable" }, { 2, "Directed" }, @@ -10606,10 +10413,7 @@ static void mgmt_print_address(const uint8_t *address, uint8_t type) } } -static const struct { - uint8_t bit; - const char *str; -} mgmt_address_type_table[] = { +static const struct bitfield_data mgmt_address_type_table[] = { { 0, "BR/EDR" }, { 1, "LE Public" }, { 2, "LE Random" }, @@ -10618,18 +10422,11 @@ static const struct { static void mgmt_print_address_type(uint8_t type) { - uint8_t mask = type; - int i; + uint8_t mask; print_field("Address type: 0x%2.2x", type); - for (i = 0; mgmt_address_type_table[i].str; i++) { - if (type & (1 << mgmt_address_type_table[i].bit)) { - print_field(" %s", mgmt_address_type_table[i].str); - mask &= ~(1 << mgmt_address_type_table[i].bit); - } - } - + mask = print_bitfield(2, type, mgmt_address_type_table); if (mask) print_text(COLOR_UNKNOWN_ADDRESS_TYPE, " Unknown address type" " (0x%2.2x)", mask); @@ -10645,10 +10442,7 @@ static void mgmt_print_manufacturer(uint16_t manufacturer) packet_print_company("Manufacturer", manufacturer); } -static const struct { - uint8_t bit; - const char *str; -} mgmt_options_table[] = { +static const struct bitfield_data mgmt_options_table[] = { { 0, "External configuration" }, { 1, "Bluetooth public address configuration" }, { } @@ -10656,27 +10450,17 @@ static const struct { static void mgmt_print_options(const char *label, uint32_t options) { - uint32_t mask = options; - int i; + uint32_t mask; print_field("%s: 0x%8.8x", label, options); - for (i = 0; mgmt_options_table[i].str; i++) { - if (options & (1 << mgmt_options_table[i].bit)) { - print_field(" %s", mgmt_options_table[i].str); - mask &= ~(1 << mgmt_options_table[i].bit); - } - } - + mask = print_bitfield(2, options, mgmt_options_table); if (mask) print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Unknown options" " (0x%8.8x)", mask); } -static const struct { - uint8_t bit; - const char *str; -} mgmt_settings_table[] = { +static const struct bitfield_data mgmt_settings_table[] = { { 0, "Powered" }, { 1, "Connectable" }, { 2, "Fast Connectable" }, @@ -10699,18 +10483,11 @@ static const struct { static void mgmt_print_settings(const char *label, uint32_t settings) { - uint32_t mask = settings; - int i; + uint32_t mask; print_field("%s: 0x%8.8x", label, settings); - for (i = 0; mgmt_settings_table[i].str; i++) { - if (settings & (1 << mgmt_settings_table[i].bit)) { - print_field(" %s", mgmt_settings_table[i].str); - mask &= ~(1 << mgmt_settings_table[i].bit); - } - } - + mask = print_bitfield(2, settings, mgmt_settings_table); if (mask) print_text(COLOR_UNKNOWN_SETTINGS_BIT, " Unknown settings" " (0x%8.8x)", mask); @@ -10760,10 +10537,7 @@ static void mgmt_print_io_capability(uint8_t capability) print_field("Capability: %s (0x%2.2x)", str, capability); } -static const struct { - uint8_t bit; - const char *str; -} mgmt_device_flags_table[] = { +static const struct bitfield_data mgmt_device_flags_table[] = { { 0, "Confirm Name" }, { 1, "Legacy Pairing" }, { 2, "Not Connectable" }, @@ -10772,18 +10546,11 @@ static const struct { static void mgmt_print_device_flags(uint32_t flags) { - uint32_t mask = flags; - int i; + uint32_t mask; print_field("Flags: 0x%8.8x", flags); - for (i = 0; mgmt_device_flags_table[i].str; i++) { - if (flags & (1 << mgmt_device_flags_table[i].bit)) { - print_field(" %s", mgmt_device_flags_table[i].str); - mask &= ~(1 << mgmt_device_flags_table[i].bit); - } - } - + mask = print_bitfield(2, flags, mgmt_device_flags_table); if (mask) print_text(COLOR_UNKNOWN_DEVICE_FLAG, " Unknown device flag" " (0x%8.8x)", mask); @@ -10811,10 +10578,7 @@ static void mgmt_print_device_action(uint8_t action) print_field("Action: %s (0x%2.2x)", str, action); } -static const struct { - uint8_t bit; - const char *str; -} mgmt_adv_flags_table[] = { +static const struct bitfield_data mgmt_adv_flags_table[] = { { 0, "Switch into Connectable mode" }, { 1, "Advertise as Discoverable" }, { 2, "Advertise as Limited Discoverable" }, @@ -10830,18 +10594,11 @@ static const struct { static void mgmt_print_adv_flags(uint32_t flags) { - uint32_t mask = flags; - int i; + uint32_t mask; print_field("Flags: 0x%8.8x", flags); - for (i = 0; mgmt_adv_flags_table[i].str; i++) { - if (flags & (1 << mgmt_adv_flags_table[i].bit)) { - print_field(" %s", mgmt_adv_flags_table[i].str); - mask &= ~(1 << mgmt_adv_flags_table[i].bit); - } - } - + mask = print_bitfield(2, flags, mgmt_adv_flags_table); if (mask) print_text(COLOR_UNKNOWN_ADV_FLAG, " Unknown advertising flag" " (0x%8.8x)", mask); @@ -11991,10 +11748,7 @@ static void mgmt_set_apperance_cmd(const void *data, uint16_t size) print_appearance(appearance); } -static const struct { - uint8_t bit; - const char *str; -} mgmt_phy_table[] = { +static const struct bitfield_data mgmt_phy_table[] = { { 0, "1MTX" }, { 1, "1MRX" }, { 2, "2MTX" }, @@ -12006,18 +11760,11 @@ static const struct { static void mgmt_print_phys(const char *label, uint16_t phys) { - uint16_t mask = phys; - int i; + uint16_t mask; print_field("%s: 0x%4.4x", label, phys); - for (i = 0; mgmt_phy_table[i].str; i++) { - if (phys & (1 << mgmt_phy_table[i].bit)) { - print_field(" %s", mgmt_phy_table[i].str); - mask &= ~(1 << mgmt_phy_table[i].bit); - } - } - + mask = print_bitfield(2, phys, mgmt_phy_table); if (mask) print_text(COLOR_UNKNOWN_PHY, " Unknown PHYs" " (0x%8.8x)", mask); -- 2.17.1 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html