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