wireshark/epan/dissectors/packet-bthci_evt.c

9940 lines
436 KiB
C
Raw Normal View History

/* packet-bthci_evt.c
* Routines for the Bluetooth HCI Event dissection
* Copyright 2002, Christoph Scholz <scholz@cs.uni-bonn.de>
* From: http://affix.sourceforge.net/archive/ethereal_affix-3.patch
*
* Refactored for wireshark checkin
* Ronnie Sahlberg 2006
*
* Updated to HCI specification 2.1 + EDR
* Allan M. Madsen 2007
* Updated to HCI specification 3.0+HS & 4.0
* Allan M. Madsen 2012
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "config.h"
#include <epan/packet.h>
#include <epan/addr_resolv.h>
#include <epan/expert.h>
#include <epan/prefs.h>
#include <epan/decode_as.h>
#include <epan/tap.h>
#include <epan/proto_data.h>
#include <wsutil/utf8_entities.h>
#include "packet-bluetooth.h"
#include "packet-bthci_sco.h"
#include "packet-bthci_cmd.h"
#include "packet-bthci_evt.h"
static dissector_handle_t bthci_cmd_handle;
static dissector_handle_t bthci_evt_handle;
static dissector_handle_t btcommon_cod_handle;
static dissector_handle_t btcommon_eir_handle;
static dissector_handle_t btcommon_ad_handle;
static dissector_handle_t btcommon_le_channel_map_handle;
/* Initialize the protocol and registered fields */
static int proto_bthci_evt = -1;
static int hf_bthci_evt_code = -1;
static int hf_bthci_evt_param_length = -1;
static int hf_bthci_evt_num_command_packets = -1;
static int hf_bthci_evt_num_handles = -1;
static int hf_bthci_evt_connection_handle = -1;
static int hf_bthci_evt_num_compl_packets = -1;
static int hf_bthci_evt_ret_params = -1;
static int hf_bthci_evt_status = -1;
static int hf_bthci_evt_status_pending = -1;
static int hf_bthci_evt_opcode = -1;
static int hf_bthci_evt_ogf = -1;
static int hf_bthci_evt_ocf = -1;
static int hf_bthci_evt_ocf_link_control = -1;
static int hf_bthci_evt_ocf_link_policy = -1;
static int hf_bthci_evt_ocf_host_controller_and_baseband = -1;
static int hf_bthci_evt_ocf_informational = -1;
static int hf_bthci_evt_ocf_status = -1;
static int hf_bthci_evt_ocf_testing = -1;
static int hf_bthci_evt_ocf_logo_testing = -1;
static int hf_bthci_evt_ocf_low_energy = -1;
static int hf_bthci_evt_bd_addr = -1;
static int hf_bthci_evt_link_type = -1;
static int hf_bthci_evt_encryption_mode = -1;
static int hf_bthci_evt_reason = -1;
static int hf_bthci_evt_remote_name = -1;
static int hf_bthci_evt_encryption_enable = -1;
static int hf_bthci_evt_key_flag = -1;
static int hf_bthci_evt_vers_nr = -1;
static int hf_bthci_bthci_evt_hci_version = -1;
static int hf_bthci_evt_hci_revision = -1;
static int hf_bthci_evt_comp_id = -1;
static int hf_bthci_evt_sub_vers_nr = -1;
static int hf_bthci_evt_flags = -1;
static int hf_bthci_evt_service_type = -1;
static int hf_bthci_evt_token_rate = -1;
static int hf_bthci_evt_peak_bandwidth = -1;
static int hf_bthci_evt_latency = -1;
static int hf_bthci_evt_delay_variation = -1;
static int hf_bthci_evt_hardware_code = -1;
static int hf_bthci_evt_role = -1;
static int hf_bthci_evt_curr_role = -1;
static int hf_bthci_evt_curr_mode = -1;
static int hf_bthci_evt_interval = -1;
static int hf_bthci_evt_link_key = -1;
static int hf_bthci_evt_key_type = -1;
static int hf_bthci_evt_max_slots = -1;
static int hf_bthci_evt_clock_offset = -1;
static int hf_bthci_evt_clock_offset_32 = -1;
static int hf_bthci_evt_page_scan_mode = -1;
static int hf_bthci_evt_page_scan_repetition_mode = -1;
static int hf_bthci_evt_reserved = -1;
static int hf_bthci_evt_page_scan_period_mode = -1;
static int hf_bthci_evt_num_keys = -1;
static int hf_bthci_evt_num_keys_read = -1;
static int hf_bthci_evt_max_num_keys = -1;
static int hf_bthci_evt_num_responses = -1;
static int hf_bthci_evt_num_keys_written = -1;
static int hf_bthci_evt_num_keys_deleted = -1;
static int hf_bthci_evt_link_policy_setting_switch = -1;
static int hf_bthci_evt_link_policy_setting_hold = -1;
static int hf_bthci_evt_link_policy_setting_sniff = -1;
static int hf_bthci_evt_link_policy_setting_park = -1;
static int hf_bthci_evt_pin_type = -1;
static int hf_bthci_evt_device_name = -1;
static int hf_bthci_evt_timeout = -1;
static int hf_bthci_evt_scan_enable = -1;
static int hf_bthci_evt_authentication_enable = -1;
static int hf_bthci_evt_sco_flow_cont_enable = -1;
static int hf_bthci_evt_window = -1;
static int hf_bthci_evt_input_unused = -1;
static int hf_bthci_evt_input_coding = -1;
static int hf_bthci_evt_input_data_format = -1;
static int hf_bthci_evt_input_sample_size = -1;
static int hf_bthci_evt_linear_pcm_bit_pos = -1;
static int hf_bthci_evt_air_coding_format = -1;
static int hf_bthci_evt_num_broadcast_retransm = -1;
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;
static int hf_bthci_evt_flush_to_us = -1;
static int hf_bthci_evt_num_supp_iac = -1;
static int hf_bthci_evt_num_curr_iac = -1;
static int hf_bthci_evt_iac_lap = -1;
static int hf_bthci_evt_loopback_mode = -1;
static int hf_bthci_evt_country_code = -1;
static int hf_bthci_evt_failed_contact_counter = -1;
static int hf_bthci_evt_link_quality = -1;
static int hf_bthci_evt_rssi = -1;
static int hf_bthci_evt_host_data_packet_length_acl = -1;
static int hf_bthci_evt_host_data_packet_length_sco = -1;
static int hf_bthci_evt_host_total_num_acl_data_packets = -1;
static int hf_bthci_evt_host_total_num_sco_data_packets = -1;
static int hf_bthci_evt_page_number = -1;
static int hf_bthci_evt_max_page_number = -1;
static int hf_bthci_evt_local_supported_cmds = -1;
static int hf_bthci_evt_fec_required = -1;
static int hf_bthci_evt_err_data_reporting = -1;
static int hf_bthci_evt_scan_type = -1;
static int hf_bthci_evt_inq_mode = -1;
static int hf_bthci_evt_power_level_type = -1;
static int hf_lmp_features = -1;
static int hf_lmp_feature_3slot_packets = -1;
static int hf_lmp_feature_5slot_packets = -1;
static int hf_lmp_feature_encryption = -1;
static int hf_lmp_feature_slot_offset = -1;
static int hf_lmp_feature_timing_accuracy = -1;
static int hf_lmp_feature_role_switch = -1;
static int hf_lmp_feature_hold_mode = -1;
static int hf_lmp_feature_sniff_mode = -1;
static int hf_lmp_feature_park_state = -1;
static int hf_lmp_feature_power_control_requests = -1;
static int hf_lmp_feature_channel_quality_driven_data_rate = -1;
static int hf_lmp_feature_sco_link = -1;
static int hf_lmp_feature_hv2_packets = -1;
static int hf_lmp_feature_hv3_packets = -1;
static int hf_lmp_feature_u_law_log_synchronous_data = -1;
static int hf_lmp_feature_a_law_log_synchronous_data = -1;
static int hf_lmp_feature_cvsd_synchronous_data = -1;
static int hf_lmp_feature_paging_parameter_negotiation = -1;
static int hf_lmp_feature_power_control = -1;
static int hf_lmp_feature_transparent_synchronous_data = -1;
static int hf_lmp_feature_flow_control_lag = -1;
static int hf_lmp_feature_broadcast_encryption = -1;
static int hf_lmp_feature_reserved_24 = -1;
static int hf_lmp_feature_edr_acl_2mbps_mode = -1;
static int hf_lmp_feature_edr_acl_3mbps_mode = -1;
static int hf_lmp_feature_enhanced_inquiry_scan = -1;
static int hf_lmp_feature_interlaced_inquiry_scan = -1;
static int hf_lmp_feature_interlaced_page_scan = -1;
static int hf_lmp_feature_rssi_with_inquiry_results = -1;
static int hf_lmp_feature_ev3_packets = -1;
static int hf_lmp_feature_ev4_packets = -1;
static int hf_lmp_feature_ev5_packets = -1;
static int hf_lmp_feature_reserved_34 = -1;
static int hf_lmp_feature_afh_capable_slave = -1;
static int hf_lmp_feature_afh_classification_slave = -1;
static int hf_lmp_feature_br_edr_not_supported = -1;
static int hf_lmp_feature_le_supported_controller = -1;
static int hf_lmp_feature_3slot_edr_acl_packets = -1;
static int hf_lmp_feature_5slot_edr_acl_packets = -1;
static int hf_lmp_feature_sniff_subrating = -1;
static int hf_lmp_feature_pause_encryption = -1;
static int hf_lmp_feature_afh_capable_master = -1;
static int hf_lmp_feature_afh_classification_master = -1;
static int hf_lmp_feature_edr_esco_2mbps_mode = -1;
static int hf_lmp_feature_edr_esco_3mbps_mode = -1;
static int hf_lmp_feature_3slot_edr_esco_packets = -1;
static int hf_lmp_feature_extended_inquiry_response = -1;
static int hf_lmp_feature_simultaneous_le_and_br_edr_controller = -1;
static int hf_lmp_feature_reserved_50 = -1;
static int hf_lmp_feature_secure_simple_pairing = -1;
static int hf_lmp_feature_encapsulated_pdu = -1;
static int hf_lmp_feature_erroneous_data_reporting = -1;
static int hf_lmp_feature_non_flushable_packet_boundary_flag = -1;
static int hf_lmp_feature_reserved_55 = -1;
static int hf_lmp_feature_link_supervision_timeout_changed_event = -1;
static int hf_lmp_feature_inquiry_tx_power_level = -1;
static int hf_lmp_feature_enhanced_power_control = -1;
static int hf_lmp_feature_reserved_59_62 = -1;
static int hf_lmp_feature_extended_features = -1;
static int hf_lmp_feature_secure_simple_pairing_host = -1;
static int hf_lmp_feature_le_supported_host = -1;
static int hf_lmp_feature_simultaneous_le_and_br_edr_host = -1;
static int hf_lmp_feature_secure_connections_host = -1;
static int hf_lmp_feature_reserved_68_71 = -1;
static int hf_lmp_feature_csb_master_operation = -1;
static int hf_lmp_feature_csb_slave_operation = -1;
static int hf_lmp_feature_synchronization_train = -1;
static int hf_lmp_feature_synchronization_scan = -1;
static int hf_lmp_feature_inquiry_response_notification_event = -1;
static int hf_lmp_feature_generalized_interlaced_scan = -1;
static int hf_lmp_feature_coarse_clock_adjustment = -1;
static int hf_lmp_feature_reserved_135 = -1;
static int hf_lmp_feature_secure_connections_controller = -1;
static int hf_lmp_feature_ping = -1;
static int hf_lmp_feature_reserved_138 = -1;
static int hf_lmp_feature_train_nudging = -1;
static int hf_lmp_feature_slot_availability_mask = -1;
static int hf_lmp_feature_reserved = -1;
static int hf_bthci_evt_sync_link_type = -1;
static int hf_bthci_evt_sync_tx_interval = -1;
static int hf_bthci_evt_sync_rtx_window = -1;
static int hf_bthci_evt_sync_rx_packet_length = -1;
static int hf_bthci_evt_sync_tx_packet_length = -1;
static int hf_bthci_evt_air_mode = -1;
static int hf_bthci_evt_max_tx_latency = -1;
static int hf_bthci_evt_max_rx_latency = -1;
static int hf_bthci_evt_min_remote_timeout = -1;
static int hf_bthci_evt_min_local_timeout = -1;
static int hf_bthci_evt_link_supervision_timeout = -1;
static int hf_bthci_evt_token_bucket_size = -1;
static int hf_bthci_evt_flow_direction = -1;
static int hf_bthci_evt_afh_ch_assessment_mode = -1;
static int hf_bthci_evt_lmp_handle = -1;
static int hf_bthci_evt_clock = -1;
static int hf_bthci_evt_clock_accuracy = -1;
static int hf_bthci_evt_afh_mode = -1;
static int hf_bthci_evt_afh_channel_map = -1;
static int hf_bthci_evt_simple_pairing_mode = -1;
static int hf_bthci_evt_randomizer_r = -1;
static int hf_bthci_evt_hash_c = -1;
static int hf_bthci_evt_io_capability = -1;
static int hf_bthci_evt_oob_data_present = -1;
static int hf_bthci_evt_auth_requirements = -1;
static int hf_bthci_evt_numeric_value = -1;
static int hf_bthci_evt_passkey = -1;
static int hf_bthci_evt_notification_type = -1;
static int hf_bthci_evt_data_length = -1;
static int hf_bthci_evt_location_domain_aware = -1;
static int hf_bthci_evt_location_domain = -1;
static int hf_bthci_evt_location_domain_options = -1;
static int hf_bthci_evt_location_options = -1;
static int hf_bthci_evt_flow_control_mode = -1;
static int hf_bthci_evt_physical_link_handle = -1;
static int hf_bthci_evt_flow_spec_identifier = -1;
static int hf_bthci_evt_logical_link_handle = -1;
static int hf_bthci_evt_max_acl_data_packet_length = -1;
static int hf_bthci_evt_data_block_length = -1;
static int hf_bthci_evt_total_num_data_blocks = -1;
static int hf_bthci_evt_enc_key_size = -1;
static int hf_bthci_evt_amp_remaining_assoc_length = -1;
static int hf_bthci_evt_amp_assoc_fragment = -1;
static int hf_bthci_evt_amp_status = -1;
static int hf_bthci_evt_total_bandwidth = -1;
static int hf_bthci_evt_max_guaranteed_bandwidth = -1;
static int hf_bthci_evt_min_latency = -1;
static int hf_bthci_evt_max_pdu_size = -1;
static int hf_bthci_evt_amp_controller_type = -1;
static int hf_bthci_evt_pal_capabilities_00 = -1;
static int hf_bthci_evt_max_amp_assoc_length = -1;
static int hf_bthci_evt_max_flush_to_us = -1;
static int hf_bthci_evt_best_effort_flush_to_us = -1;
static int hf_bthci_evt_link_loss_reason = -1;
static int hf_bthci_evt_num_compl_blocks = -1;
static int hf_bthci_evt_test_scenario = -1;
static int hf_bthci_evt_report_reason = -1;
static int hf_bthci_evt_report_event_type = -1;
static int hf_bthci_evt_num_frames = -1;
static int hf_bthci_evt_num_error_frames = -1;
static int hf_bthci_evt_num_bits = -1;
static int hf_bthci_evt_num_error_bits = -1;
static int hf_bthci_evt_short_range_mode_state = -1;
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;
static int hf_bthci_evt_random_number = -1;
static int hf_bthci_evt_le_num_packets = -1;
static int hf_bthci_evt_le_meta_subevent = -1;
static int hf_bthci_evt_le_peer_address_type = -1;
static int hf_bthci_evt_le_local_rpa = -1;
static int hf_bthci_evt_le_peer_rpa = -1;
static int hf_bthci_evt_le_con_interval = -1;
static int hf_bthci_evt_le_min_interval = -1;
static int hf_bthci_evt_le_max_interval = -1;
static int hf_bthci_evt_le_con_latency = -1;
static int hf_bthci_evt_le_supervision_timeout = -1;
static int hf_bthci_evt_le_max_tx_octets = -1;
static int hf_bthci_evt_le_max_tx_time = -1;
static int hf_bthci_evt_le_max_rx_octets = -1;
static int hf_bthci_evt_le_max_rx_time = -1;
static int hf_bthci_evt_le_local_p_256_public_key = -1;
static int hf_bthci_evt_le_dhkey = -1;
static int hf_bthci_evt_encrypted_diversifier = -1;
static int hf_bthci_evt_le_master_clock_accuracy = -1;
static int hf_bthci_evt_num_reports = -1;
static int hf_bthci_evt_advts_event_type = -1;
static int hf_bthci_evt_le_states = -1;
static int hf_bthci_evt_le_states_00 = -1;
static int hf_bthci_evt_le_states_01 = -1;
static int hf_bthci_evt_le_states_02 = -1;
static int hf_bthci_evt_le_states_03 = -1;
static int hf_bthci_evt_le_states_04 = -1;
static int hf_bthci_evt_le_states_05 = -1;
static int hf_bthci_evt_le_states_06 = -1;
static int hf_bthci_evt_le_states_07 = -1;
static int hf_bthci_evt_le_states_10 = -1;
static int hf_bthci_evt_le_states_11 = -1;
static int hf_bthci_evt_le_states_12 = -1;
static int hf_bthci_evt_le_states_13 = -1;
static int hf_bthci_evt_le_states_14 = -1;
static int hf_bthci_evt_le_states_15 = -1;
static int hf_bthci_evt_le_states_16 = -1;
static int hf_bthci_evt_le_states_17 = -1;
static int hf_bthci_evt_le_states_20 = -1;
static int hf_bthci_evt_le_states_21 = -1;
static int hf_bthci_evt_le_states_22 = -1;
static int hf_bthci_evt_le_states_23 = -1;
static int hf_bthci_evt_le_states_24 = -1;
static int hf_bthci_evt_le_states_25 = -1;
static int hf_bthci_evt_le_states_26 = -1;
static int hf_bthci_evt_le_states_27 = -1;
static int hf_bthci_evt_le_states_30 = -1;
static int hf_bthci_evt_le_states_31 = -1;
static int hf_bthci_evt_le_states_32 = -1;
static int hf_bthci_evt_le_states_33 = -1;
static int hf_bthci_evt_le_states_34 = -1;
static int hf_changed_in_frame = -1;
static int hf_command_in_frame = -1;
static int hf_pending_in_frame = -1;
static int hf_response_in_frame = -1;
static int hf_command_pending_time_delta = -1;
static int hf_command_response_time_delta = -1;
static int hf_pending_response_time_delta = -1;
static int hf_bthci_evt_le_features = -1;
static int hf_bthci_evt_le_features_encryption = -1;
static int hf_bthci_evt_le_features_connection_parameters_request_procedure = -1;
static int hf_bthci_evt_le_features_extended_reject_indication = -1;
static int hf_bthci_evt_le_features_slave_initiated_features_exchange = -1;
static int hf_bthci_evt_le_features_ping = -1;
static int hf_bthci_evt_le_features_data_packet_length_extension = -1;
static int hf_bthci_evt_le_features_ll_privacy = -1;
static int hf_bthci_evt_le_features_extended_scanner_filter_policies = -1;
static int hf_bthci_evt_le_features_2m_phy = -1;
static int hf_bthci_evt_le_features_stable_modulation_index_tx =-1;
static int hf_bthci_evt_le_features_stable_modulation_index_rx = -1;
static int hf_bthci_evt_le_features_coded_phy = -1;
static int hf_bthci_evt_le_features_extended_advertising = -1;
static int hf_bthci_evt_le_features_periodic_advertising = -1;
static int hf_bthci_evt_le_features_channel_selection_algorithm_2 = -1;
static int hf_bthci_evt_le_features_power_class_1 = -1;
static int hf_bthci_evt_le_features_minimum_number_of_used_channels_procedure = -1;
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
static int hf_bthci_evt_le_features_connection_cte_request = -1;
static int hf_bthci_evt_le_features_connection_cte_response = -1;
static int hf_bthci_evt_le_features_connectionless_cte_tx = -1;
static int hf_bthci_evt_le_features_connectionless_cte_rx = -1;
static int hf_bthci_evt_le_features_antenna_switching_during_cte_tx_aod = -1;
static int hf_bthci_evt_le_features_antenna_switching_during_cte_rx_aoa = -1;
static int hf_bthci_evt_le_features_receiving_cte = -1;
static int hf_bthci_evt_le_features_periodic_advertising_sync_transfer_sender = -1;
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_periodic_advertising_adi = -1;
static int hf_bthci_evt_le_features_connection_subrating = -1;
static int hf_bthci_evt_le_features_connection_subrating_host_support = -1;
static int hf_bthci_evt_le_features_channel_classification = -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;
static int hf_bthci_evt_mws_transport_layers_item = -1;
static int hf_bthci_evt_mws_transport_layer = -1;
static int hf_bthci_evt_mws_number_of_baud_rates = -1;
static int hf_bthci_evt_mws_to_mws_baud_rates = -1;
static int hf_bthci_evt_mws_to_mws_baud_rates_tranport_item = -1;
static int hf_bthci_evt_mws_to_mws_baud_rate = -1;
static int hf_bthci_evt_mws_from_mws_baud_rates = -1;
static int hf_bthci_evt_mws_from_mws_baud_rates_tranport_item = -1;
static int hf_bthci_evt_mws_from_mws_baud_rate = -1;
static int hf_bthci_evt_selected_tx_power = -1;
static int hf_bthci_evt_which_clock = -1;
static int hf_bthci_evt_slot_offset = -1;
static int hf_bthci_evt_lt_addr = -1;
static int hf_bthci_evt_next_broadcast_instant = -1;
static int hf_bthci_evt_connectionless_slave_broadcast_interval = -1;
static int hf_bthci_evt_service_data = -1;
static int hf_bthci_evt_local_sam_index = -1;
static int hf_bthci_evt_local_sam_tx_availability = -1;
static int hf_bthci_evt_local_sam_rx_availability = -1;
static int hf_bthci_evt_remote_sam_index = -1;
static int hf_bthci_evt_remote_sam_tx_availability = -1;
static int hf_bthci_evt_remote_sam_rx_availability = -1;
static int hf_bthci_evt_receive_status = -1;
static int hf_bthci_evt_fragment = -1;
static int hf_bthci_evt_data = -1;
static int hf_bthci_evt_le_number_of_reports = -1;
static int hf_bthci_evt_le_report = -1;
static int hf_bthci_evt_le_event_type = -1;
static int hf_bthci_evt_le_direct_address_type = -1;
static int hf_bthci_evt_le_direct_bd_addr = -1;
static int hf_bthci_evt_le_address_type = -1;
static int hf_bthci_evt_le_rssi = -1;
static int hf_bthci_evt_le_tx_phy = -1;
static int hf_bthci_evt_le_rx_phy = -1;
static int hf_bthci_evt_max_adv_data_length = -1;
static int hf_bthci_evt_num_supported_adv_sets = -1;
static int hf_bthci_evt_number_of_supported_codecs = -1;
static int hf_bthci_evt_number_of_supported_vendor_codecs = -1;
static int hf_bthci_evt_codecs = -1;
static int hf_bthci_evt_vendor_codecs = -1;
static int hf_bthci_evt_vendor_codecs_item = -1;
static int hf_bthci_evt_codec_id = -1;
static int hf_bthci_evt_vendor_codec_id = -1;
static int hf_bthci_evt_mws_bt_rx_priority_assert_offset = -1;
static int hf_bthci_evt_mws_bt_rx_priority_assert_jitter = -1;
static int hf_bthci_evt_mws_bt_rx_priority_deassert_offset = -1;
static int hf_bthci_evt_mws_bt_rx_priority_deassert_jitter = -1;
static int hf_bthci_evt_mws_bt_tx_priority_assert_offset = -1;
static int hf_bthci_evt_mws_bt_tx_priority_assert_jitter = -1;
static int hf_bthci_evt_mws_bt_tx_priority_deassert_offset = -1;
static int hf_bthci_evt_mws_bt_tx_priority_deassert_jitter = -1;
static int hf_bthci_evt_mws_802_rx_priority_assert_offset = -1;
static int hf_bthci_evt_mws_802_rx_priority_assert_jitter = -1;
static int hf_bthci_evt_mws_802_rx_priority_deassert_offset = -1;
static int hf_bthci_evt_mws_802_rx_priority_deassert_jitter = -1;
static int hf_bthci_evt_mws_802_tx_priority_assert_offset = -1;
static int hf_bthci_evt_mws_802_tx_priority_assert_jitter = -1;
static int hf_bthci_evt_mws_802_tx_priority_deassert_offset = -1;
static int hf_bthci_evt_mws_802_tx_priority_deassert_jitter = -1;
static int hf_bthci_evt_sync_train_interval = -1;
static int hf_bthci_evt_sync_train_to = -1;
static int hf_bthci_evt_secure_connection_host_support = -1;
static int hf_bthci_evt_authenticated_payload_timeout = -1;
static int hf_bthci_evt_c192 = -1;
static int hf_bthci_evt_r192 = -1;
static int hf_bthci_evt_c256 = -1;
static int hf_bthci_evt_r256 = -1;
static int hf_bthci_evt_extended_inquiry_length = -1;
static int hf_bthci_evt_suggested_max_tx_octets = -1;
static int hf_bthci_evt_suggested_max_tx_time = -1;
static int hf_bthci_evt_suggested_max_rx_octets = -1;
static int hf_bthci_evt_suggested_max_rx_time = -1;
static int hf_bthci_evt_resolving_list_size = -1;
static int hf_bthci_evt_primary_phy = -1;
static int hf_bthci_evt_secondary_phy = -1;
static int hf_bthci_evt_advertising_sid = -1;
static int hf_bthci_evt_tx_power = -1;
static int hf_bthci_evt_periodic_advertising_interval = -1;
static int hf_bthci_evt_num_compl_ext_advertising_events = -1;
static int hf_bthci_evt_channel_selection_algorithm = -1;
static int hf_bthci_evt_advertiser_clock_accuracy = -1;
static int hf_bthci_evt_advertiser_phy = -1;
static int hf_bthci_evt_periodic_adv_list_size = -1;
static int hf_bthci_evt_min_tx_power = -1;
static int hf_bthci_evt_max_tx_power = -1;
static int hf_bthci_evt_rf_tx_path_compensation = -1;
static int hf_bthci_evt_rf_rx_path_compensation = -1;
static int hf_bthci_evt_sync_handle = -1;
static int hf_bthci_evt_data_status = -1;
static int hf_bthci_evt_advertising_handle = -1;
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
static int hf_bthci_evt_channel_index = -1;
static int hf_bthci_evt_cte_rssi = -1;
static int hf_bthci_evt_antenna_id = -1;
static int hf_bthci_evt_cte_type = -1;
static int hf_bthci_evt_slot_durations = -1;
static int hf_bthci_evt_packet_status = -1;
static int hf_bthci_evt_event_counter = -1;
static int hf_bthci_evt_sample_count = -1;
static int hf_bthci_evt_i_sample = -1;
static int hf_bthci_evt_q_sample = -1;
static int hf_bthci_evt_service_data_past = -1;
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_received_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_sdu_interval = -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_bthci_evt_subrate_factor = -1;
static int hf_bthci_evt_continuation_number = -1;
static int hf_packet_type_acl = -1;
static int hf_packet_type_acl_dh5 = -1;
static int hf_packet_type_acl_dm5 = -1;
static int hf_packet_type_acl_3dh5 = -1;
static int hf_packet_type_acl_2dh5 = -1;
static int hf_packet_type_acl_dh3 = -1;
static int hf_packet_type_acl_dm3 = -1;
static int hf_packet_type_acl_3dh3 = -1;
static int hf_packet_type_acl_2dh3 = -1;
static int hf_packet_type_acl_reserved_5_7 = -1;
static int hf_packet_type_acl_dh1 = -1;
static int hf_packet_type_acl_dm1 = -1;
static int hf_packet_type_acl_3dh1 = -1;
static int hf_packet_type_acl_2dh1 = -1;
static int hf_packet_type_acl_reserved_0 = -1;
static int hf_packet_type_sco = -1;
static int hf_packet_type_sco_reserved_15_8 = -1;
static int hf_packet_type_sco_hv3 = -1;
static int hf_packet_type_sco_hv2 = -1;
static int hf_packet_type_sco_hv1 = -1;
static int hf_packet_type_sco_reserved_4_0 = -1;
static int * const hfx_bthci_evt_le_features[] = {
&hf_bthci_evt_le_features_encryption,
&hf_bthci_evt_le_features_connection_parameters_request_procedure,
&hf_bthci_evt_le_features_extended_reject_indication,
&hf_bthci_evt_le_features_slave_initiated_features_exchange,
&hf_bthci_evt_le_features_ping,
&hf_bthci_evt_le_features_data_packet_length_extension,
&hf_bthci_evt_le_features_ll_privacy,
&hf_bthci_evt_le_features_extended_scanner_filter_policies,
&hf_bthci_evt_le_features_2m_phy,
&hf_bthci_evt_le_features_stable_modulation_index_tx,
&hf_bthci_evt_le_features_stable_modulation_index_rx,
&hf_bthci_evt_le_features_coded_phy,
&hf_bthci_evt_le_features_extended_advertising,
&hf_bthci_evt_le_features_periodic_advertising,
&hf_bthci_evt_le_features_channel_selection_algorithm_2,
&hf_bthci_evt_le_features_power_class_1,
&hf_bthci_evt_le_features_minimum_number_of_used_channels_procedure,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
&hf_bthci_evt_le_features_connection_cte_request,
&hf_bthci_evt_le_features_connection_cte_response,
&hf_bthci_evt_le_features_connectionless_cte_tx,
&hf_bthci_evt_le_features_connectionless_cte_rx,
&hf_bthci_evt_le_features_antenna_switching_during_cte_tx_aod,
&hf_bthci_evt_le_features_antenna_switching_during_cte_rx_aoa,
&hf_bthci_evt_le_features_receiving_cte,
&hf_bthci_evt_le_features_periodic_advertising_sync_transfer_sender,
&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_periodic_advertising_adi,
&hf_bthci_evt_le_features_connection_subrating,
&hf_bthci_evt_le_features_connection_subrating_host_support,
&hf_bthci_evt_le_features_channel_classification,
&hf_bthci_evt_le_features_reserved,
NULL
};
static int * const hfx_packet_type_acl[] = {
&hf_packet_type_acl_dh5,
&hf_packet_type_acl_dm5,
&hf_packet_type_acl_3dh5,
&hf_packet_type_acl_2dh5,
&hf_packet_type_acl_dh3,
&hf_packet_type_acl_dm3,
&hf_packet_type_acl_3dh3,
&hf_packet_type_acl_2dh3,
&hf_packet_type_acl_reserved_5_7,
&hf_packet_type_acl_dh1,
&hf_packet_type_acl_dm1,
&hf_packet_type_acl_3dh1,
&hf_packet_type_acl_2dh1,
&hf_packet_type_acl_reserved_0,
NULL
};
static int * const hfx_packet_type_sco[] = {
&hf_packet_type_sco_reserved_15_8,
&hf_packet_type_sco_hv3,
&hf_packet_type_sco_hv2,
&hf_packet_type_sco_hv1,
&hf_packet_type_sco_reserved_4_0,
NULL
};
static expert_field ei_event_undecoded = EI_INIT;
static expert_field ei_event_unknown_event = EI_INIT;
static expert_field ei_event_unexpected_event = EI_INIT;
static expert_field ei_event_unexpected_parameter = EI_INIT;
static expert_field ei_event_unknown_command = EI_INIT;
static expert_field ei_parameter_unexpected = EI_INIT;
static expert_field ei_manufacturer_data_changed = EI_INIT;
static expert_field ei_hci_revision_changed = EI_INIT;
static expert_field ei_lmp_subversion_changed = EI_INIT;
static expert_field ei_bad_link_type = EI_INIT;
static dissector_table_t vendor_dissector_table;
static dissector_table_t hci_vendor_table;
static int hf_bthci_evt_ext_advts_event_type = -1;
static int hf_bthci_evt_ext_advts_event_type_connectable = -1;
static int hf_bthci_evt_ext_advts_event_type_scannable = -1;
static int hf_bthci_evt_ext_advts_event_type_directed = -1;
static int hf_bthci_evt_ext_advts_event_type_scan_response = -1;
static int hf_bthci_evt_ext_advts_event_type_legacy = -1;
static int hf_bthci_evt_ext_advts_event_type_data_status = -1;
static int hf_bthci_evt_ext_advts_event_type_reserved = -1;
static int * const hfx_bthci_evt_le_ext_advts_evt_type[] = {
&hf_bthci_evt_ext_advts_event_type_connectable,
&hf_bthci_evt_ext_advts_event_type_scannable,
&hf_bthci_evt_ext_advts_event_type_directed,
&hf_bthci_evt_ext_advts_event_type_scan_response,
&hf_bthci_evt_ext_advts_event_type_legacy,
&hf_bthci_evt_ext_advts_event_type_data_status,
&hf_bthci_evt_ext_advts_event_type_reserved,
NULL
};
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
static int hf_bthci_evt_supported_switching_sample_rates = -1;
static int hf_bthci_evt_supported_switching_sample_rates_1us_switching_aod_tx = -1;
static int hf_bthci_evt_supported_switching_sample_rates_1us_sampling_aod_rx = -1;
static int hf_bthci_evt_supported_switching_sample_rates_1us_switching_and_sampling_aoa_rx = -1;
static int hf_bthci_evt_supported_switching_sample_rates_reserved = -1;
static int * const hfx_bthci_evt_supported_switching_sample_rates[] = {
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
&hf_bthci_evt_supported_switching_sample_rates_1us_switching_aod_tx,
&hf_bthci_evt_supported_switching_sample_rates_1us_sampling_aod_rx,
&hf_bthci_evt_supported_switching_sample_rates_1us_switching_and_sampling_aoa_rx,
&hf_bthci_evt_supported_switching_sample_rates_reserved,
NULL
};
static int hf_bthci_evt_simple_pairing_options = -1;
static int hf_bthci_evt_simple_pairing_options_remote_public_key_validation = -1;
static int hf_bthci_evt_simple_pairing_options_reserved = -1;
static int * const hfx_bthci_evt_simple_pairing_options[] = {
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
&hf_bthci_evt_simple_pairing_options_remote_public_key_validation,
&hf_bthci_evt_simple_pairing_options_reserved,
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 int * const 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;
static gint ett_lmp_subtree = -1;
static gint ett_ptype_subtree = -1;
static gint ett_le_state_subtree = -1;
static gint ett_le_channel_map = -1;
static gint ett_le_features = -1;
static gint ett_le_report = -1;
static gint ett_codecs = -1;
static gint ett_mws_transport_layers = -1;
static gint ett_mws_transport_layers_item = -1;
static gint ett_mws_to_mws_baud_rates = -1;
static gint ett_mws_to_mws_baud_rates_transport_item = -1;
static gint ett_mws_from_mws_baud_rates = -1;
static gint ett_mws_from_mws_baud_rates_transport_item = -1;
static gint ett_expert = -1;
static gint ett_le_ext_advts_event_type = -1;
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
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;
extern value_string_ext did_vendor_id_source_vals_ext;
enum command_status {
COMMAND_STATUS_NORMAL,
COMMAND_STATUS_PENDING,
COMMAND_STATUS_RESULT
};
typedef struct _opcode_list_data_t {
guint16 opcode;
enum command_status command_status;
} opcode_list_data_t;
static const value_string evt_code_vals[] = {
{0x01, "Inquiry Complete"},
{0x02, "Inquiry Result"},
{0x03, "Connect Complete"},
{0x04, "Connect Request"},
{0x05, "Disconnect Complete"},
{0x06, "Authentication Complete"},
{0x07, "Remote Name Request Complete"},
{0x08, "Encryption Change"},
{0x09, "Change Connection Link Key Complete"},
{0x0a, "Master Link Key Complete"},
{0x0b, "Read Remote Supported Features"},
{0x0c, "Read Remote Version Information Complete"},
{0x0d, "QoS Setup Complete"},
{0x0e, "Command Complete"},
{0x0f, "Command Status"},
{0x10, "Hardware Error"},
{0x11, "Flush Occurred"},
{0x12, "Role Change"},
{0x13, "Number of Completed Packets"},
{0x14, "Mode Change"},
{0x15, "Return Link Keys"},
{0x16, "PIN Code Request"},
{0x17, "Link Key Request"},
{0x18, "Link Key Notification"},
{0x19, "Loopback Command"},
{0x1a, "Data Buffer Overflow"},
{0x1b, "Max Slots Change"},
{0x1c, "Read Clock Offset Complete"},
{0x1d, "Connection Packet Type Changed"},
{0x1e, "QoS Violation"},
{0x1f, "Page Scan Mode Change"},
{0x20, "Page Scan Repetition Mode Change"},
{0x21, "Flow Specification Complete"},
{0x22, "Inquiry Result With RSSI"},
{0x23, "Read Remote Extended Features Complete"},
{0x2c, "Synchronous Connection Complete"},
{0x2d, "Synchronous Connection Changed"},
{0x2e, "Sniff Subrating"},
{0x2f, "Extended Inquiry Result"},
{0x30, "Encryption Key Refresh Complete"},
{0x31, "IO Capability Request"},
{0x32, "IO Capability Response"},
{0x33, "User Confirmation Request"},
{0x34, "User Passkey Request"},
{0x35, "Remote OOB Data Request"},
{0x36, "Simple Pairing Complete"},
{0x38, "Link Supervision Timeout Changed"},
{0x39, "Enhanced Flush Complete"},
{0x3b, "User Passkey Notification"},
{0x3c, "Keypress Notification"},
{0x3d, "Remote Host Supported Features Notification"},
{0x3e, "LE Meta"},
{0x40, "Physical Link Complete"},
{0x41, "Channel Selected"},
{0x42, "Disconnect Physical Link Complete"},
{0x43, "Physical Link Loss Early Warning"},
{0x44, "Physical Link Recovery"},
{0x45, "Logical Link Complete"},
{0x46, "Disconnect Logical Link Complete"},
{0x47, "Flow Spec Modify Complete"},
{0x48, "Number Of Completed Data Blocks"},
{0x49, "AMP Start Test"},
{0x4a, "AMP Test End"},
{0x4b, "AMP Receiver Report"},
{0x4c, "Short Range Mode Change Complete"},
{0x4d, "AMP Status Change"},
/* From "Bluetooth Core Specification Addendum 4 */
{0x4e, "Triggered Clock Capture"},
{0x4f, "Synchronization Train Complete"},
{0x50, "Synchronization Train Received"},
{0x51, "Connectionless Slave Broadcast Receive"},
{0x52, "Connectionless Slave Broadcast Timeout"},
{0x53, "Truncated Page Complete"},
{0x54, "Slave Page Response Timeout"},
{0x55, "Connectionless Slave Broadcast Channel Map Change"},
{0x56, "Inquiry Response Notification"},
/* Core 4 */
{0x57, "Authenticated Payload Timeout Expired"},
/* Core 5 */
{0x58, "SAM Status Change"},
/* Other */
/*{0xfe, "Bluetooth Logo Testing"}, // According to ESR05 it is not assigned */
{0xff, "Vendor-Specific"},
{0, NULL}
};
value_string_ext bthci_evt_evt_code_vals_ext = VALUE_STRING_EXT_INIT(evt_code_vals);
static const value_string bthci_cmd_status_pending_vals[] = {
{0x00, "Pending"},
{0, NULL }
};
static const value_string evt_link_types[] = {
{0x00, "SCO connection (Voice Channels)"},
{0x01, "ACL connection (Data Channels)"},
{0x02, "eSCO connection (Voice Channels)"},
{0, NULL }
};
static const value_string evt_sync_link_types[] = {
{0x00, "SCO connection"},
{0x02, "eSCO connection"},
{0, NULL }
};
static const value_string evt_encryption_modes[] = {
{0x00, "Encryption Disabled"},
{0x01, "Encryption only for point-to-point packets"},
{0x02, "Encryption for both point-to-point and broadcast packets"},
{0, NULL }
};
static const value_string evt_encryption_enable[] = {
{0x00, "Link Level Encryption is OFF"},
{0x01, "Link Level Encryption is ON"},
{0, NULL }
};
static const value_string evt_key_flag[] = {
{0x00, "Using Semi-permanent Link Key"},
{0x01, "Using Temporary Link Key"},
{0, NULL }
};
/* Taken from https://www.bluetooth.org/Technical/AssignedNumbers/link_manager.htm */
const value_string bthci_evt_lmp_version[] = {
{0x00, "1.0b"},
{0x01, "1.1"},
{0x02, "1.2"},
{0x03, "2.0 + EDR"},
{0x04, "2.1 + EDR"},
{0x05, "3.0 + HS"},
{0x06, "4.0"},
{0x07, "4.1"},
{0x08, "4.2"},
{0x09, "5.0"},
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
{0x0a, "5.1"},
{0x0b, "5.2"},
{0x0c, "5.3"},
{0, NULL }
};
/* Taken from https://www.bluetooth.org/Technical/AssignedNumbers/hci.htm
* (requires a login/password)
*/
const value_string bthci_evt_hci_version[] = {
{0x00, "1.0b"},
{0x01, "1.1"},
{0x02, "1.2"},
{0x03, "2.0 + EDR"},
{0x04, "2.1 + EDR"},
{0x05, "3.0 + HS"},
{0x06, "4.0"},
{0x07, "4.1"},
{0x08, "4.2"},
{0x09, "5.0"},
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
{0x0a, "5.1"},
{0x0b, "5.2"},
{0x0c, "5.3"},
{0, NULL }
};
static const value_string evt_service_types[] = {
{0x00, "No Traffic Available"},
{0x01, "Best Effort Available"},
{0x02, "Guaranteed Available"},
{0, NULL }
};
static const value_string evt_role_vals[] = {
{0x00, "Currently the Master for specified BD_ADDR"},
{0x01, "Currently the Slave for specified BD_ADDR"},
{0, NULL }
};
static const value_string evt_role_vals_handle[] = {
{0x00, "Currently the Master for this connection handle"},
{0x01, "Currently the Slave for this connection handle"},
{0, NULL }
};
static const value_string evt_modes[] = {
{0x00, "Active Mode"},
{0x01, "Hold Mode"},
{0x02, "Sniff Mode"},
{0x03, "Park Mode"},
{0, NULL }
};
static const value_string evt_key_types[] = {
{0x00, "Combination Key"},
{0x01, "Local Unit Key"},
{0x02, "Remote Unit Key"},
{0x03, "Debug Combination Key"},
{0x04, "Unauthenticated Combination Key"},
{0x05, "Authenticated Combination Key"},
{0x06, "Changed Combination Key"},
{0, NULL }
};
static const value_string evt_scan_types[] = {
{0x00, "Standard Scan" },
{0x01, "Interlaced Scan" },
{0, NULL }
};
static const value_string evt_power_level_types[] = {
{0x00, "Read Current Transmission Power Level" },
{0x01, "Read Maximum Transmission Power Level" },
{0, NULL }
};
static const value_string evt_pin_types[] = {
{0x00, "Variable PIN" },
{0x01, "Fixed PIN" },
{0, NULL }
};
static const value_string evt_auth_enable_values[] = {
{0x00, "Disabled" },
{0x01, "Enabled for all connections "},
{0, NULL }
};
static const value_string evt_enable_values[] = {
{0x00, "Disabled" },
{0x01, "Enabled"},
{0, NULL }
};
static const value_string evt_loopback_modes[] = {
{0x00, "No Loopback mode enabled" },
{0x01, "Enable Local Loopback" },
{0x02, "Enable Remote Loopback" },
{0, NULL }
};
static const value_string evt_country_code_values[] = {
{0x0, "North America & Europe (except France) and Japan" },
{0x1, "France" },
{0, NULL }
};
static const value_string evt_flow_direction_values[] = {
{0x0, "Outgoing Traffic" },
{0x1, "Incoming Traffic" },
{0, NULL }
};
static const value_string evt_flow_ctrl_mode[] = {
{ 0x00, "Packet based" },
{ 0x01, "Data Block based" },
{ 0, NULL }
};
static const value_string evt_amp_status[] = {
{ 0x00, "Controller available but currently physically powered down" },
{ 0x01, "Controller available exclusively for Bluetooth" },
{ 0x02, "No capacity available for Bluetooth operation" },
{ 0x03, "Low capacity available for Bluetooth operation" },
{ 0x04, "Medium capacity available for Bluetooth operation" },
{ 0x05, "High capacity available for Bluetooth operation" },
{ 0x06, "Full capacity available for Bluetooth operation" },
{ 0, NULL }
};
const value_string bthci_evt_controller_types[] = {
{ 0x00, "Primary BR/EDR" },
{ 0x01, "802.11 AMP" },
{ 0, NULL }
};
static const value_string evt_link_loss_reasons[] = {
{ 0x00, "Unknown" },
{ 0x01, "Range related" },
{ 0x02, "Bandwidth related" },
{ 0x03, "Resolving Conflict" },
{ 0x04, "Interference" },
{ 0, NULL }
};
static const value_string evt_report_reasons[] = {
{ 0x00, "Configured Interval" },
{ 0x01, "Test Ended" },
{ 0, NULL }
};
static const value_string evt_report_event_types[] = {
{ 0x00, "Frames Received" },
{ 0x01, "Frames Received & Bits in Error" },
{ 0, NULL }
};
static const value_string evt_le_meta_subevent[] = {
{ 0x01, "LE Connection Complete" },
{ 0x02, "LE Advertising Report" },
{ 0x03, "LE Connection Update Complete" },
{ 0x04, "LE Read Remote Features Complete" },
{ 0x05, "LE Long Term Key Request" },
{ 0x06, "LE Remote Connection Parameter Request" },
{ 0x07, "LE Data Length Change" },
{ 0x08, "LE Read Local P-256 Public Key Complete" },
{ 0x09, "LE Generate DHKey Complete" },
{ 0x0A, "LE Enhanced Connection Complete" },
{ 0x0B, "LE Direct Advertising Report" },
{ 0x0C, "LE PHY Update Complete" },
{ 0x0D, "LE Extended Advertising Report" },
{ 0x0E, "LE Periodic Advertising Sync Established" },
{ 0x0F, "LE Periodic Advertising Report" },
{ 0x10, "LE Periodic Advertising Sync Lost" },
{ 0x11, "LE Scan Timeout" },
{ 0x12, "LE Advertising Set Terminated" },
{ 0x13, "LE Scan Request Received" },
{ 0x14, "LE Channel Selection Algorithm" },
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
{ 0x15, "LE Connectionless IQ Report" },
{ 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" },
{ 0x23, "LE Subrate Change" },
{ 0, NULL }
};
static const value_string evt_le_advertising_evt_types[] = {
{ 0x00, "Connectable Undirected Advertising" },
{ 0x01, "Connectable Directed Advertising" },
{ 0x02, "Scannable Undirected Advertising" },
{ 0x03, "Non-Connectable Undirected Advertising" },
{ 0x04, "Scan Response" },
{ 0, NULL }
};
static const value_string evt_air_mode_vals[] = {
{ 0x00, UTF8_MICRO_SIGN "-law log" },
{ 0x01, "A-law log" },
{ 0x02, "CVSD" },
{ 0x03, "Transparent Data" },
{ 0, NULL }
};
const value_string bthci_evt_mws_transport_layer_vals[] = {
{ 0x00, "Disabled" },
{ 0x01, "WCI-1 Transport" },
{ 0x02, "WCI-2 Transport" },
{ 0, NULL }
};
static const value_string which_clock_vals[] = {
{ 0x00, "Local Clock" },
{ 0x01, "Piconet Clock" },
{ 0, NULL }
};
static const value_string receive_status_vals[] = {
{ 0x00, "Packet Received Successfully" },
{ 0x01, "Fragment, Data_Length or Data Fields Invalid" },
{ 0, NULL }
};
static const value_string fragment_vals[] = {
{ 0x00, "Continuation" },
{ 0x01, "Start" },
{ 0x02, "End" },
{ 0x03, "No Fragmentation" },
{ 0, NULL }
};
static const value_string event_type_vals[] = {
{ 0x01, "Connectable directed advertising (ADV_DIRECT_IND)" },
{ 0, NULL }
};
const value_string bthci_evt_codec_id_vals[] = {
{ 0x00, "u-Law log" },
{ 0x01, "A-law log" },
{ 0x02, "CVSD" },
{ 0x03, "Transparent" },
{ 0x04, "Linear PCM" },
{ 0x05, "mSBC" },
{ 0xFF, "Vendor Specific" },
{ 0, NULL }
};
static const value_string ext_adv_data_status_vals[] = {
{0x00, "Complete" },
{0x01, "Incomplete, more to come"},
{0x02, "Incomplete, truncated, no more to come"},
{0x03, "Reserved"},
{0, NULL }
};
static const value_string bthci_evt_primary_phy_vals[] = {
{0x01, "LE 1M"},
{0x03, "LE Coded"},
{0, NULL }
};
static const value_string bthci_evt_secondary_phy_vals[] = {
{0x00, "No packets on the secondary advertising channel"},
{0x01, "LE 1M"},
{0x02, "LE 2M"},
{0x03, "LE Coded"},
{0, NULL }
};
static const value_string channel_selection_algo_vals[] = {
{ 0x00, "#1" },
{ 0x01, "#2" },
{ 0, NULL }
};
static const value_string unique_sam_disabled[] = {
{ 0xFF, "SAM disabled, all slots available" },
{ 0, NULL }
};
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
static const value_string packet_status_vals[] = {
{ 0x00, "CRC correct" },
{ 0x01, "CRC incorrect, Length and CTETime fields used to determine sampling points" },
{ 0x02, "CRC incorrect, position and length of the CTE determined in some other way" },
{ 0xFF, "Insufficient resources, Channel Index, CTE Type, and Slot Durations invalid" },
{ 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 };
void proto_register_bthci_evt(void);
void proto_reg_handoff_bthci_evt(void);
static void bthci_evt_vendor_prompt(packet_info *pinfo _U_, gchar* result)
{
snprintf(result, MAX_DECODE_AS_PROMPT_LEN, "Vendor as");
}
static gpointer bthci_evt_vendor_value(packet_info *pinfo _U_)
{
return NULL;
}
static void add_opcode(wmem_list_t *opcode_list, guint16 opcode, enum command_status command_status) {
opcode_list_data_t *opcode_list_data;
opcode_list_data = wmem_new(wmem_packet_scope(), opcode_list_data_t);
if (opcode_list_data) {
opcode_list_data->opcode = opcode;
opcode_list_data->command_status = command_status;
wmem_list_append(opcode_list, opcode_list_data);
}
}
static void
save_remote_device_name(tvbuff_t *tvb, gint offset, packet_info *pinfo,
guint8 size, guint8 *bd_addr, bluetooth_data_t *bluetooth_data)
{
gint i = 0;
guint8 length;
wmem_tree_key_t key[6];
guint32 interface_id;
guint32 adapter_id;
guint32 bd_addr_oui;
guint32 bd_addr_id;
guint32 frame_number;
gchar *name;
device_name_t *device_name;
if (!(!pinfo->fd->visited && bd_addr)) return;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
while (i < size) {
length = tvb_get_guint8(tvb, offset + i);
if (length == 0) break;
switch(tvb_get_guint8(tvb, offset + i + 1)) {
case 0x08: /* Device Name, shortened */
case 0x09: /* Device Name, full */
name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + i + 2, length - 1, ENC_UTF_8);
frame_number = pinfo->num;
bd_addr_oui = bd_addr[0] << 16 | bd_addr[1] << 8 | bd_addr[2];
bd_addr_id = bd_addr[3] << 16 | bd_addr[4] << 8 | bd_addr[5];
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &bd_addr_id;
key[3].length = 1;
key[3].key = &bd_addr_oui;
key[4].length = 1;
key[4].key = &frame_number;
key[5].length = 0;
key[5].key = NULL;
device_name = (device_name_t *) wmem_new(wmem_file_scope(), device_name_t);
device_name->bd_addr_oui = bd_addr[0] << 16 | bd_addr[1] << 8 | bd_addr[2];
device_name->bd_addr_id = bd_addr[3] << 16 | bd_addr[4] << 8 | bd_addr[5];
device_name->name = wmem_strdup(wmem_file_scope(), name);
wmem_tree_insert32_array(bluetooth_data->bdaddr_to_name, key, device_name);
break;
}
i += length + 1;
}
}
static void send_hci_summary_status_tap(guint8 status, packet_info *pinfo, bluetooth_data_t *bluetooth_data)
{
if (have_tap_listener(bluetooth_hci_summary_tap)) {
bluetooth_hci_summary_tap_t *tap_hci_summary;
tap_hci_summary = wmem_new(wmem_packet_scope(), bluetooth_hci_summary_tap_t);
tap_hci_summary->interface_id = bluetooth_data->interface_id;
tap_hci_summary->adapter_id = bluetooth_data->adapter_id;
tap_hci_summary->type = BLUETOOTH_HCI_SUMMARY_STATUS;
tap_hci_summary->status = status;
if (try_val_to_str_ext(status, &bthci_cmd_status_vals_ext))
tap_hci_summary->name = val_to_str_ext(status, &bthci_cmd_status_vals_ext, "Unknown 0x%02x");
else
tap_hci_summary->name = NULL;
tap_queue_packet(bluetooth_hci_summary_tap, pinfo, tap_hci_summary);
}
}
static void send_hci_summary_pending_tap(packet_info *pinfo, bluetooth_data_t *bluetooth_data)
{
if (have_tap_listener(bluetooth_hci_summary_tap)) {
bluetooth_hci_summary_tap_t *tap_hci_summary;
tap_hci_summary = wmem_new(wmem_packet_scope(), bluetooth_hci_summary_tap_t);
tap_hci_summary->interface_id = bluetooth_data->interface_id;
tap_hci_summary->adapter_id = bluetooth_data->adapter_id;
tap_hci_summary->type = BLUETOOTH_HCI_SUMMARY_STATUS_PENDING;
tap_hci_summary->status = 0;
tap_hci_summary->name = "Pending";
tap_queue_packet(bluetooth_hci_summary_tap, pinfo, tap_hci_summary);
}
}
static void send_hci_summary_reason_tap(guint8 reason, packet_info *pinfo, bluetooth_data_t *bluetooth_data)
{
if (have_tap_listener(bluetooth_hci_summary_tap)) {
bluetooth_hci_summary_tap_t *tap_hci_summary;
tap_hci_summary = wmem_new(wmem_packet_scope(), bluetooth_hci_summary_tap_t);
tap_hci_summary->interface_id = bluetooth_data->interface_id;
tap_hci_summary->adapter_id = bluetooth_data->adapter_id;
tap_hci_summary->type = BLUETOOTH_HCI_SUMMARY_REASON;
tap_hci_summary->reason = reason;
if (try_val_to_str_ext(reason, &bthci_cmd_status_vals_ext))
tap_hci_summary->name = val_to_str_ext(reason, &bthci_cmd_status_vals_ext, "Unknown 0x%02x");
else
tap_hci_summary->name = NULL;
tap_queue_packet(bluetooth_hci_summary_tap, pinfo, tap_hci_summary);
}
}
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
static int
dissect_iq_sample_list(tvbuff_t *tvb, int offset, proto_tree *tree)
{
guint8 samples;
proto_tree_add_item(tree, hf_bthci_evt_sample_count, tvb, offset, 1, ENC_NA);
samples = tvb_get_guint8(tvb, offset);
offset += 1;
if (samples > 0) {
guint8 i;
proto_item *sub_item;
proto_tree *sub_tree;
sub_item = proto_tree_add_none_format(tree, hf_bthci_evt_le_report, tvb, offset, 2 * samples, "IQ Samples");
sub_tree = proto_item_add_subtree(sub_item, ett_iq_sample_list);
for (i = 0; i < samples; i++) {
proto_item *sample_item;
proto_tree *sample_tree;
sample_item = proto_tree_add_none_format(sub_tree, hf_bthci_evt_le_report, tvb, offset, 2, "Sample %2d, I:%4d, Q:%4d",
i, tvb_get_gint8(tvb, offset), tvb_get_gint8(tvb, offset+1));
sample_tree = proto_item_add_subtree(sample_item, ett_iq_samples);
proto_tree_add_item(sample_tree, hf_bthci_evt_i_sample, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(sample_tree, hf_bthci_evt_q_sample, tvb, offset, 1, ENC_NA);
offset += 1;
}
}
return offset;
}
static int
dissect_bthci_evt_inquire_complete(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
return offset;
}
static int
dissect_bthci_evt_connect_complete(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
guint32 connection_handle;
guint8 bd_addr[6];
guint8 status;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
status = tvb_get_guint8(tvb, offset);
send_hci_summary_status_tap(status, pinfo, bluetooth_data);
offset += 1;
connection_handle = tvb_get_letohs(tvb, offset) & 0x0FFF;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
if (!pinfo->fd->visited && status == STATUS_SUCCESS) {
wmem_tree_key_t key[5];
guint32 k_interface_id;
guint32 k_adapter_id;
guint32 k_connection_handle;
guint32 k_frame_number;
remote_bdaddr_t *remote_bdaddr;
chandle_session_t *chandle_session;
connection_mode_t *connection_mode;
k_interface_id = bluetooth_data->interface_id;
k_adapter_id = bluetooth_data->adapter_id;
k_connection_handle = connection_handle;
k_frame_number = pinfo->num;
key[0].length = 1;
key[0].key = &k_interface_id;
key[1].length = 1;
key[1].key = &k_adapter_id;
key[2].length = 1;
key[2].key = &k_connection_handle;
key[3].length = 1;
key[3].key = &k_frame_number;
key[4].length = 0;
key[4].key = NULL;
remote_bdaddr = (remote_bdaddr_t *) wmem_new(wmem_file_scope(), remote_bdaddr_t);
remote_bdaddr->interface_id = bluetooth_data->interface_id;
remote_bdaddr->adapter_id = bluetooth_data->adapter_id;
remote_bdaddr->chandle = connection_handle;
memcpy(remote_bdaddr->bd_addr, bd_addr, 6);
wmem_tree_insert32_array(bluetooth_data->chandle_to_bdaddr, key, remote_bdaddr);
chandle_session = (chandle_session_t *) wmem_new(wmem_file_scope(), chandle_session_t);
chandle_session->connect_in_frame = k_frame_number;
chandle_session->disconnect_in_frame = bluetooth_max_disconnect_in_frame;
chandle_session->link_type = BT_LINK_TYPE_ACL;
wmem_tree_insert32_array(bluetooth_data->chandle_sessions, key, chandle_session);
connection_mode = (connection_mode_t *) wmem_new(wmem_file_scope(), connection_mode_t);
connection_mode->mode = 0;
connection_mode->change_in_frame = k_frame_number;
wmem_tree_insert32_array(bluetooth_data->chandle_to_mode, key, connection_mode);
}
proto_tree_add_item(tree, hf_bthci_evt_link_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_encryption_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_connect_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
call_dissector(btcommon_cod_handle, tvb_new_subset_length(tvb, offset, 3), pinfo, tree);
offset += 3;
proto_tree_add_item(tree, hf_bthci_evt_link_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_disconnect_complete(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
guint32 connection_handle;
guint8 status;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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);
connection_handle = tvb_get_letohs(tvb, offset) & 0x0FFF;
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
send_hci_summary_reason_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data);
offset += 1;
if (!pinfo->fd->visited && status == STATUS_SUCCESS) {
wmem_tree_key_t key[4];
guint32 interface_id;
guint32 adapter_id;
chandle_session_t *chandle_session;
wmem_tree_t *subtree;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &connection_handle;
key[3].length = 0;
key[3].key = NULL;
subtree = (wmem_tree_t *) wmem_tree_lookup32_array(bluetooth_data->chandle_sessions, key);
chandle_session = (subtree) ? (chandle_session_t *) wmem_tree_lookup32_le(subtree, pinfo->num) : NULL;
if (chandle_session && chandle_session->connect_in_frame < pinfo->num)
chandle_session->disconnect_in_frame = pinfo->num;
}
return offset;
}
static int
dissect_bthci_evt_auth_complete(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_lmp_features(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, guint8 page_numer)
{
guint8 fc_lag;
proto_item *fl_lag_item;
proto_tree *lmp_tree = NULL;
if (tree) {
proto_item *lmp_item;
lmp_item = proto_tree_add_item(tree, hf_lmp_features, tvb, offset, 8, ENC_NA);
lmp_tree = proto_item_add_subtree(lmp_item, ett_lmp_subtree);
}
switch (page_numer) {
case 0:
proto_tree_add_item(lmp_tree, hf_lmp_feature_3slot_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_5slot_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_encryption, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_slot_offset, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_timing_accuracy, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_role_switch, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_hold_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_sniff_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_park_state, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_power_control_requests, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_channel_quality_driven_data_rate, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_sco_link, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_hv2_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_hv3_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_u_law_log_synchronous_data, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_a_law_log_synchronous_data, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_cvsd_synchronous_data, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_paging_parameter_negotiation, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_power_control, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_transparent_synchronous_data, tvb, offset, 1, ENC_LITTLE_ENDIAN);
fl_lag_item = proto_tree_add_item(lmp_tree,hf_lmp_feature_flow_control_lag, tvb, offset, 1, ENC_LITTLE_ENDIAN);
fc_lag = (tvb_get_guint8(tvb, offset) & 0x70) >> 4;
proto_item_append_text(fl_lag_item, " (%i bytes)", 256 * fc_lag);
proto_tree_add_item(lmp_tree,hf_lmp_feature_broadcast_encryption, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved_24, tvb, offset, 1, ENC_NA);
proto_tree_add_item(lmp_tree, hf_lmp_feature_edr_acl_2mbps_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_edr_acl_3mbps_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_enhanced_inquiry_scan, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_interlaced_inquiry_scan, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_interlaced_page_scan, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_rssi_with_inquiry_results, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_ev3_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_ev4_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_ev5_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved_34, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_afh_capable_slave, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_afh_classification_slave, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_br_edr_not_supported, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_le_supported_controller, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_3slot_edr_acl_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_5slot_edr_acl_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_sniff_subrating, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_pause_encryption, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_afh_capable_master, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_afh_classification_master, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_edr_esco_2mbps_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_edr_esco_3mbps_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_3slot_edr_esco_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_extended_inquiry_response, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_simultaneous_le_and_br_edr_controller, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved_50, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_secure_simple_pairing, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_encapsulated_pdu, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_erroneous_data_reporting, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_non_flushable_packet_boundary_flag, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved_55, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_link_supervision_timeout_changed_event, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_inquiry_tx_power_level, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_enhanced_power_control, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved_59_62, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_extended_features, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 1:
proto_tree_add_item(lmp_tree, hf_lmp_feature_secure_simple_pairing_host, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_le_supported_host, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_simultaneous_le_and_br_edr_host, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_secure_connections_host, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved_68_71, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved, tvb, offset, 7, ENC_NA);
offset += 7;
break;
case 2:
proto_tree_add_item(lmp_tree, hf_lmp_feature_csb_master_operation, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_csb_slave_operation, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_synchronization_train, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_synchronization_scan, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_inquiry_response_notification_event, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_generalized_interlaced_scan, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_coarse_clock_adjustment, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved_135, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_secure_connections_controller, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_ping, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved_138, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_train_nudging, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(lmp_tree, hf_lmp_feature_slot_availability_mask, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved, tvb, offset, 6, ENC_NA);
offset += 6;
break;
default:
proto_tree_add_item(lmp_tree, hf_lmp_feature_reserved, tvb, offset, 8, ENC_NA);
offset += 8;
}
return offset;
}
static int
dissect_bthci_evt_pin_code_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
return offset;
}
static int
dissect_bthci_evt_link_key_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
return offset;
}
static int
dissect_bthci_evt_link_key_notification(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_link_key, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(tree, hf_bthci_evt_key_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_return_link_keys(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
guint8 evt_num_keys;
evt_num_keys = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_num_keys, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
while (evt_num_keys--) {
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_link_key, tvb, offset, 16, ENC_NA);
offset += 16;
}
return offset;
}
static int
dissect_bthci_evt_read_remote_support_features_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
offset = dissect_bthci_evt_lmp_features(tvb, offset, pinfo, tree, 0);
return offset;
}
static int
dissect_bthci_evt_remote_name_req_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
guint8 bd_addr[6];
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;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
proto_tree_add_item(tree, hf_bthci_evt_remote_name, tvb, offset, 248, ENC_UTF_8);
if (!pinfo->fd->visited) {
wmem_tree_key_t key[6];
guint32 interface_id;
guint32 adapter_id;
guint32 bd_addr_oui;
guint32 bd_addr_id;
guint32 frame_number;
gchar *name;
device_name_t *device_name;
name = tvb_get_string_enc(wmem_file_scope(), tvb, offset, 248, ENC_UTF_8);
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
frame_number = pinfo->num;
bd_addr_oui = bd_addr[0] << 16 | bd_addr[1] << 8 | bd_addr[2];
bd_addr_id = bd_addr[3] << 16 | bd_addr[4] << 8 | bd_addr[5];
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &bd_addr_id;
key[3].length = 1;
key[3].key = &bd_addr_oui;
key[4].length = 1;
key[4].key = &frame_number;
key[5].length = 0;
key[5].key = NULL;
device_name = (device_name_t *) wmem_new(wmem_file_scope(), device_name_t);
device_name->bd_addr_oui = bd_addr[0] << 16 | bd_addr[1] << 8 | bd_addr[2];
device_name->bd_addr_id = bd_addr[3] << 16 | bd_addr[4] << 8 | bd_addr[5];
device_name->name = name;
wmem_tree_insert32_array(bluetooth_data->bdaddr_to_name, key, device_name);
}
if (have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
memcpy(tap_device->bd_addr, bd_addr, 6);
tap_device->has_bd_addr = TRUE;
tap_device->is_local = FALSE;
tap_device->type = BLUETOOTH_DEVICE_NAME;
tap_device->data.name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 248, ENC_UTF_8);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
offset += 248;
return offset;
}
static int
dissect_bthci_evt_read_remote_version_information_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, bluetooth_data_t *bluetooth_data, proto_tree *tree)
{
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;
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_vers_nr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_comp_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_sub_vers_nr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (have_tap_listener(bluetooth_device_tap)) {
wmem_tree_t *subtree;
wmem_tree_key_t key[4];
guint32 interface_id;
guint32 adapter_id;
guint32 connection_handle;
remote_bdaddr_t *remote_bdaddr;
bluetooth_device_tap_t *tap_device;
guint8 lmp_version;
guint16 lmp_subversion;
guint16 manufacturer;
lmp_version = tvb_get_guint8(tvb, offset - 5);
manufacturer = tvb_get_letohs(tvb, offset - 4);
lmp_subversion = tvb_get_letohs(tvb, offset - 2);
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
connection_handle = tvb_get_guint16(tvb, offset - 7, ENC_LITTLE_ENDIAN) & 0x0fff;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &connection_handle;
key[3].length = 0;
key[3].key = NULL;
subtree = (wmem_tree_t *) wmem_tree_lookup32_array(bluetooth_data->chandle_to_bdaddr, key);
remote_bdaddr = (subtree) ? (remote_bdaddr_t *) wmem_tree_lookup32_le(subtree, pinfo->num) : NULL;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
tap_device->type = BLUETOOTH_DEVICE_REMOTE_VERSION;
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
if (remote_bdaddr) {
tap_device->has_bd_addr = TRUE;
memcpy(tap_device->bd_addr, remote_bdaddr->bd_addr, 6);
} else {
tap_device->has_bd_addr = FALSE;
}
tap_device->is_local = FALSE;
tap_device->data.remote_version.lmp_version = lmp_version;
tap_device->data.remote_version.lmp_subversion = lmp_subversion;
tap_device->data.remote_version.manufacturer = manufacturer;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
return offset;
}
static int
dissect_bthci_evt_flush_occurred(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_number_of_completed_packets(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
guint8 evt_num_handles;
evt_num_handles = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_num_handles, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
while (evt_num_handles--) {
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_num_compl_packets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
return offset;
}
static int
dissect_bthci_evt_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
proto_item *handle_item;
guint32 connection_handle;
guint8 mode;
guint8 status;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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);
connection_handle = tvb_get_letohs(tvb, offset) & 0x0FFF;
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_curr_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
mode = tvb_get_guint8(tvb, offset);
offset += 1;
handle_item = proto_tree_add_item(tree, hf_bthci_evt_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(handle_item, " Baseband slots (%f msec)", tvb_get_letohs(tvb, offset)*0.625);
offset += 2;
if (!pinfo->fd->visited && status == STATUS_SUCCESS) {
wmem_tree_key_t key[5];
guint32 interface_id;
guint32 adapter_id;
guint32 frame_number;
connection_mode_t *connection_mode;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
frame_number = pinfo->num;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &connection_handle;
key[3].length = 1;
key[3].key = &frame_number;
key[4].length = 0;
key[4].key = NULL;
connection_mode = (connection_mode_t *) wmem_new(wmem_file_scope(), connection_mode_t);
connection_mode->mode = mode;
connection_mode->change_in_frame = frame_number;
wmem_tree_insert32_array(bluetooth_data->chandle_to_mode, key, connection_mode);
}
return offset;
}
static int
dissect_bthci_evt_role_change(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
guint8 bd_addr[6];
guint8 role;
guint8 status;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
status = tvb_get_guint8(tvb, offset);
send_hci_summary_status_tap(status, pinfo, bluetooth_data);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
proto_tree_add_item(tree, hf_bthci_evt_role, tvb, offset, 1, ENC_LITTLE_ENDIAN);
role = tvb_get_guint8(tvb, offset);
offset += 1;
if (!pinfo->fd->visited && status == STATUS_SUCCESS) {
guint32 interface_id;
guint32 adapter_id;
guint32 bd_addr_oui;
guint32 bd_addr_id;
guint32 frame_number;
wmem_tree_key_t key[6];
device_role_t *device_role;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
frame_number = pinfo->num;
bd_addr_oui = bd_addr[0] << 16 | bd_addr[1] << 8 | bd_addr[2];
bd_addr_id = bd_addr[3] << 16 | bd_addr[4] << 8 | bd_addr[5];
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &bd_addr_id;
key[3].length = 1;
key[3].key = &bd_addr_oui;
key[4].length = 1;
key[4].key = &frame_number;
key[5].length = 0;
key[5].key = NULL;
device_role = (device_role_t *) wmem_new(wmem_file_scope(), device_role_t);
device_role->change_in_frame = frame_number;
if (role == 0)
device_role->role = ROLE_SLAVE;
else if (role == 1)
device_role->role = ROLE_MASTER;
else
device_role->role = ROLE_UNKNOWN;
wmem_tree_insert32_array(bluetooth_data->bdaddr_to_role, key, device_role);
}
return offset;
}
static int
dissect_bthci_evt_hardware_error(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
proto_tree_add_item(tree, hf_bthci_evt_hardware_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (have_tap_listener(bluetooth_hci_summary_tap)) {
bluetooth_hci_summary_tap_t *tap_hci_summary;
tap_hci_summary = wmem_new(wmem_packet_scope(), bluetooth_hci_summary_tap_t);
tap_hci_summary->interface_id = bluetooth_data->interface_id;
tap_hci_summary->adapter_id = bluetooth_data->adapter_id;
tap_hci_summary->type = BLUETOOTH_HCI_SUMMARY_HARDWARE_ERROR;
tap_hci_summary->hardware_error = tvb_get_guint8(tvb, offset - 1);
tap_hci_summary->name = NULL;
tap_queue_packet(bluetooth_hci_summary_tap, pinfo, tap_hci_summary);
}
return offset;
}
static int
dissect_bthci_evt_loopback_command(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
tvbuff_t *next_tvb;
next_tvb = tvb_new_subset_remaining(tvb, offset);
call_dissector_with_data(bthci_cmd_handle, next_tvb, pinfo, tree, bluetooth_data);
offset += tvb_reported_length_remaining(tvb, offset);
return offset;
}
static int
dissect_bthci_evt_data_buffer_overflow(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_link_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_read_clock_offset_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
proto_item *handle_item;
gint16 clk;
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
handle_item = proto_tree_add_item(tree, hf_bthci_evt_clock_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
clk = tvb_get_letohs(tvb, offset) & 0x7FFF; /* only bits 0-14 are valid */
proto_item_append_text(handle_item, " (%g ms)", 1.25*clk);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_max_slots_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
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_max_slots, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_qos_violation(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_conn_packet_type_changed(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
proto_item *connection_handle_subtree;
guint32 connection_handle;
guint32 link_type = BT_LINK_TYPE_UNKNOWN;
wmem_tree_key_t key[4];
guint32 interface_id;
guint32 adapter_id;
chandle_session_t *chandle_session;
wmem_tree_t *subtree;
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;
connection_handle_subtree = proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
connection_handle = tvb_get_letohs(tvb, offset) & 0x0FFF;
offset += 2;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &connection_handle;
key[3].length = 0;
key[3].key = NULL;
subtree = (wmem_tree_t *) wmem_tree_lookup32_array(bluetooth_data->chandle_sessions, key);
chandle_session = (subtree) ? (chandle_session_t *) wmem_tree_lookup32_le(subtree, pinfo->num) : NULL;
if (chandle_session && chandle_session->connect_in_frame < pinfo->num)
link_type = chandle_session->link_type;
if (link_type == BT_LINK_TYPE_ACL) {
proto_tree_add_bitmask(tree, tvb, offset, hf_packet_type_acl, ett_ptype_subtree, hfx_packet_type_acl, ENC_LITTLE_ENDIAN);
} else if (link_type == BT_LINK_TYPE_SCO) {
proto_tree_add_bitmask(tree, tvb, offset, hf_packet_type_sco, ett_ptype_subtree, hfx_packet_type_sco, ENC_LITTLE_ENDIAN);
} else {
/* Unknown or wrong link type (Link Layer from BTLE), show mix or ACL and SCO */
expert_add_info(pinfo, connection_handle_subtree, &ei_bad_link_type);
proto_tree_add_bitmask(tree, tvb, offset, hf_packet_type_acl, ett_ptype_subtree, hfx_packet_type_acl, ENC_LITTLE_ENDIAN);
proto_tree_add_bitmask(tree, tvb, offset, hf_packet_type_sco, ett_ptype_subtree, hfx_packet_type_sco, ENC_LITTLE_ENDIAN);
}
offset += 2;
return offset;
}
static int
dissect_bthci_evt_command_status(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *main_tree, proto_tree *tree, wmem_list_t *opcode_list,
bluetooth_data_t *bluetooth_data)
{
proto_item *ti_opcode;
proto_tree *opcode_tree;
guint8 status_code;
guint16 opcode;
guint8 ogf;
gint hfx;
status_code = tvb_get_guint8(tvb, offset);
if (status_code != 0) {
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);
}
else {
proto_tree_add_item(tree, hf_bthci_evt_status_pending, tvb, offset, 1, ENC_LITTLE_ENDIAN);
send_hci_summary_pending_tap(pinfo, bluetooth_data);
}
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_num_command_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
opcode = tvb_get_letohs(tvb, offset);
ogf = opcode >> 10;
if (have_tap_listener(bluetooth_hci_summary_tap)) {
bluetooth_hci_summary_tap_t *tap_hci_summary;
tap_hci_summary = wmem_new(wmem_packet_scope(), bluetooth_hci_summary_tap_t);
tap_hci_summary->interface_id = bluetooth_data->interface_id;
tap_hci_summary->adapter_id = bluetooth_data->adapter_id;
tap_hci_summary->type = BLUETOOTH_HCI_SUMMARY_EVENT_OPCODE;
tap_hci_summary->ogf = ogf;
tap_hci_summary->ocf = opcode & 0x03ff;
tap_hci_summary->event = 0x0f; /* Command Status */
if (try_val_to_str_ext(opcode, &bthci_cmd_opcode_vals_ext))
tap_hci_summary->name = val_to_str_ext(opcode, &bthci_cmd_opcode_vals_ext, "Unknown 0x%04x");
else
tap_hci_summary->name = NULL;
tap_queue_packet(bluetooth_hci_summary_tap, pinfo, tap_hci_summary);
}
if (status_code != 0)
add_opcode(opcode_list, opcode, COMMAND_STATUS_RESULT);
else
add_opcode(opcode_list, opcode, COMMAND_STATUS_PENDING);
ti_opcode = proto_tree_add_item(tree, hf_bthci_evt_opcode, tvb, offset, 2, ENC_LITTLE_ENDIAN);
opcode_tree = proto_item_add_subtree(ti_opcode, ett_opcode);
proto_tree_add_item(opcode_tree, hf_bthci_evt_ogf, tvb, offset, 2, ENC_LITTLE_ENDIAN);
if (ogf == HCI_OGF_LINK_CONTROL)
hfx = hf_bthci_evt_ocf_link_control;
else if (ogf == HCI_OGF_LINK_POLICY)
hfx = hf_bthci_evt_ocf_link_policy;
else if (ogf == HCI_OGF_HOST_CONTROLLER)
hfx = hf_bthci_evt_ocf_host_controller_and_baseband;
else if (ogf == HCI_OGF_INFORMATIONAL)
hfx = hf_bthci_evt_ocf_informational;
else if (ogf == HCI_OGF_STATUS)
hfx = hf_bthci_evt_ocf_status;
else if (ogf == HCI_OGF_TESTING)
hfx = hf_bthci_evt_ocf_testing;
else if (ogf == HCI_OGF_LOW_ENERGY)
hfx = hf_bthci_evt_ocf_low_energy;
else if (ogf == HCI_OGF_LOGO_TESTING)
hfx = hf_bthci_evt_ocf_logo_testing;
else
hfx = hf_bthci_evt_ocf;
proto_tree_add_item(opcode_tree, hfx, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (ogf == HCI_OGF_VENDOR_SPECIFIC) {
col_append_fstr(pinfo->cinfo, COL_INFO, " (Vendor Command 0x%04X [(opcode 0x%04X])", opcode & 0x03ff, opcode);
if (!dissector_try_payload_new(vendor_dissector_table, tvb, pinfo, main_tree, TRUE, bluetooth_data)) {
if (bluetooth_data) {
hci_vendor_data_t *hci_vendor_data;
wmem_tree_key_t key[3];
guint32 interface_id;
guint32 adapter_id;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 0;
key[2].key = NULL;
hci_vendor_data = (hci_vendor_data_t *) wmem_tree_lookup32_array(bluetooth_data->hci_vendors, key);
if (hci_vendor_data) {
gint sub_offset;
sub_offset = dissector_try_uint_new(hci_vendor_table, hci_vendor_data->manufacturer, tvb, pinfo, main_tree, TRUE, bluetooth_data);
if (sub_offset > 0 && sub_offset < tvb_captured_length_remaining(tvb, offset))
proto_tree_add_expert(tree, pinfo, &ei_parameter_unexpected, tvb, offset + sub_offset, tvb_captured_length_remaining(tvb, sub_offset + offset));
}
}
}
return tvb_captured_length(tvb);
} else {
col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)",
val_to_str_ext(opcode, &bthci_cmd_opcode_vals_ext, "Unknown 0x%04x"));
}
return offset;
}
static int
dissect_bthci_evt_page_scan_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_page_scan_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_page_scan_repetition_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_page_scan_repetition_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_inquire_result_with_rssi(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data, guint8 *bd_addr)
{
guint8 num, evt_num_responses;
evt_num_responses = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_num_responses, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
for (num = 0; num < evt_num_responses; num++) {
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, (num == 0) ? bd_addr : NULL);
proto_tree_add_item(tree, hf_bthci_evt_page_scan_repetition_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_reserved, tvb, offset, 1, ENC_NA);
offset += 1;
call_dissector(btcommon_cod_handle, tvb_new_subset_length(tvb, offset, 3), pinfo, tree);
offset += 3;
proto_tree_add_item(tree, hf_bthci_evt_clock_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_rssi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
}
return offset;
}
static int
dissect_bthci_evt_io_capability_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
return offset;
}
static int
dissect_bthci_evt_io_capability_response(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_io_capability, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_oob_data_present, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_auth_requirements, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_user_confirmation_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_numeric_value, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
return offset;
}
static int
dissect_bthci_evt_user_passkey_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
return offset;
}
static int
dissect_bthci_evt_remote_oob_data_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
return offset;
}
static int
dissect_bthci_evt_simple_pairing_complete(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
return offset;
}
static int
dissect_bthci_evt_user_passkey_notification(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_passkey, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
return offset;
}
static int
dissect_bthci_evt_keypress_notification(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_notification_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_remote_host_sup_feat_notification(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
offset = dissect_bthci_evt_lmp_features(tvb, offset, pinfo, tree, 0);
return offset;
}
static int
dissect_bthci_evt_le_meta(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, wmem_list_t *opcode_list, bluetooth_data_t *bluetooth_data)
{
proto_item *item;
guint8 subevent_code;
guint16 connection_handle;
guint8 bd_addr[6];
guint8 status;
subevent_code = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_le_meta_subevent, tvb, offset, 1, ENC_LITTLE_ENDIAN);
if (have_tap_listener(bluetooth_hci_summary_tap)) {
bluetooth_hci_summary_tap_t *tap_hci_summary;
tap_hci_summary = wmem_new(wmem_packet_scope(), bluetooth_hci_summary_tap_t);
tap_hci_summary->interface_id = bluetooth_data->interface_id;
tap_hci_summary->adapter_id = bluetooth_data->adapter_id;
tap_hci_summary->type = BLUETOOTH_HCI_SUMMARY_SUBEVENT;
tap_hci_summary->event = 0x3E; /* LE Meta */
tap_hci_summary->subevent = subevent_code;
if (try_val_to_str(subevent_code, evt_le_meta_subevent))
tap_hci_summary->name = val_to_str(subevent_code, evt_le_meta_subevent, "Unknown 0x%04x");
else
tap_hci_summary->name = NULL;
tap_queue_packet(bluetooth_hci_summary_tap, pinfo, tap_hci_summary);
}
col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)", val_to_str(subevent_code, evt_le_meta_subevent, "Unknown 0x%02x"));
offset += 1;
switch(subevent_code) {
case 0x01: /* LE Connection Complete */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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);
connection_handle = tvb_get_letohs(tvb, offset) & 0x0FFF;
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_role, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
item = proto_tree_add_item(tree, hf_bthci_evt_le_con_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_le_con_latency, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_le_supervision_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_evt_le_master_clock_accuracy, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (!pinfo->fd->visited && status == STATUS_SUCCESS) {
wmem_tree_key_t key[5];
guint32 k_interface_id;
guint32 k_adapter_id;
guint32 k_connection_handle;
guint32 k_frame_number;
remote_bdaddr_t *remote_bdaddr;
chandle_session_t *chandle_session;
k_interface_id = bluetooth_data->interface_id;
k_adapter_id = bluetooth_data->adapter_id;
k_connection_handle = connection_handle;
k_frame_number = pinfo->num;
key[0].length = 1;
key[0].key = &k_interface_id;
key[1].length = 1;
key[1].key = &k_adapter_id;
key[2].length = 1;
key[2].key = &k_connection_handle;
key[3].length = 1;
key[3].key = &k_frame_number;
key[4].length = 0;
key[4].key = NULL;
remote_bdaddr = (remote_bdaddr_t *) wmem_new(wmem_file_scope(), remote_bdaddr_t);
remote_bdaddr->interface_id = bluetooth_data->interface_id;
remote_bdaddr->adapter_id = bluetooth_data->adapter_id;
remote_bdaddr->chandle = connection_handle;
memcpy(remote_bdaddr->bd_addr, bd_addr, 6);
wmem_tree_insert32_array(bluetooth_data->chandle_to_bdaddr, key, remote_bdaddr);
chandle_session = (chandle_session_t *) wmem_new(wmem_file_scope(), chandle_session_t);
chandle_session->connect_in_frame = k_frame_number;
chandle_session->disconnect_in_frame = bluetooth_max_disconnect_in_frame;
chandle_session->link_type = BT_LINK_TYPE_LL;
wmem_tree_insert32_array(bluetooth_data->chandle_sessions, key, chandle_session);
}
add_opcode(opcode_list, 0x200D, COMMAND_STATUS_NORMAL); /* LE Create Connection */
break;
case 0x02: /* LE Advertising Report */
{
guint8 i, num_reports, length;
num_reports = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_num_reports, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
for (i = 0; i < num_reports; i++) {
proto_tree_add_item(tree, hf_bthci_evt_advts_event_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
length = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_data_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (length > 0) {
bluetooth_eir_ad_data_t *ad_data;
ad_data = wmem_new0(wmem_packet_scope(), bluetooth_eir_ad_data_t);
ad_data->interface_id = bluetooth_data->interface_id;
ad_data->adapter_id = bluetooth_data->adapter_id;
ad_data->bd_addr = bd_addr;
call_dissector_with_data(btcommon_ad_handle, tvb_new_subset_length(tvb, offset, length), pinfo, tree, ad_data);
save_remote_device_name(tvb, offset, pinfo, length, bd_addr, bluetooth_data);
offset += length;
}
proto_tree_add_item(tree, hf_bthci_evt_rssi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
}
}
break;
case 0x03: /* LE Connection Update Complete */
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_le_con_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_le_con_latency, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_le_supervision_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g sec)", tvb_get_letohs(tvb, offset)*0.01);
offset += 2;
add_opcode(opcode_list, 0x2013, COMMAND_STATUS_NORMAL); /* LE Connection Update */
break;
case 0x04: /* LE Read Remote Features Complete */
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_evt_le_features, ett_le_features, hfx_bthci_evt_le_features, ENC_LITTLE_ENDIAN);
offset += 8;
add_opcode(opcode_list, 0x2016, COMMAND_STATUS_NORMAL); /* LE Read Remote Features */
break;
case 0x05: /* LE Long Term Key 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_random_number, tvb, offset, 8, ENC_NA);
offset += 8;
proto_tree_add_item(tree, hf_bthci_evt_encrypted_diversifier, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x06: /* LE Remote Connection Parameter Request */
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_le_min_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset) * 1.25);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_le_max_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_le_con_latency, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_le_supervision_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g sec)", tvb_get_letohs(tvb, offset) * 0.01);
offset += 2;
break;
case 0x07: /* LE Data Length Change */
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_le_max_tx_octets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_le_max_tx_time, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_le_max_rx_octets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_le_max_rx_time, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x08: /* LE Read Local P-256 Public Key Complete */
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;
proto_tree_add_item(tree, hf_bthci_evt_le_local_p_256_public_key, tvb, offset, 64, ENC_NA);
offset += 64;
add_opcode(opcode_list, 0x2025, COMMAND_STATUS_NORMAL); /* LE Read Local P-256 Public Key */
break;
case 0x09: /* LE Generate DHKey Complete */
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;
proto_tree_add_item(tree, hf_bthci_evt_le_dhkey, tvb, offset, 32, ENC_NA);
offset += 32;
add_opcode(opcode_list, 0x2026, COMMAND_STATUS_NORMAL); /* LE Generate DHKey */
break;
case 0x0A: /* LE Enhanced Connection Complete */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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);
connection_handle = tvb_get_letohs(tvb, offset) & 0x0FFF;
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_role, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
offset = dissect_bd_addr(hf_bthci_evt_le_local_rpa, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
offset = dissect_bd_addr(hf_bthci_evt_le_peer_rpa, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
item = proto_tree_add_item(tree, hf_bthci_evt_le_con_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_le_con_latency, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_le_supervision_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_evt_le_master_clock_accuracy, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (!pinfo->fd->visited && status == STATUS_SUCCESS) {
wmem_tree_key_t key[5];
guint32 k_interface_id;
guint32 k_adapter_id;
guint32 k_connection_handle;
guint32 k_frame_number;
remote_bdaddr_t *remote_bdaddr;
chandle_session_t *chandle_session;
k_interface_id = bluetooth_data->interface_id;
k_adapter_id = bluetooth_data->adapter_id;
k_connection_handle = connection_handle;
k_frame_number = pinfo->num;
key[0].length = 1;
key[0].key = &k_interface_id;
key[1].length = 1;
key[1].key = &k_adapter_id;
key[2].length = 1;
key[2].key = &k_connection_handle;
key[3].length = 1;
key[3].key = &k_frame_number;
key[4].length = 0;
key[4].key = NULL;
remote_bdaddr = (remote_bdaddr_t *) wmem_new(wmem_file_scope(), remote_bdaddr_t);
remote_bdaddr->interface_id = bluetooth_data->interface_id;
remote_bdaddr->adapter_id = bluetooth_data->adapter_id;
remote_bdaddr->chandle = connection_handle;
memcpy(remote_bdaddr->bd_addr, bd_addr, 6);
wmem_tree_insert32_array(bluetooth_data->chandle_to_bdaddr, key, remote_bdaddr);
chandle_session = (chandle_session_t *) wmem_new(wmem_file_scope(), chandle_session_t);
chandle_session->connect_in_frame = k_frame_number;
chandle_session->disconnect_in_frame = bluetooth_max_disconnect_in_frame;
chandle_session->link_type = BT_LINK_TYPE_LL;
wmem_tree_insert32_array(bluetooth_data->chandle_sessions, key, chandle_session);
}
add_opcode(opcode_list, 0x200D, COMMAND_STATUS_NORMAL); /* LE Create Connection */
break;
case 0x0B: /* LE Direct Advertising Report */
{
guint8 number_of_reports;
guint8 report_id = 1;
proto_tree_add_item(tree, hf_bthci_evt_le_number_of_reports, tvb, offset, 1, ENC_NA);
number_of_reports = tvb_get_guint8(tvb, offset);
offset += 1;
while (number_of_reports) {
proto_item *report_item;
proto_tree *report_tree;
report_item = proto_tree_add_none_format(tree, hf_bthci_evt_le_report, tvb, offset, 16, "Item %u",
report_id);
report_tree = proto_item_add_subtree(report_item, ett_le_report);
proto_tree_add_item(report_tree, hf_bthci_evt_le_event_type, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(report_tree, hf_bthci_evt_le_direct_address_type, tvb, offset, 1, ENC_NA);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_le_direct_bd_addr, pinfo, report_tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(report_tree, hf_bthci_evt_le_address_type, tvb, offset, 1, ENC_NA);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, report_tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(report_tree, hf_bthci_evt_le_rssi, tvb, offset, 1, ENC_NA);
offset += 1;
report_id += 1;
number_of_reports--;
}
}
break;
case 0x0C: /* LE PHY Update Complete */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_le_tx_phy, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_le_rx_phy, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case 0x0D: /* LE Extended Advertising Report */
{
guint8 i, num_reports, length;
num_reports = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_num_reports, tvb, offset, 1, ENC_NA);
offset += 1;
for (i = 0; i < num_reports; i++) {
proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_evt_ext_advts_event_type, ett_le_ext_advts_event_type, hfx_bthci_evt_le_ext_advts_evt_type, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_le_peer_address_type, tvb, offset, 1, ENC_NA);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
proto_tree_add_item(tree, hf_bthci_evt_primary_phy, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_secondary_phy, tvb, offset, 1, ENC_NA);
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_advertising_sid, tvb, offset, 1, ENC_NA);
if (tvb_get_guint8(tvb, offset) == 0xFF)
proto_item_append_text(item, " (not available)");
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_tx_power, tvb, offset, 1, ENC_NA);
if (tvb_get_guint8(tvb, offset) == 127)
proto_item_append_text(item, " (not available)");
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_rssi, tvb, offset, 1, ENC_NA);
if (tvb_get_guint8(tvb, offset) == 127)
proto_item_append_text(item, " (not available)");
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_periodic_advertising_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
if (tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN) == 0x0000)
proto_item_append_text(item, " (no periodic advertising)");
else
proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset)*1.25);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_le_direct_address_type, tvb, offset, 1, ENC_NA);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_le_direct_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
length = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_data_length, tvb, offset, 1, ENC_NA);
offset += 1;
if (length > 0) {
bluetooth_eir_ad_data_t *ad_data;
ad_data = wmem_new0(wmem_packet_scope(), bluetooth_eir_ad_data_t);
ad_data->interface_id = bluetooth_data->interface_id;
ad_data->adapter_id = bluetooth_data->adapter_id;
ad_data->bd_addr = bd_addr;
call_dissector_with_data(btcommon_ad_handle, tvb_new_subset_length(tvb, offset, length), pinfo, tree, ad_data);
save_remote_device_name(tvb, offset, pinfo, length, bd_addr, bluetooth_data);
offset += length;
}
}
}
break;
case 0x0E: /* LE Periodic Advertising Sync 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_sync_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_advertising_sid, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_le_peer_address_type, tvb, offset, 1, ENC_NA);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
proto_tree_add_item(tree, hf_bthci_evt_advertiser_phy, tvb, offset, 1, ENC_NA);
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_periodic_advertising_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_advertiser_clock_accuracy, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case 0x0F: /* LE Periodic Advertising Report */
{
guint8 length;
proto_tree_add_item(tree, hf_bthci_evt_sync_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_tx_power, tvb, offset, 1, ENC_NA);
if (tvb_get_guint8(tvb, offset) == 127)
proto_item_append_text(item, " (not available)");
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_rssi, tvb, offset, 1, ENC_NA);
if (tvb_get_guint8(tvb, offset) == 127)
proto_item_append_text(item, " (not available)");
offset += 1;
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;
proto_tree_add_item(tree, hf_bthci_evt_data_length, tvb, offset, 1, ENC_NA);
length = tvb_get_guint8(tvb, offset);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_data, tvb, offset, length, ENC_NA);
offset += length;
}
break;
case 0x10: /* LE Periodic Advertising Sync Lost */
proto_tree_add_item(tree, hf_bthci_evt_sync_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x12: /* LE Advertising Set Terminated */
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_advertising_handle, tvb, offset, 1, ENC_NA);
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_num_compl_ext_advertising_events, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case 0x13: /* LE Scan Request Received */
proto_tree_add_item(tree, hf_bthci_evt_advertising_handle, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_le_address_type, tvb, offset, 1, ENC_NA);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
break;
case 0x14: /* LE Channel Selection Algorithm */
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_channel_selection_algorithm, tvb, offset, 1, ENC_NA);
offset += 1;
break;
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
case 0x15: /* LE Connectionless IQ 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_channel_index, tvb, offset, 1, ENC_NA);
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_cte_rssi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g dBm)", tvb_get_letohis(tvb, offset)*0.1);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_antenna_id, tvb, offset, 1, ENC_NA);
offset += 1;
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_slot_durations, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_packet_status, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_event_counter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
offset = dissect_iq_sample_list(tvb, offset, tree);
break;
case 0x16: /* LE Connection IQ Report */
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_le_rx_phy, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_channel_index, tvb, offset, 1, ENC_NA);
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_cte_rssi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g dBm)", tvb_get_letohis(tvb, offset)*0.1);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_antenna_id, tvb, offset, 1, ENC_NA);
offset += 1;
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_slot_durations, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_packet_status, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_event_counter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
offset = dissect_iq_sample_list(tvb, offset, tree);
break;
case 0x17: /* LE CTE Request Failed */
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;
break;
case 0x18: /* LE Periodic Advertising Sync Transfer Received */
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_service_data_past, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
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_advertising_sid, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_le_peer_address_type, tvb, offset, 1, ENC_NA);
offset += 1;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
proto_tree_add_item(tree, hf_bthci_evt_advertiser_phy, tvb, offset, 1, ENC_NA);
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_periodic_advertising_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_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);
connection_handle = tvb_get_letohs(tvb, offset) & 0x0FFF;
offset += 2;
if (!pinfo->fd->visited && status == STATUS_SUCCESS) {
wmem_tree_key_t key[5];
guint32 k_interface_id;
guint32 k_adapter_id;
guint32 k_connection_handle;
guint32 k_frame_number;
chandle_session_t *chandle_session;
k_interface_id = bluetooth_data->interface_id;
k_adapter_id = bluetooth_data->adapter_id;
k_connection_handle = connection_handle;
k_frame_number = pinfo->num;
key[0].length = 1;
key[0].key = &k_interface_id;
key[1].length = 1;
key[1].key = &k_adapter_id;
key[2].length = 1;
key[2].key = &k_connection_handle;
key[3].length = 1;
key[3].key = &k_frame_number;
key[4].length = 0;
key[4].key = NULL;
chandle_session = (chandle_session_t *) wmem_new(wmem_file_scope(), chandle_session_t);
chandle_session->connect_in_frame = k_frame_number;
chandle_session->disconnect_in_frame = bluetooth_max_disconnect_in_frame;
chandle_session->link_type = BT_LINK_TYPE_ISO;
wmem_tree_insert32_array(bluetooth_data->chandle_sessions, key, chandle_session);
}
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 */
{
guint32 chandle, k_shandle;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
chandle = tvb_get_letohs(tvb, offset) & 0xfff;
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_cis_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
k_shandle = tvb_get_letohs(tvb, offset) & 0xfff;
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;
if (!pinfo->fd->visited) {
wmem_tree_key_t key[5];
guint32 interface_id;
guint32 adapter_id;
guint32 frame_number;
stream_connection_handle_pair_t *stream_connection_handle_pair;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
frame_number = pinfo->num;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &k_shandle;
key[3].length = 1;
key[3].key = &frame_number;
key[4].length = 0;
key[4].key = NULL;
stream_connection_handle_pair = (stream_connection_handle_pair_t *) wmem_new(wmem_file_scope(), stream_connection_handle_pair_t);
stream_connection_handle_pair->chandle = chandle;
stream_connection_handle_pair->change_in_frame = frame_number;
wmem_tree_insert32_array(bluetooth_data->shandle_to_chandle, key, stream_connection_handle_pair);
}
}
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_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_LITTLE_ENDIAN);
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_sdu_interval, tvb, offset, 3, ENC_LITTLE_ENDIAN);
offset += 3;
proto_tree_add_item(tree, hf_bthci_evt_max_sdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
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;
case 0x23: /* LE Subrate Change */
{
guint32 underlying_events;
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_subrate_factor, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_le_con_latency, tvb, offset, 2, ENC_LITTLE_ENDIAN);
underlying_events = (tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN) + 1)*
tvb_get_guint16(tvb, offset - 2, ENC_LITTLE_ENDIAN) - 1;
proto_item_append_text(item, ", %u underlying events", underlying_events);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_continuation_number, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_le_supervision_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g sec)", tvb_get_letohs(tvb, offset)*0.01);
offset += 2;
}
break;
default:
break;
}
return offset;
}
static int
dissect_bthci_evt_physical_link_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_physical_link_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_channel_select_physical_link_recovery(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_physical_link_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_disconnect_physical_link_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_physical_link_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
send_hci_summary_reason_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_physical_link_loss_early_warning(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_physical_link_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_link_loss_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_logical_link_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_logical_link_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_physical_link_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_flow_spec_identifier, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_disconnect_logical_link_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_logical_link_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
send_hci_summary_reason_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_flow_spec_modify_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_number_of_completed_data_blocks(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
guint8 evt_num_handles;
proto_tree_add_item(tree, hf_bthci_evt_total_num_data_blocks, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
evt_num_handles = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_num_handles, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
while (evt_num_handles--) {
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_num_compl_packets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_num_compl_blocks, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
return offset;
}
static int
dissect_bthci_evt_amp_start_stop_test(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_test_scenario, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_amp_receiver_test(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_amp_controller_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_report_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_report_event_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_num_frames, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_num_error_frames, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_num_bits, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_num_error_bits, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
return offset;
}
static int
dissect_bthci_evt_short_range_mode_change_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_physical_link_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_short_range_mode_state, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_amp_status_change(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_amp_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_sam_status_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
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_local_sam_index, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_local_sam_tx_availability, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_local_sam_rx_availability, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_remote_sam_index, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_remote_sam_tx_availability, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_remote_sam_rx_availability, tvb, offset, 1, ENC_NA);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *main_tree, proto_tree *tree,
wmem_list_t *opcode_list, bluetooth_data_t *bluetooth_data, guint32 *out_opcode)
{
proto_item *ti_opcode;
proto_tree *opcode_tree;
proto_item *item;
gint16 timeout;
guint8 num8;
guint i;
guint8 ogf;
guint32 accuracy;
guint8 bd_addr[6];
gboolean local_addr = FALSE;
gint hfx;
guint8 status;
wmem_tree_key_t key[4];
guint32 interface_id;
guint32 adapter_id;
guint32 frame_number;
guint32 opcode;
proto_tree_add_item(tree, hf_bthci_evt_num_command_packets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
opcode = tvb_get_letohs(tvb, offset);
ogf = opcode >> 10;
if (out_opcode)
*out_opcode = opcode;
if (have_tap_listener(bluetooth_hci_summary_tap)) {
bluetooth_hci_summary_tap_t *tap_hci_summary;
tap_hci_summary = wmem_new(wmem_packet_scope(), bluetooth_hci_summary_tap_t);
tap_hci_summary->interface_id = bluetooth_data->interface_id;
tap_hci_summary->adapter_id = bluetooth_data->adapter_id;
tap_hci_summary->type = BLUETOOTH_HCI_SUMMARY_EVENT_OPCODE;
tap_hci_summary->ogf = ogf;
tap_hci_summary->ocf = opcode & 0x03ff;
tap_hci_summary->event = 0x0e; /* Command Complete */
if (try_val_to_str_ext(opcode, &bthci_cmd_opcode_vals_ext))
tap_hci_summary->name = val_to_str_ext(opcode, &bthci_cmd_opcode_vals_ext, "Unknown 0x%04x");
else
tap_hci_summary->name = NULL;
tap_queue_packet(bluetooth_hci_summary_tap, pinfo, tap_hci_summary);
}
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
frame_number = pinfo->num;
ti_opcode = proto_tree_add_item(tree, hf_bthci_evt_opcode, tvb, offset, 2, ENC_LITTLE_ENDIAN);
opcode_tree = proto_item_add_subtree(ti_opcode, ett_opcode);
proto_tree_add_item(opcode_tree, hf_bthci_evt_ogf, tvb, offset, 2, ENC_LITTLE_ENDIAN);
if (ogf == HCI_OGF_LINK_CONTROL)
hfx = hf_bthci_evt_ocf_link_control;
else if (ogf == HCI_OGF_LINK_POLICY)
hfx = hf_bthci_evt_ocf_link_policy;
else if (ogf == HCI_OGF_HOST_CONTROLLER)
hfx = hf_bthci_evt_ocf_host_controller_and_baseband;
else if (ogf == HCI_OGF_INFORMATIONAL)
hfx = hf_bthci_evt_ocf_informational;
else if (ogf == HCI_OGF_STATUS)
hfx = hf_bthci_evt_ocf_status;
else if (ogf == HCI_OGF_TESTING)
hfx = hf_bthci_evt_ocf_testing;
else if (ogf == HCI_OGF_LOW_ENERGY)
hfx = hf_bthci_evt_ocf_low_energy;
else if (ogf == HCI_OGF_LOGO_TESTING)
hfx = hf_bthci_evt_ocf_logo_testing;
else
hfx = hf_bthci_evt_ocf;
proto_tree_add_item(opcode_tree, hfx, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (ogf == HCI_OGF_VENDOR_SPECIFIC) {
col_append_fstr(pinfo->cinfo, COL_INFO, " (Vendor Command 0x%04X [opcode 0x%04X])", opcode & 0x03ff, opcode);
if (!dissector_try_payload_new(vendor_dissector_table, tvb, pinfo, main_tree, TRUE, bluetooth_data)) {
if (bluetooth_data) {
hci_vendor_data_t *hci_vendor_data;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 0;
key[2].key = NULL;
hci_vendor_data = (hci_vendor_data_t *) wmem_tree_lookup32_array(bluetooth_data->hci_vendors, key);
if (hci_vendor_data) {
gint sub_offset;
sub_offset = dissector_try_uint_new(hci_vendor_table, hci_vendor_data->manufacturer, tvb, pinfo, main_tree, TRUE, bluetooth_data);
if (sub_offset > 0 && sub_offset < tvb_captured_length_remaining(tvb, offset))
proto_tree_add_expert(tree, pinfo, &ei_parameter_unexpected, tvb, offset + sub_offset, tvb_captured_length_remaining(tvb, sub_offset + offset));
}
}
}
proto_tree_add_item(tree, hf_bthci_evt_ret_params, tvb, offset, tvb_captured_length_remaining(tvb, offset), ENC_NA);
offset = tvb_captured_length(tvb);
} else {
col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)",
val_to_str_ext(opcode, &bthci_cmd_opcode_vals_ext, "Unknown 0x%04x"));
}
if (ogf != HCI_OGF_VENDOR_SPECIFIC) switch(opcode) {
/* This is a list of Commands that all return just the status */
case 0x0402: /* Inquiry Cancel */
case 0x0403: /* Periodic Inquiry Mode */
case 0x0404: /* Exit Periodic Enquiry Mode */
case 0x080f: /* Write Default Link Policy Settings */
case 0x0c01: /* Set Event Mask */
case 0x0c03: /* Reset */
case 0x0c05: /* Set Event Filter */
case 0x0c0a: /* Write PIN Type */
case 0x0c0b: /* Create Unit Key */
case 0x0c13: /* Change Local Name */
case 0x0c16: /* Write Connection Accept Timeout */
case 0x0c18: /* Write Page Timeout */
case 0x0c1a: /* Write Scan Enable */
case 0x0c1c: /* Write Page Scan Activity */
case 0x0c1e: /* Write Inquiry Scan Activity */
case 0x0c20: /* Write Authentication Enable */
case 0x0c22: /* Write Encryption Mode */
case 0x0c24: /* Write Class of Device */
case 0x0c26: /* Write Voice Setting */
case 0x0c2a: /* Write Num Broadcast Retransmissions */
case 0x0c2c: /* Write Hold Mode Activity */
case 0x0c2f: /* Write SCO Flow Control Enable */
case 0x0c31: /* Set Host Controller To Host Flow Control */
case 0x0c33: /* Host Buffer Size */
case 0x0c3a: /* Write Current IAC LAP */
case 0x0c3c: /* Write Page Scan Period Mode */
case 0x0c3e: /* Write Page Scan Mode */
case 0x0c3f: /* Set AFH Host Channel Classification */
case 0x0c43: /* Write Inquiry Scan Type */
case 0x0c45: /* Write Inquiry Mode */
case 0x0c47: /* Write Page Scan Type */
case 0x0c49: /* Write AFH Channel Assessment Mode */
case 0x0c52: /* Write Extended Inquiry Response */
case 0x0c56: /* Write Simple Pairing Mode */
case 0x0c59: /* Write Inquiry Tx Power Level */
case 0x0c5b: /* Write Default Erroneous Data Reporting */
case 0x0c62: /* Write Logical Link Accept Timeout */
case 0x0c63: /* Set Event Mask Page 2 */
case 0x0c65: /* Write Location Data */
case 0x0c67: /* Write Flow Control Mode */
case 0x0c6a: /* Write Best Effort Timeout */
case 0x0c6d: /* Write LE Host Supported */
case 0x0c6e: /* Set MWS Channel Parameters */
case 0x0c6f: /* Set External Frame Configuration */
case 0x0c71: /* Set MWS Transport Layer */
case 0x0c72: /* Set MWS Scan Frequency Table */
case 0x0c73: /* Set MWS Pattern Configuration */
case 0x0c7a: /* Write Secure Connections Host Support */
case 0x0c7f: /* Write Extended Page Timeout */
case 0x0c81: /* Write Extended Inquiry Length */
case 0x140d: /* Set Triggered Clock Capture */
case 0x1802: /* Write Loopback Mode */
case 0x1803: /* Enable Device Under Test Mode */
case 0x1804: /* Write Simple Pairing Debug Mode */
case 0x1807: /* Enable AMP Receiver Reports */
case 0x1808: /* AMP Test End */
case 0x1809: /* AMP Test */
case 0x2001: /* LE Set Event Mask */
case 0x2005: /* LE Set Random Address */
case 0x2006: /* LE Set Advertising Parameters */
case 0x2008: /* LE Set Advertising Data */
case 0x2009: /* LE Set Scan Response Data */
case 0x200a: /* LE Set Advertise Enable */
case 0x200b: /* LE Set Scan Parameters */
case 0x200c: /* LE Set Scan Enable */
case 0x200e: /* LE Create Connection Cancel */
case 0x2010: /* LE Clear White List */
case 0x2011: /* LE Add Device To White List */
case 0x2012: /* LE Remove Device From White List */
case 0x2014: /* LE Set Host Channel Classification */
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
case 0x201d: /* LE Receiver Test [v1] */
case 0x201e: /* LE Transmitter Test [v1] */
case 0x2024: /* LE Write Suggested Default Data Length */
case 0x2027: /* LE Add Device to Resolving List */
case 0x2028: /* LE Remove Device From Resolving List */
case 0x2029: /* LE Clear Resolving List */
case 0x202D: /* LE Set Address Resolution Enable */
case 0x202E: /* LE Set Resolvable Private Address Timeout */
case 0x2031: /* LE Set Default PHY */
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
case 0x2033: /* LE Receiver Test [v2] */
case 0x2034: /* LE Transmitter Test [v2] */
case 0x2035: /* LE Set Advertising Set Random Address */
case 0x2037: /* LE Set Extended Advertising Data */
case 0x2038: /* LE Set Extended Scan Response Data */
case 0x2039: /* LE Set Extended Advertising Enable */
case 0x203C: /* LE Remove Advertising Set */
case 0x203D: /* LE Clear Advertising Sets */
case 0x203E: /* LE Set Periodic Advertising Parameters */
case 0x203F: /* LE Set Periodic Advertising Data */
case 0x2040: /* LE Set Periodic Advertising Enable */
case 0x2041: /* LE Set Extended Scan Parameters */
case 0x2042: /* LE Set Extended Scan Enable */
case 0x2045: /* LE Periodic Advertising Create Sync Cancel */
case 0x2046: /* LE Periodic Advertising Terminate Sync */
case 0x2047: /* LE Add Device To Periodic Advertiser List */
case 0x2048: /* LE Remove Device From Periodic Advertiser List */
case 0x2049: /* LE Clear Periodic Advertiser List */
case 0x204D: /* LE Write RF Path Compensation */
case 0x204E: /* LE Set Privacy Mode */
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
case 0x204F: /* LE Receiver Test [v3] */
case 0x2050: /* LE Transmitter Test [v3] */
case 0x2051: /* LE Set Connectionless CTE Transmit Parameters */
case 0x2052: /* LE Set Connectionless CTE Transmit Enable */
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 */
case 0x207C: /* LE Set Data Related Address Changes */
case 0x207D: /* LE Set Default Subrate */
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;
break;
/* This is a list of Commands that all return status and BD_ADDR */
case 0x1009: /* Read BD_ADDR */
local_addr = TRUE;
/* FALLTHROUGH */
case 0x0408: /* Create Connection Cancel */
case 0x040b: /* Link Key Request Reply */
case 0x040c: /* Link Key Request Negative Reply */
case 0x040d: /* PIN Code Request Reply */
case 0x040e: /* PIN Code Request Negative Reply */
case 0x041a: /* Remote Name Request Cancel */
case 0x042b: /* IO Capability Request Reply */
case 0x042c: /* User Confirmation Request Reply */
case 0x042d: /* User Confirmation Request Negative Reply */
case 0x042e: /* User Passkey Request Reply */
case 0x042f: /* User Passkey Request Negative Reply */
case 0x0430: /* Remote OOB Data Request Reply */
case 0x0433: /* Remote OOB Data Request Negative Reply */
case 0x0434: /* IO Capability Request Negative Reply */
case 0x0440: /* Truncated Page Cancel */
case 0x0445: /* Remote OOB Extended Data Request Reply */
case 0x0c60: /* Send Keypress Notification */
case 0x202B: /* LE Read Peer Resolvable Address */
case 0x202C: /* LE Read Local Resolvable Address */
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;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, local_addr, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
if (!pinfo->fd->visited && local_addr) {
localhost_bdaddr_entry_t *localhost_bdaddr_entry;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
frame_number = pinfo->num;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &frame_number;
key[3].length = 0;
key[3].key = NULL;
localhost_bdaddr_entry = (localhost_bdaddr_entry_t *) wmem_new(wmem_file_scope(), localhost_bdaddr_entry_t);
localhost_bdaddr_entry->interface_id = interface_id;
localhost_bdaddr_entry->adapter_id = adapter_id;
memcpy(localhost_bdaddr_entry->bd_addr, bd_addr, 6);
wmem_tree_insert32_array(bluetooth_data->localhost_bdaddr, key, localhost_bdaddr_entry);
}
if (local_addr && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
memcpy(tap_device->bd_addr, bd_addr, 6);
tap_device->has_bd_addr = TRUE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_LOCAL_ADAPTER;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
/* This is a list of Commands that all return status and connection_handle */
case 0x080d: /* Write Link Policy Settings */
case 0x0811: /* Sniff Subrating */
case 0x0c08: /* Flush */
case 0x0c28: /* Write Automatic Flush Timeout */
case 0x0c37: /* Write Link Supervision Timeout */
case 0x0c7c: /* Write Authenticated Payload Timeout */
case 0x1402: /* Reset Failed Contact Counter */
case 0x180a: /* Write Secure Connections Test Mode */
case 0x201a: /* LE Long Term Key Request Reply */
case 0x201b: /* LE Long Term Key Request Neg Reply */
case 0x2020: /* LE Remote Connection Parameter Request Reply */
case 0x2021: /* LE Remote Connection Parameter Request Negative Reply */
case 0x2022: /* LE Set Data Length */
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
case 0x2054: /* LE Set Connection CTE Receive Parameters */
case 0x2055: /* LE Set Connection CTE Transmit Parameters */
case 0x2056: /* LE Connection CTE Request Enable */
case 0x2057: /* LE Connection CTE Response Enable */
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
/* This is a list of Commands that all return status and timeout */
case 0x0c15: /* Read Connection Accept Timeout */
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;
timeout = tvb_get_letohs(tvb, offset);
item = proto_tree_add_item(tree, hf_bthci_evt_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", timeout*0.625);
offset += 2;
break;
case 0x0c17: /* Read Page Timeout */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
status = tvb_get_guint8(tvb, offset);
send_hci_summary_status_tap(status, pinfo, bluetooth_data);
offset += 1;
timeout = tvb_get_letohs(tvb, offset);
item = proto_tree_add_item(tree, hf_bthci_evt_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", timeout*0.625);
offset += 2;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_PAGE_TIMEOUT;
tap_device->data.page_timeout = tvb_get_guint16(tvb, offset - 2, ENC_LITTLE_ENDIAN);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
/* This is a list of Commands that all return status, connection handle and timeout */
case 0x0c27: /* Read Automatic Flush Timeout */
case 0x0c36: /* Read Link Supervision Timeout */
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
timeout = tvb_get_letohs(tvb, offset);
item = proto_tree_add_item(tree, hf_bthci_evt_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", timeout*0.625);
offset += 2;
break;
/* This is a list of Commands that all return status, interval and window */
case 0x0c1b: /* Read Page Scan Activity */
case 0x0c1d: /* Read Inquiry Scan Activity */
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;
proto_tree_add_item(tree, hf_bthci_evt_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_window, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x0420: /* Read LMP Handle */
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;
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_lmp_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
/* 4 reserved bytes */
offset += 4;
break;
case 0x043b: /* Logical Link Cancel */
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;
proto_tree_add_item(tree, hf_bthci_evt_physical_link_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_flow_spec_identifier, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0809: /* Role Discovery */
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;
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_curr_role, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x080c: /* Read Link Policy Settings */
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;
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_link_policy_setting_switch, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_hold , tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_sniff , tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_park , tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x080e: /* Read Default Link Policy Settings */
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;
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_switch, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_hold , tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_sniff , tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_park , tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x0c09: /* Read PIN Type */
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;
proto_tree_add_item(tree, hf_bthci_evt_pin_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c0d: /* Read Stored Link Key */
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;
proto_tree_add_item(tree, hf_bthci_evt_max_num_keys, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_num_keys_read, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x0c11: /* Write Stored Link Key */
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;
proto_tree_add_item(tree, hf_bthci_evt_num_keys_written, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c12: /* Delete Stored Link Key */
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;
proto_tree_add_item(tree, hf_bthci_evt_num_keys_deleted, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x0c14: /* Read Local Name */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_device_name, tvb, offset, 248, ENC_UTF_8);
if (status == STATUS_SUCCESS && !pinfo->fd->visited) {
gchar *name;
localhost_name_entry_t *localhost_name_entry;
name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 248, ENC_UTF_8);
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &frame_number;
key[3].length = 0;
key[3].key = NULL;
localhost_name_entry = (localhost_name_entry_t *) wmem_new(wmem_file_scope(), localhost_name_entry_t);
localhost_name_entry->interface_id = interface_id;
localhost_name_entry->adapter_id = adapter_id;
localhost_name_entry->name = wmem_strdup(wmem_file_scope(), name);
wmem_tree_insert32_array(bluetooth_data->localhost_name, key, localhost_name_entry);
}
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_NAME;
tap_device->data.name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 248, ENC_UTF_8);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
offset += 248;
break;
case 0x0c19: /* Read Scan Enable */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_scan_enable, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_SCAN;
tap_device->data.scan = tvb_get_guint8(tvb, offset - 1);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
case 0x0c1f: /* Read Authentication Enable */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_authentication_enable, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_AUTHENTICATION;
tap_device->data.class_of_device = tvb_get_guint8(tvb, offset - 1);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
case 0x0c21: /* Read Encryption Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_encryption_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_ENCRYPTION;
tap_device->data.class_of_device = tvb_get_guint8(tvb, offset - 1);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
case 0x0c23: /* Read Class of Device */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
status = tvb_get_guint8(tvb, offset);
send_hci_summary_status_tap(status, pinfo, bluetooth_data);
offset += 1;
call_dissector(btcommon_cod_handle, tvb_new_subset_length(tvb, offset, 3), pinfo, tree);
offset += 3;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_CLASS_OF_DEVICE;
tap_device->data.class_of_device = tvb_get_guint24(tvb, offset - 3, ENC_LITTLE_ENDIAN);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
case 0x0c25: /* Read Voice Setting */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_input_unused, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_input_coding, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_input_data_format, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_input_sample_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_linear_pcm_bit_pos, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_air_coding_format, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_VOICE_SETTING;
tap_device->data.voice_setting = tvb_get_guint16(tvb, offset - 2, ENC_LITTLE_ENDIAN);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
case 0x0c29: /* Read Num Broadcast Retransmissions */
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;
proto_tree_add_item(tree, hf_bthci_evt_num_broadcast_retransm, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c2b: /* Read Hold Mode Activity */
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;
proto_tree_add_item(tree, hf_bthci_evt_hold_mode_act_page, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_hold_mode_act_inquiry, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_bthci_evt_hold_mode_act_periodic, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c2d: /* Read Transmit Power Level */
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;
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_transmit_power_level, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c2e: /* Read SCO Flow Control 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;
proto_tree_add_item(tree, hf_bthci_evt_sco_flow_cont_enable, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c38: /* Read Number of Supported IAC */
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;
proto_tree_add_item(tree, hf_bthci_evt_num_supp_iac, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c39: /* Read Current IAC LAP */
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;
num8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_num_curr_iac, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
for (i = 0; i < num8; i++) {
proto_tree_add_item(tree, hf_bthci_evt_iac_lap, tvb, offset, 3, ENC_LITTLE_ENDIAN);
offset += 3;
}
break;
case 0x0c3b: /* Read Page Scan Period Mode */
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;
proto_tree_add_item(tree, hf_bthci_evt_page_scan_period_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c3d: /* Read Page Scan Mode */
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;
proto_tree_add_item(tree, hf_bthci_evt_page_scan_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c42: /* Read Inquiry Scan Type */
case 0x0c46: /* Read Page Scan Type */
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;
proto_tree_add_item(tree, hf_bthci_evt_scan_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c44: /* Read Inquiry Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_inq_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_INQUIRY_MODE;
tap_device->data.inquiry_mode = tvb_get_guint8(tvb, offset - 1);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
case 0x0c48: /* Read AFH Channel Assessment Mode */
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;
proto_tree_add_item(tree, hf_bthci_evt_afh_ch_assessment_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c51: /* Read Extended Inquiry Response */
{
bluetooth_eir_ad_data_t *eir_data;
eir_data = wmem_new0(wmem_packet_scope(), bluetooth_eir_ad_data_t);
eir_data->interface_id = bluetooth_data->interface_id;
eir_data->adapter_id = bluetooth_data->adapter_id;
eir_data->bd_addr = NULL;
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;
proto_tree_add_item(tree, hf_bthci_evt_fec_required, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
call_dissector_with_data(btcommon_eir_handle, tvb_new_subset_length(tvb, offset, 240), pinfo, tree, eir_data);
offset += 240;
}
break;
case 0x0c55: /* Read Simple Pairing Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_simple_pairing_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_SIMPLE_PAIRING_MODE;
tap_device->data.simple_pairing_mode = tvb_get_guint8(tvb, offset - 1);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
case 0x0c57: /* Read Local OOB Data */
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;
proto_tree_add_item(tree, hf_bthci_evt_hash_c, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(tree, hf_bthci_evt_randomizer_r, tvb, offset, 16, ENC_NA);
offset += 16;
break;
case 0x0c58: /* Read Inquiry Response Tx Power Level */
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;
proto_tree_add_item(tree, hf_bthci_evt_power_level_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c5a: /* Read Default Erroneous Data Reporting */
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;
proto_tree_add_item(tree, hf_bthci_evt_err_data_reporting, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c61: /* Read Logical Link Accept Timeout */
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;
item = proto_tree_add_item(tree, hf_bthci_evt_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_letohs(tvb, offset)*0.625);
offset += 2;
break;
case 0x0c64: /* Read Location Data */
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;
proto_tree_add_item(tree, hf_bthci_evt_location_domain_aware, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_location_domain, tvb, offset, 2, ENC_ASCII | ENC_NA);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_location_domain_options, tvb, offset, 1, ENC_ASCII | ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_location_options, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c66: /* Read Flow Control Mode */
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;
proto_tree_add_item(tree, hf_bthci_evt_flow_control_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c68: /* Read Enhanced Tx Power Level */
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;
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_transmit_power_level_gfsk, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_transmit_power_level_dqpsk, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_transmit_power_level_8dpsk, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c69: /* Read Best Effort Timeout */
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;
proto_tree_add_item(tree, hf_bthci_evt_flush_to_us, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
break;
case 0x0c6c: /* Read LE Host Supported */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_le_supported_host, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_le_simultaneous_host, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0c74: /* Set Reserved LT_ADDR */
case 0x0c75: /* Delete Reserved LT_ADDR */
case 0x0c76: /* Set Connectionless Slave Broadcast Data */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_lt_addr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x1001: /* Read Local Version Information */ {
proto_item *hci_revision_item;
proto_item *manufacturer_item;
proto_item *lmp_subversion_item;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
status = tvb_get_guint8(tvb, offset);
send_hci_summary_status_tap(status, pinfo, bluetooth_data);
offset += 1;
proto_tree_add_item(tree, hf_bthci_bthci_evt_hci_version, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
hci_revision_item = proto_tree_add_item(tree, hf_bthci_evt_hci_revision, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_vers_nr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
manufacturer_item = proto_tree_add_item(tree, hf_bthci_evt_comp_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
lmp_subversion_item = proto_tree_add_item(tree, hf_bthci_evt_sub_vers_nr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (status == STATUS_SUCCESS) {
hci_vendor_data_t *hci_vendor_data;
guint16 hci_revision;
guint16 manufacturer;
guint16 lmp_subversion;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 0;
key[2].key = NULL;
hci_vendor_data = (hci_vendor_data_t *) wmem_tree_lookup32_array(bluetooth_data->hci_vendors, key);
hci_revision = tvb_get_letohs(tvb, offset - 7);
manufacturer = tvb_get_letohs(tvb, offset - 4);
lmp_subversion = tvb_get_letohs(tvb, offset - 2);
if (have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
guint8 hci_version;
guint8 lmp_version;
hci_version = tvb_get_guint8(tvb, offset - 8);
lmp_version = tvb_get_guint8(tvb, offset - 5);
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
tap_device->type = BLUETOOTH_DEVICE_LOCAL_VERSION;
tap_device->interface_id = interface_id;
tap_device->adapter_id = adapter_id;
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->data.local_version.hci_version = hci_version;
tap_device->data.local_version.hci_revision = hci_revision;
tap_device->data.local_version.lmp_version = lmp_version;
tap_device->data.local_version.lmp_subversion = lmp_subversion;
tap_device->data.local_version.manufacturer = manufacturer;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
if (hci_vendor_data) {
proto_tree *sub_tree;
proto_item *sub_item;
if (manufacturer != hci_vendor_data->manufacturer) {
expert_add_info(pinfo, manufacturer_item, &ei_manufacturer_data_changed);
sub_tree = proto_item_add_subtree(manufacturer_item, ett_expert);
sub_item = proto_tree_add_uint(sub_tree, hf_changed_in_frame, tvb, 0, 0, hci_vendor_data->change_in_frame);
proto_item_set_generated(sub_item);
}
if (hci_revision != hci_vendor_data->hci_revision) {
expert_add_info(pinfo, hci_revision_item, &ei_hci_revision_changed);
sub_tree = proto_item_add_subtree(hci_revision_item, ett_expert);
sub_item = proto_tree_add_uint(sub_tree, hf_changed_in_frame, tvb, 0, 0, hci_vendor_data->change_in_frame);
proto_item_set_generated(sub_item);
}
if (lmp_subversion != hci_vendor_data->lmp_subversion) {
expert_add_info(pinfo, lmp_subversion_item, &ei_lmp_subversion_changed);
sub_tree = proto_item_add_subtree(lmp_subversion_item, ett_expert);
sub_item = proto_tree_add_uint(sub_tree, hf_changed_in_frame, tvb, 0, 0, hci_vendor_data->change_in_frame);
proto_item_set_generated(sub_item);
}
}
if (!pinfo->fd->visited) {
hci_vendor_data_t *new_hci_vendor_data;
new_hci_vendor_data = wmem_new(wmem_file_scope(), hci_vendor_data_t);
new_hci_vendor_data->hci_revision = hci_revision;
new_hci_vendor_data->manufacturer = manufacturer;
new_hci_vendor_data->lmp_subversion = lmp_subversion;
new_hci_vendor_data->change_in_frame = pinfo->num;
if (hci_vendor_data && hci_vendor_data->change_in_frame < pinfo->num)
new_hci_vendor_data->previous = hci_vendor_data;
else
new_hci_vendor_data->previous = NULL;
wmem_tree_insert32_array(bluetooth_data->hci_vendors, key, new_hci_vendor_data);
}
}}
break;
case 0x1002: /* Read Local Supported Commands */
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_local_supported_cmds, tvb, offset, 64, ENC_NA);
offset += 64;
break;
case 0x1003: /* Read Local Supported Features */
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;
offset = dissect_bthci_evt_lmp_features(tvb, offset, pinfo, tree, 0);
break;
case 0x1004: /* Read Local Extended Features */
{
guint8 page_number;
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;
page_number = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_page_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_max_page_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
offset = dissect_bthci_evt_lmp_features(tvb, offset, pinfo, tree, page_number);
}
break;
case 0x1005: /* Read Buffer Size */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_host_data_packet_length_acl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_host_data_packet_length_sco, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_host_total_num_acl_data_packets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_host_total_num_sco_data_packets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_MTUS;
tap_device->data.mtus.acl_mtu = tvb_get_guint16(tvb, offset - 7, ENC_LITTLE_ENDIAN);
tap_device->data.mtus.sco_mtu = tvb_get_guint8(tvb, offset - 5);
tap_device->data.mtus.acl_packets = tvb_get_guint16(tvb, offset - 4, ENC_LITTLE_ENDIAN);
tap_device->data.mtus.sco_packets = tvb_get_guint16(tvb, offset - 2, ENC_LITTLE_ENDIAN);
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
}
break;
case 0x100a: /* Read Data Block Size */
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_max_acl_data_packet_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_data_block_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_total_num_data_blocks, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x100b: /* Read Local Supported Codecs */
{
guint8 count;
guint8 i_count;
proto_tree *sub_tree;
proto_item *sub_item;
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_number_of_supported_codecs, tvb, offset, 1, ENC_NA);
count = tvb_get_guint8(tvb, offset);
offset += 1;
sub_item = proto_tree_add_item(tree, hf_bthci_evt_codecs, tvb, offset, count, ENC_NA);
sub_tree = proto_item_add_subtree(sub_item, ett_codecs);
for (i_count = 0; i_count < count; i_count+= 1) {
proto_tree_add_item(sub_tree, hf_bthci_evt_codec_id, tvb, offset, 1, ENC_NA);
offset += 1;
}
proto_tree_add_item(tree, hf_bthci_evt_number_of_supported_vendor_codecs, tvb, offset, 1, ENC_NA);
count = tvb_get_guint8(tvb, offset);
offset += 1;
sub_item = proto_tree_add_item(tree, hf_bthci_evt_vendor_codecs, tvb, offset, count, ENC_NA);
sub_tree = proto_item_add_subtree(sub_item, ett_codecs);
for (i_count = 0; i_count < count; i_count+= 1) {
proto_tree *codec_tree;
proto_item *codec_item;
codec_item = proto_tree_add_string_format(sub_tree, hf_bthci_evt_vendor_codecs_item, tvb, offset, 4, "", "Item %u", i_count + 1);
codec_tree = proto_item_add_subtree(codec_item, ett_codecs);
proto_tree_add_item(codec_tree, hf_bthci_evt_comp_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(codec_tree, hf_bthci_evt_vendor_codec_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
break;
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
case 0x100c: /* Read Local Simple Pairing Options */
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_bitmask(tree, tvb, offset, hf_bthci_evt_simple_pairing_options, ett_simple_pairing_options, hfx_bthci_evt_simple_pairing_options, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_max_encryption_key_size, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case 0x1007: /* Read Country Code */
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;
proto_tree_add_item(tree, hf_bthci_evt_country_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x1401: /* Read Failed Contact Counter */
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;
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_failed_contact_counter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x1403: /* Get Link Quality */
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;
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_link_quality, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x1405: /* Read RSSI */
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;
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_rssi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x1406: /* Read AFH Channel Map */
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;
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_afh_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_afh_channel_map, tvb, offset, 10, ENC_NA);
offset += 10;
break;
case 0x1407: /* Read Clock */
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;
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_clock, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
accuracy = tvb_get_letohl(tvb, offset);
item = proto_tree_add_item(tree, hf_bthci_evt_clock_accuracy, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " %g msec", accuracy*0.3125);
offset += 2;
break;
case 0x1408: /* Read Encryption Key Size */
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;
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_enc_key_size, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x1409: /* Read Local AMP Info */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_amp_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_total_bandwidth, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_max_guaranteed_bandwidth, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_min_latency, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_max_pdu_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_amp_controller_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_pal_capabilities_00, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_max_amp_assoc_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_max_flush_to_us, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_best_effort_flush_to_us, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
break;
case 0x140a: /* Read Local AMP Assoc */
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;
proto_tree_add_item(tree, hf_bthci_evt_physical_link_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_amp_remaining_assoc_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_amp_assoc_fragment, tvb, offset, -1, ENC_NA);
offset += tvb_reported_length_remaining(tvb, offset);
break;
case 0x140b: /* Write Remote AMP Assoc */
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;
proto_tree_add_item(tree, hf_bthci_evt_physical_link_handle, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x140C: /* Get MWS Transport Layer Configuration */ {
guint8 transports;
guint8 i_transport;
guint16 baud_rates = 0;
guint16 i_baud_rate;
gint32 baud_rate_to;
proto_item *sub_item;
proto_tree *sub_tree;
proto_item *sub2_item;
proto_tree *sub2_tree;
gint offset_baud_rates;
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_mws_number_of_transports, tvb, offset, 1, ENC_NA);
transports = tvb_get_guint8(tvb, offset);
offset += 1;
sub_item = proto_tree_add_item(tree, hf_bthci_evt_mws_transport_layers, tvb, offset, transports * 2, ENC_NA);
sub_tree = proto_item_add_subtree(sub_item, ett_mws_transport_layers);
offset_baud_rates = offset = 1;
for (i_transport = 0; i_transport < transports; i_transport += 1) {
sub2_item = proto_tree_add_item(sub_tree, hf_bthci_evt_mws_transport_layers_item, tvb, offset, transports * 2, ENC_NA);
sub2_tree = proto_item_add_subtree(sub2_item, ett_mws_transport_layers_item);
proto_item_append_text(sub2_item, " #%u", i_transport + 1);
proto_tree_add_item(sub2_tree, hf_bthci_evt_mws_transport_layer, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(sub2_tree, hf_bthci_evt_mws_number_of_baud_rates, tvb, offset, 1, ENC_NA);
baud_rates += tvb_get_guint8(tvb, offset);
offset += 1;
}
sub_item = proto_tree_add_item(tree, hf_bthci_evt_mws_to_mws_baud_rates, tvb, offset, baud_rates * 4, ENC_NA);
sub_tree = proto_item_add_subtree(sub_item, ett_mws_to_mws_baud_rates);
baud_rate_to = -1;
i_transport = 1;
sub2_tree = sub_tree;
for (i_baud_rate = 0; i_baud_rate < baud_rates; i_baud_rate += 1) {
if (baud_rate_to == -1 || baud_rate_to == i_baud_rate) {
baud_rate_to = tvb_get_guint8(tvb, offset_baud_rates + (i_transport - 1) * 2);
sub2_item = proto_tree_add_item(sub_tree, hf_bthci_evt_mws_to_mws_baud_rates_tranport_item, tvb, offset, (baud_rate_to - i_baud_rate) * 4, ENC_NA);
proto_item_append_text(sub2_item, " #%u", i_transport);
sub2_tree = proto_item_add_subtree(sub2_item, ett_mws_to_mws_baud_rates_transport_item);
i_transport += 1;
}
proto_tree_add_item(sub2_tree, hf_bthci_evt_mws_to_mws_baud_rate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
sub_item = proto_tree_add_item(tree, hf_bthci_evt_mws_from_mws_baud_rates, tvb, offset, baud_rates * 4, ENC_NA);
sub_tree = proto_item_add_subtree(sub_item, ett_mws_from_mws_baud_rates);
baud_rate_to = -1;
i_transport = 1;
sub2_tree = sub_tree;
for (i_baud_rate = 0; i_baud_rate < baud_rates; i_baud_rate += 1) {
if (baud_rate_to == -1 || baud_rate_to == i_baud_rate) {
baud_rate_to = tvb_get_guint8(tvb, offset_baud_rates + (i_transport - 1) * 2);
sub2_item = proto_tree_add_item(sub_tree, hf_bthci_evt_mws_from_mws_baud_rates_tranport_item, tvb, offset, (baud_rate_to - i_baud_rate) * 4, ENC_NA);
proto_item_append_text(sub2_item, " #%u", i_transport);
sub2_tree = proto_item_add_subtree(sub2_item, ett_mws_from_mws_baud_rates_transport_item);
i_transport += 1;
}
proto_tree_add_item(sub2_tree, hf_bthci_evt_mws_from_mws_baud_rate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break; }
case 0x1801: /* Read Loopback Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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_loopback_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
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;
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
bluetooth_device_tap_t *tap_device;
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
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, 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 */
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;
proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_evt_le_features, ett_le_features, hfx_bthci_evt_le_features, ENC_LITTLE_ENDIAN);
offset += 8;
break;
case 0x2007: /* LE Read Advertising Channel Tx Power */
{
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;
proto_tree_add_item(tree, hf_bthci_evt_transmit_power_level, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
}
case 0x200f: /* LE Read White List Size */
{
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;
proto_tree_add_item(tree, hf_bthci_evt_white_list_size, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
}
case 0x2015: /* LE Read Channel Map */
{
proto_tree *sub_tree;
proto_item *sub_item;
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
sub_item = proto_tree_add_item(tree, hf_bthci_evt_le_channel_map, tvb, offset, 5, ENC_NA);
sub_tree = proto_item_add_subtree(sub_item, ett_le_channel_map);
call_dissector(btcommon_le_channel_map_handle, tvb_new_subset_length(tvb, offset, 5), pinfo, sub_tree);
offset += 5;
break;
}
case 0x2017: /* LE Encrypt */
{
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;
proto_tree_add_item(tree, hf_bthci_evt_encrypted_data, tvb, offset, 16, ENC_NA);
offset += 16;
break;
}
case 0x2018: /* LE Rand */
{
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;
proto_tree_add_item(tree, hf_bthci_evt_random_number, tvb, offset, 8, ENC_NA);
offset += 8;
break;
}
case 0x201c: /* LE Read Supported States */
{
proto_item *ti_le_states;
proto_item *ti_le_states_subtree;
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;
ti_le_states = proto_tree_add_item(tree, hf_bthci_evt_le_states, tvb, offset, 8, ENC_NA);
ti_le_states_subtree = proto_item_add_subtree(ti_le_states, ett_le_state_subtree);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_00, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_01, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_02, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_03, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_04, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_05, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_06, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_07, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_10, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_11, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_12, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_13, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_14, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_15, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_16, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_17, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_20, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_21, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_22, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_23, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_24, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_25, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_26, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_27, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_30, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_31, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_32, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_33, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ti_le_states_subtree,hf_bthci_evt_le_states_34, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 5;
break;
}
case 0x201f: /* LE Test End */
{
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;
proto_tree_add_item(tree, hf_bthci_evt_le_num_packets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
}
case 0x2030: /* LE Read PHY */
{
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;
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_le_tx_phy, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_le_rx_phy, tvb, offset, 1, ENC_NA);
offset += 1;
break;
}
case 0x2036: /* LE Set Extended Advertising Parameters */
{
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;
proto_tree_add_item(tree, hf_bthci_evt_selected_tx_power, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
}
case 0x203A: /* LE Read Maximum Advertising Data Length */
{
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;
proto_tree_add_item(tree, hf_bthci_evt_max_adv_data_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
}
case 0x203B: /* LE Read Number of Supported Advertising Sets */
{
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;
proto_tree_add_item(tree, hf_bthci_evt_num_supported_adv_sets, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
}
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
case 0x2053: /* LE Set Connectionless IQ Sampling Enable */
{
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_sync_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
}
case 0x0441: /* Set Connectionless Slave Broadcast */
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_lt_addr, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_connectionless_slave_broadcast_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x0442: /* Set Connectionless Slave Broadcast Receive */
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;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_lt_addr, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case 0x0C70: /* Set MWS Signaling */
proto_tree_add_item(tree, hf_bthci_evt_mws_bt_rx_priority_assert_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_bt_rx_priority_assert_jitter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_bt_rx_priority_deassert_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_bt_rx_priority_deassert_jitter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_802_rx_priority_assert_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_802_rx_priority_assert_jitter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_802_rx_priority_deassert_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_802_rx_priority_deassert_jitter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_bt_tx_priority_assert_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_bt_tx_priority_assert_jitter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_bt_tx_priority_deassert_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_bt_tx_priority_deassert_jitter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_802_tx_priority_assert_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_802_tx_priority_assert_jitter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_802_tx_priority_deassert_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_mws_802_tx_priority_deassert_jitter, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x0C77: /* Read Synchronization Train Parameters */
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_sync_train_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_sync_train_to, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_service_data, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0C78: /* Write Synchronization Train Parameters */
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_sync_train_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x0C79: /* Read Secure Connections Host Support */
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_secure_connection_host_support, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x0C7B: /* Read Authenticated Payload Timeout */
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;
item = proto_tree_add_item(tree, hf_bthci_evt_authenticated_payload_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g sec)", tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN) * 0.01);
offset += 2;
break;
case 0x0C7D: /* Read Local OOB Extended Data */
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_c192, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(tree, hf_bthci_evt_r192, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(tree, hf_bthci_evt_c256, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(tree, hf_bthci_evt_r256, tvb, offset, 16, ENC_NA);
offset += 16;
break;
case 0x0C7E: /* Read Extended Page Timeout */
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;
item = proto_tree_add_item(tree, hf_bthci_evt_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN) * 0.625);
break;
case 0x0C80: /* Read Extended Inquiry Length */
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;
item = proto_tree_add_item(tree, hf_bthci_evt_extended_inquiry_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN) * 0.625);
break;
case 0x2023: /* LE Read Suggested Default Data Length */
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_suggested_max_tx_octets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_suggested_max_tx_time, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x202A: /* LE Read Resolving List Size */
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_resolving_list_size, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case 0x202F: /* LE Read Maximum Data Length */
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_suggested_max_tx_octets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_suggested_max_tx_time, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_suggested_max_rx_octets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_suggested_max_rx_time, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x204A: /* LE Read Periodic Advertiser List Size */
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_periodic_adv_list_size, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case 0x204B: /* LE Read Transmit Power */
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_min_tx_power, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_max_tx_power, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case 0x204C: /* LE Read RF Path Compensation */
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;
item = proto_tree_add_item(tree, hf_bthci_evt_rf_tx_path_compensation, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g dB)", tvb_get_letohis(tvb, offset)*0.1);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_rf_rx_path_compensation, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g dB)", tvb_get_letohis(tvb, offset)*0.1);
offset += 2;
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
break;
case 0x2058: /* LE Read Antenna Information */
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_bitmask(tree, tvb, offset, hf_bthci_evt_supported_switching_sample_rates,
ett_supported_switching_sample_rates, hfx_bthci_evt_supported_switching_sample_rates, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_number_antennae, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_max_length_antenna_switching_pattern, tvb, offset, 1, ENC_NA);
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_received_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;
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
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 */
case 0x0407: /* Add SCO Connection */
case 0x0409: /* Accept Connection Request */
case 0x040A: /* Reject Connection Request */
case 0x040F: /* Change Connection Packet Type */
case 0x0411: /* Authentication Requested */
case 0x0413: /* Set Connection Encryption */
case 0x0415: /* Change Connection Link Key */
case 0x0417: /* Master Link Key */
case 0x0419: /* Remote Name Request */
case 0x041B: /* Read Remote Supported Features */
case 0x041C: /* Read Remote Extended Features */
case 0x041D: /* Read Remote Version Information */
case 0x041F: /* Read Clock Offset */
case 0x0428: /* Setup Synchronous Connection */
case 0x0429: /* Accept Synchronous Connection Request */
case 0x042A: /* Reject Synchronous Connection Request */
case 0x0435: /* Create Physical Link */
case 0x0436: /* Accept Physical Link */
case 0x0437: /* Disconnect Physical Link */
case 0x0438: /* Create Logical Link */
case 0x0439: /* Accept Logical Link */
case 0x043A: /* Disconnect Logical Link */
case 0x043C: /* Flow Spec Modify */
case 0x043D: /* Enhanced Setup Synchronous Connection */
case 0x043E: /* Enhanced Accept Synchronous Connection Request */
case 0x043F: /* Truncated Page */
case 0x0443: /* Start Synchronization Train */
case 0x0444: /* Receive Synchronization Train */
case 0x0801: /* Hold Mode */
case 0x0803: /* Sniff Mode */
case 0x0804: /* Exit Sniff Mode */
case 0x0805: /* Park State */
case 0x0806: /* Exit Park State */
case 0x0807: /* QoS Setup*/
case 0x080B: /* Switch Role*/
case 0x0810: /* Flow Specification */
case 0x0C53: /* Refresh Encryption Key */
case 0x0C5F: /* Enhanced Flush */
case 0x0C6B: /* Short Range Mode */
case 0x200D: /* LE Create Connection */
case 0x2013: /* LE Connection Update */
case 0x2016: /* LE Read Remote Features */
case 0x2019: /* LE Start Encryption */
case 0x2025: /* LE Read Local P-256 Public Key */
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
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 */
case 0x207E: /* LE Subrate Request */
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);
break;
case 0x0C35: /* Host Number Of Completed Packets */
if (tvb_captured_length_remaining(tvb, offset) > 0) {
proto_tree_add_expert(tree, pinfo, &ei_event_unexpected_parameter, tvb, offset, tvb_captured_length_remaining(tvb, offset));
offset += tvb_reported_length_remaining(tvb, offset);
}
break;
default:
proto_tree_add_expert(tree, pinfo, &ei_event_unknown_command, tvb, offset, tvb_captured_length_remaining(tvb, offset));
offset += tvb_reported_length_remaining(tvb, offset);
break;
}
add_opcode(opcode_list, opcode, COMMAND_STATUS_NORMAL);
return offset;
}
static int
dissect_bthci_evt_qos_setup_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
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_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_service_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_token_rate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_peak_bandwidth, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_latency, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_delay_variation, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
return offset;
}
static int
dissect_bthci_evt_change_conn_link_key_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_master_link_key_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
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_key_flag, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_encryption_change(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
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_encryption_enable, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset;
}
static int
dissect_bthci_evt_read_remote_ext_features_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
guint8 page_number;
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
page_number = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_page_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_max_page_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
offset = dissect_bthci_evt_lmp_features(tvb, offset, pinfo, tree, page_number);
return offset;
}
static int
dissect_bthci_evt_sync_connection_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
proto_item *item;
guint32 connection_handle;
guint8 bd_addr[6];
guint8 status;
wmem_tree_key_t key[5];
guint32 interface_id;
guint32 adapter_id;
guint32 frame_number;
wmem_tree_t *subtree;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
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);
connection_handle = tvb_get_letohs(tvb, offset) & 0x0FFF;
offset += 2;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
proto_tree_add_item(tree, hf_bthci_evt_sync_link_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_sync_tx_interval, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint8(tvb, offset)*0.625);
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_sync_rtx_window, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint8(tvb, offset)*0.625);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_sync_rx_packet_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_sync_tx_packet_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_air_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
frame_number = pinfo->num;
if (!pinfo->fd->visited && status == STATUS_SUCCESS) {
remote_bdaddr_t *remote_bdaddr;
chandle_session_t *chandle_session;
bthci_sco_stream_number_t *sco_stream_number;
guint32 stream_number;
/* chandle to bdaddr */
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &connection_handle;
key[3].length = 1;
key[3].key = &frame_number;
key[4].length = 0;
key[4].key = NULL;
remote_bdaddr = (remote_bdaddr_t *) wmem_new(wmem_file_scope(), remote_bdaddr_t);
remote_bdaddr->interface_id = bluetooth_data->interface_id;
remote_bdaddr->adapter_id = bluetooth_data->adapter_id;
remote_bdaddr->chandle = connection_handle;
memcpy(remote_bdaddr->bd_addr, bd_addr, 6);
wmem_tree_insert32_array(bluetooth_data->chandle_to_bdaddr, key, remote_bdaddr);
/* chandle session */
chandle_session = (chandle_session_t *) wmem_new(wmem_file_scope(), chandle_session_t);
chandle_session->connect_in_frame = frame_number;
chandle_session->disconnect_in_frame = bluetooth_max_disconnect_in_frame;
chandle_session->link_type = BT_LINK_TYPE_SCO;
wmem_tree_insert32_array(bluetooth_data->chandle_sessions, key, chandle_session);
/* stream number */
key[2].length = 0;
key[2].key = NULL;
subtree = (wmem_tree_t *) wmem_tree_lookup32_array(bthci_sco_stream_numbers, key);
sco_stream_number = (subtree) ? (bthci_sco_stream_number_t *) wmem_tree_lookup32_le(subtree, pinfo->num) : NULL;
if (!sco_stream_number) {
stream_number = 1;
} else {
stream_number = sco_stream_number->stream_number + 1;
}
key[2].length = 1;
key[2].key = &frame_number;
key[3].length = 0;
key[3].key = NULL;
sco_stream_number = (bthci_sco_stream_number_t *) wmem_new(wmem_file_scope(), bthci_sco_stream_number_t);
sco_stream_number->stream_number = stream_number;
wmem_tree_insert32_array(bthci_sco_stream_numbers, key, sco_stream_number);
}
return offset;
}
static int
dissect_bthci_evt_sync_connection_changed(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
proto_item *item;
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_sync_tx_interval, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint8(tvb, offset)*0.625);
offset += 1;
item = proto_tree_add_item(tree, hf_bthci_evt_sync_rtx_window, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint8(tvb, offset)*0.625);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_sync_rx_packet_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_sync_tx_packet_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_sniff_subrating(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
proto_item *item;
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_max_tx_latency, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_letohs(tvb, offset)*0.625);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_max_rx_latency, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_letohs(tvb, offset)*0.625);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_min_remote_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_letohs(tvb, offset)*0.625);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_min_local_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_letohs(tvb, offset)*0.625);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_flow_specification_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
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_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_flow_direction, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_service_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_token_rate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_token_bucket_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_peak_bandwidth, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_latency, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
return offset;
}
static int
dissect_bthci_evt_enhanced_flush_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_encryption_key_refresh_complete(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
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;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_link_supervision_timeout_changed(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_item *item;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
item = proto_tree_add_item(tree, hf_bthci_evt_link_supervision_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " slots (%g msec)", tvb_get_letohs(tvb, offset)*0.625);
offset += 2;
return offset;
}
static int
dissect_bthci_evt_inquire_result(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
{
guint8 num, evt_num_responses;
evt_num_responses = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_num_responses, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
for (num = 0; num < evt_num_responses; num++) {
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_page_scan_repetition_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_page_scan_period_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_page_scan_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
call_dissector(btcommon_cod_handle, tvb_new_subset_length(tvb, offset, 3), pinfo, tree);
offset += 3;
proto_tree_add_item(tree, hf_bthci_evt_clock_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
return offset;
}
/* Code to actually dissect the packets */
static gint
dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
{
proto_item *ti;
proto_tree *bthci_evt_tree;
guint8 param_length, evt_code;
guint8 bd_addr[6];
gint offset = 0;
gint previous_offset = 0;
bluetooth_data_t *bluetooth_data;
wmem_list_t *opcode_list;
wmem_list_frame_t *opcode_list_frame;
bthci_cmd_data_t *lastest_bthci_cmd_data = NULL;
opcode_list_data_t *opcode_list_data = NULL;
guint32 opcode = G_MAXUINT32;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
bluetooth_data = (bluetooth_data_t *) data;
opcode_list = wmem_list_new(wmem_packet_scope());
ti = proto_tree_add_item(tree, proto_bthci_evt, tvb, offset, -1, ENC_NA);
bthci_evt_tree = proto_item_add_subtree(ti, ett_bthci_evt);
switch (pinfo->p2p_dir) {
case P2P_DIR_SENT:
col_set_str(pinfo->cinfo, COL_INFO, "Sent ");
break;
case P2P_DIR_RECV:
col_set_str(pinfo->cinfo, COL_INFO, "Rcvd ");
break;
default:
col_set_str(pinfo->cinfo, COL_INFO, "UnknownDirection ");
break;
}
set_address(&pinfo->src, AT_STRINGZ, 11, "controller");
set_address(&pinfo->dst, AT_STRINGZ, 5, "host");
set_address(&pinfo->net_src, AT_STRINGZ, 11, "controller");
set_address(&pinfo->net_dst, AT_STRINGZ, 5, "host");
set_address(&pinfo->dl_src, AT_STRINGZ, 11, "controller");
set_address(&pinfo->dl_dst, AT_STRINGZ, 5, "host");
if (!pinfo->fd->visited) {
address *addr;
addr = (address *) wmem_memdup(wmem_file_scope(), &pinfo->dl_src, sizeof(address));
addr->data = wmem_memdup(wmem_file_scope(), pinfo->dl_src.data, pinfo->dl_src.len);
p_add_proto_data(wmem_file_scope(), pinfo, proto_bluetooth, BLUETOOTH_DATA_SRC, addr);
addr = (address *) wmem_memdup(wmem_file_scope(), &pinfo->dl_dst, sizeof(address));
addr->data = wmem_memdup(wmem_file_scope(), pinfo->dl_dst.data, pinfo->dl_dst.len);
p_add_proto_data(wmem_file_scope(), pinfo, proto_bluetooth, BLUETOOTH_DATA_DST, addr);
}
evt_code = tvb_get_guint8(tvb, offset);
proto_tree_add_item(bthci_evt_tree, hf_bthci_evt_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_item_append_text(bthci_evt_tree, " - %s", val_to_str_ext(evt_code, &bthci_evt_evt_code_vals_ext, "Unknown 0x%02x"));
offset += 1;
if (have_tap_listener(bluetooth_hci_summary_tap)) {
bluetooth_hci_summary_tap_t *tap_hci_summary;
tap_hci_summary = wmem_new(wmem_packet_scope(), bluetooth_hci_summary_tap_t);
tap_hci_summary->interface_id = bluetooth_data->interface_id;
tap_hci_summary->adapter_id = bluetooth_data->adapter_id;
tap_hci_summary->type = BLUETOOTH_HCI_SUMMARY_EVENT;
tap_hci_summary->event = evt_code;
if (try_val_to_str_ext(evt_code, &bthci_evt_evt_code_vals_ext))
tap_hci_summary->name = val_to_str_ext(evt_code, &bthci_evt_evt_code_vals_ext, "Unknown 0x%04x");
else
tap_hci_summary->name = NULL;
tap_queue_packet(bluetooth_hci_summary_tap, pinfo, tap_hci_summary);
}
param_length = tvb_get_guint8(tvb, offset);
proto_tree_add_item(bthci_evt_tree, hf_bthci_evt_param_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "HCI_EVT");
col_append_str(pinfo->cinfo, COL_INFO, val_to_str_ext(evt_code, &bthci_evt_evt_code_vals_ext, "Unknown 0x%02x"));
if (param_length > 0) {
switch(evt_code) {
case 0x01: /* Inquiry Complete */
offset = dissect_bthci_evt_inquire_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x0401, COMMAND_STATUS_NORMAL); /* Inquiry */
add_opcode(opcode_list, 0x0403, COMMAND_STATUS_NORMAL); /* Periodic Inquiry Mode */
break;
case 0x02: /* Inquiry result event */
offset = dissect_bthci_evt_inquire_result(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x03: /* Connection Complete */
offset = dissect_bthci_evt_connect_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x0405, COMMAND_STATUS_NORMAL); /* Create Connection */
add_opcode(opcode_list, 0x0409, COMMAND_STATUS_NORMAL); /* Accept Connection Request */
add_opcode(opcode_list, 0x040A, COMMAND_STATUS_NORMAL); /* Reject Connection Request */
add_opcode(opcode_list, 0x043E, COMMAND_STATUS_NORMAL); /* Enhanced Accept Synchronous Connection Request */
break;
case 0x04: /* Connection Request */
offset = dissect_bthci_evt_connect_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x05: /* Disconnection Complete */
offset = dissect_bthci_evt_disconnect_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x0406, COMMAND_STATUS_NORMAL); /* Disconnection Connection */
break;
case 0x06: /* Authentication Complete */
offset = dissect_bthci_evt_auth_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x0411, COMMAND_STATUS_NORMAL); /* Authentication Requested */
break;
case 0x07: /* Remote Name Request Complete */
offset = dissect_bthci_evt_remote_name_req_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x0419, COMMAND_STATUS_NORMAL); /* Remote Name Request */
break;
case 0x08: /* Encryption Change */
offset = dissect_bthci_evt_encryption_change(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x0413, COMMAND_STATUS_NORMAL); /* Encryption Requested */
add_opcode(opcode_list, 0x2019, COMMAND_STATUS_NORMAL); /* LE Start Encryption */
break;
case 0x09: /* Change Connection Link Key Complete */
offset = dissect_bthci_evt_change_conn_link_key_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x0a: /* Master Link Key Complete */
offset = dissect_bthci_evt_master_link_key_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x0b: /* Read Remote Support Features Complete */
offset = dissect_bthci_evt_read_remote_support_features_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x41B, COMMAND_STATUS_NORMAL); /* Read Remote Supported Features */
break;
case 0x0c: /* Read Remote Version Information Complete */
offset = dissect_bthci_evt_read_remote_version_information_complete(tvb, offset, pinfo, bluetooth_data, bthci_evt_tree);
add_opcode(opcode_list, 0x41D, COMMAND_STATUS_NORMAL); /* Read Remote Version Information */
break;
case 0x0d: /* QoS Setup Complete */
offset = dissect_bthci_evt_qos_setup_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x0e: /* Command Complete */
offset = dissect_bthci_evt_command_complete(tvb, offset, pinfo, tree, bthci_evt_tree, opcode_list, bluetooth_data, &opcode);
break;
case 0x0f: /* Command Status */
offset = dissect_bthci_evt_command_status(tvb, offset, pinfo, tree, bthci_evt_tree, opcode_list, bluetooth_data);
break;
case 0x10: /* Hardware Error */
offset = dissect_bthci_evt_hardware_error(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x11: /* Flush Occurred */
offset = dissect_bthci_evt_flush_occurred(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x12: /* Role Change */
offset = dissect_bthci_evt_role_change(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x080B, COMMAND_STATUS_NORMAL); /* Switch Role */
break;
case 0x13: /* Number Of Completed Packets */
offset = dissect_bthci_evt_number_of_completed_packets(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x14: /* Mode Change */
offset = dissect_bthci_evt_mode_change(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x0803, COMMAND_STATUS_NORMAL); /* Sniff Mode */
add_opcode(opcode_list, 0x0804, COMMAND_STATUS_NORMAL); /* Exit Sniff Mode */
break;
case 0x15: /* Return Link Keys */
offset = dissect_bthci_evt_return_link_keys(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x16: /* PIN Code Request */
offset = dissect_bthci_evt_pin_code_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x17: /* Link Key Request */
offset = dissect_bthci_evt_link_key_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x18: /* Link Key Notification */
offset = dissect_bthci_evt_link_key_notification(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x19: /* Loopback Command */
offset = dissect_bthci_evt_loopback_command(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x1a: /* Data Buffer Overflow */
offset = dissect_bthci_evt_data_buffer_overflow(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x1b: /* Max Slots Change */
offset = dissect_bthci_evt_max_slots_change(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x1c: /* Read Clock Offset Complete */
offset = dissect_bthci_evt_read_clock_offset_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x041F, COMMAND_STATUS_NORMAL); /* Read Clock Offset */
break;
case 0x1d: /* Connection Packet Type Changed */
offset = dissect_bthci_evt_conn_packet_type_changed(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x040F, COMMAND_STATUS_NORMAL); /* Change Connection Packet Type */
break;
case 0x1e: /* QoS Violation */
offset = dissect_bthci_evt_qos_violation(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x1f: /* Page Scan Mode Change */
offset = dissect_bthci_evt_page_scan_mode_change(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x20: /* Page Scan Repetition Mode Change */
offset = dissect_bthci_evt_page_scan_repetition_mode_change(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x21: /* Flow Specification Complete */
offset = dissect_bthci_evt_flow_specification_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x22: /* Inquiry Result with RSSI */
offset = dissect_bthci_evt_inquire_result_with_rssi(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data, NULL);
break;
case 0x23: /* Read Remote Extended Features Complete */
offset = dissect_bthci_evt_read_remote_ext_features_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x41C, COMMAND_STATUS_NORMAL); /* Read Remote Supported Features */
break;
case 0x2c: /* Synchronous Connection Complete */
offset = dissect_bthci_evt_sync_connection_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x0429, COMMAND_STATUS_NORMAL); /* Accept Synchronous Connection Request */
add_opcode(opcode_list, 0x0428, COMMAND_STATUS_NORMAL); /* Setup Synchronous Connection */
add_opcode(opcode_list, 0x043D, COMMAND_STATUS_NORMAL); /* Enhanced Setup Synchronous Connection */
add_opcode(opcode_list, 0x043E, COMMAND_STATUS_NORMAL); /* Enhanced Accept Synchronous Connection Request */
break;
case 0x2d: /* Synchronous Connection Changed */
offset = dissect_bthci_evt_sync_connection_changed(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x043D, COMMAND_STATUS_NORMAL); /* Enhanced Setup Synchronous Connection */
break;
case 0x2e: /* Sniff Subrating */
offset = dissect_bthci_evt_sniff_subrating(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x2f: /* Extended Inquiry Result */
{
bluetooth_eir_ad_data_t *eir_data;
previous_offset = offset;
offset = dissect_bthci_evt_inquire_result_with_rssi(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data, bd_addr);
eir_data = wmem_new0(wmem_packet_scope(), bluetooth_eir_ad_data_t);
eir_data->interface_id = bluetooth_data->interface_id;
eir_data->adapter_id = bluetooth_data->adapter_id;
eir_data->bd_addr = bd_addr;
call_dissector_with_data(btcommon_eir_handle, tvb_new_subset_length(tvb, offset, 240), pinfo, bthci_evt_tree, eir_data);
save_remote_device_name(tvb, offset, pinfo, 240, (offset - previous_offset <= 1) ? NULL : bd_addr, bluetooth_data);
offset += 240;
}
break;
case 0x30: /* Encryption Key Refresh Complete */
offset = dissect_bthci_evt_encryption_key_refresh_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x2019, COMMAND_STATUS_NORMAL); /* LE Start Encryption */
break;
case 0x31: /* IO Capability Request */
offset = dissect_bthci_evt_io_capability_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x32: /* IO Capability Response */
offset = dissect_bthci_evt_io_capability_response(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x33: /* User Confirmation Request */
offset = dissect_bthci_evt_user_confirmation_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x34: /* User Passkey Request */
offset = dissect_bthci_evt_user_passkey_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x35: /* Remote OOB Data Request */
offset = dissect_bthci_evt_remote_oob_data_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x36: /* Simple Pairing Complete */
offset = dissect_bthci_evt_simple_pairing_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x38: /* Link Supervision Timeout Changed */
offset = dissect_bthci_evt_link_supervision_timeout_changed(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x39: /* Enhanced Flush Complete */
offset = dissect_bthci_evt_enhanced_flush_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x3b: /* Enhanced Flush Complete */
offset = dissect_bthci_evt_user_passkey_notification(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x3c: /* Enhanced Flush Complete */
offset = dissect_bthci_evt_keypress_notification(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x3d: /* Remote Host Supported Features Notification */
offset = dissect_bthci_evt_remote_host_sup_feat_notification(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x3e: /* LE Meta */
offset = dissect_bthci_evt_le_meta(tvb, offset, pinfo, bthci_evt_tree, opcode_list, bluetooth_data);
break;
case 0x40: /* Physical Link Complete */
offset = dissect_bthci_evt_physical_link_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x41: /* Channel Selected */
case 0x44: /* Physical Link Recovery */
offset = dissect_bthci_evt_channel_select_physical_link_recovery(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x42: /* Disconnect Physical Link Complete */
offset = dissect_bthci_evt_disconnect_physical_link_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x43: /* Physical Link Loss Early Warning */
offset = dissect_bthci_evt_physical_link_loss_early_warning(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x45: /* Logical Link Complete */
offset = dissect_bthci_evt_logical_link_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x46: /* Disconnect Logical Link Complete */
offset = dissect_bthci_evt_disconnect_logical_link_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x47: /* Flow Spec Modify Complete */
offset = dissect_bthci_evt_flow_spec_modify_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x48: /* Number Of Completed Data Blocks */
offset = dissect_bthci_evt_number_of_completed_data_blocks(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x49: /* AMP Start Test */
offset = dissect_bthci_evt_amp_start_stop_test(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x1809, COMMAND_STATUS_NORMAL); /* AMP Test */
break;
case 0x4a: /* AMP Test End */
offset = dissect_bthci_evt_amp_start_stop_test(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
add_opcode(opcode_list, 0x1808, COMMAND_STATUS_NORMAL); /* AMP Test End */
break;
case 0x4b: /* AMP Receiver Test */
offset = dissect_bthci_evt_amp_receiver_test(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x4c: /* Short Range Mode Change Complete */
offset = dissect_bthci_evt_short_range_mode_change_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x4d: /* AMP Status Change */
offset = dissect_bthci_evt_amp_status_change(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
break;
case 0x4e: /* Triggered Clock Capture */
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_which_clock, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_clock, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_slot_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x4f: /* Synchronization Train Complete */
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;
break;
case 0x50: /* Synchronization Train Received */
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;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_clock_offset_32, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_afh_channel_map, tvb, offset, 10, ENC_NA);
offset += 10;
proto_tree_add_item(tree, hf_bthci_evt_lt_addr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_next_broadcast_instant, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_connectionless_slave_broadcast_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_bthci_evt_service_data, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x51: /* Connectionless Slave Broadcast Receive */
{
guint8 length;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_lt_addr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_clock, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_clock_offset_32, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(tree, hf_bthci_evt_receive_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_fragment, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_data_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
length = tvb_get_guint8(tvb, offset);
offset += 1;
proto_tree_add_item(tree, hf_bthci_evt_data, tvb, offset, length, ENC_NA);
offset += 1;
}
break;
case 0x52: /* Connectionless Slave Broadcast Timeout */
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
proto_tree_add_item(tree, hf_bthci_evt_lt_addr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x53: /* Truncated Page Complete */
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;
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
break;
case 0x54: /* Slave Page Response Timeout */
/* NOTE: no parameters */
break;
case 0x55: /* Connectionless Slave Broadcast Channel Map Change */
proto_tree_add_item(tree, hf_bthci_evt_afh_channel_map, tvb, offset, 10, ENC_NA);
offset += 10;
break;
case 0x56: /* Inquiry Response Notification */
proto_tree_add_item(tree, hf_bthci_evt_iac_lap, tvb, offset, 3, ENC_LITTLE_ENDIAN);
offset += 3;
proto_tree_add_item(tree, hf_bthci_evt_rssi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
break;
case 0x57: /* Authenticated Payload Timeout Expired */
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case 0x58: /* SAM Status Change */
offset = dissect_bthci_evt_sam_status_change(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0xff: /* Vendor-Specific */
if (!dissector_try_payload_new(vendor_dissector_table, tvb, pinfo, tree, TRUE, bluetooth_data)) {
if (bluetooth_data) {
hci_vendor_data_t *hci_vendor_data;
wmem_tree_key_t key[3];
guint32 interface_id;
guint32 adapter_id;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 0;
key[2].key = NULL;
hci_vendor_data = (hci_vendor_data_t *) wmem_tree_lookup32_array(bluetooth_data->hci_vendors, key);
if (hci_vendor_data) {
gint sub_offset;
sub_offset = dissector_try_uint_new(hci_vendor_table, hci_vendor_data->manufacturer, tvb, pinfo, tree, TRUE, bluetooth_data);
if (sub_offset > 0 && sub_offset < tvb_captured_length_remaining(tvb, offset))
proto_tree_add_expert(bthci_evt_tree, pinfo, &ei_parameter_unexpected, tvb, offset + sub_offset, tvb_captured_length_remaining(tvb, sub_offset + offset));
}
}
}
proto_tree_add_expert(bthci_evt_tree, pinfo, &ei_event_undecoded, tvb, offset, tvb_captured_length_remaining(tvb, offset));
return tvb_captured_length(tvb);
default:
proto_tree_add_expert(bthci_evt_tree, pinfo, &ei_event_unknown_event, tvb, offset, tvb_captured_length_remaining(tvb, offset));
offset += tvb_reported_length_remaining(tvb, offset);
break;
}
}
opcode_list_frame = wmem_list_head(opcode_list);
while (opcode_list_frame) {
wmem_tree_key_t key[4];
guint32 interface_id;
guint32 adapter_id;
guint32 frame_number;
bthci_cmd_data_t *bthci_cmd_data;
wmem_tree_t *subtree;
gint i_frame_number;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
frame_number = pinfo->num;
opcode_list_data = (opcode_list_data_t *) wmem_list_frame_data(opcode_list_frame);
opcode = opcode_list_data->opcode;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &opcode;
key[3].length = 0;
key[3].key = NULL;
subtree = (wmem_tree_t *) wmem_tree_lookup32_array(bthci_cmds, key);
i_frame_number = frame_number;
do {
bthci_cmd_data = (subtree) ? (bthci_cmd_data_t *) wmem_tree_lookup32_le(subtree, i_frame_number) : NULL;
if (bthci_cmd_data && bthci_cmd_data->command_in_frame < frame_number && (
(opcode_list_data->command_status == COMMAND_STATUS_NORMAL &&
(bthci_cmd_data->response_in_frame == frame_number ||
bthci_cmd_data->response_in_frame == bluetooth_max_disconnect_in_frame)) ||
(opcode_list_data->command_status == COMMAND_STATUS_PENDING &&
(bthci_cmd_data->pending_in_frame == frame_number ||
((bthci_cmd_data->response_in_frame == bluetooth_max_disconnect_in_frame ||
bthci_cmd_data->response_in_frame > frame_number) &&
bthci_cmd_data->pending_in_frame == bluetooth_max_disconnect_in_frame))) ||
(opcode_list_data->command_status == COMMAND_STATUS_RESULT &&
(bthci_cmd_data->response_in_frame == frame_number ||
((bthci_cmd_data->response_in_frame == bluetooth_max_disconnect_in_frame &&
bthci_cmd_data->pending_in_frame == bluetooth_max_disconnect_in_frame))))
)) {
lastest_bthci_cmd_data = bthci_cmd_data;
if (((opcode_list_data->command_status == COMMAND_STATUS_RESULT ||
opcode_list_data->command_status == COMMAND_STATUS_NORMAL) &&
bthci_cmd_data->response_in_frame == frame_number) ||
(opcode_list_data->command_status == COMMAND_STATUS_PENDING &&
bthci_cmd_data->pending_in_frame == frame_number)) {
opcode_list_frame = NULL;
break;
}
}
if (bthci_cmd_data && bthci_cmd_data->command_in_frame < frame_number) {
i_frame_number = bthci_cmd_data->command_in_frame - 1;
if (i_frame_number < 1)
bthci_cmd_data = NULL;
} else {
bthci_cmd_data = NULL;
}
} while (bthci_cmd_data);
if (opcode_list_frame)
opcode_list_frame = wmem_list_frame_next(opcode_list_frame);
}
if (lastest_bthci_cmd_data) {
proto_item *sub_item;
guint32 frame_number;
nstime_t delta;
frame_number = pinfo->num;
if (evt_code == 0x0e /* Command Complete */ && opcode != G_MAXUINT32 && opcode >> 10 != HCI_OGF_VENDOR_SPECIFIC) {
bluetooth_device_tap_t *tap_device;
guint8 status;
status = tvb_get_guint8(tvb, 5);
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) switch(opcode) {
case 0x0c03: /* Reset */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_RESET;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
case 0x0c13: /* Change Local Name */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_NAME;
tap_device->data.name = lastest_bthci_cmd_data->data.name;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
if (!pinfo->fd->visited) {
localhost_name_entry_t *localhost_name_entry;
wmem_tree_key_t key[4];
guint32 interface_id;
guint32 adapter_id;
interface_id = bluetooth_data->interface_id;
adapter_id = bluetooth_data->adapter_id;
key[0].length = 1;
key[0].key = &interface_id;
key[1].length = 1;
key[1].key = &adapter_id;
key[2].length = 1;
key[2].key = &frame_number;
key[3].length = 0;
key[3].key = NULL;
localhost_name_entry = (localhost_name_entry_t *) wmem_new(wmem_file_scope(), localhost_name_entry_t);
localhost_name_entry->interface_id = interface_id;
localhost_name_entry->adapter_id = adapter_id;
localhost_name_entry->name = lastest_bthci_cmd_data->data.name;
wmem_tree_insert32_array(bluetooth_data->localhost_name, key, localhost_name_entry);
}
break;
case 0x0c18: /* Write Page Timeout */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_PAGE_TIMEOUT;
tap_device->data.page_timeout = lastest_bthci_cmd_data->data.page_timeout;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
case 0x0c1a: /* Write Scan Enable */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_SCAN;
tap_device->data.scan = lastest_bthci_cmd_data->data.scan;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
case 0x0c20: /* Write Authentication Enable */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_AUTHENTICATION;
tap_device->data.authentication = lastest_bthci_cmd_data->data.authentication;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
case 0x0c22: /* Write Encryption Mode */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_ENCRYPTION;
tap_device->data.encryption = lastest_bthci_cmd_data->data.encryption;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
case 0x0c24: /* Write Class Of Device */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_CLASS_OF_DEVICE;
tap_device->data.class_of_device = lastest_bthci_cmd_data->data.class_of_device;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
case 0x0c26: /* Write Voice Setting */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_VOICE_SETTING;
tap_device->data.voice_setting = lastest_bthci_cmd_data->data.voice_setting;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
case 0x0c33: /* Host Buffer Size */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_MTUS;
tap_device->data.mtus.acl_mtu = lastest_bthci_cmd_data->data.mtus.acl_mtu;
tap_device->data.mtus.sco_mtu = lastest_bthci_cmd_data->data.mtus.sco_mtu;
tap_device->data.mtus.acl_packets = lastest_bthci_cmd_data->data.mtus.acl_packets;
tap_device->data.mtus.sco_packets = lastest_bthci_cmd_data->data.mtus.sco_packets;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
case 0x0c45: /* Write Inquiry Mode */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_INQUIRY_MODE;
tap_device->data.inquiry_mode = lastest_bthci_cmd_data->data.inquiry_mode;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
case 0x0c56: /* Write Simple Pairing */
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
if (bluetooth_data) {
tap_device->interface_id = bluetooth_data->interface_id;
tap_device->adapter_id = bluetooth_data->adapter_id;
} else {
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
}
tap_device->has_bd_addr = FALSE;
tap_device->is_local = TRUE;
tap_device->type = BLUETOOTH_DEVICE_SIMPLE_PAIRING_MODE;
tap_device->data.simple_pairing_mode = lastest_bthci_cmd_data->data.simple_pairing_mode;
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
break;
}
}
if (!pinfo->fd->visited && opcode_list_data->command_status == COMMAND_STATUS_PENDING &&
lastest_bthci_cmd_data->pending_in_frame == bluetooth_max_disconnect_in_frame) {
lastest_bthci_cmd_data->pending_in_frame = frame_number;
lastest_bthci_cmd_data->pending_abs_ts = pinfo->abs_ts;
}
if (!pinfo->fd->visited && opcode_list_data->command_status == COMMAND_STATUS_NORMAL &&
lastest_bthci_cmd_data->response_in_frame == bluetooth_max_disconnect_in_frame) {
lastest_bthci_cmd_data->response_in_frame = frame_number;
lastest_bthci_cmd_data->response_abs_ts = pinfo->abs_ts;
}
if (!pinfo->fd->visited && opcode_list_data->command_status == COMMAND_STATUS_RESULT &&
lastest_bthci_cmd_data->response_in_frame == bluetooth_max_disconnect_in_frame &&
lastest_bthci_cmd_data->pending_in_frame == bluetooth_max_disconnect_in_frame) {
lastest_bthci_cmd_data->response_in_frame = frame_number;
lastest_bthci_cmd_data->response_abs_ts = pinfo->abs_ts;
}
if (lastest_bthci_cmd_data->pending_in_frame == frame_number) {
sub_item = proto_tree_add_uint(bthci_evt_tree, hf_command_in_frame, tvb, 0, 0, lastest_bthci_cmd_data->command_in_frame);
proto_item_set_generated(sub_item);
if (lastest_bthci_cmd_data->response_in_frame < bluetooth_max_disconnect_in_frame) {
sub_item = proto_tree_add_uint(bthci_evt_tree, hf_response_in_frame, tvb, 0, 0, lastest_bthci_cmd_data->response_in_frame);
proto_item_set_generated(sub_item);
}
nstime_delta(&delta, &lastest_bthci_cmd_data->pending_abs_ts, &lastest_bthci_cmd_data->command_abs_ts);
sub_item = proto_tree_add_double(bthci_evt_tree, hf_command_pending_time_delta, tvb, 0, 0, nstime_to_msec(&delta));
proto_item_set_generated(sub_item);
if (lastest_bthci_cmd_data->response_in_frame < bluetooth_max_disconnect_in_frame) {
nstime_delta(&delta, &lastest_bthci_cmd_data->response_abs_ts, &lastest_bthci_cmd_data->pending_abs_ts);
sub_item = proto_tree_add_double(bthci_evt_tree, hf_pending_response_time_delta, tvb, 0, 0, nstime_to_msec(&delta));
proto_item_set_generated(sub_item);
}
}
if (lastest_bthci_cmd_data->response_in_frame == frame_number) {
sub_item = proto_tree_add_uint(bthci_evt_tree, hf_command_in_frame, tvb, 0, 0, lastest_bthci_cmd_data->command_in_frame);
proto_item_set_generated(sub_item);
if (lastest_bthci_cmd_data->pending_in_frame < bluetooth_max_disconnect_in_frame) {
sub_item = proto_tree_add_uint(bthci_evt_tree, hf_pending_in_frame, tvb, 0, 0, lastest_bthci_cmd_data->pending_in_frame);
proto_item_set_generated(sub_item);
nstime_delta(&delta, &lastest_bthci_cmd_data->response_abs_ts, &lastest_bthci_cmd_data->pending_abs_ts);
sub_item = proto_tree_add_double(bthci_evt_tree, hf_pending_response_time_delta, tvb, 0, 0, nstime_to_msec(&delta));
proto_item_set_generated(sub_item);
}
nstime_delta(&delta, &lastest_bthci_cmd_data->response_abs_ts, &lastest_bthci_cmd_data->command_abs_ts);
sub_item = proto_tree_add_double(bthci_evt_tree, hf_command_response_time_delta, tvb, 0, 0, nstime_to_msec(&delta));
proto_item_set_generated(sub_item);
}
}
return offset;
}
/* Register the protocol with Wireshark */
void
proto_register_bthci_evt(void)
{
module_t *module;
expert_module_t *expert_bthci_evt;
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{ &hf_bthci_evt_code,
{ "Event Code", "bthci_evt.code",
FT_UINT8, BASE_HEX | BASE_EXT_STRING, &bthci_evt_evt_code_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_param_length,
{ "Parameter Total Length", "bthci_evt.param_length",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_command_packets,
{ "Number of Allowed Command Packets", "bthci_evt.num_command_packets",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_handles,
{ "Number of Connection Handles", "bthci_evt.num_handles",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Number of Connection Handles and Num_HCI_Data_Packets parameter pairs", HFILL }
},
{ &hf_bthci_evt_connection_handle,
{ "Connection Handle", "bthci_evt.connection_handle",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_compl_packets,
{ "Number of Completed Packets", "bthci_evt.num_compl_packets",
FT_UINT16, BASE_DEC, NULL, 0x0,
"The number of HCI Data Packets that have been completed", HFILL }
},
{ &hf_bthci_evt_opcode,
{ "Command Opcode", "bthci_evt.opcode",
FT_UINT16, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_opcode_vals_ext, 0x0,
"HCI Command Opcode", HFILL }
},
{ &hf_bthci_evt_ogf,
{ "Opcode Group Field", "bthci_evt.opcode.ogf",
FT_UINT16, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_ogf_vals_ext, 0xfc00,
NULL, HFILL }
},
{ &hf_bthci_evt_ocf_link_control,
{ "Opcode Command Field", "bthci_evt.opcode.ocf",
FT_UINT16, BASE_HEX | BASE_EXT_STRING, &bthci_cmd_ocf_link_control_vals_ext, 0x03ff,
NULL, HFILL }
},
{ &hf_bthci_evt_ocf_link_policy,
{ "Opcode Command Field", "bthci_evt.opcode.ocf",
FT_UINT16, BASE_HEX | BASE_EXT_STRING, &bthci_cmd_ocf_link_policy_vals_ext, 0x03ff,
NULL, HFILL }
},
{ &hf_bthci_evt_ocf_host_controller_and_baseband,
{ "Opcode Command Field", "bthci_evt.opcode.ocf",
FT_UINT16, BASE_HEX | BASE_EXT_STRING, &bthci_cmd_ocf_host_controller_and_baseband_vals_ext, 0x03ff,
NULL, HFILL }
},
{ &hf_bthci_evt_ocf_informational,
{ "Opcode Command Field", "bthci_evt.opcode.ocf",
FT_UINT16, BASE_HEX | BASE_EXT_STRING, &bthci_cmd_ocf_informational_vals_ext, 0x03ff,
NULL, HFILL }
},
{ &hf_bthci_evt_ocf_status,
{ "Opcode Command Field", "bthci_evt.opcode.ocf",
FT_UINT16, BASE_HEX | BASE_EXT_STRING, &bthci_cmd_ocf_status_vals_ext, 0x03ff,
NULL, HFILL }
},
{ &hf_bthci_evt_ocf_testing,
{ "Opcode Command Field", "bthci_evt.opcode.ocf",
FT_UINT16, BASE_HEX | BASE_EXT_STRING, &bthci_cmd_ocf_testing_vals_ext, 0x03ff,
NULL, HFILL }
},
{ &hf_bthci_evt_ocf_low_energy,
{ "Opcode Command Field", "bthci_evt.opcode.ocf",
FT_UINT16, BASE_HEX | BASE_EXT_STRING, &bthci_cmd_ocf_low_energy_vals_ext, 0x03ff,
NULL, HFILL }
},
{ &hf_bthci_evt_ocf_logo_testing,
{ "Opcode Command Field", "bthci_evt.opcode.ocf",
FT_UINT16, BASE_HEX, NULL, 0x03ff,
NULL, HFILL }
},
{ &hf_bthci_evt_ocf,
{ "Opcode Command Field", "bthci_evt.opcode.ocf",
FT_UINT16, BASE_HEX, NULL, 0x03ff,
NULL, HFILL }
},
{ &hf_bthci_evt_ret_params,
{ "Return Parameter", "bthci_evt.ret_params",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_status,
{ "Status", "bthci_evt.status",
FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_status_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_status_pending,
{ "Status", "bthci_evt.status",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_status_pending_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_bd_addr,
{ "BD_ADDR", "bthci_evt.bd_addr",
FT_ETHER, BASE_NONE, NULL, 0x0,
"Bluetooth Device Address", HFILL}
},
{ &hf_bthci_evt_link_type,
{ "Link Type", "bthci_evt.link_type",
FT_UINT8, BASE_HEX, VALS(evt_link_types), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_encryption_mode,
{ "Encryption Mode", "bthci_evt.encryption_mode",
FT_UINT8, BASE_HEX, VALS(evt_encryption_modes), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_reason,
{ "Reason", "bthci_evt.reason",
FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_status_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_remote_name,
{ "Remote Name", "bthci_evt.remote_name",
FT_STRINGZ, BASE_NONE, NULL, 0x0,
"Userfriendly descriptive name for the remote device", HFILL }
},
{ &hf_bthci_evt_encryption_enable,
{ "Encryption Enable", "bthci_evt.encryption_enable",
FT_UINT8, BASE_HEX, VALS(evt_encryption_enable), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_key_flag,
{ "Key Flag", "bthci_evt.key_flag",
FT_UINT8, BASE_HEX, VALS(evt_key_flag), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_vers_nr,
{ "LMP Version", "bthci_evt.lmp_vers_nr",
FT_UINT8, BASE_HEX, VALS(bthci_evt_lmp_version), 0x0,
"Version of the Current LMP", HFILL }
},
{ &hf_bthci_bthci_evt_hci_version,
{ "HCI Version", "bthci_evt.hci_vers_nr",
FT_UINT8, BASE_HEX, VALS(bthci_evt_hci_version), 0x0,
"Version of the Current HCI", HFILL }
},
{ &hf_bthci_evt_hci_revision,
{ "HCI Revision", "bthci_evt.hci_vers_nr",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Revision of the Current HCI", HFILL }
},
{ &hf_bthci_evt_comp_id,
{ "Manufacturer Name", "bthci_evt.comp_id",
FT_UINT16, BASE_HEX | BASE_EXT_STRING, &bluetooth_company_id_vals_ext, 0x0,
"Manufacturer Name of Bluetooth Hardware", HFILL }
},
{ &hf_bthci_evt_sub_vers_nr,
{ "LMP Subversion", "bthci_evt.lmp_sub_vers_nr",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Subversion of the Current LMP", HFILL }
},
{ &hf_bthci_evt_flags,
{ "Flags", "bthci_evt.flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_service_type,
{ "Service Type", "bthci_evt.service_type",
FT_UINT8, BASE_HEX, VALS(evt_service_types), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_token_rate,
{ "Available Token Rate", "bthci_evt.token_rate",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Available Token Rate, in bytes per second", HFILL }
},
{ &hf_bthci_evt_peak_bandwidth,
{ "Available Peak Bandwidth", "bthci_evt.peak_bandwidth",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Available Peak Bandwidth, in bytes per second", HFILL }
},
{ &hf_bthci_evt_latency,
{ "Available Latency", "bthci_evt.latency",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Available Latency, in microseconds", HFILL }
},
{ &hf_bthci_evt_delay_variation,
{ "Available Delay Variation", "bthci_evt.delay_variation",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Available Delay Variation, in microseconds", HFILL }
},
{ &hf_bthci_evt_hardware_code,
{ "Hardware Code", "bthci_evt.hardware_code",
FT_UINT8, BASE_HEX, NULL, 0x0,
"Hardware Code (implementation specific)", HFILL }
},
{ &hf_bthci_evt_role,
{ "Role", "bthci_evt.role",
FT_UINT8, BASE_HEX, VALS(evt_role_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_curr_mode,
{ "Current Mode", "bthci_evt.current_mode",
FT_UINT8, BASE_HEX, VALS(evt_modes), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_interval,
{ "Interval", "bthci_evt.interval",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Interval - Number of Baseband slots", HFILL }
},
{ &hf_bthci_evt_link_key,
{ "Link Key", "bthci_evt.link_key",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Link Key for the associated BD_ADDR", HFILL }
},
{ &hf_bthci_evt_key_type,
{ "Key Type", "bthci_evt.key_type",
FT_UINT8, BASE_HEX, VALS(evt_key_types), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_max_slots,
{ "Maximum Number of Slots", "bthci_evt.max_slots",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Maximum Number of slots allowed for baseband packets", HFILL }
},
{ &hf_bthci_evt_clock_offset,
{ "Clock Offset", "bthci_evt.clock_offset",
FT_UINT16, BASE_HEX, NULL, 0x7FFF,
"Bit 2-16 of the Clock Offset between CLKmaster-CLKslave", HFILL }
},
{ &hf_bthci_evt_page_scan_mode,
{ "Page Scan Mode", "bthci_evt.page_scan_mode",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_page_scan_modes), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_page_scan_repetition_mode,
{ "Page Scan Repetition Mode", "bthci_evt.page_scan_repetition_mode",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_page_scan_repetition_modes), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_reserved,
{ "Reserved", "bthci_evt.reserved",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_page_scan_period_mode,
{ "Page Scan Period Mode", "bthci_evt.page_scan_period_mode",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_page_scan_period_modes), 0x0,
NULL, HFILL }
},
{ &hf_packet_type_acl,
{ "Packet Type for ACL", "bthci_evt.packet_type",
FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }
},
{ &hf_packet_type_acl_dh5,
{ "DH5 may be used", "bthci_evt.packet_type.dh5",
FT_BOOLEAN, 16, NULL, 0x8000,
NULL, HFILL }
},
{ &hf_packet_type_acl_dm5,
{ "DM5 may be used", "bthci_evt.packet_type.dm5",
FT_BOOLEAN, 16, NULL, 0x4000,
NULL, HFILL }
},
{ &hf_packet_type_acl_3dh5,
{ "3-DH5 shall NOT be used", "bthci_evt.packet_type.3dh5",
FT_BOOLEAN, 16, NULL, 0x2000,
NULL, HFILL }
},
{ &hf_packet_type_acl_2dh5,
{ "2-DH5 shall NOT be used", "bthci_evt.packet_type.2dh5",
FT_BOOLEAN, 16, NULL, 0x1000,
NULL, HFILL }
},
{ &hf_packet_type_acl_dh3,
{ "DH3 may be used", "bthci_evt.packet_type.dh3",
FT_BOOLEAN, 16, NULL, 0x0800,
NULL, HFILL }
},
{ &hf_packet_type_acl_dm3,
{ "DM3 may be used", "bthci_evt.packet_type.dm3",
FT_BOOLEAN, 16, NULL, 0x0400,
NULL, HFILL }
},
{ &hf_packet_type_acl_3dh3,
{ "3-DH3 shall NOT be used", "bthci_evt.packet_type.3dh3",
FT_BOOLEAN, 16, NULL, 0x0200,
NULL, HFILL }
},
{ &hf_packet_type_acl_2dh3,
{ "2-DH3 shall NOT be used", "bthci_evt.packet_type.2dh3",
FT_BOOLEAN, 16, NULL, 0x0100,
NULL, HFILL }
},
{ &hf_packet_type_acl_reserved_5_7,
{ "Reserved", "bthci_evt.packet_type.reserved_5_7",
FT_UINT16, BASE_HEX, NULL, 0x00E0,
NULL, HFILL }
},
{ &hf_packet_type_acl_dh1,
{ "DH1 may be used", "bthci_evt.packet_type.dh1",
FT_BOOLEAN, 16, NULL, 0x0010,
NULL, HFILL }
},
{ &hf_packet_type_acl_dm1,
{ "DM1 may be used", "bthci_evt.packet_type.dm1",
FT_BOOLEAN, 16, NULL, 0x0008,
NULL, HFILL }
},
{ &hf_packet_type_acl_3dh1,
{ "3-DH1 shall NOT be used", "bthci_evt.packet_type.3dh1",
FT_BOOLEAN, 16, NULL, 0x0004,
NULL, HFILL }
},
{ &hf_packet_type_acl_2dh1,
{ "2-DH1 shall NOT be used", "bthci_evt.packet_type.2dh1",
FT_BOOLEAN, 16, NULL, 0x0002,
NULL, HFILL }
},
{ &hf_packet_type_acl_reserved_0,
{ "Reserved", "bthci_evt.packet_type.reserved_0",
FT_BOOLEAN, 16, NULL, 0x0001,
NULL, HFILL }
},
{ &hf_packet_type_sco,
{ "Packet Type for SCO", "bthci_evt.packet_type",
FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }
},
{ &hf_packet_type_sco_reserved_15_8,
{ "Reserved", "bthci_evt.packet_type.reserved_15_8",
FT_UINT16, BASE_HEX, NULL, 0xFF00,
NULL, HFILL }
},
{ &hf_packet_type_sco_hv3,
{ "HV3", "bthci_evt.packet_type.hv3",
FT_BOOLEAN, 16, NULL, 0x0080,
NULL, HFILL }
},
{ &hf_packet_type_sco_hv2,
{ "HV2", "bthci_evt.packet_type.hv2",
FT_BOOLEAN, 16, NULL, 0x0040,
NULL, HFILL }
},
{ &hf_packet_type_sco_hv1,
{ "HV1", "bthci_evt.packet_type.hv1",
FT_BOOLEAN, 16, NULL, 0x0020,
NULL, HFILL }
},
{ &hf_packet_type_sco_reserved_4_0,
{ "Reserved", "bthci_evt.packet_type.reserved_4_0",
FT_UINT16, BASE_HEX, NULL, 0x001F,
NULL, HFILL }
},
{ &hf_lmp_features,
{ "LMP Features", "bthci_evt.lmp_features",
FT_NONE, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_lmp_feature_3slot_packets,
{ "3-slot packets", "bthci_evt.lmp_features.3slot_packets",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_lmp_feature_5slot_packets,
{ "5-slot packets", "bthci_evt.lmp_features.5slot_packets",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_lmp_feature_encryption,
{ "Encryption", "bthci_evt.lmp_features.encryption",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_lmp_feature_slot_offset,
{ "Slot Offset", "bthci_evt.lmp_features.slot_offset",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_lmp_feature_timing_accuracy,
{ "Timing Accuracy", "bthci_evt.lmp_features.timing_accuracy",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_lmp_feature_role_switch,
{ "Role Switch", "bthci_evt.lmp_features.role_switch",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_lmp_feature_hold_mode,
{ "Hold Mode", "bthci_evt.lmp_features.hold_mode",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
{ &hf_lmp_feature_sniff_mode,
{ "Sniff Mode", "bthci_evt.lmp_features.sniff_mode",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_lmp_feature_park_state,
{ "Park Mode", "bthci_evt.lmp_features.park_state",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_lmp_feature_power_control_requests,
{ "Power Control Requests", "bthci_evt.lmp_features.power_control_requests",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_lmp_feature_channel_quality_driven_data_rate,
{ "Channel Quality Driven Data Rate", "bthci_evt.lmp_features.channel_quality_driven_data_rate",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_lmp_feature_sco_link,
{ "SCO Link", "bthci_evt.lmp_features.sco_link",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_lmp_feature_hv2_packets,
{ "HV2 packets", "bthci_evt.lmp_features.hv2_packets",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_lmp_feature_hv3_packets,
{ "HV3 packets", "bthci_evt.lmp_features.hv3_packets",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_lmp_feature_u_law_log_synchronous_data,
{ "u-law Log Synchronous Data", "bthci_evt.lmp_features.u_law_log_synchronous_data",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
{ &hf_lmp_feature_a_law_log_synchronous_data,
{ "A-law Log Synchronous Data", "bthci_evt.lmp_features.a_law_log_synchronous_data",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_lmp_feature_cvsd_synchronous_data,
{ "CVSD Synchronous Data", "bthci_evt.lmp_features.cvsd_synchronous_data",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_lmp_feature_paging_parameter_negotiation,
{ "Paging Parameter Negotiation", "bthci_evt.lmp_features.paging_parameter_negotiation",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_lmp_feature_power_control,
{ "Power Control", "bthci_evt.lmp_features.power_control",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_lmp_feature_transparent_synchronous_data,
{ "Transparent Synchronous Data", "bthci_evt.lmp_features.transparent_synchronous_data",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_lmp_feature_flow_control_lag,
{ "Flow Control Lag", "bthci_evt.lmp_features.flow_control_lag",
FT_UINT8, BASE_DEC, NULL, 0x70,
NULL, HFILL }
},
{ &hf_lmp_feature_broadcast_encryption,
{ "Broadband Encryption", "bthci_evt.lmp_features.broadcast_encryption",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_lmp_feature_reserved_24,
{ "Reserved", "bthci_evt.lmp_features.reserved.24",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_lmp_feature_edr_acl_2mbps_mode,
{ "EDR ACL 2 Mbps Mode", "bthci_evt.lmp_features.edr_acl_2mbps_mode",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_lmp_feature_edr_acl_3mbps_mode,
{ "EDR ACL 3 Mbps Mode", "bthci_evt.lmp_features.edr_acl_3mbps_mode",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_lmp_feature_enhanced_inquiry_scan,
{ "Enhanced Inquiry Scan", "bthci_evt.lmp_features.enhanced_inquiry_scan",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_lmp_feature_interlaced_inquiry_scan,
{ "Interlaced Inquiry Scan", "bthci_evt.lmp_features.interlaced_inquiry_scan",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_lmp_feature_interlaced_page_scan,
{ "Interlaced Page Scan", "bthci_evt.lmp_features.interlaced_page_scan",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_lmp_feature_rssi_with_inquiry_results,
{ "RSSI with Inquiry Results", "bthci_evt.lmp_features.rssi_with_inquiry_results",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
{ &hf_lmp_feature_ev3_packets,
{ "EV3 Packets", "bthci_evt.lmp_features.ev3_packets",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_lmp_feature_ev4_packets,
{ "EV4 Packets", "bthci_evt.lmp_features.ev4_packets",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_lmp_feature_ev5_packets,
{ "EV5 Packets", "bthci_evt.lmp_features.ev5_packets",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_lmp_feature_reserved_34,
{ "Reserved", "bthci_evt.lmp_features.reserved.34",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_lmp_feature_afh_capable_slave,
{ "AFH Capable Slave", "bthci_evt.lmp_features.afh_capable_slave",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_lmp_feature_afh_classification_slave,
{ "AFH Classification Slave", "bthci_evt.lmp_features.afh_classification_slave",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_lmp_feature_br_edr_not_supported,
{ "BR/EDR Not Supported", "bthci_evt.lmp_features.br_edr_not_supported",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_lmp_feature_le_supported_controller,
{ "LE Supported Controller", "bthci_evt.lmp_features.le_supported_controller",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
{ &hf_lmp_feature_3slot_edr_acl_packets,
{ "3-slot EDR ACL packets", "bthci_evt.lmp_features.3slot_edr_acl_packets",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_lmp_feature_5slot_edr_acl_packets,
{ "5-slot EDR ACL packets", "bthci_evt.lmp_features.5slot_edr_acl_packets",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_lmp_feature_sniff_subrating,
{ "Sniff Subrating", "bthci_evt.lmp_features.sniff_subrating",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_lmp_feature_pause_encryption,
{ "Pause Encryption", "bthci_evt.lmp_features.pause_encryption",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_lmp_feature_afh_capable_master,
{ "AFH Capable Master", "bthci_evt.lmp_features.afh_capable_master",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_lmp_feature_afh_classification_master,
{ "AFH Classification Master", "bthci_evt.lmp_features.afh_classification_master",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_lmp_feature_edr_esco_2mbps_mode,
{ "EDR eSCO 2 Mbps Mode", "bthci_evt.lmp_features.edr_esco_2mbps_mode",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_lmp_feature_edr_esco_3mbps_mode,
{ "EDR eSCO 3 Mbps Mode", "bthci_evt.lmp_features.edr_esco_3mbps_mode",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
{ &hf_lmp_feature_3slot_edr_esco_packets,
{ "3-slot EDR eSCO Packets", "bthci_evt.lmp_features.3slot_edr_esco_packets",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_lmp_feature_extended_inquiry_response,
{ "Extended Inquiry Response", "bthci_evt.lmp_features.extended_inquiry_response",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_lmp_feature_simultaneous_le_and_br_edr_controller,
{"Simultaneous LE and BR/EDR to Same Device Capable Controller", "bthci_evt.lmp_features.simultaneous_le_and_br_edr.controller",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}
},
{ &hf_lmp_feature_reserved_50,
{ "Reserved", "bthci_evt.lmp_features.reserved.50",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_lmp_feature_secure_simple_pairing,
{ "Secure Simple Pairing", "bthci_evt.lmp_features.secure_simple_pairing",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_lmp_feature_encapsulated_pdu,
{ "Encapsulated PDU", "bthci_evt.lmp_features.encapsulated_pdu",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_lmp_feature_erroneous_data_reporting,
{ "Erroneous Data Reporting", "bthci_evt.lmp_features.erroneous_data_reporting",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_lmp_feature_non_flushable_packet_boundary_flag,
{ "Non-flushable Packet Boundary Flag", "bthci_evt.lmp_features.non_flushable_packet_boundary_flag",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
{ &hf_lmp_feature_reserved_55,
{ "Reserved", "bthci_evt.lmp_features.reserved.55",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_lmp_feature_link_supervision_timeout_changed_event,
{ "Link Supervision Timeout Changed Event", "bthci_evt.lmp_features.supervision_timeout_changed_event",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_lmp_feature_inquiry_tx_power_level,
{ "Inquiry TX Power Level", "bthci_evt.lmp_features.inquiry_tx_power_level",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_lmp_feature_enhanced_power_control,
{ "Enhanced Power Control", "bthci_evt.lmp_features.enhanced_power_control",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_lmp_feature_reserved_59_62,
{ "Reserved", "bthci_evt.lmp_features.reserved.59_62",
FT_BOOLEAN, 8, NULL, 0x78,
NULL, HFILL }
},
{ &hf_lmp_feature_extended_features,
{ "Extended Features", "bthci_evt.lmp_features.extended_features",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_lmp_feature_secure_simple_pairing_host,
{"Secure Simple Pairing Host", "bthci_evt.lmp_features.secure_simple_pairing_host",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}
},
{ &hf_lmp_feature_le_supported_host,
{"LE Supported Host", "bthci_evt.lmp_features.le_supported.host",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}
},
{ &hf_lmp_feature_simultaneous_le_and_br_edr_host,
{"Simultaneous LE and BR/EDR to Same Device Capable Host", "bthci_evt.lmp_features.simultaneous_le_and_br_edr.host",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}
},
{ &hf_lmp_feature_secure_connections_host,
{"Secure Connections Host", "bthci_evt.lmp_features.secure_connections_host",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL}
},
{ &hf_lmp_feature_reserved_68_71,
{"Reserved", "bthci_evt.lmp_features.reserved.68_71",
FT_UINT8, BASE_HEX, NULL, 0xF0,
NULL, HFILL}
},
{ &hf_lmp_feature_csb_master_operation,
{"Connectionless Slave Broadcast Master Operation", "bthci_evt.lmp_features.csb_master_operation",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}
},
{ &hf_lmp_feature_csb_slave_operation,
{"Connectionless Slave Broadcast Slave Operation", "bthci_evt.lmp_features.csb_slave_operation",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}
},
{ &hf_lmp_feature_synchronization_train,
{"Synchronization Train", "bthci_evt.lmp_features.synchronization_train",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}
},
{ &hf_lmp_feature_synchronization_scan,
{"Synchronization Scan", "bthci_evt.lmp_features.synchronization_scan",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL}
},
{ &hf_lmp_feature_inquiry_response_notification_event,
{"Inquiry Response Notification Event", "bthci_evt.lmp_features.inquiry_response_notification_event",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL}
},
{ &hf_lmp_feature_generalized_interlaced_scan,
{"Generalized Interlaced Scan", "bthci_evt.lmp_features.generalized_interlaced_scan",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL}
},
{ &hf_lmp_feature_coarse_clock_adjustment,
{"Coarse Clock Adjustment", "bthci_evt.lmp_features.coarse_clock_adjustment",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL}
},
{ &hf_lmp_feature_reserved_135,
{"Reserved", "bthci_evt.lmp_features.reserved_135",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL}
},
{ &hf_lmp_feature_secure_connections_controller,
{"Secure Connections Controller", "bthci_evt.lmp_features.secure_connections_controller",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}
},
{ &hf_lmp_feature_ping,
{"Ping", "bthci_evt.lmp_features.ping",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}
},
{ &hf_lmp_feature_reserved_138,
{"Reserved", "bthci_evt.lmp_features.reserved_138",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}
},
{ &hf_lmp_feature_train_nudging,
{"Train Nudging", "bthci_evt.lmp_features.train_nudging",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL}
},
{ &hf_lmp_feature_slot_availability_mask,
{"Slot Availability Mask", "bthci_evt.lmp_features.slot_availability_mask",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL}
},
{ &hf_lmp_feature_reserved,
{"Reserved", "bthci_evt.lmp_features.reserved",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_num_keys,
{ "Number of Link Keys", "bthci_evt.num_keys",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Number of Link Keys contained", HFILL }
},
{ &hf_bthci_evt_num_keys_read,
{ "Number of Link Keys Read", "bthci_evt.num_keys_read",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_keys_deleted,
{ "Number of Link Keys Deleted", "bthci_evt.num_keys_deleted",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_keys_written,
{ "Number of Link Keys Written", "bthci_evt.num_keys_written",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_max_num_keys,
{ "Max Num Keys", "bthci_evt.max_num_keys",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Total Number of Link Keys that the Host Controller can store", HFILL }
},
{ &hf_bthci_evt_num_responses,
{ "Number of responses", "bthci_evt.num_responses",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Number of Responses from Inquiry", HFILL }
},
{ &hf_bthci_evt_link_policy_setting_switch,
{ "Enable Master Slave Switch", "bthci_evt.link_policy_switch",
FT_BOOLEAN, 16, NULL, 0x0001,
NULL, HFILL }
},
{ &hf_bthci_evt_link_policy_setting_hold,
{ "Enable Hold Mode", "bthci_evt.link_policy_hold",
FT_BOOLEAN, 16, NULL, 0x0002,
NULL, HFILL }
},
{ &hf_bthci_evt_link_policy_setting_sniff,
{ "Enable Sniff Mode", "bthci_evt.link_policy_sniff",
FT_BOOLEAN, 16, NULL, 0x0004,
NULL, HFILL }
},
{ &hf_bthci_evt_link_policy_setting_park,
{ "Enable Park Mode", "bthci_evt.link_policy_park",
FT_BOOLEAN, 16, NULL, 0x0008,
NULL, HFILL }
},
{ &hf_bthci_evt_curr_role,
{ "Current Role", "bthci_evt.curr_role",
FT_UINT8, BASE_HEX, VALS(evt_role_vals_handle), 0x0,
"Current role for this connection handle", HFILL }
},
{ &hf_bthci_evt_pin_type,
{ "PIN Type", "bthci_evt.pin_type",
FT_UINT8, BASE_HEX, VALS(evt_pin_types), 0x0,
"PIN Types", HFILL }
},
{ &hf_bthci_evt_device_name,
{ "Device Name", "bthci_evt.device_name",
FT_STRINGZ, BASE_NONE, NULL, 0x0,
"Userfriendly descriptive name for the device", HFILL }
},
{ &hf_bthci_evt_timeout,
{ "Timeout", "bthci_evt.timeout",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Number of Baseband slots for timeout.", HFILL }
},
{ &hf_bthci_evt_scan_enable,
{ "Scan", "bthci_evt.scan_enable",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_scan_enable_values), 0x0,
"Scan Enable", HFILL }
},
{ &hf_bthci_evt_authentication_enable,
{ "Authentication", "bthci_evt.auth_enable",
FT_UINT8, BASE_HEX, VALS(evt_auth_enable_values), 0x0,
"Authentication Enable", HFILL }
},
{ &hf_bthci_evt_sco_flow_cont_enable,
{ "SCO Flow Control", "bthci_evt.sco_flow_cont_enable",
FT_UINT8, BASE_HEX, VALS(evt_enable_values), 0x0,
"SCO Flow Control Enable", HFILL }
},
{ &hf_bthci_evt_window,
{ "Window", "bthci_evt.window",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_input_unused,
{ "Unused bits", "bthci_evt.voice.unused",
FT_UINT16, BASE_HEX, NULL, 0xfc00,
NULL, HFILL }
},
{ &hf_bthci_evt_input_coding,
{ "Input Coding", "bthci_evt.voice.input_coding",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &bthci_cmd_input_coding_vals_ext, 0x0300,
NULL, HFILL }
},
{ &hf_bthci_evt_input_data_format,
{ "Input Data Format", "bthci_evt.voice.input_data_format",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &bthci_cmd_input_data_format_vals_ext, 0x00c0,
NULL, HFILL }
},
{ &hf_bthci_evt_input_sample_size,
{ "Input Sample Size", "bthci_evt.voice.input_sample_size",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &bthci_cmd_input_sample_size_vals_ext, 0x0020,
NULL, HFILL }
},
{ &hf_bthci_evt_linear_pcm_bit_pos,
{ "Linear PCM Bit Position", "bthci_evt.voice.linear_pcm_bit_pos",
FT_UINT16, BASE_DEC, NULL, 0x001c,
"# bit pos. that MSB of sample is away from starting at MSB", HFILL }
},
{ &hf_bthci_evt_air_coding_format,
{ "Air Coding Format", "bthci_evt.voice.air_coding_format",
FT_UINT16, BASE_DEC | BASE_EXT_STRING, &bthci_cmd_air_coding_format_vals_ext, 0x0003,
NULL, HFILL }
},
{ &hf_bthci_evt_num_broadcast_retransm,
{ "Num Broadcast Retran", "bthci_evt.num_broad_retran",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Number of Broadcast Retransmissions", HFILL }
},
{ &hf_bthci_evt_hold_mode_act_page,
{ "Suspend Page Scan", "bthci_evt.hold_mode_page",
FT_BOOLEAN, 8, NULL, 0x1,
"Device can enter low power state", HFILL }
},
{ &hf_bthci_evt_hold_mode_act_inquiry,
{ "Suspend Inquiry Scan", "bthci_evt.hold_mode_inquiry",
FT_BOOLEAN, 8, NULL, 0x2,
"Device can enter low power state", HFILL }
},
{ &hf_bthci_evt_hold_mode_act_periodic,
{ "Suspend Periodic Inquiries", "bthci_evt.hold_mode_periodic",
FT_BOOLEAN, 8, NULL, 0x4,
"Device can enter low power state", HFILL }
},
{ &hf_bthci_evt_transmit_power_level,
{ "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,
{"Num Support IAC", "bthci_evt.num_supp_iac",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Num of supported IAC the device can simultaneously listen", HFILL }
},
{ &hf_bthci_evt_num_curr_iac,
{"Num Current IAC", "bthci_evt.num_curr_iac",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Num of IACs currently in use to simultaneously listen", HFILL }
},
{ &hf_bthci_evt_iac_lap,
{ "IAC LAP", "bthci_evt.iac_lap",
FT_UINT24, BASE_HEX, NULL, 0x0,
"LAP(s)used to create IAC", HFILL }
},
{ &hf_bthci_evt_loopback_mode,
{"Loopback Mode", "bthci_evt.loopback_mode",
FT_UINT8, BASE_HEX, VALS(evt_loopback_modes), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_country_code,
{"Country Code", "bthci_evt.country_code",
FT_UINT8, BASE_HEX, VALS(evt_country_code_values), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_failed_contact_counter,
{"Failed Contact Counter", "bthci_evt.failed_contact_counter",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_link_quality,
{"Link Quality", "bthci_evt.link_quality",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Link Quality (0x00 - 0xFF Higher Value = Better Link)", HFILL }
},
{ &hf_bthci_evt_rssi,
{ "RSSI", "bthci_evt.rssi",
FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_host_data_packet_length_acl,
{"Host ACL Data Packet Length (bytes)", "bthci_evt.max_data_length_acl",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Max Host ACL Data Packet length of data portion host is able to accept", HFILL }
},
{ &hf_bthci_evt_host_data_packet_length_sco,
{"Host SCO Data Packet Length (bytes)", "bthci_evt.max_data_length_sco",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Max Host SCO Data Packet length of data portion host is able to accept", HFILL }
},
{ &hf_bthci_evt_host_total_num_acl_data_packets,
{"Host Total Num ACL Data Packets", "bthci_evt.max_data_num_acl",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Total Number of HCI ACL Data Packets that can be stored in the data buffers of the Host", HFILL }
},
{ &hf_bthci_evt_host_total_num_sco_data_packets,
{"Host Total Num SCO Data Packets", "bthci_evt.max_data_num_sco",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Total Number of HCI SCO Data Packets that can be stored in the data buffers of the Host", HFILL }
},
{ &hf_bthci_evt_page_number,
{"Page Number", "bthci_evt.page_number",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_max_page_number,
{"Max. Page Number", "bthci_evt.max_page_number",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_local_supported_cmds,
{ "Local Supported Commands", "bthci_evt.local_supported_cmds",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_fec_required,
{"FEC Required", "bthci_evt.fec_required",
FT_BOOLEAN, 8, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_err_data_reporting,
{"Erroneous Data Reporting", "bthci_evt.err_data_reporting",
FT_UINT8, BASE_DEC, VALS(evt_enable_values), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_scan_type,
{"Scan Type", "bthci_evt.inq_scan_type",
FT_UINT8, BASE_DEC, VALS(evt_scan_types), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_inq_mode,
{"Inquiry Mode", "bthci_evt.inq_mode",
FT_UINT8, BASE_DEC, VALS(bthci_cmd_inq_modes), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_power_level_type,
{"Type", "bthci_evt.power_level_type",
FT_UINT8, BASE_HEX, VALS(evt_power_level_types), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_sync_link_type,
{"Link Type", "bthci_evt.sync_link_type",
FT_UINT8, BASE_HEX, VALS(evt_sync_link_types), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_sync_tx_interval,
{"Transmit Interval", "bthci_evt.sync_tx_interval",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_le_local_p_256_public_key,
{ "Local-256_Public_Key", "bthci_evt.le_local_p_256_public_key",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_dhkey,
{ "DHKey", "bthci_evt.dhkey",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_sync_rtx_window,
{"Retransmit Window", "bthci_evt.sync_rtx_window",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_sync_rx_packet_length,
{"Rx Packet Length", "bthci_evt.sync_rx_pkt_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_sync_tx_packet_length,
{"Tx Packet Length", "bthci_evt.sync_tx_pkt_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_air_mode,
{"Air Mode", "bthci_evt.air_mode",
FT_UINT8, BASE_DEC, VALS(evt_air_mode_vals), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_max_tx_latency,
{"Max. Tx Latency", "bthci_evt.max_tx_latency",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_max_rx_latency,
{"Max. Rx Latency", "bthci_evt.max_rx_latency",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_min_remote_timeout,
{"Min. Remote Timeout", "bthci_evt.min_remote_timeout",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_min_local_timeout,
{"Min. Local Timeout", "bthci_evt.min_local_timeout",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_link_supervision_timeout,
{"Link Supervision Timeout", "bthci_evt.link_supervision_timeout",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_token_bucket_size,
{ "Token Bucket Size", "bthci_evt.token_bucket_size",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Token Bucket Size (bytes)", HFILL }
},
{ &hf_bthci_evt_flow_direction,
{"Flow Direction", "bthci_evt.flow_direction",
FT_UINT8, BASE_DEC, VALS(evt_flow_direction_values), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_afh_ch_assessment_mode,
{"AFH Channel Assessment Mode", "bthci_evt.afh_ch_assessment_mode",
FT_UINT8, BASE_DEC, VALS(evt_enable_values), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_lmp_handle,
{ "LMP Handle", "bthci_evt.lmp_handle",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_clock,
{ "Clock", "bthci_evt.clock",
FT_UINT32, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_clock_accuracy,
{ "Clock", "bthci_evt.clock_accuracy",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_afh_mode,
{"AFH Mode", "bthci_evt.afh_mode",
FT_UINT8, BASE_DEC, VALS(evt_enable_values), 0x0,
NULL, HFILL}
},
/* TODO: More detailed dissection */
{ &hf_bthci_evt_afh_channel_map,
{"AFH Channel Map", "bthci_evt.afh_channel_map",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_simple_pairing_mode,
{"Simple Pairing Mode", "bthci_evt.simple_pairing_mode",
FT_UINT8, BASE_DEC, VALS(evt_enable_values), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_hash_c,
{"Hash C", "bthci_evt.hash_c",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_randomizer_r,
{"Randomizer R", "bthci_evt.randomizer_r",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_io_capability,
{"IO Capability", "bthci_evt.io_capability",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_io_capability_vals), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_oob_data_present,
{"OOB Data Present", "bthci_evt.oob_data_present",
FT_UINT8, BASE_DEC, VALS(bthci_cmd_oob_data_present_vals), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_auth_requirements,
{"Authentication Requirements", "bthci_evt.auth_requirements",
FT_UINT8, BASE_DEC|BASE_EXT_STRING, &bthci_cmd_auth_req_vals_ext, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_numeric_value,
{"Numeric Value", "bthci_evt.numeric_value",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_passkey,
{"Passkey", "bthci_evt.passkey",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_notification_type,
{"Notification Type", "bthci_evt.notification_type",
FT_UINT8, BASE_DEC, VALS(bthci_cmd_notification_types), 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_data_length,
{ "Data Length", "bthci_evt.data_length",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_location_domain_aware,
{ "Location Domain Aware", "bthci_evt.location_domain_aware",
FT_BOOLEAN, 8, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_location_domain,
{ "Location Domain", "bthci_evt.location_domain",
FT_STRING, BASE_NONE, NULL, 0x0,
"ISO 3166-1 Country Code", HFILL }
},
{ &hf_bthci_evt_location_domain_options,
{ "Location Domain Options", "bthci_evt.location_domain_options",
FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_location_options,
{ "Location Options", "bthci_evt.location_options",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_flow_control_mode,
{ "Flow Control Mode", "bthci_evt.flow_control_mode",
FT_UINT8, BASE_HEX, VALS(evt_flow_ctrl_mode), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_physical_link_handle,
{ "Physical Link Handle", "bthci_evt.physical_link_handle",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_flow_spec_identifier,
{ "Flow Spec Identifier", "bthci_evt.flow_spec_id",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_logical_link_handle,
{ "Logical Link Handle", "bthci_evt.logical_link_handle",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_max_acl_data_packet_length,
{ "Max. ACL Data Packet Length", "bthci_evt.max_acl_data_packet_length",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_data_block_length,
{ "Max. Data Block Length", "bthci_evt.data_block_length",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_total_num_data_blocks,
{ "Total Number of Data Blocks", "bthci_evt.total_num_data_blocks",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_enc_key_size,
{ "Encryption Key Size", "bthci_evt.enc_key_size",
FT_INT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_amp_remaining_assoc_length,
{ "AMP Remaining Assoc Length", "bthci_evt.amp_remaining_assoc_length",
FT_UINT16, BASE_DEC, 0x0, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_amp_assoc_fragment,
{ "AMP Assoc Fragment", "bthci_evt.amp_assoc_fragment",
FT_BYTES, BASE_NONE, 0x0, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_amp_status,
{ "AMP Status", "bthci_evt.amp_status",
FT_UINT8, BASE_HEX, VALS(evt_amp_status), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_total_bandwidth,
{ "Total Bandwidth (kbps)", "bthci_evt.total_bandwidth",
FT_UINT32, BASE_DEC, 0x0, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_max_guaranteed_bandwidth,
{ "Max Guaranteed Bandwidth (kbps)", "bthci_evt.max_guaranteed_bandwidth",
FT_UINT32, BASE_DEC, 0x0, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_min_latency,
{ "Min Latency (us)", "bthci_evt.min_latency",
FT_UINT32, BASE_DEC, 0x0, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_max_pdu_size,
{ "Max PDU Size", "bthci_evt.max_pdu_size",
FT_UINT32, BASE_DEC, 0x0, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_amp_controller_type,
{ "Controller Type", "bthci_evt.controller_type",
FT_UINT8, BASE_HEX, VALS(bthci_evt_controller_types), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_pal_capabilities_00,
{ "Guaranteed Service", "bthci_evt.pal_capabilities",
FT_BOOLEAN, 16, NULL, 0x0001,
NULL, HFILL }
},
{ &hf_bthci_evt_max_amp_assoc_length,
{ "Max AMP Assoc Length", "bthci_evt.max_amp_assoc_length",
FT_UINT32, BASE_DEC, 0x0, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_max_flush_to_us,
{ "Max Flush Timeout (us)", "bthci_evt.max_flush_to",
FT_UINT32, BASE_DEC, 0x0, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_best_effort_flush_to_us,
{ "Best Effort Flush Timeout (us)", "bthci_evt.best_effort_flush_to",
FT_UINT32, BASE_DEC, 0x0, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_link_loss_reason,
{ "Reason", "bthci_evt.link_loss_reason",
FT_UINT8, BASE_HEX, VALS(evt_link_loss_reasons), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_compl_blocks,
{ "Number Of Completed Blocks", "bthci_evt.num_compl_blocks",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_test_scenario,
{ "Test Scenario", "bthci_evt.test_scenario",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_report_reason,
{ "Reason", "bthci_evt.report_reason",
FT_UINT8, BASE_HEX, VALS(evt_report_reasons), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_report_event_type,
{ "Report Event Type", "bthci_evt.report_event_type",
FT_UINT8, BASE_HEX, VALS(evt_report_event_types), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_frames,
{ "Number Of Frames", "bthci_evt.num_frames",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_error_frames,
{ "Number Of Error Frames", "bthci_evt.num_error_frames",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_bits,
{ "Number Of Bits", "bthci_evt.num_bits",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_error_bits,
{ "Number Of Error Bits", "bthci_evt.num_error_bits",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_short_range_mode_state,
{ "Short Range Mode State", "bthci_evt.short_range_mode_state",
FT_BOOLEAN, 8, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_transmit_power_level_gfsk,
{ "Transmit Power Level GFSK (dBm)", "bthci_evt.transmit_power_level_gfsk",
FT_INT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_transmit_power_level_dqpsk,
{ "Transmit Power Level DQPSK (dBm)", "bthci_evt.transmit_power_level_dqpsk",
FT_INT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_transmit_power_level_8dpsk,
{ "Transmit Power Level 8DPSK (dBm)", "bthci_evt.transmit_power_level_8dpsk",
FT_INT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_flush_to_us,
{ "Flush Timeout (us)", "bthci_evt.flushto",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_supported_host,
{ "LE Supported Host", "bthci_evt.le_supported_host",
FT_BOOLEAN, 8, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_simultaneous_host,
{ "Simultaneous LE Host", "bthci_evt.le_simultaneous_host",
FT_BOOLEAN, 8, NULL, 0x0,
"Support for both LE and BR/EDR to same device", HFILL }
},
{ &hf_bthci_evt_le_acl_data_pkt_len,
{ "LE ACL Data Packet Length", "bthci_evt.le_acl_data_pkt_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_total_num_le_acl_data_pkts,
{ "Total Number LE ACL Data Packets", "bthci_evt.le_total_num_acl_data_pkts",
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,
"Max. total whitelist entries storable in controller", HFILL }
},
{ &hf_bthci_evt_le_channel_map,
{ "Channel Map", "bthci_evt.le_channel_map",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_encrypted_data,
{ "Plaintext", "bthci_evt.le_encrypted_data",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_random_number,
{ "Random Number", "bthci_evt.le_random_number",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_num_packets,
{ "Number of Packets", "bthci_evt.le_num_packets",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_meta_subevent,
{ "Sub Event", "bthci_evt.le_meta_subevent",
FT_UINT8, BASE_HEX, VALS(evt_le_meta_subevent), 0x00,
NULL, HFILL }
},
{ &hf_bthci_evt_le_peer_address_type,
{ "Peer Address Type", "bthci_evt.le_peer_address_type",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_address_types_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_local_rpa,
{ "Local Resolvable Private Address", "bthci_evt.le_local_rpa",
FT_ETHER, BASE_NONE, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_le_peer_rpa,
{ "Peer Resolvable Private Address", "bthci_evt.le_peer_rpa",
FT_ETHER, BASE_NONE, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_le_con_interval,
{ "Connection Interval", "bthci_evt.le_con_interval",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_min_interval,
{ "Min Connection Interval", "bthci_evt.le_min_interval",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_max_interval,
{ "Min Connection Interval", "bthci_evt.le_max_interval",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_con_latency,
{ "Connection Latency", "bthci_evt.le_con_latency",
FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_number_events, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_supervision_timeout,
{ "Supervision Timeout", "bthci_evt.le_supv_timeout",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_max_tx_octets,
{ "Max TX Octets", "bthci_evt.max_tx_octets",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_max_tx_time,
{ "Max TX Time", "bthci_evt.max_tx_time",
FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_max_rx_octets,
{ "Max RX Octets", "bthci_evt.max_rx_octets",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_max_rx_time,
{ "Max RX Time", "bthci_evt.max_rx_time",
FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_encrypted_diversifier,
{ "Encrypted Diversifier", "bthci_evt.le_encrypted_diversifier",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_master_clock_accuracy,
{ "Master Clock Accuracy", "bthci_evt.le_master_clock_accuracy",
FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_clock_accuray_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_reports,
{ "Num Reports", "bthci_evt.le_num_reports",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_advts_event_type,
{ "Event Type", "bthci_evt.le_advts_event_type",
FT_UINT8, BASE_HEX, VALS(evt_le_advertising_evt_types), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_ext_advts_event_type,
{ "Event Type", "bthci_evt.le_ext_advts_event_type",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states,
{ "Supported LE States", "bthci_evt.le_states",
FT_NONE, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_00,
{ "Non-connectable Advertising State", "bthci_evt.le_states_00",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_01,
{ "Scannable Advertising State", "bthci_evt.le_states_01",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_02,
{ "Connectable Advertising State", "bthci_evt.le_states_02",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_03,
{ "Directed Advertising State", "bthci_evt.le_states_03",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_04,
{ "Passive Scanning State", "bthci_evt.le_states_04",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_05,
{ "Active Scanning State", "bthci_evt.le_states_05",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_06,
{ "Initiating State. Connection State in Master Role", "bthci_evt.le_states_06",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_07,
{ "Connection State in Slave Role", "bthci_evt.le_states_07",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_10,
{ "Non-connectable Advertising State and Passive Scanning State combination", "bthci_evt.le_states_10",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_11,
{ "Scannable Advertising State and Passive Scanning State combination", "bthci_evt.le_states_11",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_12,
{ "Connectable Advertising State and Passive Scanning State combination", "bthci_evt.le_states_12",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_13,
{ "Directed Advertising State and Passive Scanning State combination", "bthci_evt.le_states_13",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_14,
{ "Non-connectable Advertising State and Active Scanning State combination", "bthci_evt.le_states_14",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_15,
{ "Scannable Advertising State and Active Scanning State combination", "bthci_evt.le_states_15",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_16,
{ "Connectable Advertising State and Active Scanning State combination", "bthci_evt.le_states_16",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_17,
{ "Directed Advertising State and Active Scanning State combination", "bthci_evt.le_states_17",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_20,
{ "Non-connectable Advertising State and Initiating State combination", "bthci_evt.le_states_20",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_21,
{ "Scannable Advertising State and Initiating State combination", "bthci_evt.le_states_21",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_22,
{ "Non-connectable Advertising State and Master Role combination", "bthci_evt.le_states_22",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_23,
{ "Scannable Advertising State and Master Role combination", "bthci_evt.le_states_23",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_24,
{ "Non-connectable Advertising State and Slave Role combination", "bthci_evt.le_states_24",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_25,
{ "Scannable Advertising State and Slave Role combination", "bthci_evt.le_states_25",
FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_26,
{ "Passive Scanning State and Initiating State combination", "bthci_evt.le_states_26",
FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_27,
{ "Active Scanning State and Initiating State combination", "bthci_evt.le_states_27",
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_30,
{ "Passive Scanning State and Master Role combination", "bthci_evt.le_states_30",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_31,
{ "Active Scanning State and Master Role combination", "bthci_evt.le_states_31",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_32,
{ "Passive Scanning state and Slave Role combination", "bthci_evt.le_states_32",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_33,
{ "Active Scanning state and Slave Role combination", "bthci_evt.le_states_33",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_bthci_evt_le_states_34,
{ "Initiating State and Master Role combination. Master Role and Master Role combination", "bthci_evt.le_states_34",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_changed_in_frame,
{ "Change in Frame", "bthci_evt.change_in_frame",
FT_FRAMENUM, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_command_in_frame,
{ "Command in frame", "bthci_evt.command_in_frame",
FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_REQUEST), 0x0,
NULL, HFILL }
},
{ &hf_pending_in_frame,
{ "Pending in frame", "bthci_evt.pending_in_frame",
FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE), 0x0,
NULL, HFILL }
},
{ &hf_response_in_frame,
{ "Response in frame", "bthci_evt.response_in_frame",
FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE), 0x0,
NULL, HFILL }
},
{ &hf_command_response_time_delta,
{ "Command-Response Delta", "bthci_evt.command_response_delta",
FT_DOUBLE, BASE_NONE|BASE_UNIT_STRING, &units_milliseconds, 0x00,
NULL, HFILL }
},
{ &hf_command_pending_time_delta,
{ "Command-Pending Delta", "bthci_evt.command_pending_delta",
FT_DOUBLE, BASE_NONE|BASE_UNIT_STRING, &units_milliseconds, 0x00,
NULL, HFILL }
},
{ &hf_pending_response_time_delta,
{ "Pending-Response Delta", "bthci_evt.pending_response_delta",
FT_DOUBLE, BASE_NONE|BASE_UNIT_STRING, &units_milliseconds, 0x00,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features,
{ "Supported LE Features", "bthci_evt.le_features",
FT_UINT64, BASE_HEX, NULL, 0x00,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_encryption,
{ "LE Encryption", "bthci_evt.le_features.encryption",
FT_BOOLEAN, 64, NULL, 0x01,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_connection_parameters_request_procedure,
{ "Connection Parameters Request Procedure", "bthci_evt.le_features.connection_parameters_request_procedure",
FT_BOOLEAN, 64, NULL, 0x02,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_extended_reject_indication,
{ "Extended Reject Indication", "bthci_evt.le_features.extended_reject_indication",
FT_BOOLEAN, 64, NULL, 0x04,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_slave_initiated_features_exchange,
{ "Slave-Initiated Features Exchange", "bthci_evt.le_features.slave_initiated_features_exchange",
FT_BOOLEAN, 64, NULL, 0x08,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_ping,
{ "Ping", "bthci_evt.le_features.ping",
FT_BOOLEAN, 64, NULL, 0x10,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_data_packet_length_extension,
{ "Data Packet Length Extension", "bthci_evt.le_features.data_packet_length_extension",
FT_BOOLEAN, 64, NULL, 0x20,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_ll_privacy,
{ "LL Privacy", "bthci_evt.le_features.ll_privacy",
FT_BOOLEAN, 64, NULL, 0x40,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_extended_scanner_filter_policies,
{ "Extended Scanner Filter Policies", "bthci_evt.le_features.extended_scanner_filter_policies",
FT_BOOLEAN, 64, NULL, 0x80,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_2m_phy,
{ "LE 2M PHY", "bthci_evt.le_features.2m_phy",
FT_BOOLEAN, 64, NULL, 0x0100,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_stable_modulation_index_tx,
{ "Stable Modulation Index - Tx", "bthci_evt.le_features.stable_modulation_index_tx",
FT_BOOLEAN, 64, NULL, 0x0200,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_stable_modulation_index_rx,
{ "Stable Modulation Index - Rx", "bthci_evt.le_features.stable_modulation_index_rx",
FT_BOOLEAN, 64, NULL, 0x0400,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_coded_phy,
{ "LE Coded PHY", "bthci_evt.le_features.coded_phy",
FT_BOOLEAN, 64, NULL, 0x0800,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_extended_advertising,
{ "LE Extended Advertising", "bthci_evt.le_features.extended_advertising",
FT_BOOLEAN, 64, NULL, 0x1000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_periodic_advertising,
{ "LE Periodic Advertising", "bthci_evt.le_features.periodic_advertising",
FT_BOOLEAN, 64, NULL, 0x2000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_channel_selection_algorithm_2,
{ "Channel Selection Algorithm #2", "bthci_evt.le_features.channel_selection_algorithm_2",
FT_BOOLEAN, 64, NULL, 0x4000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_power_class_1,
{ "Power Class 1", "bthci_evt.le_features.power_class_1",
FT_BOOLEAN, 64, NULL, 0x8000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_minimum_number_of_used_channels_procedure,
{ "Minimum Number of Used Channels Procedure", "bthci_evt.le_features.minimum_number_of_used_channels_procedure",
FT_BOOLEAN, 64, NULL, 0x010000,
NULL, HFILL }
},
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
{ &hf_bthci_evt_le_features_connection_cte_request,
{ "Connection CTE Request", "bthci_evt.le_features.connection_cte_request",
FT_BOOLEAN, 64, NULL, 0x020000,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_connection_cte_response,
{ "Connection CTE Response", "bthci_evt.le_features.connection_cte_response",
FT_BOOLEAN, 64, NULL, 0x040000,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_connectionless_cte_tx,
{ "Connectionless CTE Tx", "bthci_evt.le_features.connectionless_cte_tx",
FT_BOOLEAN, 64, NULL, 0x080000,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_connectionless_cte_rx,
{ "Connectionless CTE Rx", "bthci_evt.le_features.connectionless_cte_rx",
FT_BOOLEAN, 64, NULL, 0x100000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_antenna_switching_during_cte_tx_aod,
{ "Antenna Switching During CTE Tx (AoD)", "bthci_evt.le_features.antenna_switching_during_cte_tx_aod",
FT_BOOLEAN, 64, NULL, 0x200000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_antenna_switching_during_cte_rx_aoa,
{ "Antenna Switching During CTE Rx (AoA)", "bthci_evt.le_features.antenna_switching_during_cte_rx_aoa",
FT_BOOLEAN, 64, NULL, 0x400000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_receiving_cte,
{ "Receiving CTE", "bthci_evt.le_features.receiving_cte",
FT_BOOLEAN, 64, NULL, 0x800000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_periodic_advertising_sync_transfer_sender,
{ "Periodic Advertising Sync Transfer - Sender", "bthci_evt.le_features.periodic_advertising_sync_transfer_sender",
FT_BOOLEAN, 64, NULL, 0x01000000,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_periodic_advertising_sync_transfer_receiver,
{ "Periodic Advertising Sync Transfer - Receiver", "bthci_evt.le_features.periodic_advertising_sync_transfer_receiver",
FT_BOOLEAN, 64, NULL, 0x02000000,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_sleep_clock_accuracy_updates,
{ "Sleep Clock Accuracy Updates", "bthci_evt.le_features.sleep_clock_accuracy_updates",
FT_BOOLEAN, 64, NULL, 0x04000000,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_remote_public_key_validation,
{ "Remote Public Key Validation", "bthci_evt.le_features.remote_public_key_validation",
FT_BOOLEAN, 64, NULL, 0x08000000,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
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, 0x0100000000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_power_control_request,
{ "Power Control Request", "bthci_evt.le_features.power_control_request",
FT_BOOLEAN, 64, NULL, 0x0200000000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_power_change_indication,
{ "Power Change Indication", "bthci_evt.le_features.power_change_indication",
FT_BOOLEAN, 64, NULL, 0x0400000000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_path_loss_monitoring,
{ "Path Loss Monitoring", "bthci_evt.le_features.path_loss_monitoring",
FT_BOOLEAN, 64, NULL, 0x0800000000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_periodic_advertising_adi,
{ "Periodic Advertising ADI", "bthci_evt.le_features.periodic_advertising_adi",
FT_BOOLEAN, 64, NULL, 0x1000000000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_connection_subrating,
{ "Connection Subrating", "bthci_evt.le_features.connection_subrating",
FT_BOOLEAN, 64, NULL, 0x2000000000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_connection_subrating_host_support,
{ "Connection Subrating (Host support)", "bthci_evt.le_features.connection_subrating_host_support",
FT_BOOLEAN, 64, NULL, 0x4000000000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_channel_classification,
{ "Channel Classification", "bthci_evt.le_features.channel_classification",
FT_BOOLEAN, 64, NULL, 0x8000000000,
NULL, HFILL }
},
{ &hf_bthci_evt_le_features_reserved,
{ "Reserved", "bthci_evt.le_features.reserved",
FT_UINT64, BASE_HEX, NULL, G_GUINT64_CONSTANT(0xFFFFFF0000000000),
NULL, HFILL }
},
{ &hf_bthci_evt_mws_number_of_transports,
{ "Number of Transports", "bthci_evt.mws.number_of_transports",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_transport_layers,
{ "Transport Layers", "bthci_evt.mws.transport_layers",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_transport_layers_item,
{ "Transport Layer Item", "bthci_evt.mws.transport_layers.item",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_transport_layer,
{ "Transport Layer", "bthci_evt.mws.transport_layers.item.transport_layer",
FT_UINT8, BASE_HEX, VALS(bthci_evt_mws_transport_layer_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_number_of_baud_rates,
{ "Number of Baud Rates", "bthci_evt.mws.number_of_baud_rates",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_to_mws_baud_rates,
{ "To MWS Baud Rates", "bthci_evt.mws.to_mws_baud_rates",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_to_mws_baud_rates_tranport_item,
{ "To MWS Baud Rates Item", "bthci_evt.mws.to_mws_baud_rates.item",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_to_mws_baud_rate,
{ "To MWS Baud Rate", "bthci_evt.mws.to_mws_baud_rates.item.baud_rate",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_from_mws_baud_rates,
{ "From MWS Baud Rates", "bthci_evt.mws.from_mws_baud_rates",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_from_mws_baud_rates_tranport_item,
{ "From MWS Baud Rates Item", "bthci_evt.mws.from_mws_baud_rates.item",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_from_mws_baud_rate,
{ "From MWS Baud Rate", "bthci_evt.mws.from_mws_baud_rates.item.baud_rate",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_selected_tx_power,
{ "Selected TX Power (dBm)", "bthci_evt.transmit_power_level",
FT_INT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_which_clock,
{ "Which Clock", "bthci_evt.which_clock",
FT_UINT8, BASE_HEX, VALS(which_clock_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_slot_offset,
{ "Slot Offset", "bthci_evt.slot_offset",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_clock_offset_32,
{ "Clock Offset", "bthci_evt.clock_offset_32",
FT_UINT32, BASE_HEX, NULL, 0x0FFFFFFF,
"Bits 0-27 of the Clock Offset between CLKslave-CLK", HFILL }
},
{ &hf_bthci_evt_next_broadcast_instant,
{ "Next Broadcast Instant", "bthci_evt.next_broadcast_instant",
FT_UINT32, BASE_HEX, NULL, 0x0FFFFFFF,
"CLK of a future broadcast on this channel", HFILL }
},
{ &hf_bthci_evt_lt_addr,
{ "LT_ADDR", "bthci_evt.lt_addr",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_connectionless_slave_broadcast_interval,
{ "Connectionless Slave Broadcast Interval", "bthci_evt.connectionless_slave_broadcast_interval",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_service_data,
{ "Service Data", "bthci_evt.service_data",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_local_sam_index,
{ "Local SAM Index", "bthci_evt.local_sam_index",
FT_UINT8, BASE_HEX|BASE_SPECIAL_VALS, VALS(unique_sam_disabled), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_local_sam_tx_availability,
{ "Local SAM Tx Availability", "bthci_evt.local_sam_tx_availability",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_local_sam_rx_availability,
{ "Local SAM Rx Availability", "bthci_evt.local_sam_rx_availability",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_remote_sam_index,
{ "Remote SAM Index", "bthci_evt.remote_sam_index",
FT_UINT8, BASE_HEX|BASE_SPECIAL_VALS, VALS(unique_sam_disabled), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_remote_sam_tx_availability,
{ "Remote SAM Tx Availability", "bthci_evt.remote_sam_tx_availability",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_remote_sam_rx_availability,
{ "Remote SAM Rx Availability", "bthci_evt.remote_sam_rx_availability",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_receive_status,
{ "Receive Status", "bthci_evt.receive_status",
FT_UINT8, BASE_HEX, VALS(receive_status_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_fragment,
{ "Fragment", "bthci_evt.fragment",
FT_UINT8, BASE_HEX, VALS(fragment_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_data,
{ "Data", "bthci_evt.data",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_number_of_reports,
{ "Number of Reports", "bthci_evt.number_of_reports",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_report,
{ "Report", "bthci_evt.report",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_event_type,
{ "Event Type", "bthci_evt.event_type",
FT_UINT8, BASE_HEX, VALS(event_type_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_direct_bd_addr,
{ "Direct BD_ADDR", "bthci_evt.direct_bd_addr",
FT_ETHER, BASE_NONE, NULL, 0x0,
NULL, HFILL}
},
{ &hf_bthci_evt_le_direct_address_type,
{ "Direct Address Type", "bthci_evt.le_direct_address_type",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_address_types_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_address_type,
{ "Address Type", "bthci_evt.le_address_type",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_address_types_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_rssi,
{ "RSSI (dBm)", "bthci_evt.le_rssi",
FT_INT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_tx_phy,
{ "Tx PHY", "bthci_evt.le_tx_phy",
FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_le_phy_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_le_rx_phy,
{ "Rx PHY", "bthci_evt.le_rx_phy",
FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_le_phy_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_max_adv_data_length,
{ "Maximum Advertising Data Length", "bthci_evt.max_adv_data_length",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_supported_adv_sets,
{ "Number of Supported Advertising Sets", "bthci_evt.num_supported_adv_sets",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_number_of_supported_codecs,
{ "Number of Supported Codecs", "bthci_evt.number_of_supported_codecs",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_number_of_supported_vendor_codecs,
{ "Number of Supported Vendor Codecs", "bthci_evt.number_of_supported_vendor_codecs",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_codecs,
2021-01-26 21:39:55 +00:00
{ "Codecs", "bthci_evt.codecs",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_vendor_codecs,
{ "Vendor Codecs", "bthci_evt.vendor_codecs",
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_vendor_codecs_item,
{ "Item", "bthci_evt.vendor_codecs.item",
FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_codec_id,
{ "Codec", "bthci_evt.codec_id",
FT_UINT8, BASE_HEX, VALS(bthci_evt_codec_id_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_vendor_codec_id,
{ "Vendor Codec ID", "bthci_evt.vendor_codecs.item.codec_id",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_bt_rx_priority_assert_offset,
{ "Bluetooth Rx Priority Assert Offset", "bthci_evt.mws.bt.rx_priority.assert.offset",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_bt_rx_priority_assert_jitter,
{ "Bluetooth Rx Priority Assert Jitter", "bthci_evt.mws.bt.rx_priority.assert.jitter",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_bt_rx_priority_deassert_offset,
{ "Bluetooth Rx Priority Deassert Offset", "bthci_evt.mws.bt.rx_priority.deassert.offset",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_bt_rx_priority_deassert_jitter,
{ "Bluetooth Rx Priority Deassert Jitter", "bthci_evt.mws.bt.rx_priority.deassert.jitter",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_bt_tx_priority_assert_offset,
{ "Bluetooth Tx Priority Assert Offset", "bthci_evt.mws.bt.tx_priority.assert.offset",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_bt_tx_priority_assert_jitter,
{ "Bluetooth Tx Priority Assert Jitter", "bthci_evt.mws.bt.tx_priority.assert.jitter",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_bt_tx_priority_deassert_offset,
{ "Bluetooth Tx Priority Deassert Offset", "bthci_evt.mws.bt.tx_priority.deassert.offset",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_bt_tx_priority_deassert_jitter,
{ "Bluetooth Tx Priority Deassert Jitter", "bthci_evt.mws.bt.tx_priority.deassert.jitter",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_802_rx_priority_assert_offset,
{ "802 Rx Priority Assert Offset", "bthci_evt.mws.802.rx_priority.assert.offset",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_802_rx_priority_assert_jitter,
{ "802 Rx Priority Assert Jitter", "bthci_evt.mws.802.rx_priority.assert.jitter",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_802_rx_priority_deassert_offset,
{ "802 Rx Priority Deassert Offset", "bthci_evt.mws.802.rx_priority.deassert.offset",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_802_rx_priority_deassert_jitter,
{ "802 Rx Priority Deassert Jitter", "bthci_evt.mws.802.rx_priority.deassert.jitter",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_802_tx_priority_assert_offset,
{ "802 Tx Priority Assert Offset", "bthci_evt.mws.802.tx_priority.assert.offset",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_802_tx_priority_assert_jitter,
{ "802 Tx Priority Assert Jitter", "bthci_evt.mws.802.tx_priority.assert.jitter",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_802_tx_priority_deassert_offset,
{ "802 Tx Priority Deassert Offset", "bthci_evt.mws.802.tx_priority.deassert.offset",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_mws_802_tx_priority_deassert_jitter,
{ "802 Tx Priority Deassert Jitter", "bthci_evt.mws.802.tx_priority.deassert.jitter",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_sync_train_interval,
{ "Synchronization Train Interval", "bthci_evt.sync_train_interval",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_sync_train_to,
{ "Synchronization Train To", "bthci_evt.sync_train_to",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_secure_connection_host_support,
{ "Secure Connection Host Support", "bthci_evt.secure_connection_host_support",
FT_UINT8, BASE_HEX, VALS(evt_enable_values), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_authenticated_payload_timeout,
{ "Authenticated Payload Timeout", "bthci_evt.authenticated_payload_timeout",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_c192,
{ "C 192", "bthci_evt.c192",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_r192,
{ "R 192", "bthci_evt.r192",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_c256,
{ "C 256", "bthci_evt.c256",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_r256,
{ "R 256", "bthci_evt.r256",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_extended_inquiry_length,
{ "Extended Inquiry Length", "bthci_evt.extended_inquiry_length",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_suggested_max_tx_octets,
{ "Suggested Max Tx Octets", "bthci_evt.suggested_max_tx_octets",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_suggested_max_tx_time,
{ "Suggested Max Tx Time", "bthci_evt.suggested_max_tx_time",
FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_suggested_max_rx_octets,
{ "Suggested Max Rx Octets", "bthci_evt.suggested_max_rx_octets",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_suggested_max_rx_time,
{ "Suggested Max Rx Time", "bthci_evt.suggested_max_rx_time",
FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_resolving_list_size,
{ "Resolving List Size", "bthci_evt.resolving_list_size",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_ext_advts_event_type_connectable,
{ "Connectable", "bthci_evt.le_ext_advts_event_type.connectable",
FT_BOOLEAN, 16, NULL, 0x01,
NULL, HFILL }
},
{ &hf_bthci_evt_ext_advts_event_type_scannable,
{ "Scannable", "bthci_evt.le_ext_advts_event_type.scannable",
FT_BOOLEAN, 16, NULL, 0x02,
NULL, HFILL }
},
{ &hf_bthci_evt_ext_advts_event_type_directed,
{ "Directed", "bthci_evt.le_ext_advts_event_type.directed",
FT_BOOLEAN, 16, NULL, 0x04,
NULL, HFILL }
},
{ &hf_bthci_evt_ext_advts_event_type_scan_response,
{ "Scan Response", "bthci_evt.le_ext_advts_event_type.scan_response",
FT_BOOLEAN, 16, NULL, 0x08,
NULL, HFILL }
},
{ &hf_bthci_evt_ext_advts_event_type_legacy,
{ "Legacy", "bthci_evt.le_ext_advts_event_type.legacy",
FT_BOOLEAN, 16, NULL, 0x10,
NULL, HFILL }
},
{ &hf_bthci_evt_ext_advts_event_type_data_status,
{ "Data Status", "bthci_evt.le_ext_advts_event_type.data_status",
FT_UINT16, BASE_HEX, VALS(ext_adv_data_status_vals), 0x60,
NULL, HFILL }
},
{ &hf_bthci_evt_ext_advts_event_type_reserved,
{ "Reserved", "bthci_evt.le_ext_advts_event_type.reserved",
FT_UINT16, BASE_HEX, NULL, 0xFF80,
NULL, HFILL }
},
{ &hf_bthci_evt_primary_phy,
{ "Primary PHY", "bthci_evt.primary_phy",
FT_UINT8, BASE_HEX, VALS(bthci_evt_primary_phy_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_secondary_phy,
{ "Secondary PHY", "bthci_evt.secondary_phy",
FT_UINT8, BASE_HEX, VALS(bthci_evt_secondary_phy_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_advertising_sid,
{ "Advertising SID", "bthci_evt.advertising_sid",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_tx_power,
{ "TX Power", "bthci_evt.tx_power",
FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_periodic_advertising_interval,
{ "Periodic Advertising Interval", "bthci_evt.periodic_advertising_interval",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_sync_handle,
{ "Sync Handle", "bthci_evt.sync_handle",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_data_status,
{ "Data Status", "bthci_evt.data_status",
FT_UINT8, BASE_HEX, VALS(ext_adv_data_status_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_advertising_handle,
{ "Advertising Handle", "bthci_evt.adv_handle",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_num_compl_ext_advertising_events,
{ "Number Completed Extended Advertising Events", "bthci_evt.num_compl_ext_adv_events",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_channel_selection_algorithm,
{ "Channel Selection Algorithm", "bthci_evt.channel_selection_algorithm",
FT_UINT8, BASE_HEX, VALS(channel_selection_algo_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_advertiser_clock_accuracy,
{ "Advertiser Clock Accuracy", "bthci_evt.adv_clock_accuracy",
FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_clock_accuray_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_advertiser_phy,
{ "Advertiser PHY", "bthci_evt.adv_phy",
FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_le_phy_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_periodic_adv_list_size,
{ "Periodic Advertiser List Size", "bthci_evt.le_periodic_adv_list_size",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_min_tx_power,
{ "Minimum TX Power", "bthci_evt.min_tx_power",
FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_max_tx_power,
{ "Maximum TX Power", "bthci_evt.max_tx_power",
FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_rf_tx_path_compensation,
{ "RF Tx Path Compensation Value", "bthci_evt.rf_tx_path_compensation_value",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_rf_rx_path_compensation,
{ "RF Rx Path Compensation Value", "bthci_evt.rf_rx_path_compensation_value",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
{ &hf_bthci_evt_channel_index,
{ "Channel Index", "bthci_evt.channel_index",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_cte_rssi,
{ "RSSI", "bthci_evt.cte_rssi",
FT_INT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_antenna_id,
{ "Antenna Id", "bthci_evt.antenna_id",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_cte_type,
{ "CTE Type", "bthci_evt.cte_type",
FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_cte_type_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_slot_durations,
{ "Slot Durations", "bthci_evt.slot_durations",
FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_slot_durations_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_packet_status,
{ "Packet Status", "bthci_evt.packet_status",
FT_UINT8, BASE_HEX, VALS(packet_status_vals), 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_event_counter,
{ "Event Counter", "bthci_evt.event_counter",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_sample_count,
{ "Sample Count", "bthci_evt.sample_count",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_i_sample,
{ "I", "bthci_evt.i_sample",
FT_INT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_q_sample,
{ "Q", "bthci_evt.q_sample",
FT_INT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_service_data_past,
{ "Service Data", "bthci_evt.service_data_past",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_number_antennae,
{ "Number of Antennae", "bthci_evt.number_antennae",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_max_cte_length,
{ "Max CTE Length", "bthci_evt.max_cte_length",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_max_length_antenna_switching_pattern,
{ "Max Length Antenna Switching Pattern", "bthci_evt.max_length_antenna_switching_pattern",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_supported_switching_sample_rates,
{ "Supported Switching Sampling Rates", "bthci_evt.supported_switching_sample_rates",
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_supported_switching_sample_rates_1us_switching_aod_tx,
{ "1 usec switching for AoD Tx", "bthci_evt.supported_switching_sample_rates.1us_switching_aod_tx",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_bthci_evt_supported_switching_sample_rates_1us_sampling_aod_rx,
{ "1 usec sampling for AoD Rx", "bthci_evt.supported_switching_sample_rates.1us_sampling_aod_rx",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_bthci_evt_supported_switching_sample_rates_1us_switching_and_sampling_aoa_rx,
{ "1 usec switching and sampling for AoA Rx", "bthci_evt.supported_switching_sample_rates.1us_switching_and_sampling_aoa_rx",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_bthci_evt_supported_switching_sample_rates_reserved,
{ "Reserved", "bthci_evt.supported_switching_sample_rates.reserved",
FT_UINT8, BASE_HEX, NULL, 0xF8,
NULL, HFILL }
},
{ &hf_bthci_evt_simple_pairing_options,
{ "Simple Pairing Options", "bthci_evt.simple_pairing_options",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_simple_pairing_options_remote_public_key_validation,
{ "Remote Public Key Validation", "bthci_evt.simple_pairing_options.remote_public_key_validation",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_bthci_evt_simple_pairing_options_reserved,
{ "Reserved", "bthci_evt.simple_pairing_options.reserved",
FT_UINT8, BASE_HEX, NULL, 0xFE,
NULL, HFILL }
},
{ &hf_bthci_evt_max_encryption_key_size,
{ "Max Encryption Key Size", "bthci_evt.max_encryption_key_size",
FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
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_received_packet_counter,
{ "Received Packet Counter", "bthci_evt.received_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_sdu_interval,
{ "SDU Interval", "bthci_evt.sdu_interval",
FT_UINT24, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 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 }
},
{ &hf_bthci_evt_subrate_factor,
{ "Subrate Factor", "bthci_evt.subrate_factor",
FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_number_events, 0x0,
NULL, HFILL }
},
{ &hf_bthci_evt_continuation_number,
{ "Continuation Number", "bthci_evt.continuation_number",
FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_number_events, 0x0,
NULL, HFILL }
},
};
static ei_register_info ei[] = {
{ &ei_event_undecoded, { "bthci_evt.expert.event.undecoded", PI_UNDECODED, PI_NOTE, "Event undecoded", EXPFILL }},
{ &ei_event_unknown_event, { "bthci_evt.expert.event.unknown_event", PI_PROTOCOL, PI_WARN, "Unknown event", EXPFILL }},
{ &ei_event_unexpected_event, { "bthci_evt.expert.event.unexpected_event", PI_PROTOCOL, PI_WARN, "Unexpected event", EXPFILL }},
{ &ei_event_unexpected_parameter, { "bthci_evt.expert.event.unexpected_parameter", PI_PROTOCOL, PI_WARN, "Unexpected parameter", EXPFILL }},
{ &ei_event_unknown_command, { "bthci_evt.expert.event.unknown_command", PI_PROTOCOL, PI_WARN, "Unknown command", EXPFILL }},
{ &ei_parameter_unexpected, { "bthci_evt.expert.parameter.unexpected", PI_PROTOCOL, PI_WARN, "Unexpected command parameter", EXPFILL }},
{ &ei_manufacturer_data_changed, { "bthci_evt.expert.event.manufacturer_data_changed", PI_PROTOCOL, PI_WARN, "Manufacturer data changed", EXPFILL }},
{ &ei_hci_revision_changed, { "bthci_evt.expert.event.hci_revision_changed", PI_PROTOCOL, PI_WARN, "HCI Revision changed", EXPFILL }},
{ &ei_lmp_subversion_changed, { "bthci_evt.expert.event.lmp_subversion_changed", PI_PROTOCOL, PI_WARN, "LMP Subversion changed", EXPFILL }},
{ &ei_bad_link_type, { "bthci_evt.expert.bad_link_type", PI_PROTOCOL, PI_WARN, "Bad Link type, should be ACL or SCO", EXPFILL }},
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_bthci_evt,
&ett_opcode,
&ett_lmp_subtree,
&ett_ptype_subtree,
&ett_le_state_subtree,
&ett_le_channel_map,
&ett_le_features,
&ett_le_report,
&ett_codecs,
&ett_mws_transport_layers,
&ett_mws_transport_layers_item,
&ett_mws_to_mws_baud_rates,
&ett_mws_to_mws_baud_rates_transport_item,
&ett_mws_from_mws_baud_rates,
&ett_mws_from_mws_baud_rates_transport_item,
&ett_expert,
Bluetooth HCI: Core spec 5.1 support Dissection added for HCI commands/events: Read Local Simple Pairing Options LE Receiver Test [v3] LE Transmitter Test [v3] LE Set Connectionless CTE Transmit Parameters LE Set Connectionless CTE Transmit Enable LE Set Connectionless IQ Sampling Enable LE Set Connection CTE Receive Parameters LE Set Connection CTE Transmit Parameters LE Connection CTE Request Enable LE Connection CTE Response Enable LE Read Antenna Information LE Set Periodic Advertising Receive Enable LE Periodic Advertising Sync Transfer LE Periodic Advertising Set Info Transfer LE Set Periodic Advertising Sync Transfer Parameters LE Set Default Periodic Advertising Sync Transfer Parameters LE Generate DHKey [v2] LE Modify Sleep Clock Accuracy LE Connectionless IQ Report LE Connection IQ Report LE CTE Request Failed LE Periodic Advertising Sync Transfer Received The following HCI commands have been renamed: LE Receiver Test -> LE Receiver Test [v1] LE Transmitter Test -> LE Transmitter Test [v1] LE Enhanced Receiver Test -> LE Receiver Test [v2] LE Enhanced Transmitter Test -> LE Transmitter Test [v2] LE Generate DHKey -> LE Generate DHKey [v1] LE Periodic Advertising Create Sync command added CTE type field. Version, feature bits and event mask fields updated. Change-Id: I9ecf2749c718023e7f9a762ebfc0263da78e5c0d Signed-off-by: Allan Møller Madsen <almomadk@gmail.com> Reviewed-on: https://code.wireshark.org/review/32492 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2019-03-20 18:09:27 +00:00
&ett_le_ext_advts_event_type,
&ett_iq_sample_list,
&ett_iq_samples,
&ett_simple_pairing_options,
&ett_supported_switching_sample_rates,
&ett_transmit_power_level_flags
};
/* Decode As handling
This doesn't use register_decode_as_next_proto because it shares a dissector table
with "bthci_cmd.vendor" */
static build_valid_func bthci_evt_vendor_da_build_value[1] = {bthci_evt_vendor_value};
static decode_as_value_t bthci_evt_vendor_da_values = {bthci_evt_vendor_prompt, 1, bthci_evt_vendor_da_build_value};
static decode_as_t bthci_evt_vendor_da = {"bthci_cmd", "bthci_cmd.vendor", 1, 0, &bthci_evt_vendor_da_values, NULL, NULL,
decode_as_default_populate_list, decode_as_default_reset, decode_as_default_change, NULL};
/* Register the protocol name and description */
proto_bthci_evt = proto_register_protocol("Bluetooth HCI Event",
"HCI_EVT", "bthci_evt");
bthci_evt_handle = register_dissector("bthci_evt", dissect_bthci_evt, proto_bthci_evt);
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array(proto_bthci_evt, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_bthci_evt = expert_register_protocol(proto_bthci_evt);
expert_register_field_array(expert_bthci_evt, ei, array_length(ei));
module = prefs_register_protocol_subtree("Bluetooth", proto_bthci_evt, NULL);
prefs_register_static_text_preference(module, "hci_evt.version",
"Bluetooth HCI version: 4.0 (Core) + Addendum 4",
"Version of protocol supported by this dissector.");
register_decode_as(&bthci_evt_vendor_da);
}
void
proto_reg_handoff_bthci_evt(void)
{
vendor_dissector_table = find_dissector_table("bthci_cmd.vendor");
hci_vendor_table = find_dissector_table("bluetooth.vendor");
dissector_add_uint("hci_h4.type", HCI_H4_TYPE_EVT, bthci_evt_handle);
dissector_add_uint("hci_h1.type", BTHCI_CHANNEL_EVENT, bthci_evt_handle);
bthci_cmd_handle = find_dissector_add_dependency("bthci_cmd", proto_bthci_evt);
btcommon_cod_handle = find_dissector_add_dependency("btcommon.cod", proto_bthci_evt);
btcommon_eir_handle = find_dissector_add_dependency("btcommon.eir_ad.eir", proto_bthci_evt);
btcommon_ad_handle = find_dissector_add_dependency("btcommon.eir_ad.ad", proto_bthci_evt);
btcommon_le_channel_map_handle = find_dissector_add_dependency("btcommon.le_channel_map", proto_bthci_evt);
}
/*
* Editor modelines - https://www.wireshark.org/tools/modelines.html
*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* vi: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/