wireshark/epan/dissectors/packet-bthci_evt.c
Stig Bjørlykke ef625890aa From Shane Kearns (bug 2237):
Added support for Symbian OS btsnoop.

The bluetooth HCI layer in Symbian OS can be configured to log all packets to a
file.  The log format, "btsnoop" is based on the RFC1761 "snoop" format - but
differences in the header make it incompatible.

The btsnoop format supports logging of these formats:
"H1" (raw HCI packets without framing)
"H4" (HCI UART packets including packet type header)
"H5" (HCI 3 wire UART packets including framing)
"BCSP" (HCI bluecore serial protocol including framing)

"H1" and "H4" are section numbers in the original v1 bluetooth specifications,
but still used colloquially - wireshark's existing support for Linux bluez HCI
logs uses the "H4" name.

In practice, the "H1" format is used for H5,BCSP and USB HCI logs, as the HCI
packet logs are mainly useful for debugging higher layers, bluetooth profiles
and bluetooth applications.

From me:
Deleted some unused prototypes.
Mark an unused parameter.

svn path=/trunk/; revision=24263
2008-02-03 21:11:53 +00:00

3547 lines
115 KiB
C

/* 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
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <glib.h>
#include <string.h>
#include <epan/packet.h>
#include <etypes.h>
#include <packet-hci_h4.h>
#include <addr_resolv.h>
static dissector_handle_t bthci_com_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_params = -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_com_opcode = -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_ocf = -1;
static int hf_bthci_evt_ogf = -1;
static int hf_bthci_evt_bd_addr = -1;
static int hf_bthci_evt_class_of_device = -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_evt_hci_vers_nr = -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_link_type_2dh1 = -1;
static int hf_bthci_evt_link_type_3dh1 = -1;
static int hf_bthci_evt_link_type_dm1 = -1;
static int hf_bthci_evt_link_type_dh1 = -1;
static int hf_bthci_evt_link_type_2dh3 = -1;
static int hf_bthci_evt_link_type_3dh3 = -1;
static int hf_bthci_evt_link_type_dm3 = -1;
static int hf_bthci_evt_link_type_dh3 = -1;
static int hf_bthci_evt_link_type_2dh5 = -1;
static int hf_bthci_evt_link_type_3dh5 = -1;
static int hf_bthci_evt_link_type_dm5 = -1;
static int hf_bthci_evt_link_type_dh5 = -1;
static int hf_bthci_evt_link_type_hv1 = -1;
static int hf_bthci_evt_link_type_hv2 = -1;
static int hf_bthci_evt_link_type_hv3 = -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_page_scan_period_mode = -1;
static int hf_bthci_evt_lmp_feature_00 = -1;
static int hf_bthci_evt_lmp_feature_01 = -1;
static int hf_bthci_evt_lmp_feature_02 = -1;
static int hf_bthci_evt_lmp_feature_03 = -1;
static int hf_bthci_evt_lmp_feature_04 = -1;
static int hf_bthci_evt_lmp_feature_05 = -1;
static int hf_bthci_evt_lmp_feature_06 = -1;
static int hf_bthci_evt_lmp_feature_07 = -1;
static int hf_bthci_evt_lmp_feature_10 = -1;
static int hf_bthci_evt_lmp_feature_11 = -1;
static int hf_bthci_evt_lmp_feature_12 = -1;
static int hf_bthci_evt_lmp_feature_13 = -1;
static int hf_bthci_evt_lmp_feature_14 = -1;
static int hf_bthci_evt_lmp_feature_15 = -1;
static int hf_bthci_evt_lmp_feature_16 = -1;
static int hf_bthci_evt_lmp_feature_17 = -1;
static int hf_bthci_evt_lmp_feature_20 = -1;
static int hf_bthci_evt_lmp_feature_21 = -1;
static int hf_bthci_evt_lmp_feature_22 = -1;
static int hf_bthci_evt_lmp_feature_23 = -1;
static int hf_bthci_evt_lmp_feature_24 = -1;
static int hf_bthci_evt_lmp_feature_27 = -1;
static int hf_bthci_evt_lmp_feature_31 = -1;
static int hf_bthci_evt_lmp_feature_32 = -1;
static int hf_bthci_evt_lmp_feature_33 = -1;
static int hf_bthci_evt_lmp_feature_34 = -1;
static int hf_bthci_evt_lmp_feature_35 = -1;
static int hf_bthci_evt_lmp_feature_36 = -1;
static int hf_bthci_evt_lmp_feature_37 = -1;
static int hf_bthci_evt_lmp_feature_40 = -1;
static int hf_bthci_evt_lmp_feature_41 = -1;
static int hf_bthci_evt_lmp_feature_43 = -1;
static int hf_bthci_evt_lmp_feature_44 = -1;
static int hf_bthci_evt_lmp_feature_47 = -1;
static int hf_bthci_evt_lmp_feature_50 = -1;
static int hf_bthci_evt_lmp_feature_51 = -1;
static int hf_bthci_evt_lmp_feature_52 = -1;
static int hf_bthci_evt_lmp_feature_53 = -1;
static int hf_bthci_evt_lmp_feature_54 = -1;
static int hf_bthci_evt_lmp_feature_55 = -1;
static int hf_bthci_evt_lmp_feature_56 = -1;
static int hf_bthci_evt_lmp_feature_57 = -1;
static int hf_bthci_evt_lmp_feature_60 = -1;
static int hf_bthci_evt_lmp_feature_63 = -1;
static int hf_bthci_evt_lmp_feature_64 = -1;
static int hf_bthci_evt_lmp_feature_65 = -1;
static int hf_bthci_evt_lmp_feature_66 = -1;
static int hf_bthci_evt_lmp_feature_70 = -1;
static int hf_bthci_evt_lmp_feature_71 = -1;
static int hf_bthci_evt_lmp_feature_77 = -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_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_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_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_bthci_evt_ext_lmp_features = -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_eir_data = -1;
static int hf_bthci_evt_eir_struct_length = -1;
static int hf_bthci_evt_eir_struct_type = -1;
static int hf_bthci_evt_sc_uuid16 = -1;
static int hf_bthci_evt_sc_uuid32 = -1;
static int hf_bthci_evt_sc_uuid128 = -1;
/* 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_eir_subtree = -1;
static gint ett_eir_struct_subtree = -1;
static const value_string evt_code_vals[] = {
{0x01, "Inquiry Complete"},
{0x02, "Inquiry Result"},
{0x03, "Connect Complete"},
{0x04, "Connect Request"},
{0x05, "Disconnect Complete"},
{0x06, "Auth Complete"},
{0x07, "Remote Name Req Complete"},
{0x08, "Encrypt Change"},
{0x09, "Change Connection Link Key Complete"},
{0x0a, "Master Link Key Complete"},
{0x0b, "Read Remote Supported Features"},
{0x0c, "Read Remote Ver Info 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 Subrate"},
{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"},
{0xfe, "Bluetooth Logo Testing"},
{0xff, "Vendor-Specific"},
{0, NULL}
};
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)"},
{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 }
};
static const value_string evt_lmp_vers_nr[] = {
{0x00, "Bluetooth LMP 1.0"},
{0x01, "Bluetooth LMP 1.1"},
{0x02, "Bluetooth LMP 1.2"},
{0x03, "Bluetooth LMP 2.0"},
{0x04, "Bluetooth LMP 2.1"},
{0, NULL }
};
static const value_string evt_hci_vers_nr[] = {
{0x00, "Bluetooth HCI Specification 1.0B"},
{0x01, "Bluetooth HCI Specification 1.1"},
{0x02, "Bluetooth HCI Specification 1.2"},
{0x03, "Bluetooth HCI Specification 2.0"},
{0x04, "Bluetooth HCI Specification 2.1"},
{0, NULL }
};
static const value_string evt_comp_id[] = {
{0x0000, "Ericsson Mobile Communications"},
{0x0001, "Nokia Mobile Phones"},
{0x0002, "Intel Corp."},
{0x0003, "IBM Corp."},
{0x0004, "Toshiba Corp."},
{0x0005, "3Com"},
{0x0006, "Microsoft"},
{0x0007, "Lucent"},
{0x0008, "Motorola"},
{0x0009, "Infineon Technologies AG"},
{0x000a, "Cambridge Silicon Radio"},
{0x000b, "Silicon Wave"},
{0x000c, "Digianswer"},
{0x000d, "Texas Instruments Inc."},
{0x000e, "Parthus Technologies Inc."},
{0x000f, "Broadcom Corporation"},
{0x0010, "Mitel Semiconductor"},
{0x0011, "Widcomm, Inc."},
{0x0012, "Zeevo, Inc."},
{0x0013, "Atmel Corporation"},
{0x0014, "Mitsubishi Electric Corporation"},
{0x0015, "RTX Telecom A/S"},
{0x0016, "KC Technology Inc."},
{0x0017, "Newlogic"},
{0x0018, "Transilica, Inc."},
{0x0019, "Rohde & Schwarz GmbH & Co. KG"},
{0x001a, "TTPCom Limited"},
{0x001b, "Signia Technologies, Inc."},
{0x001c, "Conexant Systems Inc."},
{0x001d, "Qualcomm"},
{0x001e, "Inventel"},
{0x001f, "AVM Berlin"},
{0x0020, "BandSpeed, Inc."},
{0x0021, "Mansella Ltd"},
{0x0022, "NEC Corporation"},
{0x0023, "WavePlus Technology Co., Ltd"},
{0x0024, "Alcatel"},
{0x0025, "Philips Semiconductors"},
{0x0026, "C Technologies"},
{0x0027, "Open Interface"},
{0x0028, "RF Micro Devices"},
{0x0029, "Hitachi Ltd"},
{0x002a, "Symbol Technologies, Inc."},
{0x002b, "Tenovis"},
{0x002c, "Macronix International Co. Ltd."},
{0x002d, "GCT Semiconductor"},
{0x002e, "Norwood Systems"},
{0x002f, "MewTel Technology Inc."},
{0x0030, "ST Microelectronics"},
{0x0031, "Synopsys"},
{0x0032, "Red-M (Communications) Ltd"},
{0x0033, "Commil Ltd"},
{0x0034, "Computer Access Technology Corporation (CATC)"},
{0x0035, "Eclipse (HQ Espana) S.L."},
{0x0036, "Renesas Technology Corp."},
{0x0037, "Mobilian Corporation"},
{0x0038, "Terax"},
{0x0039, "Integrated System Solution Corp."},
{0x003a, "Matsushita Electric Industrial Co. Ltd."},
{0x003b, "Gennum Corporation"},
{0x003c, "Research In Motion"},
{0x003d, "IPextreme, Inc."},
{0x003e, "Systems and Chips, Inc"},
{0x003f, "Bluetooth SIG, Inc"},
{0x0040, "Seiko Epson Corporation"},
{0x0041, "Integrated Silicon Solution Taiwan, Inc."},
{0x0042, "CONWISE Technology Corporation Ltd"},
{0x0043, "PARROT SA"},
{0x0044, "Socket Communications"},
{0x0045, "Atheros Communications Inc."},
{0x0046, "MediaTek, Inc."},
{0x0047, "Bluegiga"},
{0x0048, "Marvell Technology Group Ltd."},
{0x0049, "3DSP Corporation"},
{0x004a, "Accel Semiconductor Ltd."},
{0xFFFF, "For use in internal and interoperability tests."},
{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_page_scan_modes[] = {
{0x00, "Mandatory Page Scan Mode"},
{0x01, "Optional Page Scan Mode I"},
{0x02, "Optional Page Scan Mode II"},
{0x03, "Optional Page Scan Mode III"},
{0, NULL }
};
static const value_string evt_page_scan_repetition_modes[] = {
{0x00, "R0"},
{0x01, "R1"},
{0x02, "R2"},
{0, NULL }
};
static const value_string evt_page_scan_period_modes[] = {
{0x00, "P0"},
{0x01, "P1"},
{0x02, "P2"},
{0, NULL }
};
static const value_string evt_scan_types[] = {
{0x00, "Standard Scan" },
{0x01, "Interlaced Scan" },
{0, NULL }
};
static const value_string evt_inq_modes[] = {
{0x00, "Standard Results" },
{0x01, "Results With RSSI" },
{0x02, "Results With RSSI or Extended Results" },
{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_boolean[] = {
{0x0 , "False" },
{0x1 , "True" },
{0, NULL }
};
static const value_string evt_pin_types[] = {
{0x00, "Variable PIN" },
{0x01, "Fixed PIN" },
{0, NULL }
};
static const value_string evt_scan_enable_values[] = {
{0x00, "No Scans enabled" },
{0x01, "Inquiry Scan enabled/Page Scan disable" },
{0x02, "Inquiry Scan disabled/Page Scan enabled" },
{0x03, "Inquiry Scan enabled/Page Scan enabled" },
{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_input_coding_values[] = {
{0x0, "Linear" },
{0x1, "\xb5-law" },
{0x2, "A-law" },
{0, NULL }
};
static const value_string evt_input_data_format_values[] = {
{0x0, "1's complement" },
{0x1, "2's complement" },
{0x2, "Sign-Magnitude" },
{0, NULL }
};
static const value_string evt_input_sample_size_values[] = {
{0x0, "8 bit (only for Linear PCM)" },
{0x1, "16 bit (only for Linear PCM)" },
{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_air_mode_values[] = {
{0x0, "\xb5-law" },
{0x1, "A-law" },
{0x2, "CVSD" },
{0x3, "Transparent" },
{0, NULL }
};
static const value_string evt_flow_direction_values[] = {
{0x0, "Outgoing Trafic" },
{0x1, "Incoming Trafic" },
{0, NULL }
};
static const value_string evt_notification_type_vals[] = {
{0x0, "Passkey Entry Started" },
{0x1, "Passkey Digit Entered" },
{0x2, "Passkey Digit Erased" },
{0x3, "Passkey Cleared" },
{0x4, "Passkey Entry Completed" },
{0, NULL }
};
static int
dissect_bthci_evt_bd_addr(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
guint8 i, bd_addr[6];
proto_item *handle_item;
for(i=6; i; i--)
bd_addr[6-i] = tvb_get_guint8(tvb, offset+i-1);
handle_item = proto_tree_add_item(tree, hf_bthci_evt_bd_addr, tvb, offset, 6, TRUE);
proto_item_append_text(handle_item, "%02x%02x:%02x:%02x%02x%02x (%s)",
bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5],
get_ether_name(bd_addr));
offset+=6;
return offset;
}
static int
dissect_bthci_evt_cod(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
guint8 cod1, cod2;
proto_item *item;
item = proto_tree_add_item(tree, hf_bthci_evt_class_of_device, tvb, offset, 3, TRUE);
cod1 = tvb_get_guint8(tvb, offset+1);
cod2 = tvb_get_guint8(tvb, offset+2);
if( (cod2 != 0) || (cod1 & 0x20) )
{
char buf[128];
buf[0] = 0;
proto_item_append_text(item, " (%s - services:", val_to_str(cod1 & 0x1f, bthci_cmd_major_dev_class_vals, "???"));
if (cod2 & 0x80) strncat(buf, " Information,", sizeof(buf) - strlen(buf));
if (cod2 & 0x40) strncat(buf, " Telephony,", sizeof(buf) - strlen(buf));
if (cod2 & 0x20) strncat(buf, " Audio,", sizeof(buf) - strlen(buf));
if (cod2 & 0x10) strncat(buf, " Object transfer,", sizeof(buf) - strlen(buf));
if (cod2 & 0x08) strncat(buf, " Capturing,", sizeof(buf) - strlen(buf));
if (cod2 & 0x04) strncat(buf, " Rendering,", sizeof(buf) - strlen(buf));
if (cod2 & 0x02) strncat(buf, " Networking,", sizeof(buf) - strlen(buf));
if (cod2 & 0x01) strncat(buf, " Positioning,", sizeof(buf) - strlen(buf));
if (cod1 & 0x20) strncat(buf, " Limited discoverable mode,", sizeof(buf) - strlen(buf));
buf[strlen(buf)-1] = 0; /* skip last comma */
strncat(buf, ")", sizeof(buf) - strlen(buf));
buf[128-1] = '\0';
proto_item_append_text(item, buf);
}
else
{
proto_item_append_text(item, " (%s - no major services)", val_to_str(cod1 & 0x1f, bthci_cmd_major_dev_class_vals, "???"));
}
return offset+3;
}
static int
dissect_bthci_evt_inq_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_conn_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_link_type, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_encryption_mode, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_conn_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
offset = dissect_bthci_evt_cod(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_link_type, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_disconn_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_reason, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_auth_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_lmp_features(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
guint8 fc_lag;
proto_item *item;
proto_item *ti_lmp_features=NULL;
proto_item *ti_lmp_subtree=NULL;
if(tree){
ti_lmp_features=proto_tree_add_text(tree, tvb, offset, 8, "LMP_Features");
ti_lmp_subtree=proto_item_add_subtree(ti_lmp_features, ett_lmp_subtree);
}
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_00, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_01, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_02, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_03, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_04, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_05, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_06, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_07, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_10, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_11, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_12, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_13, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_14, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_15, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_16, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_17, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_20, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_21, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_22, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_23, tvb, offset, 1, TRUE);
item = proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_24, tvb, offset, 1, TRUE);
fc_lag = (tvb_get_guint8(tvb, offset) & 0x70)>>4;
proto_item_append_text(item, " (%i bytes)", 256*fc_lag);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_27, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_31, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_32, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_33, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_34, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_35, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_36, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_37, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_40, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_41, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_43, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_44, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_47, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_50, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_51, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_52, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_53, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_54, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_55, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_56, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_57, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_60, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_63, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_64, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_65, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_66, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_70, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_71, tvb, offset, 1, TRUE);
proto_tree_add_item(ti_lmp_subtree,hf_bthci_evt_lmp_feature_77, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_pin_code_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
return offset;
}
static int
dissect_bthci_evt_link_key_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
return offset;
}
static int
dissect_bthci_evt_link_key_notification(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_link_key, tvb, offset, 16, TRUE);
offset+=16;
proto_tree_add_item(tree, hf_bthci_evt_key_type, tvb, offset, 1, TRUE);
offset+=1;
return offset;
}
static int
dissect_bthci_evt_return_link_keys(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
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, TRUE);
offset++;
while(evt_num_keys--){
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_link_key, tvb, offset, 16, TRUE);
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)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
offset=dissect_bthci_evt_lmp_features(tvb, offset, pinfo,tree);
return offset;
}
static int
dissect_bthci_evt_remote_name_req_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_remote_name, tvb, offset, 248, FALSE);
offset+=248;
return offset;
}
static int
dissect_bthci_evt_read_remote_version_information_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_vers_nr, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_comp_id, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_sub_vers_nr, tvb, offset, 2, TRUE);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_flush_occured(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, TRUE);
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, TRUE);
offset++;
while(evt_num_handles--){
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_num_compl_packets, tvb, offset, 2, TRUE);
offset+=2;
}
return offset;
}
static int
dissect_bthci_evt_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_item *handle_item;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_curr_mode, tvb, offset, 1, TRUE);
offset++;
handle_item = proto_tree_add_item(tree, hf_bthci_evt_interval, tvb, offset, 2, TRUE);
proto_item_append_text(handle_item, " Baseband slots (%f msec)", tvb_get_letohs(tvb, offset)*0.625);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_role_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_role, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_hardware_error(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_hardware_code, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_loopback_command(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
tvbuff_t *next_tvb;
next_tvb = tvb_new_subset(tvb, offset, tvb_length_remaining(tvb, offset), -1);
if(bthci_com_handle){
call_dissector(bthci_com_handle, next_tvb, pinfo, tree);
}
offset+=tvb_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, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_read_clock_offset_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_item *handle_item;
gint16 clk;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
handle_item = proto_tree_add_item(tree, hf_bthci_evt_clock_offset, tvb, offset, 2, TRUE);
clk=tvb_get_letohs(tvb, offset) & 32767; /* only bit0-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, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_max_slots, tvb, offset, 1, TRUE);
offset++;
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, TRUE);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_conn_packet_type_changed(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
guint16 flags;
proto_tree *handle_tree=NULL;
proto_item *ti_ptype_subtree=NULL;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
flags=tvb_get_letohs(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
handle_tree = proto_tree_add_text(tree, tvb, offset, 2, "Usable packet types: ");
ti_ptype_subtree = proto_item_add_subtree(handle_tree, ett_ptype_subtree);
if (flags & 0x0008)
proto_item_append_text(handle_tree, "DM1 ");
if (flags & 0x0010)
proto_item_append_text(handle_tree, "DH1 ");
if (flags & 0x0400)
proto_item_append_text(handle_tree, "DM3 ");
if (flags & 0x0800)
proto_item_append_text(handle_tree, "DH3 ");
if (flags & 0x4000)
proto_item_append_text(handle_tree, "DM5 ");
if (flags & 0x8000)
proto_item_append_text(handle_tree, "DH5 ");
if (flags & 0x0020)
proto_item_append_text(handle_tree, "HV1 ");
if (flags & 0x0040)
proto_item_append_text(handle_tree, "HV2 ");
if (flags & 0x0080)
proto_item_append_text(handle_tree, "HV3 ");
if (flags & 0x0002)
proto_item_append_text(handle_tree, "2-DH1 ");
if (flags & 0x0004)
proto_item_append_text(handle_tree, "3-DH1 ");
if (flags & 0x0100)
proto_item_append_text(handle_tree, "2-DH3 ");
if (flags & 0x0200)
proto_item_append_text(handle_tree, "3-DH3 ");
if (flags & 0x1000)
proto_item_append_text(handle_tree, "2-DH5 ");
if (flags & 0x2000)
proto_item_append_text(handle_tree, "3-DH5 ");
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_2dh1, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_3dh1, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_dm1, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_dh1, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_2dh3, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_3dh3, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_dm3, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_dh3, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_2dh5, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_3dh5, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_dm5, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_dh5, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_hv1, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_hv2, tvb, offset, 2, TRUE);
proto_tree_add_item(ti_ptype_subtree, hf_bthci_evt_link_type_hv3, tvb, offset, 2, TRUE);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_command_status(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
guint8 status_code;
status_code = tvb_get_guint8(tvb, offset);
if( status_code != 0) {
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
}
else {
proto_tree_add_item(tree, hf_bthci_evt_status_pending, tvb, offset, 1, TRUE);
}
offset++;
proto_tree_add_item(tree, hf_bthci_evt_num_command_packets, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_com_opcode, tvb, offset, 2, TRUE);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_page_scan_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_page_scan_mode, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_page_scan_repetition_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_page_scan_repetition_mode, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_inq_result_with_rssi(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
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, TRUE);
offset++;
for(num=0;num<evt_num_responses;num++){
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_page_scan_repetition_mode, tvb, offset, 1, TRUE);
offset++;
/* reserved byte */
offset++;
offset = dissect_bthci_evt_cod(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_clock_offset, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_rssi, tvb, offset, 1, TRUE);
offset++;
}
return offset;
}
static int
dissect_bthci_evt_ext_inquiry_response(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
guint8 i, j, length, type;
proto_item *ti_eir=NULL;
proto_item *ti_eir_subtree=NULL;
if(tree){
ti_eir=proto_tree_add_text(tree, tvb, offset, 240, "Extended Inquiry Response Data");
ti_eir_subtree=proto_item_add_subtree(ti_eir, ett_eir_subtree);
}
i=0;
while(i<240){
length = tvb_get_guint8(tvb, offset+i);
if( length != 0 ){
proto_item *ti_eir_struct=NULL;
proto_tree *ti_eir_struct_subtree=NULL;
ti_eir_struct = proto_tree_add_text(ti_eir_subtree, tvb, offset+i, length+1, "%s", "");
ti_eir_struct_subtree = proto_item_add_subtree(ti_eir_struct, ett_eir_struct_subtree);
type = tvb_get_guint8(tvb, offset+i+1);
proto_item_append_text(ti_eir_struct,"%s", val_to_str(type, bthci_cmd_eir_data_type_vals, "Unknown"));
proto_tree_add_item(ti_eir_struct_subtree,hf_bthci_evt_eir_struct_length, tvb, offset+i, 1, TRUE);
proto_tree_add_item(ti_eir_struct_subtree,hf_bthci_evt_eir_struct_type, tvb, offset+i+1, 1, TRUE);
switch(type) {
case 0x02: /* 16-bit Service Class UUIDs, incomplete list */
case 0x03: /* 16-bit Service Class UUIDs, complete list */
j=0;
while(j<(length-1))
{
proto_tree_add_item(ti_eir_struct_subtree, hf_bthci_evt_sc_uuid16, tvb, offset+i+j+2, 2, TRUE);
j+=2;
}
break;
case 0x04: /* 32-bit Service Class UUIDs, incomplete list */
case 0x05: /* 32-bit Service Class UUIDs, complete list */
j=0;
while(j<(length-1))
{
proto_tree_add_item(ti_eir_struct_subtree, hf_bthci_evt_sc_uuid32, tvb, offset+i+j+2, 4, TRUE);
j+=4;
}
break;
case 0x06: /* 128-bit Service Class UUIDs, incomplete list */
case 0x07: /* 128-bit Service Class UUIDs, complete list */
j=0;
while(j<(length-1))
{
proto_tree_add_item(ti_eir_struct_subtree, hf_bthci_evt_sc_uuid128, tvb, offset+i+j+2, 16, TRUE);
j+=16;
}
break;
case 0x08: /* Device Name, shortened */
case 0x09: /* Device Name, full */
proto_tree_add_item(ti_eir_struct_subtree, hf_bthci_evt_device_name, tvb, offset+i+2, length-1, TRUE);
proto_item_append_text(ti_eir_struct,": %s", tvb_format_text(tvb,offset+i+2,length-1));
break;
case 0x0A: /* Tx Power Level */
proto_tree_add_item(ti_eir_struct_subtree, hf_bthci_evt_transmit_power_level, tvb, offset+i+2, 1, TRUE);
default:
proto_tree_add_item(ti_eir_struct_subtree, hf_bthci_evt_eir_data, tvb, offset+i+2, length-1, TRUE);
break;
}
i += length+1;
}
else {
break;
}
}
return offset+240;
}
static int
dissect_bthci_evt_io_capability_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
return offset;
}
static int
dissect_bthci_evt_io_capability_response(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_io_capability, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_oob_data_present, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_auth_requirements, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_user_confirmation_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_numeric_value, tvb, offset, 4, TRUE);
offset+=4;
return offset;
}
static int
dissect_bthci_evt_user_passkey_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
return offset;
}
static int
dissect_bthci_evt_remote_oob_data_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
return offset;
}
static int
dissect_bthci_evt_simple_pairing_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
return offset;
}
static int
dissect_bthci_evt_user_passkey_notification(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_passkey, tvb, offset, 4, TRUE);
offset+=4;
return offset;
}
static int
dissect_bthci_evt_keypress_notification(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_notification_type, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_remote_host_sup_feat_notification(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_ext_lmp_features, tvb, offset, 8, TRUE);
offset+=8;
return offset;
}
static int
dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_item *ti_opcode=NULL;
proto_tree *opcode_tree=NULL;
proto_item *item;
gint16 timeout;
guint8 num8, i;
guint16 com_opcode;
guint32 accuracy;
proto_tree_add_item(tree, hf_bthci_evt_num_command_packets, tvb, offset, 1, TRUE);
offset++;
com_opcode = tvb_get_letohs(tvb, offset);
ti_opcode = proto_tree_add_item(tree, hf_bthci_evt_com_opcode, tvb, offset, 2, TRUE);
opcode_tree = proto_item_add_subtree(ti_opcode, ett_opcode);
proto_tree_add_item(opcode_tree, hf_bthci_evt_ogf, tvb, offset, 2, TRUE);
proto_tree_add_item(opcode_tree, hf_bthci_evt_ocf, tvb, offset, 2, TRUE);
offset+=2;
switch(com_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 0x0c53: /* Refresh Encryption Key */
case 0x0c56: /* Write Simple Pairing Mode */
case 0x0c59: /* Write Inquiry Tx Power Level */
case 0x0c5b: /* Write Default Erroneous Data Reporting */
case 0x0c60: /* Send Keypress Notification */
case 0x1802: /* Write Loopback Mode */
case 0x1803: /* Enable Device Under Test Mode */
case 0x1804: /* Write Simple Pairing Debug Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
break;
/* This is a list of Commands that all return status and BD_ADDR */
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 Response */
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 0x1009: /* Read BD_ADDR */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
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 0x0c5f: /* Enhanced Flush */
case 0x1402: /* Reset Failed Contact Counter */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
break;
/* This is a list of Commands that all return status and timeout */
case 0x0c15: /* Read Connection Accept Timeout */
case 0x0c17: /* Read Page Timeout */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
timeout = tvb_get_letohs(tvb, offset);
item = proto_tree_add_item(tree, hf_bthci_evt_timeout, tvb, offset, 2, TRUE);
proto_item_append_text(item, " slots (%g msec)", timeout*0.625);
offset+=2;
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, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
timeout = tvb_get_letohs(tvb, offset);
item = proto_tree_add_item(tree, hf_bthci_evt_timeout, tvb, offset, 2, TRUE);
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, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_interval, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_window, tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x0420: /* Read LMP Handle */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_lmp_handle, tvb, offset, 1, TRUE);
offset++;
/* 4 reserved bytes */
offset+=4;
break;
case 0x0809: /* Role Discovery */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_curr_role, tvb, offset, 1, TRUE);
offset++;
break;
case 0x080c: /* Read Link Policy Settings */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_switch, tvb, offset, 2, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_hold , tvb, offset, 2, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_sniff , tvb, offset, 2, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_park , tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x080e: /* Read Default Link Policy Settings */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_switch, tvb, offset, 2, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_hold , tvb, offset, 2, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_sniff , tvb, offset, 2, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_link_policy_setting_park , tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x0c09: /* Read PIN Type */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_pin_type, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c0d: /* Read Stored Link Key */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_max_num_keys, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_num_keys_read, tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x0c11: /* Write Stored Link Key */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_num_keys_written, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c12: /* Delete Stored Link Key */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_num_keys_deleted, tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x0c14: /* Read Local Name */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_device_name, tvb, offset, 248, FALSE);
offset+=248;
break;
case 0x0c19: /* Read Scan Enable */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_scan_enable, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c1f: /* Read Authentication Enable */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_authentication_enable, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c21: /* Read Encryption Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_encryption_mode, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c23: /* Read Class of Device */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
offset = dissect_bthci_evt_cod(tvb, offset, pinfo, tree);
break;
case 0x0c25: /* Read Voice Setting */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_input_coding, tvb, offset, 2, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_input_data_format, tvb, offset, 2, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_input_sample_size, tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x0c29: /* Read Num Broadcast Retransmissions */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_num_broadcast_retransm, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c2b: /* Read Hold Mode Activity */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_hold_mode_act_page, tvb, offset, 1, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_hold_mode_act_inquiry, tvb, offset, 1, TRUE);
proto_tree_add_item(tree, hf_bthci_evt_hold_mode_act_periodic, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c2d: /* Read Transmit Power Level */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_transmit_power_level, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c2e: /* Read SCO Flow Control Enable */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_sco_flow_cont_enable, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c38: /* Read Number of Supported IAC */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_num_supp_iac, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c39: /* Read Current IAC LAP */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
num8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_num_curr_iac, tvb, offset, 1, TRUE);
offset++;
for (i=0; i<num8; i++) {
proto_tree_add_item(tree, hf_bthci_evt_iac_lap, tvb, offset, 3, TRUE);
offset+=3;
}
break;
case 0x0c3b: /* Read Page Scan Period Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_page_scan_period_mode, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c3d: /* Read Page Scan Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_page_scan_mode, tvb, offset, 1, TRUE);
offset++;
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, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_scan_type, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c44: /* Read Inquiry Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_inq_mode, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c48: /* Read AFH Channel Assessment Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_afh_ch_assessment_mode, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c51: /* Read Extended Inquiry Response */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_fec_required, tvb, offset, 1, TRUE);
offset++;
offset=dissect_bthci_evt_ext_inquiry_response(tvb, offset, pinfo, tree);
break;
case 0x0c55: /* Read Simple Pairing Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_simple_pairing_mode, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c57: /* Read Local OOB Data */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_hash_c, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_randomizer_r, tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x0c58: /* Read Inquiry Response Tx Power Level */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_power_level_type, tvb, offset, 1, TRUE);
offset++;
break;
case 0x0c5a: /* Read Default Erroneous Data Reporting */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_err_data_reporting, tvb, offset, 1, TRUE);
offset++;
break;
case 0x1001: /* Read Local Version Information */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_hci_vers_nr, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_hci_revision, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_vers_nr, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_comp_id, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_sub_vers_nr, tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x1002: /* Read Local Supported Commands */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_local_supported_cmds, tvb, offset, 64, TRUE);
offset+=64;
break;
case 0x1003: /* Read Local Supported Features */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
offset=dissect_bthci_evt_lmp_features(tvb, offset, pinfo, tree);
break;
case 0x1004: /* Read Local Extended Features */
{
guint8 page_number;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
page_number = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_page_number, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_max_page_number, tvb, offset, 1, TRUE);
offset++;
if( page_number == 0 ){
offset=dissect_bthci_evt_lmp_features(tvb, offset, pinfo, tree);
}
else {
proto_tree_add_item(tree, hf_bthci_evt_ext_lmp_features, tvb, offset, 8, TRUE);
offset+=8;
}
}
break;
case 0x1005: /* Read Buffer Size */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_host_data_packet_length_acl, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_host_data_packet_length_sco, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_host_total_num_acl_data_packets, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_host_total_num_sco_data_packets, tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x1007: /* Read Country Code */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_country_code, tvb, offset, 1, TRUE);
offset++;
break;
case 0x1401: /* Read Failed Contact Counter */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_failed_contact_counter, tvb, offset, 2, TRUE);
offset+=2;
break;
case 0x1403: /* Get Link Quality */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_link_quality, tvb, offset, 1, TRUE);
offset++;
break;
case 0x1405: /* Read RSSI */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_rssi, tvb, offset, 1, TRUE);
offset++;
break;
case 0x1406: /* Read AFH Channel Map */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_afh_mode, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_afh_channel_map, tvb, offset, 10, TRUE);
offset+=10;
break;
case 0x1407: /* Read Clock */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_clock, tvb, offset, 4, TRUE);
offset+=4;
accuracy = tvb_get_letohl(tvb, offset);
item = proto_tree_add_item(tree, hf_bthci_evt_clock_accuracy, tvb, offset, 2, TRUE);
proto_item_append_text(item, " %g msec", accuracy*0.3125);
offset+=2;
break;
case 0x1801: /* Read Loopback Mode */
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_loopback_mode, tvb, offset, 1, TRUE);
offset++;
break;
default:
proto_tree_add_item(tree, hf_bthci_evt_ret_params, tvb, offset, -1, TRUE);
offset+=tvb_length_remaining(tvb, offset);
break;
}
return offset;
}
static int
dissect_bthci_evt_qos_setup_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_flags, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_service_type, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_token_rate, tvb, offset, 4, TRUE);
offset+=4;
proto_tree_add_item(tree, hf_bthci_evt_peak_bandwidth, tvb, offset, 4, TRUE);
offset+=4;
proto_tree_add_item(tree, hf_bthci_evt_latency, tvb, offset, 4, TRUE);
offset+=4;
proto_tree_add_item(tree, hf_bthci_evt_delay_variation, tvb, offset, 4, TRUE);
offset+=4;
return offset;
}
static int
dissect_bthci_evt_change_conn_link_key_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_master_link_key_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_key_flag, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_encryption_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_encryption_enable, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_read_remote_ext_features_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
guint8 page_number;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
page_number = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_bthci_evt_page_number, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_max_page_number, tvb, offset, 1, TRUE);
offset++;
if( page_number == 0 ){
offset=dissect_bthci_evt_lmp_features(tvb, offset, pinfo, tree);
}
else {
proto_tree_add_item(tree, hf_bthci_evt_ext_lmp_features, tvb, offset, 8, TRUE);
offset+=8;
}
return offset;
}
static int
dissect_bthci_evt_sync_connection_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_item *item;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_sync_link_type, tvb, offset, 1, TRUE);
offset++;
item = proto_tree_add_item(tree, hf_bthci_evt_sync_tx_interval, tvb, offset, 1, TRUE);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint8(tvb, offset)*0.625);
offset++;
item = proto_tree_add_item(tree, hf_bthci_evt_sync_rtx_window, tvb, offset, 1, TRUE);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint8(tvb, offset)*0.625);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_sync_rx_packet_length, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_sync_tx_packet_length, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_air_mode, tvb, offset, 1, TRUE);
offset++;
return offset;
}
static int
dissect_bthci_evt_sync_connection_changed(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_item *item;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
item = proto_tree_add_item(tree, hf_bthci_evt_sync_tx_interval, tvb, offset, 1, TRUE);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint8(tvb, offset)*0.625);
offset++;
item = proto_tree_add_item(tree, hf_bthci_evt_sync_rtx_window, tvb, offset, 1, TRUE);
proto_item_append_text(item, " slots (%g msec)", tvb_get_guint8(tvb, offset)*0.625);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_sync_rx_packet_length, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_sync_tx_packet_length, tvb, offset, 2, TRUE);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_sniff_subrating(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_item *item;
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
item = proto_tree_add_item(tree, hf_bthci_evt_max_tx_latency, tvb, offset, 2, TRUE);
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, TRUE);
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, TRUE);
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, TRUE);
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 _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
offset+=2;
proto_tree_add_item(tree, hf_bthci_evt_flags, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_flow_direction, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_service_type, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_token_rate, tvb, offset, 4, TRUE);
offset+=4;
proto_tree_add_item(tree, hf_bthci_evt_token_bucket_size, tvb, offset, 4, TRUE);
offset+=4;
proto_tree_add_item(tree, hf_bthci_evt_peak_bandwidth, tvb, offset, 4, TRUE);
offset+=4;
proto_tree_add_item(tree, hf_bthci_evt_latency, tvb, offset, 4, TRUE);
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, TRUE);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_encryption_key_refresh_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, TRUE);
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, TRUE);
offset+=2;
item = proto_tree_add_item(tree, hf_bthci_evt_link_supervision_timeout, tvb, offset, 2, TRUE);
proto_item_append_text(item, " slots (%g msec)", tvb_get_letohs(tvb, offset)*0.625);
offset+=2;
return offset;
}
static int
dissect_bthci_evt_inq_result(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
{
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, TRUE);
offset++;
for(num=0;num<evt_num_responses;num++){
offset = dissect_bthci_evt_bd_addr(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_page_scan_repetition_mode, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_page_scan_period_mode, tvb, offset, 1, TRUE);
offset++;
proto_tree_add_item(tree, hf_bthci_evt_page_scan_mode, tvb, offset, 1, TRUE);
offset++;
offset = dissect_bthci_evt_cod(tvb, offset, pinfo, tree);
proto_tree_add_item(tree, hf_bthci_evt_clock_offset, tvb, offset, 2, TRUE);
offset+=2;
}
return offset;
}
/* Code to actually dissect the packets */
static void
dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_item *ti;
proto_tree *bthci_evt_tree=NULL;
guint8 param_length, evt_code;
int offset=0;
if(tree){
ti=proto_tree_add_item(tree, proto_bthci_evt, tvb, offset, -1, FALSE);
bthci_evt_tree=proto_item_add_subtree(ti, ett_bthci_evt);
}
evt_code = tvb_get_guint8(tvb, offset);
proto_tree_add_item(bthci_evt_tree, hf_bthci_evt_code, tvb, offset, 1, TRUE);
proto_item_append_text(bthci_evt_tree, " - %s", val_to_str(evt_code, evt_code_vals, "Unknown 0x%08x"));
offset++;
param_length = tvb_get_guint8(tvb, offset);
proto_tree_add_item(bthci_evt_tree, hf_bthci_evt_param_length, tvb, offset, 1, TRUE);
offset++;
if(check_col(pinfo->cinfo, COL_PROTOCOL)){
col_set_str(pinfo->cinfo, COL_PROTOCOL, "HCI_EVT");
}
if((check_col(pinfo->cinfo, COL_INFO))){
col_append_fstr(pinfo->cinfo, COL_INFO, " %s", val_to_str(evt_code, evt_code_vals, "Unknown 0x%08x"));
}
if (param_length > 0) {
switch(evt_code) {
case 0x01: /* Inquiry Complete */
offset=dissect_bthci_evt_inq_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x02: /* Inquiry result event */
offset=dissect_bthci_evt_inq_result(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x03: /* Connection Complete */
offset=dissect_bthci_evt_conn_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x04: /* Connection Request */
offset=dissect_bthci_evt_conn_request(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x05: /* Disconnection Complete */
offset=dissect_bthci_evt_disconn_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x06: /* Authentication Complete */
offset=dissect_bthci_evt_auth_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x07: /* Remote Name Request Complete */
offset=dissect_bthci_evt_remote_name_req_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x08: /* Encryption Change */
offset=dissect_bthci_evt_encryption_change(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x09: /* Change Connection Link Key Complete */
offset=dissect_bthci_evt_change_conn_link_key_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x0a: /* Master Link Key Complete */
offset=dissect_bthci_evt_master_link_key_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x0b: /* Read Remote Support Features Complete */
offset=dissect_bthci_evt_read_remote_support_features_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x0c: /* Read Remote Version Information Complete */
offset=dissect_bthci_evt_read_remote_version_information_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x0d: /* QoS Setup Complete */
offset=dissect_bthci_evt_qos_setup_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x0e: /* Command Complete */
offset=dissect_bthci_evt_command_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x0f: /* Command Status */
offset=dissect_bthci_evt_command_status(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x10: /* Hardware Error */
offset=dissect_bthci_evt_hardware_error(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x11: /* Flush Occurred */
offset=dissect_bthci_evt_flush_occured(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x12: /* Role Change */
offset=dissect_bthci_evt_role_change(tvb, offset, pinfo, bthci_evt_tree);
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);
break;
case 0x15: /* Return Link Keys */
offset=dissect_bthci_evt_return_link_keys(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x16: /* PIN Code Request */
offset=dissect_bthci_evt_pin_code_request(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x17: /* Link Key Request */
offset=dissect_bthci_evt_link_key_request(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x18: /* Link Key Notification */
offset=dissect_bthci_evt_link_key_notification(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x19: /* Loopback Command */
offset=dissect_bthci_evt_loopback_command(tvb, offset, pinfo, bthci_evt_tree);
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);
break;
case 0x1d: /* Connection Packet Type Changed */
offset=dissect_bthci_evt_conn_packet_type_changed(tvb, offset, pinfo, bthci_evt_tree);
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);
break;
case 0x20: /* Page Scan Repetition Mode Change */
offset=dissect_bthci_evt_page_scan_repetition_mode_change(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x21: /* Flow Specification Complete */
offset=dissect_bthci_evt_flow_specification_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x22: /* Inquiry Result with RSSI */
offset=dissect_bthci_evt_inq_result_with_rssi(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x23: /* Read Remote Extended Features Complete */
offset=dissect_bthci_evt_read_remote_ext_features_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x2c: /* Synchronous Connection Complete */
offset=dissect_bthci_evt_sync_connection_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x2d: /* Synchronous Connection Changed */
offset=dissect_bthci_evt_sync_connection_changed(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x2e: /* Sniff Subrating */
offset=dissect_bthci_evt_sniff_subrating(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x2f: /* Extended Inquiry Result */
offset=dissect_bthci_evt_inq_result_with_rssi(tvb, offset, pinfo, bthci_evt_tree);
offset=dissect_bthci_evt_ext_inquiry_response(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x30: /* Encryption Key Refresh Complete */
offset=dissect_bthci_evt_encryption_key_refresh_complete(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x31: /* IO Capability Request */
offset=dissect_bthci_evt_io_capability_request(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x32: /* IO Capability Response */
offset=dissect_bthci_evt_io_capability_response(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x33: /* User Confirmation Request */
offset=dissect_bthci_evt_user_confirmation_request(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x34: /* User Passkey Request */
offset=dissect_bthci_evt_user_passkey_request(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x35: /* Remote OOB Data Request */
offset=dissect_bthci_evt_remote_oob_data_request(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x36: /* Simple Pairing Complete */
offset=dissect_bthci_evt_simple_pairing_complete(tvb, offset, pinfo, bthci_evt_tree);
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);
break;
case 0x3c: /* Enhanced Flush Complete */
offset=dissect_bthci_evt_keypress_notification(tvb, offset, pinfo, bthci_evt_tree);
break;
case 0x3d: /* Remote Host Supported Features Notification */
offset=dissect_bthci_evt_remote_host_sup_feat_notification(tvb, offset, pinfo, bthci_evt_tree);
break;
default:
proto_tree_add_item(bthci_evt_tree, hf_bthci_evt_params, tvb, 2, -1, TRUE);
break;
}
}
}
/* Register the protocol with Wireshark */
/* this format is require because a script is used to build the C function
that calls all the protocol registration.
*/
void
proto_register_bthci_evt(void)
{
/* 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, VALS(evt_code_vals), 0x0,
"Event Code", HFILL }
},
{ &hf_bthci_evt_param_length,
{ "Parameter Total Length", "bthci_evt.param_length",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Parameter Total Length", HFILL }
},
{ &hf_bthci_evt_params,
{ "Event Parameter", "bthci_evt.params",
FT_NONE, BASE_NONE, NULL, 0x0,
"Event Parameter", HFILL }
},
{ &hf_bthci_evt_num_command_packets,
{ "Number of Allowed Command Packets", "bthci_evt.num_command_packets",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Number of Allowed Command Packets", 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,
"Connection Handle", 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_com_opcode,
{ "Command Opcode", "bthci_evt.com_opcode",
FT_UINT16, BASE_HEX, VALS(bthci_cmd_opcode_vals), 0x0,
"Command Opcode", HFILL }
},
{ &hf_bthci_evt_ogf,
{ "ogf", "bthci_evt.ogf",
FT_UINT16, BASE_HEX, VALS(bthci_ogf_vals), 0xfc00,
"Opcode Group Field", HFILL }
},
{ &hf_bthci_evt_ocf,
{ "ocf", "bthci_evt.ocf",
FT_UINT16, BASE_HEX, NULL, 0x03ff,
"Opcode Command Field", HFILL }
},
{ &hf_bthci_evt_ret_params,
{ "Return Parameter", "bthci_evt.ret_params",
FT_NONE, BASE_NONE, NULL, 0x0,
"Return Parameter", HFILL }
},
{ &hf_bthci_evt_status,
{ "Status", "bthci_evt.status",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_status_vals), 0x0,
"Status", HFILL }
},
{ &hf_bthci_evt_status_pending,
{ "Status", "bthci_evt.status",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_status_pending_vals), 0x0,
"Status", HFILL }
},
{ &hf_bthci_evt_bd_addr,
{ "BD_ADDR: ", "bthci_evt.bd_addr",
FT_NONE, BASE_NONE, NULL, 0x0,
"Bluetooth Device Address", HFILL}
},
{ &hf_bthci_evt_class_of_device,
{ "Class of Device", "bthci_evt.class_of_device",
FT_UINT24, BASE_HEX, NULL, 0x0,
"Class of Device", HFILL }
},
{ &hf_bthci_evt_link_type,
{ "Link Type", "bthci_evt.link_type",
FT_UINT8, BASE_HEX, VALS(evt_link_types), 0x0,
"Link Type", HFILL }
},
{ &hf_bthci_evt_encryption_mode,
{ "Encryption Mode", "bthci_evt.encryption_mode",
FT_UINT8, BASE_HEX, VALS(evt_encryption_modes), 0x0,
"Encryption Mode", HFILL }
},
{ &hf_bthci_evt_reason,
{ "Reason", "bthci_evt.reason",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_status_vals), 0x0,
"Reason", 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,
"Encryption Enable", HFILL }
},
{ &hf_bthci_evt_key_flag,
{ "Key Flag", "bthci_evt.key_flag",
FT_UINT8, BASE_HEX, VALS(evt_key_flag), 0x0,
"Key Flag", HFILL }
},
{ &hf_bthci_evt_vers_nr,
{ "LMP Version", "bthci_evt.lmp_vers_nr",
FT_UINT8, BASE_HEX, VALS(evt_lmp_vers_nr), 0x0,
"Version of the Current LMP", HFILL }
},
{ &hf_bthci_evt_hci_vers_nr,
{ "HCI Version", "bthci_evt.hci_vers_nr",
FT_UINT8, BASE_HEX, VALS(evt_hci_vers_nr), 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, VALS(evt_comp_id), 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,
"Flags", HFILL }
},
{ &hf_bthci_evt_service_type,
{ "Service Type", "bthci_evt.service_type",
FT_UINT8, BASE_HEX, VALS(evt_service_types), 0x0,
"Service Type", 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 Latecy", "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,
"Role", HFILL }
},
{ &hf_bthci_evt_curr_mode,
{ "Current Mode", "bthci_evt.current_mode",
FT_UINT8, BASE_HEX, VALS(evt_modes), 0x0,
"Current Mode", 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_HEX, 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,
"Key Type", 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(evt_page_scan_modes), 0x0,
"Page Scan Mode", HFILL }
},
{ &hf_bthci_evt_page_scan_repetition_mode,
{ "Page Scan Repetition Mode", "bthci_evt.page_scan_repetition_mode",
FT_UINT8, BASE_HEX, VALS(evt_page_scan_repetition_modes), 0x0,
"Page Scan Repetition Mode", HFILL }
},
{ &hf_bthci_evt_page_scan_period_mode,
{ "Page Scan Period Mode", "bthci_evt.page_scan_period_mode",
FT_UINT8, BASE_HEX, VALS(evt_page_scan_period_modes), 0x0,
"Page Scan Period Mode", HFILL }
},
{ &hf_bthci_evt_link_type_2dh1,
{ "ACL Link Type 2-DH1", "bthci_evt.link_type_2dh1",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0002,
"ACL Link Type 2-DH1", HFILL }
},
{ &hf_bthci_evt_link_type_3dh1,
{ "ACL Link Type 3-DH1", "bthci_evt.link_type_3dh1",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0004,
"ACL Link Type 3-DH1", HFILL }
},
{ &hf_bthci_evt_link_type_dm1,
{ "ACL Link Type DM1", "bthci_evt.link_type_dm1",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0008,
"ACL Link Type DM1", HFILL }
},
{ &hf_bthci_evt_link_type_dh1,
{ "ACL Link Type DH1", "bthci_evt.link_type_dh1",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0010,
"ACL Link Type DH1", HFILL }
},
{ &hf_bthci_evt_link_type_2dh3,
{ "ACL Link Type 2-DH3", "bthci_evt.link_type_2dh3",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0100,
"ACL Link Type 2-DH3", HFILL }
},
{ &hf_bthci_evt_link_type_3dh3,
{ "ACL Link Type 3-DH3", "bthci_evt.link_type_3dh3",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0200,
"ACL Link Type 3-DH3", HFILL }
},
{ &hf_bthci_evt_link_type_dm3,
{ "ACL Link Type DM3", "bthci_evt.link_type_dm3",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0400,
"ACL Link Type DM3", HFILL }
},
{ &hf_bthci_evt_link_type_dh3,
{ "ACL Link Type DH3", "bthci_evt.link_type_dh3",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0800,
"ACL Link Type DH3", HFILL }
},
{ &hf_bthci_evt_link_type_2dh5,
{ "ACL Link Type 2-DH5", "bthci_evt.link_type_2dh5",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x1000,
"ACL Link Type 2-DH5", HFILL }
},
{ &hf_bthci_evt_link_type_3dh5,
{ "ACL Link Type 3-DH5", "bthci_evt.link_type_3dh5",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x2000,
"ACL Link Type 3-DH5", HFILL }
},
{ &hf_bthci_evt_link_type_dm5,
{ "ACL Link Type DM5", "bthci_evt.link_type_dm5",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x4000,
"ACL Link Type DM5", HFILL }
},
{ &hf_bthci_evt_link_type_dh5,
{ "ACL Link Type DH5", "bthci_evt.link_type_dh5",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x8000,
"ACL Link Type DH5", HFILL }
},
{ &hf_bthci_evt_link_type_hv1,
{ "SCO Link Type HV1", "bthci_evt.link_type_hv1",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0020,
"SCO Link Type HV1", HFILL }
},
{ &hf_bthci_evt_link_type_hv2,
{ "SCO Link Type HV2", "bthci_evt.link_type_hv2",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0040,
"SCO Link Type HV2", HFILL }
},
{ &hf_bthci_evt_link_type_hv3,
{ "SCO Link Type HV3", "bthci_evt.link_type_hv3",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0080,
"SCO Link Type HV3", HFILL }
},
{ &hf_bthci_evt_lmp_feature_00,
{ "3-slot packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x01,
"3-slot packets", HFILL }
},
{ &hf_bthci_evt_lmp_feature_01,
{ "5-slot packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x02,
"5-slot packets", HFILL }
},
{ &hf_bthci_evt_lmp_feature_02,
{ "encryption", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x04,
"encryption", HFILL }
},
{ &hf_bthci_evt_lmp_feature_03,
{ "slot offset", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x08,
"slot offset", HFILL }
},
{ &hf_bthci_evt_lmp_feature_04,
{ "timing accuracy", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x10,
"timing accuracy", HFILL }
},
{ &hf_bthci_evt_lmp_feature_05,
{ "master/slave switch", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x20,
"master/slave switch", HFILL }
},
{ &hf_bthci_evt_lmp_feature_06,
{ "hold mode", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x40,
"hold mode", HFILL }
},
{ &hf_bthci_evt_lmp_feature_07,
{ "sniff mode", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x80,
"sniff mode", HFILL }
},
{ &hf_bthci_evt_lmp_feature_10,
{ "park mode", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x01,
"park mode", HFILL }
},
{ &hf_bthci_evt_lmp_feature_11,
{ "RSSI", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x02,
"RSSI", HFILL }
},
{ &hf_bthci_evt_lmp_feature_12,
{ "channel quality driven data rate", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x04,
"channel quality driven data rate", HFILL }
},
{ &hf_bthci_evt_lmp_feature_13,
{ "SCO link", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x08,
"SCO link", HFILL }
},
{ &hf_bthci_evt_lmp_feature_14,
{ "HV2 packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x10,
"HV2 packets", HFILL }
},
{ &hf_bthci_evt_lmp_feature_15,
{ "HV3 packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x20,
"HV3 packets", HFILL }
},
{ &hf_bthci_evt_lmp_feature_16,
{ "u-law log", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x40,
"u-law log", HFILL }
},
{ &hf_bthci_evt_lmp_feature_17,
{ "A-law log", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x80,
"A-law log", HFILL }
},
{ &hf_bthci_evt_lmp_feature_20,
{ "CVSD", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x01,
"CVSD", HFILL }
},
{ &hf_bthci_evt_lmp_feature_21,
{ "paging scheme", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x02,
"paging scheme", HFILL }
},
{ &hf_bthci_evt_lmp_feature_22,
{ "power control", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x04,
"power control", HFILL }
},
{ &hf_bthci_evt_lmp_feature_23,
{ "transparent SCO data", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x08,
"transparent SCO data", HFILL }
},
{ &hf_bthci_evt_lmp_feature_24,
{ "Flow control lag", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, NULL, 0x70,
"Flow control lag", HFILL }
},
{ &hf_bthci_evt_lmp_feature_27,
{ "broadband encryption", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x80,
"broadband encryption", HFILL }
},
{ &hf_bthci_evt_lmp_feature_31,
{ "EDR ACL 2 Mbps mode", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x02,
"EDR ACL 2 Mbps mode", HFILL }
},
{ &hf_bthci_evt_lmp_feature_32,
{ "EDR ACL 3 Mbps mode", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x04,
"EDR ACL 3 Mbps mode", HFILL }
},
{ &hf_bthci_evt_lmp_feature_33,
{ "enhanced inquiry scan", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x08,
"enhanced inquiry scan", HFILL }
},
{ &hf_bthci_evt_lmp_feature_34,
{ "interlaced inquiry scan", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x10,
"interlaced inquiry scan", HFILL }
},
{ &hf_bthci_evt_lmp_feature_35,
{ "interlaced page scan", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x20,
"interlaced page scan", HFILL }
},
{ &hf_bthci_evt_lmp_feature_36,
{ "RSSI with inquiry results", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x40,
"RSSI with inquiry results", HFILL }
},
{ &hf_bthci_evt_lmp_feature_37,
{ "eSCO EV3 packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x80,
"eSCO EV3 packets", HFILL }
},
{ &hf_bthci_evt_lmp_feature_40,
{ "eSCO EV4 packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x01,
"eSCO EV4 packets", HFILL }
},
{ &hf_bthci_evt_lmp_feature_41,
{ "eSCO EV5 packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x02,
"eSCO EV5 packets", HFILL }
},
{ &hf_bthci_evt_lmp_feature_43,
{ "AFH capable slave", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x08,
"AFH capable slave", HFILL }
},
{ &hf_bthci_evt_lmp_feature_44,
{ "AFH classification slave", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x10,
"AFH classification slave", HFILL }
},
{ &hf_bthci_evt_lmp_feature_47,
{ "3-slot EDR ACL packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x80,
"3-slot EDR ACL packets", HFILL }
},
{ &hf_bthci_evt_lmp_feature_50,
{ "5-slot EDR ACL packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x01,
"5-slot EDR ACL packets", HFILL }
},
{ &hf_bthci_evt_lmp_feature_51,
{ "sniff subrating", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x02,
"sniff subrating", HFILL }
},
{ &hf_bthci_evt_lmp_feature_52,
{ "pause encryption", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x04,
"pause encryption", HFILL }
},
{ &hf_bthci_evt_lmp_feature_53,
{ "AFH capable master", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x08,
"AFH capable master", HFILL }
},
{ &hf_bthci_evt_lmp_feature_54,
{ "AFH classification master", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x10,
"AFH classification master", HFILL }
},
{ &hf_bthci_evt_lmp_feature_55,
{ "EDR eSCO 2 Mbps mode", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x20,
"EDR eSCO 2 Mbps mode", HFILL }
},
{ &hf_bthci_evt_lmp_feature_56,
{ "EDR eSCO 3 Mbps mode", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x40,
"EDR eSCO 3 Mbps mode", HFILL }
},
{ &hf_bthci_evt_lmp_feature_57,
{ "3-slot EDR eSCO packets", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x80,
"", HFILL }
},
{ &hf_bthci_evt_lmp_feature_60,
{ "extended inquiry response", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x01,
"extended inquiry response", HFILL }
},
{ &hf_bthci_evt_lmp_feature_63,
{ "secure simple pairing", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x08,
"secure simple pairing", HFILL }
},
{ &hf_bthci_evt_lmp_feature_64,
{ "encapsulated PDU", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x10,
"encapsulated PDU", HFILL }
},
{ &hf_bthci_evt_lmp_feature_65,
{ "erroneous data reporting", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x20,
"erroneous data reporting", HFILL }
},
{ &hf_bthci_evt_lmp_feature_66,
{ "non-flushable packet boundary flag", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x40,
"non-flushable packet boundary flag", HFILL }
},
{ &hf_bthci_evt_lmp_feature_70,
{ "link supervision timeout changed event", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x01,
"link supervision timeout changed event", HFILL }
},
{ &hf_bthci_evt_lmp_feature_71,
{ "inquiry response TX power level", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x02,
"inquiry response TX power level", HFILL }
},
{ &hf_bthci_evt_lmp_feature_77,
{ "extended features", "bthci_evt.lmp_feature",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x80,
"extended features", 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,
"Number of Link Keys Read", HFILL }
},
{ &hf_bthci_evt_num_keys_deleted,
{ "Number of Link Keys Deleted", "bthci_evt.num_keys_deleted",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Number of Link Keys Deleted", HFILL }
},
{ &hf_bthci_evt_num_keys_written,
{ "Number of Link Keys Written", "bthci_evt.num_keys_written",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Number of Link Keys Written", 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_UINT16, BASE_DEC, VALS(evt_boolean), 0x0001,
"Enable Master Slave Switch", HFILL }
},
{ &hf_bthci_evt_link_policy_setting_hold,
{ "Enable Hold Mode", "bthci_evt.link_policy_hold",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0002,
"Enable Hold Mode", HFILL }
},
{ &hf_bthci_evt_link_policy_setting_sniff,
{ "Enable Sniff Mode", "bthci_evt.link_policy_sniff",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0004,
"Enable Sniff Mode", HFILL }
},
{ &hf_bthci_evt_link_policy_setting_park,
{ "Enable Park Mode", "bthci_evt.link_policy_park",
FT_UINT16, BASE_DEC, VALS(evt_boolean), 0x0008,
"Enable Park Mode", 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(evt_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,
{ "Interval", "bthci_evt.window",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Window", HFILL }
},
{ &hf_bthci_evt_input_coding,
{ "Input Coding", "bthci_evt.input_coding",
FT_UINT16, BASE_DEC, VALS(evt_input_coding_values), 0x0300,
"Authentication Enable", HFILL }
},
{ &hf_bthci_evt_input_data_format,
{ "Input Data Format", "bthci_evt.input_data_format",
FT_UINT16, BASE_DEC, VALS(evt_input_data_format_values), 0x00c0,
"Input Data Format", HFILL }
},
{ &hf_bthci_evt_input_sample_size,
{ "Input Sample Size", "bthci_evt.input_sample_size",
FT_UINT16, BASE_DEC, VALS(evt_input_sample_size_values), 0x0020,
"Input Sample Size", 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_UINT8, BASE_DEC, VALS(evt_boolean), 0x1,
"Device can enter low power state", HFILL }
},
{ &hf_bthci_evt_hold_mode_act_inquiry,
{ "Suspend Inquiry Scan", "bthci_evt.hold_mode_inquiry",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x2,
"Device can enter low power state", HFILL }
},
{ &hf_bthci_evt_hold_mode_act_periodic,
{ "Suspend Periodic Inquiries", "bthci_evt.hold_mode_periodic",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x4,
"Device can enter low power state", HFILL }
},
{ &hf_bthci_evt_transmit_power_level,
{ "Transmit Power Level (dBm)", "bthci_evt.transmit_power_level",
FT_INT8, BASE_DEC, NULL, 0x0,
"Transmit Power Level (dBm)", 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.num_curr_iac",
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,
"Loopback Mode", HFILL }
},
{ &hf_bthci_evt_country_code,
{"Country Code", "bthci_evt.country_code",
FT_UINT8, BASE_HEX, VALS(evt_country_code_values), 0x0,
"Country Code", HFILL }
},
{ &hf_bthci_evt_failed_contact_counter,
{"Failed Contact Counter", "bthci_evt.failed_contact_counter",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Failed Contact Counter", 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 (dB)", "bthci_evt.rssi",
FT_INT8, BASE_DEC, NULL, 0x0,
"RSSI (dB)", 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,
"Page Number", HFILL}
},
{ &hf_bthci_evt_max_page_number,
{"Max. Page Number", "bthci_evt.max_page_number",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Max. Page Number", HFILL}
},
{ &hf_bthci_evt_local_supported_cmds,
{ "Local Supported Commands", "bthci_evt.local_supported_cmds",
FT_BYTES, BASE_HEX, NULL, 0x0,
"Local Supported Commands", HFILL }
},
{ &hf_bthci_evt_fec_required,
{"FEC Required", "bthci_evt.fec_required",
FT_UINT8, BASE_DEC, VALS(evt_boolean), 0x0,
"FEC Required", HFILL}
},
{ &hf_bthci_evt_err_data_reporting,
{"Erroneous Data Reporting", "bthci_evt.err_data_reporting",
FT_UINT8, BASE_DEC, VALS(evt_enable_values), 0x0,
"Erroneous Data Reporting", HFILL}
},
{ &hf_bthci_evt_scan_type,
{"Scan Type", "bthci_evt.inq_scan_type",
FT_UINT8, BASE_DEC, VALS(evt_scan_types), 0x0,
"Scan Type", HFILL}
},
{ &hf_bthci_evt_inq_mode,
{"Inquiry Mode", "bthci_evt.inq_scan_type",
FT_UINT8, BASE_DEC, VALS(evt_inq_modes), 0x0,
"Inquiry Mode", HFILL}
},
{ &hf_bthci_evt_power_level_type,
{"Type", "bthci_evt.power_level_type",
FT_UINT8, BASE_HEX, VALS(evt_power_level_types), 0x0,
"Type", HFILL}
},
{ &hf_bthci_evt_ext_lmp_features,
{"Ext. LMP Features", "bthci_evt.page_number",
FT_UINT64, BASE_HEX, NULL, 0x0,
"Extended LMP Features", HFILL}
},
{ &hf_bthci_evt_sync_link_type,
{"Link Type", "bthci_evt.sync_link_type",
FT_UINT8, BASE_HEX, VALS(evt_sync_link_types), 0x0,
"Link Type", HFILL}
},
{ &hf_bthci_evt_sync_tx_interval,
{"Transmit Interval", "bthci_evt.sync_tx_interval",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Transmit Interval", HFILL}
},
{ &hf_bthci_evt_sync_rtx_window,
{"Retransmit Window", "bthci_evt.sync_rtx_window",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Retransmit Window", HFILL}
},
{ &hf_bthci_evt_sync_rx_packet_length,
{"Rx Packet Length", "bthci_evt.sync_rx_pkt_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Rx Packet Length", HFILL}
},
{ &hf_bthci_evt_sync_tx_packet_length,
{"Tx Packet Length", "bthci_evt.sync_tx_pkt_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Tx Packet Length", HFILL}
},
{ &hf_bthci_evt_air_mode,
{"Air Mode", "bthci_evt.air_mode",
FT_UINT8, BASE_DEC, VALS(evt_air_mode_values), 0x0,
"Air Mode", HFILL}
},
{ &hf_bthci_evt_max_tx_latency,
{"Max. Tx Latency", "bthci_evt.max_tx_latency",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Max. Tx Latency", HFILL}
},
{ &hf_bthci_evt_max_rx_latency,
{"Max. Rx Latency", "bthci_evt.max_rx_latency",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Max. Rx Latency", HFILL}
},
{ &hf_bthci_evt_min_remote_timeout,
{"Min. Remote Timeout", "bthci_evt.min_remote_timeout",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Min. Remote Timeout", HFILL}
},
{ &hf_bthci_evt_min_local_timeout,
{"Min. Local Timeout", "bthci_evt.min_local_timeout",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Min. Local Timeout", HFILL}
},
{ &hf_bthci_evt_link_supervision_timeout,
{"Link Supervision Timeout", "bthci_evt.link_supervision_timeout",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Link Supervision Timeout", 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,
"Flow Direction", 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,
"AFH Channel Assessment Mode", HFILL}
},
{ &hf_bthci_evt_lmp_handle,
{ "LMP Handle", "bthci_evt.lmp_handle",
FT_UINT16, BASE_HEX, NULL, 0x0,
"LMP Handle", HFILL }
},
{ &hf_bthci_evt_clock,
{ "Clock", "bthci_evt.clock",
FT_UINT32, BASE_HEX, NULL, 0x0,
"Clock", HFILL }
},
{ &hf_bthci_evt_clock_accuracy,
{ "Clock", "bthci_evt.clock_accuracy",
FT_UINT16, BASE_HEX, NULL, 0x0,
"Clock", HFILL }
},
{ &hf_bthci_evt_afh_mode,
{"AFH Mode", "bthci_evt.afh_mode",
FT_UINT8, BASE_DEC, VALS(evt_enable_values), 0x0,
"AFH Mode", HFILL}
},
{ &hf_bthci_evt_afh_channel_map,
{"AFH Channel Map", "bthci_evt.afh_channel_map",
FT_UINT_BYTES, BASE_HEX, NULL, 0x0,
"AFH Channel Map", HFILL}
},
{ &hf_bthci_evt_simple_pairing_mode,
{"Simple Pairing Mode", "bthci_evt.simple_pairing_mode",
FT_UINT8, BASE_DEC, VALS(evt_enable_values), 0x0,
"Simple Pairing Mode", HFILL}
},
{ &hf_bthci_evt_hash_c,
{"Hash C", "bthci_evt.hash_c",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Hash C", HFILL}
},
{ &hf_bthci_evt_randomizer_r,
{"Randomizer R", "bthci_evt.randomizer_r",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Randomizer R", HFILL}
},
{ &hf_bthci_evt_io_capability,
{"IO Capability", "bthci_evt.io_capability",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_io_capability_vals), 0x0,
"IO Capability", 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,
"OOB Data Present", HFILL}
},
{ &hf_bthci_evt_auth_requirements,
{"Authentication Requirements", "bthci_evt.auth_requirements",
FT_UINT8, BASE_DEC, VALS(bthci_cmd_auth_req_vals), 0x0,
"Authentication Requirements", HFILL}
},
{ &hf_bthci_evt_numeric_value,
{"Numeric Value", "bthci_evt.numeric_value",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Numeric Value", HFILL}
},
{ &hf_bthci_evt_passkey,
{"Passkey", "bthci_evt.passkey",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Passkey", HFILL}
},
{ &hf_bthci_evt_notification_type,
{"Notification Type", "bthci_evt.notification_type",
FT_UINT8, BASE_DEC, VALS(evt_notification_type_vals), 0x0,
"Notification Type", HFILL}
},
{ &hf_bthci_evt_eir_data,
{"Data", "bthci_cmd.eir_data",
FT_BYTES, BASE_HEX, NULL, 0x0,
"EIR Data", HFILL}
},
{ &hf_bthci_evt_eir_struct_length,
{ "Length", "bthci_cmd.eir_struct_length",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Structure Length", HFILL }
},
{ &hf_bthci_evt_eir_struct_type,
{ "Type", "bthci_cmd.eir_data_type",
FT_UINT8, BASE_HEX, VALS(bthci_cmd_eir_data_type_vals), 0x0,
"Data Type", HFILL }
},
{ &hf_bthci_evt_sc_uuid16,
{ "UUID", "bthci_cmd.service_class_uuid16",
FT_UINT16, BASE_HEX, VALS(bthci_cmd_service_class_type_vals), 0x0,
"16-bit Service Class UUID", HFILL }
},
{ &hf_bthci_evt_sc_uuid32,
{ "UUID", "bthci_cmd.service_class_uuid32",
FT_UINT32, BASE_HEX, NULL, 0x0,
"32-bit Service Class UUID", HFILL }
},
{ &hf_bthci_evt_sc_uuid128,
{ "UUID", "bthci_cmd.service_class_uuid128",
FT_BYTES, BASE_HEX, NULL, 0x0,
"128-bit Service Class UUID", HFILL }
}
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_bthci_evt,
&ett_opcode,
&ett_lmp_subtree,
&ett_ptype_subtree,
&ett_eir_subtree,
&ett_eir_struct_subtree
};
/* Register the protocol name and description */
proto_bthci_evt = proto_register_protocol("Bluetooth HCI Event",
"HCI_EVT", "bthci_evt");
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));
}
/* If this dissector uses sub-dissector registration add a registration routine.
This format is required because a script is used to find these routines and
create the code that calls these routines.
*/
void
proto_reg_handoff_bthci_evt(void)
{
dissector_handle_t bthci_evt_handle;
bthci_evt_handle = find_dissector("bthci_evt");
dissector_add("hci_h4.type", HCI_H4_TYPE_EVT, bthci_evt_handle);
dissector_add("hci_h1.type", BTHCI_CHANNEL_EVENT, bthci_evt_handle);
bthci_com_handle = find_dissector("bthci_cmd");
}