bb3c13408abcd0225065b040805d05bf53924feb
[obnox/wireshark/wip.git] / plugins / profinet / packet-dcerpc-pn-io.c
1 /* packet-dcerpc-pn-io.c
2  * Routines for PROFINET IO dissection.
3  *
4  * $Id$
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  */
24
25 /*
26  * The PN-IO protocol is a field bus protocol related to decentralized
27  * periphery and is developed by the PROFIBUS Nutzerorganisation e.V. (PNO),
28  * see: www.profibus.com
29  *
30  *
31  * PN-IO is based on the common DCE-RPC and the "lightweight" PN-RT
32  * (ethernet type 0x8892) protocols.
33  *
34  * The context manager (CM) part is handling context information
35  * (like establishing, ...) and is using DCE-RPC as it's underlying
36  * protocol.
37  *
38  * The actual cyclic data transfer and acyclic notification uses the
39  * "lightweight" PN-RT protocol.
40  *
41  * There are some other related PROFINET protocols (e.g. PN-DCP, which is
42  * handling addressing topics).
43  *
44  * Please note: the PROFINET CBA protocol is independant of the PN-IO protocol!
45  */
46
47
48 #ifdef HAVE_CONFIG_H
49 #include "config.h"
50 #endif
51
52
53 #ifdef HAVE_SYS_TYPES_H
54 #include <sys/types.h>
55 #endif
56
57 #include <string.h>
58
59 #include <glib.h>
60 #include <epan/packet.h>
61 #include <epan/emem.h>
62 #include <epan/dissectors/packet-dcerpc.h>
63 #include <epan/expert.h>
64 #include <epan/dissector_filters.h>
65
66 #include "packet-pn.h"
67
68
69
70 static int proto_pn_io = -1;
71
72 static int hf_pn_io_opnum = -1;
73 static int hf_pn_io_reserved16 = -1;
74
75 static int hf_pn_io_array = -1;
76 static int hf_pn_io_status = -1;
77 static int hf_pn_io_args_max = -1;
78 static int hf_pn_io_args_len = -1;
79 static int hf_pn_io_array_max_count = -1;
80 static int hf_pn_io_array_offset = -1;
81 static int hf_pn_io_array_act_count = -1;
82
83 static int hf_pn_io_ar_type = -1;
84 static int hf_pn_io_cminitiator_macadd = -1;
85 static int hf_pn_io_cminitiator_objectuuid = -1;
86 static int hf_pn_io_parameter_server_objectuuid = -1;
87 static int hf_pn_io_ar_data = -1;
88 static int hf_pn_io_ar_properties = -1;
89 static int hf_pn_io_ar_properties_state = -1;
90 static int hf_pn_io_ar_properties_supervisor_takeover_allowed = -1;
91 static int hf_pn_io_ar_properties_parametrization_server = -1;
92 /* removed within 2.3
93 static int hf_pn_io_ar_properties_data_rate = -1;
94 */
95 static int hf_pn_io_ar_properties_reserved_1 = -1;
96 static int hf_pn_io_ar_properties_device_access = -1;
97 static int hf_pn_io_ar_properties_companion_ar = -1;
98 static int hf_pn_io_ar_properties_achnowledge_companion_ar = -1;
99 static int hf_pn_io_ar_properties_reserved = -1;
100 static int hf_pn_io_ar_properties_pull_module_alarm_allowed = -1;
101
102 static int hf_pn_RedundancyInfo = -1;
103 static int hf_pn_RedundancyInfo_reserved = -1;
104 static int hf_pn_io_number_of_ARDATAInfo = -1;
105
106 static int hf_pn_io_cminitiator_activitytimeoutfactor = -1;
107 static int hf_pn_io_cminitiator_udprtport = -1;
108 static int hf_pn_io_station_name_length = -1;
109 static int hf_pn_io_cminitiator_station_name = -1;
110 static int hf_pn_io_responder_station_name = -1;
111 static int hf_pn_io_arproperties_StartupMode = -1;
112
113 static int hf_pn_io_parameter_server_station_name = -1;
114
115 static int hf_pn_io_cmresponder_macadd = -1;
116 static int hf_pn_io_cmresponder_udprtport = -1;
117
118 static int hf_pn_io_number_of_iocrs = -1;
119 static int hf_pn_io_iocr_tree = -1;
120 static int hf_pn_io_iocr_type = -1;
121 static int hf_pn_io_iocr_reference = -1;
122 static int hf_pn_io_iocr_SubframeOffset = -1;
123 static int hf_pn_io_iocr_SubframeData =-1;
124 static int hf_pn_io_iocr_txports_port = -1;
125 static int hf_pn_io_iocr_txports_redundantport = -1;
126 static int hf_pn_io_sr_properties_Reserved_1 = -1;
127 static int hf_pn_io_sr_properties_Reserved_2 = -1;
128 static int hf_pn_io_RedundancyDataHoldFactor = -1;
129 static int hf_pn_io_sr_properties = -1;
130 static int hf_pn_io_sr_properties_InputValidOnBackupAR = -1;
131 static int hf_pn_io_sr_properties_ActivateRedundancyAlarm = -1;
132
133 static int hf_pn_io_lt = -1;
134 static int hf_pn_io_iocr_properties = -1;
135 static int hf_pn_io_iocr_properties_rtclass = -1;
136 static int hf_pn_io_iocr_properties_reserved_1 = -1;
137 static int hf_pn_io_iocr_properties_media_redundancy = -1;
138 static int hf_pn_io_iocr_properties_reserved_2 = -1;
139 static int hf_pn_io_iocr_properties_reserved_3 = -1;
140 static int hf_pn_io_iocr_properties_fast_forwarding_mac_adr = -1;
141 static int hf_pn_io_iocr_properties_distributed_subframe_watchdog = -1;
142 static int hf_pn_io_iocr_properties_full_subframe_structure = -1;
143
144
145 static int hf_pn_io_data_length = -1;
146 static int hf_pn_io_ir_frame_data = -1;
147 static int hf_pn_io_frame_id = -1;
148 static int hf_pn_io_send_clock_factor = -1;
149 static int hf_pn_io_reduction_ratio = -1;
150 static int hf_pn_io_phase = -1;
151 static int hf_pn_io_sequence = -1;
152 static int hf_pn_io_frame_send_offset = -1;
153 static int hf_pn_io_frame_data_properties = -1;
154 static int hf_pn_io_watchdog_factor = -1;
155 static int hf_pn_io_data_hold_factor = -1;
156 static int hf_pn_io_iocr_tag_header = -1;
157 static int hf_pn_io_iocr_multicast_mac_add = -1;
158 static int hf_pn_io_number_of_apis = -1;
159 static int hf_pn_io_number_of_io_data_objects = -1;
160 static int hf_pn_io_io_data_object_frame_offset = -1;
161 static int hf_pn_io_number_of_iocs = -1;
162 static int hf_pn_io_iocs_frame_offset = -1;
163
164 static int hf_pn_io_SFIOCRProperties = -1;
165 static int hf_pn_io_DistributedWatchDogFactor = -1;
166 static int hf_pn_io_RestartFactorForDistributedWD = -1;
167 static int hf_pn_io_SFIOCRProperties_DFPmode = -1;
168 static int hf_pn_io_SFIOCRProperties_reserved_1 = -1;
169 static int hf_pn_io_SFIOCRProperties_reserved_2 = -1;
170 static int hf_pn_io_SFIOCRProperties_DFPRedundantPathLayout = -1;
171 static int hf_pn_io_SFIOCRProperties_SFCRC16 = -1;
172
173 static int hf_pn_io_subframe_data = -1;
174 static int hf_pn_io_subframe_data_reserved1 = -1;
175 static int hf_pn_io_subframe_data_reserved2 = -1;
176
177 static int hf_pn_io_subframe_data_position = -1;
178 static int hf_pn_io_subframe_reserved1 = -1;
179 static int hf_pn_io_subframe_data_length = -1;
180 static int hf_pn_io_subframe_reserved2 = -1;
181
182 static int hf_pn_io_alarmcr_type = -1;
183 static int hf_pn_io_alarmcr_properties = -1;
184 static int hf_pn_io_alarmcr_properties_priority = -1;
185 static int hf_pn_io_alarmcr_properties_transport = -1;
186 static int hf_pn_io_alarmcr_properties_reserved = -1;
187
188 static int hf_pn_io_rta_timeoutfactor = -1;
189 static int hf_pn_io_rta_retries = -1;
190 static int hf_pn_io_localalarmref = -1;
191 static int hf_pn_io_remotealarmref = -1;
192 static int hf_pn_io_maxalarmdatalength = -1;
193 static int hf_pn_io_alarmcr_tagheaderhigh = -1;
194 static int hf_pn_io_alarmcr_tagheaderlow = -1;
195
196 static int hf_pn_io_IRData_uuid = -1;
197 static int hf_pn_io_ar_uuid = -1;
198 static int hf_pn_io_target_ar_uuid = -1;
199 static int hf_pn_io_api_tree = -1;
200 static int hf_pn_io_module_tree = -1;
201 static int hf_pn_io_submodule_tree = -1;
202 static int hf_pn_io_io_data_object = -1;
203 static int hf_pn_io_io_cs = -1;
204
205 static int hf_pn_io_substitutionmode = -1;
206
207 static int hf_pn_io_api = -1;
208 static int hf_pn_io_slot_nr = -1;
209 static int hf_pn_io_subslot_nr = -1;
210 static int hf_pn_io_index = -1;
211 static int hf_pn_io_seq_number = -1;
212 static int hf_pn_io_record_data_length = -1;
213 static int hf_pn_io_add_val1 = -1;
214 static int hf_pn_io_add_val2 = -1;
215
216 static int hf_pn_io_block = -1;
217 static int hf_pn_io_block_header = -1;
218 static int hf_pn_io_block_type = -1;
219 static int hf_pn_io_block_length = -1;
220 static int hf_pn_io_block_version_high = -1;
221 static int hf_pn_io_block_version_low = -1;
222
223 static int hf_pn_io_sessionkey = -1;
224 static int hf_pn_io_control_command = -1;
225 static int hf_pn_io_control_command_prmend = -1;
226 static int hf_pn_io_control_command_applready = -1;
227 static int hf_pn_io_control_command_release = -1;
228 static int hf_pn_io_control_command_done = -1;
229 static int hf_pn_io_control_command_ready_for_companion = -1;
230 static int hf_pn_io_control_command_ready_for_rt_class3 = -1;
231 static int hf_pn_io_control_command_prmbegin = -1;
232 static int hf_pn_io_control_command_reserved_7_15 = -1;
233 static int hf_pn_io_control_block_properties = -1;
234 static int hf_pn_io_control_block_properties_applready = -1;
235 static int hf_pn_io_control_block_properties_applready0 = -1;
236
237 static int hf_pn_io_AlarmSequenceNumber = -1;
238 static int hf_pn_io_control_command_reserved = -1;
239 static int hf_pn_io_SubmoduleListEntries = -1;
240 static int hf_pn_io_error_code = -1;
241 static int hf_pn_io_error_decode = -1;
242 static int hf_pn_io_error_code1 = -1;
243 static int hf_pn_io_error_code1_pniorw = -1;
244 static int hf_pn_io_error_code1_pnio = -1;
245 static int hf_pn_io_error_code2 = -1;
246 static int hf_pn_io_error_code2_pniorw = -1;
247 static int hf_pn_io_error_code2_pnio_1 = -1;
248 static int hf_pn_io_error_code2_pnio_2 = -1;
249 static int hf_pn_io_error_code2_pnio_3 = -1;
250 static int hf_pn_io_error_code2_pnio_4 = -1;
251 static int hf_pn_io_error_code2_pnio_5 = -1;
252 static int hf_pn_io_error_code2_pnio_6 = -1;
253 static int hf_pn_io_error_code2_pnio_7 = -1;
254 static int hf_pn_io_error_code2_pnio_8 = -1;
255 static int hf_pn_io_error_code2_pnio_20 = -1;
256 static int hf_pn_io_error_code2_pnio_21 = -1;
257 static int hf_pn_io_error_code2_pnio_22 = -1;
258 static int hf_pn_io_error_code2_pnio_23 = -1;
259 static int hf_pn_io_error_code2_pnio_40 = -1;
260 static int hf_pn_io_error_code2_pnio_61 = -1;
261 static int hf_pn_io_error_code2_pnio_62 = -1;
262 static int hf_pn_io_error_code2_pnio_63 = -1;
263 static int hf_pn_io_error_code2_pnio_64 = -1;
264 static int hf_pn_io_error_code2_pnio_65 = -1;
265 static int hf_pn_io_error_code2_pnio_66 = -1;
266 static int hf_pn_io_error_code2_pnio_70 = -1;
267 static int hf_pn_io_error_code2_pnio_71 = -1;
268 static int hf_pn_io_error_code2_pnio_72 = -1;
269 static int hf_pn_io_error_code2_pnio_73 = -1;
270 static int hf_pn_io_error_code2_pnio_74 = -1;
271 static int hf_pn_io_error_code2_pnio_75 = -1;
272 static int hf_pn_io_error_code2_pnio_76 = -1;
273 static int hf_pn_io_error_code2_pnio_77 = -1;
274 static int hf_pn_io_error_code2_pnio_253 = -1;
275 static int hf_pn_io_error_code2_pnio_255 = -1;
276
277 static int hf_pn_io_alarm_type = -1;
278 static int hf_pn_io_alarm_specifier = -1;
279 static int hf_pn_io_alarm_specifier_sequence = -1;
280 static int hf_pn_io_alarm_specifier_channel = -1;
281 static int hf_pn_io_alarm_specifier_manufacturer = -1;
282 static int hf_pn_io_alarm_specifier_submodule = -1;
283 static int hf_pn_io_alarm_specifier_ardiagnosis = -1;
284
285 static int hf_pn_io_alarm_dst_endpoint = -1;
286 static int hf_pn_io_alarm_src_endpoint = -1;
287 static int hf_pn_io_pdu_type = -1;
288 static int hf_pn_io_pdu_type_type = -1;
289 static int hf_pn_io_pdu_type_version = -1;
290 static int hf_pn_io_add_flags = -1;
291 static int hf_pn_io_window_size = -1;
292 static int hf_pn_io_tack = -1;
293 static int hf_pn_io_send_seq_num = -1;
294 static int hf_pn_io_ack_seq_num = -1;
295 static int hf_pn_io_var_part_len = -1;
296
297 static int hf_pn_io_number_of_modules = -1;
298 static int hf_pn_io_module_ident_number = -1;
299 static int hf_pn_io_module_properties = -1;
300 static int hf_pn_io_module_state = -1;
301 static int hf_pn_io_number_of_submodules = -1;
302 static int hf_pn_io_submodule_ident_number = -1;
303 static int hf_pn_io_submodule_properties = -1;
304 static int hf_pn_io_submodule_properties_type = -1;
305 static int hf_pn_io_submodule_properties_shared_input = -1;
306 static int hf_pn_io_submodule_properties_reduce_input_submodule_data_length = -1;
307 static int hf_pn_io_submodule_properties_reduce_output_submodule_data_length = -1;
308 static int hf_pn_io_submodule_properties_discard_ioxs = -1;
309 static int hf_pn_io_submodule_properties_reserved = -1;
310
311 static int hf_pn_io_submodule_state = -1;
312 static int hf_pn_io_submodule_state_format_indicator = -1;
313 static int hf_pn_io_submodule_state_add_info = -1;
314 static int hf_pn_io_submodule_state_qualified_info = -1;
315 static int hf_pn_io_submodule_state_maintenance_required = -1;
316 static int hf_pn_io_submodule_state_maintenance_demanded = -1;
317 static int hf_pn_io_submodule_state_diag_info = -1;
318 static int hf_pn_io_submodule_state_ar_info = -1;
319 static int hf_pn_io_submodule_state_ident_info = -1;
320 static int hf_pn_io_submodule_state_detail = -1;
321
322 static int hf_pn_io_data_description_tree = -1;
323 static int hf_pn_io_data_description = -1;
324 static int hf_pn_io_submodule_data_length = -1;
325 static int hf_pn_io_length_iocs = -1;
326 static int hf_pn_io_length_iops = -1;
327
328 static int hf_pn_io_iocs = -1;
329 static int hf_pn_io_iops = -1;
330 static int hf_pn_io_ioxs = -1;
331 static int hf_pn_io_ioxs_extension = -1;
332 static int hf_pn_io_ioxs_res14 = -1;
333 static int hf_pn_io_ioxs_instance = -1;
334 static int hf_pn_io_ioxs_datastate = -1;
335
336 static int hf_pn_io_address_resolution_properties = -1;
337 static int hf_pn_io_mci_timeout_factor = -1;
338 static int hf_pn_io_provider_station_name = -1;
339
340 static int hf_pn_io_user_structure_identifier = -1;
341
342 static int hf_pn_io_channel_number = -1;
343 static int hf_pn_io_channel_properties = -1;
344 static int hf_pn_io_channel_properties_type = -1;
345 static int hf_pn_io_channel_properties_accumulative = -1;
346 static int hf_pn_io_channel_properties_maintenance = -1;
347 /* replaced with 2 bit values
348 static int hf_pn_io_channel_properties_maintenance_required = -1;
349 static int hf_pn_io_channel_properties_maintenance_demanded = -1;
350 */
351 static int hf_pn_io_NumberOfSubframeBlocks = -1;
352 static int hf_pn_io_channel_properties_specifier = -1;
353 static int hf_pn_io_channel_properties_direction = -1;
354
355 static int hf_pn_io_channel_error_type = -1;
356 static int hf_pn_io_ext_channel_error_type0 = -1;
357 static int hf_pn_io_ext_channel_error_type0x8000 = -1;
358 static int hf_pn_io_ext_channel_error_type0x8001 = -1;
359 static int hf_pn_io_ext_channel_error_type0x8002 = -1;
360 static int hf_pn_io_ext_channel_error_type0x8003 = -1;
361 static int hf_pn_io_ext_channel_error_type0x8004 = -1;
362 static int hf_pn_io_ext_channel_error_type0x8005 = -1;
363 static int hf_pn_io_ext_channel_error_type0x8007 = -1;
364 static int hf_pn_io_ext_channel_error_type0x8008 = -1;
365 static int hf_pn_io_ext_channel_error_type0x800A = -1;
366 static int hf_pn_io_ext_channel_error_type0x800B = -1;
367 static int hf_pn_io_ext_channel_error_type0x800C = -1;
368
369 static int hf_pn_io_ext_channel_error_type = -1;
370
371 static int hf_pn_io_ext_channel_add_value = -1;
372
373 static int hf_pn_io_ptcp_subdomain_id = -1;
374 static int hf_pn_io_ir_data_id = -1;
375 static int hf_pn_io_max_bridge_delay = -1;
376 static int hf_pn_io_number_of_ports = -1;
377 static int hf_pn_io_max_port_tx_delay = -1;
378 static int hf_pn_io_max_port_rx_delay = -1;
379
380 static int hf_pn_io_max_line_rx_delay = -1;
381 static int hf_pn_io_yellowtime = -1;
382 static int hf_pn_io_reserved_interval_begin = -1;
383 static int hf_pn_io_reserved_interval_end = -1;
384 static int hf_pn_io_pllwindow = -1;
385 static int hf_pn_io_sync_send_factor = -1;
386 static int hf_pn_io_sync_properties = -1;
387 static int hf_pn_io_sync_frame_address = -1;
388 static int hf_pn_io_ptcp_timeout_factor = -1;
389 static int hf_pn_io_ptcp_takeover_timeout_factor = -1;
390 static int hf_pn_io_ptcp_master_startup_time = -1;
391 static int hf_pn_io_ptcp_master_priority_1 = -1;
392 static int hf_pn_io_ptcp_master_priority_2 = -1;
393 static int hf_pn_io_ptcp_length_subdomain_name = -1;
394 static int hf_pn_io_ptcp_subdomain_name = -1;
395
396 /* added Portstatistics */
397 static int hf_pn_io_pdportstatistic_ifInOctets = -1;
398 static int hf_pn_io_pdportstatistic_ifOutOctets = -1;
399 static int hf_pn_io_pdportstatistic_ifInDiscards = -1;
400 static int hf_pn_io_pdportstatistic_ifOutDiscards = -1;
401 static int hf_pn_io_pdportstatistic_ifInErrors = -1;
402 static int hf_pn_io_pdportstatistic_ifOutErrors = -1;
403 /* end of port statistics */
404
405 static int hf_pn_io_domain_boundary = -1;
406 static int hf_pn_io_domain_boundary_ingress = -1;
407 static int hf_pn_io_domain_boundary_egress = -1;
408 static int hf_pn_io_multicast_boundary = -1;
409 static int hf_pn_io_adjust_properties = -1;
410 static int hf_pn_io_PreambleLength = -1;
411 static int hf_pn_io_mau_type = -1;
412 static int hf_pn_io_mau_type_mode = -1;
413 static int hf_pn_io_port_state = -1;
414 static int hf_pn_io_line_delay = -1;
415 static int hf_pn_io_number_of_peers = -1;
416 static int hf_pn_io_length_peer_port_id = -1;
417 static int hf_pn_io_peer_port_id = -1;
418 static int hf_pn_io_length_peer_chassis_id = -1;
419 static int hf_pn_io_peer_chassis_id = -1;
420 static int hf_pn_io_length_own_port_id = -1;
421 static int hf_pn_io_own_port_id = -1;
422 static int hf_pn_io_peer_macadd = -1;
423 static int hf_pn_io_media_type = -1;
424 static int hf_pn_io_macadd = -1;
425 static int hf_pn_io_length_own_chassis_id = -1;
426 static int hf_pn_io_own_chassis_id = -1;
427
428 static int hf_pn_io_ethertype = -1;
429 static int hf_pn_io_rx_port = -1;
430 static int hf_pn_io_frame_details = -1;
431 static int hf_pn_io_frame_details_sync_frame = -1;
432 static int hf_pn_io_frame_details_meaning_frame_send_offset = -1;
433 static int hf_pn_io_frame_details_reserved = -1;
434 static int hf_pn_io_nr_of_tx_port_groups = -1;
435 static int hf_pn_io_TxPortGroupProperties = -1;
436 static int hf_pn_io_TxPortGroupProperties_bit0 = -1;
437 static int hf_pn_io_TxPortGroupProperties_bit1 = -1;
438 static int hf_pn_io_TxPortGroupProperties_bit2 = -1;
439 static int hf_pn_io_TxPortGroupProperties_bit3 = -1;
440 static int hf_pn_io_TxPortGroupProperties_bit4 = -1;
441 static int hf_pn_io_TxPortGroupProperties_bit5 = -1;
442 static int hf_pn_io_TxPortGroupProperties_bit6 = -1;
443 static int hf_pn_io_TxPortGroupProperties_bit7 = -1;
444
445 static int hf_pn_io_start_of_red_frame_id = -1;
446 static int hf_pn_io_end_of_red_frame_id = -1;
447 static int hf_pn_io_ir_begin_end_port = -1;
448 static int hf_pn_io_number_of_assignments = -1;
449 static int hf_pn_io_number_of_phases = -1;
450 static int hf_pn_io_red_orange_period_begin = -1;
451 static int hf_pn_io_orange_period_begin = -1;
452 static int hf_pn_io_green_period_begin = -1;
453 static int hf_pn_io_tx_phase_assignment = -1;
454 static int hf_pn_io_rx_phase_assignment = -1;
455
456 static int hf_pn_io_slot = -1;
457 static int hf_pn_io_subslot = -1;
458 static int hf_pn_io_number_of_slots = -1;
459 static int hf_pn_io_number_of_subslots = -1;
460
461 static int hf_pn_io_maintenance_required_drop_budget = -1;
462 static int hf_pn_io_maintenance_demanded_drop_budget = -1;
463 static int hf_pn_io_error_drop_budget = -1;
464
465 static int hf_pn_io_maintenance_required_power_budget = -1;
466 static int hf_pn_io_maintenance_demanded_power_budget = -1;
467 static int hf_pn_io_error_power_budget = -1;
468
469 static int hf_pn_io_fiber_optic_type = -1;
470 static int hf_pn_io_fiber_optic_cable_type = -1;
471
472 static int hf_pn_io_controller_appl_cycle_factor = -1;
473 static int hf_pn_io_time_data_cycle = -1;
474 static int hf_pn_io_time_io_input = -1;
475 static int hf_pn_io_time_io_output = -1;
476 static int hf_pn_io_time_io_input_valid = -1;
477 static int hf_pn_io_time_io_output_valid = -1;
478
479 static int hf_pn_io_maintenance_status = -1;
480 static int hf_pn_io_maintenance_status_required = -1;
481 static int hf_pn_io_maintenance_status_demanded = -1;
482
483 static int hf_pn_io_vendor_id_high = -1;
484 static int hf_pn_io_vendor_id_low = -1;
485 static int hf_pn_io_vendor_block_type = -1;
486 static int hf_pn_io_order_id = -1;
487 static int hf_pn_io_im_serial_number = -1;
488 static int hf_pn_io_im_hardware_revision = -1;
489 static int hf_pn_io_im_revision_prefix = -1;
490 static int hf_pn_io_im_sw_revision_functional_enhancement = -1;
491 static int hf_pn_io_im_revision_bugfix = -1;
492 static int hf_pn_io_im_sw_revision_internal_change = -1;
493 static int hf_pn_io_im_revision_counter = -1;
494 static int hf_pn_io_im_profile_id = -1;
495 static int hf_pn_io_im_profile_specific_type = -1;
496 static int hf_pn_io_im_version_major = -1;
497 static int hf_pn_io_im_version_minor = -1;
498 static int hf_pn_io_im_supported = -1;
499
500 static int hf_pn_io_number_of_ars = -1;
501
502 static int hf_pn_io_cycle_counter = -1;
503 static int hf_pn_io_data_status = -1;
504 static int hf_pn_io_data_status_res67 = -1;
505 static int hf_pn_io_data_status_ok = -1;
506 static int hf_pn_io_data_status_operate = -1;
507 static int hf_pn_io_data_status_res3 = -1;
508 static int hf_pn_io_data_status_valid = -1;
509 static int hf_pn_io_data_status_res1 = -1;
510 static int hf_pn_io_data_status_primary = -1;
511 static int hf_pn_io_transfer_status = -1;
512
513 static int hf_pn_io_actual_local_time_stamp = -1;
514 static int hf_pn_io_number_of_log_entries = -1;
515 static int hf_pn_io_local_time_stamp = -1;
516 static int hf_pn_io_entry_detail = -1;
517
518 static int hf_pn_io_ip_address = -1;
519 static int hf_pn_io_subnetmask = -1;
520 static int hf_pn_io_standard_gateway = -1;
521
522 static int hf_pn_io_mrp_domain_uuid = -1;
523 static int hf_pn_io_mrp_role = -1;
524 static int hf_pn_io_mrp_length_domain_name = -1;
525 static int hf_pn_io_mrp_domain_name = -1;
526
527 static int hf_pn_io_mrp_prio = -1;
528 static int hf_pn_io_mrp_topchgt = -1;
529 static int hf_pn_io_mrp_topnrmax = -1;
530 static int hf_pn_io_mrp_tstshortt = -1;
531 static int hf_pn_io_mrp_tstdefaultt = -1;
532 static int hf_pn_io_mrp_tstnrmax = -1;
533 static int hf_pn_io_mrp_check = -1;
534
535 static int hf_pn_io_mrp_rtmode = -1;
536 static int hf_pn_io_mrp_rtmode_rtclass12 = -1;
537 static int hf_pn_io_mrp_rtmode_rtclass3 = -1;
538 static int hf_pn_io_mrp_rtmode_reserved1 = -1;
539 static int hf_pn_io_mrp_rtmode_reserved2 = -1;
540
541 static int hf_pn_io_mrp_lnkdownt = -1;
542 static int hf_pn_io_mrp_lnkupt = -1;
543 static int hf_pn_io_mrp_lnknrmax = -1;
544 static int hf_pn_io_mrp_version = -1;
545
546 static int hf_pn_io_substitute_active_flag = -1;
547 static int hf_pn_io_length_data = -1;
548
549 static int hf_pn_io_mrp_ring_state = -1;
550 static int hf_pn_io_mrp_rt_state = -1;
551
552 static int hf_pn_io_im_tag_function = -1;
553 static int hf_pn_io_im_tag_location = -1;
554 static int hf_pn_io_im_date = -1;
555 static int hf_pn_io_im_descriptor = -1;
556
557 static int hf_pn_io_fs_hello_mode = -1;
558 static int hf_pn_io_fs_hello_interval = -1;
559 static int hf_pn_io_fs_hello_retry = -1;
560 static int hf_pn_io_fs_hello_delay = -1;
561
562 static int hf_pn_io_fs_parameter_mode = -1;
563 static int hf_pn_io_fs_parameter_uuid = -1;
564
565
566 static int hf_pn_io_check_sync_mode = -1;
567 static int hf_pn_io_check_sync_mode_reserved = -1;
568 static int hf_pn_io_check_sync_mode_sync_master = -1;
569 static int hf_pn_io_check_sync_mode_cable_delay = -1;
570
571 static int hf_pn_io_profisafe_f_prm_flag1 = -1;
572 static int hf_pn_io_profisafe_f_prm_flag1_chck_seq = -1;
573 static int hf_pn_io_profisafe_f_prm_flag1_chck_ipar = -1;
574 static int hf_pn_io_profisafe_f_prm_flag1_sil = -1;
575 static int hf_pn_io_profisafe_f_prm_flag1_crc_len = -1;
576 static int hf_pn_io_profisafe_f_prm_flag1_reserved = -1;
577 static int hf_pn_io_profisafe_f_prm_flag2 = -1;
578 static int hf_pn_io_profisafe_f_src_addr = -1;
579 static int hf_pn_io_profisafe_f_dst_addr = -1;
580 static int hf_pn_io_profisafe_f_wd_time = -1;
581 static int hf_pn_io_profisafe_f_par_crc = -1;
582 static int hf_pn_io_profisafe_f_prm_flag2_reserved = -1;
583 static int hf_pn_io_profisafe_f_prm_flag2_f_block_id = -1;
584 static int hf_pn_io_profisafe_f_prm_flag2_f_par_version = -1;
585
586 static int hf_pn_io_profidrive_request_reference = -1;
587 static int hf_pn_io_profidrive_request_id = -1;
588 static int hf_pn_io_profidrive_do_id = -1;
589 static int hf_pn_io_profidrive_no_of_parameters = -1;
590 static int hf_pn_io_profidrive_response_id = -1;
591 static int hf_pn_io_profidrive_param_attribute = -1;
592 static int hf_pn_io_profidrive_param_no_of_elems = -1;
593 static int hf_pn_io_profidrive_param_number = -1;
594 static int hf_pn_io_profidrive_param_subindex = -1;
595 static int hf_pn_io_profidrive_param_format = -1;
596 static int hf_pn_io_profidrive_param_no_of_values = -1;
597 static int hf_pn_io_profidrive_param_value = -1;
598
599 static int hf_pn_io_packedframe_SFCRC = -1;
600 static gint ett_pn_io = -1;
601 static gint ett_pn_io_block = -1;
602 static gint ett_pn_io_block_header = -1;
603 static gint ett_pn_io_status = -1;
604 static gint ett_pn_io_rtc = -1;
605 static gint ett_pn_io_rta = -1;
606 static gint ett_pn_io_pdu_type = -1;
607 static gint ett_pn_io_add_flags = -1;
608 static gint ett_pn_io_control_command = -1;
609 static gint ett_pn_io_ioxs = -1;
610 static gint ett_pn_io_api = -1;
611 static gint ett_pn_io_data_description = -1;
612 static gint ett_pn_io_module = -1;
613 static gint ett_pn_io_submodule = -1;
614 static gint ett_pn_io_io_data_object = -1;
615 static gint ett_pn_io_io_cs = -1;
616 static gint ett_pn_io_ar_properties = -1;
617 static gint ett_pn_io_iocr_properties = -1;
618 static gint ett_pn_io_submodule_properties = -1;
619 static gint ett_pn_io_alarmcr_properties = -1;
620 static gint ett_pn_io_submodule_state = -1;
621 static gint ett_pn_io_channel_properties = -1;
622 static gint ett_pn_io_slot = -1;
623 static gint ett_pn_io_subslot = -1;
624 static gint ett_pn_io_maintenance_status = -1;
625 static gint ett_pn_io_data_status = -1;
626 static gint ett_pn_io_iocr = -1;
627 static gint ett_pn_io_mrp_rtmode = -1;
628 static gint ett_pn_io_control_block_properties = -1;
629 static gint ett_pn_io_check_sync_mode = -1;
630 static gint ett_pn_io_ir_frame_data = -1;
631 static gint ett_pn_io_ar_info = -1;
632 static gint ett_pn_io_ar_data = -1;
633 static gint ett_pn_io_ir_begin_end_port = -1;
634 static gint ett_pn_io_subframe_data =-1;
635 static gint ett_pn_io_frame_defails = -1;
636 static gint ett_pn_io_profisafe_f_parameter = -1;
637 static gint ett_pn_io_profisafe_f_parameter_prm_flag1 = -1;
638 static gint ett_pn_io_profisafe_f_parameter_prm_flag2 = -1;
639 static gint ett_pn_io_profidrive_parameter_request = -1;
640 static gint ett_pn_io_profidrive_parameter_response = -1;
641 static gint ett_pn_io_profidrive_parameter_address = -1;
642 static gint ett_pn_io_profidrive_parameter_value = -1;
643
644 static gint ett_pn_io_GroupProperties = -1;
645
646 static e_uuid_t uuid_pn_io_device = { 0xDEA00001, 0x6C97, 0x11D1, { 0x82, 0x71, 0x00, 0xA0, 0x24, 0x42, 0xDF, 0x7D } };
647 static guint16  ver_pn_io_device = 1;
648
649 static e_uuid_t uuid_pn_io_controller = { 0xDEA00002, 0x6C97, 0x11D1, { 0x82, 0x71, 0x00, 0xA0, 0x24, 0x42, 0xDF, 0x7D } };
650 static guint16  ver_pn_io_controller = 1;
651
652 static e_uuid_t uuid_pn_io_supervisor = { 0xDEA00003, 0x6C97, 0x11D1, { 0x82, 0x71, 0x00, 0xA0, 0x24, 0x42, 0xDF, 0x7D } };
653 static guint16  ver_pn_io_supervisor = 1;
654
655 static e_uuid_t uuid_pn_io_parameterserver = { 0xDEA00004, 0x6C97, 0x11D1, { 0x82, 0x71, 0x00, 0xA0, 0x24, 0x42, 0xDF, 0x7D } };
656 static guint16  ver_pn_io_parameterserver = 1;
657
658 /* Allow heuristic dissection */
659 static heur_dissector_list_t heur_pn_subdissector_list;
660
661 static const value_string pn_io_block_type[] = {
662     { 0x0000, "Reserved" },
663     { 0x0001, "Alarm Notification High"},
664     { 0x0002, "Alarm Notification Low"},
665     { 0x0008, "IODWriteReqHeader"},
666     { 0x8008, "IODWriteResHeader"},
667     { 0x0009, "IODReadReqHeader"},
668     { 0x8009, "IODReadResHeader"},
669     { 0x0010, "DiagnosisData"},
670     { 0x0011, "Reserved"},
671     { 0x0012, "ExpectedIdentificationData"},
672     { 0x0013, "RealIdentificationData"},
673     { 0x0014, "SubstituteValue"},
674     { 0x0015, "RecordInputDataObjectElement"},
675     { 0x0016, "RecordOutputDataObjectElement"},
676     { 0x0017, "reserved"},
677     { 0x0018, "ARData"},
678     { 0x0019, "LogData"},
679     { 0x001A, "APIData"},
680     { 0x001b, "SRLData"},
681     { 0x0020, "I&M0"},
682     { 0x0021, "I&M1"},
683     { 0x0022, "I&M2"},
684     { 0x0023, "I&M3"},
685     { 0x0024, "I&M4"},
686     { 0x0025, "I&M5"},
687     { 0x0026, "I&M6"},
688     { 0x0027, "I&M7"},
689     { 0x0028, "I&M8"},
690     { 0x0029, "I&M9"},
691     { 0x002A, "I&M10"},
692     { 0x002B, "I&M11"},
693     { 0x002C, "I&M12"},
694     { 0x002D, "I&M13"},
695     { 0x002E, "I&M14"},
696     { 0x002F, "I&M15"},
697     { 0x0030, "I&M0FilterDataSubmodul"},
698     { 0x0031, "I&M0FilterDataModul"},
699     { 0x0032, "I&M0FilterDataDevice"},
700     { 0x8001, "Alarm Ack High"},
701     { 0x8002, "Alarm Ack Low"},
702     { 0x0101, "ARBlockReq"},
703     { 0x8101, "ARBlockRes"},
704     { 0x0102, "IOCRBlockReq"},
705     { 0x8102, "IOCRBlockRes"},
706     { 0x0103, "AlarmCRBlockReq"},
707     { 0x8103, "AlarmCRBlockRes"},
708     { 0x0104, "ExpectedSubmoduleBlockReq"},
709     { 0x8104, "ModuleDiffBlock"},
710     { 0x0105, "PrmServerBlockReq"},
711     { 0x8105, "PrmServerBlockRes"},
712     { 0x0106, "MCRBlockReq"},
713     { 0x8106, "ARServerBlock"},
714     { 0x0107, "SubFrameBlock"},
715     { 0x0108, "ARVendorBlock"},
716     { 0x0109, "IRInfoBlock"},
717     { 0x010A, "SRInfoBlock"},
718     { 0x010B, "ARFSUBlock"},
719         { 0x0110, "IODControlReq Prm End.req"},
720         { 0x8110, "IODControlRes Prm End.rsp"},
721         { 0x0111, "IODControlReq Prm End.req"},
722         { 0x8111, "IODControlRes Prm End.rsp"},
723         { 0x0112, "IOXBlockReq Application Ready.req"},
724         { 0x8112, "IOXBlockRes Application Ready.rsp"},
725         { 0x0113, "IOXBlockReq Application Ready.req"},
726         { 0x8113, "IOXBlockRes Application Ready.rsp"},
727         { 0x0114, "IODReleaseReq"},
728         { 0x8114, "IODReleaseRes"},
729     { 0x0115, "ARRPCServerBlockReq"},
730     { 0x8115, "ARRPCServerBlockRes"},
731         { 0x0116, "IOXControlReq Ready for Companion.req"},
732         { 0x8116, "IOXControlRes Ready for Companion.rsp"},
733         { 0x0117, "IOXControlReq Ready for RT_CLASS_3.req"},
734         { 0x8117, "IOXControlRes Ready for RT_CLASS_3.rsp"},
735     { 0x0118, "ControlBlockPrmBegin"},
736     { 0x0119, "SubmoduleListBlock"},
737     { 0x8118, "ControlBlockPrmBeginRes"},
738
739     { 0x0200, "PDPortDataCheck"},
740     { 0x0201, "PDevData"},
741     { 0x0202, "PDPortDataAdjust"},
742     { 0x0203, "PDSyncData"},
743     { 0x0204, "IsochronousModeData"},
744     { 0x0205, "PDIRData"},
745     { 0x0206, "PDIRGlobalData"},
746     { 0x0207, "PDIRFrameData"},
747     { 0x0208, "PDIRBeginEndData"},
748     { 0x0209, "AdjustDomainBoundary"},
749     { 0x020A, "CheckPeers"},
750     { 0x020B, "CheckLineDelay"},
751     { 0x020C, "Checking MAUType"},
752     { 0x020E, "Adjusting MAUType"},
753     { 0x020F, "PDPortDataReal"},
754     { 0x0210, "AdjustMulticastBoundary"},
755     { 0x0211, "PDInterfaceMrpDataAdjust"},
756     { 0x0212, "PDInterfaceMrpDataReal"},
757     { 0x0213, "PDInterfaceMrpDataCheck"},
758     { 0x0214, "PDPortMrpDataAdjust"},
759     { 0x0215, "PDPortMrpDataReal"},
760     { 0x0216, "Media redundancy manager parameters"},
761     { 0x0217, "Media redundancy client parameters"},
762     { 0x0218, "Media redundancy RT mode for manager"},
763     { 0x0219, "Media redundancy ring state data"},
764     { 0x021A, "Media redundancy RT ring state data"},
765     { 0x021B, "Adjust LinkState"},
766     { 0x021C, "Checking LinkState"},
767     { 0x021D, "Media redundancy RT mode for clients"},
768     { 0x021E, "CheckSyncDifference"},
769     { 0x021F, "CheckMAUTypeDifference"},
770     { 0x0220, "PDPortFODataReal"},
771     { 0x0221, "Reading real fiber optic manufacturerspecific data"},
772     { 0x0222, "PDPortFODataAdjust"},
773     { 0x0223, "PDPortFODataCheck"},
774     { 0x0224, "Adjust PeerToPeerBoundary"},
775     { 0x0225, "Adjust DCPBoundary"},
776     { 0x0226, "Adjust PreambleLength"},
777     { 0x0227, "Adjust FastForwardingBoundary"},
778     { 0x022A, "PDIRSubframeData"},
779     { 0x022B, "SubframeBlock"},
780     { 0x0230, "PDNCDataCheck"},
781     { 0x0240, "PDInterfaceDataReal"},
782     { 0x0251, "PDPortStatistic"},
783     { 0x0400, "MultipleBlockHeader"},
784     { 0x0500, "RecordDataReadQuery"},
785     { 0x0600, "FSHello"},
786     { 0x0601, "FSParameterBlock"},
787     { 0x0608, "PDInterfaceFSUDataAdjust"},
788     { 0x0609, "ARFSUDataAdjust"},
789     { 0x0700, "AutoConfiguration"},
790     { 0x0701, "AutoConfiguration Communication"},
791     { 0x0702, "AutoConfiguration Configuration"},
792     { 0xB050, "Ext-PLL Control / RTC+RTA SyncID 0 (EDD)" },
793     { 0xB051, "Ext-PLL Control / RTA SyncID 1 (GSY)" },
794
795     { 0xB060, "EDD Trace Unit (EDD)" },
796     { 0xB061, "EDD Trace Unit (EDD)" },
797
798     { 0xB070, "OHA Info (OHA)" },
799
800     { 0x0F00, "MaintenanceItem"},
801     { 0x0F01, "Upload selected Records within Upload&RetrievalItem"},
802     { 0x0F02, "iParameterItem"},
803     { 0x0F03, "Retrieve selected Records within Upload&RetrievalItem"},
804     { 0x0F04, "Retrieve all Records within Upload&RetrievalItem"},
805     { 0, NULL }
806 };
807
808 static const value_string pn_io_alarm_type[] = {
809     { 0x0000, "Reserved" },
810     { 0x0001, "Diagnosis" },
811     { 0x0002, "Process" },
812     { 0x0003, "Pull" },
813     { 0x0004, "Plug" },
814     { 0x0005, "Status" },
815     { 0x0006, "Update" },
816     { 0x0007, "Redundancy" },
817     { 0x0008, "Controlled by supervisor" },
818     { 0x0009, "Released" },
819     { 0x000A, "Plug wrong submodule" },
820     { 0x000B, "Return of submodule" },
821     { 0x000C, "Diagnosis disappears" },
822     { 0x000D, "Multicast communication mismatch notification" },
823     { 0x000E, "Port data change notification" },
824     { 0x000F, "Sync data changed notification" },
825     { 0x0010, "Isochronous mode problem notification" },
826     { 0x0011, "Network component problem notification" },
827     { 0x0012, "Time data changed notification" },
828     { 0x0013, "Dynamic Frame Packing problem notification" },
829     /*0x0014 - 0x001D reserved */
830     { 0x001E, "Upload and retrieval notification" },
831     { 0x001F, "Pull module" },
832     /*0x0020 - 0x007F manufacturer specific */
833     /*0x0080 - 0x00FF reserved for profiles */
834     /*0x0100 - 0xFFFF reserved */
835     { 0, NULL }
836 };
837
838 static const value_string pn_io_pdu_type[] = {
839     { 0x01, "Data-RTA-PDU" },
840     { 0x02, "NACK-RTA-PDU" },
841     { 0x03, "ACK-RTA-PDU" },
842     { 0x04, "ERR-RTA-PDU" },
843     { 0, NULL }
844 };
845
846 static const value_string pn_io_frame_data_properties[] = {
847     { 0x00, "absolute mode use interface MAC" },
848     { 0x01, "relative mode use interface MAC" },
849     { 0x02, "absolute mode use RT_CLASS_3 destination MAC" },
850     { 0x03, "relative mode use RT_CLASS_3 destination MAC" },
851     { 0x04, "absolute mode use FastForwarding destination MAC" },
852     { 0x05, "relative mode use FastForwarding destination MAC" },
853     { 0x06, "absolute mode use FastForwarding MAC" },
854     { 0x07, "relative mode use FastForwarding MAC" },
855     { 0, NULL }
856 };
857
858 static const value_string pn_io_DFPRedundantPathLayout_decode[] = {
859     { 0x00, "The Frame for the redundant path contains the ordering shown by SubframeData" },
860     { 0x01, "The Frame for the redundant path contains the inverse ordering shown by SubframeData" },
861     { 0, NULL }
862 };
863
864 static const value_string pn_io_SFCRC16_Decode[] = {
865     { 0x00, "SFCRC16 and SFCycleCounter shall be created or set to zero by the sender and not checked by the receiver" },
866     { 0x01, "SFCRC16 and SFCycleCounter shall be created by the sender and checked by the receiver." },
867     { 0, NULL }
868 };
869
870 static const value_string pn_io_txgroup_state[] = {
871     { 0x00, "Transmission off" },
872     { 0x01, "Transmission on " },
873     { 0, NULL }
874 };
875
876 static const value_string pn_io_error_code[] = {
877     { 0x00, "OK" },
878     { 0x81, "PNIO" },
879     { 0xCF, "RTA error" },
880     { 0xDA, "AlarmAck" },
881     { 0xDB, "IODConnectRes" },
882     { 0xDC, "IODReleaseRes" },
883     { 0xDD, "IODControlRes" },
884     { 0xDE, "IODReadRes" },
885     { 0xDF, "IODWriteRes" },
886     { 0, NULL }
887 };
888
889 static const value_string pn_io_error_decode[] = {
890     { 0x00, "OK" },
891     { 0x80, "PNIORW" },
892     { 0x81, "PNIO" },
893     { 0, NULL }
894 };
895
896 /* dummy for unknown decode */
897 static const value_string pn_io_error_code1[] = {
898     { 0x00, "OK" },
899     { 0, NULL }
900 };
901
902 /* dummy for unknown decode/code1 combination */
903 static const value_string pn_io_error_code2[] = {
904     { 0x00, "OK" },
905     { 0, NULL }
906 };
907
908 static const value_string pn_io_error_code1_pniorw[] = {
909     /* high nibble 0-9 not specified -> legacy codes */
910     { 0xa0, "application: read error" },
911     { 0xa1, "application: write error" },
912     { 0xa2, "application: module failure" },
913     { 0xa3, "application: not specified" },
914     { 0xa4, "application: not specified" },
915     { 0xa5, "application: not specified" },
916     { 0xa6, "application: not specified" },
917     { 0xa7, "application: busy" },
918     { 0xa8, "application: version conflict" },
919     { 0xa9, "application: feature not supported" },
920     { 0xaa, "application: User specific 1" },
921     { 0xab, "application: User specific 2" },
922     { 0xac, "application: User specific 3" },
923     { 0xad, "application: User specific 4" },
924     { 0xae, "application: User specific 5" },
925     { 0xaf, "application: User specific 6" },
926     { 0xb0, "access: invalid index" },
927     { 0xb1, "access: write length error" },
928     { 0xb2, "access: invalid slot/subslot" },
929     { 0xb3, "access: type conflict" },
930     { 0xb4, "access: invalid area" },
931     { 0xb5, "access: state conflict" },
932     { 0xb6, "access: access denied" },
933     { 0xb7, "access: invalid range" },
934     { 0xb8, "access: invalid parameter" },
935     { 0xb9, "access: invalid type" },
936     { 0xba, "access: backup" },
937     { 0xbb, "access: User specific 7" },
938     { 0xbc, "access: User specific 8" },
939     { 0xbd, "access: User specific 9" },
940     { 0xbe, "access: User specific 10" },
941     { 0xbf, "access: User specific 11" },
942     { 0xc0, "resource: read constrain conflict" },
943     { 0xc1, "resource: write constrain conflict" },
944     { 0xc2, "resource: resource busy" },
945     { 0xc3, "resource: resource unavailable" },
946     { 0xc4, "resource: not specified" },
947     { 0xc5, "resource: not specified" },
948     { 0xc6, "resource: not specified" },
949     { 0xc7, "resource: not specified" },
950     { 0xc8, "resource: User specific 12" },
951     { 0xc9, "resource: User specific 13" },
952     { 0xca, "resource: User specific 14" },
953     { 0xcb, "resource: User specific 15" },
954     { 0xcc, "resource: User specific 16" },
955     { 0xcd, "resource: User specific 17" },
956     { 0xce, "resource: User specific 18" },
957     { 0xcf, "resource: User specific 19" },
958     /* high nibble d-f user specific */
959     { 0, NULL }
960 };
961
962 static const value_string pn_io_error_code2_pniorw[] = {
963     /* all values are user specified */
964     { 0, NULL }
965 };
966
967 static const value_string pn_io_error_code1_pnio[] = {
968     { 0x00 /*  0*/, "Reserved" },
969     { 0x01 /*  1*/, "Connect: Faulty ARBlockReq" },
970     { 0x02 /*  2*/, "Connect: Faulty IOCRBlockReq" },
971     { 0x03 /*  3*/, "Connect: Faulty ExpectedSubmoduleBlockReq" },
972     { 0x04 /*  4*/, "Connect: Faulty AlarmCRBlockReq" },
973     { 0x05 /*  5*/, "Connect: Faulty PrmServerBlockReq" },
974     { 0x06 /*  6*/, "Connect: Faulty MCRBlockReq" },
975     { 0x07 /*  7*/, "Connect: Faulty ARRPCBlockReq" },
976     { 0x08 /*  8*/, "Read/Write Record: Faulty Record" },
977     { 0x09 /*  9*/, "Connect: Faulty SubFrameBlock" },
978     { 0x0A /* 10*/, "Connect: Faulty IRTFrameBlock" },
979
980     { 0x14 /* 20*/, "IODControl: Faulty ControlBlockConnect" },
981     { 0x15 /* 21*/, "IODControl: Faulty ControlBlockPlug" },
982     { 0x16 /* 22*/, "IOXControl: Faulty ControlBlock after a connect est." },
983     { 0x17 /* 23*/, "IOXControl: Faulty ControlBlock a plug alarm" },
984
985     { 0x28 /* 40*/, "Release: Faulty ReleaseBlock" },
986
987     { 0x32 /* 50*/, "Response: Faulty ARBlockRes" },
988     { 0x33 /* 51*/, "Response: Faulty IOCRBlockRes" },
989     { 0x34 /* 52*/, "Response: Faulty AlarmCRBlockRes" },
990     { 0x35 /* 53*/, "Response: Faulty ModuleDifflock" },
991     { 0x36 /* 54*/, "Response: Faulty ARRPCBlockRes" },
992
993     { 0x3c /* 60*/, "AlarmAck Error Codes" },
994     { 0x3d /* 61*/, "CMDEV" },
995     { 0x3e /* 62*/, "CMCTL" },
996     { 0x3f /* 63*/, "NRPM" },
997     { 0x40 /* 64*/, "RMPM" },
998     { 0x41 /* 65*/, "ALPMI" },
999     { 0x42 /* 66*/, "ALPMR" },
1000     { 0x43 /* 67*/, "LMPM" },
1001     { 0x44 /* 68*/, "MMAC" },
1002     { 0x45 /* 69*/, "RPC" },
1003     { 0x46 /* 70*/, "APMR" },
1004     { 0x47 /* 71*/, "APMS" },
1005     { 0x48 /* 72*/, "CPM" },
1006     { 0x49 /* 73*/, "PPM" },
1007     { 0x4a /* 74*/, "DCPUCS" },
1008     { 0x4b /* 75*/, "DCPUCR" },
1009     { 0x4c /* 76*/, "DCPMCS" },
1010     { 0x4d /* 77*/, "DCPMCR" },
1011     { 0x4e /* 78*/, "FSPM" },
1012     { 0xfd /*253*/, "RTA_ERR_CLS_PROTOCOL" },
1013     { 0xff /*255*/, "User specific" },
1014     { 0, NULL }
1015 };
1016
1017 static const value_string pn_io_error_code2_pnio_1[] = {
1018     /* CheckingRules for ARBlockReq */
1019     {  0, "Error in Parameter BlockType" },
1020     {  1, "Error in Parameter BlockLength" },
1021     {  2, "Error in Parameter BlockVersionHigh" },
1022     {  3, "Error in Parameter BlockVersionLow" },
1023     {  4, "Error in Parameter ARType" },
1024     {  5, "Error in Parameter ARUUID" },
1025     {  7, "Error in Parameter CMInitiatorMACAddress" },
1026     {  8, "Error in Parameter CMInitiatorObjectUUID" },
1027     {  9, "Error in Parameter ARProperties" },
1028     { 10, "Error in Parameter CMInitiatorActivityTimeoutFactor" },
1029     { 11, "Error in Parameter InitiatorUDPRTPort" },
1030     { 12, "Error in Parameter StationNameLength" },
1031     { 13, "Error in Parameter CMInitiatorStationName" },
1032     {  0, NULL }
1033 };
1034
1035 static const value_string pn_io_error_code2_pnio_2[] = {
1036     /* CheckingRules for IOCRBlockReq */
1037     {  0, "Error in Parameter BlockType" },
1038     {  1, "Error in Parameter BlockLength" },
1039     {  2, "Error in Parameter BlockVersionHigh" },
1040     {  3, "Error in Parameter BlockVersionLow" },
1041     {  4, "Error in Parameter IOCRType" },
1042     {  5, "Error in Parameter IOCRReference" },
1043     {  6, "Error in Parameter LT" },
1044     {  7, "Error in Parameter IOCRProperties" },
1045     {  8, "Error in Parameter DataLength" },
1046     {  9, "Error in Parameter FrameID" },
1047     { 10, "Error in Parameter SendClockFactor" },
1048     { 11, "Error in Parameter ReductionRatio" },
1049     { 12, "Error in Parameter Phase" },
1050     { 14, "Error in Parameter FrameSendOffset" },
1051     { 15, "Error in Parameter WatchdogFactor" },
1052     { 16, "Error in Parameter DataHoldFactor" },
1053     { 17, "Error in Parameter IOCRTagHeader" },
1054     { 18, "Error in Parameter IOCRMulticastMacAddress" },
1055     { 19, "Error in Parameter NumberOfAPI" },
1056     { 10, "Error in Parameter API" },
1057     { 21, "Error in Parameter NumberOfIODataObjects" },
1058     { 22, "Error in Parameter SlotNumber" },
1059     { 23, "Error in Parameter SubslotNumber" },
1060     { 24, "Error in Parameter IODataObjectFrameOffset" },
1061     { 25, "Error in Parameter NumberOfIOCS" },
1062     { 26, "Error in Parameter SlotNumber" },
1063     { 27, "Error in Parameter SubslotNumber" },
1064     { 28, "Error in Parameter IOCSFrameOffset" },
1065     {  0, NULL }
1066 };
1067
1068 static const value_string pn_io_error_code2_pnio_3[] = {
1069     /* CheckingRules for ExpectedSubmoduleBlockReq */
1070     {  0, "Error in Parameter BlockType" },
1071     {  1, "Error in Parameter BlockLength" },
1072     {  2, "Error in Parameter BlockVersionHigh" },
1073     {  3, "Error in Parameter BlockVersionLow" },
1074     {  4, "Error in Parameter NumberOfAPI" },
1075     {  5, "Error in Parameter API" },
1076     {  6, "Error in Parameter SlotNumber" },
1077     {  7, "Error in Parameter ModuleIdentNumber" },
1078     {  8, "Error in Parameter ModuleProperties" },
1079     {  9, "Error in Parameter NumberOfSubmodules" },
1080     { 10, "Error in Parameter SubslotNumber" },
1081     { 12, "Error in Parameter SubmoduleProperties" },
1082     { 13, "Error in Parameter DataDescription" },
1083     { 14, "Error in Parameter SubmoduleDataLength" },
1084     { 15, "Error in Parameter LengthIOPS" },
1085     { 16, "Error in Parameter LengthIOCS" },
1086     {  0, NULL }
1087 };
1088
1089
1090 static const value_string pn_io_error_code2_pnio_4[] = {
1091     /* CheckingRules for AlarmCRBlockReq */
1092     { 0, "Error in Parameter BlockType" },
1093     { 1, "Error in Parameter BlockLength" },
1094     { 2, "Error in Parameter BlockVersionHigh" },
1095     { 3, "Error in Parameter BlockVersionLow" },
1096     { 4, "Error in Parameter AlarmCRType" },
1097     { 5, "Error in Parameter LT" },
1098     { 6, "Error in Parameter AlarmCRProperties" },
1099     { 7, "Error in Parameter RTATimeoutFactor" },
1100     { 8, "Error in Parameter RTARetries" },
1101     { 10, "Error in Parameter MaxAlarmDataLength" },
1102     { 11, "Error in Parameter AlarmCRTagHeaderHigh" },
1103     { 12, "Error in Parameter AlarmCRTagHeaderLow" },
1104     {  0, NULL }
1105 };
1106
1107 static const value_string pn_io_error_code2_pnio_5[] = {
1108     /* CheckingRules for PrmServerBlockReq */
1109     { 0, "Error in Parameter BlockType" },
1110     { 1, "Error in Parameter BlockLength" },
1111     { 2, "Error in Parameter BlockVersionHigh" },
1112     { 3, "Error in Parameter BlockVersionLow" },
1113     { 6, "Error in Parameter CMInitiatorActivityTimeoutFactor" },
1114     { 7, "Error in Parameter StationNameLength" },
1115     { 8, "Error in Parameter ParameterServerStationName" },
1116     { 0, NULL }
1117 };
1118
1119 static const value_string pn_io_error_code2_pnio_6[] = {
1120     /* CheckingRules for MCRBlockReq */
1121     { 0, "Error in Parameter BlockType" },
1122     { 1, "Error in Parameter BlockLength" },
1123     { 2, "Error in Parameter BlockVersionHigh" },
1124     { 3, "Error in Parameter BlockVersionLow" },
1125     { 4, "Error in Parameter IOCRReference" },
1126     { 5, "Error in Parameter AddressResolutionProperties" },
1127     { 6, "Error in Parameter MCITimeoutFactor" },
1128     { 7, "Error in Parameter StationNameLength" },
1129     { 8, "Error in Parameter ProviderStationName" },
1130     { 0, NULL }
1131 };
1132
1133 static const value_string pn_io_error_code2_pnio_7[] = {
1134     /* CheckingRules for MCRBlockReq */
1135     { 0, "Error in Parameter BlockType" },
1136     { 1, "Error in Parameter BlockLength" },
1137     { 2, "Error in Parameter BlockVersionHigh" },
1138     { 3, "Error in Parameter BlockVersionLow" },
1139     { 4, "Error in Parameter InitiatorRPCServerPort" },
1140     { 0, NULL }
1141 };
1142
1143 static const value_string pn_io_error_code2_pnio_8[] = {
1144     /* CheckingRules for Read/Write ParameterReqHeader */
1145     {  0, "Error in Parameter BlockType" },
1146     {  1, "Error in Parameter BlockLength" },
1147     {  2, "Error in Parameter BlockVersionHigh" },
1148     {  3, "Error in Parameter BlockVersionLow" },
1149     {  5, "Error in Parameter ARUUID" },
1150     {  6, "Error in Parameter API" },
1151     {  7, "Error in Parameter SlotNumber" },
1152     {  8, "Error in Parameter SubslotNumber" },
1153     {  9, "Error in Parameter Padding" },
1154     { 10, "Error in Parameter Index" },
1155     { 11, "Error in Parameter RecordDataLength" },
1156     { 12, "Error in Parameter TargetARUUID" },
1157     {  0, NULL }
1158 };
1159
1160 static const value_string pn_io_error_code2_pnio_20[] = {
1161     /* CheckingRules for ControlBlockConnect */
1162     { 0, "Error in Parameter BlockType" },
1163     { 1, "Error in Parameter BlockLength" },
1164     { 2, "Error in Parameter BlockVersionHigh" },
1165     { 3, "Error in Parameter BlockVersionLow" },
1166     { 4, "Error in Parameter Padding" },
1167     { 6, "Error in Parameter SessionKey" },
1168     { 7, "Error in Parameter Padding" },
1169     { 8, "Error in Parameter ControlCommand" },
1170     { 9, "Error in Parameter ControlBlockProperties" },
1171     { 0, NULL }
1172 };
1173
1174 static const value_string pn_io_error_code2_pnio_21[] = {
1175     /* CheckingRules for ControlBlockPlug */
1176     { 0, "Error in Parameter BlockType" },
1177     { 1, "Error in Parameter BlockLength" },
1178     { 2, "Error in Parameter BlockVersionHigh" },
1179     { 3, "Error in Parameter BlockVersionLow" },
1180     { 4, "Error in Parameter Padding" },
1181     { 6, "Error in Parameter SessionKey" },
1182     { 7, "Error in Parameter AlarmSequenceNumber" },
1183     { 8, "Error in Parameter ControlCommand" },
1184     { 9, "Error in Parameter ControlBlockProperties" },
1185     { 0, NULL }
1186 };
1187
1188 static const value_string pn_io_error_code2_pnio_22[] = {
1189     /* CheckingRule for ControlBlockConnect */
1190     { 0, "Error in Parameter BlockType" },
1191     { 1, "Error in Parameter BlockLength" },
1192     { 2, "Error in Parameter BlockVersionHigh" },
1193     { 3, "Error in Parameter BlockVersionLow" },
1194     { 4, "Error in Parameter Padding" },
1195     { 6, "Error in Parameter SessionKey" },
1196     { 7, "Error in Parameter Padding" },
1197     { 8, "Error in Parameter ControlCommand" },
1198     { 9, "Error in Parameter ControlBlockProperties" },
1199     { 0, NULL }
1200 };
1201
1202 static const value_string pn_io_error_code2_pnio_23[] = {
1203     /* CheckingRules for ControlBlockPlug */
1204     { 0, "Error in Parameter BlockType" },
1205     { 1, "Error in Parameter BlockLength" },
1206     { 2, "Error in Parameter BlockVersionHigh" },
1207     { 3, "Error in Parameter BlockVersionLow" },
1208     { 4, "Error in Parameter Padding" },
1209     { 6, "Error in Parameter SessionKey" },
1210     { 7, "Error in Parameter AlarmSequenceNumber" },
1211     { 8, "Error in Parameter ControlCommand" },
1212     { 9, "Error in Parameter ControlBlockProperties" },
1213     { 0, NULL }
1214 };
1215
1216 static const value_string pn_io_error_code2_pnio_40[] = {
1217     /* CheckingRules for ReleaseBlock */
1218     { 0, "Error in Parameter BlockType" },
1219     { 1, "Error in Parameter BlockLength" },
1220     { 2, "Error in Parameter BlockVersionHigh" },
1221     { 3, "Error in Parameter BlockVersionLow" },
1222     { 4, "Error in Parameter Padding" },
1223     { 6, "Error in Parameter SessionKey" },
1224     { 7, "Error in Parameter Padding" },
1225     { 8, "Error in Parameter ControlCommand" },
1226     { 9, "Error in Parameter ControlBlockProperties" },
1227     { 0, NULL }
1228 };
1229
1230 static const value_string pn_io_error_code2_pnio_61[] = {
1231     /* CMDEV */
1232     { 0, "State Conflict" },
1233     { 1, "Resources" },
1234     { 0, NULL }
1235 };
1236
1237 static const value_string pn_io_error_code2_pnio_62[] = {
1238     /* CMCTL */
1239     { 0, "State Conflict" },
1240     { 1, "Timeout" },
1241     { 2, "No data send" },
1242     { 0, NULL }
1243 };
1244
1245 static const value_string pn_io_error_code2_pnio_63[] = {
1246     /* NRPM */
1247     { 0, "No DCP active" },
1248     { 1, "DNS Unknown_RealStationName" },
1249     { 2, "DCP No_RealStationName" },
1250     { 3, "DCP Multiple_RealStationName" },
1251     { 4, "DCP No_StationName" },
1252     { 5, "No_IP_Addr" },
1253     { 6, "DCP_Set_Error" },
1254     { 0, NULL }
1255 };
1256
1257 static const value_string pn_io_error_code2_pnio_64[] = {
1258     /* RMPM */
1259     { 0, "ArgsLength invalid" },
1260     { 1, "Unknown Blocks" },
1261     { 2, "IOCR Missing" },
1262     { 3, "Wrong AlarmCRBlock count" },
1263     { 4, "Out of AR Resources" },
1264     { 5, "AR UUID unknown" },
1265     { 6, "State conflict" },
1266     { 7, "Out of Provider, Consumer or Alarm Resources" },
1267     { 8, "Out of Memory" },
1268     { 0, NULL }
1269 };
1270
1271 static const value_string pn_io_error_code2_pnio_65[] = {
1272     /* ALPMI */
1273     { 0, "Invalid State" },
1274     { 1, "Wrong ACK-PDU" },
1275     { 0, NULL }
1276 };
1277
1278 static const value_string pn_io_error_code2_pnio_66[] = {
1279     /* ALPMR */
1280     { 0, "Invalid State" },
1281     { 1, "Wrong Notification PDU" },
1282     { 0, NULL }
1283 };
1284
1285 static const value_string pn_io_error_code2_pnio_70[] = {
1286     /* APMR */
1287     { 0, "Invalid State" },
1288     { 1, "LMPM signaled error" },
1289     { 0, NULL }
1290 };
1291
1292 static const value_string pn_io_error_code2_pnio_71[] = {
1293     /* APMS */
1294     { 0, "Invalid State" },
1295     { 1, "LMPM signaled error" },
1296     { 2, "Timeout" },
1297     { 0, NULL }
1298 };
1299
1300 static const value_string pn_io_error_code2_pnio_72[] = {
1301     /* CPM */
1302     { 1, "Invalid State" },
1303     { 0, NULL }
1304 };
1305
1306 static const value_string pn_io_error_code2_pnio_73[] = {
1307     /* PPM */
1308     { 1, "Invalid State" },
1309     { 0, NULL }
1310 };
1311
1312 static const value_string pn_io_error_code2_pnio_74[] = {
1313     /* DCPUCS */
1314     { 0, "Invalid State" },
1315     { 1, "LMPM signaled an error" },
1316     { 2, "Timeout" },
1317     { 0, NULL }
1318 };
1319
1320 static const value_string pn_io_error_code2_pnio_75[] = {
1321     /* DCPUCR */
1322     { 0, "Invalid State" },
1323     { 1, "LMPM signaled an error" },
1324     { 0, NULL }
1325 };
1326
1327 static const value_string pn_io_error_code2_pnio_76[] = {
1328     /* DCPMCS */
1329     { 0, "Invalid State" },
1330     { 1, "LMPM signaled an error" },
1331     { 0, NULL }
1332 };
1333
1334 static const value_string pn_io_error_code2_pnio_77[] = {
1335     /* DCPMCR */
1336     { 0, "Invalid State" },
1337     { 1, "LMPM signaled an error" },
1338     { 0, NULL }
1339 };
1340
1341 static const value_string pn_io_error_code2_pnio_253[] = {
1342     {  0, "reserved" },
1343     {  1, "Error within the coordination of sequence numbers (RTA_ERR_CODE_SEQ) error" },
1344     {  2, "Instance closed (RTA_ERR_ABORT)" },
1345     {  3, "AR out of memory (RTA_ERR_ABORT)" },
1346     {  4, "AR add provider or consumer failed (RTA_ERR_ABORT)" },
1347     {  5, "AR consumer DHT/WDT expired (RTA_ERR_ABORT)" },
1348     {  6, "AR cmi timeout (RTA_ERR_ABORT)" },
1349     {  7, "AR alarm-open failed (RTA_ERR_ABORT)" },
1350     {  8, "AR alarm-send.cnf(-) (RTA_ERR_ABORT)" },
1351     {  9, "AR alarm-ack-send.cnf(-) (RTA_ERR_ABORT)" },
1352     { 10, "AR alarm data too long (RTA_ERR_ABORT)" },
1353     { 11, "AR alarm.ind(err) (RTA_ERR_ABORT)" },
1354     { 12, "AR rpc-client call.cnf(-) (RTA_ERR_ABORT)" },
1355     { 13, "AR abort.req (RTA_ERR_ABORT)" },
1356     { 14, "AR re-run aborts existing (RTA_ERR_ABORT)" },
1357     { 15, "AR release.ind received (RTA_ERR_ABORT)" },
1358     { 16, "AR device deactivated (RTA_ERR_ABORT)" },
1359     { 17, "AR removed (RTA_ERR_ABORT)" },
1360     { 18, "AR protocol violation (RTA_ERR_ABORT)" },
1361     { 19, "AR name resolution error (RTA_ERR_ABORT)" },
1362     { 20, "AR RPC-Bind error (RTA_ERR_ABORT)" },
1363     { 21, "AR RPC-Connect error (RTA_ERR_ABORT)" },
1364     { 22, "AR RPC-Read error (RTA_ERR_ABORT)" },
1365     { 23, "AR RPC-Write error (RTA_ERR_ABORT)" },
1366     { 24, "AR RPC-Control error (RTA_ERR_ABORT)" },
1367     { 25, "AR forbidden pull or plug after check.rsp and before in-data.ind (RTA_ERR_ABORT)" },
1368     { 26, "AR AP removed (RTA_ERR_ABORT)" },
1369     { 27, "AR link down (RTA_ERR_ABORT)" },
1370     { 28, "AR could not register multicast-mac address (RTA_ERR_ABORT)" },
1371     { 29, "not synchronized (cannot start companion-ar) (RTA_ERR_ABORT)" },
1372     { 30, "wrong topology (cannot start companion-ar) (RTA_ERR_ABORT)" },
1373     { 31, "dcp, station-name changed (RTA_ERR_ABORT)" },
1374     { 32, "dcp, reset to factory-settings (RTA_ERR_ABORT)" },
1375     { 33, "cannot start companion-AR because a 0x8ipp submodule in the first AR... (RTA_ERR_ABORT)" },
1376     { 34, "no irdata record yet (RTA_ERR_ABORT)" },
1377     { 35, "PDEV (RTA_ERROR_ABORT)" },
1378     { 36, "PDEV, no port offers required speed/duplexity (RTA_ERROR_ABORT)" },
1379     { 37, "IP-Suite [of the IOC] changed by means of DCP_Set(IPParameter) or local engineering (RTA_ERROR_ABORT)" },
1380     { 0, NULL }
1381 };
1382
1383 static const value_string pn_io_error_code2_pnio_255[] = {
1384     /* User specific */
1385     { 255, "User abort" },
1386     { 0, NULL }
1387 };
1388
1389 static const value_string pn_io_ioxs[] = {
1390     { 0x00 /*  0*/, "detected by subslot" },
1391     { 0x01 /*  1*/, "detected by slot" },
1392     { 0x02 /*  2*/, "detected by IO device" },
1393     { 0x03 /*  3*/, "detected by IO controller" },
1394     { 0, NULL }
1395 };
1396
1397
1398 static const value_string pn_io_ar_type[] = {
1399     { 0x0000, "reserved" },
1400     { 0x0001, "IOCARSingle" },
1401     { 0x0002, "reserved" },
1402     { 0x0003, "IOCARCIR" },
1403     { 0x0004, "IOCAR_IOControllerRedundant" },
1404     { 0x0005, "IOCAR_IODeviceRedundant" },
1405     { 0x0006, "IOSAR" },
1406     /*0x0007 - 0x000F reserved */
1407     { 0x0010, "IOCARSingle using RT_CLASS_3"},
1408     /*0x0011 - 0x001F reserved */
1409     { 0x0020, "IOCARSR" },
1410     /*0x0007 - 0xFFFF reserved */
1411     { 0, NULL }
1412 };
1413
1414 static const value_string pn_io_iocr_type[] = {
1415     { 0x0000, "reserved" },
1416     { 0x0001, "Input CR" },
1417     { 0x0002, "Output CR" },
1418     { 0x0003, "Multicast Provider CR" },
1419     { 0x0004, "Multicast Consumer CR" },
1420     /*0x0005 - 0xFFFF reserved */
1421     { 0, NULL }
1422 };
1423
1424
1425 static const value_string pn_io_data_description[] = {
1426     { 0x0000, "reserved" },
1427     { 0x0001, "Input" },
1428     { 0x0002, "Output" },
1429     { 0x0003, "reserved" },
1430     /*0x0004 - 0xFFFF reserved */
1431     { 0, NULL }
1432 };
1433
1434
1435
1436 static const value_string pn_io_module_state[] = {
1437     { 0x0000, "no module" },
1438     { 0x0001, "wrong module" },
1439     { 0x0002, "proper module" },
1440     { 0x0003, "substitute" },
1441     /*0x0004 - 0xFFFF reserved */
1442     { 0, NULL }
1443 };
1444
1445 static const value_string pn_io_arproperties_state[] = {
1446     { 0x00000000, "Reserved" },
1447     { 0x00000001, "Active" },
1448     { 0x00000002, "reserved" },
1449     { 0x00000003, "reserved" },
1450     { 0x00000004, "reserved" },
1451     { 0x00000005, "reserved" },
1452     { 0x00000006, "reserved" },
1453     { 0x00000007, "reserved" },
1454     { 0, NULL }
1455 };
1456
1457 static const value_string pn_io_arproperties_supervisor_takeover_allowed[] = {
1458     { 0x00000000, "not allowed" },
1459     { 0x00000001, "allowed" },
1460     { 0, NULL }
1461 };
1462
1463 static const value_string pn_io_arproperties_parametrization_server[] = {
1464     { 0x00000000, "External PrmServer" },
1465     { 0x00000001, "CM Initiator" },
1466     { 0, NULL }
1467 };
1468 /* BIT 8 */
1469 static const value_string pn_io_arproperties_DeviceAccess[] = {
1470     { 0x00000000, "Only the submodules from the ExpectedSubmoduleBlock are accessible" },
1471     { 0x00000001, "Submodule access is controlled by IO device application" },
1472     { 0, NULL }
1473 };
1474
1475 /* Bit 9 - 10 */
1476 static const value_string pn_io_arproperties_companion_ar[] = {
1477     { 0x00000000, "Single AR" },
1478     { 0x00000001, "First AR of a companion pair and a companion AR shall follow" },
1479     { 0x00000002, "Companion AR" },
1480     { 0x00000003, "Reserved" },
1481     { 0, NULL }
1482 };
1483 /* REMOVED with 2.3
1484 static const value_string pn_io_arproperties_data_rate[] = {
1485     { 0x00000000, "at least 100 MB/s or more" },
1486     { 0x00000001, "100 MB/s" },
1487     { 0x00000002, "1 GB/s" },
1488     { 0x00000003, "10 GB/s" },
1489     { 0, NULL }
1490 };
1491 */
1492
1493 /* BIT 11 */
1494 static const value_string pn_io_arproperties_acknowldege_companion_ar[] = {
1495     { 0x00000000, "No companion AR or no acknowledge for the companion AR required" },
1496     { 0x00000001, "Companion AR with acknowledge" },
1497     { 0, NULL }
1498 };
1499
1500 /* bit 30 */
1501 static const value_string pn_io_arpropertiesStartupMode[] = {
1502     { 0x00000000, "Legacy" },
1503     { 0x00000001, "Advanced" },
1504     { 0, NULL }
1505 };
1506
1507 /* bit 31 */
1508 static const value_string pn_io_arproperties_pull_module_alarm_allowed[] = {
1509     { 0x00000000, "AlarmType(=Pull) shall signal pulling of submodule and module" },
1510     { 0x00000001, "AlarmType(=Pull) shall signal pulling of submodule" },
1511     { 0, NULL }
1512 };
1513
1514 static const value_string pn_io_RedundancyInfo[] = {
1515     { 0x00000000, "Reserved" },
1516     { 0x00000001, "The delivering node is the left or below one" },
1517     { 0x00000002, "The delivering node is the right or above one" },
1518     { 0x00000003, "Reserved" },
1519     { 0, NULL }
1520 };
1521
1522 static const value_string pn_io_iocr_properties_rtclass[] = {
1523     { 0x00000000, "reserved" },
1524     { 0x00000001, "RT_CLASS_1" },
1525     { 0x00000002, "RT_CLASS_2" },
1526     { 0x00000003, "RT_CLASS_3" },
1527     { 0x00000004, "RT_CLASS_UDP" },
1528     /*0x00000005 - 0x00000007 reserved */
1529     { 0, NULL }
1530 };
1531
1532 static const value_string pn_io_sr_properties_BackupAR[] = {
1533     { 0x00000000, "The device may deliver valid input data" },
1534     { 0x00000001, "The device shall deliver valid input data" },
1535     { 0, NULL }
1536 };
1537
1538 static const value_string pn_io_sr_properties_ActivateRedundancyAlarm[] = {
1539     { 0x00000000, "The device shall not send Redundancy alarm" },
1540     { 0x00000001, "The device shall send Redundancy alarm" },
1541     { 0, NULL }
1542 };
1543
1544 static const value_string pn_io_iocr_properties_media_redundancy[] = {
1545     { 0x00000000, "No media redundant frame transfer" },
1546     { 0x00000001, "Media redundant frame transfer" },
1547     { 0, NULL }
1548 };
1549
1550
1551 static const value_string pn_io_submodule_properties_type[] = {
1552     { 0x0000, "no input and no output data" },
1553     { 0x0001, "input data" },
1554     { 0x0002, "output data" },
1555     { 0x0003, "input and output data" },
1556     { 0, NULL }
1557 };
1558
1559 static const value_string pn_io_submodule_properties_shared_input[] = {
1560     { 0x0000, "IO controller" },
1561     { 0x0001, "IO controller shared" },
1562     { 0, NULL }
1563 };
1564
1565 static const value_string pn_io_submodule_properties_reduce_input_submodule_data_length[] = {
1566     { 0x0000, "Expected" },
1567     { 0x0001, "Zero" },
1568     { 0, NULL }
1569 };
1570
1571 static const value_string pn_io_submodule_properties_reduce_output_submodule_data_length[] = {
1572     { 0x0000, "Expected" },
1573     { 0x0001, "Zero" },
1574     { 0, NULL }
1575 };
1576
1577 static const value_string pn_io_submodule_properties_discard_ioxs[] = {
1578     { 0x0000, "Expected" },
1579     { 0x0001, "Zero" },
1580     { 0, NULL }
1581 };
1582
1583 static const value_string pn_io_alarmcr_properties_priority[] = {
1584     { 0x0000, "user priority (default)" },
1585     { 0x0001, "use only low priority" },
1586     { 0, NULL }
1587 };
1588
1589 static const value_string pn_io_alarmcr_properties_transport[] = {
1590     { 0x0000, "RTA_CLASS_1" },
1591     { 0x0001, "RTA_CLASS_UDP" },
1592     { 0, NULL }
1593 };
1594
1595
1596 static const value_string pn_io_submodule_state_format_indicator[] = {
1597     { 0x0000, "Coding uses Detail" },
1598     { 0x0001, "Coding uses .IdentInfo, ..." },
1599     { 0, NULL }
1600 };
1601
1602 static const value_string pn_io_submodule_state_add_info[] = {
1603     { 0x0000, "None" },
1604     { 0x0001, "Takeover not allowed" },
1605     /*0x0002 - 0x0007 reserved */
1606     { 0, NULL }
1607 };
1608
1609 static const value_string pn_io_submodule_state_qualified_info[] = {
1610     { 0x0000, "No QualifiedInfo available" },
1611     { 0x0001, "QualifiedInfo available" },
1612     { 0, NULL }
1613 };
1614
1615 static const value_string pn_io_submodule_state_maintenance_required[] = {
1616     { 0x0000, "No MaintenanceRequired available" },
1617     { 0x0001, "MaintenanceRequired available" },
1618     { 0, NULL }
1619 };
1620
1621 static const value_string pn_io_submodule_state_maintenance_demanded[] = {
1622     { 0x0000, "No MaintenanceDemanded available" },
1623     { 0x0001, "MaintenanceDemanded available" },
1624     { 0, NULL }
1625 };
1626
1627 static const value_string pn_io_submodule_state_diag_info[] = {
1628     { 0x0000, "No DiagnosisData available" },
1629     { 0x0001, "DiagnosisData available" },
1630     { 0, NULL }
1631 };
1632
1633 static const value_string pn_io_submodule_state_ar_info[] = {
1634     { 0x0000, "Own" },
1635     { 0x0001, "ApplicationReadyPending (ARP)" },
1636     { 0x0002, "Superordinated Locked (SO)" },
1637     { 0x0003, "Locked By IO Controller (IOC)" },
1638     { 0x0004, "Locked By IO Supervisor (IOS)" },
1639     /*0x0005 - 0x000F reserved */
1640     { 0, NULL }
1641 };
1642
1643 static const value_string pn_io_submodule_state_ident_info[] = {
1644     { 0x0000, "OK" },
1645     { 0x0001, "Substitute (SU)" },
1646     { 0x0002, "Wrong (WR)" },
1647     { 0x0003, "NoSubmodule (NO)" },
1648     /*0x0004 - 0x000F reserved */
1649     { 0, NULL }
1650 };
1651
1652 static const value_string pn_io_submodule_state_detail[] = {
1653     { 0x0000, "no submodule" },
1654     { 0x0001, "wrong submodule" },
1655     { 0x0002, "locked by IO controller" },
1656     { 0x0003, "reserved" },
1657     { 0x0004, "application ready pending" },
1658     { 0x0005, "reserved" },
1659     { 0x0006, "reserved" },
1660     { 0x0007, "Substitute" },
1661     /*0x0008 - 0x7FFF reserved */
1662     { 0, NULL }
1663 };
1664
1665 static const value_string pn_io_substitutionmode[] = {
1666     { 0x0000, "ZERO" },
1667     { 0x0001, "Last value" },
1668     { 0x0002, "Replacement value" },
1669     /*0x0003 - 0xFFFF reserved */
1670     { 0, NULL }
1671 };
1672
1673 static const value_string pn_io_index[] = {
1674     /*0x0008 - 0x7FFF user specific */
1675
1676     /* PROFISafe */
1677     { 0x0100, "PROFISafe" },
1678
1679     /* subslot specific */
1680     { 0x8000, "ExpectedIdentificationData for one subslot" },
1681     { 0x8001, "RealIdentificationData for one subslot" },
1682     /*0x8002 - 0x8009 reserved */
1683     { 0x800A, "Diagnosis in channel coding for one subslot" },
1684     { 0x800B, "Diagnosis in all codings for one subslot" },
1685     { 0x800C, "Diagnosis, Maintenance, Qualified and Status for one subslot" },
1686     /*0x800D - 0x800F reserved */
1687     { 0x8010, "Maintenance required in channel coding for one subslot" },
1688     { 0x8011, "Maintenance demanded in channel coding for one subslot" },
1689     { 0x8012, "Maintenance required in all codings for one subslot" },
1690     { 0x8013, "Maintenance demanded in all codings for one subslot" },
1691     /*0x8014 - 0x801D reserved */
1692     { 0x801E, "SubstituteValues for one subslot" },
1693     /*0x801F - 0x8027 reserved */
1694     { 0x8028, "RecordInputDataObjectElement for one subslot" },
1695     { 0x8029, "RecordOutputDataObjectElement for one subslot" },
1696     { 0x802A, "PDPortDataReal for one subslot" },
1697     { 0x802B, "PDPortDataCheck for one subslot" },
1698     { 0x802C, "PDIRData for one subslot" },
1699     { 0x802D, "Expected PDSyncData for one subslot with SyncID value 0" },
1700     /*0x802E reserved */
1701     { 0x802F, "PDPortDataAdjust for one subslot" },
1702     { 0x8030, "IsochronousModeData for one subslot" },
1703     { 0x8031, "Expected PDSyncData for one subslot with SyncID value 1" },
1704     { 0x8032, "Expected PDSyncData for one subslot with SyncID value 2" },
1705     { 0x8033, "Expected PDSyncData for one subslot with SyncID value 3" },
1706     { 0x8034, "Expected PDSyncData for one subslot with SyncID value 4" },
1707     { 0x8035, "Expected PDSyncData for one subslot with SyncID value 5" },
1708     { 0x8036, "Expected PDSyncData for one subslot with SyncID value 6" },
1709     { 0x8037, "Expected PDSyncData for one subslot with SyncID value 7" },
1710     { 0x8038, "Expected PDSyncData for one subslot with SyncID value 8" },
1711     { 0x8039, "Expected PDSyncData for one subslot with SyncID value 9" },
1712     { 0x803A, "Expected PDSyncData for one subslot with SyncID value 10" },
1713     { 0x803B, "Expected PDSyncData for one subslot with SyncID value 11" },
1714     { 0x803C, "Expected PDSyncData for one subslot with SyncID value 12" },
1715     { 0x803D, "Expected PDSyncData for one subslot with SyncID value 13" },
1716     { 0x803E, "Expected PDSyncData for one subslot with SyncID value 14" },
1717     { 0x803F, "Expected PDSyncData for one subslot with SyncID value 15" },
1718     { 0x8040, "Expected PDSyncData for one subslot with SyncID value 16" },
1719     { 0x8041, "Expected PDSyncData for one subslot with SyncID value 17" },
1720     { 0x8042, "Expected PDSyncData for one subslot with SyncID value 18" },
1721     { 0x8043, "Expected PDSyncData for one subslot with SyncID value 19" },
1722     { 0x8044, "Expected PDSyncData for one subslot with SyncID value 20" },
1723     { 0x8045, "Expected PDSyncData for one subslot with SyncID value 21" },
1724     { 0x8046, "Expected PDSyncData for one subslot with SyncID value 22" },
1725     { 0x8047, "Expected PDSyncData for one subslot with SyncID value 23" },
1726     { 0x8048, "Expected PDSyncData for one subslot with SyncID value 24" },
1727     { 0x8049, "Expected PDSyncData for one subslot with SyncID value 25" },
1728     { 0x804A, "Expected PDSyncData for one subslot with SyncID value 26" },
1729     { 0x804B, "Expected PDSyncData for one subslot with SyncID value 27" },
1730     { 0x804C, "Expected PDSyncData for one subslot with SyncID value 28" },
1731     { 0x804D, "Expected PDSyncData for one subslot with SyncID value 29" },
1732     { 0x804E, "Expected PDSyncData for one subslot with SyncID value 30" },
1733     { 0x804F, "Expected PDSyncData for one subslot with SyncID value 31" },
1734     { 0x8050, "PDInterfaceMrpDataReal for one subslot" },
1735     { 0x8051, "PDInterfaceMrpDataCheck for one subslot" },
1736     { 0x8052, "PDInterfaceMrpDataAdjust for one subslot" },
1737     { 0x8053, "PDPortMrpDataAdjust for one subslot" },
1738     { 0x8054, "PDPortMrpDataReal for one subslot" },
1739     /*0x8055 - 0x805F reserved */
1740     { 0x8060, "PDPortFODataReal for one subslot" },
1741     { 0x8061, "PDPortFODataCheck for one subslot" },
1742     { 0x8062, "PDPortFODataAdjust for one subslot" },
1743     /*0x8063 - 0x806F reserved */
1744     { 0x8070, "PDNCDataCheck for one subslot" },
1745     { 0x8071, "PDInterfaceAdjust for one subslot" },
1746     { 0x8072, "PDPortStatistic for one subslot" },
1747     /*0x8071 - 0x807F reserved */
1748     { 0x8080, "PDInterfaceDataReal" },
1749     /*0x8081 - 0x808F reserved */
1750     { 0x8090, "Expected PDInterfaceFSUDataAdjust" },
1751     /*0x8091 - 0xAFEF reserved */
1752     { 0xAFF0, "I&M0" },
1753     { 0xAFF1, "I&M1" },
1754     { 0xAFF2, "I&M2" },
1755     { 0xAFF3, "I&M3" },
1756     { 0xAFF4, "I&M4" },
1757     { 0xAFF5, "I&M5" },
1758     { 0xAFF6, "I&M6" },
1759     { 0xAFF7, "I&M7" },
1760     { 0xAFF8, "I&M8" },
1761     { 0xAFF9, "I&M9" },
1762     { 0xAFFA, "I&M10" },
1763     { 0xAFFB, "I&M11" },
1764     { 0xAFFC, "I&M12" },
1765     { 0xAFFD, "I&M13" },
1766     { 0xAFFE, "I&M14" },
1767     { 0xAFFF, "I&M15" },
1768     /*0xB000 - 0xB02D reserved for profiles */
1769     { 0xB000, "Sync-Log / RTA SyncID 0 (GSY)" },
1770     { 0xB001, "Sync-Log / RTA SyncID 1 (GSY)" },
1771     { 0xB002, "reserved for profiles" },
1772     { 0xB003, "reserved for profiles" },
1773     { 0xB004, "reserved for profiles" },
1774     { 0xB005, "reserved for profiles" },
1775     { 0xB006, "reserved for profiles" },
1776     { 0xB007, "reserved for profiles" },
1777     { 0xB008, "reserved for profiles" },
1778     { 0xB009, "reserved for profiles" },
1779     { 0xB00A, "reserved for profiles" },
1780     { 0xB00B, "reserved for profiles" },
1781     { 0xB00C, "reserved for profiles" },
1782     { 0xB00D, "reserved for profiles" },
1783     { 0xB00E, "reserved for profiles" },
1784     { 0xB00F, "reserved for profiles" },
1785     { 0xB010, "reserved for profiles" },
1786     { 0xB011, "reserved for profiles" },
1787     { 0xB012, "reserved for profiles" },
1788     { 0xB013, "reserved for profiles" },
1789     { 0xB014, "reserved for profiles" },
1790     { 0xB015, "reserved for profiles" },
1791     { 0xB016, "reserved for profiles" },
1792     { 0xB017, "reserved for profiles" },
1793     { 0xB018, "reserved for profiles" },
1794     { 0xB019, "reserved for profiles" },
1795     { 0xB01A, "reserved for profiles" },
1796     { 0xB01B, "reserved for profiles" },
1797     { 0xB01C, "reserved for profiles" },
1798     { 0xB01D, "reserved for profiles" },
1799     { 0xB01E, "reserved for profiles" },
1800     { 0xB01F, "reserved for profiles" },
1801     { 0xB020, "reserved for profiles" },
1802     { 0xB001, "reserved for profiles" },
1803     { 0xB022, "reserved for profiles" },
1804     { 0xB023, "reserved for profiles" },
1805     { 0xB024, "reserved for profiles" },
1806     { 0xB025, "reserved for profiles" },
1807     { 0xB026, "reserved for profiles" },
1808     { 0xB027, "reserved for profiles" },
1809     { 0xB028, "reserved for profiles" },
1810     { 0xB029, "reserved for profiles" },
1811     { 0xB02A, "reserved for profiles" },
1812     { 0xB02B, "reserved for profiles" },
1813     { 0xB02C, "reserved for profiles" },
1814     { 0xB02D, "reserved for profiles" },
1815     /* PROFIDrive */
1816     { 0xB02E, "PROFIDrive Parameter Access - Local"},
1817     { 0xB02F, "PROFIDrive Parameter Access - Global"},
1818
1819     /*0xB030 - 0xBFFF reserved for profiles */
1820     { 0xB050, "Ext-PLL Control / RTC+RTA SyncID 0 (EDD)" },
1821     { 0xB051, "Ext-PLL Control / RTA SyncID 1 (GSY)" },
1822
1823     { 0xB060, "EDD Trace Unit (EDD" },
1824     { 0xB061, "EDD Trace Unit (EDD" },
1825
1826     { 0xB070, "OHA Info (OHA)" },
1827
1828
1829     /* slot specific */
1830     { 0xC000, "ExpectedIdentificationData for one slot" },
1831     { 0xC001, "RealIdentificationData for one slot" },
1832     /*0xC002 - 0xC009 reserved */
1833     { 0xC00A, "Diagnosis in channel coding for one slot" },
1834     { 0xC00B, "Diagnosis in all codings for one slot" },
1835     { 0xC00C, "Diagnosis, Maintenance, Qualified and Status for one slot" },
1836     /*0xC00D - 0xC00F reserved */
1837     { 0xC010, "Maintenance required in channel coding for one slot" },
1838     { 0xC011, "Maintenance demanded in channel coding for one slot" },
1839     { 0xC012, "Maintenance required in all codings for one slot" },
1840     { 0xC013, "Maintenance demanded in all codings for one slot" },
1841     /*0xC014 - 0xCFFF reserved */
1842     /*0xD000 - 0xDFFF reserved for profiles */
1843
1844     /* AR specific */
1845     { 0xE000, "ExpectedIdentificationData for one AR" },
1846     { 0xE001, "RealIdentificationData for one AR" },
1847     { 0xE002, "ModuleDiffBlock for one AR" },
1848     /*0xE003 - 0xE009 reserved */
1849     { 0xE00A, "Diagnosis in channel coding for one AR" },
1850     { 0xE00B, "Diagnosis in all codings for one AR" },
1851     { 0xE00C, "Diagnosis, Maintenance, Qualified and Status for one AR" },
1852     /*0xE00D - 0xE00F reserved */
1853     { 0xE010, "Maintenance required in channel coding for one AR" },
1854     { 0xE011, "Maintenance demanded in channel coding for one AR" },
1855     { 0xE012, "Maintenance required in all codings for one AR" },
1856     { 0xE013, "Maintenance demanded in all codings for one AR" },
1857     /*0xE014 - 0xE02F reserved */
1858     { 0xE030, "IsochronousModeData for one AR" },
1859     /*0xE031 - 0xE03F reserved */
1860     { 0xE040, "MultipleWrite" },
1861     /*0xE041 - 0xE04F reserved */
1862     { 0xE050, "ARFSUDataAdjust data for one AR" },
1863     /*0xE051 - 0xE05F reserved */
1864     /*0xEC00 - 0xEFFF reserved */
1865
1866     /* API specific */
1867     { 0xF000, "RealIdentificationData for one API" },
1868     /*0xF001 - 0xF009 reserved */
1869     { 0xF00A, "Diagnosis in channel coding for one API" },
1870     { 0xF00B, "Diagnosis in all codings for one API" },
1871     { 0xF00C, "Diagnosis, Maintenance, Qualified and Status for one API" },
1872     /*0xF00D - 0xF00F reserved */
1873     { 0xF010, "Maintenance required in channel coding for one API" },
1874     { 0xF011, "Maintenance demanded in channel coding for one API" },
1875     { 0xF012, "Maintenance required in all codings for one API" },
1876     { 0xF013, "Maintenance demanded in all codings for one API" },
1877     /*0xF014 - 0xF01F reserved */
1878     { 0xF020, "ARData for one API" },
1879     /*0xF021 - 0xF3FF reserved */
1880     /*0xF400 - 0xF7FF reserved */
1881
1882     /* device specific */
1883     /*0xF800 - 0xF80B reserved */
1884     { 0xF80C, "Diagnosis, Maintenance, Qualified and Status for one device" },
1885     /*0xF80D - 0xF81F reserved */
1886     { 0xF820, "ARData" },
1887     { 0xF821, "APIData" },
1888     /*0xF822 - 0xF82F reserved */
1889     { 0xF830, "LogData" },
1890     { 0xF831, "PDevData" },
1891     /*0xF832 - 0xF83F reserved */
1892     { 0xF840, "I&M0FilterData" },
1893     { 0xF841, "PDRealData" },
1894     { 0xF842, "PDExpectedData" },
1895     /*0xF843 - 0xF84F reserved */
1896     { 0xF850, "AutoConfigurarion" },
1897     /*0xF851 - 0xFBFF reserved */
1898     /*0xFC00 - 0xFFFF reserved for profiles */
1899     { 0, NULL }
1900 };
1901
1902 static const value_string pn_io_user_structure_identifier[] = {
1903     /*0x0000 - 0x7FFF manufacturer specific */
1904     { 0x8000, "ChannelDiagnosis" },
1905     { 0x8001, "Multiple" },
1906     { 0x8002, "ExtChannelDiagnosis" },
1907     { 0x8003, "QualifiedChannelDiagnosis" },
1908     /*0x8004 - 0x80FF reserved */
1909     { 0x8100, "Maintenance" },
1910     /*0x8101 - 0x8FFF reserved */
1911     /*0x9000 - 0x9FFF reserved for profiles */
1912     /*0xA000 - 0xFFFF reserved */
1913     { 0, NULL }
1914 };
1915
1916 static const value_string pn_io_channel_number[] = {
1917     /*0x0000 - 0x7FFF manufacturer specific */
1918     { 0x8000, "Submodule" },
1919     /*0x8001 - 0xFFFF reserved */
1920     { 0, NULL }
1921 };
1922
1923 static const value_string pn_io_channel_error_type[] = {
1924     { 0x0000, "reserved" },
1925     { 0x0001, "short circuit" },
1926     { 0x0002, "Undervoltage" },
1927     { 0x0003, "Overvoltage" },
1928     { 0x0004, "Overload" },
1929     { 0x0005, "Overtemperature" },
1930     { 0x0006, "line break" },
1931     { 0x0007, "upper limit value exceeded" },
1932     { 0x0008, "lower limit value exceeded" },
1933     { 0x0009, "Error" },
1934     /*0x000A - 0x000F reserved */
1935     { 0x0010, "parametrization fault" },
1936     { 0x0011, "power supply fault" },
1937     { 0x0012, "fuse blown / open" },
1938     { 0x0013, "Manufacturer specific" },
1939     { 0x0014, "ground fault" },
1940     { 0x0015, "reference point lost" },
1941     { 0x0016, "process event lost / sampling error" },
1942     { 0x0017, "threshold warning" },
1943     { 0x0018, "output disabled" },
1944     { 0x0019, "safety event" },
1945     { 0x001A, "external fault" },
1946     /*0x001B - 0x001F manufacturer specific */
1947     /*0x0020 - 0x00FF reserved for common profiles */
1948     /*0x0100 - 0x7FFF manufacturer specific */
1949     { 0x8000, "Data transmission impossible" },
1950     { 0x8001, "Remote mismatch" },
1951     { 0x8002, "Media redundancy mismatch" },
1952     { 0x8003, "Sync mismatch" },
1953     { 0x8004, "IsochronousMode mismatch" },
1954     { 0x8005, "Multicast CR mismatch" },
1955     { 0x8006, "reserved" },
1956     { 0x8007, "Fiber optic mismatch" },
1957     { 0x8008, "Network component function mismatch" },
1958     { 0x8009, "Time mismatch" },
1959     /* added values for IEC version 2.3: */
1960     { 0x800A, "Dynamic frame packing function mismatch" },
1961     { 0x800B, "Media redundancy with planned duplication mismatch"},
1962     { 0x800C, "System redundancy mismatch"},
1963     /* ends */
1964     /*0x800D - 0x8FFF reserved */
1965     /*0x9000 - 0x9FFF reserved for profile */
1966     /*0xA000 - 0xFFFF reserved */
1967     { 0, NULL }
1968 };
1969     /* ExtChannelErrorType for ChannelErrorType 0 - 0x7FFF */
1970
1971 static const value_string pn_io_ext_channel_error_type0[] = {
1972     /* 0x0000 Reserved */
1973     /* 0x0001 - 0x7FFF Manufacturer specific */
1974     { 0x8000, "Accumulative Info"},
1975     /* 0x8001 - 0x8FFF Reserved */
1976     /* 0x9000 - 0x9FFF Reserved for profiles */
1977     /* 0xA000 - 0xFFFF Reserved */
1978     { 0, NULL }
1979 };
1980
1981
1982     /* ExtChannelErrorType for ChannelErrorType "Data transmission impossible" */
1983 static const value_string pn_io_ext_channel_error_type0x8000[] = {
1984     /* 0x0000 Reserved */
1985     /* 0x0001 - 0x7FFF Manufacturer specific */
1986     { 0x8000, "Link State mismatch - Link down"},
1987     { 0x8001, "MAUType mismatch"},
1988     { 0x8002, "Line Delay mismatch"},
1989     /* 0x8003 - 0x8FFF Reserved */
1990     /* 0x9000 - 0x9FFF Reserved for profiles */
1991     /* 0xA000 - 0xFFFF Reserved */
1992     { 0, NULL }
1993 };
1994
1995     /* ExtChannelErrorType for ChannelErrorType "Remote mismatch" */
1996 static const value_string pn_io_ext_channel_error_type0x8001[] = {
1997     /* 0x0000 Reserved */
1998     /* 0x0001 - 0x7FFF Manufacturer specific */
1999     { 0x8000, "Peer Chassis ID mismatch"},
2000     { 0x8001, "Peer Port ID mismatch"},
2001     { 0x8002, "Peer RT_CLASS_3 mismatch a"},
2002     { 0x8003, "Peer MAUType mismatch"},
2003     { 0x8004, "Peer MRP domain mismatch"},
2004     { 0x8005, "No peer detected"},
2005     { 0x8006, "Reserved"},
2006     { 0x8007, "Peer Line Delay mismatch"},
2007     { 0x8008, "Peer PTCP mismatch b"},
2008     { 0x8009, "Peer Preamble Length mismatch"},
2009     { 0x800A, "Peer Fragmentation mismatch"},
2010     /* 0x800B - 0x8FFF Reserved */
2011     /* 0x9000 - 0x9FFF Reserved for profiles */
2012     /* 0xA000 - 0xFFFF Reserved */
2013     { 0, NULL }
2014 };
2015
2016     /* ExtChannelErrorType for ChannelErrorType "Media redundancy mismatch" 0x8002 */
2017 static const value_string pn_io_ext_channel_error_type0x8002[] = {
2018     /* 0x0000 Reserved */
2019     /* 0x0001 - 0x7FFF Manufacturer specific */
2020     { 0x8000, "Manager role fail"},
2021     { 0x8001, "MRP ring open"},
2022     { 0x8002, "Reserved"},
2023     { 0x8003, "Multiple mananger"},
2024     /* 0x8004 - 0x8FFF Reserved */
2025     /* 0x9000 - 0x9FFF Reserved for profiles */
2026     /* 0xA000 - 0xFFFF Reserved */
2027     { 0, NULL }
2028 };
2029
2030     /* ExtChannelErrorType for ChannelErrorType "Sync mismatch" and for ChannelErrorType "Time mismatch" 0x8003 and 0x8009*/
2031 static const value_string pn_io_ext_channel_error_type0x8003[] = {
2032     /* 0x0000 Reserved */
2033     /* 0x0001 - 0x7FFF Manufacturer specific */
2034     { 0x8000, "No sync message received"},
2035     { 0x8001, "- 0x8002 Reserved"},
2036     { 0x8003, "Jitter out of boundary"},
2037     /* 0x8004 - 0x8FFF Reserved */
2038     /* 0x9000 - 0x9FFF Reserved for profiles */
2039     /* 0xA000 - 0xFFFF Reserved */
2040     { 0, NULL }
2041 };
2042
2043     /*ExtChannelErrorType for ChannelErrorType "Isochronous mode mismatch" 0x8004 */
2044 static const value_string pn_io_ext_channel_error_type0x8004[] = {
2045     /* 0x0000 Reserved */
2046     /* 0x0001 - 0x7FFF Manufacturer specific */
2047     { 0x8000, "Output Time Failure - Output update missing or out of order"},
2048     { 0x8001, "Input Time Failure"},
2049     { 0x8002, "Master Life Sign Failure - Error in MLS update detected"},
2050     /* 0x8003 - 0x8FFF Reserved */
2051     /* 0x9000 - 0x9FFF Reserved for profiles */
2052     /* 0xA000 - 0xFFFF Reserved */
2053     { 0, NULL }
2054 };
2055
2056     /* ExtChannelErrorType for ChannelErrorType "Multicast CR mismatch" 0x8005 */
2057 static const value_string pn_io_ext_channel_error_type0x8005[] = {
2058     /* 0x0000 Reserved */
2059     /* 0x0001 - 0x7FFF Manufacturer specific */
2060     { 0x8000, "Multicast Consumer CR timed out"},
2061     { 0x8001, "Address resolution failed"},
2062     /* 0x8002 - 0x8FFF Reserved */
2063     /* 0x9000 - 0x9FFF Reserved for profiles */
2064     /* 0xA000 - 0xFFFF Reserved */
2065     { 0, NULL }
2066 };
2067
2068     /* ExtChannelErrorType for ChannelErrorType "Fiber optic mismatch" 0x8007*/
2069 static const value_string pn_io_ext_channel_error_type0x8007[] = {
2070     /* 0x0000 Reserved */
2071     /* 0x0001 - 0x7FFF Manufacturer specific */
2072     { 0x8000, "Power Budget"},
2073     /* 0x8001 - 0x8FFF Reserved */
2074     /* 0x9000 - 0x9FFF Reserved for profiles */
2075     /* 0xA000 - 0xFFFF Reserved */
2076     { 0, NULL }
2077 };
2078
2079     /* ExtChannelErrorType for ChannelErrorType "Network component function mismatch" 0x8008 */
2080 static const value_string pn_io_ext_channel_error_type0x8008[] = {
2081     /* 0x0000 Reserved */
2082     /* 0x0001 - 0x7FFF Manufacturer specific */
2083     { 0x8000, "Frame dropped - no resource"},
2084     /* 0x8001 - 0x8FFF Reserved */
2085     /* 0x9000 - 0x9FFF Reserved for profiles */
2086     /* 0xA000 - 0xFFFF Reserved */
2087     { 0, NULL }
2088 };
2089
2090     /* ExtChannelErrorType for ChannelErrorType "Dynamic Frame Packing function mismatch" 0x800A */
2091 static const value_string pn_io_ext_channel_error_type0x800A[] = {
2092     /* 0x0000 Reserved */
2093     /* 0x0001 - 0x7FFF Manufacturer specific */
2094     /* 0x8000 - 0x80FF Reserved */
2095     { 0x8100, "Frame late error for FrameID (0x0100)"},
2096     /* 0x8101 + 0x8FFE See Equation (56) */
2097     { 0x8FFF, "Frame late error for FrameID (0x0FFF)"},
2098     /* 0x8001 - 0x8FFF Reserved */
2099     /* 0x9000 - 0x9FFF Reserved for profiles */
2100     /* 0xA000 - 0xFFFF Reserved */
2101     { 0, NULL }
2102 };
2103
2104     /* ExtChannelErrorType for ChannelErrorType "Media redundancy with planned duplication mismatch" 0x800B */
2105 static const value_string pn_io_ext_channel_error_type0x800B[] = {
2106     /* 0x0000 Reserved */
2107     /* 0x0001 - 0x7FFF Manufacturer specific */
2108     /* 0x8000 - 0x86FF Reserved */
2109     { 0x8700, "MRPD duplication void for FrameID (0x0700)"},
2110     /* 0x8701 + 0x8FFE See Equation (57) */
2111     { 0x8FFF, "MRPD duplication void for FrameID (0x0FFF)"},
2112     /* 0x9000 - 0x9FFF Reserved for profiles */
2113     /* 0xA000 - 0xFFFF Reserved */
2114     { 0, NULL }
2115 };
2116
2117     /* ExtChannelErrorType for ChannelErrorType "System redundancy mismatch" 0x800C */
2118 static const value_string pn_io_ext_channel_error_type0x800C[] = {
2119     /* 0x0000 Reserved */
2120     /* 0x0001 - 0x7FFF Manufacturer specific */
2121     { 0x8000, "System redundancy event"},
2122     /* 0x8001 - 0x8FFF Reserved */
2123     /* 0x9000 - 0x9FFF Reserved for profiles */
2124     /* 0xA000 - 0xFFFF Reserved */
2125     { 0, NULL }
2126 };
2127
2128 static const value_string pn_io_channel_properties_type[] = {
2129     { 0x0000, "submodule or unspecified" },
2130     { 0x0001, "1 Bit" },
2131     { 0x0002, "2 Bit" },
2132     { 0x0003, "4 Bit" },
2133     { 0x0004, "8 Bit" },
2134     { 0x0005, "16 Bit" },
2135     { 0x0006, "32 Bit" },
2136     { 0x0007, "64 Bit" },
2137     /*0x0008 - 0x00FF reserved */
2138     { 0, NULL }
2139 };
2140
2141 static const value_string pn_io_channel_properties_maintenance[] = {
2142     { 0x0000, "Diagnosis" },
2143     { 0x0001, "Maintenance required" },
2144     { 0x0002, "Maintenance demanded" },
2145     { 0x0003, "Qualified diagnosis" },
2146     { 0, NULL }
2147 };
2148
2149 static const value_string pn_io_channel_properties_specifier[] = {
2150     { 0x0000, "All subsequent disappears" },
2151     { 0x0001, "Appears" },
2152     { 0x0002, "Disappears" },
2153     { 0x0003, "Disappears but others remain" },
2154     { 0, NULL }
2155 };
2156
2157 static const value_string pn_io_channel_properties_direction[] = {
2158     { 0x0000, "Manufacturer-specific" },
2159     { 0x0001, "Input" },
2160     { 0x0002, "Output" },
2161     { 0x0003, "Input/Output" },
2162     /*0x0004 - 0x0007 reserved */
2163     { 0, NULL }
2164 };
2165
2166 static const value_string pn_io_alarmcr_type[] = {
2167     { 0x0000, "reserved" },
2168     { 0x0001, "Alarm CR" },
2169     /*0x0002 - 0xFFFF reserved */
2170     { 0, NULL }
2171 };
2172
2173 static const value_string pn_io_mau_type[] = {
2174     /*0x0000 - 0x0004 reserved */
2175     { 0x0005, "10BASET" },
2176     /*0x0006 - 0x0009 reserved */
2177     { 0x000A, "10BASETXHD" },
2178     { 0x000B, "10BASETXFD" },
2179     { 0x000C, "10BASEFLHD" },
2180     { 0x000D, "10BASEFLFD" },
2181     { 0x000F, "100BASETXHD" },
2182     { 0x0010, "100BASETXFD" },
2183     { 0x0011, "100BASEFXHD" },
2184     { 0x0012, "100BASEFXFD" },
2185     /*0x0013 - 0x0014 reserved */
2186     { 0x0015, "1000BASEXHD" },
2187     { 0x0016, "1000BASEXFD" },
2188     { 0x0017, "1000BASELXHD" },
2189     { 0x0018, "1000BASELXFD" },
2190     { 0x0019, "1000BASESXHD" },
2191     { 0x001A, "1000BASESXFD" },
2192     /*0x001B - 0x001C reserved */
2193     { 0x001D, "1000BASETHD" },
2194     { 0x001E, "1000BASETFD" },
2195     { 0x001F, "10GigBASEFX" },
2196     /*0x0020 - 0x002D reserved */
2197     { 0x002E, "100BASELX10" },
2198     /*0x002F - 0x0035 reserved */
2199     { 0x0036, "100BASEPXFD" },
2200     /*0x0037 - 0xFFFF reserved */
2201     { 0, NULL }
2202 };
2203
2204
2205 static const value_string pn_io_preamble_length[] = {
2206     { 0x0000, "Seven octets Preamble shall be used" },
2207     { 0x0001, "One octet Preamble shall be used" },
2208     /*0x0002 - 0xFFFF reserved */
2209     { 0, NULL }
2210 };
2211
2212 static const value_string pn_io_mau_type_mode[] = {
2213     { 0x0000, "OFF" },
2214     { 0x0001, "ON" },
2215     /*0x0002 - 0xFFFF reserved */
2216     { 0, NULL }
2217 };
2218
2219
2220 static const value_string pn_io_port_state[] = {
2221     { 0x0000, "reserved" },
2222     { 0x0001, "up" },
2223     { 0x0002, "down" },
2224     { 0x0003, "testing" },
2225     { 0x0004, "unknown" },
2226     /*0x0005 - 0xFFFF reserved */
2227     { 0, NULL }
2228 };
2229
2230
2231 static const value_string pn_io_media_type[] = {
2232     { 0x0000, "Unknown" },
2233     { 0x0001, "Copper cable" },
2234     { 0x0002, "Fiber optic cable" },
2235     { 0x0003, "Radio communication" },
2236     /*0x0004 - 0xFFFF reserved */
2237     { 0, NULL }
2238 };
2239
2240
2241 static const value_string pn_io_fiber_optic_type[] = {
2242     { 0x0000, "No fiber type adjusted" },
2243     { 0x0001, "9 um single mode fiber" },
2244     { 0x0002, "50 um multi mode fiber" },
2245     { 0x0003, "62,5 um multi mode fiber" },
2246     { 0x0004, "SI-POF, NA=0.5" },
2247     { 0x0005, "SI-PCF, NA=0.36" },
2248     { 0x0006, "LowNA-POF, NA=0.3" },
2249     { 0x0007, "GI-POF" },
2250     /*0x0008 - 0xFFFF reserved */
2251     { 0, NULL }
2252 };
2253
2254
2255 static const value_string pn_io_fiber_optic_cable_type[] = {
2256     { 0x0000, "No cable specified" },
2257     { 0x0001, "Inside/outside cable, fixed installation" },
2258     { 0x0002, "Inside/outside cable, flexible installation" },
2259     { 0x0003, "Outdoor cable, fixed installation" },
2260     /*0x0004 - 0xFFFF reserved */
2261     { 0, NULL }
2262 };
2263
2264 static const value_string pn_io_im_revision_prefix_vals[] = {
2265     { 'V', "V - Officially released version" },
2266     { 'R', "R - Revision" },
2267     { 'P', "P - Protoype" },
2268     { 'U', "U - Under Test (Field Test)" },
2269     { 'T', "T - Test Device" },
2270     /*all others reserved */
2271     { 0, NULL }
2272 };
2273
2274
2275 static const value_string pn_io_mrp_role_vals[] = {
2276     { 0x0000, "Media Redundancy disabled" },
2277     { 0x0001, "Media Redundancy Client" },
2278     { 0x0002, "Media Redundancy Manager" },
2279     /*all others reserved */
2280     { 0, NULL }
2281 };
2282
2283
2284 static const value_string pn_io_mrp_prio_vals[] = {
2285     { 0x0000, "Highest priority redundancy manager" },
2286     /* 0x1000 - 0x7000 High priorities */
2287     { 0x8000, "Default priority for redundancy manager" },
2288     /* 0x9000 - 0xE000 Low priorities */
2289     { 0xF000, "Lowest priority redundancy manager" },
2290     /*all others reserved */
2291     { 0, NULL }
2292 };
2293
2294 static const value_string pn_io_mrp_rtmode_rtclass12_vals[] = {
2295     { 0x0000, "RT_CLASS_1 and RT_CLASS_2 redundancy mode deactivated" },
2296     { 0x0001, "RT_CLASS_1 and RT_CLASS_2 redundancy mode activated" },
2297     { 0, NULL }
2298 };
2299
2300 static const value_string pn_io_mrp_rtmode_rtclass3_vals[] = {
2301     { 0x0000, "RT_CLASS_3 redundancy mode deactivated" },
2302     { 0x0001, "RT_CLASS_3 redundancy mode activated" },
2303     { 0, NULL }
2304 };
2305
2306 static const value_string pn_io_mrp_ring_state_vals[] = {
2307     { 0x0000, "Ring open" },
2308     { 0x0001, "Ring closed" },
2309     { 0, NULL }
2310 };
2311
2312 static const value_string pn_io_mrp_rt_state_vals[] = {
2313     { 0x0000, "RT media redundancy lost" },
2314     { 0x0001, "RT media redundancy available" },
2315     { 0, NULL }
2316 };
2317
2318 static const value_string pn_io_control_properties_vals[] = {
2319     { 0x0000, "Reserved" },
2320     { 0, NULL }
2321 };
2322
2323 static const value_string pn_io_control_properties_prmbegin_vals[] = {
2324     { 0x0000, "No PrmBegin" },
2325     { 0x0001, "The IO controller starts the transmisson of the stored start-up parameter" },
2326     { 0, NULL }
2327 };
2328 static const value_string pn_io_control_properties_application_ready_vals[] = {
2329     { 0x0000, "Wait for explicit ControlCommand.ReadyForCompanion" },
2330     { 0x0001, "Implicit ControlCommand.ReadyForCompanion" },
2331     { 0, NULL }
2332 };
2333
2334 static const value_string pn_io_fs_hello_mode_vals[] = {
2335     { 0x0000, "OFF" },
2336     { 0x0001, "Send req on LinkUp" },
2337     { 0x0002, "Send req on LinkUp after HelloDelay" },
2338     { 0, NULL }
2339 };
2340
2341 static const value_string pn_io_fs_parameter_mode_vals[] = {
2342     { 0x0000, "OFF" },
2343     { 0x0001, "ON" },
2344     { 0x0002, "Reserved" },
2345     { 0x0003, "Reserved" },
2346     { 0, NULL }
2347 };
2348
2349 static const value_string pn_io_frame_details_sync_master_vals[] = {
2350     { 0x0000, "No Sync Frame" },
2351     { 0x0001, "Primary sync frame" },
2352     { 0x0002, "Secondary sync frame" },
2353     { 0x0003, "Reserved" },
2354     { 0, NULL }
2355 };
2356 static const value_string pn_io_frame_details_meaning_frame_send_offset_vals[] = {
2357     { 0x0000, "Field FrameSendOffset specifies the point of time for receiving or transmitting a frame " },
2358     { 0x0001, "Field FrameSendOffset specifies the beginning of the RT_CLASS_3 interval within a phase" },
2359     { 0x0002, "Field FrameSendOffset specifies the ending of the RT_CLASS_3 interval within a phase" },
2360     { 0x0003, "Reserved" },
2361     { 0, NULL }
2362 };
2363
2364 static const value_string pn_io_f_check_seqnr[] = {
2365     { 0x00, "consecutive number not included in crc" },
2366     { 0x01, "consecutive number included in crc" },
2367     { 0, NULL }
2368 };
2369
2370 static const value_string pn_io_f_check_ipar[] = {
2371     { 0x00, "no check" },
2372     { 0x01, "check" },
2373     { 0, NULL }
2374 };
2375
2376 static const value_string pn_io_f_sil[] = {
2377     { 0x00, "SIL1" },
2378     { 0x01, "SIL2" },
2379     { 0x02, "SIL3" },
2380     { 0x03, "NoSIL" },
2381     { 0, NULL }
2382 };
2383
2384 static const value_string pn_io_f_crc_len[] = {
2385     { 0x00, "3 octet CRC" },
2386     { 0x01, "2 octet CRC" },
2387     { 0x02, "4 octet CRC" },
2388     { 0x03, "reserved" },
2389     { 0, NULL }
2390 };
2391
2392 static const value_string pn_io_f_block_id[] = {
2393     { 0x00, "Parameter set for F-Host/F-Device relationship" },
2394     { 0x01, "Additional F_Address parameter block" },
2395     /* 0x02..0x07 reserved */
2396     { 0, NULL }
2397 };
2398
2399 static const value_string pn_io_f_par_version[] = {
2400     { 0x00, "Valid for V1-mode" },
2401     { 0x01, "Valid for V2-mode" },
2402     /* 0x02..0x03 reserved */
2403     { 0, NULL }
2404 };
2405
2406 static const value_string pn_io_profidrive_request_id_vals[] = {
2407     { 0x00, "Reserved" },
2408     { 0x01, "Read request" },
2409     { 0x02, "Change request" },
2410     { 0, NULL }
2411 };
2412
2413 static const value_string pn_io_profidrive_response_id_vals[] = {
2414     { 0x00, "Reserved" },
2415     { 0x01, "Positive read response" },
2416     { 0x02, "Positive change response" },
2417     { 0x81, "Negative read response" },
2418     { 0x82, "Negative change response" },
2419     { 0, NULL }
2420 };
2421
2422 static const value_string pn_io_profidrive_attribute_vals[] = {
2423     { 0x00, "Reserved" },
2424     { 0x10, "Value" },
2425     { 0x20, "Description" },
2426     { 0x30, "Text" },
2427     { 0, NULL }
2428 };
2429
2430 static const value_string pn_io_profidrive_format_vals[] = {
2431     { 0x00, "Reserved" },
2432     { 0x40, "Zero" },
2433     { 0x41, "Byte" },
2434     { 0x42, "Word" },
2435     { 0x43, "Double Word" },
2436     { 0x44, "Error" },
2437     { 0, NULL }
2438 };
2439
2440 GList *pnio_ars;
2441
2442 typedef struct pnio_ar_s {
2443     /* generic */
2444     e_uuid_t        aruuid;
2445     guint16         inputframeid;
2446     guint16         outputframeid;
2447
2448     /* controller only */
2449     /*const char      controllername[33];*/
2450     const guint8    controllermac[6];
2451     guint16         controlleralarmref;
2452
2453     /* device only */
2454     const guint8    devicemac[6];
2455     guint16         devicealarmref;
2456     guint16         arType;
2457 } pnio_ar_t;
2458
2459
2460
2461 static void
2462 pnio_ar_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pnio_ar_t *ar)
2463 {
2464     proto_item *item;
2465     proto_item *sub_item;
2466     proto_tree *sub_tree;
2467
2468
2469     pinfo->profinet_conv = ar;
2470     pinfo->profinet_type = 10;
2471
2472     if (tree) {
2473         sub_item = proto_tree_add_text(tree, tvb, 0, 0, "ARUUID:%s ContrMAC:%s ContrAlRef:0x%x DevMAC:%s DevAlRef:0x%x InCR:0x%x OutCR=0x%x",
2474             guid_to_str((const e_guid_t*) &ar->aruuid),
2475             ether_to_str((const guint8 *)ar->controllermac), ar->controlleralarmref,
2476             ether_to_str((const guint8 *)ar->devicemac), ar->devicealarmref,
2477             ar->inputframeid, ar->outputframeid);
2478         sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_ar_info);
2479         PROTO_ITEM_SET_GENERATED(sub_item);
2480
2481         item = proto_tree_add_guid(sub_tree, hf_pn_io_ar_uuid, tvb, 0, 0, (e_guid_t *) &ar->aruuid);
2482         PROTO_ITEM_SET_GENERATED(item);
2483
2484         item = proto_tree_add_ether(sub_tree, hf_pn_io_cminitiator_macadd, tvb, 0, 0, ar->controllermac);
2485         PROTO_ITEM_SET_GENERATED(item);
2486         item = proto_tree_add_uint(sub_tree, hf_pn_io_localalarmref, tvb, 0, 0, ar->controlleralarmref);
2487         PROTO_ITEM_SET_GENERATED(item);
2488
2489         item = proto_tree_add_ether(sub_tree, hf_pn_io_cmresponder_macadd, tvb, 0, 0, ar->devicemac);
2490         PROTO_ITEM_SET_GENERATED(item);
2491         item = proto_tree_add_uint(sub_tree, hf_pn_io_localalarmref, tvb, 0, 0, ar->devicealarmref);
2492         PROTO_ITEM_SET_GENERATED(item);
2493
2494         item = proto_tree_add_uint(sub_tree, hf_pn_io_frame_id, tvb, 0, 0, ar->inputframeid);
2495         PROTO_ITEM_SET_GENERATED(item);
2496         item = proto_tree_add_uint(sub_tree, hf_pn_io_frame_id, tvb, 0, 0, ar->outputframeid);
2497         PROTO_ITEM_SET_GENERATED(item);
2498     }
2499 }
2500
2501
2502
2503
2504 static int dissect_block(tvbuff_t *tvb, int offset,
2505     packet_info *pinfo, proto_tree *tree, guint8 *drep, guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t **ar);
2506
2507 static int dissect_a_block(tvbuff_t *tvb, int offset,
2508     packet_info *pinfo, proto_tree *tree, guint8 *drep);
2509
2510 static int dissect_blocks(tvbuff_t *tvb, int offset,
2511     packet_info *pinfo, proto_tree *tree, guint8 *drep);
2512
2513 static int dissect_PNIO_IOxS(tvbuff_t *tvb, int offset,
2514     packet_info *pinfo, proto_tree *tree, guint8 *drep, int hfindex);
2515
2516
2517
2518
2519
2520 static pnio_ar_t *
2521 pnio_ar_find_by_aruuid(packet_info *pinfo _U_, e_uuid_t *aruuid)
2522 {
2523     GList       *ars;
2524     pnio_ar_t   *ar;
2525
2526
2527     /* find pdev */
2528     for(ars = pnio_ars; ars != NULL; ars = g_list_next(ars)) {
2529         ar = ars->data;
2530
2531         if( memcmp(&ar->aruuid, aruuid, sizeof(e_uuid_t)) == 0) {
2532             return ar;
2533         }
2534     }
2535
2536     return NULL;
2537 }
2538
2539
2540 static pnio_ar_t *
2541 pnio_ar_new(e_uuid_t *aruuid)
2542 {
2543     pnio_ar_t *ar;
2544
2545
2546     ar = se_alloc0(sizeof(pnio_ar_t));
2547
2548     memcpy(&ar->aruuid, aruuid, sizeof(e_uuid_t));
2549
2550     ar->controlleralarmref  = 0xffff;
2551     ar->devicealarmref      = 0xffff;
2552
2553     pnio_ars = g_list_append(pnio_ars, ar);
2554
2555     return ar;
2556 }
2557
2558
2559
2560 /* dissect the four status (error) fields */
2561 static int
2562 dissect_PNIO_status(tvbuff_t *tvb, int offset,
2563     packet_info *pinfo, proto_tree *tree, guint8 *drep)
2564 {
2565     guint8  u8ErrorCode;
2566     guint8  u8ErrorDecode;
2567     guint8  u8ErrorCode1;
2568     guint8  u8ErrorCode2;
2569
2570     proto_item *sub_item;
2571     proto_tree *sub_tree;
2572     guint32 u32SubStart;
2573     int bytemask = (drep[0] & DREP_LITTLE_ENDIAN) ? 3 : 0;
2574     const value_string *error_code1_vals;
2575     const value_string *error_code2_vals = pn_io_error_code2;   /* defaults */
2576
2577
2578
2579     /* status */
2580     sub_item = proto_tree_add_item(tree, hf_pn_io_status, tvb, offset, 0, ENC_NA);
2581     sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_status);
2582     u32SubStart = offset;
2583
2584     /* the PNIOStatus field is existing in both the RPC and the application data,
2585      * depending on the current PDU.
2586      * As the byte representation of these layers are different, this has to be handled
2587      * in a somewhat different way than elsewhere. */
2588
2589     dissect_dcerpc_uint8(tvb, offset+(0^bytemask), pinfo, sub_tree, drep,
2590                          hf_pn_io_error_code, &u8ErrorCode);
2591     dissect_dcerpc_uint8(tvb, offset+(1^bytemask), pinfo, sub_tree, drep,
2592                          hf_pn_io_error_decode, &u8ErrorDecode);
2593
2594     switch(u8ErrorDecode) {
2595     case(0x80): /* PNIORW */
2596         dissect_dcerpc_uint8(tvb, offset+(2^bytemask), pinfo, sub_tree, drep,
2597                              hf_pn_io_error_code1_pniorw, &u8ErrorCode1);
2598         error_code1_vals = pn_io_error_code1_pniorw;
2599
2600         /* u8ErrorCode2 for PNIORW is always user specific */
2601         dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2602                              hf_pn_io_error_code2_pniorw, &u8ErrorCode2);
2603
2604         error_code2_vals = pn_io_error_code2_pniorw;
2605
2606         break;
2607     case(0x81): /* PNIO */
2608         dissect_dcerpc_uint8(tvb, offset+(2^bytemask), pinfo, sub_tree, drep,
2609                              hf_pn_io_error_code1_pnio, &u8ErrorCode1);
2610         error_code1_vals = pn_io_error_code1_pnio;
2611
2612         switch(u8ErrorCode1) {
2613         case(1):
2614             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2615                                  hf_pn_io_error_code2_pnio_1, &u8ErrorCode2);
2616             error_code2_vals = pn_io_error_code2_pnio_1;
2617             break;
2618         case(2):
2619             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2620                                  hf_pn_io_error_code2_pnio_2, &u8ErrorCode2);
2621             error_code2_vals = pn_io_error_code2_pnio_2;
2622             break;
2623         case(3):
2624             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2625                                  hf_pn_io_error_code2_pnio_3, &u8ErrorCode2);
2626             error_code2_vals = pn_io_error_code2_pnio_3;
2627             break;
2628         case(4):
2629             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2630                                  hf_pn_io_error_code2_pnio_4, &u8ErrorCode2);
2631             error_code2_vals = pn_io_error_code2_pnio_4;
2632             break;
2633         case(5):
2634             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2635                                  hf_pn_io_error_code2_pnio_5, &u8ErrorCode2);
2636             error_code2_vals = pn_io_error_code2_pnio_5;
2637             break;
2638         case(6):
2639             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2640                                  hf_pn_io_error_code2_pnio_6, &u8ErrorCode2);
2641             error_code2_vals = pn_io_error_code2_pnio_6;
2642             break;
2643         case(7):
2644             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2645                                  hf_pn_io_error_code2_pnio_7, &u8ErrorCode2);
2646             error_code2_vals = pn_io_error_code2_pnio_7;
2647             break;
2648         case(8):
2649             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2650                                  hf_pn_io_error_code2_pnio_8, &u8ErrorCode2);
2651             error_code2_vals = pn_io_error_code2_pnio_8;
2652             break;
2653         case(20):
2654             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2655                                  hf_pn_io_error_code2_pnio_20, &u8ErrorCode2);
2656             error_code2_vals = pn_io_error_code2_pnio_20;
2657             break;
2658         case(21):
2659             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2660                                  hf_pn_io_error_code2_pnio_21, &u8ErrorCode2);
2661             error_code2_vals = pn_io_error_code2_pnio_21;
2662             break;
2663         case(22):
2664             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2665                                  hf_pn_io_error_code2_pnio_22, &u8ErrorCode2);
2666             error_code2_vals = pn_io_error_code2_pnio_22;
2667             break;
2668         case(23):
2669             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2670                                  hf_pn_io_error_code2_pnio_23, &u8ErrorCode2);
2671             error_code2_vals = pn_io_error_code2_pnio_23;
2672             break;
2673         case(40):
2674             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2675                                  hf_pn_io_error_code2_pnio_40, &u8ErrorCode2);
2676             error_code2_vals = pn_io_error_code2_pnio_40;
2677             break;
2678         case(61):
2679             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2680                                  hf_pn_io_error_code2_pnio_61, &u8ErrorCode2);
2681             error_code2_vals = pn_io_error_code2_pnio_61;
2682             break;
2683         case(62):
2684             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2685                                  hf_pn_io_error_code2_pnio_62, &u8ErrorCode2);
2686             error_code2_vals = pn_io_error_code2_pnio_62;
2687             break;
2688         case(63):
2689             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2690                                  hf_pn_io_error_code2_pnio_63, &u8ErrorCode2);
2691             error_code2_vals = pn_io_error_code2_pnio_63;
2692             break;
2693         case(64):
2694             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2695                                  hf_pn_io_error_code2_pnio_64, &u8ErrorCode2);
2696             error_code2_vals = pn_io_error_code2_pnio_64;
2697             break;
2698         case(65):
2699             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2700                                  hf_pn_io_error_code2_pnio_65, &u8ErrorCode2);
2701             error_code2_vals = pn_io_error_code2_pnio_65;
2702             break;
2703         case(66):
2704             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2705                                  hf_pn_io_error_code2_pnio_66, &u8ErrorCode2);
2706             error_code2_vals = pn_io_error_code2_pnio_66;
2707             break;
2708         case(70):
2709             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2710                                  hf_pn_io_error_code2_pnio_70, &u8ErrorCode2);
2711             error_code2_vals = pn_io_error_code2_pnio_70;
2712             break;
2713         case(71):
2714             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2715                                  hf_pn_io_error_code2_pnio_71, &u8ErrorCode2);
2716             error_code2_vals = pn_io_error_code2_pnio_71;
2717             break;
2718         case(72):
2719             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2720                                  hf_pn_io_error_code2_pnio_72, &u8ErrorCode2);
2721             error_code2_vals = pn_io_error_code2_pnio_72;
2722             break;
2723         case(73):
2724             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2725                                  hf_pn_io_error_code2_pnio_73, &u8ErrorCode2);
2726             error_code2_vals = pn_io_error_code2_pnio_73;
2727             break;
2728         case(74):
2729             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2730                                  hf_pn_io_error_code2_pnio_74, &u8ErrorCode2);
2731             error_code2_vals = pn_io_error_code2_pnio_74;
2732             break;
2733         case(75):
2734             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2735                                  hf_pn_io_error_code2_pnio_75, &u8ErrorCode2);
2736             error_code2_vals = pn_io_error_code2_pnio_75;
2737             break;
2738         case(76):
2739             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2740                                  hf_pn_io_error_code2_pnio_76, &u8ErrorCode2);
2741             error_code2_vals = pn_io_error_code2_pnio_76;
2742             break;
2743         case(77):
2744             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2745                                  hf_pn_io_error_code2_pnio_77, &u8ErrorCode2);
2746             error_code2_vals = pn_io_error_code2_pnio_77;
2747             break;
2748         case(253):
2749             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2750                                  hf_pn_io_error_code2_pnio_253, &u8ErrorCode2);
2751             error_code2_vals = pn_io_error_code2_pnio_253;
2752             break;
2753         case(255):
2754             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2755                                  hf_pn_io_error_code2_pnio_255, &u8ErrorCode2);
2756             error_code2_vals = pn_io_error_code2_pnio_255;
2757             break;
2758         default:
2759             /* don't know this u8ErrorCode1 for PNIO, use defaults */
2760             dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2761                                  hf_pn_io_error_code2, &u8ErrorCode2);
2762             expert_add_info_format(pinfo, sub_item, PI_UNDECODED, PI_WARN,
2763                 "Unknown ErrorCode1 0x%x (for ErrorDecode==PNIO)", u8ErrorCode1);
2764             break;
2765         }
2766         break;
2767     default:
2768         dissect_dcerpc_uint8(tvb, offset+(2^bytemask), pinfo, sub_tree, drep,
2769                              hf_pn_io_error_code1, &u8ErrorCode1);
2770         if(u8ErrorDecode!=0) {
2771             expert_add_info_format(pinfo, sub_item, PI_UNDECODED, PI_WARN,
2772             "Unknown ErrorDecode 0x%x", u8ErrorDecode);
2773         }
2774         error_code1_vals = pn_io_error_code1;
2775
2776         /* don't know this u8ErrorDecode, use defaults */
2777         dissect_dcerpc_uint8(tvb, offset+(3^bytemask), pinfo, sub_tree, drep,
2778                              hf_pn_io_error_code2, &u8ErrorCode2);
2779         if(u8ErrorDecode != 0) {
2780             expert_add_info_format(pinfo, sub_item, PI_UNDECODED, PI_WARN,
2781             "Unknown ErrorDecode 0x%x", u8ErrorDecode);
2782         }
2783     }
2784
2785     offset +=4;
2786
2787     if(u8ErrorCode == 0 && u8ErrorDecode == 0 && u8ErrorCode1 == 0 && u8ErrorCode2 == 0) {
2788         proto_item_append_text(sub_item, ": OK");
2789         col_append_str(pinfo->cinfo, COL_INFO, ", OK");
2790     } else {
2791         proto_item_append_text(sub_item, ": Error: \"%s\", \"%s\", \"%s\", \"%s\"",
2792             val_to_str(u8ErrorCode, pn_io_error_code, "(0x%x)"),
2793             val_to_str(u8ErrorDecode, pn_io_error_decode, "(0x%x)"),
2794             val_to_str(u8ErrorCode1, error_code1_vals, "(0x%x)"),
2795             val_to_str(u8ErrorCode2, error_code2_vals, "(0x%x)"));
2796         col_append_fstr(pinfo->cinfo, COL_INFO, ", Error: \"%s\", \"%s\", \"%s\", \"%s\"",
2797             val_to_str(u8ErrorCode, pn_io_error_code, "(0x%x)"),
2798             val_to_str(u8ErrorDecode, pn_io_error_decode, "(0x%x)"),
2799             val_to_str(u8ErrorCode1, error_code1_vals, "(0x%x)"),
2800             val_to_str(u8ErrorCode2, error_code2_vals, "(0x%x)"));
2801     }
2802     proto_item_set_len(sub_item, offset - u32SubStart);
2803
2804     return offset;
2805 }
2806
2807
2808 /* dissect the alarm specifier */
2809 static int
2810 dissect_Alarm_specifier(tvbuff_t *tvb, int offset,
2811     packet_info *pinfo, proto_tree *tree, guint8 *drep)
2812 {
2813     guint16 u16AlarmSpecifierSequence;
2814     guint16 u16AlarmSpecifierChannel;
2815     guint16 u16AlarmSpecifierManufacturer;
2816     guint16 u16AlarmSpecifierSubmodule;
2817     guint16 u16AlarmSpecifierAR;
2818     proto_item *sub_item;
2819     proto_tree *sub_tree;
2820
2821     /* alarm specifier */
2822     sub_item = proto_tree_add_item(tree, hf_pn_io_alarm_specifier, tvb, offset, 2, ENC_NA);
2823     sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_pdu_type);
2824
2825     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2826                         hf_pn_io_alarm_specifier_sequence, &u16AlarmSpecifierSequence);
2827     u16AlarmSpecifierSequence &= 0x07FF;
2828     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2829                         hf_pn_io_alarm_specifier_channel, &u16AlarmSpecifierChannel);
2830     u16AlarmSpecifierChannel = (u16AlarmSpecifierChannel &0x0800) >> 11;
2831     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2832                         hf_pn_io_alarm_specifier_manufacturer, &u16AlarmSpecifierManufacturer);
2833     u16AlarmSpecifierManufacturer = (u16AlarmSpecifierManufacturer &0x1000) >> 12;
2834     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2835                         hf_pn_io_alarm_specifier_submodule, &u16AlarmSpecifierSubmodule);
2836     u16AlarmSpecifierSubmodule = (u16AlarmSpecifierSubmodule & 0x2000) >> 13;
2837     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2838                         hf_pn_io_alarm_specifier_ardiagnosis, &u16AlarmSpecifierAR);
2839     u16AlarmSpecifierAR = (u16AlarmSpecifierAR & 0x8000) >> 15;
2840
2841
2842     proto_item_append_text(sub_item, ", Sequence: %u, Channel: %u, Manuf: %u, Submodule: %u AR: %u",
2843         u16AlarmSpecifierSequence, u16AlarmSpecifierChannel,
2844         u16AlarmSpecifierManufacturer, u16AlarmSpecifierSubmodule, u16AlarmSpecifierAR);
2845
2846     return offset;
2847 }
2848
2849
2850 /* dissect the alarm header */
2851 static int
2852 dissect_Alarm_header(tvbuff_t *tvb, int offset,
2853     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep)
2854 {
2855     guint16 u16AlarmType;
2856     guint32 u32Api;
2857     guint16 u16SlotNr;
2858     guint16 u16SubslotNr;
2859
2860     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2861                         hf_pn_io_alarm_type, &u16AlarmType);
2862     offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
2863                         hf_pn_io_api, &u32Api);
2864     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2865                         hf_pn_io_slot_nr, &u16SlotNr);
2866     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2867                         hf_pn_io_subslot_nr, &u16SubslotNr);
2868
2869     proto_item_append_text(item, ", %s, API:%u, Slot:0x%x/0x%x",
2870         val_to_str(u16AlarmType, pn_io_alarm_type, "(0x%x)"),
2871         u32Api, u16SlotNr, u16SubslotNr);
2872
2873     col_append_fstr(pinfo->cinfo, COL_INFO, ", %s, Slot: 0x%x/0x%x",
2874         val_to_str(u16AlarmType, pn_io_alarm_type, "(0x%x)"),
2875         u16SlotNr, u16SubslotNr);
2876
2877     return offset;
2878 }
2879
2880
2881 static int
2882 dissect_ChannelProperties(tvbuff_t *tvb, int offset,
2883     packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep)
2884 {
2885     proto_item *sub_item;
2886     proto_tree *sub_tree;
2887     guint16 u16ChannelProperties;
2888
2889
2890     sub_item = proto_tree_add_item(tree, hf_pn_io_channel_properties, tvb, offset, 2, ENC_BIG_ENDIAN);
2891     sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_channel_properties);
2892     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2893                     hf_pn_io_channel_properties_direction, &u16ChannelProperties);
2894     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2895                     hf_pn_io_channel_properties_specifier, &u16ChannelProperties);
2896 /* replaced with 2 bit values
2897     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2898                     hf_pn_io_channel_properties_maintenance_demanded, &u16ChannelProperties);
2899     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2900                     hf_pn_io_channel_properties_maintenance_required, &u16ChannelProperties);
2901 */
2902     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2903                     hf_pn_io_channel_properties_maintenance, &u16ChannelProperties);
2904     dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2905                     hf_pn_io_channel_properties_accumulative, &u16ChannelProperties);
2906     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
2907                     hf_pn_io_channel_properties_type, &u16ChannelProperties);
2908
2909     return offset;
2910 }
2911
2912
2913 static int
2914 dissect_AlarmUserStructure(tvbuff_t *tvb, int offset,
2915     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep,
2916         guint16 *body_length, guint16 u16UserStructureIdentifier)
2917 {
2918     guint16 u16ChannelNumber;
2919     guint16 u16ChannelErrorType;
2920     guint16 u16ExtChannelErrorType;
2921     guint32 u32ExtChannelAddValue;
2922     guint16 u16Index;
2923     guint32 u32RecDataLen;
2924     pnio_ar_t *ar = NULL;
2925
2926
2927     switch(u16UserStructureIdentifier) {
2928     case(0x8000):   /* ChannelDiagnosisData */
2929         offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2930                         hf_pn_io_channel_number, &u16ChannelNumber);
2931         offset = dissect_ChannelProperties(tvb, offset, pinfo, tree, item, drep);
2932         offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2933                         hf_pn_io_channel_error_type, &u16ChannelErrorType);
2934         *body_length -= 6;
2935         break;
2936     case(0x8002):   /* ExtChannelDiagnosisData */
2937         offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2938                         hf_pn_io_channel_number, &u16ChannelNumber);
2939
2940         offset = dissect_ChannelProperties(tvb, offset, pinfo, tree, item, drep);
2941
2942         offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2943                         hf_pn_io_channel_error_type, &u16ChannelErrorType);
2944
2945         if(u16ChannelErrorType < 0x7fff)
2946         {
2947             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2948                         hf_pn_io_ext_channel_error_type0, &u16ExtChannelErrorType);
2949         }
2950         else if(u16ChannelErrorType == 0x8000)
2951         {
2952             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2953                         hf_pn_io_ext_channel_error_type0x8000, &u16ExtChannelErrorType);
2954         }
2955         else if(u16ChannelErrorType == 0x8001)
2956         {
2957             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2958                         hf_pn_io_ext_channel_error_type0x8001, &u16ExtChannelErrorType);
2959         }
2960         else if(u16ChannelErrorType == 0x8002)
2961         {
2962             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2963                         hf_pn_io_ext_channel_error_type0x8002, &u16ExtChannelErrorType);
2964         }
2965         else if((u16ChannelErrorType == 0x8003)||(u16ChannelErrorType == 0x8009))
2966         {
2967             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2968                         hf_pn_io_ext_channel_error_type0x8003, &u16ExtChannelErrorType);
2969         }
2970         else if(u16ChannelErrorType == 0x8004)
2971         {
2972             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2973                         hf_pn_io_ext_channel_error_type0x8004, &u16ExtChannelErrorType);
2974         }
2975         else if(u16ChannelErrorType == 0x8005)
2976         {
2977             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2978                         hf_pn_io_ext_channel_error_type0x8005, &u16ExtChannelErrorType);
2979         }
2980         else if(u16ChannelErrorType == 0x8007)
2981         {
2982             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2983                         hf_pn_io_ext_channel_error_type0x8007, &u16ExtChannelErrorType);
2984         }
2985         else if(u16ChannelErrorType == 0x8008)
2986         {
2987             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2988                         hf_pn_io_ext_channel_error_type0x8008, &u16ExtChannelErrorType);
2989         }
2990         else if(u16ChannelErrorType == 0x800A)
2991         {
2992             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2993                         hf_pn_io_ext_channel_error_type0x800A, &u16ExtChannelErrorType);
2994         }
2995         else if(u16ChannelErrorType == 0x800B)
2996         {
2997             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
2998                         hf_pn_io_ext_channel_error_type0x800B, &u16ExtChannelErrorType);
2999         }
3000         else if(u16ChannelErrorType == 0x800C)
3001         {
3002             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3003                         hf_pn_io_ext_channel_error_type0x800C, &u16ExtChannelErrorType);
3004         }
3005         else
3006         {
3007             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3008                         hf_pn_io_ext_channel_error_type, &u16ExtChannelErrorType);
3009         }
3010         offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
3011                         hf_pn_io_ext_channel_add_value, &u32ExtChannelAddValue);
3012         *body_length -= 12;
3013         break;
3014     case(0x8100):   /* MaintenanceItem */
3015         offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
3016         *body_length -= 12;
3017         break;
3018     /* XXX - dissect remaining user structures of [AlarmItem] */
3019     case(0x8001):   /* DiagnosisData */
3020     case(0x8003):   /* QualifiedChannelDiagnosisData */
3021     default:
3022         if(u16UserStructureIdentifier >= 0x8000) {
3023             offset = dissect_pn_undecoded(tvb, offset, pinfo, tree, *body_length);
3024         } else {
3025             offset = dissect_pn_user_data(tvb, offset, pinfo, tree, *body_length, "UserData");
3026         }
3027
3028         *body_length = 0;
3029     }
3030
3031     return offset;
3032 }
3033
3034
3035
3036 /* dissect the alarm notification block */
3037 static int
3038 dissect_AlarmNotification_block(tvbuff_t *tvb, int offset,
3039     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow,
3040     guint16 body_length)
3041 {
3042     guint32 u32ModuleIdentNumber;
3043     guint32 u32SubmoduleIdentNumber;
3044     guint16 u16UserStructureIdentifier;
3045
3046
3047     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3048         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3049             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3050         return offset;
3051     }
3052
3053     offset = dissect_Alarm_header(tvb, offset, pinfo, tree, item, drep);
3054
3055     offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
3056                         hf_pn_io_module_ident_number, &u32ModuleIdentNumber);
3057     offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
3058                         hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber);
3059
3060     offset = dissect_Alarm_specifier(tvb, offset, pinfo, tree, drep);
3061
3062     proto_item_append_text(item, ", Ident:0x%x, SubIdent:0x%x",
3063         u32ModuleIdentNumber, u32SubmoduleIdentNumber);
3064
3065     body_length -= 20;
3066
3067     /* the rest of the block contains optional: [MaintenanceItem] and/or [AlarmItem] */
3068     while(body_length) {
3069         offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3070                             hf_pn_io_user_structure_identifier, &u16UserStructureIdentifier);
3071         proto_item_append_text(item, ", USI:0x%x", u16UserStructureIdentifier);
3072         body_length -= 2;
3073
3074         offset = dissect_AlarmUserStructure(tvb, offset, pinfo, tree, item, drep, &body_length, u16UserStructureIdentifier);
3075     }
3076
3077     return offset;
3078 }
3079
3080
3081 static int
3082 dissect_IandM0_block(tvbuff_t *tvb, int offset,
3083     packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3084 {
3085     guint8 u8VendorIDHigh;
3086     guint8 u8VendorIDLow;
3087     char *pOrderID;
3088     char *pIMSerialNumber;
3089     guint16 u16IMHardwareRevision;
3090     guint8 u8SWRevisionPrefix;
3091     guint8 u8IMSWRevisionFunctionalEnhancement;
3092     guint8 u8IMSWRevisionBugFix;
3093     guint8 u8IMSWRevisionInternalChange;
3094     guint16 u16IMRevisionCounter;
3095     guint16 u16IMProfileID;
3096     guint16 u16IMProfileSpecificType;
3097     guint8 u8IMVersionMajor;
3098     guint8 u8IMVersionMinor;
3099     guint16 u16IMSupported;
3100
3101
3102     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3103         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3104             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3105         return offset;
3106     }
3107
3108     /* x8 VendorIDHigh */
3109     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3110                     hf_pn_io_vendor_id_high, &u8VendorIDHigh);
3111     /* x8 VendorIDLow */
3112     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3113                     hf_pn_io_vendor_id_low, &u8VendorIDLow);
3114     /* c8[20] OrderID */
3115     pOrderID = ep_alloc(20+1);
3116     tvb_memcpy(tvb, (guint8 *) pOrderID, offset, 20);
3117     pOrderID[20] = '\0';
3118     proto_tree_add_string (tree, hf_pn_io_order_id, tvb, offset, 20, pOrderID);
3119     offset += 20;
3120
3121     /* c8[16] IM_Serial_Number */
3122     pIMSerialNumber = ep_alloc(16+1);
3123     tvb_memcpy(tvb, (guint8 *) pIMSerialNumber, offset, 16);
3124     pIMSerialNumber[16] = '\0';
3125     proto_tree_add_string (tree, hf_pn_io_im_serial_number, tvb, offset, 16, pIMSerialNumber);
3126     offset += 16;
3127
3128     /* x16 IM_Hardware_Revision */
3129     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3130                     hf_pn_io_im_hardware_revision, &u16IMHardwareRevision);
3131     /* c8 SWRevisionPrefix */
3132     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3133                     hf_pn_io_im_revision_prefix, &u8SWRevisionPrefix);
3134     /* x8 IM_SWRevision_Functional_Enhancement */
3135     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3136                     hf_pn_io_im_sw_revision_functional_enhancement, &u8IMSWRevisionFunctionalEnhancement);
3137     /* x8 IM_SWRevision_Bug_Fix */
3138     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3139                     hf_pn_io_im_revision_bugfix, &u8IMSWRevisionBugFix);
3140     /* x8 IM_SWRevision_Internal_Change */
3141     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3142                     hf_pn_io_im_sw_revision_internal_change, &u8IMSWRevisionInternalChange);
3143     /* x16 IM_Revision_Counter */
3144     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3145                     hf_pn_io_im_revision_counter, &u16IMRevisionCounter);
3146     /* x16 IM_Profile_ID */
3147     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3148                     hf_pn_io_im_profile_id, &u16IMProfileID);
3149     /* x16 IM_Profile_Specific_Type */
3150     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3151                     hf_pn_io_im_profile_specific_type, &u16IMProfileSpecificType);
3152     /* x8 IM_Version_Major (values) */
3153     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3154                     hf_pn_io_im_version_major, &u8IMVersionMajor);
3155     /* x8 IM_Version_Minor (values) */
3156     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3157                     hf_pn_io_im_version_minor, &u8IMVersionMinor);
3158     /* x16 IM_Supported (bitfield) */
3159     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3160                     hf_pn_io_im_supported, &u16IMSupported);
3161
3162     return offset;
3163 }
3164
3165
3166 static int
3167 dissect_IandM1_block(tvbuff_t *tvb, int offset,
3168     packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint8 *drep _U_, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3169 {
3170     char *pTagFunction;
3171     char *pTagLocation;
3172
3173     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3174         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3175             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3176         return offset;
3177     }
3178
3179     /* IM_Tag_Function [32] */
3180     pTagFunction = ep_alloc(32+1);
3181     tvb_memcpy(tvb, (guint8 *) pTagFunction, offset, 32);
3182     pTagFunction[32] = '\0';
3183     proto_tree_add_string (tree, hf_pn_io_im_tag_function, tvb, offset, 32, pTagFunction);
3184     offset += 32;
3185
3186     /* IM_Tag_Location [22] */
3187     pTagLocation = ep_alloc(22+1);
3188     tvb_memcpy(tvb, (guint8 *) pTagLocation, offset, 22);
3189     pTagLocation[22] = '\0';
3190     proto_tree_add_string (tree, hf_pn_io_im_tag_location, tvb, offset, 22, pTagLocation);
3191     offset += 22;
3192
3193     proto_item_append_text(item, ": TagFunction:\"%s\", TagLocation:\"%s\"", pTagFunction, pTagLocation);
3194
3195     return offset;
3196 }
3197
3198
3199 static int
3200 dissect_IandM2_block(tvbuff_t *tvb, int offset,
3201     packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint8 *drep _U_, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3202 {
3203     char *pDate;
3204
3205     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3206         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3207             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3208         return offset;
3209     }
3210
3211     /* IM_Date [16] */
3212     pDate = ep_alloc(16+1);
3213     tvb_memcpy(tvb, (guint8 *) pDate, offset, 16);
3214     pDate[16] = '\0';
3215     proto_tree_add_string (tree, hf_pn_io_im_date, tvb, offset, 16, pDate);
3216     offset += 16;
3217
3218     proto_item_append_text(item, ": Date:\"%s\"", pDate);
3219
3220     return offset;
3221 }
3222
3223
3224 static int
3225 dissect_IandM3_block(tvbuff_t *tvb, int offset,
3226     packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint8 *drep _U_, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3227 {
3228     char *pDescriptor;
3229
3230     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3231         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3232             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3233         return offset;
3234     }
3235
3236     /* IM_Descriptor [54] */
3237     pDescriptor = ep_alloc(54+1);
3238     tvb_memcpy(tvb, (guint8 *) pDescriptor, offset, 54);
3239     pDescriptor[54] = '\0';
3240     proto_tree_add_string (tree, hf_pn_io_im_descriptor, tvb, offset, 54, pDescriptor);
3241     offset += 54;
3242
3243     proto_item_append_text(item, ": Descriptor:\"%s\"", pDescriptor);
3244
3245     return offset;
3246 }
3247
3248
3249 static int
3250 dissect_IandM4_block(tvbuff_t *tvb, int offset,
3251     packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint8 *drep _U_, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3252 {
3253
3254     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3255         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3256             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3257         return offset;
3258     }
3259
3260     dissect_pn_user_data(tvb, offset, pinfo, tree, 54, "IM Signature");
3261
3262     return offset;
3263 }
3264
3265
3266 static int
3267 dissect_IandM0FilterData_block(tvbuff_t *tvb, int offset,
3268     packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3269 {
3270     guint16 u16NumberOfAPIs;
3271     guint32 u32Api;
3272     guint16 u16NumberOfModules;
3273     guint16 u16SlotNr;
3274     guint32 u32ModuleIdentNumber;
3275     guint16 u16NumberOfSubmodules;
3276     guint16 u16SubslotNr;
3277     guint32 u32SubmoduleIdentNumber;
3278     proto_item *subslot_item;
3279     proto_tree *subslot_tree;
3280     proto_item *module_item;
3281     proto_tree *module_tree;
3282     guint32 u32ModuleStart;
3283
3284
3285     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3286         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3287             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3288         return offset;
3289     }
3290
3291     /* NumberOfAPIs */
3292     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3293                     hf_pn_io_number_of_apis, &u16NumberOfAPIs);
3294
3295     while(u16NumberOfAPIs--) {
3296         /* API */
3297         offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
3298                         hf_pn_io_api, &u32Api);
3299         /* NumberOfModules */
3300         offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3301                         hf_pn_io_number_of_modules, &u16NumberOfModules);
3302
3303         while(u16NumberOfModules--) {
3304             module_item = proto_tree_add_item(tree, hf_pn_io_subslot, tvb, offset, 6, ENC_NA);
3305             module_tree = proto_item_add_subtree(module_item, ett_pn_io_module);
3306
3307             u32ModuleStart = offset;
3308
3309             /* SlotNumber */
3310             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, module_tree, drep,
3311                             hf_pn_io_slot_nr, &u16SlotNr);
3312             /* ModuleIdentNumber */
3313             offset = dissect_dcerpc_uint32(tvb, offset, pinfo, module_tree, drep,
3314                             hf_pn_io_module_ident_number, &u32ModuleIdentNumber);
3315             /* NumberOfSubmodules */
3316             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, module_tree, drep,
3317                             hf_pn_io_number_of_submodules, &u16NumberOfSubmodules);
3318
3319             proto_item_append_text(module_item, ": Slot:%u, Ident:0x%x Submodules:%u",
3320                 u16SlotNr, u32ModuleIdentNumber, u16NumberOfSubmodules);
3321
3322             while(u16NumberOfSubmodules--) {
3323                 subslot_item = proto_tree_add_item(module_tree, hf_pn_io_subslot, tvb, offset, 6, ENC_NA);
3324                 subslot_tree = proto_item_add_subtree(subslot_item, ett_pn_io_subslot);
3325
3326                 /* SubslotNumber */
3327                 offset = dissect_dcerpc_uint16(tvb, offset, pinfo, subslot_tree, drep,
3328                                     hf_pn_io_subslot_nr, &u16SubslotNr);
3329                 /* SubmoduleIdentNumber */
3330                 offset = dissect_dcerpc_uint32(tvb, offset, pinfo, subslot_tree, drep,
3331                                 hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber);
3332
3333                 proto_item_append_text(subslot_item, ": Number:0x%x, Ident:0x%x",
3334                     u16SubslotNr, u32SubmoduleIdentNumber);
3335             }
3336
3337             proto_item_set_len(module_item, offset-u32ModuleStart);
3338         }
3339     }
3340
3341     return offset;
3342 }
3343
3344
3345 /* dissect the IdentificationData block */
3346 static int
3347 dissect_IdentificationData_block(tvbuff_t *tvb, int offset,
3348     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3349 {
3350     guint16 u16NumberOfAPIs = 1;
3351     guint32 u32Api;
3352     guint16 u16NumberOfSlots;
3353     guint16 u16SlotNr;
3354     guint32 u32ModuleIdentNumber;
3355     guint16 u16NumberOfSubslots;
3356     guint32 u32SubmoduleIdentNumber;
3357     guint16 u16SubslotNr;
3358     proto_item *slot_item;
3359     proto_tree *slot_tree;
3360     guint32 u32SlotStart;
3361     proto_item *subslot_item;
3362     proto_tree *subslot_tree;
3363
3364
3365     if(u8BlockVersionHigh != 1 || (u8BlockVersionLow != 0 && u8BlockVersionLow != 1)) {
3366         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3367             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3368         return offset;
3369     }
3370
3371     if(u8BlockVersionLow == 1) {
3372         /* NumberOfAPIs */
3373         offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3374                             hf_pn_io_number_of_apis, &u16NumberOfAPIs);
3375     }
3376
3377     proto_item_append_text(item, ": APIs:%u", u16NumberOfAPIs);
3378
3379     while(u16NumberOfAPIs--) {
3380         if(u8BlockVersionLow == 1) {
3381             /* API */
3382             offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
3383                             hf_pn_io_api, &u32Api);
3384         }
3385
3386         /* NumberOfSlots */
3387         offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3388                             hf_pn_io_number_of_slots, &u16NumberOfSlots);
3389
3390         proto_item_append_text(item, ", Slots:%u", u16NumberOfSlots);
3391
3392         while(u16NumberOfSlots--) {
3393             slot_item = proto_tree_add_item(tree, hf_pn_io_slot, tvb, offset, 0, ENC_NA);
3394             slot_tree = proto_item_add_subtree(slot_item, ett_pn_io_slot);
3395             u32SlotStart = offset;
3396
3397             /* SlotNumber */
3398             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, slot_tree, drep,
3399                                 hf_pn_io_slot_nr, &u16SlotNr);
3400             /* ModuleIdentNumber */
3401             offset = dissect_dcerpc_uint32(tvb, offset, pinfo, slot_tree, drep,
3402                                 hf_pn_io_module_ident_number, &u32ModuleIdentNumber);
3403             /* NumberOfSubslots */
3404             offset = dissect_dcerpc_uint16(tvb, offset, pinfo, slot_tree, drep,
3405                                 hf_pn_io_number_of_subslots, &u16NumberOfSubslots);
3406
3407             proto_item_append_text(slot_item, ": SlotNr:%u Ident:0x%x Subslots:%u",
3408                 u16SlotNr, u32ModuleIdentNumber, u16NumberOfSubslots);
3409
3410             while(u16NumberOfSubslots--) {
3411                 subslot_item = proto_tree_add_item(slot_tree, hf_pn_io_subslot, tvb, offset, 6, ENC_NA);
3412                 subslot_tree = proto_item_add_subtree(subslot_item, ett_pn_io_subslot);
3413
3414                 /* SubslotNumber */
3415                 offset = dissect_dcerpc_uint16(tvb, offset, pinfo, subslot_tree, drep,
3416                                     hf_pn_io_subslot_nr, &u16SubslotNr);
3417                 /* SubmoduleIdentNumber */
3418                 offset = dissect_dcerpc_uint32(tvb, offset, pinfo, subslot_tree, drep,
3419                                 hf_pn_io_submodule_ident_number, &u32SubmoduleIdentNumber);
3420
3421                 proto_item_append_text(subslot_item, ": Number:0x%x, Ident:0x%x",
3422                     u16SubslotNr, u32SubmoduleIdentNumber);
3423             }
3424
3425             proto_item_set_len(slot_item, offset-u32SlotStart);
3426         }
3427     }
3428
3429     return offset;
3430 }
3431
3432
3433 /* dissect the substitute value block */
3434 static int
3435 dissect_SubstituteValue_block(tvbuff_t *tvb, int offset,
3436     packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow,
3437     guint16 u16BodyLength)
3438 {
3439     guint16 u16SubstitutionMode;
3440
3441     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3442         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3443             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3444         return offset;
3445     }
3446
3447     /* SubstitutionMode */
3448     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3449                     hf_pn_io_substitutionmode, &u16SubstitutionMode);
3450
3451
3452     /* SubstituteDataItem */
3453     /* IOCS */
3454     offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iocs);
3455     u16BodyLength -= 3;
3456     /* SubstituteDataObjectElement */
3457     dissect_pn_user_data_bytes(tvb, offset, pinfo, tree, u16BodyLength, "SubstituteDataObjectElement");
3458
3459     return offset;
3460 }
3461
3462
3463 /* dissect the RecordInputDataObjectElement block */
3464 static int
3465 dissect_RecordInputDataObjectElement_block(tvbuff_t *tvb, int offset,
3466     packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3467 {
3468     guint8 u8LengthIOCS;
3469     guint8 u8LengthIOPS;
3470     guint16 u16LengthData;
3471
3472
3473     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3474         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3475             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3476         return offset;
3477     }
3478
3479     /* LengthIOCS */
3480     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3481                 hf_pn_io_length_iocs, &u8LengthIOCS);
3482     /* IOCS */
3483     offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iocs);
3484     /* LengthIOPS */
3485     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3486                 hf_pn_io_length_iops, &u8LengthIOPS);
3487     /* IOPS */
3488     offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iops);
3489     /* LengthData */
3490     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3491                 hf_pn_io_length_data, &u16LengthData);
3492     /* Data */
3493     offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u16LengthData, "Data");
3494
3495     return offset;
3496 }
3497
3498
3499 /* dissect the RecordOutputDataObjectElement block */
3500 static int
3501 dissect_RecordOutputDataObjectElement_block(tvbuff_t *tvb, int offset,
3502     packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3503 {
3504     guint16 u16SubstituteActiveFlag;
3505     guint8 u8LengthIOCS;
3506     guint8 u8LengthIOPS;
3507     guint16 u16LengthData;
3508     guint16 u16Index;
3509     guint32 u32RecDataLen;
3510     pnio_ar_t *ar = NULL;
3511
3512
3513     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3514         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3515             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3516         return offset;
3517     }
3518
3519     /* SubstituteActiveFlag */
3520     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3521                 hf_pn_io_substitute_active_flag, &u16SubstituteActiveFlag);
3522
3523     /* LengthIOCS */
3524     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3525                 hf_pn_io_length_iocs, &u8LengthIOCS);
3526     /* LengthIOPS */
3527     offset = dissect_dcerpc_uint8(tvb, offset, pinfo, tree, drep,
3528                 hf_pn_io_length_iops, &u8LengthIOPS);
3529     /* LengthData */
3530     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3531                 hf_pn_io_length_data, &u16LengthData);
3532     /* DataItem (IOCS, Data, IOPS) */
3533     offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iocs);
3534
3535     offset = dissect_pn_user_data(tvb, offset, pinfo, tree, u16LengthData, "Data");
3536
3537     offset = dissect_PNIO_IOxS(tvb, offset, pinfo, tree, drep, hf_pn_io_iops);
3538
3539     /* SubstituteValue */
3540     offset = dissect_block(tvb, offset, pinfo, tree, drep, &u16Index, &u32RecDataLen, &ar);
3541
3542     return offset;
3543 }
3544
3545
3546 /* dissect the alarm acknowledge block */
3547 static int
3548 dissect_Alarm_ack_block(tvbuff_t *tvb, int offset,
3549     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3550 {
3551     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3552         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3553             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3554         return offset;
3555     }
3556
3557     col_append_str(pinfo->cinfo, COL_INFO, ", Alarm Ack");
3558
3559     offset = dissect_Alarm_header(tvb, offset, pinfo, tree, item, drep);
3560
3561     offset = dissect_Alarm_specifier(tvb, offset, pinfo, tree, drep);
3562
3563     offset = dissect_PNIO_status(tvb, offset, pinfo, tree, drep);
3564
3565     return offset;
3566 }
3567
3568
3569 /* dissect the maintenance block */
3570 static int
3571 dissect_Maintenance_block(tvbuff_t *tvb, int offset,
3572     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
3573 {
3574     proto_item *sub_item;
3575     proto_tree *sub_tree;
3576     guint32 u32MaintenanceStatus;
3577
3578
3579     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3580         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3581             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3582         return offset;
3583     }
3584
3585     offset = dissect_pn_align4(tvb, offset, pinfo, tree);
3586
3587     sub_item = proto_tree_add_item(tree, hf_pn_io_maintenance_status, tvb, offset, 4, ENC_BIG_ENDIAN);
3588     sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_maintenance_status);
3589
3590     dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
3591                     hf_pn_io_maintenance_status_demanded, &u32MaintenanceStatus);
3592     offset = dissect_dcerpc_uint32(tvb, offset, pinfo, sub_tree, drep,
3593                     hf_pn_io_maintenance_status_required, &u32MaintenanceStatus);
3594
3595     if(u32MaintenanceStatus & 0x0002) {
3596         proto_item_append_text(item, ", Demanded");
3597         proto_item_append_text(sub_item, ", Demanded");
3598     }
3599
3600     if(u32MaintenanceStatus & 0x0001) {
3601         proto_item_append_text(item, ", Required");
3602         proto_item_append_text(sub_item, ", Required");
3603     }
3604
3605     return offset;
3606 }
3607
3608
3609 /* dissect the read/write header */
3610 static int
3611 dissect_ReadWrite_header(tvbuff_t *tvb, int offset,
3612     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint16 *u16Index, e_uuid_t *aruuid)
3613 {
3614     guint32 u32Api;
3615     guint16 u16SlotNr;
3616     guint16 u16SubslotNr;
3617     guint16 u16SeqNr;
3618
3619     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3620                         hf_pn_io_seq_number, &u16SeqNr);
3621
3622     offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
3623                         hf_pn_io_ar_uuid, aruuid);
3624
3625     offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
3626                         hf_pn_io_api, &u32Api);
3627     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3628                         hf_pn_io_slot_nr, &u16SlotNr);
3629     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3630                         hf_pn_io_subslot_nr, &u16SubslotNr);
3631         /* padding doesn't match offset required for align4 */
3632     offset = dissect_pn_padding(tvb, offset, pinfo, tree, 2);
3633     offset = dissect_dcerpc_uint16(tvb, offset, pinfo, tree, drep,
3634                         hf_pn_io_index, u16Index);
3635
3636     proto_item_append_text(item, ": Seq:%u, Api:0x%x, Slot:0x%x/0x%x",
3637         u16SeqNr, u32Api, u16SlotNr, u16SubslotNr);
3638
3639     col_append_fstr(pinfo->cinfo, COL_INFO, ", Api:0x%x, Slot:0x%x/0x%x, Index:%s",
3640         u32Api, u16SlotNr, u16SubslotNr,
3641         val_to_str(*u16Index, pn_io_index, "(0x%x)"));
3642
3643     return offset;
3644 }
3645
3646
3647 /* dissect the write request block */
3648 static int
3649 dissect_IODWriteReqHeader_block(tvbuff_t *tvb, int offset,
3650     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow,
3651     guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t ** ar)
3652 {
3653     e_uuid_t aruuid;
3654     e_uuid_t null_uuid;
3655
3656     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3657         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3658             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3659         return offset;
3660     }
3661
3662     offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid);
3663
3664     *ar = pnio_ar_find_by_aruuid(pinfo, &aruuid);
3665     if(*ar == NULL) {
3666         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_NOTE, "IODWriteReq: AR information not found!");
3667     }
3668
3669     offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
3670                         hf_pn_io_record_data_length, u32RecDataLen);
3671
3672     memset(&null_uuid, 0, sizeof(e_uuid_t));
3673     if(memcmp(&aruuid, &null_uuid, sizeof (e_uuid_t)) == 0) {
3674         offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
3675                         hf_pn_io_target_ar_uuid, &aruuid);
3676     }
3677
3678     offset = dissect_pn_padding(tvb, offset, pinfo, tree, 24);
3679
3680     proto_item_append_text(item, ", Len:%u", *u32RecDataLen);
3681
3682     if (*u32RecDataLen != 0)
3683         col_append_fstr(pinfo->cinfo, COL_INFO, ", %u bytes",
3684             *u32RecDataLen);
3685
3686     return offset;
3687 }
3688
3689
3690 /* dissect the read request block */
3691 static int
3692 dissect_IODReadReqHeader_block(tvbuff_t *tvb, int offset,
3693     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow,
3694     guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t **ar)
3695 {
3696     e_uuid_t aruuid;
3697     e_uuid_t null_uuid;
3698
3699     if(u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
3700         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_WARN,
3701             "Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
3702         return offset;
3703     }
3704
3705     offset = dissect_ReadWrite_header(tvb, offset, pinfo, tree, item, drep, u16Index, &aruuid);
3706
3707     *ar = pnio_ar_find_by_aruuid(pinfo, &aruuid);
3708     if(*ar == NULL) {
3709         expert_add_info_format(pinfo, item, PI_UNDECODED, PI_NOTE, "IODReadReq: AR information not found!");
3710     }
3711
3712     offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
3713                         hf_pn_io_record_data_length, u32RecDataLen);
3714
3715     memset(&null_uuid, 0, sizeof(e_uuid_t));
3716     if(memcmp(&aruuid, &null_uuid, sizeof (e_uuid_t)) == 0) {
3717         offset = dissect_dcerpc_uuid_t(tvb, offset, pinfo, tree, drep,
3718                         hf_pn_io_target_ar_uuid, &aruuid);
3719         offset = dissect_pn_padding(tvb, offset, pinfo, tree, 8);
3720     } else {
3721         offset = dissect_pn_padding(tvb, offset, pinfo, tree, 24);
3722     }
3723
3724     proto_item_append_text(item, ", Len:%u", *u32RecDataLen);
3725
3726     if (*u32RecDataLen != 0)
3727         col_append_fstr(pinfo->cinfo, COL_INFO, ", %u bytes",
3728             *u32RecDataLen);
3729
3730     return offset;
3731 }
3732
3733
3734 /* dissect the write response block */
3735 static int
3736 dissect_IODWriteResHeader_block(tvbuff_t *tvb, int offset,
3737     packet_info *pinfo, proto_tree *tree, proto_item *item, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow,
3738     guint16 *u16Index, guint32 *u32RecDataLen, pnio_ar_t **ar)
3739 {
3740     e_uuid_t aruuid;