wireshark/plugins/profinet/packet-dcerpc-pn-io.c

6710 lines
257 KiB
C

/* packet-dcerpc-pn-io.c
* Routines for PROFINET IO dissection.
*
* $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.
*/
/*
* The PN-IO protocol is a field bus protocol related to decentralized
* periphery and is developed by the PROFIBUS Nutzerorganisation e.V. (PNO),
* see: www.profibus.com
*
*
* PN-IO is based on the common DCE-RPC and the "lightweight" PN-RT
* (ethernet type 0x8892) protocols.
*
* The context manager (CM) part is handling context information
* (like establishing, ...) and is using DCE-RPC as it's underlying
* protocol.
*
* The actual cyclic data transfer and acyclic notification uses the
* "lightweight" PN-RT protocol.
*
* There are some other related PROFINET protocols (e.g. PN-DCP, which is
* handling addressing topics).
*
* Please note: the PROFINET CBA protocol is independant of the PN-IO protocol!
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#include <string.h>
#include <glib.h>
#include <epan/packet.h>
#include <epan/emem.h>
#include <epan/dissectors/packet-dcerpc.h>
#include <epan/expert.h>
#include <epan/dissector_filters.h>
#include "packet-pn.h"
static int proto_pn_io = -1;
static int hf_pn_io_opnum = -1;
static int hf_pn_io_reserved16 = -1;
static int hf_pn_io_array = -1;
static int hf_pn_io_status = -1;
static int hf_pn_io_args_max = -1;
static int hf_pn_io_args_len = -1;
static int hf_pn_io_array_max_count = -1;
static int hf_pn_io_array_offset = -1;
static int hf_pn_io_array_act_count = -1;
static int hf_pn_io_ar_type = -1;
static int hf_pn_io_cminitiator_macadd = -1;
static int hf_pn_io_cminitiator_objectuuid = -1;
static int hf_pn_io_parameter_server_objectuuid = -1;
static int hf_pn_io_ar_properties = -1;
static int hf_pn_io_ar_properties_state = -1;
static int hf_pn_io_ar_properties_supervisor_takeover_allowed = -1;
static int hf_pn_io_ar_properties_parametrization_server = -1;
static int hf_pn_io_ar_properties_data_rate = -1;
static int hf_pn_io_ar_properties_reserved_1 = -1;
static int hf_pn_io_ar_properties_device_access = -1;
static int hf_pn_io_ar_properties_companion_ar = -1;
static int hf_pn_io_ar_properties_achnowledge_companion_ar = -1;
static int hf_pn_io_ar_properties_reserved = -1;
static int hf_pn_io_ar_properties_pull_module_alarm_allowed = -1;
static int hf_pn_io_cminitiator_activitytimeoutfactor = -1;
static int hf_pn_io_cminitiator_udprtport = -1;
static int hf_pn_io_station_name_length = -1;
static int hf_pn_io_cminitiator_station_name = -1;
static int hf_pn_io_parameter_server_station_name = -1;
static int hf_pn_io_cmresponder_macadd = -1;
static int hf_pn_io_cmresponder_udprtport = -1;
static int hf_pn_io_number_of_iocrs = -1;
static int hf_pn_io_iocr_tree = -1;
static int hf_pn_io_iocr_type = -1;
static int hf_pn_io_iocr_reference = -1;
static int hf_pn_io_lt = -1;
static int hf_pn_io_iocr_properties = -1;
static int hf_pn_io_iocr_properties_rtclass = -1;
static int hf_pn_io_iocr_properties_reserved_1 = -1;
static int hf_pn_io_iocr_properties_media_redundancy = -1;
static int hf_pn_io_iocr_properties_reserved_2 = -1;
static int hf_pn_io_data_length = -1;
static int hf_pn_io_ir_frame_data = -1;
static int hf_pn_io_frame_id = -1;
static int hf_pn_io_send_clock_factor = -1;
static int hf_pn_io_reduction_ratio = -1;
static int hf_pn_io_phase = -1;
static int hf_pn_io_sequence = -1;
static int hf_pn_io_frame_send_offset = -1;
static int hf_pn_io_watchdog_factor = -1;
static int hf_pn_io_data_hold_factor = -1;
static int hf_pn_io_iocr_tag_header = -1;
static int hf_pn_io_iocr_multicast_mac_add = -1;
static int hf_pn_io_number_of_apis = -1;
static int hf_pn_io_number_of_io_data_objects = -1;
static int hf_pn_io_io_data_object_frame_offset = -1;
static int hf_pn_io_number_of_iocs = -1;
static int hf_pn_io_iocs_frame_offset = -1;
static int hf_pn_io_alarmcr_type = -1;
static int hf_pn_io_alarmcr_properties = -1;
static int hf_pn_io_alarmcr_properties_priority = -1;
static int hf_pn_io_alarmcr_properties_transport = -1;
static int hf_pn_io_alarmcr_properties_reserved = -1;
static int hf_pn_io_rta_timeoutfactor = -1;
static int hf_pn_io_rta_retries = -1;
static int hf_pn_io_localalarmref = -1;
static int hf_pn_io_remotealarmref = -1;
static int hf_pn_io_maxalarmdatalength = -1;
static int hf_pn_io_alarmcr_tagheaderhigh = -1;
static int hf_pn_io_alarmcr_tagheaderlow = -1;
static int hf_pn_io_ar_uuid = -1;
static int hf_pn_io_target_ar_uuid = -1;
static int hf_pn_io_api_tree = -1;
static int hf_pn_io_module_tree = -1;
static int hf_pn_io_submodule_tree = -1;
static int hf_pn_io_io_data_object = -1;
static int hf_pn_io_io_cs = -1;
static int hf_pn_io_api = -1;
static int hf_pn_io_slot_nr = -1;
static int hf_pn_io_subslot_nr = -1;
static int hf_pn_io_index = -1;
static int hf_pn_io_seq_number = -1;
static int hf_pn_io_record_data_length = -1;
static int hf_pn_io_add_val1 = -1;
static int hf_pn_io_add_val2 = -1;
static int hf_pn_io_block = -1;
static int hf_pn_io_block_header = -1;
static int hf_pn_io_block_type = -1;
static int hf_pn_io_block_length = -1;
static int hf_pn_io_block_version_high = -1;
static int hf_pn_io_block_version_low = -1;
static int hf_pn_io_sessionkey = -1;
static int hf_pn_io_control_command = -1;
static int hf_pn_io_control_command_prmend = -1;
static int hf_pn_io_control_command_applready = -1;
static int hf_pn_io_control_command_release = -1;
static int hf_pn_io_control_command_done = -1;
static int hf_pn_io_control_block_properties = -1;
static int hf_pn_io_control_block_properties_applready = -1;
static int hf_pn_io_control_block_properties_applready0 = -1;
static int hf_pn_io_error_code = -1;
static int hf_pn_io_error_decode = -1;
static int hf_pn_io_error_code1 = -1;
static int hf_pn_io_error_code1_pniorw = -1;
static int hf_pn_io_error_code1_pnio = -1;
static int hf_pn_io_error_code2 = -1;
static int hf_pn_io_error_code2_pniorw = -1;
static int hf_pn_io_error_code2_pnio_22 = -1;
static int hf_pn_io_error_code2_pnio_253 = -1;
static int hf_pn_io_alarm_type = -1;
static int hf_pn_io_alarm_specifier = -1;
static int hf_pn_io_alarm_specifier_sequence = -1;
static int hf_pn_io_alarm_specifier_channel = -1;
static int hf_pn_io_alarm_specifier_manufacturer = -1;
static int hf_pn_io_alarm_specifier_submodule = -1;
static int hf_pn_io_alarm_specifier_ardiagnosis = -1;
static int hf_pn_io_alarm_dst_endpoint = -1;
static int hf_pn_io_alarm_src_endpoint = -1;
static int hf_pn_io_pdu_type = -1;
static int hf_pn_io_pdu_type_type = -1;
static int hf_pn_io_pdu_type_version = -1;
static int hf_pn_io_add_flags = -1;
static int hf_pn_io_window_size = -1;
static int hf_pn_io_tack = -1;
static int hf_pn_io_send_seq_num = -1;
static int hf_pn_io_ack_seq_num = -1;
static int hf_pn_io_var_part_len = -1;
static int hf_pn_io_number_of_modules = -1;
static int hf_pn_io_module_ident_number = -1;
static int hf_pn_io_module_properties = -1;
static int hf_pn_io_module_state = -1;
static int hf_pn_io_number_of_submodules = -1;
static int hf_pn_io_submodule_ident_number = -1;
static int hf_pn_io_submodule_properties = -1;
static int hf_pn_io_submodule_properties_type = -1;
static int hf_pn_io_submodule_properties_shared_input = -1;
static int hf_pn_io_submodule_properties_reduce_input_submodule_data_length = -1;
static int hf_pn_io_submodule_properties_reduce_output_submodule_data_length = -1;
static int hf_pn_io_submodule_properties_discard_ioxs = -1;
static int hf_pn_io_submodule_properties_reserved = -1;
static int hf_pn_io_submodule_state = -1;
static int hf_pn_io_submodule_state_format_indicator = -1;
static int hf_pn_io_submodule_state_add_info = -1;
static int hf_pn_io_submodule_state_qualified_info = -1;
static int hf_pn_io_submodule_state_maintenance_required = -1;
static int hf_pn_io_submodule_state_maintenance_demanded = -1;
static int hf_pn_io_submodule_state_diag_info = -1;
static int hf_pn_io_submodule_state_ar_info = -1;
static int hf_pn_io_submodule_state_ident_info = -1;
static int hf_pn_io_submodule_state_detail = -1;
static int hf_pn_io_data_description_tree = -1;
static int hf_pn_io_data_description = -1;
static int hf_pn_io_submodule_data_length = -1;
static int hf_pn_io_length_iocs = -1;
static int hf_pn_io_length_iops = -1;
static int hf_pn_io_iocs = -1;
static int hf_pn_io_iops = -1;
static int hf_pn_io_ioxs = -1;
static int hf_pn_io_ioxs_extension = -1;
static int hf_pn_io_ioxs_res14 = -1;
static int hf_pn_io_ioxs_instance = -1;
static int hf_pn_io_ioxs_datastate = -1;
static int hf_pn_io_address_resolution_properties = -1;
static int hf_pn_io_mci_timeout_factor = -1;
static int hf_pn_io_provider_station_name = -1;
static int hf_pn_io_user_structure_identifier = -1;
static int hf_pn_io_channel_number = -1;
static int hf_pn_io_channel_properties = -1;
static int hf_pn_io_channel_properties_type = -1;
static int hf_pn_io_channel_properties_accumulative = -1;
static int hf_pn_io_channel_properties_maintenance_required = -1;
static int hf_pn_io_channel_properties_maintenance_demanded = -1;
static int hf_pn_io_channel_properties_specifier = -1;
static int hf_pn_io_channel_properties_direction = -1;
static int hf_pn_io_channel_error_type = -1;
static int hf_pn_io_ext_channel_error_type = -1;
static int hf_pn_io_ext_channel_add_value = -1;
static int hf_pn_io_ptcp_subdomain_id = -1;
static int hf_pn_io_ir_data_id = -1;
static int hf_pn_io_reserved_interval_begin = -1;
static int hf_pn_io_reserved_interval_end = -1;
static int hf_pn_io_pllwindow = -1;
static int hf_pn_io_sync_send_factor = -1;
static int hf_pn_io_sync_properties = -1;
static int hf_pn_io_sync_frame_address = -1;
static int hf_pn_io_ptcp_timeout_factor = -1;
static int hf_pn_io_domain_boundary = -1;
static int hf_pn_io_multicast_boundary = -1;
static int hf_pn_io_adjust_properties = -1;
static int hf_pn_io_mau_type = -1;
static int hf_pn_io_mau_type_mode = -1;
static int hf_pn_io_port_state = -1;
static int hf_pn_io_line_delay = -1;
static int hf_pn_io_number_of_peers = -1;
static int hf_pn_io_length_peer_port_id = -1;
static int hf_pn_io_peer_port_id = -1;
static int hf_pn_io_length_peer_chassis_id = -1;
static int hf_pn_io_peer_chassis_id = -1;
static int hf_pn_io_length_own_port_id = -1;
static int hf_pn_io_own_port_id = -1;
static int hf_pn_io_peer_macadd = -1;
static int hf_pn_io_media_type = -1;
static int hf_pn_io_macadd = -1;
static int hf_pn_io_length_own_chassis_id = -1;
static int hf_pn_io_own_chassis_id = -1;
static int hf_pn_io_ethertype = -1;
static int hf_pn_io_rx_port = -1;
static int hf_pn_io_frame_details = -1;
static int hf_pn_io_nr_of_tx_port_groups = -1;
static int hf_pn_io_slot = -1;
static int hf_pn_io_subslot = -1;
static int hf_pn_io_number_of_slots = -1;
static int hf_pn_io_number_of_subslots = -1;
static int hf_pn_io_maintenance_required_drop_budget = -1;
static int hf_pn_io_maintenance_demanded_drop_budget = -1;
static int hf_pn_io_error_drop_budget = -1;
static int hf_pn_io_maintenance_required_power_budget = -1;
static int hf_pn_io_maintenance_demanded_power_budget = -1;
static int hf_pn_io_error_power_budget = -1;
static int hf_pn_io_fiber_optic_type = -1;
static int hf_pn_io_fiber_optic_cable_type = -1;
static int hf_pn_io_controller_appl_cycle_factor = -1;
static int hf_pn_io_time_data_cycle = -1;
static int hf_pn_io_time_io_input = -1;
static int hf_pn_io_time_io_output = -1;
static int hf_pn_io_time_io_input_valid = -1;
static int hf_pn_io_time_io_output_valid = -1;
static int hf_pn_io_maintenance_status = -1;
static int hf_pn_io_maintenance_status_required = -1;
static int hf_pn_io_maintenance_status_demanded = -1;
static int hf_pn_io_vendor_id_high = -1;
static int hf_pn_io_vendor_id_low = -1;
static int hf_pn_io_vendor_block_type = -1;
static int hf_pn_io_order_id = -1;
static int hf_pn_io_im_serial_number = -1;
static int hf_pn_io_im_hardware_revision = -1;
static int hf_pn_io_im_revision_prefix = -1;
static int hf_pn_io_im_sw_revision_functional_enhancement = -1;
static int hf_pn_io_im_revision_bugfix = -1;
static int hf_pn_io_im_sw_revision_internal_change = -1;
static int hf_pn_io_im_revision_counter = -1;
static int hf_pn_io_im_profile_id = -1;
static int hf_pn_io_im_profile_specific_type = -1;
static int hf_pn_io_im_version_major = -1;
static int hf_pn_io_im_version_minor = -1;
static int hf_pn_io_im_supported = -1;
static int hf_pn_io_number_of_ars = -1;
static int hf_pn_io_cycle_counter = -1;
static int hf_pn_io_data_status = -1;
static int hf_pn_io_data_status_res67 = -1;
static int hf_pn_io_data_status_ok = -1;
static int hf_pn_io_data_status_operate = -1;
static int hf_pn_io_data_status_res3 = -1;
static int hf_pn_io_data_status_valid = -1;
static int hf_pn_io_data_status_res1 = -1;
static int hf_pn_io_data_status_primary = -1;
static int hf_pn_io_transfer_status = -1;
static int hf_pn_io_actual_local_time_stamp = -1;
static int hf_pn_io_number_of_log_entries = -1;
static int hf_pn_io_local_time_stamp = -1;
static int hf_pn_io_entry_detail = -1;
static int hf_pn_io_ip_address = -1;
static int hf_pn_io_subnetmask = -1;
static int hf_pn_io_standard_gateway = -1;
static int hf_pn_io_mrp_domain_uuid = -1;
static int hf_pn_io_mrp_role = -1;
static int hf_pn_io_mrp_length_domain_name = -1;
static int hf_pn_io_mrp_domain_name = -1;
static int hf_pn_io_mrp_prio = -1;
static int hf_pn_io_mrp_topchgt = -1;
static int hf_pn_io_mrp_topnrmax = -1;
static int hf_pn_io_mrp_tstshortt = -1;
static int hf_pn_io_mrp_tstdefaultt = -1;
static int hf_pn_io_mrp_tstnrmax = -1;
static int hf_pn_io_mrp_check = -1;
static int hf_pn_io_mrp_rtmode = -1;
static int hf_pn_io_mrp_rtmode_rtclass12 = -1;
static int hf_pn_io_mrp_rtmode_rtclass3 = -1;
static int hf_pn_io_mrp_rtmode_reserved1 = -1;
static int hf_pn_io_mrp_rtmode_reserved2 = -1;
static int hf_pn_io_mrp_lnkdownt = -1;
static int hf_pn_io_mrp_lnkupt = -1;
static int hf_pn_io_mrp_lnknrmax = -1;
static int hf_pn_io_mrp_version = -1;
static int hf_pn_io_substitute_active_flag = -1;
static int hf_pn_io_length_data = -1;
static int hf_pn_io_mrp_ring_state = -1;
static int hf_pn_io_mrp_rt_state = -1;
static int hf_pn_io_im_tag_function = -1;
static int hf_pn_io_im_tag_location = -1;
static int hf_pn_io_im_date = -1;
static int hf_pn_io_im_descriptor = -1;
static int hf_pn_io_fs_hello_mode = -1;
static int hf_pn_io_fs_hello_interval = -1;
static int hf_pn_io_fs_hello_retry = -1;
static int hf_pn_io_fs_hello_delay = -1;
static int hf_pn_io_check_sync_mode = -1;
static int hf_pn_io_check_sync_mode_reserved = -1;
static int hf_pn_io_check_sync_mode_sync_master = -1;
static int hf_pn_io_check_sync_mode_cable_delay = -1;
static gint ett_pn_io = -1;
static gint ett_pn_io_block = -1;
static gint ett_pn_io_block_header = -1;
static gint ett_pn_io_status = -1;
static gint ett_pn_io_rtc = -1;
static gint ett_pn_io_rta = -1;
static gint ett_pn_io_pdu_type = -1;
static gint ett_pn_io_add_flags = -1;
static gint ett_pn_io_control_command = -1;
static gint ett_pn_io_ioxs = -1;
static gint ett_pn_io_api = -1;
static gint ett_pn_io_data_description = -1;
static gint ett_pn_io_module = -1;
static gint ett_pn_io_submodule = -1;
static gint ett_pn_io_io_data_object = -1;
static gint ett_pn_io_io_cs = -1;
static gint ett_pn_io_ar_properties = -1;
static gint ett_pn_io_iocr_properties = -1;
static gint ett_pn_io_submodule_properties = -1;
static gint ett_pn_io_alarmcr_properties = -1;
static gint ett_pn_io_submodule_state = -1;
static gint ett_pn_io_channel_properties = -1;
static gint ett_pn_io_slot = -1;
static gint ett_pn_io_subslot = -1;
static gint ett_pn_io_maintenance_status = -1;
static gint ett_pn_io_data_status = -1;
static gint ett_pn_io_iocr = -1;
static gint ett_pn_io_mrp_rtmode = -1;
static gint ett_pn_io_control_block_properties = -1;
static gint ett_pn_io_check_sync_mode = -1;
static gint ett_pn_io_ir_frame_data = -1;
static gint ett_pn_io_ar_info = -1;
static e_uuid_t uuid_pn_io_device = { 0xDEA00001, 0x6C97, 0x11D1, { 0x82, 0x71, 0x00, 0xA0, 0x24, 0x42, 0xDF, 0x7D } };
static guint16 ver_pn_io_device = 1;
static e_uuid_t uuid_pn_io_controller = { 0xDEA00002, 0x6C97, 0x11D1, { 0x82, 0x71, 0x00, 0xA0, 0x24, 0x42, 0xDF, 0x7D } };
static guint16 ver_pn_io_controller = 1;
static e_uuid_t uuid_pn_io_supervisor = { 0xDEA00003, 0x6C97, 0x11D1, { 0x82, 0x71, 0x00, 0xA0, 0x24, 0x42, 0xDF, 0x7D } };
static guint16 ver_pn_io_supervisor = 1;
static e_uuid_t uuid_pn_io_parameterserver = { 0xDEA00004, 0x6C97, 0x11D1, { 0x82, 0x71, 0x00, 0xA0, 0x24, 0x42, 0xDF, 0x7D } };
static guint16 ver_pn_io_parameterserver = 1;
static const value_string pn_io_block_type[] = {
{ 0x0000, "Reserved" },
{ 0x0001, "Alarm Notification High"},
{ 0x0002, "Alarm Notification Low"},
{ 0x0008, "IODWriteReqHeader"},
{ 0x8008, "IODWriteResHeader"},
{ 0x0009, "IODReadReqHeader"},
{ 0x8009, "IODReadResHeader"},
{ 0x0010, "DiagnosisData"},
{ 0x0011, "Reserved"},
{ 0x0012, "ExpectedIdentificationData"},
{ 0x0013, "RealIdentificationData"},
{ 0x0014, "SubstituteValue"},
{ 0x0015, "RecordInputDataObjectElement"},
{ 0x0016, "RecordOutputDataObjectElement"},
{ 0x0017, "reserved"},
{ 0x0018, "ARData"},
{ 0x0019, "LogData"},
{ 0x001A, "APIData"},
{ 0x0020, "I&M0"},
{ 0x0021, "I&M1"},
{ 0x0022, "I&M2"},
{ 0x0023, "I&M3"},
{ 0x0024, "I&M4"},
{ 0x0025, "I&M5"},
{ 0x0026, "I&M6"},
{ 0x0027, "I&M7"},
{ 0x0028, "I&M8"},
{ 0x0029, "I&M9"},
{ 0x002A, "I&M10"},
{ 0x002B, "I&M11"},
{ 0x002C, "I&M12"},
{ 0x002D, "I&M13"},
{ 0x002E, "I&M14"},
{ 0x002F, "I&M15"},
{ 0x0030, "I&M0FilterDataSubmodul"},
{ 0x0031, "I&M0FilterDataModul"},
{ 0x0032, "I&M0FilterDataDevice"},
{ 0x8001, "Alarm Ack High"},
{ 0x8002, "Alarm Ack Low"},
{ 0x0101, "ARBlockReq"},
{ 0x8101, "ARBlockRes"},
{ 0x0102, "IOCRBlockReq"},
{ 0x8102, "IOCRBlockRes"},
{ 0x0103, "AlarmCRBlockReq"},
{ 0x8103, "AlarmCRBlockRes"},
{ 0x0104, "ExpectedSubmoduleBlockReq"},
{ 0x8104, "ModuleDiffBlock"},
{ 0x0105, "PrmServerBlockReq"},
{ 0x8105, "PrmServerBlockRes"},
{ 0x0106, "MCRBlockReq"},
{ 0x0110, "IODBlockReq"},
{ 0x8110, "IODBlockRes"},
{ 0x0111, "IODBlockReq"},
{ 0x8111, "IODBlockRes"},
{ 0x0112, "IOXBlockReq"},
{ 0x8112, "IOXBlockRes"},
{ 0x0113, "IOXBlockReq"},
{ 0x8113, "IOXBlockRes"},
{ 0x0114, "ReleaseBlockReq"},
{ 0x8114, "ReleaseBlockRes"},
{ 0x0115, "ARRPCServerBlockReq"},
{ 0x8115, "ARRPCServerBlockRes"},
{ 0x0200, "PDPortDataCheck"},
{ 0x0201, "PDevData"},
{ 0x0202, "PDPortDataAdjust"},
{ 0x0203, "PDSyncData"},
{ 0x0204, "IsochronousModeData"},
{ 0x0205, "PDIRData"},
{ 0x0206, "PDIRGlobalData"},
{ 0x0207, "PDIRFrameData"},
{ 0x0209, "AdjustDomainBoundary"},
{ 0x020A, "CheckPeers"},
{ 0x020B, "CheckLineDelay"},
{ 0x020C, "Checking MAUType"},
{ 0x020E, "Adjusting MAUType"},
{ 0x020F, "PDPortDataReal"},
{ 0x0210, "AdjustMulticastBoundary"},
{ 0x0211, "PDInterfaceMrpDataAdjust"},
{ 0x0212, "PDInterfaceMrpDataReal"},
{ 0x0213, "PDInterfaceMrpDataCheck"},
{ 0x0214, "PDPortMrpDataAdjust"},
{ 0x0215, "PDPortMrpDataReal"},
{ 0x0216, "Media redundancy manager parameters"},
{ 0x0217, "Media redundancy client parameters"},
{ 0x0218, "Media redundancy RT mode for manager"},
{ 0x0219, "Media redundancy ring state data"},
{ 0x021A, "Media redundancy RT ring state data"},
{ 0x021B, "AdjustPortState"},
{ 0x021C, "Checking PortState"},
{ 0x021D, "Media redundancy RT mode for clients"},
{ 0x021E, "CheckSyncDifference"},
{ 0x021F, "CheckMAUTypeDifference"},
{ 0x0220, "PDPortFODataReal"},
{ 0x0221, "Reading real fiber optic manufacturerspecific data"},
{ 0x0222, "PDPortFODataAdjust"},
{ 0x0223, "PDPortFODataCheck"},
{ 0x0230, "PDNCDataCheck"},
{ 0x0240, "PDInterfaceDataReal"},
{ 0x0400, "MultipleBlockHeader"},
{ 0x0500, "RecordDataReadQuery"},
{ 0x0600, "FSHello"},
{ 0x0608, "PDInterfaceFSUDataAdjust"},
{ 0x0F00, "MaintenanceItem"},
{ 0, NULL }
};
static const value_string pn_io_alarm_type[] = {
{ 0x0000, "Reserved" },
{ 0x0001, "Diagnosis" },
{ 0x0002, "Process" },
{ 0x0003, "Pull" },
{ 0x0004, "Plug" },
{ 0x0005, "Status" },
{ 0x0006, "Update" },
{ 0x0007, "Redundancy" },
{ 0x0008, "Controlled by supervisor" },
{ 0x0009, "Released" },
{ 0x000A, "Plug wrong submodule" },
{ 0x000B, "Return of submodule" },
{ 0x000C, "Diagnosis disappears" },
{ 0x000D, "Multicast communication mismatch notification" },
{ 0x000E, "Port data change notification" },
{ 0x000F, "Sync data changed notification" },
{ 0x0010, "Isochronous mode problem notification" },
{ 0x0011, "Network component problem notification" },
{ 0x0012, "Time data changed notification" },
/*0x0013 - 0x001E reserved */
{ 0x001F, "Pull module" },
/*0x0020 - 0x007F manufacturer specific */
/*0x0080 - 0x00FF reserved for profiles */
/*0x0100 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_pdu_type[] = {
{ 0x01, "Data-RTA-PDU" },
{ 0x02, "NACK-RTA-PDU" },
{ 0x03, "ACK-RTA-PDU" },
{ 0x04, "ERR-RTA-PDU" },
{ 0, NULL }
};
static const value_string pn_io_error_code[] = {
{ 0x00, "OK" },
{ 0x81, "PNIO" },
{ 0xCF, "RTA error" },
{ 0xDA, "AlarmAck" },
{ 0xDB, "IODConnectRes" },
{ 0xDC, "IODReleaseRes" },
{ 0xDD, "IODControlRes" },
{ 0xDE, "IODReadRes" },
{ 0xDF, "IODWriteRes" },
{ 0, NULL }
};
static const value_string pn_io_error_decode[] = {
{ 0x00, "OK" },
{ 0x80, "PNIORW" },
{ 0x81, "PNIO" },
{ 0, NULL }
};
/* dummy for unknown decode */
static const value_string pn_io_error_code1[] = {
{ 0x00, "OK" },
{ 0, NULL }
};
/* dummy for unknown decode/code1 combination */
static const value_string pn_io_error_code2[] = {
{ 0x00, "OK" },
{ 0, NULL }
};
static const value_string pn_io_error_code1_pniorw[] = {
/* high nibble 0-9 not specified -> legacy codes */
{ 0xa0, "application: read error" },
{ 0xa1, "application: write error" },
{ 0xa2, "application: module failure" },
{ 0xa3, "application: not specified" },
{ 0xa4, "application: not specified" },
{ 0xa5, "application: not specified" },
{ 0xa6, "application: not specified" },
{ 0xa7, "application: busy" },
{ 0xa8, "application: version conflict" },
{ 0xa9, "application: feature not supported" },
{ 0xaa, "application: User specific 1" },
{ 0xab, "application: User specific 2" },
{ 0xac, "application: User specific 3" },
{ 0xad, "application: User specific 4" },
{ 0xae, "application: User specific 5" },
{ 0xaf, "application: User specific 6" },
{ 0xb0, "access: invalid index" },
{ 0xb1, "access: write length error" },
{ 0xb2, "access: invalid slot/subslot" },
{ 0xb3, "access: type conflict" },
{ 0xb4, "access: invalid area" },
{ 0xb5, "access: state conflict" },
{ 0xb6, "access: access denied" },
{ 0xb7, "access: invalid range" },
{ 0xb8, "access: invalid parameter" },
{ 0xb9, "access: invalid type" },
{ 0xba, "access: backup" },
{ 0xbb, "access: User specific 7" },
{ 0xbc, "access: User specific 8" },
{ 0xbd, "access: User specific 9" },
{ 0xbe, "access: User specific 10" },
{ 0xbf, "access: User specific 11" },
{ 0xc0, "resource: read constrain conflict" },
{ 0xc1, "resource: write constrain conflict" },
{ 0xc2, "resource: resource busy" },
{ 0xc3, "resource: resource unavailable" },
{ 0xc4, "resource: not specified" },
{ 0xc5, "resource: not specified" },
{ 0xc6, "resource: not specified" },
{ 0xc7, "resource: not specified" },
{ 0xc8, "resource: User specific 12" },
{ 0xc9, "resource: User specific 13" },
{ 0xca, "resource: User specific 14" },
{ 0xcb, "resource: User specific 15" },
{ 0xcc, "resource: User specific 16" },
{ 0xcd, "resource: User specific 17" },
{ 0xce, "resource: User specific 18" },
{ 0xcf, "resource: User specific 19" },
/* high nibble d-f user specific */
{ 0, NULL }
};
static const value_string pn_io_error_code2_pniorw[] = {
/* all values are user specified */
{ 0, NULL }
};
static const value_string pn_io_error_code1_pnio[] = {
{ 0x00 /* 0*/, "Reserved" },
{ 0x01 /* 1*/, "Connect: Faulty ARBlockReq" },
{ 0x02 /* 2*/, "Connect: Faulty IOCRBlockReq" },
{ 0x03 /* 3*/, "Connect: Faulty ExpectedSubmoduleBlockReq" },
{ 0x04 /* 4*/, "Connect: Faulty AlarmCRBlockReq" },
{ 0x05 /* 5*/, "Connect: Faulty PrmServerBlockReq" },
{ 0x14 /* 20*/, "IODControl: Faulty ControlBlockConnect" },
{ 0x15 /* 21*/, "IODControl: Faulty ControlBlockPlug" },
{ 0x16 /* 22*/, "IOXControl: Faulty ControlBlock after a connect est." },
{ 0x17 /* 23*/, "IOXControl: Faulty ControlBlock a plug alarm" },
{ 0x28 /* 40*/, "Release: Faulty ReleaseBlock" },
{ 0x3c /* 60*/, "AlarmAck Error Codes" },
{ 0x3d /* 61*/, "CMDEV" },
{ 0x3e /* 62*/, "CMCTL" },
{ 0x3f /* 63*/, "NRPM" },
{ 0x40 /* 64*/, "RMPM" },
{ 0x41 /* 65*/, "ALPMI" },
{ 0x42 /* 66*/, "ALPMR" },
{ 0x43 /* 67*/, "LMPM" },
{ 0x44 /* 68*/, "MMAC" },
{ 0x45 /* 69*/, "RPC" },
{ 0x46 /* 70*/, "APMR" },
{ 0x47 /* 71*/, "APMS" },
{ 0x48 /* 72*/, "CPM" },
{ 0x49 /* 73*/, "PPM" },
{ 0x4a /* 74*/, "DCPUCS" },
{ 0x4b /* 75*/, "DCPUCR" },
{ 0x4c /* 76*/, "DCPMCS" },
{ 0x4d /* 77*/, "DCPMCR" },
{ 0x4e /* 78*/, "FSPM" },
{ 0xfd /*253*/, "RTA_ERR_CLS_PROTOCOL" },
{ 0, NULL }
};
static const value_string pn_io_error_code2_pnio_22[] = {
{ 0, "Error in Parameter BlockType" },
{ 7, "Error in Parameter ControlBlockProperties" },
{ 0, NULL }
};
static const value_string pn_io_error_code2_pnio_253[] = {
{ 0, "reserved" },
{ 1, "error within the coordination of sequence numbers (RTA_ERR_CODE_SEQ) error" },
{ 2, "instance closed (RTA_ERR_ABORT)" },
{ 3, "AR out of memory (RTA_ERR_ABORT)" },
{ 4, "AR add provider or consumer failed (RTA_ERR_ABORT)" },
{ 5, "AR consumer missing (RTA_ERR_ABORT)" },
{ 6, "AR cmi timeout (RTA_ERR_ABORT)" },
{ 7, "AR alarm-open failed (RTA_ERR_ABORT)" },
{ 8, "AR alarm-send.cnf(-) (RTA_ERR_ABORT)" },
{ 9, "AR alarm-ack- send.cnf(-) (RTA_ERR_ABORT)" },
{ 10, "AR alarm data too long (RTA_ERR_ABORT)" },
{ 11, "AR alarm.ind(err) (RTA_ERR_ABORT)" },
{ 12, "AR rpc-client call.cnf(-) (RTA_ERR_ABORT)" },
{ 13, "AR abort.req (RTA_ERR_ABORT)" },
{ 14, "AR re-run aborts existing (RTA_ERR_ABORT)" },
{ 15, "AR release.ind received (RTA_ERR_ABORT)" },
{ 16, "AR device deactivated (RTA_ERR_ABORT)" },
{ 17, "AR removed (RTA_ERR_ABORT)" },
{ 18, "AR protocol violation (RTA_ERR_ABORT)" },
{ 19, "AR name resolution error (RTA_ERR_ABORT)" },
{ 20, "AR RPC-Bind error (RTA_ERR_ABORT)" },
{ 21, "AR RPC-Connect error (RTA_ERR_ABORT)" },
{ 22, "AR RPC-Read error (RTA_ERR_ABORT)" },
{ 23, "AR RPC-Write error (RTA_ERR_ABORT)" },
{ 24, "AR RPC-Control error (RTA_ERR_ABORT)" },
{ 25, "AR forbidden pull or plug after check.rsp and before in- data.ind (RTA_ERR_ABORT)" },
{ 26, "AR AP removed (RTA_ERR_ABORT)" },
{ 27, "AR link down (RTA_ERR_ABORT)" },
{ 28, "AR could not register multicast-mac address (RTA_ERR_ABORT)" },
{ 29, "not synchronized (cannot start companion-ar) (RTA_ERR_ABORT)" },
{ 30, "wrong topology (cannot start companion-ar) (RTA_ERR_ABORT)" },
{ 31, "dcp, station-name changed (RTA_ERR_ABORT)" },
{ 32, "dcp, reset to factory-settings (RTA_ERR_ABORT)" },
{ 33, "cannot start companion-AR because a 0x8ipp submodule in the first AR... (RTA_ERR_ABORT)" },
{ 34, "no irdata record yet (RTA_ERR_ABORT)" },
{ 35, "PDEV (RTA_ERROR_ABORT)" },
{ 0, NULL }
};
static const value_string pn_io_ioxs[] = {
{ 0x00 /* 0*/, "detected by subslot" },
{ 0x01 /* 1*/, "detected by slot" },
{ 0x02 /* 2*/, "detected by IO device" },
{ 0x03 /* 3*/, "detected by IO controller" },
{ 0, NULL }
};
static const value_string pn_io_ar_type[] = {
{ 0x0000, "reserved" },
{ 0x0001, "IOCARSingle" },
{ 0x0002, "reserved" },
{ 0x0003, "IOCARCIR" },
{ 0x0004, "IOCAR_IOControllerRedundant" },
{ 0x0005, "IOCAR_IODeviceRedundant" },
{ 0x0006, "IOSAR" },
/*0x0007 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_iocr_type[] = {
{ 0x0000, "reserved" },
{ 0x0001, "Input CR" },
{ 0x0002, "Output CR" },
{ 0x0003, "Multicast Provider CR" },
{ 0x0004, "Multicast Consumer CR" },
/*0x0005 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_data_description[] = {
{ 0x0000, "reserved" },
{ 0x0001, "Input" },
{ 0x0002, "Output" },
{ 0x0003, "reserved" },
/*0x0004 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_module_state[] = {
{ 0x0000, "no module" },
{ 0x0001, "wrong module" },
{ 0x0002, "proper module" },
{ 0x0003, "substitute" },
/*0x0004 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_arproperties_state[] = {
{ 0x00000000, "Backup" },
{ 0x00000001, "Primary" },
/*0x00000002 - 0x00000007 reserved */
{ 0, NULL }
};
static const value_string pn_io_arproperties_supervisor_takeover_allowed[] = {
{ 0x00000000, "not allowed" },
{ 0x00000001, "allowed" },
{ 0, NULL }
};
static const value_string pn_io_arproperties_parametrization_server[] = {
{ 0x00000000, "External PrmServer" },
{ 0x00000001, "CM Initiator" },
{ 0, NULL }
};
static const value_string pn_io_arproperties_data_rate[] = {
{ 0x00000000, "at least 100 MB/s or more" },
{ 0x00000001, "100 MB/s" },
{ 0x00000002, "1 GB/s" },
{ 0x00000003, "10 GB/s" },
{ 0, NULL }
};
static const value_string pn_io_arproperties_device_access[] = {
{ 0x00000000, "only submodules from ExtendedSubmoduleBlock" },
{ 0x00000001, "Submodule is controlled by IO device appl." },
{ 0, NULL }
};
static const value_string pn_io_arproperties_companion_ar[] = {
{ 0x00000000, "Single AR or second AR of a companion pair" },
{ 0x00000001, "First AR of a companion pair and a companion AR shall follow" },
{ 0x00000002, "Companion AR" },
{ 0x00000003, "Reserved" },
{ 0, NULL }
};
static const value_string pn_io_arproperties_acknowldege_companion_ar[] = {
{ 0x00000000, "No companion AR or no acknowledge for the companion AR required" },
{ 0x00000001, "Companion AR with acknowledge" },
{ 0, NULL }
};
static const value_string pn_io_arproperties_pull_module_alarm_allowed[] = {
{ 0x00000000, "AlarmType(=Pull) shall signal pulling of submodule and module" },
{ 0x00000001, "AlarmType(=Pull) shall signal pulling of submodule" },
{ 0, NULL }
};
static const value_string pn_io_iocr_properties_rtclass[] = {
{ 0x00000000, "reserved" },
{ 0x00000001, "RT_CLASS_1" },
{ 0x00000002, "RT_CLASS_2" },
{ 0x00000003, "RT_CLASS_3" },
{ 0x00000004, "RT_CLASS_UDP" },
/*0x00000005 - 0x00000007 reserved */
{ 0, NULL }
};
static const value_string pn_io_iocr_properties_media_redundancy[] = {
{ 0x00000000, "No media redundant frame transfer" },
{ 0x00000001, "Media redundant frame transfer" },
{ 0, NULL }
};
static const value_string pn_io_submodule_properties_type[] = {
{ 0x0000, "no input and no output data" },
{ 0x0001, "input data" },
{ 0x0002, "output data" },
{ 0x0003, "input and output data" },
{ 0, NULL }
};
static const value_string pn_io_submodule_properties_shared_input[] = {
{ 0x0000, "IO controller" },
{ 0x0001, "IO controller shared" },
{ 0, NULL }
};
static const value_string pn_io_submodule_properties_reduce_input_submodule_data_length[] = {
{ 0x0000, "Expected" },
{ 0x0001, "Zero" },
{ 0, NULL }
};
static const value_string pn_io_submodule_properties_reduce_output_submodule_data_length[] = {
{ 0x0000, "Expected" },
{ 0x0001, "Zero" },
{ 0, NULL }
};
static const value_string pn_io_submodule_properties_discard_ioxs[] = {
{ 0x0000, "Expected" },
{ 0x0001, "Zero" },
{ 0, NULL }
};
static const value_string pn_io_alarmcr_properties_priority[] = {
{ 0x0000, "user priority (default)" },
{ 0x0001, "use only low priority" },
{ 0, NULL }
};
static const value_string pn_io_alarmcr_properties_transport[] = {
{ 0x0000, "RTA_CLASS_1" },
{ 0x0001, "RTA_CLASS_UDP" },
{ 0, NULL }
};
static const value_string pn_io_submodule_state_format_indicator[] = {
{ 0x0000, "Coding uses Detail" },
{ 0x0001, "Coding uses .IdentInfo, ..." },
{ 0, NULL }
};
static const value_string pn_io_submodule_state_add_info[] = {
{ 0x0000, "None" },
{ 0x0001, "Takeover not allowed" },
/*0x0002 - 0x0007 reserved */
{ 0, NULL }
};
static const value_string pn_io_submodule_state_qualified_info[] = {
{ 0x0000, "No QualifiedInfo available" },
{ 0x0001, "QualifiedInfo available" },
{ 0, NULL }
};
static const value_string pn_io_submodule_state_maintenance_required[] = {
{ 0x0000, "No MaintenanceRequired available" },
{ 0x0001, "MaintenanceRequired available" },
{ 0, NULL }
};
static const value_string pn_io_submodule_state_maintenance_demanded[] = {
{ 0x0000, "No MaintenanceDemanded available" },
{ 0x0001, "MaintenanceDemanded available" },
{ 0, NULL }
};
static const value_string pn_io_submodule_state_diag_info[] = {
{ 0x0000, "No DiagnosisData available" },
{ 0x0001, "DiagnosisData available" },
{ 0, NULL }
};
static const value_string pn_io_submodule_state_ar_info[] = {
{ 0x0000, "Own" },
{ 0x0001, "ApplicationReadyPending (ARP)" },
{ 0x0002, "Superordinated Locked (SO)" },
{ 0x0003, "Locked By IO Controller (IOC)" },
{ 0x0004, "Locked By IO Supervisor (IOS)" },
/*0x0005 - 0x000F reserved */
{ 0, NULL }
};
static const value_string pn_io_submodule_state_ident_info[] = {
{ 0x0000, "OK" },
{ 0x0001, "Substitute (SU)" },
{ 0x0001, "Wrong (WR)" },
{ 0x0001, "NoSubmodule (NO)" },
/*0x0004 - 0x000F reserved */
{ 0, NULL }
};
static const value_string pn_io_submodule_state_detail[] = {
{ 0x0000, "no submodule" },
{ 0x0001, "wrong submodule" },
{ 0x0002, "locked by IO controller" },
{ 0x0003, "reserved" },
{ 0x0004, "application ready pending" },
{ 0x0005, "reserved" },
{ 0x0006, "reserved" },
{ 0x0007, "Substitute" },
/*0x0008 - 0x7FFF reserved */
{ 0, NULL }
};
static const value_string pn_io_index[] = {
/*0x0008 - 0x7FFF user specific */
/* subslot specific */
{ 0x8000, "ExpectedIdentificationData for one subslot" },
{ 0x8001, "RealIdentificationData for one subslot" },
/*0x8002 - 0x8009 reserved */
{ 0x800A, "Diagnosis in channel coding for one subslot" },
{ 0x800B, "Diagnosis in all codings for one subslot" },
{ 0x800C, "Diagnosis, Maintenance, Qualified and Status for one subslot" },
/*0x800D - 0x800F reserved */
{ 0x8010, "Maintenance required in channel coding for one subslot" },
{ 0x8011, "Maintenance demanded in channel coding for one subslot" },
{ 0x8012, "Maintenance required in all codings for one subslot" },
{ 0x8013, "Maintenance demanded in all codings for one subslot" },
/*0x8014 - 0x801D reserved */
{ 0x801E, "SubstituteValues for one subslot" },
/*0x801F - 0x8027 reserved */
{ 0x8028, "RecordInputDataObjectElement for one subslot" },
{ 0x8029, "RecordOutputDataObjectElement for one subslot" },
{ 0x802A, "PDPortDataReal for one subslot" },
{ 0x802B, "PDPortDataCheck for one subslot" },
{ 0x802C, "PDIRData for one subslot" },
{ 0x802D, "Expected PDSyncData for one subslot with SyncID value 0 for PTCPoverRTA" },
{ 0x802E, "Expected PDSyncData for one subslot with SyncID value 0 for PTCPoverRTC" },
{ 0x802F, "PDPortDataAdjust for one subslot" },
{ 0x8030, "IsochronousModeData for one subslot" },
{ 0x8031, "Expected PDSyncData for one subslot with SyncID value 1" },
{ 0x8032, "Expected PDSyncData for one subslot with SyncID value 2" },
{ 0x8033, "Expected PDSyncData for one subslot with SyncID value 3" },
{ 0x8034, "Expected PDSyncData for one subslot with SyncID value 4" },
{ 0x8035, "Expected PDSyncData for one subslot with SyncID value 5" },
{ 0x8036, "Expected PDSyncData for one subslot with SyncID value 6" },
{ 0x8037, "Expected PDSyncData for one subslot with SyncID value 7" },
{ 0x8038, "Expected PDSyncData for one subslot with SyncID value 8" },
{ 0x8039, "Expected PDSyncData for one subslot with SyncID value 9" },
{ 0x803A, "Expected PDSyncData for one subslot with SyncID value 10" },
{ 0x803B, "Expected PDSyncData for one subslot with SyncID value 11" },
{ 0x803C, "Expected PDSyncData for one subslot with SyncID value 12" },
{ 0x803D, "Expected PDSyncData for one subslot with SyncID value 13" },
{ 0x803E, "Expected PDSyncData for one subslot with SyncID value 14" },
{ 0x803F, "Expected PDSyncData for one subslot with SyncID value 15" },
{ 0x8040, "Expected PDSyncData for one subslot with SyncID value 16" },
{ 0x8041, "Expected PDSyncData for one subslot with SyncID value 17" },
{ 0x8042, "Expected PDSyncData for one subslot with SyncID value 18" },
{ 0x8043, "Expected PDSyncData for one subslot with SyncID value 19" },
{ 0x8044, "Expected PDSyncData for one subslot with SyncID value 20" },
{ 0x8045, "Expected PDSyncData for one subslot with SyncID value 21" },
{ 0x8046, "Expected PDSyncData for one subslot with SyncID value 22" },
{ 0x8047, "Expected PDSyncData for one subslot with SyncID value 23" },
{ 0x8048, "Expected PDSyncData for one subslot with SyncID value 24" },
{ 0x8049, "Expected PDSyncData for one subslot with SyncID value 25" },
{ 0x804A, "Expected PDSyncData for one subslot with SyncID value 26" },
{ 0x804B, "Expected PDSyncData for one subslot with SyncID value 27" },
{ 0x804C, "Expected PDSyncData for one subslot with SyncID value 28" },
{ 0x804D, "Expected PDSyncData for one subslot with SyncID value 29" },
{ 0x804E, "Expected PDSyncData for one subslot with SyncID value 30" },
{ 0x804F, "Expected PDSyncData for one subslot with SyncID value 31" },
{ 0x8050, "PDInterfaceMrpDataReal for one subslot" },
{ 0x8051, "PDInterfaceMrpDataCheck for one subslot" },
{ 0x8052, "PDInterfaceMrpDataAdjust for one subslot" },
{ 0x8053, "PDPortMrpDataAdjust for one subslot" },
{ 0x8054, "PDPortMrpDataReal for one subslot" },
/*0x8055 - 0x805F reserved */
{ 0x8060, "PDPortFODataReal for one subslot" },
{ 0x8061, "PDPortFODataCheck for one subslot" },
{ 0x8062, "PDPortFODataAdjust for one subslot" },
/*0x8063 - 0x806F reserved */
{ 0x8070, "PDNCDataCheck for one subslot" },
/*0x8071 - 0x807F reserved */
{ 0x8080, "PDInterfaceDataReal" },
/*0x8081 - 0x808F reserved */
{ 0x8090, "Expected PDInterfaceFSUDataAdjust" },
/*0x8091 - 0xAFEF reserved */
{ 0xAFF0, "I&M0" },
{ 0xAFF1, "I&M1" },
{ 0xAFF2, "I&M2" },
{ 0xAFF3, "I&M3" },
{ 0xAFF4, "I&M4" },
{ 0xAFF5, "I&M5" },
{ 0xAFF6, "I&M6" },
{ 0xAFF7, "I&M7" },
{ 0xAFF8, "I&M8" },
{ 0xAFF9, "I&M9" },
{ 0xAFFA, "I&M10" },
{ 0xAFFB, "I&M11" },
{ 0xAFFC, "I&M12" },
{ 0xAFFD, "I&M13" },
{ 0xAFFE, "I&M14" },
{ 0xAFFF, "I&M15" },
/*0xB000 - 0xBFFF reserved for profiles */
{ 0xB02E, "Reserved for profiles"},
/* slot specific */
{ 0xC000, "ExpectedIdentificationData for one slot" },
{ 0xC001, "RealIdentificationData for one slot" },
/*0xC002 - 0xC009 reserved */
{ 0xC00A, "Diagnosis in channel coding for one slot" },
{ 0xC00B, "Diagnosis in all codings for one slot" },
{ 0xC00C, "Diagnosis, Maintenance, Qualified and Status for one slot" },
/*0xC00D - 0xC00F reserved */
{ 0xC010, "Maintenance required in channel coding for one slot" },
{ 0xC011, "Maintenance demanded in channel coding for one slot" },
{ 0xC012, "Maintenance required in all codings for one slot" },
{ 0xC013, "Maintenance demanded in all codings for one slot" },
/*0xC014 - 0xCFFF reserved */
/*0xD000 - 0xDFFF reserved for profiles */
/* AR specific */
{ 0xE000, "ExpectedIdentificationData for one AR" },
{ 0xE001, "RealIdentificationData for one AR" },
{ 0xE002, "ModuleDiffBlock for one AR" },
/*0xE003 - 0xE009 reserved */
{ 0xE00A, "Diagnosis in channel coding for one AR" },
{ 0xE00B, "Diagnosis in all codings for one AR" },
{ 0xE00C, "Diagnosis, Maintenance, Qualified and Status for one AR" },
/*0xE00D - 0xE00F reserved */
{ 0xE010, "Maintenance required in channel coding for one AR" },
{ 0xE011, "Maintenance demanded in channel coding for one AR" },
{ 0xE012, "Maintenance required in all codings for one AR" },
{ 0xE013, "Maintenance demanded in all codings for one AR" },
/*0xE014 - 0xE02F reserved */
{ 0xE030, "IsochronousModeData for one AR" },
/*0xE031 - 0xE03F reserved */
{ 0xE040, "MultipleWrite" },
/*0xE041 - 0xE04F reserved */
{ 0xE050, "FastStartUp data for one AR" },
/*0xE051 - 0xE05F reserved */
/*0xEC00 - 0xEFFF reserved */
/* API specific */
{ 0xF000, "RealIdentificationData for one API" },
/*0xF001 - 0xF009 reserved */
{ 0xF00A, "Diagnosis in channel coding for one API" },
{ 0xF00B, "Diagnosis in all codings for one API" },
{ 0xF00C, "Diagnosis, Maintenance, Qualified and Status for one API" },
/*0xF00D - 0xF00F reserved */
{ 0xF010, "Maintenance required in channel coding for one API" },
{ 0xF011, "Maintenance demanded in channel coding for one API" },
{ 0xF012, "Maintenance required in all codings for one API" },
{ 0xF013, "Maintenance demanded in all codings for one API" },
/*0xF014 - 0xF01F reserved */
{ 0xF020, "ARData for one API" },
/*0xF021 - 0xF3FF reserved */
/*0xF400 - 0xF7FF reserved */
/* device specific */
/*0xF800 - 0xF80B reserved */
{ 0xF80C, "Diagnosis, Maintenance, Qualified and Status for one device" },
/*0xF80D - 0xF81F reserved */
{ 0xF820, "ARData" },
{ 0xF821, "APIData" },
/*0xF822 - 0xF82F reserved */
{ 0xF830, "LogData" },
{ 0xF831, "PDevData" },
/*0xF832 - 0xF83F reserved */
{ 0xF840, "I&M0FilterData" },
{ 0xF841, "PDRealData" },
{ 0xF842, "PDExpectedData" },
/*0xF843 - 0xFBFF reserved */
/*0xFC00 - 0xFFFF reserved for profiles */
{ 0, NULL }
};
static const value_string pn_io_user_structure_identifier[] = {
/*0x0000 - 0x7FFF manufacturer specific */
{ 0x8000, "ChannelDiagnosis" },
{ 0x8001, "Multiple" },
{ 0x8002, "ExtChannelDiagnosis" },
{ 0x8003, "QualifiedChannelDiagnosis" },
/*0x8004 - 0x80FF reserved */
{ 0x8100, "Maintenance" },
/*0x8101 - 0x8FFF reserved */
/*0x9000 - 0x9FFF reserved for profiles */
/*0xA000 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_channel_number[] = {
/*0x0000 - 0x7FFF manufacturer specific */
{ 0x8000, "Submodule" },
/*0x8001 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_channel_error_type[] = {
{ 0x0000, "reserved" },
{ 0x0001, "short circuit" },
{ 0x0002, "Undervoltage" },
{ 0x0003, "Overvoltage" },
{ 0x0004, "Overload" },
{ 0x0005, "Overtemperature" },
{ 0x0006, "line break" },
{ 0x0007, "upper limit value exceeded" },
{ 0x0008, "lower limit value exceeded" },
{ 0x0009, "Error" },
/*0x000A - 0x000F reserved */
{ 0x0010, "parametrization fault" },
{ 0x0011, "power supply fault" },
{ 0x0012, "fuse blown / open" },
{ 0x0013, "Manufacturer specific" },
{ 0x0014, "ground fault" },
{ 0x0015, "reference point lost" },
{ 0x0016, "process event lost / sampling error" },
{ 0x0017, "threshold warning" },
{ 0x0018, "output disabled" },
{ 0x0019, "safety event" },
{ 0x001A, "external fault" },
/*0x001B - 0x001F manufacturer specific */
/*0x0020 - 0x00FF reserved for common profiles */
/*0x0100 - 0x7FFF manufacturer specific */
{ 0x8000, "Data transmission impossible" },
{ 0x8001, "Remote mismatch" },
{ 0x8002, "Media redundancy mismatch" },
{ 0x8003, "Sync mismatch" },
{ 0x8004, "IsochronousMode mismatch" },
{ 0x8005, "Multicast CR mismatch" },
{ 0x8006, "reserved" },
{ 0x8007, "Fiber optic mismatch" },
{ 0x8008, "Network component function mismatch" },
{ 0x8009, "Time mismatch" },
/*0x800A - 0x8FFF reserved */
/*0x9000 - 0x9FFF reserved for profile */
/*0xA000 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_channel_properties_type[] = {
{ 0x0000, "submodule or unspecified" },
{ 0x0001, "1 Bit" },
{ 0x0002, "2 Bit" },
{ 0x0003, "4 Bit" },
{ 0x0004, "8 Bit" },
{ 0x0005, "16 Bit" },
{ 0x0006, "32 Bit" },
{ 0x0007, "64 Bit" },
/*0x0008 - 0x00FF reserved */
{ 0, NULL }
};
static const value_string pn_io_channel_properties_specifier[] = {
{ 0x0000, "All subsequent disappears" },
{ 0x0001, "Appears" },
{ 0x0002, "Disappears" },
{ 0x0003, "disappears but other remain" },
{ 0, NULL }
};
static const value_string pn_io_channel_properties_direction[] = {
{ 0x0000, "manufacturer specific" },
{ 0x0001, "Input" },
{ 0x0002, "Output" },
{ 0x0003, "Input/Output" },
/*0x0004 - 0x0007 reserved */
{ 0, NULL }
};
static const value_string pn_io_alarmcr_type[] = {
{ 0x0000, "reserved" },
{ 0x0001, "Alarm CR" },
/*0x0002 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_mau_type[] = {
/*0x0000 - 0x0004 reserved */
{ 0x0005, "10BASET" },
/*0x0006 - 0x0009 reserved */
{ 0x000A, "10BASETXHD" },
{ 0x000B, "10BASETXFD" },
{ 0x000C, "10BASEFLHD" },
{ 0x000D, "10BASEFLFD" },
{ 0x000F, "100BASETXHD" },
{ 0x0010, "100BASETXFD" },
{ 0x0011, "100BASEFXHD" },
{ 0x0012, "100BASEFXFD" },
/*0x0013 - 0x0014 reserved */
{ 0x0015, "1000BASEXHD" },
{ 0x0016, "1000BASEXFD" },
{ 0x0017, "1000BASELXHD" },
{ 0x0018, "1000BASELXFD" },
{ 0x0019, "1000BASESXHD" },
{ 0x001A, "1000BASESXFD" },
/*0x001B - 0x001C reserved */
{ 0x001D, "1000BASETHD" },
{ 0x001E, "1000BASETFD" },
{ 0x001F, "10GigBASEFX" },
/*0x0020 - 0x002D reserved */
{ 0x002E, "100BASELX10" },
/*0x002F - 0x0035 reserved */
{ 0x0036, "100BASEPXFD" },
/*0x0037 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_mau_type_mode[] = {
{ 0x0000, "OFF" },
{ 0x0001, "ON" },
/*0x0002 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_port_state[] = {
{ 0x0000, "reserved" },
{ 0x0001, "up" },
{ 0x0002, "down" },
{ 0x0003, "testing" },
{ 0x0004, "unknown" },
/*0x0005 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_media_type[] = {
{ 0x0000, "unknown" },
{ 0x0001, "Copper cable" },
{ 0x0002, "Fiber optic cable" },
{ 0x0003, "Radio communication" },
/*0x0004 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_fiber_optic_type[] = {
{ 0x0000, "No fiber type adjusted" },
{ 0x0001, "9 um single mode fiber" },
{ 0x0002, "50 um multi mode fiber" },
{ 0x0003, "62,5 um multi mode fiber" },
{ 0x0004, "SI-POF, NA=0.5" },
{ 0x0005, "SI-PCF, NA=0.36" },
{ 0x0006, "LowNA-POF, NA=0.3" },
{ 0x0007, "GI-POF" },
/*0x0008 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_fiber_optic_cable_type[] = {
{ 0x0000, "No cable specified" },
{ 0x0001, "inside/outside cable, fixed installation" },
{ 0x0002, "inside/outside cable, flexible installation" },
{ 0x0003, "outdoor cable, fixed installation" },
/*0x0004 - 0xFFFF reserved */
{ 0, NULL }
};
static const value_string pn_io_im_revision_prefix_vals[] = {
{ 'V', "V - officially released version" },
{ 'R', "R - Revision" },
{ 'P', "P - prototoype" },
{ 'U', "U - Under Test (Field Test)" },
{ 'T', "T - Test Device" },
/*all others reserved */
{ 0, NULL }
};
static const value_string pn_io_mrp_role_vals[] = {
{ 0x0000, "Media Redundancy disabled" },
{ 0x0001, "Media Redundancy Client" },
{ 0x0002, "Media Redundancy Manager" },
/*all others reserved */
{ 0, NULL }
};
static const value_string pn_io_mrp_prio_vals[] = {
{ 0x0000, "Highest priority redundancy manager" },
/* 0x1000 - 0x7000 High priorities */
{ 0x8000, "Default priority for redundancy manager" },
/* 0x9000 - 0xE000 Low priorities */
{ 0xF000, "Lowest priority redundancy manager" },
/*all others reserved */
{ 0, NULL }
};
static const value_string pn_io_mrp_rtmode_rtclass12_vals[] = {
{ 0x0000, "RT_CLASS_1 and RT_CLASS_2 redundancy mode deactivated" },
{ 0x0001, "RT_CLASS_1 and RT_CLASS_2 redundancy mode activated" },
{ 0, NULL }
};
static const value_string pn_io_mrp_rtmode_rtclass3_vals[] = {
{ 0x0000, "RT_CLASS_3 redundancy mode deactivated" },
{ 0x0001, "RT_CLASS_3 redundancy mode activated" },
{ 0, NULL }
};
static const value_string pn_io_mrp_ring_state_vals[] = {
{ 0x0000, "Ring open" },
{ 0x0001, "Ring closed" },
{ 0, NULL }
};
static const value_string pn_io_mrp_rt_state_vals[] = {
{ 0x0000, "RT media redundancy lost" },
{ 0x0001, "RT media redundancy available" },
{ 0, NULL }
};
static const value_string pn_io_control_properties_vals[] = {
{ 0x0000, "Reserved" },
{ 0, NULL }
};
static const value_string pn_io_control_properties_aplication_ready_vals[] = {
{ 0x0000, "Wait for explicit ControlCommand.ReadyForCompanion" },
{ 0x0001, "Implicit ControlCommand.ReadyForCompanion" },
{ 0, NULL }
};
static const value_string pn_io_fs_hello_mode_vals[] = {
{ 0x0000, "OFF" },
{ 0x0001, "Send req on LinkUp" },
{ 0x0002, "Send req on LinkUp after HelloDelay" },
{ 0, NULL }
};
GList *pnio_ars;
typedef struct pnio_ar_s {
/* generic */
e_uuid_t aruuid;
guint16 inputframeid;
guint16 outputframeid;
/* controller only */
/*const char controllername[33];*/
const guint8 controllermac[6];
guint16 controlleralarmref;
/* device only */
const guint8 devicemac[6];
guint16 devicealarmref;
} pnio_ar_t;
static void
pnio_ar_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pnio_ar_t *ar)
{
proto_item *item;
proto_item *sub_item;
proto_tree *sub_tree;
pinfo->profinet_conv = ar;
pinfo->profinet_type = 10;
if (tree) {
sub_item = proto_tree_add_text(tree, tvb, 0, 0, "ARUUID:%s ContrMAC:%s ContrAlRef:0x%x DevMAC:%s DevAlRef:0x%x InCR:0x%x OutCR=0x%x",
guid_to_str((const e_guid_t*) &ar->aruuid),
ether_to_str((const guint8 *)ar->controllermac), ar->controlleralarmref,
ether_to_str((const guint8 *)ar->devicemac), ar->devicealarmref,
ar->inputframeid, ar->outputframeid);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_ar_info);
PROTO_ITEM_SET_GENERATED(sub_item);
item = proto_tree_add_guid(sub_tree, hf_pn_io_ar_uuid, tvb, 0, 0, (e_guid_t *) &ar->aruuid);
PROTO_ITEM_SET_GENERATED(item);
item = proto_tree_add_ether(sub_tree, hf_pn_io_cminitiator_macadd, tvb, 0, 0, ar->controllermac);
PROTO_ITEM_SET_GENERATED(item);
item = proto_tree_add_uint(sub_tree, hf_pn_io_localalarmref, tvb, 0, 0, ar->controlleralarmref);
PROTO_ITEM_SET_GENERATED(item);
item = proto_tree_add_ether(sub_tree, hf_pn_io_cmresponder_macadd, tvb, 0, 0, ar->devicemac);
PROTO_ITEM_SET_GENERATED(item);
item = proto_tree_add_uint(sub_tree, hf_pn_io_localalarmref, tvb, 0, 0, ar->devicealarmref);
PROTO_ITEM_SET_GENERATED(item);
item = proto_tree_add_uint(sub_tree, hf_pn_io_frame_id, tvb, 0, 0, ar->inputframeid);
PROTO_ITEM_SET_GENERATED(item);
item = proto_tree_add_uint(sub_tree, hf_pn_io_frame_id, tvb, 0, 0, ar->outputframeid);
PROTO_ITEM_SET_GENERATED(item);
}
}
static int dissect_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t **ar);
static int dissect_blocks(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep);
static int dissect_PNIO_IOxS(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep, int hfindex);
static pnio_ar_t *
pnio_ar_find_by_aruuid(packet_info *pinfo _U_, e_uuid_t *aruuid)
{
GList *ars;
pnio_ar_t *ar;
/* find pdev */
for(ars = pnio_ars; ars != NULL; ars = g_list_next(ars)) {
ar = ars->data;
if( memcmp(&ar->aruuid, aruuid, sizeof(e_uuid_t)) == 0) {
return ar;
}
}
return NULL;
}
static pnio_ar_t *
pnio_ar_new(e_uuid_t *aruuid)
{
pnio_ar_t *ar;
ar = se_alloc0(sizeof(pnio_ar_t));
memcpy(&ar->aruuid, aruuid, sizeof(e_uuid_t));
ar->controlleralarmref = 0xffff;
ar->devicealarmref = 0xffff;
pnio_ars = g_list_append(pnio_ars, ar);
return ar;
}
/* dissect the four status (error) fields */
static int
dissect_PNIO_status(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
guint8 u8ErrorCode;
guint8 u8ErrorDecode;
guint8 u8ErrorCode1;
guint8 u8ErrorCode2;
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32SubStart;
int bytemask = (drep[0] & 0x10) ? 3 : 0;
const value_string *error_code1_vals;
const value_string *error_code2_vals = pn_io_error_code2; /* defaults */
/* status */
sub_item = proto_tree_add_item(tree, hf_pn_io_status, tvb, offset, 0, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_status);
u32SubStart = offset;
/* the PNIOStatus field is existing in both the RPC and the application data,
* depending on the current PDU.
* As the byte representation of these layers are different, this has to be handled
* in a somewhat different way than elsewhere. */
dissect_dcerpc_uint8(tvb, offset+(0^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_code, &u8ErrorCode);
dissect_dcerpc_uint8(tvb, offset+(1^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_decode, &u8ErrorDecode);
switch(u8ErrorDecode) {
case(0x80): /* PNIORW */
dissect_dcerpc_uint8(tvb, offset+(2^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_code1_pniorw, &u8ErrorCode1);
error_code1_vals = pn_io_error_code1_pniorw;
/* u8ErrorCode2 for PNIORW is always user specific */
dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_code2_pniorw, &u8ErrorCode2);
error_code2_vals = pn_io_error_code2_pniorw;
break;
case(0x81): /* PNIO */
dissect_dcerpc_uint8(tvb, offset+(2^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_code1_pnio, &u8ErrorCode1);
error_code1_vals = pn_io_error_code1_pnio;
switch(u8ErrorCode1) {
case(22):
dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_code2_pnio_22, &u8ErrorCode2);
error_code2_vals = pn_io_error_code2_pnio_22;
break;
case(253):
dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_code2_pnio_253, &u8ErrorCode2);
error_code2_vals = pn_io_error_code2_pnio_253;
break;
default:
/* don't know this u8ErrorCode1 for PNIO, use defaults */
dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_code2, &u8ErrorCode2);
expert_add_info_format(pinfo, sub_item, PI_UNDECODED, PI_WARN,
"Unknown ErrorCode1 0x%x (for ErrorDecode==PNIO)", u8ErrorCode1);
break;
}
break;
default:
dissect_dcerpc_uint8(tvb, offset+(2^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_code1, &u8ErrorCode1);
if(u8ErrorDecode!=0) {
expert_add_info_format(pinfo, sub_item, PI_UNDECODED, PI_WARN,
"Unknown ErrorDecode 0x%x", u8ErrorDecode);
}
error_code1_vals = pn_io_error_code1;
/* don't know this u8ErrorDecode, use defaults */
dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
hf_pn_io_error_code2, &u8ErrorCode2);
if(u8ErrorDecode != 0) {
expert_add_info_format(pinfo, sub_item, PI_UNDECODED, PI_WARN,
"Unknown ErrorDecode 0x%x", u8ErrorDecode);
}
}
offset +=4;
if(u8ErrorCode == 0 && u8ErrorDecode == 0 && u8ErrorCode1 == 0 && u8ErrorCode2 == 0) {
proto_item_append_text(sub_item, ": OK");
if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, ", OK");
} else {
proto_item_append_text(sub_item, ": Error: \"%s\", \"%s\", \"%s\", \"%s\"",
val_to_str(u8ErrorCode, pn_io_error_code, "(0x%x)"),
val_to_str(u8ErrorDecode, pn_io_error_decode, "(0x%x)"),
val_to_str(u8ErrorCode1, error_code1_vals, "(0x%x)"),
val_to_str(u8ErrorCode2, error_code2_vals, "(0x%x)"));
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", Error: \"%s\", \"%s\", \"%s\", \"%s\"",
val_to_str(u8ErrorCode, pn_io_error_code, "(0x%x)"),
val_to_str(u8ErrorDecode, pn_io_error_decode, "(0x%x)"),
val_to_str(u8ErrorCode1, error_code1_vals, "(0x%x)"),
val_to_str(u8ErrorCode2, error_code2_vals, "(0x%x)"));
}
proto_item_set_len(sub_item, offset - u32SubStart);
return offset;
}
/* dissect the alarm specifier */
static int
dissect_Alarm_specifier(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
guint16 u16AlarmSpecifierSequence;
guint16 u16AlarmSpecifierChannel;
guint16 u16AlarmSpecifierManufacturer;
guint16 u16AlarmSpecifierSubmodule;
guint16 u16AlarmSpecifierAR;
proto_item *sub_item;
proto_tree *sub_tree;
/* alarm specifier */
sub_item = proto_tree_add_item(tree, hf_pn_io_alarm_specifier, tvb, offset, 2, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_pdu_type);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_alarm_specifier_sequence, &u16AlarmSpecifierSequence);
u16AlarmSpecifierSequence &= 0x07FF;
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_alarm_specifier_channel, &u16AlarmSpecifierChannel);
u16AlarmSpecifierChannel = (u16AlarmSpecifierChannel &0x0800) >> 11;
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_alarm_specifier_manufacturer, &u16AlarmSpecifierManufacturer);
u16AlarmSpecifierManufacturer = (u16AlarmSpecifierManufacturer &0x1000) >> 12;
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_alarm_specifier_submodule, &u16AlarmSpecifierSubmodule);
u16AlarmSpecifierSubmodule = (u16AlarmSpecifierSubmodule & 0x2000) >> 13;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_alarm_specifier_ardiagnosis, &u16AlarmSpecifierAR);
u16AlarmSpecifierAR = (u16AlarmSpecifierAR & 0x8000) >> 15;
proto_item_append_text(sub_item, ", Sequence: %u, Channel: %u, Manuf: %u, Submodule: %u AR: %u",
u16AlarmSpecifierSequence, u16AlarmSpecifierChannel,
u16AlarmSpecifierManufacturer, u16AlarmSpecifierSubmodule, u16AlarmSpecifierAR);
return offset;
}
/* dissect the alarm header */
static int
dissect_Alarm_header(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16AlarmType;
guint32 u32Api;
guint16 u16SlotNr;
guint16 u16SubslotNr;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_alarm_type, &u16AlarmType);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_api, &u32Api);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
proto_item_append_text(item, ", %s, API:%u, Slot:0x%x/0x%x",
val_to_str(u16AlarmType, pn_io_alarm_type, "(0x%x)"),
u32Api, u16SlotNr, u16SubslotNr);
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", %s, Slot: 0x%x/0x%x",
val_to_str(u16AlarmType, pn_io_alarm_type, "(0x%x)"),
u16SlotNr, u16SubslotNr);
return offset;
}
static int
dissect_ChannelProperties(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
proto_item *sub_item;
proto_tree *sub_tree;
guint16 u16ChannelProperties;
sub_item = proto_tree_add_item(tree, hf_pn_io_channel_properties, tvb, offset, 2, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_channel_properties);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_channel_properties_direction, &u16ChannelProperties);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_channel_properties_specifier, &u16ChannelProperties);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_channel_properties_maintenance_demanded, &u16ChannelProperties);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_channel_properties_maintenance_required, &u16ChannelProperties);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_channel_properties_accumulative, &u16ChannelProperties);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_channel_properties_type, &u16ChannelProperties);
return offset;
}
static int
dissect_AlarmUserStructure(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep,
guint16 *body_length, guint16 u16UserStructureIdentifier)
{
guint16 u16ChannelNumber;
guint16 u16ChannelErrorType;
guint16 u16ExtChannelErrorType;
guint32 u32ExtChannelAddValue;
guint16 u16Index;
guint32 u32RecDataLen;
pnio_ar_t *ar = NULL;
switch(u16UserStructureIdentifier) {
case(0x8000): /* ChannelDiagnosisData */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_channel_number, &u16ChannelNumber);
offset = dissect_ChannelProperties(tvb, offset, pinfo, tree, item, drep);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_channel_error_type, &u16ChannelErrorType);
*body_length -= 6;
break;
case(0x8002): /* ExtChannelDiagnosisData */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_channel_number, &u16ChannelNumber);
offset = dissect_ChannelProperties(tvb, offset, pinfo, tree, item, drep);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_channel_error_type, &u16ChannelErrorType);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_ext_channel_error_type, &u16ExtChannelErrorType);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_ext_channel_add_value, &u32ExtChannelAddValue);
*body_length -= 12;
break;
case(0x8100): /* MaintenanceItem */
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
*body_length -= 12;
break;
/* XXX - dissect remaining user structures of [AlarmItem] */
case(0x8001): /* DiagnosisData */
case(0x8003): /* QualifiedChannelDiagnosisData */
default:
if(u16UserStructureIdentifier >= 0x8000) {
offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, *body_length);
} else {
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, *body_length, "UserStructureIdentifier");
}
*body_length = 0;
}
return offset;
}
/* dissect the alarm notification block */
static int
dissect_AlarmNotification_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 body_length)
{
guint32 u32ModuleIdentNumber;
guint32 u32SubmoduleIdentNumber;
guint16 u16UserStructureIdentifier;
/*if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, ", Alarm Notification");*/
offset = dissect_Alarm_header(tvb, offset, pinfo, tree, item, drep);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_module_ident_number, &u32ModuleIdentNumber);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber);
offset = dissect_Alarm_specifier(tvb, offset, pinfo, tree, drep);
proto_item_append_text(item, ", Ident:0x%x, SubIdent:0x%x",
u32ModuleIdentNumber, u32SubmoduleIdentNumber);
body_length -= 20;
/* the rest of the block contains optional: [MaintenanceItem] and/or [AlarmItem] */
while(body_length) {
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_user_structure_identifier, &u16UserStructureIdentifier);
proto_item_append_text(item, ", USI:0x%x", u16UserStructureIdentifier);
body_length -= 2;
offset = dissect_AlarmUserStructure(tvb, offset, pinfo, tree, item, drep, &body_length, u16UserStructureIdentifier);
}
return offset;
}
static int
dissect_IandM0_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint8 u8VendorIDHigh;
guint8 u8VendorIDLow;
char *pOrderID;
char *pIMSerialNumber;
guint16 u16IMHardwareRevision;
guint8 u8SWRevisionPrefix;
guint8 u8IMSWRevisionFunctionalEnhancement;
guint8 u8IMSWRevisionBugFix;
guint8 u8IMSWRevisionInternalChange;
guint16 u16IMRevisionCounter;
guint16 u16IMProfileID;
guint16 u16IMProfileSpecificType;
guint8 u8IMVersionMajor;
guint8 u8IMVersionMinor;
guint16 u16IMSupported;
/* x8 VendorIDHigh */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_vendor_id_high, &u8VendorIDHigh);
/* x8 VendorIDLow */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_vendor_id_low, &u8VendorIDLow);
/* c8[20] OrderID */
pOrderID = ep_alloc(20+1);
tvb_memcpy(tvb, (guint8 *) pOrderID, offset, 20);
pOrderID[20] = '\0';
proto_tree_add_string (tree, hf_pn_io_order_id, tvb, offset, 20, pOrderID);
offset += 20;
/* c8[16] IM_Serial_Number */
pIMSerialNumber = ep_alloc(16+1);
tvb_memcpy(tvb, (guint8 *) pIMSerialNumber, offset, 16);
pIMSerialNumber[16] = '\0';
proto_tree_add_string (tree, hf_pn_io_im_serial_number, tvb, offset, 16, pIMSerialNumber);
offset += 16;
/* x16 IM_Hardware_Revision */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_hardware_revision, &u16IMHardwareRevision);
/* c8 SWRevisionPrefix */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_revision_prefix, &u8SWRevisionPrefix);
/* x8 IM_SWRevision_Functional_Enhancement */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_sw_revision_functional_enhancement, &u8IMSWRevisionFunctionalEnhancement);
/* x8 IM_SWRevision_Bug_Fix */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_revision_bugfix, &u8IMSWRevisionBugFix);
/* x8 IM_SWRevision_Internal_Change */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_sw_revision_internal_change, &u8IMSWRevisionInternalChange);
/* x16 IM_Revision_Counter */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_revision_counter, &u16IMRevisionCounter);
/* x16 IM_Profile_ID */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_profile_id, &u16IMProfileID);
/* x16 IM_Profile_Specific_Type */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_profile_specific_type, &u16IMProfileSpecificType);
/* x8 IM_Version_Major (values) */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_version_major, &u8IMVersionMajor);
/* x8 IM_Version_Minor (values) */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_version_minor, &u8IMVersionMinor);
/* x16 IM_Supported (bitfield) */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_im_supported, &u16IMSupported);
return offset;
}
static int
dissect_IandM1_block(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint8 *drep _U_)
{
char *pTagFunction;
char *pTagLocation;
/* IM_Tag_Function [32] */
pTagFunction = ep_alloc(32+1);
tvb_memcpy(tvb, (guint8 *) pTagFunction, offset, 32);
pTagFunction[32] = '\0';
proto_tree_add_string (tree, hf_pn_io_im_tag_function, tvb, offset, 32, pTagFunction);
offset += 32;
/* IM_Tag_Location [22] */
pTagLocation = ep_alloc(22+1);
tvb_memcpy(tvb, (guint8 *) pTagLocation, offset, 22);
pTagLocation[22] = '\0';
proto_tree_add_string (tree, hf_pn_io_im_tag_location, tvb, offset, 22, pTagLocation);
offset += 22;
proto_item_append_text(item, ": TagFunction:\"%s\", TagLocation:\"%s\"", pTagFunction, pTagLocation);
return offset;
}
static int
dissect_IandM2_block(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint8 *drep _U_)
{
char *pDate;
/* IM_Date [16] */
pDate = ep_alloc(16+1);
tvb_memcpy(tvb, (guint8 *) pDate, offset, 16);
pDate[16] = '\0';
proto_tree_add_string (tree, hf_pn_io_im_date, tvb, offset, 16, pDate);
offset += 16;
proto_item_append_text(item, ": Date:\"%s\"", pDate);
return offset;
}
static int
dissect_IandM3_block(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint8 *drep _U_)
{
char *pDescriptor;
/* IM_Descriptor [54] */
pDescriptor = ep_alloc(54+1);
tvb_memcpy(tvb, (guint8 *) pDescriptor, offset, 54);
pDescriptor[54] = '\0';
proto_tree_add_string (tree, hf_pn_io_im_descriptor, tvb, offset, 54, pDescriptor);
offset += 54;
proto_item_append_text(item, ": Descriptor:\"%s\"", pDescriptor);
return offset;
}
static int
dissect_IandM4_block(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint8 *drep _U_)
{
dissect_pn_user_data(tvb, offset, pinfo, tree, 54, "IM Signature");
return offset;
}
static int
dissect_IandM0FilterData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint16 u16NumberOfAPIs;
guint32 u32Api;
guint16 u16NumberOfModules;
guint16 u16SlotNr;
guint32 u32ModuleIdentNumber;
guint16 u16NumberOfSubmodules;
guint16 u16SubslotNr;
guint32 u32SubmoduleIdentNumber;
proto_item *subslot_item;
proto_tree *subslot_tree;
proto_item *module_item;
proto_tree *module_tree;
guint32 u32ModuleStart;
/* NumberOfAPIs */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_apis, &u16NumberOfAPIs);
while(u16NumberOfAPIs--) {
/* API */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_api, &u32Api);
/* NumberOfModules */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_modules, &u16NumberOfModules);
while(u16NumberOfModules--) {
module_item = proto_tree_add_item(tree, hf_pn_io_subslot, tvb, offset, 6, FALSE);
module_tree = proto_item_add_subtree(module_item, ett_pn_io_module);
u32ModuleStart = offset;
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, module_tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* ModuleIdentNumber */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, module_tree, drep,
hf_pn_io_module_ident_number, &u32ModuleIdentNumber);
/* NumberOfSubmodules */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, module_tree, drep,
hf_pn_io_number_of_submodules, &u16NumberOfSubmodules);
proto_item_append_text(module_item, ": Slot:%u, Ident:0x%x Submodules:%u",
u16SlotNr, u32ModuleIdentNumber, u16NumberOfSubmodules);
while(u16NumberOfSubmodules--) {
subslot_item = proto_tree_add_item(module_tree, hf_pn_io_subslot, tvb, offset, 6, FALSE);
subslot_tree = proto_item_add_subtree(subslot_item, ett_pn_io_subslot);
/* SubslotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, subslot_tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* SubmoduleIdentNumber */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, subslot_tree, drep,
hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber);
proto_item_append_text(subslot_item, ": Number:0x%x, Ident:0x%x",
u16SubslotNr, u32SubmoduleIdentNumber);
}
proto_item_set_len(module_item, offset-u32ModuleStart);
}
}
return offset;
}
/* dissect the IdentificationData block */
static int
dissect_IdentificationData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint8 u8BlockVersionLow)
{
guint16 u16NumberOfAPIs = 1;
guint32 u32Api;
guint16 u16NumberOfSlots;
guint16 u16SlotNr;
guint32 u32ModuleIdentNumber;
guint16 u16NumberOfSubslots;
guint32 u32SubmoduleIdentNumber;
guint16 u16SubslotNr;
proto_item *slot_item;
proto_tree *slot_tree;
guint32 u32SlotStart;
proto_item *subslot_item;
proto_tree *subslot_tree;
if(u8BlockVersionLow == 1) {
/* NumberOfAPIs */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_apis, &u16NumberOfAPIs);
}
proto_item_append_text(item, ": APIs:%u", u16NumberOfAPIs);
while(u16NumberOfAPIs--) {
if(u8BlockVersionLow == 1) {
/* API */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_api, &u32Api);
}
/* NumberOfSlots */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_slots, &u16NumberOfSlots);
proto_item_append_text(item, ", Slots:%u", u16NumberOfSlots);
while(u16NumberOfSlots--) {
slot_item = proto_tree_add_item(tree, hf_pn_io_slot, tvb, offset, 0, FALSE);
slot_tree = proto_item_add_subtree(slot_item, ett_pn_io_slot);
u32SlotStart = offset;
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, slot_tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* ModuleIdentNumber */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, slot_tree, drep,
hf_pn_io_module_ident_number, &u32ModuleIdentNumber);
/* NumberOfSubslots */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, slot_tree, drep,
hf_pn_io_number_of_subslots, &u16NumberOfSubslots);
proto_item_append_text(slot_item, ": SlotNr:%u Ident:0x%x Subslots:%u",
u16SlotNr, u32ModuleIdentNumber, u16NumberOfSubslots);
while(u16NumberOfSubslots--) {
subslot_item = proto_tree_add_item(slot_tree, hf_pn_io_subslot, tvb, offset, 6, FALSE);
subslot_tree = proto_item_add_subtree(subslot_item, ett_pn_io_subslot);
/* SubslotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, subslot_tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* SubmoduleIdentNumber */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, subslot_tree, drep,
hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber);
proto_item_append_text(subslot_item, ": Number:0x%x, Ident:0x%x",
u16SubslotNr, u32SubmoduleIdentNumber);
}
proto_item_set_len(slot_item, offset-u32SlotStart);
}
}
return offset;
}
/* dissect the substitute value block */
static int
dissect_SubstituteValue_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint16 u16BodyLength)
{
guint16 u16SubstitutionMode;
/* SubstitutionMode */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubstitutionMode);
/* SubstituteDataItem */
/* IOCS */
offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iocs);
u16BodyLength -= 3;
/* SubstituteDataObjectElement */
dissect_pn_user_data(tvb, offset, pinfo, tree, u16BodyLength, "SubstituteDataObjectElement");
return offset;
}
/* dissect the RecordInputDataObjectElement block */
static int
dissect_RecordInputDataObjectElement_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint8 u8LengthIOCS;
guint8 u8LengthIOPS;
guint16 u16LengthData;
/* LengthIOCS */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_iocs, &u8LengthIOCS);
/* IOCS */
offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iocs);
/* LengthIOPS */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_iops, &u8LengthIOPS);
/* IOPS */
offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iops);
/* LengthData */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_data, &u16LengthData);
/* Data */
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u16LengthData, "Data");
return offset;
}
/* dissect the RecordOutputDataObjectElement block */
static int
dissect_RecordOutputDataObjectElement_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint16 u16SubstituteActiveFlag;
guint8 u8LengthIOCS;
guint8 u8LengthIOPS;
guint16 u16LengthData;
guint16 u16Index;
guint32 u32RecDataLen;
pnio_ar_t *ar = NULL;
/* SubstituteActiveFlag */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_substitute_active_flag, &u16SubstituteActiveFlag);
/* LengthIOCS */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_iocs, &u8LengthIOCS);
/* LengthIOPS */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_iops, &u8LengthIOPS);
/* LengthData */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_data, &u16LengthData);
/* DataItem (IOCS, Data, IOPS) */
offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iocs);
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u16LengthData, "Data");
offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iops);
/* SubstituteValue */
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
return offset;
}
/* dissect the alarm acknowledge block */
static int
dissect_Alarm_ack_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, ", Alarm Ack");
offset = dissect_Alarm_header(tvb, offset, pinfo, tree, item, drep);
offset = dissect_Alarm_specifier(tvb, offset, pinfo, tree, drep);
offset = dissect_PNIO_status(tvb, offset, pinfo, tree, drep);
return offset;
}
/* dissect the maintenance block */
static int
dissect_Maintenance_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32MaintenanceStatus;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
sub_item = proto_tree_add_item(tree, hf_pn_io_maintenance_status, tvb, offset, 4, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_maintenance_status);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_maintenance_status_demanded, &u32MaintenanceStatus);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_maintenance_status_required, &u32MaintenanceStatus);
if(u32MaintenanceStatus & 0x0002) {
proto_item_append_text(item, ", Demanded");
proto_item_append_text(sub_item, ", Demanded");
}
if(u32MaintenanceStatus & 0x0001) {
proto_item_append_text(item, ", Required");
proto_item_append_text(sub_item, ", Required");
}
return offset;
}
/* dissect the read/write header */
static int
dissect_ReadWrite_header(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 *u16Index, e_uuid_t *aruuid)
{
guint32 u32Api;
guint16 u16SlotNr;
guint16 u16SubslotNr;
guint16 u16SeqNr;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_seq_number, &u16SeqNr);
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_ar_uuid, aruuid);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_api, &u32Api);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* padding doesn't match offset required for align4 */
offset = dissect_pn_padding(tvb, offset, pinfo, tree, 2);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_index, u16Index);
proto_item_append_text(item, ": Seq:%u, Api:0x%x, Slot:0x%x/0x%x",
u16SeqNr, u32Api, u16SlotNr, u16SubslotNr);
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", Api:0x%x, Slot:0x%x/0x%x, Index:%s",
u32Api, u16SlotNr, u16SubslotNr,
val_to_str(*u16Index, pn_io_index, "(0x%x)"));
return offset;
}
/* dissect the write request block */
static int
dissect_IODWriteReqHeader_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t ** ar)
{
e_uuid_t aruuid;
e_uuid_t null_uuid;
offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid);
*ar = pnio_ar_find_by_aruuid(pinfo, &aruuid);
if(*ar == NULL) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IODWriteReq: AR not existing!");
}
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_record_data_length, u32RecDataLen);
memset(&null_uuid, 0, sizeof(e_uuid_t));
if(memcmp(&aruuid, &null_uuid, sizeof (e_uuid_t)) == 0) {
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_target_ar_uuid, &aruuid);
}
offset = dissect_pn_padding(tvb, offset, pinfo, tree, 24);
proto_item_append_text(item, ", Len:%u", *u32RecDataLen);
if (check_col(pinfo->cinfo, COL_INFO) && *u32RecDataLen != 0)
col_append_fstr(pinfo->cinfo, COL_INFO, ", %u bytes",
*u32RecDataLen);
return offset;
}
/* dissect the read request block */
static int
dissect_IODReadReqHeader_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t **ar)
{
e_uuid_t aruuid;
e_uuid_t null_uuid;
offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid);
*ar = pnio_ar_find_by_aruuid(pinfo, &aruuid);
if(*ar == NULL) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IODReadReq: AR not existing!");
}
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_record_data_length, u32RecDataLen);
memset(&null_uuid, 0, sizeof(e_uuid_t));
if(memcmp(&aruuid, &null_uuid, sizeof (e_uuid_t)) == 0) {
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_target_ar_uuid, &aruuid);
offset = dissect_pn_padding(tvb, offset, pinfo, tree, 8);
} else {
offset = dissect_pn_padding(tvb, offset, pinfo, tree, 24);
}
proto_item_append_text(item, ", Len:%u", *u32RecDataLen);
if (check_col(pinfo->cinfo, COL_INFO) && *u32RecDataLen != 0)
col_append_fstr(pinfo->cinfo, COL_INFO, ", %u bytes",
*u32RecDataLen);
return offset;
}
/* dissect the write response block */
static int
dissect_IODWriteResHeader_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t **ar)
{
e_uuid_t aruuid;
guint16 u16AddVal1;
guint16 u16AddVal2;
offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid);
*ar = pnio_ar_find_by_aruuid(pinfo, &aruuid);
if(*ar == NULL) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IODWriteRes: AR not existing!");
}
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_record_data_length, u32RecDataLen);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_add_val1, &u16AddVal1);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_add_val2, &u16AddVal2);
offset = dissect_pn_padding(tvb, offset, pinfo, tree, 16);
proto_item_append_text(item, ", Len:%u, AddVal1:%u, AddVal2:%u",
*u32RecDataLen, u16AddVal1, u16AddVal2);
if (check_col(pinfo->cinfo, COL_INFO) && *u32RecDataLen != 0)
col_append_fstr(pinfo->cinfo, COL_INFO, ", %u bytes",
*u32RecDataLen);
return offset;
}
/* dissect the read response block */
static int
dissect_IODReadResHeader_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t **ar)
{
e_uuid_t aruuid;
guint16 u16AddVal1;
guint16 u16AddVal2;
offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid);
*ar = pnio_ar_find_by_aruuid(pinfo, &aruuid);
if(*ar == NULL) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IODReadRes: AR not existing!");
}
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_record_data_length, u32RecDataLen);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_add_val1, &u16AddVal1);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_add_val2, &u16AddVal2);
offset = dissect_pn_padding(tvb, offset, pinfo, tree, 20);
proto_item_append_text(item, ", Len:%u, AddVal1:%u, AddVal2:%u",
*u32RecDataLen, u16AddVal1, u16AddVal2);
if (check_col(pinfo->cinfo, COL_INFO) && *u32RecDataLen != 0)
col_append_fstr(pinfo->cinfo, COL_INFO, ", %u bytes",
*u32RecDataLen);
return offset;
}
/* dissect the control/connect block */
static int
dissect_ControlConnect_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, pnio_ar_t **ar)
{
e_uuid_t ar_uuid;
guint16 u16SessionKey;
proto_item *sub_item;
proto_tree *sub_tree;
guint16 u16Command;
guint16 u16Properties;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_reserved16, NULL);
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_ar_uuid, &ar_uuid);
*ar = pnio_ar_find_by_aruuid(pinfo, &ar_uuid);
if(*ar == NULL) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "ControlConnect: AR not existing!");
}
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_sessionkey, &u16SessionKey);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_reserved16, NULL);
sub_item = proto_tree_add_item(tree, hf_pn_io_control_command, tvb, offset, 2, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_control_command);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_control_command_prmend, &u16Command);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_control_command_applready, &u16Command);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_control_command_release, &u16Command);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_control_command_done, &u16Command);
if(u16Command & 0x0002) {
/* ApplicationReady: special decode */
sub_item = proto_tree_add_item(tree, hf_pn_io_control_block_properties_applready, tvb, offset, 2, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_control_block_properties);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_control_block_properties_applready0, &u16Properties);
} else {
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_control_block_properties, &u16Properties);
}
proto_item_append_text(item, ": Session:%u, Command:", u16SessionKey);
if(u16Command & 0x0001) {
proto_item_append_text(sub_item, ", ParameterEnd");
proto_item_append_text(item, " ParameterEnd");
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", Command: ParameterEnd");
}
if(u16Command & 0x0002) {
proto_item_append_text(sub_item, ", ApplicationReady");
proto_item_append_text(item, " ApplicationReady");
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", Command: ApplicationReady");
}
if(u16Command & 0x0004) {
proto_item_append_text(sub_item, ", Release");
proto_item_append_text(item, " Release");
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", Command: Release");
}
if(u16Command & 0x0008) {
proto_item_append_text(sub_item, ", Done");
proto_item_append_text(item, ", Done");
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", Command: Done");
}
proto_item_append_text(item, ", Properties:0x%x", u16Properties);
return offset;
}
/* dissect the PDevData block */
static int
dissect_PDevData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
offset = dissect_blocks(tvb, offset, pinfo, tree, drep);
return offset;
}
/* dissect the PDPortDataCheck/PDPortDataAdjust blocks */
static int
dissect_PDPortData_Check_Adjust_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 u16BodyLength)
{
guint16 u16SlotNr;
guint16 u16SubslotNr;
tvbuff_t *tvb_new;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
proto_item_append_text(item, ": Slot:0x%x/0x%x", u16SlotNr, u16SubslotNr);
u16BodyLength -= 6;
tvb_new = tvb_new_subset(tvb, offset, u16BodyLength, u16BodyLength);
dissect_blocks(tvb_new, 0, pinfo, tree, drep);
offset += u16BodyLength;
/* XXX - do we have to free the tvb_new somehow? */
return offset;
}
/* dissect the PDPortDataReal blocks */
static int
dissect_PDPortDataReal_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16SlotNr;
guint16 u16SubslotNr;
guint8 u8LengthOwnPortID;
char *pOwnPortID;
guint8 u8NumberOfPeers;
guint8 u8I;
guint8 u8LengthPeerPortID;
char *pPeerPortID;
guint8 u8LengthPeerChassisID;
char *pPeerChassisID;
guint32 u32LineDelay;
guint8 mac[6];
guint16 u16MAUType;
guint32 u32DomainBoundary;
guint32 u32MulticastBoundary;
guint16 u16PortState;
guint32 u32MediaType;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* LengthOwnPortID */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_own_port_id, &u8LengthOwnPortID);
/* OwnPortID */
pOwnPortID = ep_alloc(u8LengthOwnPortID+1);
tvb_memcpy(tvb, (guint8 *) pOwnPortID, offset, u8LengthOwnPortID);
pOwnPortID[u8LengthOwnPortID] = '\0';
proto_tree_add_string (tree, hf_pn_io_own_port_id, tvb, offset, u8LengthOwnPortID, pOwnPortID);
offset += u8LengthOwnPortID;
/* NumberOfPeers */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_peers, &u8NumberOfPeers);
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
u8I = u8NumberOfPeers;
while(u8I--) {
/* LengthPeerPortID */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_peer_port_id, &u8LengthPeerPortID);
/* PeerPortID */
pPeerPortID = ep_alloc(u8LengthPeerPortID+1);
tvb_memcpy(tvb, (guint8 *) pPeerPortID, offset, u8LengthPeerPortID);
pPeerPortID[u8LengthPeerPortID] = '\0';
proto_tree_add_string (tree, hf_pn_io_peer_port_id, tvb, offset, u8LengthPeerPortID, pPeerPortID);
offset += u8LengthPeerPortID;
/* LengthPeerChassisID */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_peer_chassis_id, &u8LengthPeerChassisID);
/* PeerChassisID */
pPeerChassisID = ep_alloc(u8LengthPeerChassisID+1);
tvb_memcpy(tvb, (guint8 *) pPeerChassisID, offset, u8LengthPeerChassisID);
pPeerChassisID[u8LengthPeerChassisID] = '\0';
proto_tree_add_string (tree, hf_pn_io_peer_chassis_id, tvb, offset, u8LengthPeerChassisID, pPeerChassisID);
offset += u8LengthPeerChassisID;
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* LineDelay */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_line_delay, &u32LineDelay);
/* PeerMACAddress */
offset = dissect_pn_mac(tvb, offset, pinfo, tree,
hf_pn_io_peer_macadd, mac);
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
}
/* MAUType */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mau_type, &u16MAUType);
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* DomainBoundary */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_domain_boundary, &u32DomainBoundary);
/* MulticastBoundary */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_multicast_boundary, &u32MulticastBoundary);
/* PortState */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_port_state, &u16PortState);
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MediaType */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_media_type, &u32MediaType);
proto_item_append_text(item, ": Slot:0x%x/0x%x, OwnPortID:%s, Peers:%u PortState:%s MediaType:%s",
u16SlotNr, u16SubslotNr, pOwnPortID, u8NumberOfPeers,
val_to_str(u16PortState, pn_io_port_state, "0x%x"),
val_to_str(u32MediaType, pn_io_media_type, "0x%x"));
return offset;
}
static int
dissect_PDInterfaceMrpDataAdjust_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
e_uuid_t uuid;
guint16 u16Role;
#if 0
guint8 u8LengthDomainName;
char *pDomainName;
#endif
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MRP_DomainUUID */
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_domain_uuid, &uuid);
/* MRP_Role */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_role, &u16Role);
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
#if 0
/* XXX - these fields will be added later */
/* MRP_LengthDomainName */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_length_domain_name, &u8LengthDomainName);
/* MRP_DomainName */
pDomainName = ep_alloc(u8LengthDomainName+1);
tvb_memcpy(tvb, (guint8 *) pDomainName, offset, u8LengthDomainName);
pDomainName[u8LengthDomainName] = '\0';
proto_tree_add_string (tree, hf_pn_io_mrp_domain_name, tvb, offset, u8LengthDomainName, pDomainName);
offset += u8LengthDomainName;
#endif
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
offset = dissect_blocks(tvb, offset, pinfo, tree, drep);
return offset;
}
static int
dissect_PDInterfaceMrpDataReal_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
e_uuid_t uuid;
guint16 u16Role;
guint16 u16Version;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MRP_DomainUUID */
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_domain_uuid, &uuid);
/* MRP_Role */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_role, &u16Role);
/* MRP_Version */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_version, &u16Version);
offset = dissect_blocks(tvb, offset, pinfo, tree, drep);
return offset;
}
static int
dissect_PDInterfaceMrpDataCheck_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
e_uuid_t uuid;
guint16 u16Check;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MRP_DomainUUID */
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_domain_uuid, &uuid);
/* MRP_Check */
/* XXX - this field is 32bit in the spec but 16 bit in the implementation */
/* this will be fixed in the next implementation release */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_check, &u16Check);
return offset;
}
static int
dissect_PDPortMrpData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
e_uuid_t uuid;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MRP_DomainUUID */
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_domain_uuid, &uuid);
return offset;
}
static int
dissect_MrpManagerParams_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint16 u16Prio;
guint16 u16TOPchgT;
guint16 u16TOPNRmax;
guint16 u16TSTshortT;
guint16 u16TSTdefaultT;
guint16 u16TSTNRmax;
/* MRP_Prio */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_prio, &u16Prio);
/* MRP_TOPchgT */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_topchgt, &u16TOPchgT);
/* MRP_TOPNRmax */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_topnrmax, &u16TOPNRmax);
/* MRP_TSTshortT */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_tstshortt, &u16TSTshortT);
/* MRP_TSTdefaultT */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_tstdefaultt, &u16TSTdefaultT);
/* MSP_TSTNRmax */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_tstnrmax, &u16TSTNRmax);
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
return offset;
}
static int
dissect_MrpRTMode(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32RTMode;
/* MRP_RTMode */
sub_item = proto_tree_add_item(tree, hf_pn_io_mrp_rtmode, tvb, offset, 4, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_mrp_rtmode);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_mrp_rtmode_reserved2, &u32RTMode);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_mrp_rtmode_reserved1, &u32RTMode);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_mrp_rtmode_rtclass3, &u32RTMode);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_mrp_rtmode_rtclass12, &u32RTMode);
return offset;
}
static int
dissect_MrpRTModeManagerData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16TSTNRmax;
guint16 u16TSTdefaultT;
/* MSP_TSTNRmax */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_tstnrmax, &u16TSTNRmax);
/* MRP_TSTdefaultT */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_tstdefaultt, &u16TSTdefaultT);
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MRP_RTMode */
offset = dissect_MrpRTMode(tvb, offset, pinfo, tree, item, drep);
return offset;
}
static int
dissect_MrpRingStateData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint16 u16RingState;
/* MRP_RingState */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_ring_state, &u16RingState);
return offset;
}
static int
dissect_MrpRTStateData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint16 u16RTState;
/* MRP_RTState */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_rt_state, &u16RTState);
return offset;
}
static int
dissect_MrpClientParams_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint16 u16MRP_LNKdownT;
guint16 u16MRP_LNKupT;
guint16 u16MRP_LNKNRmax;
/* MRP_LNKdownT */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_lnkdownt, &u16MRP_LNKdownT);
/* MRP_LNKupT */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_lnkupt, &u16MRP_LNKupT);
/* MRP_LNKNRmax u16 */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mrp_lnknrmax, &u16MRP_LNKNRmax);
return offset;
}
static int
dissect_MrpRTModeClientData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MRP_RTMode */
offset = dissect_MrpRTMode(tvb, offset, pinfo, tree, item, drep);
return offset;
}
static int
dissect_CheckSyncDifference_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
proto_item *sub_item;
proto_tree *sub_tree;
guint16 u16CheckSyncMode;
sub_item = proto_tree_add_item(tree, hf_pn_io_check_sync_mode, tvb, offset, 2, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_check_sync_mode);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_check_sync_mode_reserved, &u16CheckSyncMode);
dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_check_sync_mode_sync_master, &u16CheckSyncMode);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_check_sync_mode_cable_delay, &u16CheckSyncMode);
proto_item_append_text(sub_item, "CheckSyncMode: SyncMaster:%d, CableDelay:%d",
(u16CheckSyncMode & 0x2) && 1, (u16CheckSyncMode & 0x1) && 1);
proto_item_append_text(item, ": SyncMaster:%d, CableDelay:%d",
(u16CheckSyncMode >> 1) & 1, u16CheckSyncMode & 1);
return offset;
}
static int
dissect_CheckMAUTypeDifference_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16MAUTypeMode;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mau_type_mode, &u16MAUTypeMode);
proto_item_append_text(item, ": MAUTypeMode:%s",
val_to_str(u16MAUTypeMode, pn_io_mau_type_mode, "0x%x"));
return offset;
}
/* dissect the AdjustDomainBoundary blocks */
static int
dissect_AdjustDomainBoundary_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint32 u32DomainBoundary;
guint16 u16AdjustProperties;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* Boundary */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_domain_boundary, &u32DomainBoundary);
/* AdjustProperties */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_adjust_properties, &u16AdjustProperties);
proto_item_append_text(item, ": Boundary:0x%x, Properties:0x%x",
u32DomainBoundary, u16AdjustProperties);
return offset;
}
/* dissect the AdjustMulticastBoundary blocks */
static int
dissect_AdjustMulticastBoundary_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint32 u32MulticastBoundary;
guint16 u16AdjustProperties;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* Boundary */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_multicast_boundary, &u32MulticastBoundary);
/* AdjustProperties */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_adjust_properties, &u16AdjustProperties);
proto_item_append_text(item, ": Boundary:0x%x, Properties:0x%x",
u32MulticastBoundary, u16AdjustProperties);
return offset;
}
/* dissect the AdjustMAUType block */
static int
dissect_AdjustMAUType_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16MAUType;
guint16 u16AdjustProperties;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MAUType */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mau_type, &u16MAUType);
/* AdjustProperties */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_adjust_properties, &u16AdjustProperties);
proto_item_append_text(item, ": MAUType:%s, Properties:0x%x",
val_to_str(u16MAUType, pn_io_mau_type, "0x%x"),
u16AdjustProperties);
return offset;
}
/* dissect the CheckMAUType block */
static int
dissect_CheckMAUType_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16MAUType;
/* MAUType */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mau_type, &u16MAUType);
proto_item_append_text(item, ": MAUType:%s",
val_to_str(u16MAUType, pn_io_mau_type, "0x%x"));
return offset;
}
/* dissect the CheckLineDelay block */
static int
dissect_CheckLineDelay_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint32 u32LineDelay;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* LineDelay */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_line_delay, &u32LineDelay);
proto_item_append_text(item, ": LineDelay:%uns", u32LineDelay);
return offset;
}
/* dissect the CheckPeers block */
static int
dissect_CheckPeers_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint8 u8NumberOfPeers;
guint8 u8I;
guint8 u8LengthPeerPortID;
char *pPeerPortID;
guint8 u8LengthPeerChassisID;
char *pPeerChassisID;
/* NumberOfPeers */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_peers, &u8NumberOfPeers);
u8I = u8NumberOfPeers;
while(u8I--) {
/* LengthPeerPortID */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_peer_port_id, &u8LengthPeerPortID);
/* PeerPortID */
pPeerPortID = ep_alloc(u8LengthPeerPortID+1);
tvb_memcpy(tvb, (guint8 *) pPeerPortID, offset, u8LengthPeerPortID);
pPeerPortID[u8LengthPeerPortID] = '\0';
proto_tree_add_string (tree, hf_pn_io_peer_port_id, tvb, offset, u8LengthPeerPortID, pPeerPortID);
offset += u8LengthPeerPortID;
/* LengthPeerChassisID */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_peer_chassis_id, &u8LengthPeerChassisID);
/* PeerChassisID */
pPeerChassisID = ep_alloc(u8LengthPeerChassisID+1);
tvb_memcpy(tvb, (guint8 *) pPeerChassisID, offset, u8LengthPeerChassisID);
pPeerChassisID[u8LengthPeerChassisID] = '\0';
proto_tree_add_string (tree, hf_pn_io_peer_chassis_id, tvb, offset, u8LengthPeerChassisID, pPeerChassisID);
offset += u8LengthPeerChassisID;
}
proto_item_append_text(item, ": NumberOfPeers:%u", u8NumberOfPeers);
return offset;
}
/* dissect the AdjustPortState block */
static int
dissect_AdjustPortState_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16PortState;
guint16 u16AdjustProperties;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* PortState */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_port_state, &u16PortState);
/* AdjustProperties */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_adjust_properties, &u16AdjustProperties);
proto_item_append_text(item, ": PortState:%s, Properties:0x%x",
val_to_str(u16PortState, pn_io_port_state, "0x%x"),
u16AdjustProperties);
return offset;
}
/* dissect the CheckPortState block */
static int
dissect_CheckPortState_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16PortState;
/* PortState */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_port_state, &u16PortState);
proto_item_append_text(item, ": %s",
val_to_str(u16PortState, pn_io_port_state, "0x%x"));
return offset;
}
/* dissect the PDPortFODataReal block */
static int
dissect_PDPortFODataReal_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint16 u16BodyLength)
{
guint32 u32FiberOpticType;
guint32 u32FiberOpticCableType;
guint16 u16Index;
guint32 u32RecDataLen;
pnio_ar_t *ar = NULL;
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* FiberOpticType */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_fiber_optic_type, &u32FiberOpticType);
/* FiberOpticCableType */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_fiber_optic_cable_type, &u32FiberOpticCableType);
/* optional: FiberOpticManufacturerSpecific */
if(u16BodyLength != 10) {
dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
}
return offset;
}
/* dissect the FiberOpticManufacturerSpecific block */
static int
dissect_FiberOpticManufacturerSpecific_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint16 u16BodyLength)
{
guint8 u8VendorIDHigh;
guint8 u8VendorIDLow;
guint16 u16VendorBlockType;
/* x8 VendorIDHigh */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_vendor_id_high, &u8VendorIDHigh);
/* x8 VendorIDLow */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_vendor_id_low, &u8VendorIDLow);
/* VendorBlockType */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_vendor_block_type, &u16VendorBlockType);
/* Data */
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u16BodyLength-4, "Data");
return offset;
}
/* dissect the PDPortFODataAdjust block */
static int
dissect_PDPortFODataAdjust_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint32 u32FiberOpticType;
guint32 u32FiberOpticCableType;
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* FiberOpticType */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_fiber_optic_type, &u32FiberOpticType);
/* FiberOpticCableType */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_fiber_optic_cable_type, &u32FiberOpticCableType);
/*
proto_item_append_text(item, ": %s",
val_to_str(u16PortState, pn_io_port_state, "0x%x"));*/
return offset;
}
/* dissect the PDPortFODataCheck block */
static int
dissect_PDPortFODataCheck_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint32 u32FiberOpticPowerBudget;
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MaintenanceRequiredPowerBudget */
/* XXX - decode the u32FiberOpticPowerBudget better */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_maintenance_required_power_budget, &u32FiberOpticPowerBudget);
/* MaintenanceDemandedPowerBudget */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_maintenance_demanded_power_budget, &u32FiberOpticPowerBudget);
/* ErrorPowerBudget */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_error_power_budget, &u32FiberOpticPowerBudget);
/*
proto_item_append_text(item, ": %s",
val_to_str(u16PortState, pn_io_port_state, "0x%x"));*/
return offset;
}
/* dissect the PDNCDataCheck block */
static int
dissect_PDNCDataCheck_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint32 u32NCDropBudget;
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MaintenanceRequiredDropBudget */
/* XXX - decode the u32NCDropBudget better */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_maintenance_required_drop_budget, &u32NCDropBudget);
/* MaintenanceDemandedDropBudget */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_maintenance_demanded_drop_budget, &u32NCDropBudget);
/* ErrorDropBudget */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_error_drop_budget, &u32NCDropBudget);
/*
proto_item_append_text(item, ": %s",
val_to_str(u16PortState, pn_io_port_state, "0x%x"));*/
return offset;
}
/* dissect the PDInterfaceDataReal block */
static int
dissect_PDInterfaceDataReal_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint8 u8LengthOwnChassisID;
char *pOwnChassisID;
guint8 mac[6];
guint32 ip;
/* LengthOwnChassisID */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
hf_pn_io_length_own_chassis_id, &u8LengthOwnChassisID);
/* OwnChassisID */
pOwnChassisID = ep_alloc(u8LengthOwnChassisID+1);
tvb_memcpy(tvb, (guint8 *) pOwnChassisID, offset, u8LengthOwnChassisID);
pOwnChassisID[u8LengthOwnChassisID] = '\0';
proto_tree_add_string (tree, hf_pn_io_own_chassis_id, tvb, offset, u8LengthOwnChassisID, pOwnChassisID);
offset += u8LengthOwnChassisID;
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* MACAddressValue */
offset = dissect_pn_mac(tvb, offset, pinfo, tree, hf_pn_io_macadd, mac);
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* IPAddress */
offset = dissect_pn_ipv4(tvb, offset, pinfo, tree, hf_pn_io_ip_address, &ip);
/*proto_item_append_text(block_item, ", IP: %s", ip_to_str((guint8*)&ip));*/
/* Subnetmask */
offset = dissect_pn_ipv4(tvb, offset, pinfo, tree, hf_pn_io_subnetmask, &ip);
/*proto_item_append_text(block_item, ", Subnet: %s", ip_to_str((guint8*)&ip));*/
/* StandardGateway */
offset = dissect_pn_ipv4(tvb, offset, pinfo, tree, hf_pn_io_standard_gateway, &ip);
/*proto_item_append_text(block_item, ", Router: %s", ip_to_str((guint8*)&ip));*/
return offset;
}
/* dissect the PDSyncData block */
static int
dissect_PDSyncData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16SlotNr;
guint16 u16SubslotNr;
e_uuid_t uuid;
guint32 u32ReservedIntervalBegin;
guint32 u32ReservedIntervalEnd;
guint32 u32PLLWindow;
guint32 u32SyncSendFactor;
guint16 u16SendClockFactor;
guint16 u16SyncProperties;
guint16 u16SyncFrameAddress;
guint16 u16PTCPTimeoutFactor;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* PTCPSubdomainID */
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_ptcp_subdomain_id, &uuid);
/* IRDataID */
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_ir_data_id, &uuid);
/* ReservedIntervalBegin */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_reserved_interval_begin, &u32ReservedIntervalBegin);
/* ReservedIntervalEnd */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_reserved_interval_end, &u32ReservedIntervalEnd);
/* PLLWindow enum */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_pllwindow, &u32PLLWindow);
/* SyncSendFactor 32 enum */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_sync_send_factor, &u32SyncSendFactor);
/* SendClockFactor 16 */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_send_clock_factor, &u16SendClockFactor);
/* SyncProperties 16 bitfield */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_sync_properties, &u16SyncProperties);
/* SyncFrameAddress 16 bitfield */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_sync_frame_address, &u16SyncFrameAddress);
/* PTCPTimeoutFactor 16 enum */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_ptcp_timeout_factor, &u16PTCPTimeoutFactor);
proto_item_append_text(item, ": Slot:0x%x/0x%x, Interval:%u-%u, PLLWin:%u, Send:%u, Clock:%u",
u16SlotNr, u16SubslotNr, u32ReservedIntervalBegin, u32ReservedIntervalEnd,
u32PLLWindow, u32SyncSendFactor, u16SendClockFactor);
return offset;
}
/* dissect the PDIRData block */
static int
dissect_PDIRData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16SlotNr;
guint16 u16SubslotNr;
guint16 u16Index;
guint32 u32RecDataLen;
pnio_ar_t *ar = NULL;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
proto_item_append_text(item, ": Slot:0x%x/0x%x",
u16SlotNr, u16SubslotNr);
/* PDIRGlobalData */
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
/* PDIRFrameData */
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
return offset;
}
/* dissect the PDIRGlobalData block */
static int
dissect_PDIRGlobalData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
e_uuid_t uuid;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* IRDataID */
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_ir_data_id, &uuid);
return offset;
}
/* dissect the PDIRFrameData block */
static int
dissect_PDIRFrameData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint16 u16BodyLength)
{
guint32 u32FrameSendOffset;
guint16 u16DataLength;
guint16 u16ReductionRatio;
guint16 u16Phase;
guint16 u16FrameID;
guint16 u16Ethertype;
guint8 u8RXPort;
guint8 u8FrameDetails;
guint8 u8NumberOfTxPortGroups;
guint16 u16EndOffset;
proto_tree *ir_frame_data_tree = NULL;
proto_item *ir_frame_data_sub_item = NULL;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
u16EndOffset = offset + u16BodyLength -2;
/* dissect all IR frame data */
while (offset < u16EndOffset)
{
/* new subtree for each IR frame */
ir_frame_data_sub_item = proto_tree_add_item(tree, hf_pn_io_ir_frame_data, tvb, offset, 17, FALSE);
ir_frame_data_tree = proto_item_add_subtree(ir_frame_data_sub_item, ett_pn_io_ir_frame_data);
/* FrameSendOffset */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, ir_frame_data_tree, drep,
hf_pn_io_frame_send_offset, &u32FrameSendOffset);
/* DataLength */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, ir_frame_data_tree, drep,
hf_pn_io_data_length, &u16DataLength);
/* ReductionRatio */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, ir_frame_data_tree, drep,
hf_pn_io_reduction_ratio, &u16ReductionRatio);
/* Phase */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, ir_frame_data_tree, drep,
hf_pn_io_phase, &u16Phase);
/* FrameID */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, ir_frame_data_tree, drep,
hf_pn_io_frame_id, &u16FrameID);
/* Ethertype */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, ir_frame_data_tree, drep,
hf_pn_io_ethertype, &u16Ethertype);
/* RxPort */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, ir_frame_data_tree, drep,
hf_pn_io_rx_port, &u8RXPort);
/* FrameDetails */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, ir_frame_data_tree, drep,
hf_pn_io_frame_details, &u8FrameDetails);
/* TxPortGroup */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, ir_frame_data_tree, drep,
hf_pn_io_nr_of_tx_port_groups, &u8NumberOfTxPortGroups);
/* align to next dataset */
offset = dissect_pn_align4(tvb, offset, pinfo, ir_frame_data_tree);
proto_item_append_text(ir_frame_data_tree, ": Offset:%u, Len:%u, Ratio:%u, Phase:%u, FrameID:0x%04x",
u32FrameSendOffset, u16DataLength, u16ReductionRatio, u16Phase, u16FrameID);
}
return offset;
}
/* dissect the DiagnosisData block */
static int
dissect_DiagnosisData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint8 *drep _U_, guint16 body_length,
guint8 u8BlockVersionLow)
{
guint32 u32Api;
guint16 u16SlotNr;
guint16 u16SubslotNr;
guint16 u16ChannelNumber;
guint16 u16UserStructureIdentifier;
if(u8BlockVersionLow == 1) {
/* API */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_api, &u32Api);
body_length-=4;
}
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* ChannelNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_channel_number, &u16ChannelNumber);
/* ChannelProperties */
offset = dissect_ChannelProperties(tvb, offset, pinfo, tree, item, drep);
body_length-=8;
/* UserStructureIdentifier */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_user_structure_identifier, &u16UserStructureIdentifier);
proto_item_append_text(item, ", USI:0x%x", u16UserStructureIdentifier);
body_length-=2;
/* the rest of the block contains optional: [MaintenanceItem] and/or [AlarmItem] */
while(body_length) {
offset = dissect_AlarmUserStructure(tvb, offset, pinfo, tree, item, drep,
&body_length, u16UserStructureIdentifier);
}
return offset;
}
static int
dissect_ARProperties(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint8 *drep _U_)
{
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32ARProperties;
sub_item = proto_tree_add_item(tree, hf_pn_io_ar_properties, tvb, offset, 4, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_ar_properties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_pull_module_alarm_allowed, &u32ARProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_reserved, &u32ARProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_achnowledge_companion_ar, &u32ARProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_companion_ar, &u32ARProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_device_access, &u32ARProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_reserved_1, &u32ARProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_data_rate, &u32ARProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_parametrization_server, &u32ARProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_supervisor_takeover_allowed, &u32ARProperties);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_ar_properties_state, &u32ARProperties);
return offset;
}
/* dissect the IOCRProperties */
static int
dissect_IOCRProperties(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32IOCRProperties;
sub_item = proto_tree_add_item(tree, hf_pn_io_iocr_properties, tvb, offset, 4, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_iocr_properties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_iocr_properties_reserved_2, &u32IOCRProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_iocr_properties_media_redundancy, &u32IOCRProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_iocr_properties_reserved_1, &u32IOCRProperties);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_iocr_properties_rtclass, &u32IOCRProperties);
return offset;
}
/* dissect the ARData block */
static int
dissect_ARData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint8 *drep _U_)
{
guint16 u16NumberOfARs;
e_uuid_t aruuid;
e_uuid_t uuid;
guint16 u16ARType;
char *pStationName;
guint16 u16NameLength;
guint16 u16NumberOfIOCRs;
guint16 u16IOCRType;
guint16 u16FrameID;
guint16 u16CycleCounter;
guint8 u8DataStatus;
guint8 u8TransferStatus;
proto_item *ds_item;
proto_tree *ds_tree;
guint16 u16UDPRTPort;
guint16 u16AlarmCRType;
guint16 u16LocalAlarmReference;
guint16 u16RemoteAlarmReference;
guint16 u16NumberOfAPIs;
guint32 u32Api;
proto_item *iocr_item;
proto_tree *iocr_tree;
guint32 u32IOCRStart;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_ars, &u16NumberOfARs);
while(u16NumberOfARs--) {
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_ar_uuid, &aruuid);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_ar_type, &u16ARType);
offset = dissect_ARProperties(tvb, offset, pinfo, tree, item, drep);
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_cminitiator_objectuuid, &uuid);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_station_name_length, &u16NameLength);
pStationName = ep_alloc(u16NameLength+1);
tvb_memcpy(tvb, (guint8 *) pStationName, offset, u16NameLength);
pStationName[u16NameLength] = '\0';
proto_tree_add_string (tree, hf_pn_io_cminitiator_station_name, tvb, offset, u16NameLength, pStationName);
offset += u16NameLength;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_iocrs, &u16NumberOfIOCRs);
while(u16NumberOfIOCRs--) {
iocr_item = proto_tree_add_item(tree, hf_pn_io_iocr_tree, tvb, offset, 0, FALSE);
iocr_tree = proto_item_add_subtree(iocr_item, ett_pn_io_iocr);
u32IOCRStart = offset;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, iocr_tree, drep,
hf_pn_io_iocr_type, &u16IOCRType);
offset = dissect_IOCRProperties(tvb, offset, pinfo, iocr_tree, drep);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, iocr_tree, drep,
hf_pn_io_frame_id, &u16FrameID);
proto_item_append_text(iocr_item, ": FrameID:0x%x", u16FrameID);
/* add cycle counter */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, iocr_tree, drep,
hf_pn_io_cycle_counter, &u16CycleCounter);
u8DataStatus = tvb_get_guint8(tvb, offset);
u8TransferStatus = tvb_get_guint8(tvb, offset+1);
/* add data status subtree */
ds_item = proto_tree_add_uint_format(iocr_tree, hf_pn_io_data_status,
tvb, offset, 1, u8DataStatus,
"DataStatus: 0x%02x (Frame: %s and %s, Provider: %s and %s)",
u8DataStatus,
(u8DataStatus & 0x04) ? "Valid" : "Invalid",
(u8DataStatus & 0x01) ? "Primary" : "Backup",
(u8DataStatus & 0x20) ? "Ok" : "Problem",
(u8DataStatus & 0x10) ? "Run" : "Stop");
ds_tree = proto_item_add_subtree(ds_item, ett_pn_io_data_status);
proto_tree_add_uint(ds_tree, hf_pn_io_data_status_res67, tvb, offset, 1, u8DataStatus);
proto_tree_add_uint(ds_tree, hf_pn_io_data_status_ok, tvb, offset, 1, u8DataStatus);
proto_tree_add_uint(ds_tree, hf_pn_io_data_status_operate, tvb, offset, 1, u8DataStatus);
proto_tree_add_uint(ds_tree, hf_pn_io_data_status_res3, tvb, offset, 1, u8DataStatus);
proto_tree_add_uint(ds_tree, hf_pn_io_data_status_valid, tvb, offset, 1, u8DataStatus);
proto_tree_add_uint(ds_tree, hf_pn_io_data_status_res1, tvb, offset, 1, u8DataStatus);
proto_tree_add_uint(ds_tree, hf_pn_io_data_status_primary, tvb, offset, 1, u8DataStatus);
offset++;
/* add transfer status */
if (u8TransferStatus) {
proto_tree_add_uint_format(iocr_tree, hf_pn_io_transfer_status, tvb,
offset, 1, u8TransferStatus,
"TransferStatus: 0x%02x (ignore this frame)", u8TransferStatus);
} else {
proto_tree_add_uint_format(iocr_tree, hf_pn_io_transfer_status, tvb,
offset, 1, u8TransferStatus,
"TransferStatus: 0x%02x (OK)", u8TransferStatus);
}
offset++;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, iocr_tree, drep,
hf_pn_io_cminitiator_udprtport, &u16UDPRTPort);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, iocr_tree, drep,
hf_pn_io_cmresponder_udprtport, &u16UDPRTPort);
proto_item_set_len(iocr_item, offset - u32IOCRStart);
}
/* AlarmCRType */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_alarmcr_type, &u16AlarmCRType);
/* LocalAlarmReference */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_localalarmref, &u16LocalAlarmReference);
/* RemoteAlarmReference */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_remotealarmref, &u16RemoteAlarmReference);
/* ParameterServerObjectUUID */
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_parameter_server_objectuuid, &uuid);
/* StationNameLength */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_station_name_length, &u16NameLength);
/* ParameterServerStationName */
pStationName = ep_alloc(u16NameLength+1);
tvb_memcpy(tvb, (guint8 *) pStationName, offset, u16NameLength);
pStationName[u16NameLength] = '\0';
proto_tree_add_string (tree, hf_pn_io_parameter_server_station_name, tvb, offset, u16NameLength, pStationName);
offset += u16NameLength;
/* NumberOfAPIs */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_apis, &u16NumberOfAPIs);
/* API */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_api, &u32Api);
}
return offset;
}
/* dissect the APIData block */
static int
dissect_APIData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint8 *drep _U_)
{
guint16 u16NumberOfAPIs;
guint32 u32Api;
/* NumberOfAPIs */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_apis, &u16NumberOfAPIs);
while(u16NumberOfAPIs--) {
/* API */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_api, &u32Api);
}
return offset;
}
/* dissect the LogData block */
static int
dissect_LogData_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint64 u64ActualLocaltimeStamp;
guint16 u16NumberOfLogEntries;
guint64 u64LocaltimeStamp;
e_uuid_t aruuid;
guint32 u32EntryDetail;
/* ActualLocalTimeStamp */
offset = dissect_dcerpc_uint64(tvb, offset, pinfo, tree, drep,
hf_pn_io_actual_local_time_stamp, &u64ActualLocaltimeStamp);
/* NumberOfLogEntries */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_log_entries, &u16NumberOfLogEntries);
while(u16NumberOfLogEntries--) {
/* LocalTimeStamp */
offset = dissect_dcerpc_uint64(tvb, offset, pinfo, tree, drep,
hf_pn_io_local_time_stamp, &u64LocaltimeStamp);
/* ARUUID */
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_ar_uuid, &aruuid);
/* PNIOStatus */
offset = dissect_PNIO_status(tvb, offset, pinfo, tree, drep);
/* EntryDetail */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_entry_detail, &u32EntryDetail);
}
return offset;
}
/* dissect the FS Hello block */
static int
dissect_FSHello_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint32 u32FSHelloMode;
guint32 u32FSHelloInterval;
guint32 u32FSHelloRetry;
guint32 u32FSHelloDelay;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* FSHelloMode */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_fs_hello_mode, &u32FSHelloMode);
/* FSHelloInterval */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_fs_hello_interval, &u32FSHelloInterval);
/* FSHelloRetry */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_fs_hello_retry, &u32FSHelloRetry);
/* FSHelloDelay */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_fs_hello_delay, &u32FSHelloDelay);
proto_item_append_text(item, ": Mode:%s, Interval:%ums, Retry:%u, Delay:%ums",
val_to_str(u32FSHelloMode, pn_io_fs_hello_mode_vals, "0x%x"),
u32FSHelloInterval, u32FSHelloRetry, u32FSHelloDelay);
return offset;
}
/* dissect the FSUDataAdjust block */
static int
dissect_PDInterfaceFSUDataAdjust_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint16 u16BodyLength)
{
tvbuff_t *tvb_new;
/* Padding */
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
u16BodyLength -= 2;
/* sub blocks */
tvb_new = tvb_new_subset(tvb, offset, u16BodyLength, u16BodyLength);
dissect_blocks(tvb_new, 0, pinfo, tree, drep);
offset += u16BodyLength;
#if 0
proto_item_append_text(item, ": Mode:%s, Interval:%ums, Retry:%u, Delay:%ums",
val_to_str(u32FSHelloMode, pn_io_fs_hello_mode_vals, "0x%x"),
u32FSHelloInterval, u32FSHelloRetry, u32FSHelloDelay);
#endif
return offset;
}
/* dissect the ARBlockReq */
static int
dissect_ARBlockReq(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, pnio_ar_t ** ar)
{
guint16 u16ARType;
e_uuid_t aruuid;
e_uuid_t uuid;
guint16 u16SessionKey;
guint8 mac[6];
guint16 u16TimeoutFactor;
guint16 u16UDPRTPort;
guint16 u16NameLength;
char *pStationName;
pnio_ar_t * par;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_ar_type, &u16ARType);
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_ar_uuid, &aruuid);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_sessionkey, &u16SessionKey);
offset = dissect_pn_mac(tvb, offset, pinfo, tree,
hf_pn_io_cminitiator_macadd, mac);
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_cminitiator_objectuuid, &uuid);
offset = dissect_ARProperties(tvb, offset, pinfo, tree, item, drep);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_cminitiator_activitytimeoutfactor, &u16TimeoutFactor); /* XXX - special values */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_cminitiator_udprtport, &u16UDPRTPort);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_station_name_length, &u16NameLength);
pStationName = ep_alloc(u16NameLength+1);
tvb_memcpy(tvb, (guint8 *) pStationName, offset, u16NameLength);
pStationName[u16NameLength] = '\0';
proto_tree_add_string (tree, hf_pn_io_cminitiator_station_name, tvb, offset, u16NameLength, pStationName);
offset += u16NameLength;
proto_item_append_text(item, ": %s, Session:%u, MAC:%02x:%02x:%02x:%02x:%02x:%02x, Port:0x%x, Station:%s",
val_to_str(u16ARType, pn_io_ar_type, "0x%x"),
u16SessionKey,
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
u16UDPRTPort,
pStationName);
par = pnio_ar_find_by_aruuid(pinfo, &aruuid);
if(par == NULL) {
par = pnio_ar_new(&aruuid);
memcpy( (void *) (&par->controllermac), mac, sizeof(par->controllermac));
/*strncpy( (char *) (&par->controllername), pStationName, sizeof(par->controllername));*/
} else {
//expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "ARBlockReq: AR already existing!");
}
*ar = par;
return offset;
}
/* dissect the ARBlockRes */
static int
dissect_ARBlockRes(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, pnio_ar_t ** ar)
{
guint16 u16ARType;
e_uuid_t uuid;
guint16 u16SessionKey;
guint8 mac[6];
guint16 u16UDPRTPort;
pnio_ar_t * par;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_ar_type, &u16ARType);
offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
hf_pn_io_ar_uuid, &uuid);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_sessionkey, &u16SessionKey);
offset = dissect_pn_mac(tvb, offset, pinfo, tree,
hf_pn_io_cmresponder_macadd, mac);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_cmresponder_udprtport, &u16UDPRTPort);
proto_item_append_text(item, ": %s, Session:%u, MAC:%02x:%02x:%02x:%02x:%02x:%02x, Port:0x%x",
val_to_str(u16ARType, pn_io_ar_type, "0x%x"),
u16SessionKey,
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
u16UDPRTPort);
par = pnio_ar_find_by_aruuid(pinfo, &uuid);
if(par == NULL) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "ARBlockRes: AR not existing!");
} else {
memcpy( (void *) (&par->devicemac), mac, sizeof(par->controllermac));
}
*ar = par;
return offset;
}
/* dissect the IOCRBlockReq */
static int
dissect_IOCRBlockReq(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, pnio_ar_t *ar)
{
guint16 u16IOCRType;
guint16 u16IOCRReference;
guint16 u16LT;
guint16 u16DataLength;
guint16 u16FrameID;
guint16 u16SendClockFactor;
guint16 u16ReductionRatio;
guint16 u16Phase;
guint16 u16Sequence;
guint32 u32FrameSendOffset;
guint16 u16WatchdogFactor;
guint16 u16DataHoldFactor;
guint16 u16IOCRTagHeader;
guint8 mac[6];
guint16 u16NumberOfAPIs;
guint32 u32Api;
guint16 u16NumberOfIODataObjects;
guint16 u16SlotNr;
guint16 u16SubslotNr;
guint16 u16IODataObjectFrameOffset;
guint16 u16NumberOfIOCS;
guint16 u16IOCSFrameOffset;
proto_item *api_item;
proto_tree *api_tree;
guint32 u32ApiStart;
guint16 u16Tmp;
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32SubStart;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_iocr_type, &u16IOCRType);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_iocr_reference, &u16IOCRReference);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_lt, &u16LT);
offset = dissect_IOCRProperties(tvb, offset, pinfo, tree, drep);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_data_length, &u16DataLength);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_frame_id, &u16FrameID);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_send_clock_factor, &u16SendClockFactor);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_reduction_ratio, &u16ReductionRatio);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_phase, &u16Phase);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_sequence, &u16Sequence);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_frame_send_offset, &u32FrameSendOffset);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_watchdog_factor, &u16WatchdogFactor);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_data_hold_factor, &u16DataHoldFactor);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_iocr_tag_header, &u16IOCRTagHeader);
offset = dissect_pn_mac(tvb, offset, pinfo, tree,
hf_pn_io_iocr_multicast_mac_add, mac);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_apis, &u16NumberOfAPIs);
proto_item_append_text(item, ": %s, Ref:0x%x, Len:%u, FrameID:0x%x, Clock:%u, Ratio:%u, Phase:%u APIs:%u",
val_to_str(u16IOCRType, pn_io_iocr_type, "0x%x"),
u16IOCRReference, u16DataLength, u16FrameID,
u16SendClockFactor, u16ReductionRatio, u16Phase, u16NumberOfAPIs);
while(u16NumberOfAPIs--) {
api_item = proto_tree_add_item(tree, hf_pn_io_api_tree, tvb, offset, 0, FALSE);
api_tree = proto_item_add_subtree(api_item, ett_pn_io_api);
u32ApiStart = offset;
/* API */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_api, &u32Api);
/* NumberOfIODataObjects */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_number_of_io_data_objects, &u16NumberOfIODataObjects);
u16Tmp = u16NumberOfIODataObjects;
while(u16Tmp--) {
sub_item = proto_tree_add_item(api_tree, hf_pn_io_io_data_object, tvb, offset, 0, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_io_data_object);
u32SubStart = offset;
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* IODataObjectFrameOffset */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_io_data_object_frame_offset, &u16IODataObjectFrameOffset);
proto_item_append_text(sub_item, ": Slot: 0x%x, Subslot: 0x%x FrameOffset: %u",
u16SlotNr, u16SubslotNr, u16IODataObjectFrameOffset);
proto_item_set_len(sub_item, offset - u32SubStart);
}
/* NumberOfIOCS */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_number_of_iocs, &u16NumberOfIOCS);
u16Tmp = u16NumberOfIOCS;
while(u16Tmp--) {
sub_item = proto_tree_add_item(api_tree, hf_pn_io_io_cs, tvb, offset, 0, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_io_cs);
u32SubStart = offset;
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* IOCSFrameOffset */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_iocs_frame_offset, &u16IOCSFrameOffset);
proto_item_append_text(sub_item, ": Slot: 0x%x, Subslot: 0x%x FrameOffset: %u",
u16SlotNr, u16SubslotNr, u16IOCSFrameOffset);
proto_item_set_len(sub_item, offset - u32SubStart);
}
proto_item_append_text(api_item, ": %u, NumberOfIODataObjects: %u NumberOfIOCS: %u",
u32Api, u16NumberOfIODataObjects, u16NumberOfIOCS);
proto_item_set_len(api_item, offset - u32ApiStart);
}
if(ar != NULL) {
switch(u16IOCRType) {
case(1): /* Input CR */
if(ar->inputframeid != 0 && ar->inputframeid != u16FrameID) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IOCRBlockReq: input frameID changed from %u to %u!",
ar->inputframeid, u16FrameID);
}
ar->inputframeid = u16FrameID;
break;
case(2): /* Output CR */
#if 0
/* will usually contain invalid marker 0xffff here */
if(ar->outputframeid != 0 && ar->outputframeid != u16FrameID) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IOCRBlockReq: output frameID changed from %u to %u!",
ar->outputframeid, u16FrameID);
}
ar->outputframeid = u16FrameID;
#endif
break;
default:
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IOCRBlockReq: IOCRType %u undecoded!", u16IOCRType);
}
} else {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IOCRBlockReq: no corresponding AR found!");
}
return offset;
}
/* dissect the AlarmCRBlockReq */
static int
dissect_AlarmCRBlockReq(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, pnio_ar_t *ar)
{
guint16 u16AlarmCRType;
guint16 u16LT;
guint32 u32AlarmCRProperties;
guint16 u16RTATimeoutFactor;
guint16 u16RTARetries;
guint16 u16LocalAlarmReference;
guint16 u16MaxAlarmDataLength;
guint16 u16AlarmCRTagHeaderHigh;
guint16 u16AlarmCRTagHeaderLow;
proto_item *sub_item;
proto_tree *sub_tree;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_alarmcr_type, &u16AlarmCRType);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_lt, &u16LT);
sub_item = proto_tree_add_item(tree, hf_pn_io_alarmcr_properties, tvb, offset, 4, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_alarmcr_properties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_alarmcr_properties_reserved, &u32AlarmCRProperties);
dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_alarmcr_properties_transport, &u32AlarmCRProperties);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_alarmcr_properties_priority, &u32AlarmCRProperties);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_rta_timeoutfactor, &u16RTATimeoutFactor);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_rta_retries, &u16RTARetries);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_localalarmref, &u16LocalAlarmReference);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_maxalarmdatalength, &u16MaxAlarmDataLength);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_alarmcr_tagheaderhigh, &u16AlarmCRTagHeaderHigh);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_alarmcr_tagheaderlow, &u16AlarmCRTagHeaderLow);
proto_item_append_text(item, ": %s, LT:0x%x, TFactor:%u, Retries:%u, Ref:0x%x, Len:%u Tag:0x%x/0x%x",
val_to_str(u16AlarmCRType, pn_io_alarmcr_type, "0x%x"),
u16LT, u16RTATimeoutFactor, u16RTARetries, u16LocalAlarmReference, u16MaxAlarmDataLength,
u16AlarmCRTagHeaderHigh, u16AlarmCRTagHeaderLow);
if(ar != NULL) {
if(ar->controlleralarmref != 0xffff && ar->controlleralarmref != u16LocalAlarmReference) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "AlarmCRBlockReq: local alarm ref changed from %u to %u!",
ar->controlleralarmref, u16LocalAlarmReference);
}
ar->controlleralarmref = u16LocalAlarmReference;
} else {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "AlarmCRBlockReq: no corresponding AR found!");
}
return offset;
}
/* dissect the AlarmCRBlockRes */
static int
dissect_AlarmCRBlockRes(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, pnio_ar_t *ar)
{
guint16 u16AlarmCRType;
guint16 u16LocalAlarmReference;
guint16 u16MaxAlarmDataLength;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_alarmcr_type, &u16AlarmCRType);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_localalarmref, &u16LocalAlarmReference);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_maxalarmdatalength, &u16MaxAlarmDataLength);
proto_item_append_text(item, ": %s, Ref:0x%04x, MaxDataLen:%u",
val_to_str(u16AlarmCRType, pn_io_alarmcr_type, "0x%x"),
u16LocalAlarmReference, u16MaxAlarmDataLength);
if(ar != NULL) {
if(ar->devicealarmref != 0xffff && ar->devicealarmref != u16LocalAlarmReference) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "AlarmCRBlockRes: local alarm ref changed from %u to %u!",
ar->devicealarmref, u16LocalAlarmReference);
}
ar->devicealarmref = u16LocalAlarmReference;
} else {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "AlarmCRBlockRes: no corresponding AR found!");
}
return offset;
}
/* dissect the IOCRBlockRes */
static int
dissect_IOCRBlockRes(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, pnio_ar_t *ar)
{
guint16 u16IOCRType;
guint16 u16IOCRReference;
guint16 u16FrameID;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_iocr_type, &u16IOCRType);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_iocr_reference, &u16IOCRReference);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_frame_id, &u16FrameID);
proto_item_append_text(item, ": %s, Ref:0x%04x, FrameID:0x%04x",
val_to_str(u16IOCRType, pn_io_iocr_type, "0x%x"),
u16IOCRReference, u16FrameID);
if(ar != NULL) {
switch(u16IOCRType) {
case(1): /* Input CR */
if(ar->inputframeid != 0 && ar->inputframeid != u16FrameID) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IOCRBlockRes: input frameID changed from %u to %u!",
ar->inputframeid, u16FrameID);
}
ar->inputframeid = u16FrameID;
break;
case(2): /* Output CR */
if(ar->outputframeid != 0 && ar->outputframeid != u16FrameID) {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IOCRBlockRes: output frameID changed from %u to %u!",
ar->outputframeid, u16FrameID);
}
ar->outputframeid = u16FrameID;
break;
default:
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IOCRBlockRes: IOCRType %u undecoded!", u16IOCRType);
}
} else {
expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, "IOCRBlockRes: no corresponding AR found!");
}
return offset;
}
/* dissect the MCRBlockReq */
static int
dissect_MCRBlockReq(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16IOCRReference;
guint32 u32AddressResolutionProperties;
guint16 u16MCITimeoutFactor;
guint16 u16NameLength;
char *pStationName;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_iocr_reference, &u16IOCRReference);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_address_resolution_properties, &u32AddressResolutionProperties);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_mci_timeout_factor, &u16MCITimeoutFactor);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_station_name_length, &u16NameLength);
pStationName = ep_alloc(u16NameLength+1);
tvb_memcpy(tvb, (guint8 *) pStationName, offset, u16NameLength);
pStationName[u16NameLength] = '\0';
proto_tree_add_string (tree, hf_pn_io_provider_station_name, tvb, offset, u16NameLength, pStationName);
offset += u16NameLength;
proto_item_append_text(item, ", CRRef:%u, Properties:0x%x, TFactor:%u, Station:%s",
u16IOCRReference, u32AddressResolutionProperties, u16MCITimeoutFactor, pStationName);
return offset;
}
/* dissect the DataDescription */
static int
dissect_DataDescription(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
guint16 u16DataDescription;
guint16 u16SubmoduleDataLength;
guint8 u8LengthIOCS;
guint8 u8LengthIOPS;
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32SubStart;
sub_item = proto_tree_add_item(tree, hf_pn_io_data_description_tree, tvb, offset, 0, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_data_description);
u32SubStart = offset;
/* DataDescription */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_data_description, &u16DataDescription);
/* SubmoduleDataLength */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_submodule_data_length, &u16SubmoduleDataLength);
/* LengthIOCS */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_length_iocs, &u8LengthIOCS);
/* LengthIOPS */
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_length_iops, &u8LengthIOPS);
proto_item_append_text(sub_item, ": %s, SubmoduleDataLength: %u, LengthIOCS: %u, u8LengthIOPS: %u",
val_to_str(u16DataDescription, pn_io_data_description, "(0x%x)"),
u16SubmoduleDataLength, u8LengthIOCS, u8LengthIOPS);
proto_item_set_len(sub_item, offset - u32SubStart);
return offset;
}
/* dissect the ExpectedSubmoduleBlockReq */
static int
dissect_ExpectedSubmoduleBlockReq(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16NumberOfAPIs;
guint32 u32Api;
guint16 u16SlotNr;
guint32 u32ModuleIdentNumber;
guint16 u16ModuleProperties;
guint16 u16NumberOfSubmodules;
guint16 u16SubslotNr;
guint32 u32SubmoduleIdentNumber;
guint16 u16SubmoduleProperties;
proto_item *api_item;
proto_tree *api_tree;
guint32 u32ApiStart;
proto_item *sub_item;
proto_tree *sub_tree;
proto_item *submodule_item;
proto_tree *submodule_tree;
guint32 u32SubStart;
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_apis, &u16NumberOfAPIs);
proto_item_append_text(item, ": APIs:%u", u16NumberOfAPIs);
while(u16NumberOfAPIs--) {
api_item = proto_tree_add_item(tree, hf_pn_io_api_tree, tvb, offset, 0, FALSE);
api_tree = proto_item_add_subtree(api_item, ett_pn_io_api);
u32ApiStart = offset;
/* API */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_api, &u32Api);
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* ModuleIdentNumber */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_module_ident_number, &u32ModuleIdentNumber);
/* ModuleProperties */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_module_properties, &u16ModuleProperties);
/* NumberOfSubmodules */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_number_of_submodules, &u16NumberOfSubmodules);
proto_item_append_text(api_item, ": %u, Slot:0x%x, IdentNumber:0x%x Properties:0x%x Submodules:%u",
u32Api, u16SlotNr, u32ModuleIdentNumber, u16ModuleProperties, u16NumberOfSubmodules);
proto_item_append_text(item, ", Submodules:%u", u16NumberOfSubmodules);
while(u16NumberOfSubmodules--) {
sub_item = proto_tree_add_item(api_tree, hf_pn_io_submodule_tree, tvb, offset, 0, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_submodule);
u32SubStart = offset;
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* SubmoduleIdentNumber */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber);
/* SubmoduleProperties */
submodule_item = proto_tree_add_item(sub_tree, hf_pn_io_submodule_properties, tvb, offset, 2, FALSE);
submodule_tree = proto_item_add_subtree(submodule_item, ett_pn_io_submodule_properties);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_properties_reserved, &u16SubmoduleProperties);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_properties_discard_ioxs, &u16SubmoduleProperties);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_properties_reduce_output_submodule_data_length, &u16SubmoduleProperties);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_properties_reduce_input_submodule_data_length, &u16SubmoduleProperties);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_properties_shared_input, &u16SubmoduleProperties);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_properties_type, &u16SubmoduleProperties);
switch(u16SubmoduleProperties & 0x03) {
case(0x00): /* no input and no output data (one Input DataDescription Block follows) */
offset = dissect_DataDescription(tvb, offset, pinfo, sub_tree, drep);
break;
case(0x01): /* input data (one Input DataDescription Block follows) */
offset = dissect_DataDescription(tvb, offset, pinfo, sub_tree, drep);
break;
case(0x02): /* output data (one Output DataDescription Block follows) */
offset = dissect_DataDescription(tvb, offset, pinfo, sub_tree, drep);
break;
case(0x03): /* input and output data (one Input and one Output DataDescription Block follows) */
offset = dissect_DataDescription(tvb, offset, pinfo, sub_tree, drep);
offset = dissect_DataDescription(tvb, offset, pinfo, sub_tree, drep);
break;
}
proto_item_append_text(sub_item, ": Subslot:0x%x, Ident:0x%x Properties:0x%x",
u16SubslotNr, u32SubmoduleIdentNumber, u16SubmoduleProperties);
proto_item_set_len(sub_item, offset - u32SubStart);
}
proto_item_set_len(api_item, offset - u32ApiStart);
}
return offset;
}
/* dissect the ModuleDiffBlock */
static int
dissect_ModuleDiffBlock(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
{
guint16 u16NumberOfAPIs;
guint32 u32Api;
guint16 u16NumberOfModules;
guint16 u16SlotNr;
guint32 u32ModuleIdentNumber;
guint16 u16ModuleState;
guint16 u16NumberOfSubmodules;
guint16 u16SubslotNr;
guint32 u32SubmoduleIdentNumber;
guint16 u16SubmoduleState;
proto_item *api_item;
proto_tree *api_tree;
guint32 u32ApiStart;
proto_item *module_item;
proto_tree *module_tree;
guint32 u32ModuleStart;
proto_item *sub_item;
proto_tree *sub_tree;
proto_item *submodule_item;
proto_tree *submodule_tree;
guint32 u32SubStart;
/* NumberOfAPIs */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_number_of_apis, &u16NumberOfAPIs);
proto_item_append_text(item, ": APIs:%u", u16NumberOfAPIs);
while(u16NumberOfAPIs--) {
api_item = proto_tree_add_item(tree, hf_pn_io_api_tree, tvb, offset, 0, FALSE);
api_tree = proto_item_add_subtree(api_item, ett_pn_io_api);
u32ApiStart = offset;
/* API */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_api, &u32Api);
/* NumberOfModules */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, api_tree, drep,
hf_pn_io_number_of_modules, &u16NumberOfModules);
proto_item_append_text(api_item, ": %u, Modules: %u",
u32Api, u16NumberOfModules);
proto_item_append_text(item, ", Modules:%u", u16NumberOfModules);
while(u16NumberOfModules--) {
module_item = proto_tree_add_item(api_tree, hf_pn_io_module_tree, tvb, offset, 0, FALSE);
module_tree = proto_item_add_subtree(module_item, ett_pn_io_module);
u32ModuleStart = offset;
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, module_tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* ModuleIdentNumber */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, module_tree, drep,
hf_pn_io_module_ident_number, &u32ModuleIdentNumber);
/* ModuleState */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, module_tree, drep,
hf_pn_io_module_state, &u16ModuleState);
/* NumberOfSubmodules */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, module_tree, drep,
hf_pn_io_number_of_submodules, &u16NumberOfSubmodules);
proto_item_append_text(module_item, ": Slot 0x%x, Ident: 0x%x State: %s Submodules: %u",
u16SlotNr, u32ModuleIdentNumber,
val_to_str(u16ModuleState, pn_io_module_state, "(0x%x)"),
u16NumberOfSubmodules);
proto_item_append_text(item, ", Submodules:%u", u16NumberOfSubmodules);
while(u16NumberOfSubmodules--) {
sub_item = proto_tree_add_item(module_tree, hf_pn_io_submodule_tree, tvb, offset, 0, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_submodule);
u32SubStart = offset;
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* SubmoduleIdentNumber */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber);
/* SubmoduleState */
submodule_item = proto_tree_add_item(sub_tree, hf_pn_io_submodule_state, tvb, offset, 2, FALSE);
submodule_tree = proto_item_add_subtree(submodule_item, ett_pn_io_submodule_state);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_state_format_indicator, &u16SubmoduleState);
if(u16SubmoduleState & 0x8000) {
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_state_ident_info, &u16SubmoduleState);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_state_ar_info, &u16SubmoduleState);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_state_diag_info, &u16SubmoduleState);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_state_maintenance_demanded, &u16SubmoduleState);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_state_maintenance_required, &u16SubmoduleState);
dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_state_qualified_info, &u16SubmoduleState);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_state_add_info, &u16SubmoduleState);
} else {
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, submodule_tree, drep,
hf_pn_io_submodule_state_detail, &u16SubmoduleState);
}
proto_item_append_text(sub_item, ": Subslot 0x%x, IdentNumber: 0x%x, State: 0x%x",
u16SubslotNr, u32SubmoduleIdentNumber, u16SubmoduleState);
proto_item_set_len(sub_item, offset - u32SubStart);
} /* NumberOfSubmodules */
proto_item_set_len(module_item, offset - u32ModuleStart);
}
proto_item_set_len(api_item, offset - u32ApiStart);
}
return offset;
}
/* dissect the IsochronousModeData block */
static int
dissect_IsochronousModeData(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
{
guint16 u16SlotNr;
guint16 u16SubslotNr;
guint16 u16ControllerApplicationCycleFactor;
guint16 u16TimeDataCycle;
guint32 u32TimeIOInput;
guint32 u32TimeIOOutput;
guint32 u32TimeIOInputValid;
guint32 u32TimeIOOutputValid;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
/* SlotNumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
/* Subslotnumber */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
/* ControllerApplicationCycleFactor */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_controller_appl_cycle_factor, &u16ControllerApplicationCycleFactor);
/* TimeDataCycle */
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_time_data_cycle, &u16TimeDataCycle);
/* TimeIOInput (ns) */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_time_io_input, &u32TimeIOInput);
/* TimeIOOutput (ns) */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_time_io_output, &u32TimeIOOutput);
/* TimeIOInputValid (ns) */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_time_io_input_valid, &u32TimeIOInputValid);
/* TimeIOOutputValid (ns) */
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_time_io_output_valid, &u32TimeIOOutputValid);
return offset+1;
}
/* dissect the MultipleBlockHeader block */
static int
dissect_MultipleBlockHeader_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 u16BodyLength)
{
guint32 u32Api;
guint16 u16SlotNr;
guint16 u16SubslotNr;
tvbuff_t *tvb_new;
offset = dissect_pn_align4(tvb, offset, pinfo, tree);
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_api, &u32Api);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_slot_nr, &u16SlotNr);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
hf_pn_io_subslot_nr, &u16SubslotNr);
proto_item_append_text(item, ": Api:0x%x Slot:%u Subslot:0x%x",
u32Api, u16SlotNr, u16SubslotNr);
tvb_new = tvb_new_subset(tvb, offset, u16BodyLength-10, u16BodyLength-10);
offset = dissect_blocks(tvb_new, 0, pinfo, tree, drep);
/*offset += u16BodyLength;*/
return offset;
}
static const gchar *
indexReservedForProfiles(guint16 u16Index)
{
/* "reserved for profiles" */
if(u16Index >= 0xb000 && u16Index <= 0xbfff) {
return "Reserved for Profiles (subslot specific)";
}
if(u16Index >= 0xd000 && u16Index <= 0xdfff) {
return "Reserved for Profiles (slot specific)";
}
if(u16Index >= 0xec00 && u16Index <= 0xefff) {
return "Reserved for Profiles (AR specific)";
}
if(u16Index >= 0xf400 && u16Index <= 0xf7ff) {
return "Reserved for Profiles (API specific)";
}
if(u16Index >= 0xfc00 /* up to 0xffff */) {
return "Reserved for Profiles (device specific)";
}
return NULL;
}
/* dissect the RecordDataReadQuery block */
static int
dissect_RecordDataReadQuery_block(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint8 *drep _U_,
guint16 u16Index, guint16 u16BodyLength)
{
const gchar *userProfile;
/* user specified format? */
if(u16Index < 0x8000) {
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u16BodyLength, "User Specified Data");
return offset;
}
/* "reserved for profiles"? */
userProfile = indexReservedForProfiles(u16Index);
if(userProfile != NULL) {
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u16BodyLength, userProfile);
return offset;
}
return dissect_pn_undecoded(tvb, offset, pinfo, tree, u16BodyLength);
}
/* dissect one PN-IO block (depending on the block type) */
static int
dissect_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t **ar)
{
guint16 u16BlockType;
guint16 u16BlockLength;
guint8 u8BlockVersionHigh;
guint8 u8BlockVersionLow;
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32SubStart;
guint16 u16BodyLength;
proto_item *header_item;
proto_tree *header_tree;
/* from here, we only have big endian (network byte ordering)!!! */
drep[0] &= ~0x10;
sub_item = proto_tree_add_item(tree, hf_pn_io_block, tvb, offset, 0, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_block);
u32SubStart = offset;
header_item = proto_tree_add_item(sub_tree, hf_pn_io_block_header, tvb, offset, 6, FALSE);
header_tree = proto_item_add_subtree(header_item, ett_pn_io_block_header);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, header_tree, drep,
hf_pn_io_block_type, &u16BlockType);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, header_tree, drep,
hf_pn_io_block_length, &u16BlockLength);
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, header_tree, drep,
hf_pn_io_block_version_high, &u8BlockVersionHigh);
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, header_tree, drep,
hf_pn_io_block_version_low, &u8BlockVersionLow);
proto_item_append_text(header_item, ": Type=%s, Length=%u(+4), Version=%u.%u",
val_to_str(u16BlockType, pn_io_block_type, "Unknown (0x%04x)"),
u16BlockLength, u8BlockVersionHigh, u8BlockVersionLow);
proto_item_set_text(sub_item, "%s",
val_to_str(u16BlockType, pn_io_block_type, "Unknown (0x%04x)"));
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", %s",
val_to_str(u16BlockType, pn_io_block_type, "Unknown"));
/* block length is without type and length fields, but with version field */
/* as it's already dissected, remove it */
u16BodyLength = u16BlockLength - 2;
tvb_ensure_bytes_exist(tvb, offset, u16BodyLength);
switch(u16BlockType) {
case(0x0001):
case(0x0002):
dissect_AlarmNotification_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength);
break;
case(0x0008):
dissect_IODWriteReqHeader_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen, ar);
break;
case(0x0009):
dissect_IODReadReqHeader_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen, ar);
break;
case(0x0010):
dissect_DiagnosisData_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength, u8BlockVersionLow);
break;
case(0x0012): /* ExpectedIdentificationData */
case(0x0013): /* RealIdentificationData */
dissect_IdentificationData_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u8BlockVersionLow);
break;
case(0x0014):
dissect_SubstituteValue_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength);
break;
case(0x0015):
dissect_RecordInputDataObjectElement_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0016):
dissect_RecordOutputDataObjectElement_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
/* 0x0017 reserved */
case(0x0018):
dissect_ARData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0019):
dissect_LogData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x001A):
dissect_APIData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0020):
dissect_IandM0_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0021):
dissect_IandM1_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0022):
dissect_IandM2_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0023):
dissect_IandM3_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0024):
dissect_IandM4_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0030):
dissect_IandM0FilterData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0031):
dissect_IandM0FilterData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0032):
dissect_IandM0FilterData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0101):
dissect_ARBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep, ar);
break;
case(0x0102):
dissect_IOCRBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep, *ar);
break;
case(0x0103):
dissect_AlarmCRBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep, *ar);
break;
case(0x0104):
dissect_ExpectedSubmoduleBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0106):
dissect_MCRBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0110):
case(0x0111):
case(0x0112):
case(0x0113):
case(0x0114):
dissect_ControlConnect_block(tvb, offset, pinfo, sub_tree, sub_item, drep, ar);
break;
case(0x0200):
dissect_PDPortData_Check_Adjust_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength);
break;
case(0x0201):
dissect_PDevData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0202):
dissect_PDPortData_Check_Adjust_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength);
break;
case(0x0203):
dissect_PDSyncData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0204):
dissect_IsochronousModeData(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0205):
dissect_PDIRData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0206):
dissect_PDIRGlobalData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0207):
dissect_PDIRFrameData_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength);
break;
case(0x0209):
dissect_AdjustDomainBoundary_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x020A):
dissect_CheckPeers_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x020B):
dissect_CheckLineDelay_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x020C):
dissect_CheckMAUType_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x020E):
dissect_AdjustMAUType_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x020F):
dissect_PDPortDataReal_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0210):
dissect_AdjustMulticastBoundary_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0211):
dissect_PDInterfaceMrpDataAdjust_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0212):
dissect_PDInterfaceMrpDataReal_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0213):
dissect_PDInterfaceMrpDataCheck_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0214):
case(0x0215):
dissect_PDPortMrpData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0216):
dissect_MrpManagerParams_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0217):
dissect_MrpClientParams_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0218):
dissect_MrpRTModeManagerData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0219):
dissect_MrpRingStateData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x021A):
dissect_MrpRTStateData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x021B):
dissect_AdjustPortState_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x021C):
dissect_CheckPortState_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x021D):
dissect_MrpRTModeClientData_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x021E):
dissect_CheckSyncDifference_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x021F):
dissect_CheckMAUTypeDifference_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0220):
dissect_PDPortFODataReal_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength);
break;
case(0x0221):
dissect_FiberOpticManufacturerSpecific_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength);
break;
case(0x0222):
dissect_PDPortFODataAdjust_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0223):
dissect_PDPortFODataCheck_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0230):
dissect_PDNCDataCheck_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0240):
dissect_PDInterfaceDataReal_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0400):
dissect_MultipleBlockHeader_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength);
break;
case(0x0500):
dissect_RecordDataReadQuery_block(tvb, offset, pinfo, sub_tree, sub_item, drep, *u16Index, u16BodyLength);
break;
case(0x0600):
dissect_FSHello_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x0608):
dissect_PDInterfaceFSUDataAdjust_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength);
break;
case(0x0f00):
dissect_Maintenance_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x8001):
case(0x8002):
dissect_Alarm_ack_block(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x8008):
dissect_IODWriteResHeader_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen, ar);
break;
case(0x8009):
dissect_IODReadResHeader_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen, ar);
break;
case(0x8101):
dissect_ARBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep, ar);
break;
case(0x8102):
dissect_IOCRBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep, *ar);
break;
case(0x8103):
dissect_AlarmCRBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep, *ar);
break;
case(0x8104):
dissect_ModuleDiffBlock(tvb, offset, pinfo, sub_tree, sub_item, drep);
break;
case(0x8110):
case(0x8111):
case(0x8112):
case(0x8113):
case(0x8114):
dissect_ControlConnect_block(tvb, offset, pinfo, sub_tree, sub_item, drep, ar);
break;
default:
dissect_pn_undecoded(tvb, offset, pinfo, sub_tree, u16BodyLength);
}
offset += u16BodyLength;
proto_item_set_len(sub_item, offset - u32SubStart);
return offset;
}
/* dissect any number of PN-IO blocks */
static int
dissect_blocks(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
guint16 u16Index = 0;
guint32 u32RecDataLen;
pnio_ar_t *ar = NULL;
while(tvb_length(tvb) > (guint) offset) {
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
u16Index++;
}
if(ar != NULL) {
pnio_ar_info(tvb, pinfo, tree, ar);
}
return offset;
}
/* dissect a PN-IO (DCE-RPC) request header */
static int
dissect_IPNIO_rqst_header(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
guint32 u32ArgsMax;
guint32 u32ArgsLen;
guint32 u32MaxCount;
guint32 u32Offset;
guint32 u32ArraySize;
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32SubStart;
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_add_str(pinfo->cinfo, COL_PROTOCOL, "PNIO-CM");
/* args_max */
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_args_max, &u32ArgsMax);
/* args_len */
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_args_len, &u32ArgsLen);
sub_item = proto_tree_add_item(tree, hf_pn_io_array, tvb, offset, 0, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io);
u32SubStart = offset;
/* RPC array header */
offset = dissect_ndr_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_array_max_count, &u32MaxCount);
offset = dissect_ndr_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_array_offset, &u32Offset);
offset = dissect_ndr_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_array_act_count, &u32ArraySize);
proto_item_append_text(sub_item, ": Max: %u, Offset: %u, Size: %u",
u32MaxCount, u32Offset, u32ArraySize);
proto_item_set_len(sub_item, offset - u32SubStart);
return offset;
}
/* dissect a PN-IO (DCE-RPC) response header */
static int
dissect_IPNIO_resp_header(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
guint32 u32ArgsLen;
guint32 u32MaxCount;
guint32 u32Offset;
guint32 u32ArraySize;
proto_item *sub_item;
proto_tree *sub_tree;
guint32 u32SubStart;
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_add_str(pinfo->cinfo, COL_PROTOCOL, "PNIO-CM");
offset = dissect_PNIO_status(tvb, offset, pinfo, tree, drep);
/* args_len */
offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_args_len, &u32ArgsLen);
sub_item = proto_tree_add_item(tree, hf_pn_io_array, tvb, offset, 0, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io);
u32SubStart = offset;
/* RPC array header */
offset = dissect_ndr_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_array_max_count, &u32MaxCount);
offset = dissect_ndr_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_array_offset, &u32Offset);
offset = dissect_ndr_uint32(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_array_act_count, &u32ArraySize);
proto_item_append_text(sub_item, ": Max: %u, Offset: %u, Size: %u",
u32MaxCount, u32Offset, u32ArraySize);
proto_item_set_len(sub_item, offset - u32SubStart);
return offset;
}
/* dissect a PN-IO request */
static int
dissect_IPNIO_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
offset = dissect_IPNIO_rqst_header(tvb, offset, pinfo, tree, drep);
offset = dissect_blocks(tvb, offset, pinfo, tree, drep);
return offset;
}
/* dissect a PN-IO response */
static int
dissect_IPNIO_resp(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
offset = dissect_IPNIO_resp_header(tvb, offset, pinfo, tree, drep);
offset = dissect_blocks(tvb, offset, pinfo, tree, drep);
return offset;
}
static int
dissect_RecordDataRead(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 u16Index, guint32 u32RecDataLen)
{
const gchar *userProfile;
pnio_ar_t *ar = NULL;
/* user specified format? */
if(u16Index < 0x8000) {
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u32RecDataLen, "User Specified Data");
return offset;
}
/* "reserved for profiles"? */
userProfile = indexReservedForProfiles(u16Index);
if(userProfile != NULL) {
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u32RecDataLen, userProfile);
return offset;
}
/* see: pn_io_index */
/* single block only */
switch(u16Index) {
case(0x8010): /* Maintenance required in channel coding for one subslot */
case(0x8011): /* Maintenance demanded in channel coding for one subslot */
case(0x8012): /* Maintenance required in all codings for one subslot */
case(0x8013): /* Maintenance demanded in all codings for one subslot */
case(0x801e): /* SubstituteValues for one subslot */
case(0x8028): /* RecordInputDataObjectElement for one subslot */
case(0x8029): /* RecordOutputDataObjectElement for one subslot */
case(0x8050): /* PDInterfaceMrpDataReal for one subslot */
case(0x8051): /* PDInterfaceMrpDataCheck for one subslot */
case(0x8052): /* PDInterfaceMrpDataAdjust for one subslot */
case(0x8053): /* PDPortMrpDataAdjust for one subslot */
case(0x8054): /* PDPortMrpDataReal for one subslot */
case(0x8060): /* PDPortFODataReal for one subslot */
case(0x8061): /* PDPortFODataCheck for one subslot */
case(0x8062): /* PDPortFODataAdjust for one subslot */
case(0x8070): /* PDNCDataCheck for one subslot */
case(0x8080): /* PDInterfaceDataReal */
case(0x8090): /* PDInterfaceFSUDataAdjust */
case(0xaff0): /* I&M0 */
case(0xaff1): /* I&M1 */
case(0xaff2): /* I&M2 */
case(0xaff3): /* I&M3 */
case(0xaff4): /* I&M4 */
case(0xaff5): /* I&M5 */
case(0xaff6): /* I&M6 */
case(0xaff7): /* I&M7 */
case(0xaff8): /* I&M8 */
case(0xaff9): /* I&M9 */
case(0xaffa): /* I&M10 */
case(0xaffb): /* I&M11 */
case(0xaffc): /* I&M12 */
case(0xaffd): /* I&M13 */
case(0xaffe): /* I&M14 */
case(0xafff): /* I&M15 */
case(0xc010): /* Maintenance required in channel coding for one slot */
case(0xc011): /* Maintenance demanded in channel coding for one slot */
case(0xc012): /* Maintenance required in all codings for one slot */
case(0xc013): /* Maintenance demanded in all codings for one slot */
case(0xe002): /* ModuleDiffBlock for one AR */
case(0xe010): /* Maintenance required in channel coding for one AR */
case(0xe011): /* Maintenance demanded in channel coding for one AR */
case(0xe012): /* Maintenance required in all codings for one AR */
case(0xe013): /* Maintenance demanded in all codings for one AR */
case(0xf010): /* Maintenance required in channel coding for one API */
case(0xf011): /* Maintenance demanded in channel coding for one API */
case(0xf012): /* Maintenance required in all codings for one API */
case(0xf013): /* Maintenance demanded in all codings for one API */
case(0xf020): /* ARData for one API */
case(0xf820): /* ARData */
case(0xf821): /* APIData */
case(0xf830): /* LogData */
case(0xf831): /* PDevData */
case(0xf840): /* I&M0FilterData */
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
break;
/*** multiple blocks possible ***/
case(0x8000): /* ExpectedIdentificationData for one subslot */
case(0x8001): /* RealIdentificationData for one subslot */
case(0x800a): /* Diagnosis in channel decoding for one subslot */
case(0x800b): /* Diagnosis in all codings for one subslot */
case(0x800c): /* Diagnosis, Maintenance, Qualified and Status for one subslot */
case(0x802a): /* PDPortDataReal */
case(0x802b): /* PDPortDataCheck */
case(0x802d): /* Expected PDSyncData for one subslot with SyncID value 0 for PTCPoverRTA */
case(0x802e): /* Expected PDSyncData for one subslot with SyncID value 0 for PTCPoverRTC */
case(0x802f): /* PDPortDataAdjust */
case(0x8030): /* IsochronousModeData for one subslot */
case(0x8031): /* Expected PDSyncData for one subslot with SyncID value 1 */
case(0x8032):
case(0x8033):
case(0x8034):
case(0x8035):
case(0x8036):
case(0x8037):
case(0x8038):
case(0x8039):
case(0x803a):
case(0x803b):
case(0x803c):
case(0x803d):
case(0x803e):
case(0x803f):
case(0x8040): /* Expected PDSyncData for one subslot with SyncID value 2 ... 30 */
case(0x8041):
case(0x8042):
case(0x8043):
case(0x8044):
case(0x8045):
case(0x8046):
case(0x8047):
case(0x8048):
case(0x8049):
case(0x804a):
case(0x804b):
case(0x804c):
case(0x804d):
case(0x804e):
case(0x804f): /* Expected PDSyncData for one subslot with SyncID value 31 */
case(0xc000): /* ExpectedIdentificationData for one slot */
case(0xc001): /* RealIdentificationData for one slot */
case(0xc00a): /* Diagnosis in channel coding for one slot */
case(0xc00b): /* Diagnosis in all codings for one slot */
case(0xc00c): /* Diagnosis, Maintenance, Qualified and Status for one slot */
case(0xe000): /* ExpectedIdentificationData for one AR */
case(0xe001): /* RealIdentificationData for one AR */
case(0xe00a): /* Diagnosis in channel decoding for one AR */
case(0xe00b): /* Diagnosis in all codings for one AR */
case(0xe00c): /* Diagnosis, Maintenance, Qualified and Status for one AR */
case(0xe030): /* IsochronousModeData for one AR */
case(0xf000): /* RealIdentificationData for one API */
case(0xf00a): /* Diagnosis in channel decoding for one API */
case(0xf00b): /* Diagnosis in all codings for one API */
case(0xf00c): /* Diagnosis, Maintenance, Qualified and Status for one API */
case(0xf80c): /* Diagnosis, Maintenance, Qualified and Status for one device */
case(0xf841): /* PDRealData */
case(0xf842): /* PDExpectedData */
offset = dissect_blocks(tvb, offset, pinfo, tree, drep);
break;
default:
offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, u32RecDataLen);
}
return offset;
}
/* dissect a PN-IO read response */
static int
dissect_IPNIO_Read_resp(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
guint16 u16Index = 0;
guint32 u32RecDataLen;
pnio_ar_t *ar = NULL;
offset = dissect_IPNIO_resp_header(tvb, offset, pinfo, tree, drep);
/* IODReadHeader */
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
/* RecordDataRead */
if(u32RecDataLen != 0) {
offset = dissect_RecordDataRead(tvb, offset, pinfo, tree, drep, u16Index, u32RecDataLen);
}
if(ar != NULL) {
pnio_ar_info(tvb, pinfo, tree, ar);
}
return offset;
}
static int
dissect_RecordDataWrite(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 u16Index, guint32 u32RecDataLen)
{
const gchar *userProfile;
pnio_ar_t *ar = NULL;
/* user specified format? */
if(u16Index < 0x8000) {
return dissect_pn_user_data(tvb, offset, pinfo, tree, u32RecDataLen, "User Specified Data");
}
/* "reserved for profiles"? */
userProfile = indexReservedForProfiles(u16Index);
if(userProfile != NULL) {
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u32RecDataLen, userProfile);
return offset;
}
/* see: pn_io_index */
switch(u16Index) {
case(0x801e): /* SubstituteValues for one subslot */
case(0x802b): /* PDPortDataCheck for one subslot */
case(0x802c): /* PDirData for one subslot */
case(0x802d): /* Expected PDSyncData for one subslot with SyncID value 0 for PTCPoverRTA */
case(0x802e): /* Expected PDSyncData for one subslot with SyncID value 0 for PTCPoverRTC */
case(0x802f): /* PDPortDataAdjust for one subslot */
case(0x8030): /* IsochronousModeData for one subslot */
case(0x8051): /* PDInterfaceMrpDataCheck for one subslot */
case(0x8052): /* PDInterfaceMrpDataAdjust for one subslot */
case(0x8053): /* PDPortMrpDataAdjust for one subslot */
case(0x8061): /* PDPortFODataCheck for one subslot */
case(0x8062): /* PDPortFODataAdjust for one subslot */
case(0x8070): /* PDNCDataCheck for one subslot */
case(0x8090): /* PDInterfaceFSUDataAdjust */
case(0xe030): /* IsochronousModeData for one AR */
case(0xe050): /* FastStartUp data for one AR */
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
break;
default:
offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, u32RecDataLen);
}
return offset;
}
static int
dissect_IODWriteReq(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep, pnio_ar_t **ar)
{
gint remain;
guint16 u16Index = 0;
guint32 u32RecDataLen;
/* IODWriteHeader */
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, ar);
/* IODWriteMultipleReq? */
if(u16Index == 0xe040) {
while((remain = tvb_length_remaining(tvb, offset)) > 0) {
offset = dissect_IODWriteReq(tvb, offset, pinfo, tree, drep, ar);
}
} else {
/* RecordDataWrite */
offset = dissect_RecordDataWrite(tvb, offset, pinfo, tree, drep, u16Index, u32RecDataLen);
/* Padding */
switch(offset % 4) {
case(3):
offset += 1;
break;
case(2):
offset += 2;
break;
case(1):
offset += 3;
break;
}
}
return offset;
}
/* dissect a PN-IO write request */
static int
dissect_IPNIO_Write_rqst(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
pnio_ar_t *ar = NULL;
offset = dissect_IPNIO_rqst_header(tvb, offset, pinfo, tree, drep);
offset = dissect_IODWriteReq(tvb, offset, pinfo, tree, drep, &ar);
if(ar != NULL) {
pnio_ar_info(tvb, pinfo, tree, ar);
}
return offset;
}
static int
dissect_IODWriteRes(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
gint remain;
guint16 u16Index = 0;
guint32 u32RecDataLen;
pnio_ar_t *ar = NULL;
/* IODWriteResHeader */
offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
/* IODWriteMultipleRes? */
if(u16Index == 0xe040) {
while((remain = tvb_length_remaining(tvb, offset)) > 0) {
offset = dissect_IODWriteRes(tvb, offset, pinfo, tree, drep);
}
}
if(ar != NULL) {
pnio_ar_info(tvb, pinfo, tree, ar);
}
return offset;
}
/* dissect a PN-IO write response */
static int
dissect_IPNIO_Write_resp(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
offset = dissect_IPNIO_resp_header(tvb, offset, pinfo, tree, drep);
offset = dissect_IODWriteRes(tvb, offset, pinfo, tree, drep);
return offset;
}
/* dissect the IOxS (IOCS, IOPS) field */
static int
dissect_PNIO_IOxS(tvbuff_t *tvb, int offset,
packet_info *pinfo _U_, proto_tree *tree, guint8 *drep _U_, int hfindex)
{
guint8 u8IOxS;
proto_item *ioxs_item = NULL;
proto_tree *ioxs_tree = NULL;
u8IOxS = tvb_get_guint8(tvb, offset);
/* add ioxs subtree */
ioxs_item = proto_tree_add_uint(tree, hfindex, tvb, offset, 1, u8IOxS);
proto_item_append_text(ioxs_item,
" (%s%s)",
(u8IOxS & 0x01) ? "another IOxS follows " : "",
(u8IOxS & 0x80) ? "good" : "bad");
ioxs_tree = proto_item_add_subtree(ioxs_item, ett_pn_io_ioxs);
proto_tree_add_uint(ioxs_tree, hf_pn_io_ioxs_datastate, tvb, offset, 1, u8IOxS);
proto_tree_add_uint(ioxs_tree, hf_pn_io_ioxs_instance, tvb, offset, 1, u8IOxS);
proto_tree_add_uint(ioxs_tree, hf_pn_io_ioxs_res14, tvb, offset, 1, u8IOxS);
proto_tree_add_uint(ioxs_tree, hf_pn_io_ioxs_extension, tvb, offset, 1, u8IOxS);
return offset + 1;
}
/* dissect a PN-IO Cyclic Service Data Unit (on top of PN-RT protocol) */
static int
dissect_PNIO_C_SDU(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
proto_item *data_item;
proto_tree *data_tree;
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_add_str(pinfo->cinfo, COL_PROTOCOL, "PNIO");
if(tree) {
data_item = proto_tree_add_protocol_format(tree, proto_pn_io, tvb, offset, tvb_length(tvb),
"PROFINET IO Cyclic Service Data Unit: %u bytes", tvb_length(tvb));
data_tree = proto_item_add_subtree(data_item, ett_pn_io_rtc);
offset = dissect_PNIO_IOxS(tvb, offset, pinfo, data_tree, drep, hf_pn_io_ioxs);
/* XXX - dissect the remaining data */
/* this will be one or more DataItems followed by an optional GAP and RTCPadding */
/* as we don't have the required context information to dissect the specific DataItems, this will be tricky :-( */
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, tvb_length_remaining(tvb, offset), "User Data (including GAP and RTCPadding)");
}
return offset;
}
/* dissect a PN-IO RTA PDU (on top of PN-RT protocol) */
static int
dissect_PNIO_RTA(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, guint8 *drep)
{
guint16 u16AlarmDstEndpoint;
guint16 u16AlarmSrcEndpoint;
guint8 u8PDUType;
guint8 u8PDUVersion;
guint8 u8WindowSize;
guint8 u8Tack;
guint16 u16SendSeqNum;
guint16 u16AckSeqNum;
guint16 u16VarPartLen;
int start_offset = offset;
guint16 u16Index = 0;
guint32 u32RecDataLen;
pnio_ar_t *ar = NULL;
proto_item *rta_item;
proto_tree *rta_tree;
proto_item *sub_item;
proto_tree *sub_tree;
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_add_str(pinfo->cinfo, COL_PROTOCOL, "PNIO-AL");
rta_item = proto_tree_add_protocol_format(tree, proto_pn_io, tvb, offset, tvb_length(tvb),
"PROFINET IO Alarm");
rta_tree = proto_item_add_subtree(rta_item, ett_pn_io_rta);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, rta_tree, drep,
hf_pn_io_alarm_dst_endpoint, &u16AlarmDstEndpoint);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, rta_tree, drep,
hf_pn_io_alarm_src_endpoint, &u16AlarmSrcEndpoint);
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO, ", Src: 0x%x, Dst: 0x%x",
u16AlarmSrcEndpoint, u16AlarmDstEndpoint);
/* PDU type */
sub_item = proto_tree_add_item(rta_tree, hf_pn_io_pdu_type, tvb, offset, 1, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_pdu_type);
dissect_dcerpc_uint8(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_pdu_type_type, &u8PDUType);
u8PDUType &= 0x0F;
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_pdu_type_version, &u8PDUVersion);
u8PDUVersion >>= 4;
proto_item_append_text(sub_item, ", Type: %s, Version: %u",
val_to_str(u8PDUType, pn_io_pdu_type, "Unknown"),
u8PDUVersion);
/* additional flags */
sub_item = proto_tree_add_item(rta_tree, hf_pn_io_add_flags, tvb, offset, 1, FALSE);
sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_add_flags);
dissect_dcerpc_uint8(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_window_size, &u8WindowSize);
u8WindowSize &= 0x0F;
offset = dissect_dcerpc_uint8(tvb, offset, pinfo, sub_tree, drep,
hf_pn_io_tack, &u8Tack);
u8Tack >>= 4;
proto_item_append_text(sub_item, ", Window Size: %u, Tack: %u",
u8WindowSize, u8Tack);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, rta_tree, drep,
hf_pn_io_send_seq_num, &u16SendSeqNum);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, rta_tree, drep,
hf_pn_io_ack_seq_num, &u16AckSeqNum);
offset = dissect_dcerpc_uint16(tvb, offset, pinfo, rta_tree, drep,
hf_pn_io_var_part_len, &u16VarPartLen);
switch(u8PDUType & 0x0F) {
case(1): /* Data-RTA */
if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, ", Data-RTA");
offset = dissect_block(tvb, offset, pinfo, rta_tree, drep, &u16Index, &u32RecDataLen, &ar);
break;
case(2): /* NACK-RTA */
if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, ", NACK-RTA");
/* no additional data */
break;
case(3): /* ACK-RTA */
if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, ", ACK-RTA");
/* no additional data */
break;
case(4): /* ERR-RTA */
if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, ", ERR-RTA");
offset = dissect_PNIO_status(tvb, offset, pinfo, rta_tree, drep);
break;
default:
offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, tvb_length(tvb));
}
proto_item_set_len(rta_item, offset - start_offset);
return offset;
}
/* possibly dissect a PN-IO related PN-RT packet */
static gboolean
dissect_PNIO_heur(tvbuff_t *tvb,
packet_info *pinfo, proto_tree *tree)
{
guint8 drep_data = 0;
guint8 *drep = &drep_data;
guint8 u8CBAVersion;
guint16 u16FrameID;
/* the sub tvb will NOT contain the frame_id here! */
u16FrameID = GPOINTER_TO_UINT(pinfo->private_data);
u8CBAVersion = tvb_get_guint8 (tvb, 0);
/* is this a PNIO class 3 data packet? */
/* frame id must be in valid range (cyclic Real-Time, class=3) */
if (u16FrameID >= 0x0100 && u16FrameID < 0x7fff) {
dissect_PNIO_C_SDU(tvb, 0, pinfo, tree, drep);
return TRUE;
}
/* is this a PNIO class 2 data packet? */
/* frame id must be in valid range (cyclic Real-Time, class=2) and
* first byte (CBA version field) has to be != 0x11 */
if (u16FrameID >= 0x8000 && u16FrameID < 0xbf00 && u8CBAVersion != 0x11) {
dissect_PNIO_C_SDU(tvb, 0, pinfo, tree, drep);
return TRUE;
}
/* is this a PNIO class 1 data packet? */
/* frame id must be in valid range (cyclic Real-Time, class=1) and
* first byte (CBA version field) has to be != 0x11 */
if (u16FrameID >= 0xc000 && u16FrameID < 0xfb00 && u8CBAVersion != 0x11) {
dissect_PNIO_C_SDU(tvb, 0, pinfo, tree, drep);
return TRUE;
}
/* is this a PNIO high priority alarm packet? */
if(u16FrameID == 0xfc01) {
if (check_col(pinfo->cinfo, COL_INFO))
col_add_str(pinfo->cinfo, COL_INFO, "Alarm High");
dissect_PNIO_RTA(tvb, 0, pinfo, tree, drep);
return TRUE;
}
/* is this a PNIO low priority alarm packet? */
if(u16FrameID == 0xfe01) {
if (check_col(pinfo->cinfo, COL_INFO))
col_add_str(pinfo->cinfo, COL_INFO, "Alarm Low");
dissect_PNIO_RTA(tvb, 0, pinfo, tree, drep);
return TRUE;
}
/* this PN-RT packet doesn't seem to be PNIO specific */
return FALSE;
}
gboolean
pn_io_ar_conv_valid(packet_info *pinfo)
{
return (pinfo->profinet_type == 10);
}
const gchar *
pn_io_ar_conv_filter(packet_info *pinfo)
{
pnio_ar_t *ar = pinfo->profinet_conv;
char* buf;
if(pinfo->profinet_type != 10) {
return NULL;
}
buf = g_strdup_printf(
"pn_io.ar_uuid == %s || " /* ARUUID */
"(pn_io.alarm_src_endpoint == 0x%x && eth.src == %s) || " /* Alarm CR (contr -> dev) */
"(pn_io.alarm_src_endpoint == 0x%x && eth.src == %s)", /* Alarm CR (dev -> contr) */
guid_to_str((const e_guid_t*) &ar->aruuid),
ar->controlleralarmref, ether_to_str((const guint8 *)ar->controllermac),
ar->devicealarmref, ether_to_str((const guint8 *)ar->devicemac));
return buf;
}
const gchar *
pn_io_ar_conv_data_filter(packet_info *pinfo)
{
pnio_ar_t *ar = pinfo->profinet_conv;
char* buf;
if(pinfo->profinet_type != 10) {
return NULL;
}
buf = g_strdup_printf(
"pn_io.ar_uuid == %s || " /* ARUUID */
"(pn_rt.frame_id == 0x%x && eth.src == %s && eth.dst == %s) || " /* Input CR && dev MAC -> contr MAC */
"(pn_rt.frame_id == 0x%x && eth.src == %s && eth.dst == %s) || " /* Output CR && contr MAC -> dev MAC */
"(pn_io.alarm_src_endpoint == 0x%x && eth.src == %s) || " /* Alarm CR (contr -> dev) */
"(pn_io.alarm_src_endpoint == 0x%x && eth.src == %s)", /* Alarm CR (dev -> contr) */
guid_to_str((const e_guid_t*) &ar->aruuid),
ar->inputframeid, ether_to_str((const guint8 *)ar->devicemac), ether_to_str((const guint8 *)ar->controllermac),
ar->outputframeid, ether_to_str((const guint8 *)ar->controllermac), ether_to_str((const guint8 *)ar->devicemac),
ar->controlleralarmref, ether_to_str((const guint8 *)ar->controllermac),
ar->devicealarmref, ether_to_str((const guint8 *)ar->devicemac));
return buf;
}
/* the PNIO dcerpc interface table */
static dcerpc_sub_dissector pn_io_dissectors[] = {
{ 0, "Connect", dissect_IPNIO_rqst, dissect_IPNIO_resp },
{ 1, "Release", dissect_IPNIO_rqst, dissect_IPNIO_resp },
{ 2, "Read", dissect_IPNIO_rqst, dissect_IPNIO_Read_resp },
{ 3, "Write", dissect_IPNIO_Write_rqst, dissect_IPNIO_Write_resp },
{ 4, "Control", dissect_IPNIO_rqst, dissect_IPNIO_resp },
{ 5, "Read Implicit", dissect_IPNIO_rqst, dissect_IPNIO_Read_resp },
{ 0, NULL, NULL, NULL }
};
static void pnio_reinit( void) {
pnio_ars = NULL;
}
void
proto_register_pn_io (void)
{
static hf_register_info hf[] = {
{ &hf_pn_io_opnum,
{ "Operation", "pn_io.opnum", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_reserved16,
{ "Reserved", "pn_io.reserved16", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_array,
{ "Array", "pn_io.array", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_status,
{ "Status", "pn_io.status", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_args_max,
{ "ArgsMaximum", "pn_io.args_max", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_args_len,
{ "ArgsLength", "pn_io.args_len", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_array_max_count,
{ "MaximumCount", "pn_io.array_max_count", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_array_offset,
{ "Offset", "pn_io.array_offset", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_array_act_count,
{ "ActualCount", "pn_io.array_act_count", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ar_type,
{ "ARType", "pn_io.ar_type", FT_UINT16, BASE_HEX, VALS(pn_io_ar_type), 0x0, "", HFILL }},
{ &hf_pn_io_cminitiator_macadd,
{ "CMInitiatorMacAdd", "pn_io.cminitiator_mac_add", FT_ETHER, BASE_HEX, 0x0, 0x0, "", HFILL }},
{ &hf_pn_io_cminitiator_objectuuid,
{ "CMInitiatorObjectUUID", "pn_io.cminitiator_uuid", FT_GUID, BASE_NONE, 0x0, 0x0, "", HFILL }},
{ &hf_pn_io_parameter_server_objectuuid,
{ "ParameterServerObjectUUID", "pn_io.parameter_server_objectuuid", FT_GUID, BASE_NONE, 0x0, 0x0, "", HFILL }},
{ &hf_pn_io_ar_properties,
{ "ARProperties", "pn_io.ar_properties", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ar_properties_state,
{ "State", "pn_io.ar_properties.state", FT_UINT32, BASE_HEX, VALS(pn_io_arproperties_state), 0x00000007, "", HFILL }},
{ &hf_pn_io_ar_properties_supervisor_takeover_allowed,
{ "SupervisorTakeoverAllowed", "pn_io.ar_properties.supervisor_takeover_allowed", FT_UINT32, BASE_HEX, VALS(pn_io_arproperties_supervisor_takeover_allowed), 0x00000008, "", HFILL }},
{ &hf_pn_io_ar_properties_parametrization_server,
{ "ParametrizationServer", "pn_io.ar_properties.parametrization_server", FT_UINT32, BASE_HEX, VALS(pn_io_arproperties_parametrization_server), 0x00000010, "", HFILL }},
{ &hf_pn_io_ar_properties_data_rate,
{ "DataRate", "pn_io.ar_properties.data_rate", FT_UINT32, BASE_HEX, VALS(pn_io_arproperties_data_rate), 0x00000060, "", HFILL }},
{ &hf_pn_io_ar_properties_reserved_1,
{ "Reserved_1", "pn_io.ar_properties.reserved_1", FT_UINT32, BASE_HEX, NULL, 0x00000080, "", HFILL }},
{ &hf_pn_io_ar_properties_device_access,
{ "DeviceAccess", "pn_io.ar_properties.device_access", FT_UINT32, BASE_HEX, VALS(pn_io_arproperties_device_access), 0x00000100, "", HFILL }},
{ &hf_pn_io_ar_properties_companion_ar,
{ "CompanionAR", "pn_io.ar_properties.companion_ar", FT_UINT32, BASE_HEX, VALS(pn_io_arproperties_companion_ar), 0x00000600, "", HFILL }},
{ &hf_pn_io_ar_properties_achnowledge_companion_ar,
{ "AcknowledgeCompanionAR", "pn_io.ar_properties.acknowledge_companion_ar", FT_UINT32, BASE_HEX, VALS(pn_io_arproperties_acknowldege_companion_ar), 0x00000800, "", HFILL }},
{ &hf_pn_io_ar_properties_reserved,
{ "Reserved", "pn_io.ar_properties.reserved", FT_UINT32, BASE_HEX, NULL, 0x7FFFF000, "", HFILL }},
{ &hf_pn_io_ar_properties_pull_module_alarm_allowed,
{ "PullModuleAlarmAllowed", "pn_io.ar_properties.pull_module_alarm_allowed", FT_UINT32, BASE_HEX, VALS(pn_io_arproperties_pull_module_alarm_allowed), 0x80000000, "", HFILL }},
{ &hf_pn_io_cminitiator_activitytimeoutfactor,
{ "CMInitiatorActivityTimeoutFactor", "pn_io.cminitiator_activitytimeoutfactor", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }}, /* XXX - special values */
{ &hf_pn_io_cminitiator_udprtport,
{ "CMInitiatorUDPRTPort", "pn_io.cminitiator_udprtport", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }}, /* XXX - special values */
{ &hf_pn_io_station_name_length,
{ "StationNameLength", "pn_io.station_name_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_cminitiator_station_name,
{ "CMInitiatorStationName", "pn_io.cminitiator_station_name", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_parameter_server_station_name,
{ "ParameterServerStationName", "pn_io.parameter_server_station_name", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_cmresponder_macadd,
{ "CMResponderMacAdd", "pn_io.cmresponder_macadd", FT_ETHER, BASE_HEX, 0x0, 0x0, "", HFILL }},
{ &hf_pn_io_cmresponder_udprtport,
{ "CMResponderUDPRTPort", "pn_io.cmresponder_udprtport", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }}, /* XXX - special values */
{ &hf_pn_io_number_of_iocrs,
{ "NumberOfIOCRs", "pn_io.number_of_iocrs", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_iocr_tree,
{ "IOCR", "pn_io.iocr_tree", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_iocr_type,
{ "IOCRType", "pn_io.iocr_type", FT_UINT16, BASE_HEX, VALS(pn_io_iocr_type), 0x0, "", HFILL }},
{ &hf_pn_io_iocr_reference,
{ "IOCRReference", "pn_io.iocr_reference", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_lt,
{ "LT", "pn_io.lt", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_iocr_properties,
{ "IOCRProperties", "pn_io.iocr_properties", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_iocr_properties_rtclass,
{ "RTClass", "pn_io.iocr_properties.rtclass", FT_UINT32, BASE_HEX, VALS(pn_io_iocr_properties_rtclass), 0x0000000F, "", HFILL }},
{ &hf_pn_io_iocr_properties_reserved_1,
{ "Reserved1", "pn_io.iocr_properties.reserved1", FT_UINT32, BASE_HEX, NULL, 0x000007F0, "", HFILL }},
{ &hf_pn_io_iocr_properties_media_redundancy,
{ "MediaRedundancy", "pn_io.iocr_properties.media_redundancy", FT_UINT32, BASE_HEX, VALS(pn_io_iocr_properties_media_redundancy), 0x00000800, "", HFILL }},
{ &hf_pn_io_iocr_properties_reserved_2,
{ "Reserved2", "pn_io.iocr_properties.reserved2", FT_UINT32, BASE_HEX, NULL, 0xFFFFF000, "", HFILL }},
{ &hf_pn_io_data_length,
{ "DataLength", "pn_io.data_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ir_frame_data,
{ "Frame data", "pn_io.ir_frame_data", FT_NONE, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_frame_id,
{ "FrameID", "pn_io.frame_id", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_send_clock_factor,
{ "SendClockFactor", "pn_io.send_clock_factor", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }}, /* XXX - special values */
{ &hf_pn_io_reduction_ratio,
{ "ReductionRatio", "pn_io.reduction_ratio", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }}, /* XXX - special values */
{ &hf_pn_io_phase,
{ "Phase", "pn_io.phase", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_sequence,
{ "Sequence", "pn_io.sequence", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_frame_send_offset,
{ "FrameSendOffset", "pn_io.frame_send_offset", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_watchdog_factor,
{ "WatchdogFactor", "pn_io.watchdog_factor", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_data_hold_factor,
{ "DataHoldFactor", "pn_io.data_hold_factor", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_iocr_tag_header,
{ "IOCRTagHeader", "pn_io.iocr_tag_header", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_iocr_multicast_mac_add,
{ "IOCRMulticastMACAdd", "pn_io.iocr_multicast_mac_add", FT_ETHER, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_number_of_apis,
{ "NumberOfAPIs", "pn_io.number_of_apis", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_number_of_io_data_objects,
{ "NumberOfIODataObjects", "pn_io.number_of_io_data_objects", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_io_data_object_frame_offset,
{ "IODataObjectFrameOffset", "pn_io.io_data_object_frame_offset", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_number_of_iocs,
{ "NumberOfIOCS", "pn_io.number_of_iocs", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_iocs_frame_offset,
{ "IOCSFrameOffset", "pn_io.iocs_frame_offset", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_alarmcr_type,
{ "AlarmCRType", "pn_io.alarmcr_type", FT_UINT16, BASE_HEX, VALS(pn_io_alarmcr_type), 0x0, "", HFILL }},
{ &hf_pn_io_alarmcr_properties,
{ "AlarmCRProperties", "pn_io.alarmcr_properties", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_alarmcr_properties_priority,
{ "priority", "pn_io.alarmcr_properties.priority", FT_UINT32, BASE_HEX, VALS(pn_io_alarmcr_properties_priority), 0x00000001, "", HFILL }},
{ &hf_pn_io_alarmcr_properties_transport,
{ "Transport", "pn_io.alarmcr_properties.transport", FT_UINT32, BASE_HEX, VALS(pn_io_alarmcr_properties_transport), 0x00000002, "", HFILL }},
{ &hf_pn_io_alarmcr_properties_reserved,
{ "Reserved", "pn_io.alarmcr_properties.reserved", FT_UINT32, BASE_HEX, NULL, 0xFFFFFFFC, "", HFILL }},
{ &hf_pn_io_rta_timeoutfactor,
{ "RTATimeoutFactor", "pn_io.rta_timeoutfactor", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }}, /* XXX - special values */
{ &hf_pn_io_rta_retries,
{ "RTARetries", "pn_io.rta_retries", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }}, /* XXX - only values 3 - 15 allowed */
{ &hf_pn_io_localalarmref,
{ "LocalAlarmReference", "pn_io.localalarmref", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }}, /* XXX - special values */
{ &hf_pn_io_remotealarmref,
{ "RemoteAlarmReference", "pn_io.remotealarmref", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }}, /* XXX - special values */
{ &hf_pn_io_maxalarmdatalength,
{ "MaxAlarmDataLength", "pn_io.maxalarmdatalength", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }}, /* XXX - only values 200 - 1432 allowed */
{ &hf_pn_io_alarmcr_tagheaderhigh,
{ "AlarmCRTagHeaderHigh", "pn_io.alarmcr_tagheaderhigh", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }}, /* XXX - 16 bitfield! */
{ &hf_pn_io_alarmcr_tagheaderlow,
{ "AlarmCRTagHeaderLow", "pn_io.alarmcr_tagheaderlow", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }}, /* XXX - 16 bitfield!*/
{ &hf_pn_io_api_tree,
{ "API", "pn_io.api", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_module_tree,
{ "Module", "pn_io.module", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_submodule_tree,
{ "Submodule", "pn_io.submodule", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_io_data_object,
{ "IODataObject", "pn_io.io_data_object", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_io_cs,
{ "IOCS", "pn_io.io_cs", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ar_uuid,
{ "ARUUID", "pn_io.ar_uuid", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_target_ar_uuid,
{ "TargetARUUID", "pn_io.target_ar_uuid", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_api,
{ "API", "pn_io.api", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_slot_nr,
{ "SlotNumber", "pn_io.slot_nr", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_subslot_nr,
{ "SubslotNumber", "pn_io.subslot_nr", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_index,
{ "Index", "pn_io.index", FT_UINT16, BASE_HEX, VALS(pn_io_index), 0x0, "", HFILL }},
{ &hf_pn_io_seq_number,
{ "SeqNumber", "pn_io.seq_number", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_record_data_length,
{ "RecordDataLength", "pn_io.record_data_length", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_add_val1,
{ "AdditionalValue1", "pn_io.add_val1", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_add_val2,
{ "AdditionalValue2", "pn_io.add_val2", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_block_header,
{ "BlockHeader", "pn_io.block_header", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_block_type,
{ "BlockType", "pn_io.block_type", FT_UINT16, BASE_HEX, VALS(pn_io_block_type), 0x0, "", HFILL }},
{ &hf_pn_io_block_length,
{ "BlockLength", "pn_io.block_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_block_version_high,
{ "BlockVersionHigh", "pn_io.block_version_high", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_block_version_low,
{ "BlockVersionLow", "pn_io.block_version_low", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_sessionkey,
{ "SessionKey", "pn_io.session_key", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_control_command,
{ "ControlCommand", "pn_io.control_command", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_control_command_prmend,
{ "PrmEnd", "pn_io.control_command.prmend", FT_UINT16, BASE_DEC, NULL, 0x0001, "", HFILL }},
{ &hf_pn_io_control_command_applready,
{ "ApplicationReady", "pn_io.control_command.applready", FT_UINT16, BASE_DEC, NULL, 0x0002, "", HFILL }},
{ &hf_pn_io_control_command_release,
{ "Release", "pn_io.control_command.release", FT_UINT16, BASE_DEC, NULL, 0x0004, "", HFILL }},
{ &hf_pn_io_control_command_done,
{ "Done", "pn_io.control_command.done", FT_UINT16, BASE_DEC, NULL, 0x0008, "", HFILL }},
{ &hf_pn_io_control_block_properties,
{ "ControlBlockProperties", "pn_io.control_block_properties", FT_UINT16, BASE_HEX, VALS(pn_io_control_properties_vals), 0x0, "", HFILL }},
{ &hf_pn_io_control_block_properties_applready,
{ "ControlBlockProperties", "pn_io.control_block_properties.appl_ready", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_control_block_properties_applready0,
{ "AppicationReady", "pn_io.control_block_properties.appl_ready0", FT_UINT16, BASE_HEX, VALS(pn_io_control_properties_aplication_ready_vals), 0x0001, "", HFILL }},
{ &hf_pn_io_error_code,
{ "ErrorCode ", "pn_io.error_code", FT_UINT8, BASE_HEX, VALS(pn_io_error_code), 0x0, "", HFILL }},
{ &hf_pn_io_error_decode,
{ "ErrorDecode", "pn_io.error_decode", FT_UINT8, BASE_HEX, VALS(pn_io_error_decode), 0x0, "", HFILL }},
{ &hf_pn_io_error_code1,
{ "ErrorCode1 ", "pn_io.error_code1", FT_UINT8, BASE_DEC, VALS(pn_io_error_code1), 0x0, "", HFILL }},
{ &hf_pn_io_error_code2,
{ "ErrorCode2 ", "pn_io.error_code2", FT_UINT8, BASE_DEC, VALS(pn_io_error_code2), 0x0, "", HFILL }},
{ &hf_pn_io_error_code1_pniorw,
{ "ErrorCode1 ", "pn_io.error_code1", FT_UINT8, BASE_DEC, VALS(pn_io_error_code1_pniorw), 0x0, "", HFILL }},
{ &hf_pn_io_error_code2_pniorw,
{ "ErrorCode2 for PNIORW is user specified! ", "pn_io.error_code2", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_error_code1_pnio,
{ "ErrorCode1 ", "pn_io.error_code1", FT_UINT8, BASE_DEC, VALS(pn_io_error_code1_pnio), 0x0, "", HFILL }},
{ &hf_pn_io_error_code2_pnio_22,
{ "ErrorCode2 ", "pn_io.error_code2", FT_UINT8, BASE_DEC, VALS(pn_io_error_code2_pnio_22), 0x0, "", HFILL }},
{ &hf_pn_io_error_code2_pnio_253,
{ "ErrorCode2 ", "pn_io.error_code2", FT_UINT8, BASE_DEC, VALS(pn_io_error_code2_pnio_253), 0x0, "", HFILL }},
{ &hf_pn_io_block,
{ "Block", "pn_io.block", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_alarm_type,
{ "AlarmType", "pn_io.alarm_type", FT_UINT16, BASE_HEX, VALS(pn_io_alarm_type), 0x0, "", HFILL }},
{ &hf_pn_io_alarm_specifier,
{ "AlarmSpecifier", "pn_io.alarm_specifier", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_alarm_specifier_sequence,
{ "SequenceNumber", "pn_io.alarm_specifier.sequence", FT_UINT16, BASE_HEX, NULL, 0x07FF, "", HFILL }},
{ &hf_pn_io_alarm_specifier_channel,
{ "ChannelDiagnosis", "pn_io.alarm_specifier.channel", FT_UINT16, BASE_HEX, NULL, 0x0800, "", HFILL }},
{ &hf_pn_io_alarm_specifier_manufacturer,
{ "ManufacturerSpecificDiagnosis", "pn_io.alarm_specifier.manufacturer", FT_UINT16, BASE_HEX, NULL, 0x1000, "", HFILL }},
{ &hf_pn_io_alarm_specifier_submodule,
{ "SubmoduleDiagnosisState", "pn_io.alarm_specifier.submodule", FT_UINT16, BASE_HEX, NULL, 0x2000, "", HFILL }},
{ &hf_pn_io_alarm_specifier_ardiagnosis,
{ "ARDiagnosisState", "pn_io.alarm_specifier.ardiagnosis", FT_UINT16, BASE_HEX, NULL, 0x8000, "", HFILL }},
{ &hf_pn_io_alarm_dst_endpoint,
{ "AlarmDstEndpoint", "pn_io.alarm_dst_endpoint", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_alarm_src_endpoint,
{ "AlarmSrcEndpoint", "pn_io.alarm_src_endpoint", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_pdu_type,
{ "PDUType", "pn_io.pdu_type", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_pdu_type_type,
{ "Type", "pn_io.pdu_type.type", FT_UINT8, BASE_HEX, VALS(pn_io_pdu_type), 0x0F, "", HFILL }},
{ &hf_pn_io_pdu_type_version,
{ "Version", "pn_io.pdu_type.version", FT_UINT8, BASE_HEX, NULL, 0xF0, "", HFILL }},
{ &hf_pn_io_add_flags,
{ "AddFlags", "pn_io.add_flags", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_window_size,
{ "WindowSize", "pn_io.window_size", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }},
{ &hf_pn_io_tack,
{ "TACK", "pn_io.tack", FT_UINT8, BASE_HEX, NULL, 0xF0, "", HFILL }},
{ &hf_pn_io_send_seq_num,
{ "SendSeqNum", "pn_io.send_seq_num", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ack_seq_num,
{ "AckSeqNum", "pn_io.ack_seq_num", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_var_part_len,
{ "VarPartLen", "pn_io.var_part_len", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_module_ident_number,
{ "ModuleIdentNumber", "pn_io.module_ident_number", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_submodule_ident_number,
{ "SubmoduleIdentNumber", "pn_io.submodule_ident_number", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_number_of_modules,
{ "NumberOfModules", "pn_io.number_of_modules", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_module_properties,
{ "ModuleProperties", "pn_io.module_properties", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_module_state,
{ "ModuleState", "pn_io.module_state", FT_UINT16, BASE_HEX, VALS(pn_io_module_state), 0x0, "", HFILL }},
{ &hf_pn_io_number_of_submodules,
{ "NumberOfSubmodules", "pn_io.number_of_submodules", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_submodule_properties,
{ "SubmoduleProperties", "pn_io.submodule_properties", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_submodule_properties_type,
{ "Type", "pn_io.submodule_properties.type", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_properties_type), 0x0003, "", HFILL }},
{ &hf_pn_io_submodule_properties_shared_input,
{ "SharedInput", "pn_io.submodule_properties.shared_input", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_properties_shared_input), 0x0004, "", HFILL }},
{ &hf_pn_io_submodule_properties_reduce_input_submodule_data_length,
{ "ReduceInputSubmoduleDataLength", "pn_io.submodule_properties.reduce_input_submodule_data_length", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_properties_reduce_input_submodule_data_length), 0x0008, "", HFILL }},
{ &hf_pn_io_submodule_properties_reduce_output_submodule_data_length,
{ "ReduceOutputSubmoduleDataLength", "pn_io.submodule_properties.reduce_output_submodule_data_length", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_properties_reduce_output_submodule_data_length), 0x0010, "", HFILL }},
{ &hf_pn_io_submodule_properties_discard_ioxs,
{ "DiscardIOXS", "pn_io.submodule_properties.discard_ioxs", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_properties_discard_ioxs), 0x0020, "", HFILL }},
{ &hf_pn_io_submodule_properties_reserved,
{ "Reserved", "pn_io.submodule_properties.reserved", FT_UINT16, BASE_HEX, NULL, 0xFFC0, "", HFILL }},
{ &hf_pn_io_submodule_state,
{ "SubmoduleState", "pn_io.submodule_state", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_submodule_state_format_indicator,
{ "FormatIndicator", "pn_io.submodule_state.format_indicator", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_state_format_indicator), 0x8000, "", HFILL }},
{ &hf_pn_io_submodule_state_add_info,
{ "AddInfo", "pn_io.submodule_state.add_info", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_state_add_info), 0x0007, "", HFILL }},
{ &hf_pn_io_submodule_state_qualified_info,
{ "QualifiedInfo", "pn_io.submodule_state.qualified_info", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_state_qualified_info), 0x0008, "", HFILL }},
{ &hf_pn_io_submodule_state_maintenance_required,
{ "MaintenanceRequired", "pn_io.submodule_state.maintenance_required", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_state_maintenance_required), 0x0010, "", HFILL }},
{ &hf_pn_io_submodule_state_maintenance_demanded,
{ "MaintenanceDemanded", "pn_io.submodule_state.maintenance_demanded", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_state_maintenance_demanded), 0x0020, "", HFILL }},
{ &hf_pn_io_submodule_state_diag_info,
{ "DiagInfo", "pn_io.submodule_state.diag_info", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_state_diag_info), 0x0040, "", HFILL }},
{ &hf_pn_io_submodule_state_ar_info,
{ "ARInfo", "pn_io.submodule_state.ar_info", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_state_ar_info), 0x0780, "", HFILL }},
{ &hf_pn_io_submodule_state_ident_info,
{ "IdentInfo", "pn_io.submodule_state.ident_info", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_state_ident_info), 0x7800, "", HFILL }},
{ &hf_pn_io_submodule_state_detail,
{ "Detail", "pn_io.submodule_state.detail", FT_UINT16, BASE_HEX, VALS(pn_io_submodule_state_detail), 0x7FFF, "", HFILL }},
{ &hf_pn_io_data_description_tree,
{ "DataDescription", "pn_io.data_description", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_data_description,
{ "DataDescription", "pn_io.data_description", FT_UINT16, BASE_HEX, VALS(pn_io_data_description), 0x0, "", HFILL }},
{ &hf_pn_io_submodule_data_length,
{ "SubmoduleDataLength", "pn_io.submodule_data_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_length_iocs,
{ "LengthIOCS", "pn_io.length_iocs", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_length_iops,
{ "LengthIOPS", "pn_io.length_iops", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_iocs,
{ "IOCS", "pn_io.ioxs", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_iops,
{ "IOPS", "pn_io.ioxs", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ioxs,
{ "IOxS", "pn_io.ioxs", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ioxs_extension,
{ "Extension (1:another IOxS follows/0:no IOxS follows)", "pn_io.ioxs.extension", FT_UINT8, BASE_HEX, NULL, 0x01, "", HFILL }},
{ &hf_pn_io_ioxs_res14,
{ "Reserved (should be zero)", "pn_io.ioxs.res14", FT_UINT8, BASE_HEX, NULL, 0x1E, "", HFILL }},
{ &hf_pn_io_ioxs_instance,
{ "Instance (only valid, if DataState is bad)", "pn_io.ioxs.instance", FT_UINT8, BASE_HEX, VALS(pn_io_ioxs), 0x60, "", HFILL }},
{ &hf_pn_io_ioxs_datastate,
{ "DataState (1:good/0:bad)", "pn_io.ioxs.datastate", FT_UINT8, BASE_HEX, NULL, 0x80, "", HFILL }},
{ &hf_pn_io_address_resolution_properties,
{ "AddressResolutionProperties", "pn_io.address_resolution_properties", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mci_timeout_factor,
{ "MCITimeoutFactor", "pn_io.mci_timeout_factor", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_provider_station_name,
{ "ProviderStationName", "pn_io.provider_station_name", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_user_structure_identifier,
{ "UserStructureIdentifier", "pn_io.user_structure_identifier", FT_UINT16, BASE_HEX, VALS(pn_io_user_structure_identifier), 0x0, "", HFILL }},
{ &hf_pn_io_channel_number,
{ "ChannelNumber", "pn_io.channel_number", FT_UINT16, BASE_HEX, VALS(pn_io_channel_number), 0x0, "", HFILL }},
{ &hf_pn_io_channel_properties,
{ "ChannelProperties", "pn_io.channel_properties", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_channel_properties_type,
{ "Type", "pn_io.channel_properties.type", FT_UINT16, BASE_HEX, VALS(pn_io_channel_properties_type), 0x00FF, "", HFILL }},
{ &hf_pn_io_channel_properties_accumulative,
{ "Accumulative", "pn_io.channel_properties.accumulative", FT_UINT16, BASE_HEX, NULL, 0x0100, "", HFILL }},
{ &hf_pn_io_channel_properties_maintenance_required,
{ "MaintenanceRequired", "pn_io.channel_properties.maintenance_required", FT_UINT16, BASE_HEX, NULL, 0x0200, "", HFILL }},
{ &hf_pn_io_channel_properties_maintenance_demanded,
{ "MaintenanceDemanded", "pn_io.channel_properties.maintenance_demanded", FT_UINT16, BASE_HEX, NULL, 0x0400, "", HFILL }},
{ &hf_pn_io_channel_properties_specifier,
{ "Specifier", "pn_io.channel_properties.specifier", FT_UINT16, BASE_HEX, VALS(pn_io_channel_properties_specifier), 0x1800, "", HFILL }},
{ &hf_pn_io_channel_properties_direction,
{ "Direction", "pn_io.channel_properties.direction", FT_UINT16, BASE_HEX, VALS(pn_io_channel_properties_direction), 0xE000, "", HFILL }},
{ &hf_pn_io_channel_error_type,
{ "ChannelErrorType", "pn_io.channel_error_type", FT_UINT16, BASE_HEX, VALS(pn_io_channel_error_type), 0x0, "", HFILL }},
{ &hf_pn_io_ext_channel_error_type,
{ "ExtChannelErrorType", "pn_io.ext_channel_error_type", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ext_channel_add_value,
{ "ExtChannelAddValue", "pn_io.ext_channel_add_value", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ptcp_subdomain_id,
{ "PTCPSubdomainID", "pn_io.ptcp_subdomain_id", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ir_data_id,
{ "IRDataID", "pn_io.ir_data_id", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_reserved_interval_begin,
{ "ReservedIntervalBegin", "pn_io.reserved_interval_begin", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_reserved_interval_end,
{ "ReservedIntervalEnd", "pn_io.reserved_interval_end", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_pllwindow,
{ "PLLWindow", "pn_io.pllwindow", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_sync_send_factor,
{ "SyncSendFactor", "pn_io.sync_send_factor", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_sync_properties,
{ "SyncProperties", "pn_io.sync_properties", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_sync_frame_address,
{ "SyncFrameAddress", "pn_io.sync_frame_address", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ptcp_timeout_factor,
{ "PTCPTimeoutFactor", "pn_io.ptcp_timeout_factor", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_domain_boundary,
{ "DomainBoundary", "pn_io.domain_boundary", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_multicast_boundary,
{ "MulticastBoundary", "pn_io.multicast_boundary", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_adjust_properties,
{ "AdjustProperties", "pn_io.adjust_properties", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mau_type,
{ "MAUType", "pn_io.mau_type", FT_UINT16, BASE_HEX, VALS(pn_io_mau_type), 0x0, "", HFILL }},
{ &hf_pn_io_mau_type_mode,
{ "MAUTypeMode", "pn_io.mau_type_mode", FT_UINT16, BASE_HEX, VALS(pn_io_mau_type_mode), 0x0, "", HFILL }},
{ &hf_pn_io_port_state,
{ "PortState", "pn_io.port_state", FT_UINT16, BASE_HEX, VALS(pn_io_port_state), 0x0, "", HFILL }},
{ &hf_pn_io_line_delay,
{ "LineDelay", "pn_io.line_delay", FT_UINT32, BASE_DEC, NULL, 0x0, "LineDelay in nanoseconds", HFILL }},
{ &hf_pn_io_number_of_peers,
{ "NumberOfPeers", "pn_io.number_of_peers", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_length_peer_port_id,
{ "LengthPeerPortID", "pn_io.length_peer_port_id", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_peer_port_id,
{ "PeerPortID", "pn_io.peer_port_id", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_length_peer_chassis_id,
{ "LengthPeerChassisID", "pn_io.length_peer_chassis_id", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_peer_chassis_id,
{ "PeerChassisID", "pn_io.peer_chassis_id", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_length_own_chassis_id,
{ "LengthOwnChassisID", "pn_io.length_own_chassis_id", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_own_chassis_id,
{ "OwnChassisID", "pn_io.own_chassis_id", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_length_own_port_id,
{ "LengthOwnPortID", "pn_io.length_own_port_id", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_own_port_id,
{ "OwnPortID", "pn_io.own_port_id", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_peer_macadd,
{ "PeerMACAddress", "pn_io.peer_macadd", FT_ETHER, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_macadd,
{ "MACAddress", "pn_io.macadd", FT_ETHER, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_media_type,
{ "MediaType", "pn_io.media_type", FT_UINT32, BASE_HEX, VALS(pn_io_media_type), 0x0, "", HFILL }},
{ &hf_pn_io_ethertype,
{ "Ethertype", "pn_io.ethertype", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_rx_port,
{ "RXPort", "pn_io.rx_port", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_frame_details,
{ "FrameDetails", "pn_io.frame_details", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_nr_of_tx_port_groups,
{ "NumberOfTxPortGroups", "pn_io.nr_of_tx_port_groups", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_slot,
{ "Slot", "pn_io.slot", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_subslot,
{ "Subslot", "pn_io.subslot", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_number_of_slots,
{ "NumberOfSlots", "pn_io.number_of_slots", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_number_of_subslots,
{ "NumberOfSubslots", "pn_io.number_of_subslots", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_maintenance_required_drop_budget,
{ "MaintenanceRequiredDropBudget", "pn_io.maintenance_required_drop_budget", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_maintenance_demanded_drop_budget,
{ "MaintenanceDemandedDropBudget", "pn_io.maintenance_demanded_drop_budget", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_error_drop_budget,
{ "ErrorDropBudget", "pn_io.error_drop_budget", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_maintenance_required_power_budget,
{ "MaintenanceRequiredPowerBudget", "pn_io.maintenance_required_power_budget", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_maintenance_demanded_power_budget,
{ "MaintenanceDemandedPowerBudget", "pn_io.maintenance_demanded_power_budget", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_error_power_budget,
{ "ErrorPowerBudget", "pn_io.error_power_budget", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_fiber_optic_type,
{ "FiberOpticType", "pn_io.fiber_optic_type", FT_UINT32, BASE_HEX, VALS(pn_io_fiber_optic_type), 0x0, "", HFILL }},
{ &hf_pn_io_fiber_optic_cable_type,
{ "FiberOpticCableType", "pn_io.fiber_optic_cable_type", FT_UINT32, BASE_HEX, VALS(pn_io_fiber_optic_cable_type), 0x0, "", HFILL }},
{ &hf_pn_io_controller_appl_cycle_factor,
{ "ControllerApplicationCycleFactor", "pn_io.controller_appl_cycle_factor", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_time_data_cycle,
{ "TimeDataCycle", "pn_io.time_data_cycle", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_time_io_input,
{ "TimeIOInput", "pn_io.time_io_input", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_time_io_output,
{ "TimeIOOutput", "pn_io.time_io_output", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_time_io_input_valid,
{ "TimeIOInput", "pn_io.time_io_input_valid", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_time_io_output_valid,
{ "TimeIOOutputValid", "pn_io.time_io_output_valid", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_maintenance_status,
{ "MaintenanceStatus", "pn_io.maintenance_status", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_maintenance_status_required,
{ "Required", "pn_io.maintenance_status_required", FT_UINT32, BASE_HEX, NULL, 0x0001, "", HFILL }},
{ &hf_pn_io_maintenance_status_demanded,
{ "Demanded", "pn_io.maintenance_status_demanded", FT_UINT32, BASE_HEX, NULL, 0x0002, "", HFILL }},
{ &hf_pn_io_vendor_id_high,
{ "VendorIDHigh", "pn_io.vendor_id_high", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_vendor_id_low,
{ "VendorIDLow", "pn_io.vendor_id_low", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_vendor_block_type,
{ "VendorBlockType", "pn_io.vendor_block_type", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_order_id,
{ "OrderID", "pn_io.order_id", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_serial_number,
{ "IMSerialNumber", "pn_io.im_serial_number", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_hardware_revision,
{ "IMHardwareRevision", "pn_io.im_hardware_revision", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
/* XXX - better use a simple char here -> vals */
{ &hf_pn_io_im_revision_prefix,
{ "IMRevisionPrefix", "pn_io.im_revision_prefix", FT_UINT8, BASE_HEX, VALS(pn_io_im_revision_prefix_vals), 0x0, "", HFILL }},
{ &hf_pn_io_im_sw_revision_functional_enhancement,
{ "IMSWRevisionFunctionalEnhancement", "pn_io.im_sw_revision_functional_enhancement", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_revision_bugfix,
{ "IM_SWRevisionBugFix", "pn_io.im_revision_bugfix", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_sw_revision_internal_change,
{ "IMSWRevisionInternalChange", "pn_io.im_sw_revision_internal_change", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_revision_counter,
{ "IMRevisionCounter", "pn_io.im_revision_counter", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_profile_id,
{ "IMProfileID", "pn_io.im_profile_id", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_profile_specific_type,
{ "IMProfileSpecificType", "pn_io.im_profile_specific_type", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_version_major,
{ "IMVersionMajor", "pn_io.im_version_major", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_version_minor,
{ "IMVersionMinor", "pn_io.im_version_minor", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_supported,
{ "IM_Supported", "pn_io.im_supported", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_number_of_ars,
{ "NumberOfARs", "pn_io.number_of_ars", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_cycle_counter,
{ "CycleCounter", "pn_io.cycle_counter", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_data_status,
{ "DataStatus", "pn_io.ds", FT_UINT8, BASE_HEX, 0, 0x0, "", HFILL }},
{ &hf_pn_io_data_status_res67,
{ "Reserved (should be zero)", "pn_io.ds_res67", FT_UINT8, BASE_HEX, 0, 0xc0, "", HFILL }},
{ &hf_pn_io_data_status_ok,
{ "StationProblemIndicator (1:Ok/0:Problem)", "pn_io.ds_ok", FT_UINT8, BASE_HEX, 0, 0x20, "", HFILL }},
{ &hf_pn_io_data_status_operate,
{ "ProviderState (1:Run/0:Stop)", "pn_io.ds_operate", FT_UINT8, BASE_HEX, 0, 0x10, "", HFILL }},
{ &hf_pn_io_data_status_res3,
{ "Reserved (should be zero)", "pn_io.ds_res3", FT_UINT8, BASE_HEX, 0, 0x08, "", HFILL }},
{ &hf_pn_io_data_status_valid,
{ "DataValid (1:Valid/0:Invalid)", "pn_io.ds_valid", FT_UINT8, BASE_HEX, 0, 0x04, "", HFILL }},
{ &hf_pn_io_data_status_res1,
{ "Reserved (should be zero)", "pn_io.ds_res1", FT_UINT8, BASE_HEX, 0, 0x02, "", HFILL }},
{ &hf_pn_io_data_status_primary,
{ "State (1:Primary/0:Backup)", "pn_io.ds_primary", FT_UINT8, BASE_HEX, 0, 0x01, "", HFILL }},
{ &hf_pn_io_transfer_status,
{ "TransferStatus", "pn_io.transfer_status", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_actual_local_time_stamp,
{ "ActualLocalTimeStamp", "pn_io.actual_local_time_stamp", FT_UINT64, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_local_time_stamp,
{ "LocalTimeStamp", "pn_io.local_time_stamp", FT_UINT64, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_number_of_log_entries,
{ "NumberOfLogEntries", "pn_io.number_of_log_entries", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_entry_detail,
{ "EntryDetail", "pn_io.entry_detail", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_ip_address,
{ "IPAddress", "pn_io.ip_address", FT_IPv4, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_subnetmask,
{ "Subnetmask", "pn_io.subnetmask", FT_IPv4, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_standard_gateway,
{ "StandardGateway", "pn_io.standard_gateway", FT_IPv4, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mrp_domain_uuid,
{ "MRP_DomainUUID", "pn_io.mrp_domain_uuid", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mrp_role,
{ "MRP_Role", "pn_io.mrp_role", FT_UINT16, BASE_HEX, VALS(pn_io_mrp_role_vals), 0x0, "", HFILL }},
{ &hf_pn_io_mrp_length_domain_name,
{ "MRP_LengthDomainName", "pn_io.mrp_length_domain_name", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mrp_domain_name,
{ "MRP_DomainName", "pn_io.mrp_domain_name", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mrp_prio,
{ "MRP_Prio", "pn_io.mrp_prio", FT_UINT16, BASE_HEX, VALS(pn_io_mrp_prio_vals), 0x0, "", HFILL }},
{ &hf_pn_io_mrp_topchgt,
{ "MRP_TOPchgT", "pn_io.mrp_topchgt", FT_UINT16, BASE_DEC, NULL, 0x0, "time base 10ms", HFILL }},
{ &hf_pn_io_mrp_topnrmax,
{ "MRP_TOPNRmax", "pn_io.mrp_topnrmax", FT_UINT16, BASE_DEC, NULL, 0x0, "number of iterations", HFILL }},
{ &hf_pn_io_mrp_tstshortt,
{ "MRP_TSTshortT", "pn_io.mrp_tstshortt", FT_UINT16, BASE_DEC, NULL, 0x0, "time base 1 ms", HFILL }},
{ &hf_pn_io_mrp_tstdefaultt,
{ "MRP_TSTdefaultT", "pn_io.mrp_tstdefaultt", FT_UINT16, BASE_DEC, NULL, 0x0, "time base 1ms", HFILL }},
{ &hf_pn_io_mrp_tstnrmax,
{ "MRP_TSTNRmax", "pn_io.mrp_tstnrmax", FT_UINT16, BASE_DEC, NULL, 0x0, "number of outstanding test indications causes ring failure", HFILL }},
{ &hf_pn_io_mrp_check,
{ "MRP_Check", "pn_io.mrp_check", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mrp_rtmode,
{ "MRP_RTMode", "pn_io.mrp_rtmode", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mrp_rtmode_rtclass12,
{ "RTClass1_2", "pn_io.mrp_rtmode.class1_2", FT_UINT32, BASE_HEX, VALS(pn_io_mrp_rtmode_rtclass12_vals), 0x00000001, "", HFILL }},
{ &hf_pn_io_mrp_rtmode_rtclass3,
{ "RTClass1_3", "pn_io.mrp_rtmode.class3", FT_UINT32, BASE_HEX, VALS(pn_io_mrp_rtmode_rtclass3_vals), 0x00000002, "", HFILL }},
{ &hf_pn_io_mrp_rtmode_reserved1,
{ "Reserved_1", "pn_io.mrp_rtmode.reserved_1", FT_UINT32, BASE_HEX, NULL, 0x00fffffc, "", HFILL }},
{ &hf_pn_io_mrp_rtmode_reserved2,
{ "Reserved_2", "pn_io.mrp_rtmode.reserved_2", FT_UINT32, BASE_HEX, NULL, 0xff000000, "", HFILL }},
{ &hf_pn_io_mrp_lnkdownt,
{ "MRP_LNKdownT", "pn_io.mrp_lnkdownt", FT_UINT16, BASE_HEX, NULL, 0x0, "Link down Interval in ms", HFILL }},
{ &hf_pn_io_mrp_lnkupt,
{ "MRP_LNKupT", "pn_io.mrp_lnkupt", FT_UINT16, BASE_HEX, NULL, 0x0, "Link up Interval in ms", HFILL }},
{ &hf_pn_io_mrp_lnknrmax,
{ "MRP_LNKNRmax", "pn_io.mrp_lnknrmax", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mrp_version,
{ "MRP_Version", "pn_io.mrp_version", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_substitute_active_flag,
{ "SubstituteActiveFlag", "pn_io.substitute_active_flag", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_length_data,
{ "LengthData", "pn_io.length_data", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_mrp_ring_state,
{ "MRP_RingState", "pn_io.mrp_ring_state", FT_UINT16, BASE_HEX, VALS(pn_io_mrp_ring_state_vals), 0x0, "", HFILL }},
{ &hf_pn_io_mrp_rt_state,
{ "MRP_RTState", "pn_io.mrp_rt_state", FT_UINT16, BASE_HEX, VALS(pn_io_mrp_rt_state_vals), 0x0, "", HFILL }},
{ &hf_pn_io_im_tag_function,
{ "IM_Tag_Function", "pn_io.im_tag_function", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_tag_location,
{ "IM_Tag_Location", "pn_io.im_tag_location", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_date,
{ "IM_Date", "pn_io.im_date", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_im_descriptor,
{ "IM_Descriptor", "pn_io.im_descriptor", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_fs_hello_mode,
{ "FSHelloMode", "pn_io.fs_hello_mode", FT_UINT32, BASE_HEX, VALS(pn_io_fs_hello_mode_vals), 0x0, "", HFILL }},
{ &hf_pn_io_fs_hello_interval,
{ "FSHelloInterval", "pn_io.fs_hello_interval", FT_UINT32, BASE_DEC, NULL, 0x0, "ms before conveying a second DCP_Hello.req", HFILL }},
{ &hf_pn_io_fs_hello_retry,
{ "FSHelloRetry", "pn_io.fs_hello_retry", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_fs_hello_delay,
{ "FSHelloDelay", "pn_io.fs_hello_delay", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_check_sync_mode,
{ "CheckSyncMode", "pn_io.check_sync_mode", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_pn_io_check_sync_mode_reserved,
{ "Reserved", "pn_io.check_sync_mode.reserved", FT_UINT16, BASE_HEX, NULL, 0xFFFC, "", HFILL }},
{ &hf_pn_io_check_sync_mode_sync_master,
{ "SyncMaster", "pn_io.check_sync_mode.sync_master", FT_UINT16, BASE_HEX, NULL, 0x0002, "", HFILL }},
{ &hf_pn_io_check_sync_mode_cable_delay,
{ "CableDelay", "pn_io.check_sync_mode.cable_delay", FT_UINT16, BASE_HEX, NULL, 0x0001, "", HFILL }},
};
static gint *ett[] = {
&ett_pn_io,
&ett_pn_io_block,
&ett_pn_io_block_header,
&ett_pn_io_status,
&ett_pn_io_rtc,
&ett_pn_io_rta,
&ett_pn_io_pdu_type,
&ett_pn_io_add_flags,
&ett_pn_io_control_command,
&ett_pn_io_ioxs,
&ett_pn_io_api,
&ett_pn_io_data_description,
&ett_pn_io_module,
&ett_pn_io_submodule,
&ett_pn_io_io_data_object,
&ett_pn_io_io_cs,
&ett_pn_io_ar_properties,
&ett_pn_io_iocr_properties,
&ett_pn_io_submodule_properties,
&ett_pn_io_alarmcr_properties,
&ett_pn_io_submodule_state,
&ett_pn_io_channel_properties,
&ett_pn_io_slot,
&ett_pn_io_subslot,
&ett_pn_io_maintenance_status,
&ett_pn_io_data_status,
&ett_pn_io_iocr,
&ett_pn_io_mrp_rtmode,
&ett_pn_io_control_block_properties,
&ett_pn_io_check_sync_mode,
&ett_pn_io_ir_frame_data,
&ett_pn_io_ar_info
};
proto_pn_io = proto_register_protocol ("PROFINET IO", "PNIO", "pn_io");
proto_register_field_array (proto_pn_io, hf, array_length (hf));
proto_register_subtree_array (ett, array_length (ett));
register_init_routine(pnio_reinit);
register_dissector_filter("PN-IO AR", pn_io_ar_conv_valid, pn_io_ar_conv_filter);
register_dissector_filter("PN-IO AR (with data)", pn_io_ar_conv_valid, pn_io_ar_conv_data_filter);
}
void
proto_reg_handoff_pn_io (void)
{
/* Register the protocols as dcerpc */
dcerpc_init_uuid (proto_pn_io, ett_pn_io, &uuid_pn_io_device, ver_pn_io_device, pn_io_dissectors, hf_pn_io_opnum);
dcerpc_init_uuid (proto_pn_io, ett_pn_io, &uuid_pn_io_controller, ver_pn_io_controller, pn_io_dissectors, hf_pn_io_opnum);
dcerpc_init_uuid (proto_pn_io, ett_pn_io, &uuid_pn_io_supervisor, ver_pn_io_supervisor, pn_io_dissectors, hf_pn_io_opnum);
dcerpc_init_uuid (proto_pn_io, ett_pn_io, &uuid_pn_io_parameterserver, ver_pn_io_parameterserver, pn_io_dissectors, hf_pn_io_opnum);
heur_dissector_add("pn_rt", dissect_PNIO_heur, proto_pn_io);
}