From 1592679ed80c4ffb26e736a836ffe80fbab139e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20M=C3=B8ller=20Madsen?= Date: Sun, 26 Jan 2020 21:54:02 +0100 Subject: [PATCH] Bluetooth HCI: Add support for Bluetooth v5.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dissection of all new HCI commands and events added in the newly released Bluetooth specification version 5.2. Bluetooth Device Dialog updated to also show ISO buffer size and amount. Change-Id: I3a459760cbe5f6c4f985621cee40dbbe5e473d39 Signed-off-by: Allan Møller Madsen Reviewed-on: https://code.wireshark.org/review/35957 Petri-Dish: Anders Broman Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman --- epan/dissectors/packet-bluetooth.h | 2 + epan/dissectors/packet-bthci_cmd.c | 876 ++++++++++++++++++++++++++++- epan/dissectors/packet-bthci_cmd.h | 3 + epan/dissectors/packet-bthci_evt.c | 829 +++++++++++++++++++++++++-- ui/qt/bluetooth_device_dialog.cpp | 22 +- ui/qt/bluetooth_device_dialog.ui | 10 + 6 files changed, 1690 insertions(+), 52 deletions(-) diff --git a/epan/dissectors/packet-bluetooth.h b/epan/dissectors/packet-bluetooth.h index c01ed2e65f..0a25d266ae 100644 --- a/epan/dissectors/packet-bluetooth.h +++ b/epan/dissectors/packet-bluetooth.h @@ -241,7 +241,9 @@ typedef struct _bluetooth_device_tap_t { } mtus; struct { guint16 acl_mtu; + guint16 iso_mtu; guint16 acl_packets; + guint16 iso_packets; } le_mtus; } data; } bluetooth_device_tap_t; diff --git a/epan/dissectors/packet-bthci_cmd.c b/epan/dissectors/packet-bthci_cmd.c index 6ee039834a..4eb04f84d9 100644 --- a/epan/dissectors/packet-bthci_cmd.c +++ b/epan/dissectors/packet-bthci_cmd.c @@ -285,6 +285,16 @@ static int hf_bthci_cmd_amp_remaining_assoc_length = -1; static int hf_bthci_cmd_amp_assoc_fragment = -1; static int hf_bthci_cmd_le_event_mask = -1; static int hf_bthci_cmd_le_event_mask_le_reserved = -1; +static int hf_bthci_cmd_le_event_mask_le_biginfo_advertising_report = -1; +static int hf_bthci_cmd_le_event_mask_le_transmit_power_reporting = -1; +static int hf_bthci_cmd_le_event_mask_le_path_loss_threshold = -1; +static int hf_bthci_cmd_le_event_mask_le_request_peer_sca_complete = -1; +static int hf_bthci_cmd_le_event_mask_le_big_sync_lost = -1; +static int hf_bthci_cmd_le_event_mask_le_big_sync_established = -1; +static int hf_bthci_cmd_le_event_mask_le_terminate_big_complete = -1; +static int hf_bthci_cmd_le_event_mask_le_create_big_complete = -1; +static int hf_bthci_cmd_le_event_mask_le_cis_request = -1; +static int hf_bthci_cmd_le_event_mask_le_cis_established = -1; static int hf_bthci_cmd_le_event_mask_le_periodic_advertising_sync_transfer_received = -1; static int hf_bthci_cmd_le_event_mask_le_cte_request_failed = -1; static int hf_bthci_cmd_le_event_mask_le_connection_iq_report = -1; @@ -446,6 +456,65 @@ static int hf_bthci_cmd_cte_types_reserved = -1; static int hf_bthci_cmd_cte_types_aod_2us = -1; static int hf_bthci_cmd_cte_types_aod_1us = -1; static int hf_bthci_cmd_cte_types_aoa = -1; +static int hf_bthci_cmd_cig_id = -1; +static int hf_bthci_cmd_sdu_interval_m_to_s = -1; +static int hf_bthci_cmd_sdu_interval_s_to_m = -1; +static int hf_bthci_cmd_sdu_interval = -1; +static int hf_bthci_cmd_slaves_clock_accuracy = -1; +static int hf_bthci_cmd_packing = -1; +static int hf_bthci_cmd_framing = -1; +static int hf_bthci_cmd_ft_m_to_s = -1; +static int hf_bthci_cmd_ft_s_to_m = -1; +static int hf_bthci_cmd_iso_interval = -1; +static int hf_bthci_cmd_cis_count = -1; +static int hf_bthci_cmd_cis_params = -1; +static int hf_bthci_cmd_cis_id = -1; +static int hf_bthci_cmd_nse = -1; +static int hf_bthci_cmd_max_sdu_m_to_s = -1; +static int hf_bthci_cmd_max_sdu_s_to_m = -1; +static int hf_bthci_cmd_max_sdu = -1; +static int hf_bthci_cmd_max_pdu_m_to_s = -1; +static int hf_bthci_cmd_max_pdu_s_to_m = -1; +static int hf_bthci_cmd_max_pdu = -1; +static int hf_bthci_cmd_phy_m_to_s = -1; +static int hf_bthci_cmd_phy_s_to_m = -1; +static int hf_bthci_cmd_bn_m_to_s = -1; +static int hf_bthci_cmd_bn_s_to_m = -1; +static int hf_bthci_cmd_bn = -1; +static int hf_bthci_cmd_max_transport_latency_m_to_s = -1; +static int hf_bthci_cmd_max_transport_latency_s_to_m = -1; +static int hf_bthci_cmd_max_transport_latency = -1; +static int hf_bthci_cmd_rtn_m_to_s = -1; +static int hf_bthci_cmd_rtn_s_to_m = -1; +static int hf_bthci_cmd_rtn = -1; +static int hf_bthci_cmd_cis_handle = -1; +static int hf_bthci_cmd_big_handle = -1; +static int hf_bthci_cmd_cis_bis_handle = -1; +static int hf_bthci_cmd_num_bis = -1; +static int hf_bthci_cmd_irc = -1; +static int hf_bthci_cmd_pto = -1; +static int hf_bthci_cmd_encryption = -1; +static int hf_bthci_cmd_broadcast_code = -1; +static int hf_bthci_cmd_mse = -1; +static int hf_bthci_cmd_bis_index = -1; +static int hf_bthci_cmd_sync_timeout = -1; +static int hf_bthci_cmd_data_path_direction = -1; +static int hf_bthci_cmd_data_path_id = -1; +static int hf_bthci_cmd_coding_format = -1; +static int hf_bthci_cmd_controller_delay = -1; +static int hf_bthci_cmd_codec_config_length = -1; +static int hf_bthci_cmd_codec_config = -1; +static int hf_bthci_cmd_payload_type = -1; +static int hf_bthci_cmd_feature_bit_number = -1; +static int hf_bthci_cmd_feature_bit_value = -1; +static int hf_bthci_cmd_phy_and_coding = -1; +static int hf_bthci_cmd_high_threshold = -1; +static int hf_bthci_cmd_high_hysteresis = -1; +static int hf_bthci_cmd_low_threshold = -1; +static int hf_bthci_cmd_low_hysteresis = -1; +static int hf_bthci_cmd_min_time_spent = -1; +static int hf_bthci_cmd_local_reporting_enable = -1; +static int hf_bthci_cmd_remote_reporting_enable = -1; static int hf_bthci_cmd_triggered_clock_capture = -1; static int hf_bthci_cmd_lpo_allowed = -1; static int hf_bthci_cmd_number_of_clock_captures_to_filter = -1; @@ -544,6 +613,16 @@ static int hf_bthci_cmd_extended_inquiry_length = -1; static const int *hfx_bthci_cmd_le_event_mask[] = { &hf_bthci_cmd_le_event_mask_le_reserved, + &hf_bthci_cmd_le_event_mask_le_biginfo_advertising_report, + &hf_bthci_cmd_le_event_mask_le_transmit_power_reporting, + &hf_bthci_cmd_le_event_mask_le_path_loss_threshold, + &hf_bthci_cmd_le_event_mask_le_request_peer_sca_complete, + &hf_bthci_cmd_le_event_mask_le_big_sync_lost, + &hf_bthci_cmd_le_event_mask_le_big_sync_established, + &hf_bthci_cmd_le_event_mask_le_terminate_big_complete, + &hf_bthci_cmd_le_event_mask_le_create_big_complete, + &hf_bthci_cmd_le_event_mask_le_cis_request, + &hf_bthci_cmd_le_event_mask_le_cis_established, &hf_bthci_cmd_le_event_mask_le_periodic_advertising_sync_transfer_received, &hf_bthci_cmd_le_event_mask_le_cte_request_failed, &hf_bthci_cmd_le_event_mask_le_connection_iq_report, @@ -692,7 +771,7 @@ static gint ett_le_event_mask = -1; static gint ett_adv_properties = -1; static gint ett_adv_sets = -1; static gint ett_phys_flags = -1; -static gint ett_scan_init_phy_param = -1; +static gint ett_phy_param = -1; static gint ett_sync_cte_type = -1; static gint ett_coding_format = -1; static gint ett_packet_type = -1; @@ -703,6 +782,7 @@ static gint ett_table = -1; static gint ett_table_item = -1; static gint ett_patterns = -1; static gint ett_pattern = -1; +static gint ett_cis_params = -1; static gint proto_btcommon = -1; static gint hf_btcommon_eir_ad_entry = -1; @@ -1281,7 +1361,7 @@ value_string_ext bthci_cmd_ocf_testing_vals_ext = VALUE_STRING_EXT_INIT(bthci_cm #define LOW_ENERGY_VALS(base)\ /* Bluetooth Core 4.0 */ \ { (base) | 0x001, "LE Set Event Mask" }, \ - { (base) | 0x002, "LE Read Buffer Size" }, \ + { (base) | 0x002, "LE Read Buffer Size [v1]" }, \ { (base) | 0x003, "LE Read Local Supported Features" }, \ { (base) | 0x005, "LE Set Random Address" }, \ { (base) | 0x006, "LE Set Advertising Parameters" }, \ @@ -1377,7 +1457,37 @@ value_string_ext bthci_cmd_ocf_testing_vals_ext = VALUE_STRING_EXT_INIT(bthci_cm { (base) | 0x05C, "LE Set Periodic Advertising Sync Transfer Parameters" }, \ { (base) | 0x05D, "LE Set Default Periodic Advertising Sync Transfer Parameters" }, \ { (base) | 0x05E, "LE Generate DHKey [v2]" }, \ - { (base) | 0x05F, "LE Modify Sleep Clock Accuracy" } + { (base) | 0x05F, "LE Modify Sleep Clock Accuracy" }, \ +/* Bluetooth Core 5.2 */ \ + { (base) | 0x060, "LE Read Buffer Size [v2]" }, \ + { (base) | 0x061, "LE Read ISO Tx Sync" }, \ + { (base) | 0x062, "LE Set CIG Parameters" }, \ + { (base) | 0x063, "LE Set CIG Parameters Test" }, \ + { (base) | 0x064, "LE Create CIS" }, \ + { (base) | 0x065, "LE Remove CIG" }, \ + { (base) | 0x066, "LE Accept CIS Request" }, \ + { (base) | 0x067, "LE Reject CIS Request" }, \ + { (base) | 0x068, "LE Create BIG" }, \ + { (base) | 0x069, "LE Create BIG Test" }, \ + { (base) | 0x06A, "LE Terminate BIG" }, \ + { (base) | 0x06B, "LE BIG Create Sync" }, \ + { (base) | 0x06C, "LE BIG Terminate Sync" }, \ + { (base) | 0x06D, "LE Request Peer SCA" }, \ + { (base) | 0x06E, "LE Setup ISO Data Path" }, \ + { (base) | 0x06F, "LE Remove ISO Data Path" }, \ + { (base) | 0x070, "LE ISO Transmit Test" }, \ + { (base) | 0x071, "LE ISO Receive Test" }, \ + { (base) | 0x072, "LE ISO Read Test Counters" }, \ + { (base) | 0x073, "LE ISO Test End" }, \ + { (base) | 0x074, "LE Set Host Feature" }, \ + { (base) | 0x075, "LE Read ISO Link Quality" }, \ + { (base) | 0x076, "LE Enhanced Read Transmit Power Level" }, \ + { (base) | 0x077, "LE Read Remote Transmit Power Level" }, \ + { (base) | 0x078, "LE Set Path Loss Reporting Parameters" }, \ + { (base) | 0x079, "LE Set Path Loss Reporting Enable" }, \ + { (base) | 0x07A, "LE Set Transmit Power Reporting Enable" }, \ + { (base) | 0x07B, "LE Transmitter Test [v4]" } + static const value_string bthci_cmd_ocf_low_energy_vals[] = { LOW_ENERGY_VALS(0x0), { 0, NULL } @@ -1467,6 +1577,7 @@ static const value_string bthci_cmd_status_vals[] = { {0x42, "Unknown Advertising Identifier"}, {0x43, "Limit Reached"}, {0x44, "Operation Cancelled by Host"}, + {0x45, "Packet Too Long"}, {0, NULL } }; value_string_ext bthci_cmd_status_vals_ext = VALUE_STRING_EXT_INIT(bthci_cmd_status_vals); @@ -2223,6 +2334,7 @@ static const value_string cmd_le_adv_data_operation[] = { { 0x01, "First fragment of fragmented data" }, { 0x02, "Last fragment of fragmented data" }, { 0x03, "Complete scan response data" }, + { 0x04, "Unchanged Data, DID update only" }, { 0, NULL } }; @@ -2257,6 +2369,7 @@ static const value_string cmd_cte_type_vals[] = { { 0x00, "AoA Constant Tone Extension" }, { 0x01, "AoD Constant Tone Extension with 1 usec slots" }, { 0x02, "AoD Constant Tone Extension with 2 usec slots" }, + { 0xFF, "No Constant Tone Extension" }, { 0, NULL } }; value_string_ext bthci_cmd_cte_type_vals_ext = VALUE_STRING_EXT_INIT(cmd_cte_type_vals); @@ -2287,6 +2400,59 @@ static const value_string cmd_sca_action_vals[] = { { 0, NULL } }; +static const value_string cmd_clock_accuray_vals[] = { + { 0x00, "251-500 ppm" }, + { 0x01, "151-250 ppm" }, + { 0x02, "101-150 ppm" }, + { 0x03, "76-100 ppm" }, + { 0x04, "51-75 ppm" }, + { 0x05, "31-50 ppm" }, + { 0x06, "21-30 ppm" }, + { 0x07, "0-20 ppm" }, + { 0, NULL } +}; +value_string_ext bthci_cmd_clock_accuray_vals_ext = VALUE_STRING_EXT_INIT(cmd_clock_accuray_vals); + +static const value_string cmd_packing_vals[] = { + { 0x00, "Sequential" }, + { 0x01, "Interleaved" }, + { 0, NULL } +}; + +static const value_string cmd_framing_vals[] = { + { 0x00, "Unframed" }, + { 0x01, "Framed" }, + { 0, NULL } +}; +value_string_ext bthci_cmd_framing_vals_ext = VALUE_STRING_EXT_INIT(cmd_framing_vals); + +static const value_string cmd_data_path_direction_vals[] = { + { 0x00, "Input (Host to Controller)" }, + { 0x01, "Output (Controller to Host)" }, + { 0, NULL } +}; + +static const value_string cmd_payload_type_vals[] = { + { 0x00, "Zero Length" }, + { 0x01, "Variable Length" }, + { 0x02, "Maximum Length" }, + { 0, NULL } +}; + +static const value_string cmd_host_enabled_feature_bit_vals[] = { + { 32, "Isochronous Channels, Host Support" }, + { 0, NULL } +}; + +static const value_string cmd_phy_and_coding_vals[] = { + { 0x01, "LE 1M" }, + { 0x02, "LE 2M" }, + { 0x03, "LE Coded, S=8" }, + { 0x04, "LE Coded, S=2" }, + { 0, NULL } +}; +value_string_ext bthci_cmd_phy_and_coding_vals_ext = VALUE_STRING_EXT_INIT(cmd_phy_and_coding_vals); + static const value_string disable_enable_vals[] = { { 0x00, "Disable" }, { 0x01, "Enable" }, @@ -4365,6 +4531,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, case 0x0016: /* LE Read Remote Features */ case 0x001b: /* LE Long Term Key Request Negative Reply */ case 0x0030: /* LE Read PHY */ + case 0x006D: /* LE Request Peer SCA */ proto_tree_add_item(tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset+=2; break; @@ -4433,7 +4600,8 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, offset+=2; break; - case 0x0021: /* LE Remote Connection Parameter Request Negative Reply */ + case 0x0021: /* LE Remote Connection Parameter Request Negative Reply */ + case 0x0067: /* LE Reject CIS Request */ proto_tree_add_item(tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset+=2; proto_tree_add_item(tree, hf_bthci_cmd_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN); @@ -4689,14 +4857,14 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, proto_tree_add_item(tree, hf_bthci_cmd_le_scan_filter_policy, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; scanning_phys = tvb_get_guint8(tvb, offset); - proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_cmd_le_scan_phys, ett_scan_init_phy_param, hfx_btcmd_le_scan_phys, ENC_NA); + proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_cmd_le_scan_phys, ett_phy_param, hfx_btcmd_le_scan_phys, ENC_NA); offset += 1; for (int i = 1; i < 0x08; i <<=1) { phy++; if (scanning_phys & i) { sub_item = proto_tree_add_none_format(tree, hf_bthci_cmd_le_scan_phy_param, tvb, offset, 5, "Scanning PHY: %s", val_to_str_const(phy, cmd_le_phy_vals, "Unknown")); - sub_tree = proto_item_add_subtree(sub_item, ett_scan_init_phy_param); + sub_tree = proto_item_add_subtree(sub_item, ett_phy_param); proto_tree_add_item(sub_tree, hf_bthci_cmd_le_scan_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; item = proto_tree_add_item(sub_tree, hf_bthci_cmd_le_scan_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN); @@ -4734,14 +4902,14 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, offset++; offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL); initiating_phys = tvb_get_guint8(tvb, offset); - proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_cmd_le_init_phys, ett_scan_init_phy_param, hfx_btcmd_le_phys, ENC_NA); + proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_cmd_le_init_phys, ett_phy_param, hfx_btcmd_le_phys, ENC_NA); offset += 1; for (int i = 1; i < 0x08; i <<=1) { phy++; if (initiating_phys & i) { sub_item = proto_tree_add_none_format(tree, hf_bthci_cmd_le_init_phy_param, tvb, offset, 16, "Initiating PHY: %s", val_to_str_const(phy, cmd_le_phy_vals, "Unknown")); - sub_tree = proto_item_add_subtree(sub_item, ett_scan_init_phy_param); + sub_tree = proto_item_add_subtree(sub_item, ett_phy_param); item = proto_tree_add_item(sub_tree, hf_bthci_cmd_le_scan_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset)*0.625); offset+=2; @@ -4986,7 +5154,336 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, offset++; break; - case 0x0002: /* LE Read Buffer Size */ + case 0x0061: /* LE Read ISO Tx Sync */ + case 0x0072: /* LE ISO Read Test Counters */ + case 0x0073: /* LE ISO Test End */ + case 0x0075: /* LE Read ISO Link Quality */ + proto_tree_add_item(tree, hf_bthci_cmd_cis_bis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + break; + + case 0x0062: /* LE Set CIG Parameters */ + { + guint8 cis_count; + proto_tree_add_item(tree, hf_bthci_cmd_cig_id, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_sdu_interval_m_to_s, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset+=3; + proto_tree_add_item(tree, hf_bthci_cmd_sdu_interval_s_to_m, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset+=3; + proto_tree_add_item(tree, hf_bthci_cmd_slaves_clock_accuracy, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_packing, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_framing, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_max_transport_latency_m_to_s, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_max_transport_latency_s_to_m, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_cis_count, tvb, offset, 1, ENC_NA); + cis_count = tvb_get_guint8(tvb, offset); + offset++; + + for (int i = 0; i < cis_count; i++) { + sub_item = proto_tree_add_none_format(tree, hf_bthci_cmd_cis_params, tvb, offset, 9, "CIS Parameters, CIS Id: 0x%x", tvb_get_guint8(tvb, offset)); + sub_tree = proto_item_add_subtree(sub_item, ett_cis_params); + proto_tree_add_item(sub_tree, hf_bthci_cmd_cis_id, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(sub_tree, hf_bthci_cmd_max_sdu_m_to_s, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(sub_tree, hf_bthci_cmd_max_sdu_s_to_m, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_bitmask(sub_tree, tvb, offset, hf_bthci_cmd_phy_m_to_s, ett_phy_param, hfx_btcmd_le_phys, ENC_NA); + offset++; + proto_tree_add_bitmask(sub_tree, tvb, offset, hf_bthci_cmd_phy_s_to_m, ett_phy_param, hfx_btcmd_le_phys, ENC_NA); + offset++; + proto_tree_add_item(sub_tree, hf_bthci_cmd_rtn_m_to_s, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(sub_tree, hf_bthci_cmd_rtn_s_to_m, tvb, offset, 1, ENC_NA); + offset++; + } + } + break; + + case 0x0063: /* LE Set CIG Parameters Test */ + { + guint8 cis_count; + proto_tree_add_item(tree, hf_bthci_cmd_cig_id, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_sdu_interval_m_to_s, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset+=3; + proto_tree_add_item(tree, hf_bthci_cmd_sdu_interval_s_to_m, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset+=3; + item = proto_tree_add_item(tree, hf_bthci_cmd_ft_m_to_s, tvb, offset, 1, ENC_NA); + proto_item_append_text(item, " ISO Intervals"); + offset++; + item = proto_tree_add_item(tree, hf_bthci_cmd_ft_s_to_m, tvb, offset, 1, ENC_NA); + proto_item_append_text(item, " ISO Intervals"); + offset++; + item = proto_tree_add_item(tree, hf_bthci_cmd_iso_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset) * 1.25); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_slaves_clock_accuracy, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_packing, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_framing, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_cis_count, tvb, offset, 1, ENC_NA); + cis_count = tvb_get_guint8(tvb, offset); + offset++; + + for (int i = 0; i < cis_count; i++) { + sub_item = proto_tree_add_none_format(tree, hf_bthci_cmd_cis_params, tvb, offset, 14, "CIS Parameters, CIS Id: 0x%x", tvb_get_guint8(tvb, offset)); + sub_tree = proto_item_add_subtree(sub_item, ett_cis_params); + proto_tree_add_item(sub_tree, hf_bthci_cmd_cis_id, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(sub_tree, hf_bthci_cmd_nse, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(sub_tree, hf_bthci_cmd_max_sdu_m_to_s, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(sub_tree, hf_bthci_cmd_max_sdu_s_to_m, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(sub_tree, hf_bthci_cmd_max_pdu_m_to_s, tvb, offset, 2, ENC_NA); + offset+=2; + proto_tree_add_item(sub_tree, hf_bthci_cmd_max_pdu_s_to_m, tvb, offset, 2, ENC_NA); + offset+=2; + proto_tree_add_bitmask(sub_tree, tvb, offset, hf_bthci_cmd_phy_m_to_s, ett_phy_param, hfx_btcmd_le_phys, ENC_NA); + offset++; + proto_tree_add_bitmask(sub_tree, tvb, offset, hf_bthci_cmd_phy_s_to_m, ett_phy_param, hfx_btcmd_le_phys, ENC_NA); + offset++; + item = proto_tree_add_item(sub_tree, hf_bthci_cmd_bn_m_to_s, tvb, offset, 1, ENC_NA); + if (tvb_get_guint8(tvb, offset) == 0) + proto_item_append_text(item, " (No data)"); + offset++; + proto_tree_add_item(sub_tree, hf_bthci_cmd_bn_s_to_m, tvb, offset, 1, ENC_NA); + if (tvb_get_guint8(tvb, offset) == 0) + proto_item_append_text(item, " (No data)"); + offset++; + } + } + break; + + case 0x0064: /* LE Create CIS */ + { + guint8 cis_count; + proto_tree_add_item(tree, hf_bthci_cmd_cis_count, tvb, offset, 1, ENC_NA); + cis_count = tvb_get_guint8(tvb, offset); + offset++; + for (int i = 0; i < cis_count; i++) { + sub_item = proto_tree_add_none_format(tree, hf_bthci_cmd_cis_params, tvb, offset, 4, "CIS Handle: 0x%03x, Connection Handle: 0x%03x", + tvb_get_letohs(tvb, offset), tvb_get_letohs(tvb, offset+2)); + sub_tree = proto_item_add_subtree(sub_item, ett_cis_params); + proto_tree_add_item(sub_tree, hf_bthci_cmd_cis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(sub_tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + } + } + break; + + case 0x0065: /* LE Remove CIG */ + proto_tree_add_item(tree, hf_bthci_cmd_cig_id, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x0066: /* LE Accept CIS Request */ + proto_tree_add_item(tree, hf_bthci_cmd_cis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + break; + + case 0x0068: /* LE Create BIG */ + proto_tree_add_item(tree, hf_bthci_cmd_big_handle, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_advertising_handle, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_num_bis, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_sdu_interval, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset+=3; + proto_tree_add_item(tree, hf_bthci_cmd_max_sdu, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_max_transport_latency, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_rtn, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_cmd_phy, ett_phy_param, hfx_btcmd_le_phys, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_packing, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_framing, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_encryption, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_broadcast_code, tvb, offset, 16, ENC_NA); + offset+=16; + break; + + case 0x0069: /* LE Create BIG Test */ + proto_tree_add_item(tree, hf_bthci_cmd_big_handle, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_advertising_handle, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_num_bis, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_sdu_interval, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset+=3; + item = proto_tree_add_item(tree, hf_bthci_cmd_iso_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset) * 1.25); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_nse, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_max_sdu, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_max_pdu, tvb, offset, 2, ENC_NA); + offset+=2; + proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_cmd_phy, ett_phy_param, hfx_btcmd_le_phys, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_packing, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_framing, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_bn, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_irc, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_pto, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_encryption, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_broadcast_code, tvb, offset, 16, ENC_NA); + offset+=16; + break; + + case 0x006A: /* LE Terminate BIG */ + proto_tree_add_item(tree, hf_bthci_cmd_big_handle, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_reason, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x006B: /* LE BIG Create Sync */ + { + guint8 num_bis; + + proto_tree_add_item(tree, hf_bthci_cmd_big_handle, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_sync_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_encryption, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_broadcast_code, tvb, offset, 16, ENC_NA); + offset+=16; + proto_tree_add_item(tree, hf_bthci_cmd_mse, tvb, offset, 1, ENC_NA); + offset++; + item = proto_tree_add_item(tree, hf_bthci_cmd_sync_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g sec)", tvb_get_letohs(tvb, offset)*0.01); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_num_bis, tvb, offset, 1, ENC_NA); + num_bis = tvb_get_guint8(tvb, offset); + offset++; + for (int i = 0; i < num_bis; i++) { + proto_tree_add_item(tree, hf_bthci_cmd_bis_index, tvb, offset, 1, ENC_NA); + offset++; + } + } + break; + + case 0x006C: /* LE BIG Terminate Sync */ + proto_tree_add_item(tree, hf_bthci_cmd_big_handle, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x006E: /* LE Setup ISO Data Path */ + { + guint8 codec_length; + const char *str = "Disabled"; + + proto_tree_add_item(tree, hf_bthci_cmd_cis_bis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_data_path_direction, tvb, offset, 1, ENC_NA); + offset++; + item = proto_tree_add_item(tree, hf_bthci_cmd_data_path_id, tvb, offset, 1, ENC_NA); + if (tvb_get_guint8(tvb, offset) == 0) + str = "HCI"; + else if (tvb_get_guint8(tvb, offset) < 0xff) + str = "Logical Channel Number"; + proto_item_append_text(item, " (%s)", str); + offset++; + offset = dissect_coding_format(tree, hf_bthci_cmd_coding_format, tvb, offset, ett_coding_format); + proto_tree_add_item(tree, hf_bthci_cmd_controller_delay, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset+=3; + codec_length = tvb_get_guint8(tvb, offset); + proto_tree_add_item(tree, hf_bthci_cmd_codec_config_length, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_codec_config, tvb, offset, codec_length, ENC_NA); + offset += codec_length; + } + break; + + case 0x006F: /* LE Remove ISO Data Path */ + proto_tree_add_item(tree, hf_bthci_cmd_cis_bis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_data_path_direction, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x0070: /* LE ISO Transmit Test */ + case 0x0071: /* LE ISO Receive Test */ + proto_tree_add_item(tree, hf_bthci_cmd_cis_bis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_payload_type, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x0074: /* LE Set Host Feature */ + proto_tree_add_item(tree, hf_bthci_cmd_feature_bit_number, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_feature_bit_value, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x0076: /* LE Enhanced Read Transmit Power Level */ + case 0x0077: /* LE Read Remote Transmit Power Level */ + proto_tree_add_item(tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_phy_and_coding, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x0078: /* LE Set Path Loss Reporting Parameters */ + proto_tree_add_item(tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_high_threshold, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_high_hysteresis, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_low_threshold, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_low_hysteresis, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_min_time_spent, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + break; + + case 0x0079: /* LE Set Path Loss Reporting Enable */ + proto_tree_add_item(tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_reporting_enable, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x007A: /* LE Set Transmit Power Reporting Enable */ + proto_tree_add_item(tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + proto_tree_add_item(tree, hf_bthci_cmd_local_reporting_enable, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_remote_reporting_enable, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x0002: /* LE Read Buffer Size [v1] */ case 0x0003: /* LE Read Local Supported Features */ case 0x0007: /* LE Read Advertising Channel Tx Power */ case 0x000E: /* LE Create Connection Cancel */ @@ -5009,6 +5506,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, case 0x004B: /* LE Read Transmit Power */ case 0x004C: /* LE Read RF Path Compensation */ case 0x0058: /* LE Read Antenna Information */ + case 0x0060: /* LE Read Buffer Size [v2] */ /* NOTE: No parameters */ break; @@ -6644,9 +7142,59 @@ proto_register_bthci_cmd(void) FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x800000), NULL, HFILL } }, + { &hf_bthci_cmd_le_event_mask_le_cis_established, + { "LE CIS Established", "bthci_cmd.le_event_mask.le_cis_established", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x1000000), + NULL, HFILL } + }, + { &hf_bthci_cmd_le_event_mask_le_cis_request, + { "LE CIS Request", "bthci_cmd.le_event_mask.le_cis_request", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x2000000), + NULL, HFILL } + }, + { &hf_bthci_cmd_le_event_mask_le_create_big_complete, + { "LE Create BIG Complete", "bthci_cmd.le_event_mask.le_create_big_complete", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x4000000), + NULL, HFILL } + }, + { &hf_bthci_cmd_le_event_mask_le_terminate_big_complete, + { "LE Terminate BIG Complete", "bthci_cmd.le_event_mask.le_terminate_big_complete", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x8000000), + NULL, HFILL } + }, + { &hf_bthci_cmd_le_event_mask_le_big_sync_established, + { "LE BIG Sync Established", "bthci_cmd.le_event_mask.le_big_sync_established", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x10000000), + NULL, HFILL } + }, + { &hf_bthci_cmd_le_event_mask_le_big_sync_lost, + { "LE BIG Sync Lost", "bthci_cmd.le_event_mask.le_big_sync_lost", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x20000000), + NULL, HFILL } + }, + { &hf_bthci_cmd_le_event_mask_le_request_peer_sca_complete, + { "LE Request Peer SCA Complete", "bthci_cmd.le_event_mask.le_request_peer_sca_complete", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x40000000), + NULL, HFILL } + }, + { &hf_bthci_cmd_le_event_mask_le_path_loss_threshold, + { "LE Path Loss Threshold", "bthci_cmd.le_event_mask.le_path_loss_threshold", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x80000000), + NULL, HFILL } + }, + { &hf_bthci_cmd_le_event_mask_le_transmit_power_reporting, + { "LE Transmit Power Reporting", "bthci_cmd.le_event_mask.le_transmit_power_reporting", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x100000000), + NULL, HFILL } + }, + { &hf_bthci_cmd_le_event_mask_le_biginfo_advertising_report, + { "LE BIGInfo Advertising Report", "bthci_cmd.le_event_mask.le_biginfo_advertising_report", + FT_BOOLEAN, 64, NULL, G_GUINT64_CONSTANT(0x200000000), + NULL, HFILL } + }, { &hf_bthci_cmd_le_event_mask_le_reserved, { "Reserved", "bthci_cmd.le_event_mask.reserved", - FT_UINT64, BASE_HEX, NULL, G_GUINT64_CONSTANT(0xFFFFFFFFFF000000), + FT_UINT64, BASE_HEX, NULL, G_GUINT64_CONSTANT(0xFFFFFFFC00000000), NULL, HFILL } }, { &hf_bthci_cmd_le_advts_interval_min, @@ -7334,6 +7882,301 @@ proto_register_bthci_cmd(void) FT_UINT8, BASE_HEX, VALS(cmd_sca_action_vals), 0x0, NULL, HFILL } }, + { &hf_bthci_cmd_cig_id, + { "CIG Id", "bthci_cmd.cig_id", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_sdu_interval_m_to_s, + { "SDU Interval Master to Slave", "bthci_cmd.sdu_interval_m_to_s", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_sdu_interval_s_to_m, + { "SDU Interval Slave to Master", "bthci_cmd.sdu_interval_s_to_m", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_sdu_interval, + { "SDU Interval", "bthci_cmd.sdu_interval", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_slaves_clock_accuracy, + { "Slaves Clock Accuracy", "bthci_cmd.slaves_clock_accuracy", + FT_UINT8, BASE_HEX, VALS(cmd_clock_accuray_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_packing, + { "Packing", "bthci_cmd.packing", + FT_UINT8, BASE_HEX, VALS(cmd_packing_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_framing, + { "Framing", "bthci_cmd.framing", + FT_UINT8, BASE_HEX, VALS(cmd_framing_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_ft_m_to_s, + { "Flush Timeout Master to Slave", "bthci_cmd.ft_m_to_s", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_ft_s_to_m, + { "Flush Timeout Slave to Master", "bthci_cmd.ft_s_to_m", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_iso_interval, + { "ISO Interval", "bthci_cmd.iso_interval", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_cis_count, + { "CIS Count", "bthci_cmd.cis_count", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_cis_params, + { "CIS Parameters", "bthci_cmd.cis_params", + FT_NONE, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_cis_id, + { "CIS Id", "bthci_cmd.cis_id", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_nse, + { "Number of Sub-Events", "bthci_cmd.nse", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_max_sdu_m_to_s, + { "Max SDU Master to Slave", "bthci_cmd.max_sdu_m_to_s", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_max_sdu_s_to_m, + { "Max SDU Slave to Master", "bthci_cmd.max_sdu_s_to_m", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_max_sdu, + { "Max SDU", "bthci_cmd.max_sdu", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_max_pdu_m_to_s, + { "Max PDU Master to Slave", "bthci_cmd.max_pdu_m_to_s", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_max_pdu_s_to_m, + { "Max PDU Slave to Master", "bthci_cmd.max_pdu_s_to_m", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_max_pdu, + { "Max PDU", "bthci_cmd.max_pdu", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_phy_m_to_s, + { "PHY Master to Slave", "bthci_cmd.phy_m_to_s", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_phy_s_to_m, + { "PHY Slave to Master", "bthci_cmd.phy_s_to_m", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_bn_m_to_s, + { "Burst Number Master to Slave", "bthci_cmd.bn_m_to_s", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_bn_s_to_m, + { "Burst Number Slave to Master", "bthci_cmd.bn_s_to_m", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_bn, + { "Burst Number", "bthci_cmd.bn", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_max_transport_latency_m_to_s, + { "Max Transport Latency Master to Slave", "bthci_cmd.max_transport_latency_m_to_s", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_milliseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_max_transport_latency_s_to_m, + { "Max Transport Latency Slave to Master", "bthci_cmd.max_transport_latency_s_to_m", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_milliseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_max_transport_latency, + { "Max Transport Latency", "bthci_cmd.max_transport_latency", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_milliseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_rtn_m_to_s, + { "Max Retransmissions Master to Slave", "bthci_cmd.rtn_m_to_s", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_rtn_s_to_m, + { "Max Retransmissions Slave to Master", "bthci_cmd.rtn_s_to_m", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_rtn, + { "Max Retransmissions", "bthci_cmd.rtn", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_cis_handle, + { "CIS Handle", "bthci_cmd.cis_handle", + FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_big_handle, + { "BIG Handle", "bthci_cmd.big_handle", + FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_cis_bis_handle, + { "CIS/BIS Handle", "bthci_cmd.cis_bis_handle", + FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_num_bis, + { "Number of BISes", "bthci_cmd.num_bis", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_irc, + { "Scheduled Payload Retransmissions", "bthci_cmd.irc", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_pto, + { "Pre-Transmission Offset", "bthci_cmd.pto", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_encryption, + { "Encryption", "bthci_cmd.encryption", + FT_UINT8, BASE_HEX, VALS(disable_enable_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_broadcast_code, + { "Broadcast Code", "bthci_cmd.broadcast_code", + FT_NONE, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_mse, + { "Max Sub-Events", "bthci_cmd.mse", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_bis_index, + { "BIS Index", "bthci_cmd.bis_index", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_sync_timeout, + { "Sync Timeout", "bthci_cmd.sync_timeout", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_data_path_direction, + { "Data Path Direction", "bthci_cmd.data_path_direction", + FT_UINT8, BASE_HEX, VALS(cmd_data_path_direction_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_data_path_id, + { "Data Path Id", "bthci_cmd.data_path_id", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_coding_format, + { "Coding Format", "bthci_cmd.coding_format", + FT_NONE, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_controller_delay, + { "Controller Delay", "bthci_cmd.controller_delay", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_codec_config_length, + { "Codec Configuration Length", "bthci_cmd.codec_config_length", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_codec_config, + { "Codec Configuration", "bthci_cmd.codec_config", + FT_NONE, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_payload_type, + { "Payload Type", "bthci_cmd.payload_type", + FT_UINT8, BASE_HEX, VALS(cmd_payload_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_feature_bit_number, + { "Feature Bit Number", "bthci_cmd.feature_bit_number", + FT_UINT8, BASE_DEC, VALS(cmd_host_enabled_feature_bit_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_feature_bit_value, + { "Feature Bit Value", "bthci_cmd.feature_bit_value", + FT_UINT8, BASE_HEX, VALS(cmd_en_disabled), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_phy_and_coding, + { "PHY", "bthci_cmd.phy_and_coding", + FT_UINT8, BASE_HEX, VALS(cmd_phy_and_coding_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_high_threshold, + { "High Threshold", "bthci_cmd.high_threshold", + FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_decibels, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_high_hysteresis, + { "High Hysteresis", "bthci_cmd.high_hysteresis", + FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_decibels, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_low_threshold, + { "Low Threshold", "bthci_cmd.low_threshold", + FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_decibels, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_low_hysteresis, + { "Low Hysteresis", "bthci_cmd.low_hysteresis", + FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_decibels, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_min_time_spent, + { "Minimum Observation Time", "bthci_cmd.min_time_spent", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_local_reporting_enable, + { "Local Reporting Enable", "bthci_cmd.local_reporting_enable", + FT_UINT8, BASE_HEX, VALS(disable_enable_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_remote_reporting_enable, + { "Remote Reporting Enable", "bthci_cmd.remote_reporting_enable", + FT_UINT8, BASE_HEX, VALS(disable_enable_vals), 0x0, + NULL, HFILL } + }, { &hf_bthci_cmd_triggered_clock_capture, { "Triggered Clock Capture", "bthci_cmd.triggered_clock_capture", FT_UINT8, BASE_HEX, VALS(disable_enable_vals), 0x0, @@ -7826,7 +8669,7 @@ proto_register_bthci_cmd(void) &ett_adv_properties, &ett_adv_sets, &ett_phys_flags, - &ett_scan_init_phy_param, + &ett_phy_param, &ett_sync_cte_type, &ett_coding_format, &ett_packet_type, @@ -7836,7 +8679,8 @@ proto_register_bthci_cmd(void) &ett_table, &ett_table_item, &ett_patterns, - &ett_pattern + &ett_pattern, + &ett_cis_params }; proto_bthci_cmd = proto_register_protocol("Bluetooth HCI Command", "HCI_CMD", "bthci_cmd"); @@ -9583,17 +10427,17 @@ proto_register_btcommon(void) NULL, HFILL } }, { &hf_btcommon_eir_ad_mesh_msg, - { "Mesh message content", "btcommon.eir_ad.entry.mesh_msg", + { "Mesh message content", "btcommon.eir_ad.entry.mesh_msg", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_btcommon_eir_ad_mesh_pbadv, - { "Mesh PB-ADV message content", "btcommon.eir_ad.entry.mesh_pbadv", + { &hf_btcommon_eir_ad_mesh_pbadv, + { "Mesh PB-ADV message content", "btcommon.eir_ad.entry.mesh_pbadv", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_btcommon_eir_ad_mesh_beacon, - { "Mesh Beacon message content", "btcommon.eir_ad.entry.mesh_beacon", + { "Mesh Beacon message content", "btcommon.eir_ad.entry.mesh_beacon", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, diff --git a/epan/dissectors/packet-bthci_cmd.h b/epan/dissectors/packet-bthci_cmd.h index b7ca8c62d7..b975057260 100644 --- a/epan/dissectors/packet-bthci_cmd.h +++ b/epan/dissectors/packet-bthci_cmd.h @@ -34,7 +34,10 @@ extern value_string_ext bthci_cmd_auth_req_vals_ext; extern value_string_ext bthci_cmd_appearance_vals_ext; extern value_string_ext bthci_cmd_le_phy_vals_ext; extern value_string_ext bthci_cmd_cte_type_vals_ext; +extern value_string_ext bthci_cmd_clock_accuray_vals_ext; extern value_string_ext bthci_cmd_slot_durations_vals_ext; +extern value_string_ext bthci_cmd_phy_and_coding_vals_ext; +extern value_string_ext bthci_cmd_framing_vals_ext; extern const value_string bthci_cmd_io_capability_vals[]; extern const value_string bthci_cmd_oob_data_present_vals[]; diff --git a/epan/dissectors/packet-bthci_evt.c b/epan/dissectors/packet-bthci_evt.c index 716b8a3af8..adf2625675 100644 --- a/epan/dissectors/packet-bthci_evt.c +++ b/epan/dissectors/packet-bthci_evt.c @@ -124,6 +124,7 @@ static int hf_bthci_evt_hold_mode_act_page = -1; static int hf_bthci_evt_hold_mode_act_inquiry = -1; static int hf_bthci_evt_hold_mode_act_periodic = -1; static int hf_bthci_evt_transmit_power_level = -1; +static int hf_bthci_evt_max_transmit_power_level = -1; static int hf_bthci_evt_transmit_power_level_gfsk = -1; static int hf_bthci_evt_transmit_power_level_dqpsk = -1; static int hf_bthci_evt_transmit_power_level_8dpsk = -1; @@ -294,6 +295,8 @@ static int hf_bthci_evt_le_supported_host = -1; static int hf_bthci_evt_le_simultaneous_host = -1; static int hf_bthci_evt_le_acl_data_pkt_len = -1; static int hf_bthci_evt_total_num_le_acl_data_pkts = -1; +static int hf_bthci_evt_iso_data_pkt_len = -1; +static int hf_bthci_evt_total_num_iso_data_pkts = -1; static int hf_bthci_evt_white_list_size = -1; static int hf_bthci_evt_le_channel_map = -1; static int hf_bthci_evt_encrypted_data = -1; @@ -384,6 +387,14 @@ static int hf_bthci_evt_le_features_periodic_advertising_sync_transfer_sender = static int hf_bthci_evt_le_features_periodic_advertising_sync_transfer_receiver = -1; static int hf_bthci_evt_le_features_sleep_clock_accuracy_updates = -1; static int hf_bthci_evt_le_features_remote_public_key_validation = -1; +static int hf_bthci_evt_le_features_cis_master = -1; +static int hf_bthci_evt_le_features_cis_slave = -1; +static int hf_bthci_evt_le_features_isochronous_broadcaster = -1; +static int hf_bthci_evt_le_features_synchronized_receiver = -1; +static int hf_bthci_evt_le_features_isochronous_channels_host_support = -1; +static int hf_bthci_evt_le_features_power_control_request = -1; +static int hf_bthci_evt_le_features_power_change_indication = -1; +static int hf_bthci_evt_le_features_path_loss_monitoring = -1; static int hf_bthci_evt_le_features_reserved = -1; static int hf_bthci_evt_mws_number_of_transports = -1; static int hf_bthci_evt_mws_transport_layers = -1; @@ -492,6 +503,56 @@ static int hf_bthci_evt_number_antennae = -1; static int hf_bthci_evt_max_cte_length = -1; static int hf_bthci_evt_max_length_antenna_switching_pattern = -1; static int hf_bthci_evt_max_encryption_key_size = -1; +static int hf_bthci_evt_sdu_packet_seq_num = -1; +static int hf_bthci_evt_sdu_packet_timestamp = -1; +static int hf_bthci_evt_sdu_packet_offset = -1; +static int hf_bthci_evt_cig_id = -1; +static int hf_bthci_evt_cis_id = -1; +static int hf_bthci_evt_cis_count = -1; +static int hf_bthci_evt_cis_handle = -1; +static int hf_bthci_evt_cis_bis_handle = -1; +static int hf_bthci_evt_big_handle = -1; +static int hf_bthci_evt_recived_packet_counter = -1; +static int hf_bthci_evt_missed_packet_counter = -1; +static int hf_bthci_evt_failed_packet_counter = -1; +static int hf_bthci_evt_pkt_count_tx_unacked = -1; +static int hf_bthci_evt_pkt_count_tx_flushed = -1; +static int hf_bthci_evt_pkt_count_tx_last_subevent = -1; +static int hf_bthci_evt_pkt_count_tx_retransmitted = -1; +static int hf_bthci_evt_pkt_count_rx_crc_error = -1; +static int hf_bthci_evt_pkt_count_rx_unreceived = -1; +static int hf_bthci_evt_pkt_count_rx_duplicate = -1; +static int hf_bthci_evt_phy_and_coding = -1; +static int hf_bthci_evt_cig_sync_delay = -1; +static int hf_bthci_evt_big_sync_delay = -1; +static int hf_bthci_evt_cis_sync_delay = -1; +static int hf_bthci_evt_transport_latency_m_to_s = -1; +static int hf_bthci_evt_transport_latency_s_to_m = -1; +static int hf_bthci_evt_big_transport_latency = -1; +static int hf_bthci_evt_phy_m_to_s = -1; +static int hf_bthci_evt_phy_s_to_m = -1; +static int hf_bthci_evt_bn_m_to_s = -1; +static int hf_bthci_evt_bn_s_to_m = -1; +static int hf_bthci_evt_ft_m_to_s = -1; +static int hf_bthci_evt_ft_s_to_m = -1; +static int hf_bthci_evt_max_pdu_m_to_s = -1; +static int hf_bthci_evt_max_pdu_s_to_m = -1; +static int hf_bthci_evt_phy = -1; +static int hf_bthci_evt_nse = -1; +static int hf_bthci_evt_bn = -1; +static int hf_bthci_evt_pto = -1; +static int hf_bthci_evt_irc = -1; +static int hf_bthci_evt_max_pdu = -1; +static int hf_bthci_evt_iso_interval = -1; +static int hf_bthci_evt_num_bis = -1; +static int hf_bthci_evt_bis_handle = -1; +static int hf_bthci_evt_current_path_loss = -1; +static int hf_bthci_evt_zone_entered = -1; +static int hf_bthci_evt_power_report_reason = -1; +static int hf_bthci_evt_power_level_delta = -1; +static int hf_bthci_evt_max_sdu = -1; +static int hf_bthci_evt_framing = -1; +static int hf_bthci_evt_peer_clock_accuracy = -1; static int hf_packet_type_acl = -1; static int hf_packet_type_acl_dh5 = -1; static int hf_packet_type_acl_dm5 = -1; @@ -543,6 +604,14 @@ static const int *hfx_bthci_evt_le_features[] = { &hf_bthci_evt_le_features_periodic_advertising_sync_transfer_receiver, &hf_bthci_evt_le_features_sleep_clock_accuracy_updates, &hf_bthci_evt_le_features_remote_public_key_validation, + &hf_bthci_evt_le_features_cis_master, + &hf_bthci_evt_le_features_cis_slave, + &hf_bthci_evt_le_features_isochronous_broadcaster, + &hf_bthci_evt_le_features_synchronized_receiver, + &hf_bthci_evt_le_features_isochronous_channels_host_support, + &hf_bthci_evt_le_features_power_control_request, + &hf_bthci_evt_le_features_power_change_indication, + &hf_bthci_evt_le_features_path_loss_monitoring, &hf_bthci_evt_le_features_reserved, NULL }; @@ -632,6 +701,18 @@ static const int *hfx_bthci_evt_simple_pairing_options[] = { NULL }; +static int hf_bthci_evt_transmit_power_level_flags = -1; +static int hf_bthci_evt_transmit_power_level_flags_minimum_power = -1; +static int hf_bthci_evt_transmit_power_level_flags_maximum_power = -1; +static int hf_bthci_evt_transmit_power_level_flags_reserved = -1; + +static const int *hfx_bthci_evt_transmit_power_level_flags[] = { + &hf_bthci_evt_transmit_power_level_flags_minimum_power, + &hf_bthci_evt_transmit_power_level_flags_maximum_power, + &hf_bthci_evt_transmit_power_level_flags_reserved, + NULL +}; + /* Initialize the subtree pointers */ static gint ett_bthci_evt = -1; static gint ett_opcode = -1; @@ -654,6 +735,7 @@ static gint ett_iq_sample_list = -1; static gint ett_iq_samples = -1; static gint ett_simple_pairing_options = -1; static gint ett_supported_switching_sample_rates = -1; +static gint ett_transmit_power_level_flags = -1; extern value_string_ext ext_usb_vendors_vals; extern value_string_ext ext_usb_products_vals; @@ -808,6 +890,7 @@ const value_string bthci_evt_lmp_version[] = { {0x08, "4.2"}, {0x09, "5.0"}, {0x0a, "5.1"}, + {0x0b, "5.2"}, {0, NULL } }; @@ -826,6 +909,7 @@ const value_string bthci_evt_hci_version[] = { {0x08, "4.2"}, {0x09, "5.0"}, {0x0a, "5.1"}, + {0x0b, "5.2"}, {0, NULL } }; @@ -985,6 +1069,16 @@ static const value_string evt_le_meta_subevent[] = { { 0x16, "LE Connection IQ Report" }, { 0x17, "LE CTE Request Failed" }, { 0x18, "LE Periodic Advertising Sync Transfer Received" }, + { 0x19, "LE CIS Established" }, + { 0x1A, "LE CIS Request" }, + { 0x1B, "LE Create BIG Complete" }, + { 0x1C, "LE Terminate BIG Complete" }, + { 0x1D, "LE BIG Sync Established" }, + { 0x1E, "LE BIG Sync Lost" }, + { 0x1F, "LE Request Peer SCA Complete" }, + { 0x20, "LE Path Loss Threshold" }, + { 0x21, "LE Transmit Power Reporting" }, + { 0x22, "LE BIGInfo Advertising Report" }, { 0, NULL } }; @@ -997,18 +1091,6 @@ static const value_string evt_le_advertising_evt_types[] = { { 0, NULL } }; -static const value_string evt_master_clock_accuray[] = { - { 0x00, "500 ppm" }, - { 0x01, "250 ppm" }, - { 0x02, "150 ppm" }, - { 0x03, "100 ppm" }, - { 0x04, "75 ppm" }, - { 0x05, "50 ppm" }, - { 0x06, "30 ppm" }, - { 0x07, "20 ppm" }, - { 0, NULL } -}; - static const value_string evt_air_mode_vals[] = { { 0x00, UTF8_MICRO_SIGN "-law log" }, { 0x01, "A-law log" }, @@ -1101,6 +1183,20 @@ static const value_string packet_status_vals[] = { { 0, NULL } }; +static const value_string zone_entered_vals[] = { + { 0x00, "Low" }, + { 0x01, "Medium" }, + { 0x02, "High" }, + { 0, NULL } +}; + +static const value_string power_report_reason_vals[] = { + { 0x00, "Local Transmit Power Changed" }, + { 0x01, "Remote Transmit Power Changed" }, + { 0x02, "Host Requested Read Command Completed" }, + { 0, NULL } +}; + static const unit_name_string units_number_events = { " (number events)", NULL }; @@ -2826,7 +2922,7 @@ dissect_bthci_evt_le_meta(tvbuff_t *tvb, int offset, packet_info *pinfo, if (tvb_get_guint8(tvb, offset) == 127) proto_item_append_text(item, " (not available)"); offset += 1; - /* Unused/reserved byte */ + proto_tree_add_item(tree, hf_bthci_evt_cte_type, tvb, offset, 1, ENC_NA); offset += 1; proto_tree_add_item(tree, hf_bthci_evt_data_status, tvb, offset, 1, ENC_NA); offset += 1; @@ -2941,6 +3037,205 @@ dissect_bthci_evt_le_meta(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree_add_item(tree, hf_bthci_evt_advertiser_clock_accuracy, tvb, offset, 1, ENC_NA); offset += 1; break; + case 0x19: /* LE CIS Established */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + status = tvb_get_guint8(tvb, offset); + send_hci_summary_status_tap(status, pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_cig_sync_delay, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset += 3; + proto_tree_add_item(tree, hf_bthci_evt_cis_sync_delay, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset += 3; + proto_tree_add_item(tree, hf_bthci_evt_transport_latency_m_to_s, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset += 3; + proto_tree_add_item(tree, hf_bthci_evt_transport_latency_s_to_m, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset += 3; + proto_tree_add_item(tree, hf_bthci_evt_phy_m_to_s, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_phy_s_to_m, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_nse, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_bn_m_to_s, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_bn_s_to_m, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_ft_m_to_s, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_ft_s_to_m, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_max_pdu_m_to_s, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_max_pdu_s_to_m, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + item = proto_tree_add_item(tree, hf_bthci_evt_iso_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset) * 1.25); + offset += 2; + break; + case 0x1A: /* LE CIS Request */ + proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_cis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_cig_id, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cis_id, tvb, offset, 1, ENC_NA); + offset += 1; + break; + case 0x1B: /* LE Create BIG Complete */ + { + guint8 num_bis; + + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + status = tvb_get_guint8(tvb, offset); + send_hci_summary_status_tap(status, pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_big_handle, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_big_sync_delay, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset += 3; + proto_tree_add_item(tree, hf_bthci_evt_big_transport_latency, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset += 3; + proto_tree_add_item(tree, hf_bthci_evt_phy, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_nse, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_bn, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_pto, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_irc, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_max_pdu, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + item = proto_tree_add_item(tree, hf_bthci_evt_iso_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset) * 1.25); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_num_bis, tvb, offset, 1, ENC_NA); + num_bis = tvb_get_guint8(tvb, offset); + offset += 1; + while (num_bis) { + proto_tree_add_item(tree, hf_bthci_evt_bis_handle, tvb, offset, 2, ENC_NA); + offset += 2; + num_bis -= 1; + } + } + break; + case 0x1C: /* LE Terminate BIG Complete */ + case 0x1E: /* LE BIG Sync Lost */ + proto_tree_add_item(tree, hf_bthci_evt_big_handle, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_reason, tvb, offset, 1, ENC_NA); + send_hci_summary_reason_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + break; + case 0x1D: /* LE BIG Sync Established */ + { + guint8 num_bis; + + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + status = tvb_get_guint8(tvb, offset); + send_hci_summary_status_tap(status, pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_big_handle, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_big_transport_latency, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset += 3; + proto_tree_add_item(tree, hf_bthci_evt_phy, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_nse, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_bn, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_pto, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_irc, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_max_pdu, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + item = proto_tree_add_item(tree, hf_bthci_evt_iso_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset) * 1.25); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_num_bis, tvb, offset, 1, ENC_NA); + num_bis = tvb_get_guint8(tvb, offset); + offset += 1; + while (num_bis) { + proto_tree_add_item(tree, hf_bthci_evt_bis_handle, tvb, offset, 2, ENC_NA); + offset += 2; + num_bis -= 1; + } + } + break; + case 0x1F: /* LE Request Peer SCA Complete */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + status = tvb_get_guint8(tvb, offset); + send_hci_summary_status_tap(status, pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_peer_clock_accuracy, tvb, offset, 1, ENC_NA); + offset += 1; + break; + case 0x20: /* LE Path Loss Threshold */ + proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_current_path_loss, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_zone_entered, tvb, offset, 1, ENC_NA); + offset += 1; + break; + case 0x21: /* LE Transmit Power Reporting */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + status = tvb_get_guint8(tvb, offset); + send_hci_summary_status_tap(status, pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_power_report_reason, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_phy_and_coding, tvb, offset, 1, ENC_NA); + offset += 1; + item = proto_tree_add_item(tree, hf_bthci_evt_transmit_power_level, tvb, offset, 1, ENC_LITTLE_ENDIAN); + if (tvb_get_guint8(tvb, offset) == 0x7f) + proto_item_append_text(item, " (Not Available)"); + else if (tvb_get_guint8(tvb, offset) == 0x7e) + proto_item_append_text(item, " (Peer Not Managing Power Level on PHY)"); + offset += 1; + proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_evt_transmit_power_level_flags, + ett_transmit_power_level_flags, hfx_bthci_evt_transmit_power_level_flags, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_power_level_delta, tvb, offset, 1, ENC_NA); + offset += 1; + break; + case 0x22: /* LE BIGInfo Advertising Report */ + proto_tree_add_item(tree, hf_bthci_evt_sync_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_num_bis, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_nse, tvb, offset, 1, ENC_NA); + offset += 1; + item = proto_tree_add_item(tree, hf_bthci_evt_iso_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset) * 1.25); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_bn, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_pto, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_irc, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_max_pdu, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_max_sdu, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset += 3; + proto_tree_add_item(tree, hf_bthci_evt_phy, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_framing, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_encryption_mode, tvb, offset, 1, ENC_NA); + offset += 1; + break; default: break; } @@ -3377,6 +3672,7 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset, case 0x2059: /* LE Set Periodic Advertising Receive Enable */ case 0x205D: /* LE Set Default Periodic Advertising Sync Transfer Parameters */ case 0x205F: /* LE Modify Sleep Clock Accuracy */ + case 0x2074: /* LE Set Host Feature */ proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN); send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); offset += 1; @@ -3475,6 +3771,9 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset, case 0x205A: /* LE Periodic Advertising Sync Transfer */ case 0x205B: /* LE Periodic Advertising Set Info Transfer */ case 0x205C: /* LE Set Periodic Advertising Sync Transfer Parameters */ + case 0x2078: /* LE Set Path Loss Reporting Parameters */ + case 0x2079: /* LE Set Path Loss Reporting Enable */ + case 0x207a: /* LE Set Transmit Power Reporting Enable */ proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN); send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); offset += 1; @@ -4661,20 +4960,13 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset, offset += 1; break; - case 0x2002: /* LE Read Buffer Size */ - proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN); + case 0x2002: /* LE Read Buffer Size [v1] */ + case 0x2060: /* LE Read Buffer Size [v2] */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); status = tvb_get_guint8(tvb, offset); send_hci_summary_status_tap(status, pinfo, bluetooth_data); offset += 1; - item = proto_tree_add_item(tree, hf_bthci_evt_le_acl_data_pkt_len, tvb, offset, 2, ENC_LITTLE_ENDIAN); - if ( (tvb_get_letohs(tvb, offset) == 0) && (tvb_get_guint8(tvb, offset+2) == 0) ) - proto_item_append_text(item, " (buffers shared between BR/EDR and LE) "); - offset += 2; - - proto_tree_add_item(tree, hf_bthci_evt_total_num_le_acl_data_pkts, tvb, offset, 1, ENC_LITTLE_ENDIAN); - offset += 1; - if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) { bluetooth_device_tap_t *tap_device; @@ -4689,11 +4981,30 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset, tap_device->has_bd_addr = FALSE; tap_device->is_local = TRUE; tap_device->type = BLUETOOTH_DEVICE_LE_MTU; - tap_device->data.le_mtus.acl_mtu = tvb_get_guint16(tvb, offset - 3, ENC_LITTLE_ENDIAN); - tap_device->data.le_mtus.acl_packets = tvb_get_guint8(tvb, offset - 1); + tap_device->data.le_mtus.acl_mtu = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN); + tap_device->data.le_mtus.acl_packets = tvb_get_guint8(tvb, offset + 2); + if (opcode == 0x2060) { /* LE Read Buffer Size [v2] */ + tap_device->data.le_mtus.iso_mtu = tvb_get_guint16(tvb, offset + 3, ENC_LITTLE_ENDIAN); + tap_device->data.le_mtus.iso_packets = tvb_get_guint8(tvb, offset + 5); + } tap_queue_packet(bluetooth_device_tap, pinfo, tap_device); } + item = proto_tree_add_item(tree, hf_bthci_evt_le_acl_data_pkt_len, tvb, offset, 2, ENC_LITTLE_ENDIAN); + if ( (tvb_get_letohs(tvb, offset) == 0) && (tvb_get_guint8(tvb, offset+2) == 0) ) + proto_item_append_text(item, " (buffers shared between BR/EDR and LE) "); + offset += 2; + + proto_tree_add_item(tree, hf_bthci_evt_total_num_le_acl_data_pkts, tvb, offset, 1, ENC_NA); + offset += 1; + + if (opcode == 0x2060) { /* LE Read Buffer Size [v2] */ + proto_tree_add_item(tree, hf_bthci_evt_iso_data_pkt_len, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_total_num_iso_data_pkts, tvb, offset, 1, ENC_NA); + offset += 1; + } + break; case 0x2003: /* LE Read Local Supported Features */ @@ -5122,8 +5433,127 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset, offset += 1; proto_tree_add_item(tree, hf_bthci_evt_max_cte_length, tvb, offset, 1, ENC_NA); offset += 1; - break; + + case 0x2061: /* LE Read ISO Tx Sync */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cis_bis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_sdu_packet_seq_num, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_sdu_packet_timestamp, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + proto_tree_add_item(tree, hf_bthci_evt_sdu_packet_offset, tvb, offset, 3, ENC_LITTLE_ENDIAN); + offset += 3; + break; + + case 0x2062: /* LE Set CIG Parameters */ + case 0x2063: /* LE Set CIG Parameters Test */ + { + guint8 cis_count; + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cig_id, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cis_count, tvb, offset, 1, ENC_NA); + cis_count = tvb_get_guint8(tvb, offset); + offset += 1; + for (i = 0; i < cis_count; i++) { + proto_tree_add_item(tree, hf_bthci_evt_cis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + } + } + break; + + case 0x2065: /* LE Remove CIG */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cig_id, tvb, offset, 1, ENC_NA); + offset += 1; + break; + + case 0x2067: /* LE Reject CIS Request */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + break; + + case 0x206C: /* LE BIG Terminate Sync */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_big_handle, tvb, offset, 1, ENC_NA); + offset += 1; + break; + + case 0x206E: /* LE Setup ISO Data Path */ + case 0x206F: /* LE Remove ISO Data Path */ + case 0x2070: /* LE ISO Transmit Test */ + case 0x2071: /* LE ISO Receive Test */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cis_bis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + break; + + case 0x2072: /* LE ISO Read Test Counters */ + case 0x2073: /* LE ISO Test End */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cis_bis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_recived_packet_counter, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + proto_tree_add_item(tree, hf_bthci_evt_missed_packet_counter, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + proto_tree_add_item(tree, hf_bthci_evt_failed_packet_counter, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + break; + + case 0x2075: /* LE Read ISO Link Quality */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_cis_bis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_pkt_count_tx_unacked, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + proto_tree_add_item(tree, hf_bthci_evt_pkt_count_tx_flushed, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + proto_tree_add_item(tree, hf_bthci_evt_pkt_count_tx_last_subevent, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + proto_tree_add_item(tree, hf_bthci_evt_pkt_count_tx_retransmitted, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + proto_tree_add_item(tree, hf_bthci_evt_pkt_count_rx_crc_error, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + proto_tree_add_item(tree, hf_bthci_evt_pkt_count_rx_unreceived, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + proto_tree_add_item(tree, hf_bthci_evt_pkt_count_rx_duplicate, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + break; + + case 0x2076: /* LE Enhanced Read Transmit Power Level */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_bthci_evt_phy_and_coding, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_transmit_power_level, tvb, offset, 1, ENC_NA); + offset += 1; + proto_tree_add_item(tree, hf_bthci_evt_max_transmit_power_level, tvb, offset, 1, ENC_NA); + offset += 1; + break; + case 0x0401: /* Inquiry */ case 0x0405: /* Create Connection */ case 0x0406: /* Disconnect */ @@ -5173,6 +5603,14 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset, case 0x2025: /* LE Read Local P-256 Public Key */ case 0x2026: /* LE Generate DHKey [v1] */ case 0x205E: /* LE Generate DHKey [v2] */ + case 0x2064: /* LE Create CIS */ + case 0x2066: /* LE Accept CIS Request */ + case 0x2068: /* LE Create BIG */ + case 0x2069: /* LE Create BIG Test */ + case 0x206A: /* LE Terminate BIG */ + case 0x206B: /* LE BIG Create Sync */ + case 0x206D: /* LE Request Peer SCA */ + case 0x2077: /* LE Read Remote Transmit Power Level */ proto_tree_add_expert(tree, pinfo, &ei_event_unexpected_event, tvb, offset, tvb_captured_length_remaining(tvb, offset)); offset += tvb_reported_length_remaining(tvb, offset); @@ -7397,8 +7835,13 @@ proto_register_bthci_evt(void) "Device can enter low power state", HFILL } }, { &hf_bthci_evt_transmit_power_level, - { "Transmit Power Level (dBm)", "bthci_evt.transmit_power_level", - FT_INT8, BASE_DEC, NULL, 0x0, + { "Transmit Power Level", "bthci_evt.transmit_power_level", + FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_max_transmit_power_level, + { "Maximum Transmit Power Level", "bthci_evt.max_transmit_power_level", + FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0x0, NULL, HFILL } }, { &hf_bthci_evt_num_supp_iac, @@ -7867,6 +8310,16 @@ proto_register_bthci_evt(void) FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_bthci_evt_iso_data_pkt_len, + { "ISO Data Packet Length", "bthci_evt.iso_data_pkt_len", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_total_num_iso_data_pkts, + { "Total Number ISO Data Packets", "bthci_evt.total_num_iso_data_pkts", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, { &hf_bthci_evt_white_list_size, { "White List Size", "bthci_evt.le_white_list_size", FT_UINT8, BASE_DEC, NULL, 0x0, @@ -7964,7 +8417,7 @@ proto_register_bthci_evt(void) }, { &hf_bthci_evt_le_master_clock_accuracy, { "Master Clock Accuracy", "bthci_evt.le_master_clock_accuracy", - FT_UINT8, BASE_HEX, VALS(evt_master_clock_accuray), 0x0, + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_clock_accuray_vals_ext, 0x0, NULL, HFILL } }, { &hf_bthci_evt_num_reports, @@ -8312,9 +8765,49 @@ proto_register_bthci_evt(void) FT_BOOLEAN, 64, NULL, 0x8000000, NULL, HFILL } }, + { &hf_bthci_evt_le_features_cis_master, + { "Connected Isochronous Stream - Master", "bthci_evt.le_features.cis_master", + FT_BOOLEAN, 64, NULL, 0x10000000, + NULL, HFILL } + }, + { &hf_bthci_evt_le_features_cis_slave, + { "Connected Isochronous Stream - Slave", "bthci_evt.le_features.cis_slave", + FT_BOOLEAN, 64, NULL, 0x20000000, + NULL, HFILL } + }, + { &hf_bthci_evt_le_features_isochronous_broadcaster, + { "Isochronous Broadcaster", "bthci_evt.le_features.isochronous_broadcaster", + FT_BOOLEAN, 64, NULL, 0x40000000, + NULL, HFILL } + }, + { &hf_bthci_evt_le_features_synchronized_receiver, + { "Synchronized Receiver", "bthci_evt.le_features.synchronized_receiver", + FT_BOOLEAN, 64, NULL, 0x80000000, + NULL, HFILL } + }, + { &hf_bthci_evt_le_features_isochronous_channels_host_support, + { "Isochronous Channels (Host_support)", "bthci_evt.le_features.isochronous_channels_host_support", + FT_BOOLEAN, 64, NULL, 0x100000000, + NULL, HFILL } + }, + { &hf_bthci_evt_le_features_power_control_request, + { "Power Control Request", "bthci_evt.le_features.power_control_request", + FT_BOOLEAN, 64, NULL, 0x200000000, + NULL, HFILL } + }, + { &hf_bthci_evt_le_features_power_change_indication, + { "Power Change Indication", "bthci_evt.le_features.power_change_indication", + FT_BOOLEAN, 64, NULL, 0x400000000, + NULL, HFILL } + }, + { &hf_bthci_evt_le_features_path_loss_monitoring, + { "Path Loss Monitoring", "bthci_evt.le_features.path_loss_monitoring", + FT_BOOLEAN, 64, NULL, 0x800000000, + NULL, HFILL } + }, { &hf_bthci_evt_le_features_reserved, { "Reserved", "bthci_evt.le_features.reserved", - FT_UINT64, BASE_HEX, NULL, G_GUINT64_CONSTANT(0xFFFFFFFFF0000000), + FT_UINT64, BASE_HEX, NULL, G_GUINT64_CONSTANT(0xFFFFFFF000000000), NULL, HFILL } }, { &hf_bthci_evt_mws_number_of_transports, @@ -8784,7 +9277,7 @@ proto_register_bthci_evt(void) }, { &hf_bthci_evt_advertiser_clock_accuracy, { "Advertiser Clock Accuracy", "bthci_evt.adv_clock_accuracy", - FT_UINT8, BASE_HEX, VALS(evt_master_clock_accuray), 0x0, + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_clock_accuray_vals_ext, 0x0, NULL, HFILL } }, { &hf_bthci_evt_advertiser_phy, @@ -8932,6 +9425,277 @@ proto_register_bthci_evt(void) FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, NULL, HFILL } }, + { &hf_bthci_evt_sdu_packet_seq_num, + { "SDU Packet Sequence Number", "bthci_evt.sdu_packet_seq_num", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_sdu_packet_timestamp, + { "SDU Packet Timestamp", "bthci_evt.sdu_packet_timestamp", + FT_UINT32, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_sdu_packet_offset, + { "SDU Packet Offset", "bthci_evt.sdu_packet_offset", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_cig_id, + { "CIG Id", "bthci_evt.cig_id", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_cis_id, + { "CIS Id", "bthci_evt.cis_id", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_cis_count, + { "CIS Count", "bthci_evt.cis_count", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_cis_handle, + { "CIS Handle", "bthci_evt.cis_handle", + FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_cis_bis_handle, + { "CIS/BIS Handle", "bthci_evt.cis_bis_handle", + FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_big_handle, + { "BIG Handle", "bthci_evt.big_handle", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_recived_packet_counter, + { "Received Packet Counter", "bthci_evt.recived_packet_counter", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_missed_packet_counter, + { "Missed Packet Counter", "bthci_evt.missed_packet_counter", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_failed_packet_counter, + { "Failed Packet Counter", "bthci_evt.failed_packet_counter", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_pkt_count_tx_unacked, + { "Tx UnACKed Packets", "bthci_evt.pkt_count_tx_unacked", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_pkt_count_tx_flushed, + { "Tx Flushed Packets", "bthci_evt.pkt_count_tx_flushed", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_pkt_count_tx_last_subevent, + { "Tx Last Subevent Packets", "bthci_evt.pkt_count_tx_last_subevent", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_pkt_count_tx_retransmitted, + { "Tx Retransmitted Packets", "bthci_evt.pkt_count_tx_retransmitted", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_pkt_count_rx_crc_error, + { "Rx CRC Error Packets", "bthci_evt.pkt_count_rx_crc_error", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_pkt_count_rx_unreceived, + { "Rx Unreceived Packets", "bthci_evt.pkt_count_rx_unreceived", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_pkt_count_rx_duplicate, + { "Rx Duplicate Packets", "bthci_evt.pkt_count_rx_duplicate", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_phy_and_coding, + { "PHY", "bthci_evt.phy_and_coding", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_phy_and_coding_vals_ext, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_cig_sync_delay, + { "CIG Sync Delay", "bthci_evt.cig_sync_delay", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_big_sync_delay, + { "BIG Sync Delay", "bthci_evt.big_sync_delay", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_cis_sync_delay, + { "CIS Sync Delay", "bthci_evt.cis_sync_delay", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_transport_latency_m_to_s, + { "Transport Latency Master to Slave", "bthci_evt.transport_latency_m_to_s", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_transport_latency_s_to_m, + { "Transport Latency Slave to Master", "bthci_evt.transport_latency_s_to_m", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_big_transport_latency, + { "BIG Transport Latency", "bthci_evt.big_transport_latency", + FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_phy_m_to_s, + { "PHY Master to Slave", "bthci_evt.phy_m_to_s", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_le_phy_vals_ext, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_phy_s_to_m, + { "PHY Slave to Master", "bthci_evt.phy_s_to_m", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_le_phy_vals_ext, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_bn_m_to_s, + { "Burst Number Master to Slave", "bthci_evt.bn_m_to_s", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_bn_s_to_m, + { "Burst Number Slave to Master", "bthci_evt.bn_s_to_m", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_ft_m_to_s, + { "Flush Timeout Master to Slave", "bthci_evt.ft_m_to_s", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_ft_s_to_m, + { "Flush Timeout Slave to Master", "bthci_evt.ft_s_to_m", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_max_pdu_m_to_s, + { "Max PDU Master to Slave", "bthci_evt.max_pdu_m_to_s", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_max_pdu_s_to_m, + { "Max PDU Slave to Master", "bthci_evt.max_pdu_s_to_m", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_phy, + { "PHY", "bthci_evt.phy", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_le_phy_vals_ext, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_nse, + { "Number of Sub-Events", "bthci_evt.nse", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_bn, + { "Burst Number", "bthci_evt.bn", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_pto, + { "Pre-Transmission Offset", "bthci_evt.pto", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_irc, + { "Scheduled Payload Retransmissions", "bthci_evt.irc", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_max_pdu, + { "Max PDU", "bthci_evt.max_pdu", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_iso_interval, + { "ISO Interval", "bthci_evt.iso_interval", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_num_bis, + { "Number of BISes", "bthci_evt.num_bis", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_bis_handle, + { "BIS Handle", "bthci_evt.bis_handle", + FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_current_path_loss, + { "Current Path Loss", "bthci_evt.current_path_loss", + FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_decibels, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_zone_entered, + { "Zone Entered", "bthci_evt.zone_entered", + FT_UINT8, BASE_HEX, VALS(zone_entered_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_power_report_reason, + { "Reason", "bthci_evt.power_report_reason", + FT_UINT8, BASE_HEX, VALS(power_report_reason_vals), 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_transmit_power_level_flags, + { "Transmit Power Level Flags", "bthci_evt.power_level_flags", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_transmit_power_level_flags_minimum_power, + { "At Minimum Power Level", "bthci_evt.transmit_power_level_flags.minimum_power", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL } + }, + { &hf_bthci_evt_transmit_power_level_flags_maximum_power, + { "At Maximum Power Level", "bthci_evt.transmit_power_level_flags.maximum_power", + FT_BOOLEAN, 8, NULL, 0x02, + NULL, HFILL } + }, + { &hf_bthci_evt_transmit_power_level_flags_reserved, + { "Reserved", "bthci_evt.transmit_power_level_flags.reserved", + FT_UINT8, BASE_HEX, NULL, 0xFC, + NULL, HFILL } + }, + { &hf_bthci_evt_power_level_delta, + { "Transmit Power Delta", "bthci_evt.power_level_delta", + FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_decibels, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_max_sdu, + { "Max SDU", "bthci_evt.max_sdu", + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_framing, + { "Framing", "bthci_evt.framing", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_framing_vals_ext, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_peer_clock_accuracy, + { "Peer Clock Accuracy", "bthci_evt.peer_clock_accuracy", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_clock_accuray_vals_ext, 0x0, + NULL, HFILL } + }, + }; static ei_register_info ei[] = { @@ -8969,7 +9733,8 @@ proto_register_bthci_evt(void) &ett_iq_sample_list, &ett_iq_samples, &ett_simple_pairing_options, - &ett_supported_switching_sample_rates + &ett_supported_switching_sample_rates, + &ett_transmit_power_level_flags }; /* Decode As handling diff --git a/ui/qt/bluetooth_device_dialog.cpp b/ui/qt/bluetooth_device_dialog.cpp index 31d0b189a9..77c4c98328 100644 --- a/ui/qt/bluetooth_device_dialog.cpp +++ b/ui/qt/bluetooth_device_dialog.cpp @@ -51,10 +51,12 @@ static const int row_number_sco_mtu = 14; static const int row_number_sco_packets = 15; static const int row_number_le_acl_mtu = 16; static const int row_number_le_acl_packets = 17; -static const int row_number_inquiry_mode = 18; -static const int row_number_page_timeout = 19; -static const int row_number_simple_pairing_mode = 20; -static const int row_number_voice_setting = 21; +static const int row_number_le_iso_mtu = 18; +static const int row_number_le_iso_packets = 19; +static const int row_number_inquiry_mode = 20; +static const int row_number_page_timeout = 21; +static const int row_number_simple_pairing_mode = 22; +static const int row_number_voice_setting = 23; static tap_packet_status bluetooth_device_tap_packet(void *tapinfo_ptr, packet_info *pinfo, epan_dissect_t *edt, const void* data) @@ -623,6 +625,18 @@ tap_packet_status BluetoothDeviceDialog::tapPacket(void *tapinfo_ptr, packet_inf updateChanges(tableWidget, field, row_number_le_acl_packets, tapinfo->changes, pinfo); item->setText(field); + field = QString::number(tap_device->data.le_mtus.iso_mtu); + item = tableWidget->item(row_number_le_iso_mtu, column_number_value); + saveItemData(item, tap_device, pinfo); + updateChanges(tableWidget, field, row_number_le_iso_mtu, tapinfo->changes, pinfo); + item->setText(field); + + field = QString::number(tap_device->data.le_mtus.iso_packets); + item = tableWidget->item(row_number_le_iso_packets, column_number_value); + saveItemData(item, tap_device, pinfo); + updateChanges(tableWidget, field, row_number_le_iso_packets, tapinfo->changes, pinfo); + item->setText(field); + break; } diff --git a/ui/qt/bluetooth_device_dialog.ui b/ui/qt/bluetooth_device_dialog.ui index b5b06048e8..73fd59f4df 100644 --- a/ui/qt/bluetooth_device_dialog.ui +++ b/ui/qt/bluetooth_device_dialog.ui @@ -163,6 +163,16 @@ LE ACL Total Packets + + + LE ISO MTU + + + + + LE ISO Total Packets + + Inquiry Mode