diff options
author | ulfl <ulfl@f5534014-38df-0310-8fa8-9805f1628bb7> | 2006-06-21 20:10:38 +0000 |
---|---|---|
committer | ulfl <ulfl@f5534014-38df-0310-8fa8-9805f1628bb7> | 2006-06-21 20:10:38 +0000 |
commit | eccf246e852742f83c5694c9aafef486cbaf8be2 (patch) | |
tree | 7469fb5213b1b7186c580bf9376f8038832b2bb7 /plugins | |
parent | 8112cc01b46bb2ae817b70970d24dacd3c55946c (diff) |
add various new dissections, enhancements to the existing dissections and update things to current spec, ...
Still incomplete, but a lot better than before :-)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@18536 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/profinet/packet-dcerpc-pn-io.c | 2110 |
1 files changed, 1886 insertions, 224 deletions
diff --git a/plugins/profinet/packet-dcerpc-pn-io.c b/plugins/profinet/packet-dcerpc-pn-io.c index 7086439ca2..733f4e3e18 100644 --- a/plugins/profinet/packet-dcerpc-pn-io.c +++ b/plugins/profinet/packet-dcerpc-pn-io.c @@ -60,6 +60,7 @@ #include <epan/packet.h> #include <epan/emem.h> #include <epan/dissectors/packet-dcerpc.h> +#include <epan/expert.h> @@ -82,6 +83,16 @@ 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_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_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; @@ -94,6 +105,10 @@ 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_frame_id = -1; static int hf_pn_io_send_clock_factor = -1; @@ -113,6 +128,10 @@ 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; @@ -186,7 +205,24 @@ 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; @@ -203,7 +239,56 @@ 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_port_state = -1; +static int hf_pn_io_propagation_delay_factor = -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_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_subslot = -1; +static int hf_pn_io_number_of_slots = -1; +static int hf_pn_io_number_of_subslots = -1; + static gint ett_pn_io = -1; static gint ett_pn_io_block = -1; static gint ett_pn_io_block_header = -1; @@ -220,6 +305,13 @@ 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_subslot = -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; @@ -242,13 +334,14 @@ static const value_string pn_io_block_type[] = { { 0x8008, "WriteRecordRes"}, { 0x0009, "ReadRecordReq"}, { 0x8009, "ReadRecordRes"}, - { 0x0010, "ManufacturerSpecificDiagnosisBlock"}, - { 0x0011, "ChannelDiagnosisBlock"}, + { 0x0010, "DiagnosisBlock"}, + { 0x0011, "MulticastConsumerInfoBlock"}, { 0x0012, "ExpectedIdentificationDataBlock"}, - { 0x0014, "SubstituteValue RecordDataRead"}, + { 0x0013, "RealIdentificationData"}, + { 0x0014, "SubstituteValue"}, { 0x0015, "RecordInputDataObjectElement"}, { 0x0016, "RecordOutputDataObjectElement"}, - { 0x0017, "RecordOutputDataSubstituteObjectElement"}, + { 0x0017, "reserved"}, { 0x0018, "ARData"}, { 0x0019, "LogData"}, { 0x001A, "APIData"}, @@ -257,6 +350,18 @@ static const value_string pn_io_block_type[] = { { 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&M0FilterData"}, { 0x8001, "Alarm Ack High"}, { 0x8002, "Alarm Ack Low"}, { 0x0101, "ARBlockReq"}, @@ -280,6 +385,43 @@ static const value_string pn_io_block_type[] = { { 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, "CheckPropagationDelayFactor"}, + { 0x020C, "Checking MAUType"}, + { 0x020E, "Adjusting MAUType"}, + { 0x020F, "PDPortDataReal"}, + { 0x0210, "AdjustMulticastBoundary"}, + { 0x0211, "Adjusting MRP interface data"}, + { 0x0212, "Reading MRP interface data"}, + { 0x0213, "Checking MRP interface data"}, + { 0x0214, "Adjusting MRP port data"}, + { 0x0215, "Reading MRP port data"}, + { 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"}, + { 0x0220, "PDPortFODataReal"}, + { 0x0221, "Reading real fiber optic manufacturerspecific data"}, + { 0x0222, "PDPortFODataAdjust"}, + { 0x0223, "PDPortFODataCheck"}, + { 0x0230, "PDNCDataCheck"}, + { 0x0400, "MultipleBlockHeader"}, + { 0x0F00, "MaintenanceBlock"}, { 0, NULL } }; @@ -296,10 +438,18 @@ static const value_string pn_io_alarm_type[] = { { 0x0009, "Released" }, { 0x000A, "Plug wrong submodule" }, { 0x000B, "Return of submodule" }, - /* 0x000C - 0x001F reserved */ - /* 0x0020 - 0x007F manufacturer specific */ - /* 0x0080 - 0x00FF reserved for profiles */ - /* 0x0100 - 0xFFFF reserved */ + { 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 } }; @@ -461,7 +611,498 @@ static const value_string pn_io_module_state[] = { { 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_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 - 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 */ + + /* 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 - 0xEBFF 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_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 int dissect_blocks(tvbuff_t *tvb, int offset, + packet_info *pinfo, proto_tree *tree, guint8 *drep); @@ -534,6 +1175,8 @@ dissect_PNIO_status(tvbuff_t *tvb, int offset, default: dissect_dcerpc_uint8(tvb, offset+(2^bytemask), pinfo, sub_tree, drep, hf_pn_io_error_code1, &u8ErrorCode1); + /*expert_add_info_format(pinfo, sub_item, PI_UNDECODED, PI_WARN, + "Unknown ErrorDecode 0x%x", u8ErrorDecode);*/ error_code1_vals = pn_io_error_code1; } @@ -611,7 +1254,7 @@ dissect_Alarm_specifier(tvbuff_t *tvb, int offset, /* dissect the alarm header */ static int dissect_Alarm_header(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16AlarmType; guint32 u32Api; @@ -627,27 +1270,39 @@ dissect_Alarm_header(tvbuff_t *tvb, int offset, 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, "Unknown"), + val_to_str(u16AlarmType, pn_io_alarm_type, "(0x%x)"), u16SlotNr, u16SubslotNr); return offset; } -/* dissect the alarm note block */ +/* dissect the alarm notification block */ static int -dissect_Alarm_note_block(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 body_length) +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; + guint16 u16ChannelNumber; + guint16 u16ChannelProperties; + guint16 u16ChannelErrorType; + guint16 u16ExtChannelErrorType; + guint32 u32ExtChannelAddValue; + proto_item *sub_item; + proto_tree *sub_tree; if (check_col(pinfo->cinfo, COL_INFO)) col_append_str(pinfo->cinfo, COL_INFO, ", Alarm Notification"); - offset = dissect_Alarm_header(tvb, offset, pinfo, tree, drep); + 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); @@ -656,11 +1311,114 @@ dissect_Alarm_note_block(tvbuff_t *tvb, int offset, offset = dissect_Alarm_specifier(tvb, offset, pinfo, tree, drep); - /* XXX - dissect AlarmItem */ - body_length -= 20; - proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, body_length, "data", - "Alarm Item Data: %u bytes", body_length); - offset += body_length; + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_user_structure_identifier, &u16UserStructureIdentifier); + + proto_item_append_text(item, ", Ident:0x%x, SubIdent:0x%x, USI:0x%x", + u32ModuleIdentNumber, u32SubmoduleIdentNumber, u16UserStructureIdentifier); + + switch(u16UserStructureIdentifier) { + case(0x8002): /* ExtChannelDiagnosisData */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_channel_number, &u16ChannelNumber); + + 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); + + 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); + break; + default: + /* XXX - dissect AlarmItem */ + body_length -= 22; + sub_item = proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, body_length, "data", + "Alarm Item Data: %u bytes", body_length); + if(u16UserStructureIdentifier >= 0x8000) { + expert_add_info_format(pinfo, sub_item, PI_UNDECODED, PI_WARN, + "Unknown UserStructureIdentifier 0x%x", u16UserStructureIdentifier); + } + + offset += body_length; + } + + return offset; +} + + +/* dissect the RealIdentificationData block */ +static int +dissect_RealIdentificationData_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 *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); + } + + 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); + while(u16NumberOfSlots--) { + /* SlotNumber */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_slot_nr, &u16SlotNr); + /* ModuleIdentNumber */ + offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, + hf_pn_io_module_ident_number, &u32ModuleIdentNumber); + /* NumberOfSubslots */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_number_of_subslots, &u16NumberOfSubslots); + while(u16NumberOfSubslots--) { + subslot_item = proto_tree_add_item(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:%u", + u16SubslotNr, u32SubmoduleIdentNumber); + } + } + } return offset; } @@ -669,12 +1427,12 @@ dissect_Alarm_note_block(tvbuff_t *tvb, int offset, /* dissect the alarm acknowledge block */ static int dissect_Alarm_ack_block(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + 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, drep); + offset = dissect_Alarm_header(tvb, offset, pinfo, tree, item, drep); offset = dissect_Alarm_specifier(tvb, offset, pinfo, tree, drep); @@ -687,7 +1445,7 @@ dissect_Alarm_ack_block(tvbuff_t *tvb, int offset, /* dissect the read/write header */ static int dissect_ReadWrite_header(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 *u16Index, e_uuid_t *aruuid) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 *u16Index, e_uuid_t *aruuid) { guint32 u32Api; guint16 u16SlotNr; @@ -711,9 +1469,13 @@ dissect_ReadWrite_header(tvbuff_t *tvb, int offset, 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", - u32Api, u16SlotNr, u16SubslotNr); + 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; } @@ -722,12 +1484,12 @@ dissect_ReadWrite_header(tvbuff_t *tvb, int offset, /* dissect the read/write request block */ static int dissect_ReadWrite_rqst_block(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen) { e_uuid_t aruuid; e_uuid_t null_uuid; - offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, drep, u16Index, &aruuid); + offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid); offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, hf_pn_io_record_data_length, u32RecDataLen); @@ -738,7 +1500,9 @@ dissect_ReadWrite_rqst_block(tvbuff_t *tvb, int offset, hf_pn_io_target_ar_uuid, &aruuid); } - if (check_col(pinfo->cinfo, COL_INFO)) + 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); @@ -749,18 +1513,17 @@ dissect_ReadWrite_rqst_block(tvbuff_t *tvb, int offset, /* dissect the read/write response block */ static int dissect_ReadWrite_resp_block(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 *u16Index) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen) { e_uuid_t aruuid; - guint32 u32RecDataLen; guint16 u16AddVal1; guint16 u16AddVal2; - offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, drep, u16Index, &aruuid); + offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid); offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, - hf_pn_io_record_data_length, &u32RecDataLen); + hf_pn_io_record_data_length, u32RecDataLen); offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, hf_pn_io_add_val1, &u16AddVal1); @@ -768,9 +1531,12 @@ dissect_ReadWrite_resp_block(tvbuff_t *tvb, int offset, offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, hf_pn_io_add_val2, &u16AddVal2); - if (check_col(pinfo->cinfo, COL_INFO)) + 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); + *u32RecDataLen); return offset; } @@ -779,15 +1545,14 @@ dissect_ReadWrite_resp_block(tvbuff_t *tvb, int offset, /* dissect the control/connect block */ static int dissect_ControlConnect_block(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { e_uuid_t ar_uuid; + guint16 u16SessionKey; proto_item *sub_item; proto_tree *sub_tree; - guint16 u16PrmEnd; - guint16 u16ApplReady; - guint16 u16Release; - guint16 u16CmdDone; + guint16 u16Command; + guint16 u16Properties; offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, @@ -797,7 +1562,7 @@ dissect_ControlConnect_block(tvbuff_t *tvb, int offset, hf_pn_io_ar_uuid, &ar_uuid); offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, - hf_pn_io_sessionkey, NULL); + hf_pn_io_sessionkey, &u16SessionKey); offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, hf_pn_io_reserved16, NULL); @@ -806,36 +1571,609 @@ dissect_ControlConnect_block(tvbuff_t *tvb, int offset, 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, &u16PrmEnd); - if(u16PrmEnd & 0x0001) { - proto_item_append_text(sub_item, ", Parameter End"); + 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); + + 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: \"Parameter End\""); + col_append_fstr(pinfo->cinfo, COL_INFO, ", Command: ParameterEnd"); } - dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep, - hf_pn_io_control_command_applready, &u16ApplReady); - if((u16ApplReady >> 1) & 0x0001) { - proto_item_append_text(sub_item, ", Application Ready"); + 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: \"Application Ready\""); + col_append_fstr(pinfo->cinfo, COL_INFO, ", Command: ApplicationReady"); } - dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep, - hf_pn_io_control_command_release, &u16Release); - if((u16Release >> 2) & 0x0001) { + 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\""); + col_append_fstr(pinfo->cinfo, COL_INFO, ", Command: Release"); } - offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep, - hf_pn_io_control_command_done, &u16CmdDone); - if((u16CmdDone >> 3) & 0x0001) { + 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\""); + col_append_fstr(pinfo->cinfo, COL_INFO, ", Command: Done"); } - offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, - hf_pn_io_control_block_properties, NULL); + proto_item_append_text(item, ", Properties:0x%x", u16Properties); + + 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 u16SlotNr; + guint16 u16SubslotNr; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* 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); + + dissect_blocks(tvb, offset, pinfo, tree, drep); + + 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; + guint8 *pu8OwnPortID; + guint8 u8NumberOfPeers; + guint8 u8I; + guint8 u8LengthPeerPortID; + guint8 *pu8PeerPortID; + guint8 u8LengthPeerChassisID; + guint8 *pu8PeerChassisID; + guint32 u32PropagationDelayFactor; + guint8 mac[6]; + guint16 u16MAUType; + guint32 u32DomainBoundary; + guint32 u32MulticastBoundary; + guint16 u16PortState; + guint32 u32MediaType; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* 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 */ + pu8OwnPortID = ep_alloc(u8LengthOwnPortID+1); + tvb_memcpy(tvb, pu8OwnPortID, offset, u8LengthOwnPortID); + pu8OwnPortID[u8LengthOwnPortID] = '\0'; + proto_tree_add_string (tree, hf_pn_io_own_port_id, tvb, offset, u8LengthOwnPortID, pu8OwnPortID); + offset += u8LengthOwnPortID; + + /* NumberOfPeers */ + offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep, + hf_pn_io_number_of_peers, &u8NumberOfPeers); + /* Padding */ + switch(offset % 4) { + case(3): + offset += 1; + break; + case(2): + offset += 2; + break; + case(1): + offset += 3; + break; + } + u8I = u8NumberOfPeers; + while(u8I--) { + /* LengthPeerPortID */ + offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep, + hf_pn_io_length_peer_port_id, &u8LengthPeerPortID); + /* PeerPortID */ + pu8PeerPortID = ep_alloc(u8LengthPeerPortID+1); + tvb_memcpy(tvb, pu8PeerPortID, offset, u8LengthPeerPortID); + pu8PeerPortID[u8LengthPeerPortID] = '\0'; + proto_tree_add_string (tree, hf_pn_io_peer_port_id, tvb, offset, u8LengthPeerPortID, pu8PeerPortID); + offset += u8LengthPeerPortID; + + /* LengthPeerChassisID */ + offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep, + hf_pn_io_length_peer_chassis_id, &u8LengthPeerChassisID); + /* PeerChassisID */ + pu8PeerChassisID = ep_alloc(u8LengthPeerChassisID+1); + tvb_memcpy(tvb, pu8PeerChassisID, offset, u8LengthPeerChassisID); + pu8PeerChassisID[u8LengthPeerChassisID] = '\0'; + proto_tree_add_string (tree, hf_pn_io_peer_chassis_id, tvb, offset, u8LengthPeerChassisID, pu8PeerChassisID); + offset += u8LengthPeerChassisID; + + /* Padding */ + switch(offset % 4) { + case(3): + offset += 1; + break; + case(2): + offset += 2; + break; + case(1): + offset += 3; + break; + } + + /* PropagationDelayFactor */ + offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, + hf_pn_io_propagation_delay_factor, &u32PropagationDelayFactor); + + /* PeerMACAddress */ + offset = dissect_MAC(tvb, offset, pinfo, tree, + hf_pn_io_peer_macadd, mac); + /* Padding */ + switch(offset % 4) { + case(3): + offset += 1; + break; + case(2): + offset += 2; + break; + case(1): + offset += 3; + break; + } + } + + /* MAUType */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_mau_type, &u16MAUType); + /* Padding */ + switch(offset % 4) { + case(3): + offset += 1; + break; + case(2): + offset += 2; + break; + case(1): + offset += 3; + break; + } + + /* 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 */ + switch(offset % 4) { + case(3): + offset += 1; + break; + case(2): + offset += 2; + break; + case(1): + offset += 3; + break; + } + /* 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, pu8OwnPortID, u8NumberOfPeers, + val_to_str(u16PortState, pn_io_port_state, "0x%x"), + val_to_str(u32MediaType, pn_io_media_type, "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; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* 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; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* 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; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* 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 CheckPropagationDelayFactor block */ +static int +dissect_CheckPropagationDelayFactor_block(tvbuff_t *tvb, int offset, + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) +{ + guint32 u32PropagationDelayFactor; + + + /* PropagationDelayFactor */ + offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, + hf_pn_io_propagation_delay_factor, &u32PropagationDelayFactor); + + proto_item_append_text(item, ": PropagationDelayFactor:%uns", u32PropagationDelayFactor); + + 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; + guint8 *pu8PeerPortID; + guint8 u8LengthPeerChassisID; + guint8 *pu8PeerChassisID; + + + /* 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 */ + pu8PeerPortID = ep_alloc(u8LengthPeerPortID+1); + tvb_memcpy(tvb, pu8PeerPortID, offset, u8LengthPeerPortID); + pu8PeerPortID[u8LengthPeerPortID] = '\0'; + proto_tree_add_string (tree, hf_pn_io_peer_port_id, tvb, offset, u8LengthPeerPortID, pu8PeerPortID); + offset += u8LengthPeerPortID; + + /* LengthPeerChassisID */ + offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep, + hf_pn_io_length_peer_chassis_id, &u8LengthPeerChassisID); + /* PeerChassisID */ + pu8PeerChassisID = ep_alloc(u8LengthPeerChassisID+1); + tvb_memcpy(tvb, pu8PeerChassisID, offset, u8LengthPeerChassisID); + pu8PeerChassisID[u8LengthPeerChassisID] = '\0'; + proto_tree_add_string (tree, hf_pn_io_peer_chassis_id, tvb, offset, u8LengthPeerChassisID, pu8PeerChassisID); + 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; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* 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 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; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* 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; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* 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); + + dissect_blocks(tvb, offset, pinfo, tree, drep); + + 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, guint8 *drep) +{ + e_uuid_t uuid; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* 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, guint8 *drep) +{ + guint32 u32FrameSendOffset; + guint16 u16DataLength; + guint16 u16ReductionRatio; + guint16 u16Phase; + guint16 u16FrameID; + guint16 u16Ethertype; + guint8 u8RXPort; + guint8 u8FrameDetails; + guint8 u8NumberOfTxPortGroups; + + + proto_tree_add_string_format(tree, hf_pn_io_padding, tvb, offset, 2, "padding", "Padding: 2 bytes"); + offset += 2; + + /* FrameSendOffset */ + offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, + hf_pn_io_frame_send_offset, &u32FrameSendOffset); + /* DataLength */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_data_length, &u16DataLength); + /* ReductionRatio */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_reduction_ratio, &u16ReductionRatio); + /* Phase */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_phase, &u16Phase); + /* FrameID */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_frame_id, &u16FrameID); + + /* Ethertype */ + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, + hf_pn_io_ethertype, &u16Ethertype); + /* RxPort */ + offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep, + hf_pn_io_rx_port, &u8RXPort); + /* FrameDetails */ + offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep, + hf_pn_io_frame_details, &u8FrameDetails); + /* TxPortGroup */ + offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep, + hf_pn_io_nr_of_tx_port_groups, &u8NumberOfTxPortGroups); + + +/* proto_item_append_text(item, ": Slot:0x%x/0x%x", + u16SlotNr, u16SubslotNr);*/ + + return offset; +} + + +/* dissect the DiagnosisBlock */ +static int +dissect_DiagnosisBlock(tvbuff_t *tvb, int offset, + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 length) +{ + + /* XXX - how to decode this? */ + proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, length, "undecoded", "Undecoded Diagnosis Data: %d bytes", length); return offset; } @@ -844,7 +2182,7 @@ dissect_ControlConnect_block(tvbuff_t *tvb, int offset, /* dissect the ARBlockReq */ static int dissect_ARBlockReq(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16ARType; e_uuid_t uuid; @@ -855,6 +2193,8 @@ dissect_ARBlockReq(tvbuff_t *tvb, int offset, guint16 u16UDPRTPort; guint16 u16NameLength; guint8 *pu8StationName; + proto_item *sub_item; + proto_tree *sub_tree; offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, @@ -867,12 +2207,32 @@ dissect_ARBlockReq(tvbuff_t *tvb, int offset, hf_pn_io_cminitiator_macadd, mac); offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep, hf_pn_io_cminitiator_objectuuid, &uuid); - offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, - hf_pn_io_ar_properties, &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_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); + 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); /* XXX - special values */ + hf_pn_io_cminitiator_udprtport, &u16UDPRTPort); offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, hf_pn_io_station_name_length, &u16NameLength); @@ -882,9 +2242,12 @@ dissect_ARBlockReq(tvbuff_t *tvb, int offset, proto_tree_add_string (tree, hf_pn_io_cminitiator_station_name, tvb, offset, u16NameLength, pu8StationName); offset += u16NameLength; - /*if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, ", Api: %u, Slot: %u/%u", - u32Api, u16SlotNr, u16SubslotNr);*/ + 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, + pu8StationName); return offset; } @@ -893,7 +2256,7 @@ dissect_ARBlockReq(tvbuff_t *tvb, int offset, /* dissect the ARBlockRes */ static int dissect_ARBlockRes(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16ARType; e_uuid_t uuid; @@ -911,11 +2274,13 @@ dissect_ARBlockRes(tvbuff_t *tvb, int offset, offset = dissect_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); /* XXX - special values */ + hf_pn_io_cmresponder_udprtport, &u16UDPRTPort); - /*if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, ", Api: %u, Slot: %u/%u", - u32Api, u16SlotNr, u16SubslotNr);*/ + 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); return offset; } @@ -924,7 +2289,7 @@ dissect_ARBlockRes(tvbuff_t *tvb, int offset, /* dissect the IOCRBlockReq */ static int dissect_IOCRBlockReq(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16IOCRType; guint16 u16IOCRReference; @@ -964,8 +2329,18 @@ dissect_IOCRBlockReq(tvbuff_t *tvb, int offset, hf_pn_io_iocr_reference, &u16IOCRReference); offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, hf_pn_io_lt, &u16LT); - offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, - hf_pn_io_iocr_properties, &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); + offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, hf_pn_io_data_length, &u16DataLength); offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep, @@ -991,6 +2366,12 @@ dissect_IOCRBlockReq(tvbuff_t *tvb, int offset, 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); @@ -1063,7 +2444,7 @@ dissect_IOCRBlockReq(tvbuff_t *tvb, int offset, /* dissect the AlarmCRBlockReq */ static int dissect_AlarmCRBlockReq(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16AlarmCRType; guint16 u16LT; @@ -1074,14 +2455,24 @@ dissect_AlarmCRBlockReq(tvbuff_t *tvb, int offset, 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); - offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep, - hf_pn_io_alarmcr_properties, &u32AlarmCRProperties); + + 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, @@ -1095,6 +2486,11 @@ dissect_AlarmCRBlockReq(tvbuff_t *tvb, int offset, 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); + return offset; } @@ -1102,7 +2498,7 @@ dissect_AlarmCRBlockReq(tvbuff_t *tvb, int offset, /* dissect the AlarmCRBlockRes */ static int dissect_AlarmCRBlockRes(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16AlarmCRType; guint16 u16LocalAlarmReference; @@ -1116,6 +2512,10 @@ dissect_AlarmCRBlockRes(tvbuff_t *tvb, int offset, 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); + return offset; } @@ -1124,7 +2524,7 @@ dissect_AlarmCRBlockRes(tvbuff_t *tvb, int offset, /* dissect the IOCRBlockRes */ static int dissect_IOCRBlockRes(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16IOCRType; guint16 u16IOCRReference; @@ -1138,6 +2538,10 @@ dissect_IOCRBlockRes(tvbuff_t *tvb, int offset, 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); + return offset; } @@ -1146,7 +2550,7 @@ dissect_IOCRBlockRes(tvbuff_t *tvb, int offset, /* dissect the MCRBlockReq */ static int dissect_MCRBlockReq(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16IOCRReference; guint32 u32AddressResolutionProperties; @@ -1171,6 +2575,9 @@ dissect_MCRBlockReq(tvbuff_t *tvb, int offset, proto_tree_add_string (tree, hf_pn_io_provider_station_name, tvb, offset, u16NameLength, pu8StationName); offset += u16NameLength; + proto_item_append_text(item, ", CRRef:%u, Properties:0x%x, TFactor:%u, Station:%s", + u16IOCRReference, u32AddressResolutionProperties, u16MCITimeoutFactor, pu8StationName); + return offset; } @@ -1219,7 +2626,7 @@ dissect_DataDescription(tvbuff_t *tvb, int offset, /* dissect the ExpectedSubmoduleBlockReq */ static int dissect_ExpectedSubmoduleBlockReq(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16NumberOfAPIs; guint32 u32Api; @@ -1235,11 +2642,16 @@ dissect_ExpectedSubmoduleBlockReq(tvbuff_t *tvb, int offset, 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); @@ -1261,9 +2673,11 @@ dissect_ExpectedSubmoduleBlockReq(tvbuff_t *tvb, int offset, 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, ModuleIdentNumber: 0x%x ModuleProperties: 0x%x NumberOfSubmodules: %u", + 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); @@ -1276,8 +2690,20 @@ dissect_ExpectedSubmoduleBlockReq(tvbuff_t *tvb, int offset, offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep, hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber); /* SubmoduleProperties */ - offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep, - hf_pn_io_submodule_properties, &u16SubmoduleProperties); + 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) */ @@ -1295,7 +2721,7 @@ dissect_ExpectedSubmoduleBlockReq(tvbuff_t *tvb, int offset, break; } - proto_item_append_text(sub_item, ": Subslot: 0x%x, SubmoduleIdent: 0x%x SubmoduleProperties: 0x%x", + 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); } @@ -1310,7 +2736,7 @@ dissect_ExpectedSubmoduleBlockReq(tvbuff_t *tvb, int offset, /* dissect the ModuleDiffBlock */ static int dissect_ModuleDiffBlock(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) + packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep) { guint16 u16NumberOfAPIs; guint32 u32Api; @@ -1330,12 +2756,17 @@ dissect_ModuleDiffBlock(tvbuff_t *tvb, int offset, 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); @@ -1348,9 +2779,11 @@ dissect_ModuleDiffBlock(tvbuff_t *tvb, int offset, offset = dissect_dcerpc_uint16(tvb, offset, pinfo, api_tree, drep, hf_pn_io_number_of_modules, &u16NumberOfModules); - proto_item_append_text(api_item, ": %u, NumberOfModules: %u", + 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); @@ -1369,11 +2802,13 @@ dissect_ModuleDiffBlock(tvbuff_t *tvb, int offset, 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, ModuleIdent: 0x%x ModuleState: %s NumberOfSubmodules: %u", + 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); @@ -1386,10 +2821,31 @@ dissect_ModuleDiffBlock(tvbuff_t *tvb, int offset, offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep, hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber); /* SubmoduleState */ - offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep, - hf_pn_io_submodule_state, &u16SubmoduleState); - - proto_item_append_text(sub_item, ": Subslot 0x%x, SubmoduleIdentNumber: 0x%x, SubmoduleState: 0x%x", + 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); @@ -1441,7 +2897,16 @@ dissect_block(tvbuff_t *tvb, int offset, offset = dissect_dcerpc_uint8(tvb, offset, pinfo, header_tree, drep, hf_pn_io_block_version_low, &u8BlockVersionLow); - /* XXX - append block_header data to header_item */ + 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_append_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 */ @@ -1451,74 +2916,112 @@ dissect_block(tvbuff_t *tvb, int offset, switch(u16BlockType) { case(0x0001): case(0x0002): - dissect_Alarm_note_block(tvb, offset, pinfo, sub_tree, drep, u16BodyLength); + dissect_AlarmNotification_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength); + break; + case(0x0010): + dissect_DiagnosisBlock(tvb, offset, pinfo, sub_tree, sub_item, drep, u16BodyLength); + break; + case(0x0013): + dissect_RealIdentificationData_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u8BlockVersionLow); break; case(0x0101): - dissect_ARBlockReq(tvb, offset, pinfo, sub_tree, drep); + dissect_ARBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x0102): - dissect_IOCRBlockReq(tvb, offset, pinfo, sub_tree, drep); + dissect_IOCRBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x0103): - dissect_AlarmCRBlockReq(tvb, offset, pinfo, sub_tree, drep); + dissect_AlarmCRBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x0104): - dissect_ExpectedSubmoduleBlockReq(tvb, offset, pinfo, sub_tree, drep); + dissect_ExpectedSubmoduleBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x0106): - dissect_MCRBlockReq(tvb, offset, pinfo, sub_tree, drep); + dissect_MCRBlockReq(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x0110): case(0x0112): case(0x0114): - if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", - val_to_str(u16BlockType, pn_io_block_type, "Unknown")); - dissect_ControlConnect_block(tvb, offset, pinfo, sub_tree, drep); + dissect_ControlConnect_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x0008): case(0x0009): - dissect_ReadWrite_rqst_block(tvb, offset, pinfo, sub_tree, drep, u16Index, u32RecDataLen); + dissect_ReadWrite_rqst_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen); break; case(0x8001): case(0x8002): - dissect_Alarm_ack_block(tvb, offset, pinfo, sub_tree, drep); + dissect_Alarm_ack_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x8008): case(0x8009): - dissect_ReadWrite_resp_block(tvb, offset, pinfo, sub_tree, drep, u16Index); + dissect_ReadWrite_resp_block(tvb, offset, pinfo, sub_tree, sub_item, drep, u16Index, u32RecDataLen); break; case(0x8101): - dissect_ARBlockRes(tvb, offset, pinfo, sub_tree, drep); + dissect_ARBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x8102): - dissect_IOCRBlockRes(tvb, offset, pinfo, sub_tree, drep); + dissect_IOCRBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x8103): - dissect_AlarmCRBlockRes(tvb, offset, pinfo, sub_tree, drep); + dissect_AlarmCRBlockRes(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x8104): - dissect_ModuleDiffBlock(tvb, offset, pinfo, sub_tree, drep); + dissect_ModuleDiffBlock(tvb, offset, pinfo, sub_tree, sub_item, drep); break; case(0x8110): case(0x8112): case(0x8114): - if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", - val_to_str(u16BlockType, pn_io_block_type, "Unknown")); - dissect_ControlConnect_block(tvb, offset, pinfo, sub_tree, drep); + dissect_ControlConnect_block(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x0200): + case(0x0202): + dissect_PDPortData_Check_Adjust_block(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x0203): + dissect_PDSyncData_block(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); + break; + case(0x0209): + dissect_AdjustDomainBoundary_block(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x20A): + dissect_CheckPeers_block(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x20B): + dissect_CheckPropagationDelayFactor_block(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x20C): + dissect_CheckMAUType_block(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x20E): + dissect_AdjustMAUType_block(tvb, offset, pinfo, sub_tree, sub_item, drep); + break; + case(0x20F): + 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(0x21B): + dissect_AdjustPortState_block(tvb, offset, pinfo, sub_tree, sub_item, drep); break; default: - if (check_col(pinfo->cinfo, COL_INFO) && *u16Index < 3) - col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", - val_to_str(u16BlockType, pn_io_block_type, "Unknown")); - proto_tree_add_string_format(sub_tree, hf_pn_io_data, tvb, offset, u16BodyLength, "undecoded", "Undecoded Data: %d bytes", u16BodyLength); + header_item = proto_tree_add_string_format(sub_tree, hf_pn_io_data, tvb, offset, u16BodyLength, "undecoded", "Undecoded Block Data: %d bytes", u16BodyLength); + expert_add_info_format(pinfo, header_item, PI_UNDECODED, PI_WARN, + "Undecoded block type %s (0x%x), %u bytes", + val_to_str(u16BlockType, pn_io_block_type, ""), + u16BlockType, u16BodyLength); } offset += u16BodyLength; - proto_item_append_text(sub_item, "[%u]: Type=\"%s\" (0x%04x), Length=%u(+4), Version=%u.%u", - *u16Index, val_to_str(u16BlockType, pn_io_block_type, "Unknown"), u16BlockType, - u16BlockLength, u8BlockVersionHigh, u8BlockVersionLow); proto_item_set_len(sub_item, offset - u32SubStart); return offset; @@ -1539,12 +3042,6 @@ dissect_blocks(tvbuff_t *tvb, int offset, u16Index++; } - /* we don't want to have too many blocks in the info column */ - if(u16Index > 3) { - if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, ", ... (%u blocks)", - u16Index); - } return offset; } @@ -1639,133 +3136,132 @@ dissect_IPNIO_resp_header(tvbuff_t *tvb, int offset, } -/* dissect a PN-IO connect request */ +/* dissect a PN-IO request */ static int -dissect_IPNIO_Connect_rqst(tvbuff_t *tvb, int offset, +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); - /* IODConnectReq */ offset = dissect_blocks(tvb, offset, pinfo, tree, drep); return offset; } -/* dissect a PN-IO connect response */ +/* dissect a PN-IO response */ static int -dissect_IPNIO_Connect_resp(tvbuff_t *tvb, int offset, +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); - /* IODConnectRes */ offset = dissect_blocks(tvb, offset, pinfo, tree, drep); return offset; } -/* dissect a PN-IO release request */ static int -dissect_IPNIO_Release_rqst(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) +dissect_RecordDataRead(tvbuff_t *tvb, int offset, + packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 u16Index, guint32 u32RecDataLen) { - - offset = dissect_IPNIO_rqst_header(tvb, offset, pinfo, tree, drep); + proto_item *item; - /* IODReleaseReq */ - offset = dissect_blocks(tvb, offset, pinfo, tree, drep); - - return offset; -} - - -/* dissect a PN-IO release response */ -static int -dissect_IPNIO_Release_resp(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) -{ - - offset = dissect_IPNIO_resp_header(tvb, offset, pinfo, tree, drep); - - /* IODReleaseRes */ - offset = dissect_blocks(tvb, offset, pinfo, tree, drep); - - return offset; -} - - -/* dissect a PN-IO control request */ -static int -dissect_IPNIO_Control_rqst(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) -{ - - offset = dissect_IPNIO_rqst_header(tvb, offset, pinfo, tree, drep); - - /* IODControlReq */ - offset = dissect_blocks(tvb, offset, pinfo, tree, drep); - - return offset; -} - - -/* dissect a PN-IO control response */ -static int -dissect_IPNIO_Control_resp(tvbuff_t *tvb, int offset, - packet_info *pinfo, proto_tree *tree, guint8 *drep) -{ - - offset = dissect_IPNIO_resp_header(tvb, offset, pinfo, tree, drep); + /* user specified format? */ + if(u16Index < 0x8000) { + item = proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, u32RecDataLen, "data", + "RecordDataRead: %d bytes", u32RecDataLen); + offset += u32RecDataLen; + return offset; + } - /* IODControlRes */ - offset = dissect_blocks(tvb, offset, pinfo, tree, drep); + /* see: pn_io_index */ + switch(u16Index) { + case(0x8001): /* RealIdentificationData */ + case(0x802a): /* PDPortDataReal */ + case(0x802b): /* PDPortDataCheck */ + case(0x802d): /* PDSyncData */ + case(0x802e): /* PDSyncData */ + case(0x802f): /* PDPortDataAdjust */ + case(0xe00c): + case(0xe010): + case(0xe012): + case(0xf000): /* RealIdentificationData */ + offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen); + break; + default: + item = proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, u32RecDataLen, "data", + "RecordDataRead: %d bytes", u32RecDataLen); + expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, + "Undecoded index %s (0x%x), %u bytes", + val_to_str(u16Index, pn_io_index, ""), + u16Index, u32RecDataLen); + offset += u32RecDataLen; + } return offset; } -/* dissect a PN-IO read request */ +/* dissect a PN-IO read response */ static int -dissect_IPNIO_Read_rqst(tvbuff_t *tvb, int offset, +dissect_IPNIO_Read_resp(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, guint8 *drep) { guint16 u16Index = 0; guint32 u32RecDataLen; - offset = dissect_IPNIO_rqst_header(tvb, offset, pinfo, tree, drep); + offset = dissect_IPNIO_resp_header(tvb, offset, pinfo, tree, drep); - /* IODReadReq */ + /* IODReadHeader */ offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen); + /* RecordDataRead */ + if(u32RecDataLen != 0) { + offset = dissect_RecordDataRead(tvb, offset, pinfo, tree, drep, u16Index, 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) +dissect_RecordDataWrite(tvbuff_t *tvb, int offset, + packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 u16Index, guint32 u32RecDataLen) { - gint remain; - guint16 u16Index = 0; - guint32 u32RecDataLen; - - offset = dissect_IPNIO_resp_header(tvb, offset, pinfo, tree, drep); + proto_item *item; - /* IODReadHeader */ - offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen); + /* user specified format? */ + if(u16Index < 0x8000) { + item = proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, u32RecDataLen, "data", + "RecordDataWrite: %d bytes", u32RecDataLen); + offset += u32RecDataLen; + return offset; + } - /* XXX - RecordDataRead: dissection not yet implemented */ - remain = tvb_length_remaining(tvb, offset); - proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, remain, "data", "User Data: %d bytes", remain); - offset += remain; + /* see: pn_io_index */ + switch(u16Index) { + case(0x802b): /* PDPortDataCheck */ + case(0x802c): /* PDirData */ + case(0x802d): /* PDSyncData */ + case(0x802e): /* PDSyncData */ + case(0x802f): /* PDPortDataAdjust */ + offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen); + break; + default: + item = proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, u32RecDataLen, "data", + "RecordDataWrite: %d bytes", u32RecDataLen); + expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN, + "Undecoded index %s (0x%x), %u bytes", + val_to_str(u16Index, pn_io_index, ""), + u16Index, u32RecDataLen); + offset += u32RecDataLen; + } - return offset; + return offset; } @@ -1781,7 +3277,6 @@ dissect_IODWriteReq(tvbuff_t *tvb, int offset, /* IODWriteHeader */ offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen); - /* IODWriteMultipleReq? */ if(u16Index == 0xe040) { while((remain = tvb_length_remaining(tvb, offset)) > 0) { @@ -1789,11 +3284,9 @@ dissect_IODWriteReq(tvbuff_t *tvb, int offset, } } else { /* RecordDataWrite */ - /* XXX - dissection not yet implemented */ - proto_tree_add_string_format(tree, hf_pn_io_data, tvb, offset, u32RecDataLen, "data", "RecordDataWrite: %d bytes", u32RecDataLen); - offset += u32RecDataLen; + offset = dissect_RecordDataWrite(tvb, offset, pinfo, tree, drep, u16Index, u32RecDataLen); - /* XXX - add padding (required with IODWriteMultipleReq) */ + /* add padding (required with IODWriteMultipleReq) */ switch(offset % 4) { case(3): offset += 1; @@ -2084,12 +3577,12 @@ dissect_PNIO_heur(tvbuff_t *tvb, /* the PNIO dcerpc interface table */ static dcerpc_sub_dissector pn_io_dissectors[] = { -{ 0, "Connect", dissect_IPNIO_Connect_rqst, dissect_IPNIO_Connect_resp }, -{ 1, "Release", dissect_IPNIO_Release_rqst, dissect_IPNIO_Release_resp }, -{ 2, "Read", dissect_IPNIO_Read_rqst, dissect_IPNIO_Read_resp }, +{ 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_Control_rqst, dissect_IPNIO_Control_resp }, -{ 5, "Read Implicit", dissect_IPNIO_Read_rqst, dissect_IPNIO_Read_resp }, +{ 4, "Control", dissect_IPNIO_rqst, dissect_IPNIO_resp }, +{ 5, "Read Implicit", dissect_IPNIO_rqst, dissect_IPNIO_Read_resp }, { 0, NULL, NULL, NULL } }; @@ -2124,7 +3617,26 @@ proto_register_pn_io (void) { &hf_pn_io_cminitiator_objectuuid, { "CMInitiatorObjectUUID", "pn_io.cminitiator_uuid", FT_GUID, BASE_NONE, 0x0, 0x0, "", HFILL }}, { &hf_pn_io_ar_properties, - { "ARProperties", "pn_io.ar_properties", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }}, /* XXX - 32 bitfield! */ + { "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_reserved, + { "Reserved", "pn_io.ar_properties.reserved", FT_UINT32, BASE_HEX, NULL, 0x7FFFF800, "", 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, @@ -2145,8 +3657,18 @@ proto_register_pn_io (void) { "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 }}, /* XXX - 32 bitfield! */ + + { &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_frame_id, @@ -2181,9 +3703,17 @@ proto_register_pn_io (void) { "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, NULL, 0x0, "", HFILL }}, - { &hf_pn_io_alarmcr_properties, - { "AlarmCRProperties", "pn_io.alarmcr_properties", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }}, /* XXX - 32 bitfield! */ + { "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, @@ -2219,7 +3749,7 @@ proto_register_pn_io (void) { &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, NULL, 0x0, "", HFILL }}, + { "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, @@ -2268,7 +3798,7 @@ proto_register_pn_io (void) { &hf_pn_io_error_code1_pnio, { "ErrorCode1 (PNIO)", "pn_io.error_code1", FT_UINT8, BASE_HEX, VALS(pn_io_error_code1_pnio), 0x0, "", HFILL }}, { &hf_pn_io_block, - { "Block", "pn_io.block", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }}, + { "", "pn_io.block", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }}, { &hf_pn_io_data, { "Undecoded Data", "pn_io.data", FT_STRING, BASE_DEC, NULL, 0x0, "", HFILL }}, @@ -2322,11 +3852,43 @@ proto_register_pn_io (void) { &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_HEX, NULL, 0x0, "", HFILL }}, + { "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 }}, @@ -2355,7 +3917,100 @@ proto_register_pn_io (void) { &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 }} + { "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_port_state, + { "PortState", "pn_io.port_state", FT_UINT16, BASE_HEX, VALS(pn_io_port_state), 0x0, "", HFILL }}, + { &hf_pn_io_propagation_delay_factor, + { "PropagationDelayFactor", "pn_io.propagation_delay_factor", FT_UINT32, BASE_DEC, NULL, 0x0, "", 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_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_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_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 }}, }; @@ -2375,7 +4030,14 @@ proto_register_pn_io (void) &ett_pn_io_module, &ett_pn_io_submodule, &ett_pn_io_io_data_object, - &ett_pn_io_io_cs + &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_subslot }; proto_pn_io = proto_register_protocol ("PROFINET IO", "PNIO", "pn_io"); |