2 * Routines for AIA GigE Vision (TM) Control Protocol dissection
3 * Copyright 2012, AIA <www.visiononline.org> All rights reserved
5 * GigE Vision (TM): GigE Vision a standard developed under the sponsorship of the AIA for
6 * the benefit of the machine vision industry. GVCP stands for GigE Vision (TM) Control
9 * Wireshark - Network traffic analyzer
10 * By Gerald Combs <gerald@wireshark.org>
11 * Copyright 1998 Gerald Combs
13 * SPDX-License-Identifier: GPL-2.0-or-later
18 #include <epan/packet.h>
19 #include <epan/conversation.h>
22 #define GVCP_MIN_PACKET_SIZE ( 8 )
23 #define GVCP_MAX_STREAM_CHANNEL_COUNT ( 512 )
26 header fields to show the relations between
27 request and response as well as the response time
29 static int hf_gvcp_response_in
;
30 static int hf_gvcp_response_to
;
33 structure to hold info to remember between the requests and responses
35 typedef struct _gvcp_transaction_t
{
38 wmem_array_t
*addr_list
;
42 wmem_array_t
* gvcp_trans_array
;
45 structure to hold persistent info for each conversation
47 typedef struct _gvcp_conv_info_t
{
49 uint32_t extended_bootstrap_address
[GVCP_MAX_STREAM_CHANNEL_COUNT
];
53 Bootstrap registers addresses
56 #define GVCP_VERSION (0x00000000)
57 #define GVCP_DEVICE_MODE (0x00000004)
58 #define GVCP_DEVICE_MAC_HIGH_0 (0x00000008)
59 #define GVCP_DEVICE_MAC_LOW_0 (0x0000000C)
60 #define GVCP_SUPPORTED_IP_CONFIGURATION_0 (0x00000010)
61 #define GVCP_CURIPCFG_0 (0x00000014)
62 #define GVCP_CURRENT_IP_ADDRESS_0 (0x00000024)
63 #define GVCP_CURRENT_SUBNET_MASK_0 (0x00000034)
64 #define GVCP_CURRENT_DEFAULT_GATEWAY_0 (0x00000044)
65 #define GVCP_MANUFACTURER_NAME (0x00000048)
66 #define GVCP_MODEL_NAME (0x00000068)
67 #define GVCP_DEVICE_VERSION (0x00000088)
68 #define GVCP_MANUFACTURER_INFO (0x000000A8)
69 #define GVCP_SERIAL_NUMBER (0x000000d8)
70 #define GVCP_USER_DEFINED_NAME (0x000000E8)
71 #define GVCP_FIRST_URL (0x00000200)
72 #define GVCP_SECOND_URL (0x00000400)
73 #define GVCP_NUMBER_OF_NETWORK_INTERFACES (0x00000600)
74 #define GVCP_PERSISTENT_IP_ADDRESS_0 (0x0000064C)
75 #define GVCP_PERSISTENT_SUBNET_MASK_0 (0x0000065C)
76 #define GVCP_PERSISTENT_DEFAULT_GATEWAY_0 (0x0000066C)
77 #define GVCP_LINK_SPEED_0 (0x00000670)
78 #define GVCP_DEVICE_MAC_HIGH_1 (0x00000680)
79 #define GVCP_DEVICE_MAC_LOW_1 (0x00000684)
80 #define GVCP_SUPPORTED_IP_CONFIGURATION_1 (0x00000688)
81 #define GVCP_CURIPCFG_1 (0x0000068C)
82 #define GVCP_CURRENT_IP_ADDRESS_1 (0x0000069C)
83 #define GVCP_CURRENT_SUBNET_MASK_1 (0x000006AC)
84 #define GVCP_CURRENT_DEFAULT_GATEWAY_1 (0x000006BC)
85 #define GVCP_PERSISTENT_IP_ADDRESS_1 (0x000006CC)
86 #define GVCP_PERSISTENT_SUBNET_MASK_1 (0x000006DC)
87 #define GVCP_PERSISTENT_DEFAULT_GATEWAY_1 (0x000006EC)
88 #define GVCP_LINK_SPEED_1 (0x000006F0)
89 #define GVCP_DEVICE_MAC_HIGH_2 (0x00000700)
90 #define GVCP_DEVICE_MAC_LOW_2 (0x00000704)
91 #define GVCP_SUPPORTED_IP_CONFIGURATION_2 (0x00000708)
92 #define GVCP_CURIPCFG_2 (0x0000070C)
93 #define GVCP_CURRENT_IP_ADDRESS_2 (0x0000071C)
94 #define GVCP_CURRENT_SUBNET_MASK_2 (0x0000072C)
95 #define GVCP_CURRENT_DEFAULT_GATEWAY_2 (0x0000073C)
96 #define GVCP_PERSISTENT_IP_ADDRESS_2 (0x0000074C)
97 #define GVCP_PERSISTENT_SUBNET_MASK_2 (0x0000075C)
98 #define GVCP_PERSISTENT_DEFAULT_GATEWAY_2 (0x0000076C)
99 #define GVCP_LINK_SPEED_2 (0x00000770)
100 #define GVCP_DEVICE_MAC_HIGH_3 (0x00000780)
101 #define GVCP_DEVICE_MAC_LOW_3 (0x00000784)
102 #define GVCP_SUPPORTED_IP_CONFIGURATION_3 (0x00000788)
103 #define GVCP_CURIPCFG_3 (0x0000078C)
104 #define GVCP_CURRENT_IP_ADDRESS_3 (0x0000079C)
105 #define GVCP_CURRENT_SUBNET_MASK_3 (0x000007AC)
106 #define GVCP_CURRENT_DEFAULT_GATEWAY_3 (0x000007BC)
107 #define GVCP_PERSISTENT_IP_ADDRESS_3 (0x000007CC)
108 #define GVCP_PERSISTENT_SUBNET_MASK_3 (0x000007DC)
109 #define GVCP_PERSISTENT_DEFAULT_GATEWAY_3 (0x000007EC)
110 #define GVCP_LINK_SPEED_3 (0x000007F0)
111 #define GVCP_NUMBER_OF_MESSAGE_CHANNELS (0x00000900)
112 #define GVCP_NUMBER_OF_STREAM_CHANNELS (0x00000904)
113 #define GVCP_NUMBER_OF_ACTION_SIGNALS (0x00000908)
114 #define GVCP_ACTION_DEVICE_KEY (0x0000090C)
115 #define GVCP_NUMBER_OF_ACTIVE_LINKS (0x00000910)
116 #define GVCP_SC_CAPS (0x0000092C)
117 #define GVCP_MESSAGE_CHANNEL_CAPS (0x00000930)
118 #define GVCP_CAPABILITY (0x00000934)
119 #define GVCP_HEARTBEAT_TIMEOUT (0x00000938)
120 #define GVCP_TIMESTAMP_TICK_FREQUENCY_HIGH (0x0000093C)
121 #define GVCP_TIMESTAMP_TICK_FREQUENCY_LOW (0x00000940)
122 #define GVCP_TIMESTAMP_CONTROL (0x00000944)
123 #define GVCP_TIMESTAMP_VALUE_HIGH (0x00000948)
124 #define GVCP_TIMESTAMP_VALUE_LOW (0x0000094C)
125 #define GVCP_DISCOVERY_ACK_DELAY (0x00000950)
126 #define GVCP_CONFIGURATION (0x00000954)
127 #define GVCP_PENDING_TIMEOUT (0x00000958)
128 #define GVCP_CONTROL_SWITCHOVER_KEY (0x0000095C)
129 #define GVCP_GVSCP_CONFIGURATION (0x00000960)
130 #define GVCP_PHYSICAL_LINK_CAPABILITY (0x00000964)
131 #define GVCP_PHYSICAL_LINK_CONFIGURATION (0x00000968)
132 #define GVCP_IEEE_1588_STATUS (0x0000096C)
133 #define GVCP_SCHEDULED_ACTION_COMMAND_QUEUE_SIZE (0x00000970)
134 #define GVCP_IEEE_1588_EXTENDED_CAPABILITY (0x00000974)
135 #define GVCP_IEEE_1588_SUPPORTED_PROFILES (0x00000978)
136 #define GVCP_IEEE_1588_SELECTED_PROFILE (0x0000097C)
137 #define GVCP_CCP (0x00000A00)
138 #define GVCP_PRIMARY_APPLICATION_PORT (0x00000A04)
139 #define GVCP_PRIMARY_APPLICATION_IP_ADDRESS (0x00000A14)
140 #define GVCP_MC_DESTINATION_PORT (0x00000B00)
141 #define GVCP_MC_DESTINATION_ADDRESS (0x00000B10)
142 #define GVCP_MC_TIMEOUT (0x00000B14)
143 #define GVCP_MC_RETRY_COUNT (0x00000B18)
144 #define GVCP_MC_SOURCE_PORT (0x00000B1C)
145 #define GVCP_MC_CONFIGURATION (0x00000B20) /* GEV 2.2 */
146 #define GVCP_MANIFEST_TABLE (0x00009000)
148 #define GVCP_SC_DESTINATION_PORT(I) (0x0d00+(0x40*I))
149 #define GVCP_SC_PACKET_SIZE(I) (0x0d04+(0x40*I))
150 #define GVCP_SC_PACKET_DELAY(I) (0x0d08+(0x40*I))
151 #define GVCP_SC_DESTINATION_ADDRESS(I) (0x0d18+(0x40*I))
152 #define GVCP_SC_SOURCE_PORT(I) (0x0d1C+(0x40*I))
153 #define GVCP_SC_CAPABILITY(I) (0x0d20+(0x40*I))
154 #define GVCP_SC_CONFIGURATION(I) (0x0d24+(0x40*I))
155 #define GVCP_SC_ZONE(I) (0x0d28+(0x40*I))
156 #define GVCP_SC_ZONE_DIRECTION(I) (0x0d2C+(0x40*I))
157 #define GVCP_SC_MAX_PACKET_COUNT(I) (0x0d30+(0x40*I)) /* GEV 2.2 */
158 #define GVCP_SC_MAX_BLOCK_SIZE_HIGH(I) (0x0d34+(0x40*I)) /* GEV 2.2 */
159 #define GVCP_SC_MAX_BLOCK_SIZE_LOW(I) (0x0d38+(0x40*I)) /* GEV 2.2 */
160 #define GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(I) (0x0d3C+(0x40*I)) /* GEV 2.2 */
162 /* Real address: GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(I) + the values defined here */
163 #define GVCP_SC_GENDC_DESCRIPTOR_ADDRESS ( 0x0000 ) /* GEV 2.2 */
164 #define GVCP_SC_GENDC_DESCRIPTOR_SIZE ( 0x0004 ) /* GEV 2.2 */
165 #define GVCP_SC_GENDC_FLOW_MAPPING_TABLE_ADDRESS ( 0x0008 ) /* GEV 2.2 */
166 #define GVCP_SC_GENDC_FLOW_MAPPING_TABLE_SIZE ( 0x000C ) /* GEV 2.2 */
167 #define GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS_LAST ( 0x000C )
169 #define GVCP_ACTION_GROUP_KEY(I) (0x9800+(0x10*I))
170 #define GVCP_ACTION_GROUP_MASK(I) (0x9804+(0x10*I))
174 Command and acknowledge IDs
177 #define GVCP_DISCOVERY_CMD (0x0002)
178 #define GVCP_DISCOVERY_ACK (0x0003)
179 #define GVCP_FORCEIP_CMD (0x0004)
180 #define GVCP_FORCEIP_ACK (0x0005)
181 #define GVCP_PACKETRESEND_CMD (0x0040)
182 #define GVCP_PACKETRESEND_ACK (0x0041)
183 #define GVCP_READREG_CMD (0x0080)
184 #define GVCP_READREG_ACK (0x0081)
185 #define GVCP_WRITEREG_CMD (0x0082)
186 #define GVCP_WRITEREG_ACK (0x0083)
187 #define GVCP_READMEM_CMD (0x0084)
188 #define GVCP_READMEM_ACK (0x0085)
189 #define GVCP_WRITEMEM_CMD (0x0086)
190 #define GVCP_WRITEMEM_ACK (0x0087)
191 #define GVCP_PENDING_ACK (0x0089)
192 #define GVCP_EVENT_CMD (0x00C0)
193 #define GVCP_EVENT_ACK (0x00C1)
194 #define GVCP_EVENTDATA_CMD (0x00C2)
195 #define GVCP_EVENTDATA_ACK (0x00C3)
196 #define GVCP_ACTION_CMD (0x0100)
197 #define GVCP_ACTION_ACK (0x0101)
204 #define GEV_STATUS_SUCCESS (0x0000)
205 #define GEV_STATUS_PACKET_RESEND (0x0100)
206 #define GEV_STATUS_NOT_IMPLEMENTED (0x8001)
207 #define GEV_STATUS_INVALID_PARAMETER (0x8002)
208 #define GEV_STATUS_INVALID_ADDRESS (0x8003)
209 #define GEV_STATUS_WRITE_PROTECT (0x8004)
210 #define GEV_STATUS_BAD_ALIGNMENT (0x8005)
211 #define GEV_STATUS_ACCESS_DENIED (0x8006)
212 #define GEV_STATUS_BUSY (0x8007)
213 #define GEV_STATUS_LOCAL_PROBLEM (0x8008) /* deprecated */
214 #define GEV_STATUS_MSG_MISMATCH (0x8009) /* deprecated */
215 #define GEV_STATUS_INVALID_PROTOCOL (0x800A) /* deprecated */
216 #define GEV_STATUS_NO_MSG (0x800B) /* deprecated */
217 #define GEV_STATUS_PACKET_UNAVAILABLE (0x800C)
218 #define GEV_STATUS_DATA_OVERRUN (0x800D)
219 #define GEV_STATUS_INVALID_HEADER (0x800E)
220 #define GEV_STATUS_WRONG_CONFIG (0x800F) /* deprecated */
221 #define GEV_STATUS_PACKET_NOT_YET_AVAILABLE (0x8010)
222 #define GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY (0x8011)
223 #define GEV_STATUS_PACKET_REMOVED_FROM_MEMORY (0x8012)
224 #define GEV_STATUS_NO_REF_TIME (0x8013) /* GEV 2.0 */
225 #define GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE (0x8014) /* GEV 2.0 */
226 #define GEV_STATUS_OVERFLOW (0x8015) /* GEV 2.0 */
227 #define GEV_STATUS_ACTION_LATE (0x8016) /* GEV 2.0 */
228 #define GEV_STATUS_LEADER_TRAILER_OVERFLOW (0x8017) /* GEV 2.1 */
229 #define GEV_STATUS_ERROR (0x8FFF)
236 #define GEV_DEVICEMODE_TRANSMITTER (0x00 )
237 #define GEV_DEVICEMODE_RECEIVER (0x01)
238 #define GEV_DEVICEMODE_TRANSCEIVER (0x02)
239 #define GEV_DEVICEMODE_PERIPHERAL (0x03)
246 #define GEV_EVENT_TRIGGER (0x0002) /* deprecated */
247 #define GEV_EVENT_START_OF_EXPOSURE (0x0003) /* deprecated */
248 #define GEV_EVENT_END_OF_EXPOSURE (0x0004) /* deprecated */
249 #define GEV_EVENT_START_OF_TRANSFER (0x0005) /* deprecated */
250 #define GEV_EVENT_END_OF_TRANSFER (0x0006) /* deprecated */
251 #define GEV_EVENT_PRIMARY_APP_SWITCH (0x0007)
252 #define GEV_EVENT_EVENT_LINK_SPEED_CHANGE (0x0008)
253 #define GEV_EVENT_ACTION_LATE (0x0009)
254 #define GEV_EVENT_ERROR_001 (0x8001)
261 #define GEV_LINKCONFIG_SINGLELINK (0x00)
262 #define GEV_LINKCONFIG_MULTIPLELINKS (0x01)
263 #define GEV_LINKCONFIG_STATICLAG (0x02)
264 #define GEV_LINKCONFIG_DYNAMICLAG (0x03)
267 void proto_register_gvcp(void);
268 void proto_reg_handoff_gvcp(void);
270 /* Define the gvcp proto */
271 static int proto_gvcp
;
272 static int global_gvcp_port
= 3956;
274 static int hf_gvcp_custom_register_addr
;
275 static int hf_gvcp_custom_memory_addr
;
278 \brief IDs used for bootstrap dissection
281 static int hf_gvcp_message_key_code
;
282 static int hf_gvcp_flag
;
283 static int hf_gvcp_acknowledge_required_flag
;
284 static int hf_gvcp_allow_broadcast_acknowledge_flag
;
285 static int hf_gvcp_command
;
286 static int hf_gvcp_length
;
287 static int hf_gvcp_request_id
;
288 static int hf_gvcp_status
;
289 static int hf_gvcp_acknowledge
;
290 static int hf_gvcp_spec_version_major
;
291 static int hf_gvcp_spec_version_minor
;
292 static int hf_gvcp_devicemodediscovery
;
293 static int hf_gvcp_device_mac_address
;
294 static int hf_gvcp_ip_config_persistent_ip
;
295 static int hf_gvcp_ip_config_dhcp
;
296 static int hf_gvcp_ip_config_lla
;
297 static int hf_gvcp_current_IP
;
298 static int hf_gvcp_current_subnet_mask
;
299 static int hf_gvcp_current_default_gateway
;
300 static int hf_gvcp_manufacturer_name
;
301 static int hf_gvcp_model_name
;
302 static int hf_gvcp_device_version
;
303 static int hf_gvcp_manufacturer_specific_info
;
304 static int hf_gvcp_serial_number
;
305 static int hf_gvcp_user_defined_name
;
306 static int hf_gvcp_first_xml_device_description_file
;
307 static int hf_gvcp_second_xml_device_description_file
;
308 static int hf_gvcp_readregcmd_bootstrap_register
;
309 static int hf_gvcp_writeregcmd_bootstrap_register
;
310 static int hf_gvcp_writeregcmd_data
;
311 static int hf_gvcp_writeregcmd_data_index
;
312 static int hf_gvcp_readmemcmd_address
;
313 static int hf_gvcp_readmemcmd_bootstrap_register
;
314 static int hf_gvcp_readmemcmd_count
;
315 static int hf_gvcp_writememcmd_data
;
316 static int hf_gvcp_writememcmd_data_index
;
317 static int hf_gvcp_forceip_mac_address
;
318 static int hf_gvcp_forceip_static_IP
;
319 static int hf_gvcp_forceip_static_subnet_mask
;
320 static int hf_gvcp_forceip_static_default_gateway
;
321 static int hf_gvcp_resendcmd_stream_channel_index
;
322 static int hf_gvcp_resendcmd_block_id
;
323 static int hf_gvcp_resendcmd_first_packet_id
;
324 static int hf_gvcp_resendcmd_last_packet_id
;
325 static int hf_gvcp_eventcmd_id
;
326 static int hf_gvcp_eventcmd_error_id
;
327 static int hf_gvcp_eventcmd_extid_length
;
328 static int hf_gvcp_eventcmd_device_specific_id
;
329 static int hf_gvcp_eventcmd_stream_channel_index
;
330 static int hf_gvcp_eventcmd_block_id
;
331 static int hf_gvcp_eventcmd_timestamp
;
332 static int hf_gvcp_eventcmd_data
;
333 static int hf_gvcp_actioncmd_device_key
;
334 static int hf_gvcp_actioncmd_group_key
;
335 static int hf_gvcp_actioncmd_group_mask
;
336 static int hf_gvcp_time_to_completion
;
337 static int hf_gvcp_devicemode_endianness
;
338 static int hf_gvcp_devicemode_deviceclass
;
339 static int hf_gvcp_devicemode_characterset
;
340 static int hf_gvcp_machigh
;
341 static int hf_gvcp_maclow
;
342 static int hf_gvcp_persistent_ip
;
343 static int hf_gvcp_persistent_subnet
;
344 static int hf_gvcp_persistent_gateway
;
345 static int hf_gvcp_link_speed
;
346 static int hf_gvcp_number_message_channels
;
347 static int hf_gvcp_number_stream_channels
;
348 static int hf_gvcp_number_action_signals
;
349 static int hf_gvcp_capability_user_defined
;
350 static int hf_gvcp_capability_serial_number
;
351 static int hf_gvcp_capability_heartbeat_disable
;
352 static int hf_gvcp_capability_link_speed
;
353 static int hf_gvcp_capability_extended_status_code_v1_1
;
354 static int hf_gvcp_capability_ccp_application_portip
;
355 static int hf_gvcp_capability_manifest_table
;
356 static int hf_gvcp_capability_test_data
;
357 static int hf_gvcp_capability_discovery_ACK_delay
;
358 static int hf_gvcp_capability_writable_discovery_ACK_delay
;
359 static int hf_gvcp_capability_primary_application_switchover
;
360 static int hf_gvcp_capability_unconditional_action_command
;
361 static int hf_gvcp_capability_pending
;
362 static int hf_gvcp_capability_evendata
;
363 static int hf_gvcp_capability_event
;
364 static int hf_gvcp_capability_packetresend
;
365 static int hf_gvcp_capability_writemem
;
366 static int hf_gvcp_capability_concatenation
;
367 static int hf_gvcp_heartbeat
;
368 static int hf_gvcp_high_timestamp_frequency
;
369 static int hf_gvcp_low_timestamp_frequency
;
370 static int hf_gvcp_high_timestamp_value
;
371 static int hf_gvcp_low_timestamp_value
;
372 static int hf_gvcp_discovery_ACK_delay
;
373 static int hf_gvcp_configuration_pending_ack_enable
;
374 static int hf_gvcp_configuration_heartbeat_disable
;
375 static int hf_gvcp_pending_timeout_max_execution
;
376 static int hf_gvcp_control_switchover_key_register
;
377 static int hf_gvcp_control_switchover_key
;
378 static int hf_gvcp_control_switchover_en
;
379 static int hf_gvcp_control_access
;
380 static int hf_gvcp_exclusive_access
;
381 static int hf_gvcp_primary_application_host_port
;
382 static int hf_gvcp_primary_application_ip_address
;
383 static int hf_gvcp_network_interface_index
;
384 static int hf_gvcp_host_port
;
385 static int hf_gvcp_channel_destination_ip
;
386 static int hf_gvcp_message_channel_transmission_timeout
;
387 static int hf_gvcp_message_channel_retry_count
;
388 static int hf_gvcp_message_channel_source_port
;
389 static int hf_gvcp_sc_host_port
;
390 static int hf_gvcp_sc_ni_index
;
391 static int hf_gvcp_sc_direction
;
392 static int hf_gvcp_sc_fire_test_packet
;
393 static int hf_gvcp_sc_do_not_fragment
;
394 static int hf_gvcp_sc_pixel_endianness
;
395 static int hf_gvcp_sc_packet_size
;
396 static int hf_gvcp_sc_packet_delay
;
397 static int hf_gvcp_sc_destination_ip
;
398 static int hf_gvcp_sc_source_port
;
399 static int hf_gvcp_sc_big_little_endian_supported
;
400 static int hf_gvcp_sc_ip_reassembly_supported
;
401 static int hf_gvcp_sc_unconditional_streaming_supported
;
402 static int hf_gvcp_sc_extended_chunk_data_supported
;
403 static int hf_gvcp_sc_unconditional_streaming_enabled
;
404 static int hf_gvcp_configuration_extended_status_codes_enable_v1_1
;
405 static int hf_gvcp_sc_extended_chunk_data_enabled
;
406 static int hf_gvcp_action_group_key
;
407 static int hf_gvcp_action_group_mask
;
408 static int hf_gvcp_timestamp_control_latch
;
409 static int hf_gvcp_timestamp_control_reset
;
410 static int hf_gvcp_payloaddata
;
411 static int hf_gvcp_number_interfaces
;
412 static int hf_gvcp_supportedipconfig
;
413 static int hf_gvcp_currentipconfig
;
414 static int hf_gvcp_spec_version
;
416 /* Added for 2.0 support */
417 static int hf_gvcp_devicemode_current_link_configuration_v2_0
;
418 static int hf_gvcp_ip_config_can_handle_pause_frames_v2_0
;
419 static int hf_gvcp_ip_config_can_generate_pause_frames_v2_0
;
420 static int hf_gvcp_number_of_active_links_v2_0
;
421 static int hf_gvcp_sccaps_scspx_register_supported
;
422 static int hf_gvcp_sccaps_legacy_16bit_blockid_supported_v2_0
;
423 static int hf_gvcp_mcsp_supported
;
424 static int hf_gvcp_capability_1588_v2_0
;
425 static int hf_gvcp_capability_extended_status_code_v2_0
;
426 static int hf_gvcp_capability_scheduled_action_command_v2_0
;
427 static int hf_gvcp_capability_action_command
;
428 static int hf_gvcp_configuration_1588_enable_v2_0
;
429 static int hf_gvcp_configuration_extended_status_codes_enable_v2_0
;
430 static int hf_gvcp_configuration_unconditional_action_command_enable_v2_0
;
431 static int hf_gvcp_gvsp_configuration_64bit_blockid_enable_v2_0
;
432 static int hf_gvcp_link_dlag_v2_0
;
433 static int hf_gvcp_link_slag_v2_0
;
434 static int hf_gvcp_link_ml_v2_0
;
435 static int hf_gvcp_link_sl_v2_0
;
436 static int hf_gvcp_ieee1588_clock_status_v2_0
;
437 static int hf_gvcp_scheduled_action_command_queue_size_v2_0
;
438 static int hf_gvcp_sc_multizone_supported_v2_0
;
439 static int hf_gvcp_sc_packet_resend_destination_option_supported_v2_0
;
440 static int hf_gvcp_sc_packet_resend_all_in_transmission_supported_v2_0
;
441 static int hf_gvcp_sc_packet_resend_destination_option_enabled_v2_0
;
442 static int hf_gvcp_sc_packet_resend_all_in_transmission_enabled_v2_0
;
443 static int hf_gvcp_sc_additional_zones_v2_0
;
444 static int hf_gvcp_sc_zone0_direction_v2_0
;
445 static int hf_gvcp_sc_zone1_direction_v2_0
;
446 static int hf_gvcp_sc_zone2_direction_v2_0
;
447 static int hf_gvcp_sc_zone3_direction_v2_0
;
448 static int hf_gvcp_sc_zone4_direction_v2_0
;
449 static int hf_gvcp_sc_zone5_direction_v2_0
;
450 static int hf_gvcp_sc_zone6_direction_v2_0
;
451 static int hf_gvcp_sc_zone7_direction_v2_0
;
452 static int hf_gvcp_sc_zone8_direction_v2_0
;
453 static int hf_gvcp_sc_zone9_direction_v2_0
;
454 static int hf_gvcp_sc_zone10_direction_v2_0
;
455 static int hf_gvcp_sc_zone11_direction_v2_0
;
456 static int hf_gvcp_sc_zone12_direction_v2_0
;
457 static int hf_gvcp_sc_zone13_direction_v2_0
;
458 static int hf_gvcp_sc_zone14_direction_v2_0
;
459 static int hf_gvcp_sc_zone15_direction_v2_0
;
460 static int hf_gvcp_sc_zone16_direction_v2_0
;
461 static int hf_gvcp_sc_zone17_direction_v2_0
;
462 static int hf_gvcp_sc_zone18_direction_v2_0
;
463 static int hf_gvcp_sc_zone19_direction_v2_0
;
464 static int hf_gvcp_sc_zone20_direction_v2_0
;
465 static int hf_gvcp_sc_zone21_direction_v2_0
;
466 static int hf_gvcp_sc_zone22_direction_v2_0
;
467 static int hf_gvcp_sc_zone23_direction_v2_0
;
468 static int hf_gvcp_sc_zone24_direction_v2_0
;
469 static int hf_gvcp_sc_zone25_direction_v2_0
;
470 static int hf_gvcp_sc_zone26_direction_v2_0
;
471 static int hf_gvcp_sc_zone27_direction_v2_0
;
472 static int hf_gvcp_sc_zone28_direction_v2_0
;
473 static int hf_gvcp_sc_zone29_direction_v2_0
;
474 static int hf_gvcp_sc_zone30_direction_v2_0
;
475 static int hf_gvcp_sc_zone31_direction_v2_0
;
476 static int hf_gvcp_scheduledactioncommand_flag_v2_0
;
477 static int hf_gvcp_64bitid_flag_v2_0
;
478 static int hf_gvcp_resendcmd_extended_block_id_v2_0
;
479 static int hf_gvcp_resendcmd_extended_first_packet_id_v2_0
;
480 static int hf_gvcp_resendcmd_extended_last_packet_id_v2_0
;
481 static int hf_gvcp_actioncmd_time_v2_0
;
482 static int hf_gvcp_eventcmd_block_id_64bit_v2_0
;
484 /* Added for 2.1 support */
485 static int hf_gvcp_selected_ieee1588_profile_v2_1
;
486 static int hf_gvcp_capability_ieee1588_extended_capabilities_v2_1
;
487 static int hf_gvcp_ieee1588_profile_registers_present_v2_1
;
488 static int hf_gvcp_ieee1588_ptp_profile_supported_v2_1
;
489 static int hf_gvcp_ieee1588_802dot1as_profile_supported_v2_1
;
490 static int hf_gvcp_sc_multi_part_supported_v2_1
;
491 static int hf_gvcp_sc_large_leader_trailer_supported_v2_1
;
492 static int hf_gvcp_sc_multi_part_enabled_v2_1
;
493 static int hf_gvcp_sc_large_leader_trailer_enabled_v2_1
;
495 /* Added for 2.2 support */
496 static int hf_gvcp_sccaps_scmbsx_supported_v2_2
;
497 static int hf_gvcp_sccaps_scebax_supported_v2_2
;
498 static int hf_gvcp_mccfg_supported_v2_2
;
499 static int hf_gvcp_mcec_supported_v2_2
;
500 static int hf_gvcp_mcec_enabled_v2_2
;
501 static int hf_gvcp_sc_scmpcx_supported_v2_2
;
502 static int hf_gvcp_sc_gendc_supported_v2_2
;
503 static int hf_gvcp_sc_gendc_enabled_v2_2
;
504 static int hf_gvcp_sc_max_packet_count_v2_2
;
505 static int hf_gvcp_sc_max_block_size_high_v2_2
;
506 static int hf_gvcp_sc_max_block_size_low_v2_2
;
507 static int hf_gvcp_sc_extended_registers_address_v2_2
;
508 static int hf_gvcp_sc_gendc_descriptor_address_v2_2
;
509 static int hf_gvcp_sc_gendc_descriptor_size_v2_2
;
510 static int hf_gvcp_sc_gendc_flow_mapping_table_address_v2_2
;
511 static int hf_gvcp_sc_gendc_flow_mapping_table_size_v2_2
;
512 static int hf_gvcp_readregcmd_extended_bootstrap_register
;
513 static int hf_gvcp_writeregcmd_extended_bootstrap_register
;
515 /* Generated from convert_proto_tree_add_text.pl */
516 static int hf_gvcp_custom_register_value
;
517 static int hf_gvcp_custom_read_register_addr
;
518 static int hf_gvcp_readmemcmd_data_read
;
519 static int hf_gvcp_custom_read_register_value
;
520 static int hf_gvcp_manifest_table
;
521 static int hf_gvcp_reserved_bit
;
523 /*Define the tree for gvcp*/
525 static int ett_gvcp_cmd
;
526 static int ett_gvcp_flags
;
527 static int ett_gvcp_ack
;
528 static int ett_gvcp_payload_cmd
;
529 static int ett_gvcp_payload_ack
;
530 static int ett_gvcp_payload_cmd_subtree
;
531 static int ett_gvcp_payload_ack_subtree
;
532 static int ett_gvcp_bootstrap_fields
;
534 static dissector_handle_t gvcp_handle
;
535 static dissector_handle_t gvsp_handle
;
538 static const value_string devicemodenames_class
[] = {
539 { GEV_DEVICEMODE_TRANSMITTER
, "Transmitter" },
540 { GEV_DEVICEMODE_RECEIVER
, "Receiver" },
541 { GEV_DEVICEMODE_TRANSCEIVER
, "Transceiver" },
542 { GEV_DEVICEMODE_PERIPHERAL
, "Peripheral" },
546 /*Current Link Configuration*/
547 static const value_string linkconfiguration_class
[] = {
548 { GEV_LINKCONFIG_SINGLELINK
, "Single Link" },
549 { GEV_LINKCONFIG_MULTIPLELINKS
, "Multiple Links" },
550 { GEV_LINKCONFIG_STATICLAG
, "Static LAG" },
551 { GEV_LINKCONFIG_DYNAMICLAG
, "Dynamic LAG" },
555 static const value_string devicemodenames_characterset
[] = {
557 { 0x01, "UTF-8 Character Set" },
558 { 0x00, "Reserved" },
562 static const value_string commandnames
[] = {
563 { GVCP_DISCOVERY_CMD
, "DISCOVERY_CMD" },
564 { GVCP_FORCEIP_CMD
, "FORCEIP_CMD" },
565 { GVCP_PACKETRESEND_CMD
, "PACKETRESEND_CMD" },
566 { GVCP_READREG_CMD
, "READREG_CMD" },
567 { GVCP_WRITEREG_CMD
, "WRITEREG_CMD" },
568 { GVCP_READMEM_CMD
, "READMEM_CMD" },
569 { GVCP_WRITEMEM_CMD
, "WRITEMEM_CMD" },
570 { GVCP_EVENT_CMD
, "EVENT_CMD" },
571 { GVCP_EVENTDATA_CMD
, "EVENTDATA_CMD" },
572 { GVCP_ACTION_CMD
, "ACTION_CMD" },
576 static const value_string acknowledgenames
[] = {
577 { GVCP_DISCOVERY_ACK
, "DISCOVERY_ACK" },
578 { GVCP_FORCEIP_ACK
, "FORCEIP_ACK" },
579 { GVCP_PACKETRESEND_ACK
, "PACKETRESEND_ACK" },
580 { GVCP_READREG_ACK
, "READREG_ACK" },
581 { GVCP_WRITEREG_ACK
, "WRITEREG_ACK" },
582 { GVCP_READMEM_ACK
, "READMEM_ACK" },
583 { GVCP_WRITEMEM_ACK
, "WRITEMEM_ACK" },
584 { GVCP_PENDING_ACK
, "PENDING_ACK" },
585 { GVCP_EVENT_ACK
, "EVENT_ACK" },
586 { GVCP_EVENTDATA_ACK
, "EVENTDATA_ACK" },
587 { GVCP_ACTION_ACK
, "ACTION_ACK" },
591 static const value_string eventidnames
[] = {
592 { GEV_EVENT_TRIGGER
, "GEV_EVENT_TRIGGER (deprecated)" },
593 { GEV_EVENT_START_OF_EXPOSURE
, "GEV_EVENT_START_OF_EXPOSURE (deprecated)" },
594 { GEV_EVENT_END_OF_EXPOSURE
, "GEV_EVENT_END_OF_EXPOSURE (deprecated)" },
595 { GEV_EVENT_START_OF_TRANSFER
, "GEV_EVENT_START_OF_TRANSFER (deprecated)" },
596 { GEV_EVENT_END_OF_TRANSFER
, "GEV_EVENT_END_OF_TRANSFER (deprecated)" },
597 { GEV_EVENT_PRIMARY_APP_SWITCH
, "GEV_EVENT_PRIMARY_APP_SWITCH" },
598 { GEV_EVENT_EVENT_LINK_SPEED_CHANGE
, "GEV_EVENT_EVENT_LINK_SPEED_CHANGE" },
599 { GEV_EVENT_ACTION_LATE
, "GEV_EVENT_ACTION_LATE" },
600 { GEV_EVENT_ERROR_001
, "GEV_EVENT_ERROR_001" },
604 static const value_string statusnames
[] = {
605 { GEV_STATUS_SUCCESS
, "GEV_STATUS_SUCCESS" },
606 { GEV_STATUS_PACKET_RESEND
, "GEV_STATUS_PACKET_RESEND" },
607 { GEV_STATUS_NOT_IMPLEMENTED
, "GEV_STATUS_NOT_IMPLEMENTED" },
608 { GEV_STATUS_INVALID_PARAMETER
, "GEV_STATUS_INVALID_PARAMETER" },
609 { GEV_STATUS_INVALID_ADDRESS
, "GEV_STATUS_INVALID_ADDRESS" },
610 { GEV_STATUS_WRITE_PROTECT
, "GEV_STATUS_WRITE_PROTECT" },
611 { GEV_STATUS_BAD_ALIGNMENT
, "GEV_STATUS_BAD_ALIGNMENT" },
612 { GEV_STATUS_ACCESS_DENIED
, "GEV_STATUS_ACCESS_DENIED" },
613 { GEV_STATUS_BUSY
, "GEV_STATUS_BUSY" },
614 { GEV_STATUS_LOCAL_PROBLEM
, "GEV_STATUS_LOCAL_PROBLEM (deprecated)" },
615 { GEV_STATUS_MSG_MISMATCH
, "GEV_STATUS_MSG_MISMATCH (deprecated)" },
616 { GEV_STATUS_INVALID_PROTOCOL
, "GEV_STATUS_INVALID_PROTOCOL (deprecated)" },
617 { GEV_STATUS_NO_MSG
, "GEV_STATUS_NO_MSG (deprecated)" },
618 { GEV_STATUS_PACKET_UNAVAILABLE
, "GEV_STATUS_PACKET_UNAVAILABLE" },
619 { GEV_STATUS_DATA_OVERRUN
, "GEV_STATUS_DATA_OVERRUN" },
620 { GEV_STATUS_INVALID_HEADER
, "GEV_STATUS_INVALID_HEADER" },
621 { GEV_STATUS_WRONG_CONFIG
, "GEV_STATUS_WRONG_CONFIG (deprecated)" },
622 { GEV_STATUS_PACKET_NOT_YET_AVAILABLE
, "GEV_STATUS_PACKET_NOT_YET_AVAILABLE" },
623 { GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY
, "GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY" },
624 { GEV_STATUS_PACKET_REMOVED_FROM_MEMORY
, "GEV_STATUS_PACKET_REMOVED_FROM_MEMORY" },
625 { GEV_STATUS_NO_REF_TIME
, "GEV_STATUS_NO_REF_TIME" },
626 { GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE
, "GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE" },
627 { GEV_STATUS_OVERFLOW
, "GEV_STATUS_OVERFLOW" },
628 { GEV_STATUS_ACTION_LATE
, "GEV_STATUS_ACTION_LATE" },
629 { GEV_STATUS_LEADER_TRAILER_OVERFLOW
, "GEV_STATUS_LEADER_TRAILER_OVERFLOW" },
630 { GEV_STATUS_ERROR
, "GEV_STATUS_ERROR" },
634 static const value_string statusnames_short
[] = {
635 { GEV_STATUS_SUCCESS
, "" },
636 { GEV_STATUS_PACKET_RESEND
, "(Packet Resend) " },
637 { GEV_STATUS_NOT_IMPLEMENTED
, "(Not Implemented) " },
638 { GEV_STATUS_INVALID_PARAMETER
, "(Invalid Parameter) " },
639 { GEV_STATUS_INVALID_ADDRESS
, "(Invalid Address) " },
640 { GEV_STATUS_WRITE_PROTECT
, "(Write Protect) " },
641 { GEV_STATUS_BAD_ALIGNMENT
, "(Bad Alignment) " },
642 { GEV_STATUS_ACCESS_DENIED
, "(Access Denied) " },
643 { GEV_STATUS_BUSY
, "(Busy) " },
644 { GEV_STATUS_LOCAL_PROBLEM
, "(Local Problem) " },
645 { GEV_STATUS_MSG_MISMATCH
, "(Message Mismatch) " },
646 { GEV_STATUS_INVALID_PROTOCOL
, "(Invalid Protocol) " },
647 { GEV_STATUS_NO_MSG
, "(No Message) " },
648 { GEV_STATUS_PACKET_UNAVAILABLE
, "(Packet Unavailable) " },
649 { GEV_STATUS_DATA_OVERRUN
, "(Data Overrun) " },
650 { GEV_STATUS_INVALID_HEADER
, "(Invalid Header) " },
651 { GEV_STATUS_WRONG_CONFIG
, "(Wrong Configuration) " },
652 { GEV_STATUS_PACKET_NOT_YET_AVAILABLE
, "(Packet not yet available) " },
653 { GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY
, "(Packet and previous removed from memory) " },
654 { GEV_STATUS_PACKET_REMOVED_FROM_MEMORY
, "(Packet removed from memory) " },
655 { GEV_STATUS_NO_REF_TIME
, "(No reference time)" },
656 { GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE
, "(Packet temp. unavailable)" },
657 { GEV_STATUS_OVERFLOW
, "(overflow)" },
658 { GEV_STATUS_ACTION_LATE
, "(Action late)" },
659 { GEV_STATUS_LEADER_TRAILER_OVERFLOW
, "(Leader/Trailer overflow)" },
660 { GEV_STATUS_ERROR
, "(Error) " },
664 static const true_false_string directionnames
= {
669 static const true_false_string zonedirectionnames
= {
675 brief Register name to address mappings
678 static const value_string bootstrapregisternames
[] = {
679 { GVCP_VERSION
, "[Version]" },
680 { GVCP_DEVICE_MODE
, "[Device Mode]" },
681 { GVCP_DEVICE_MAC_HIGH_0
, "[Device MAC address High (Net #0)]" },
682 { GVCP_DEVICE_MAC_LOW_0
, "[Device MAC address Low (Net #0)]" },
683 { GVCP_SUPPORTED_IP_CONFIGURATION_0
, "[Supported IP Configuration (Net #0)]" },
684 { GVCP_CURIPCFG_0
, "[Current IP Configuration (Net #0)]" },
685 { GVCP_CURRENT_IP_ADDRESS_0
, "[Current IP Address (Net #0)]" },
686 { GVCP_CURRENT_SUBNET_MASK_0
, "[Current Subnet Mask (Net #0)]" },
687 { GVCP_CURRENT_DEFAULT_GATEWAY_0
, "[Current Default Gateway (Net #0)]" },
688 { GVCP_MANUFACTURER_NAME
, "[Manufacturer Name]" },
689 { GVCP_MODEL_NAME
, "[Model Name]" },
690 { GVCP_DEVICE_VERSION
, "[Device Version]" },
691 { GVCP_MANUFACTURER_INFO
, "[Manufacturer Specific Information]" },
692 { GVCP_SERIAL_NUMBER
, "[Serial Number]" },
693 { GVCP_USER_DEFINED_NAME
, "[User-defined Name]" },
694 { GVCP_FIRST_URL
, "[First Choice of URL for XML device description file]" },
695 { GVCP_SECOND_URL
, "[Second Choice of URL for XML device description file]" },
696 { GVCP_NUMBER_OF_NETWORK_INTERFACES
, "[Number of network interfaces]" },
697 { GVCP_PERSISTENT_IP_ADDRESS_0
, "[Persistent IP address (Net #0)]" },
698 { GVCP_PERSISTENT_SUBNET_MASK_0
, "[Persistent subnet mask (Net #0)]" },
699 { GVCP_PERSISTENT_DEFAULT_GATEWAY_0
, "[Persistent default gateway (Net# 0)]" },
700 { GVCP_LINK_SPEED_0
, "[Link Speed (Net #0)]" },
701 { GVCP_DEVICE_MAC_HIGH_1
, "[Device MAC address High (Net #1)]" },
702 { GVCP_DEVICE_MAC_LOW_1
, "[Device MAC address Low (Net #1)]" },
703 { GVCP_SUPPORTED_IP_CONFIGURATION_1
, "[Supported IP Configuration (Net #1)]" },
704 { GVCP_CURIPCFG_1
, "[Current IP Configuration (Net #1)]" },
705 { GVCP_CURRENT_IP_ADDRESS_1
, "[Current IP Address (Net #1)]" },
706 { GVCP_CURRENT_SUBNET_MASK_1
, "[Current Subnet Mask (Net #1)]" },
707 { GVCP_CURRENT_DEFAULT_GATEWAY_1
, "[Current Default Gateway (Net #1)]" },
708 { GVCP_PERSISTENT_IP_ADDRESS_1
, "[Persistent IP address (Net #1)]" },
709 { GVCP_PERSISTENT_SUBNET_MASK_1
, "[Persistent subnet mask (Net#1)]" },
710 { GVCP_PERSISTENT_DEFAULT_GATEWAY_1
, "[Persistent default gateway (Net #1)]" },
711 { GVCP_LINK_SPEED_1
, "[Link Speed (Net #1)]" },
712 { GVCP_DEVICE_MAC_HIGH_2
, "[Device MAC address High (Net #2)]" },
713 { GVCP_DEVICE_MAC_LOW_2
, "[Device MAC address Low (Net #2)]" },
714 { GVCP_SUPPORTED_IP_CONFIGURATION_2
, "[Supported IP Configuration (Net #2)]" },
715 { GVCP_CURIPCFG_2
, "[Current IP Configuration (Net #2)]" },
716 { GVCP_CURRENT_IP_ADDRESS_2
, "[Current IP Address (Net #2)]" },
717 { GVCP_CURRENT_SUBNET_MASK_2
, "[Current Subnet Mask (Net #2)]" },
718 { GVCP_CURRENT_DEFAULT_GATEWAY_2
, "[Current Default Gateway (Net #2)]" },
719 { GVCP_PERSISTENT_IP_ADDRESS_2
, "[Persistent IP address (Net #2)]" },
720 { GVCP_PERSISTENT_SUBNET_MASK_2
, "[Persistent subnet mask (Net #2)]" },
721 { GVCP_PERSISTENT_DEFAULT_GATEWAY_2
, "[Persistent default gateway (Net #2)]" },
722 { GVCP_LINK_SPEED_2
, "[Link Speed (Net #2)]" },
723 { GVCP_DEVICE_MAC_HIGH_3
, "[Device MAC address High (Net #3)]" },
724 { GVCP_DEVICE_MAC_LOW_3
, "[Device MAC address Low (Net #3)]" },
725 { GVCP_SUPPORTED_IP_CONFIGURATION_3
, "[Supported IP Configuration (Net #3)]" },
726 { GVCP_CURIPCFG_3
, "[Current IP Configuration (Net #3)]" },
727 { GVCP_CURRENT_IP_ADDRESS_3
, "[Current IP Address (Net #3)]" },
728 { GVCP_CURRENT_SUBNET_MASK_3
, "[Current Subnet Mask (Net #3)]" },
729 { GVCP_CURRENT_DEFAULT_GATEWAY_3
, "[Current Default Gateway (Net #3)]" },
730 { GVCP_PERSISTENT_IP_ADDRESS_3
, "[Persistent IP address (Net #3)]" },
731 { GVCP_PERSISTENT_SUBNET_MASK_3
, "[Persistent subnet mask (Net #3)]" },
732 { GVCP_PERSISTENT_DEFAULT_GATEWAY_3
, "[Persistent default gateway (Net #3)]" },
733 { GVCP_LINK_SPEED_3
, "[Link Speed (Net #3)]" },
734 { GVCP_NUMBER_OF_MESSAGE_CHANNELS
, "[Number of Message Channels]" },
735 { GVCP_NUMBER_OF_STREAM_CHANNELS
, "[Number of Stream Channels]" },
736 { GVCP_NUMBER_OF_ACTION_SIGNALS
, "[Number of Action Signals]" },
737 { GVCP_ACTION_DEVICE_KEY
, "[Action Device Key]" },
738 { GVCP_SC_CAPS
, "[Stream channels Capability]" },
739 { GVCP_MESSAGE_CHANNEL_CAPS
, "[Message channel Capability]" },
740 { GVCP_CAPABILITY
, "[GVCP Capability]" },
741 { GVCP_HEARTBEAT_TIMEOUT
, "[Heartbeat timeout]" },
742 { GVCP_TIMESTAMP_TICK_FREQUENCY_HIGH
, "[Timestamp tick frequency - High]" },
743 { GVCP_TIMESTAMP_TICK_FREQUENCY_LOW
, "[Timestamp tick frequency - Low]" },
744 { GVCP_TIMESTAMP_CONTROL
, "[Timestamp control]" },
745 { GVCP_TIMESTAMP_VALUE_HIGH
, "[Timestamp value (latched) - High]" },
746 { GVCP_TIMESTAMP_VALUE_LOW
, "[Timestamp value (latched) - Low]" },
747 { GVCP_DISCOVERY_ACK_DELAY
, "[Discovery ACK delay]" },
748 { GVCP_CONFIGURATION
, "[GVCP Configuration]" },
749 { GVCP_PENDING_TIMEOUT
, "[Pending Timeout]" },
750 { GVCP_CONTROL_SWITCHOVER_KEY
, "[Control switchover key]" },
751 { GVCP_GVSCP_CONFIGURATION
, "[GVSP Configuration]" },
752 { GVCP_PHYSICAL_LINK_CAPABILITY
, "[Physical link capability]" },
753 { GVCP_PHYSICAL_LINK_CONFIGURATION
, "[Physical link configuration]" },
754 { GVCP_IEEE_1588_STATUS
, "[IEEE1588 status]" },
755 { GVCP_SCHEDULED_ACTION_COMMAND_QUEUE_SIZE
, "[Scheduled action command queue size]" },
756 { GVCP_IEEE_1588_EXTENDED_CAPABILITY
, "[IEEE1588 extended capabilities]" },
757 { GVCP_IEEE_1588_SUPPORTED_PROFILES
, "[IEEE1588 supported profiles]" },
758 { GVCP_IEEE_1588_SELECTED_PROFILE
, "[IEEE1588 selected profile]" },
759 { GVCP_CCP
, "[CCP (Control Channel Privilege)]" },
760 { GVCP_PRIMARY_APPLICATION_PORT
, "[Primary Application Port]" },
761 { GVCP_PRIMARY_APPLICATION_IP_ADDRESS
, "[Primary Application IP address]" },
762 { GVCP_MC_DESTINATION_PORT
, "[MCP (Message Channel Port)]" },
763 { GVCP_MC_DESTINATION_ADDRESS
, "[MCDA (Message Channel Destination Address)]" },
764 { GVCP_MC_TIMEOUT
, "[MCTT (Message Channel Transmission Timeout in ms)]" },
765 { GVCP_MC_RETRY_COUNT
, "[MCRC (Message Channel Retry Count)]" },
766 { GVCP_MC_SOURCE_PORT
, "[MCSP (Message Channel Source Port)]" },
767 { GVCP_MC_CONFIGURATION
, "[MCCFG (Message Channel Configuration)]" }, /* GEV 2.2 */
768 { GVCP_SC_DESTINATION_PORT(0), "[SCP0 (Stream Channel #0 Port)]" },
769 { GVCP_SC_PACKET_SIZE(0), "[SCPS0 (Stream Channel #0 Packet Size)]" },
770 { GVCP_SC_PACKET_DELAY(0), "[SCPD0 (Stream Channel #0 Packet Delay)]" },
771 { GVCP_SC_DESTINATION_ADDRESS(0), "[SCDA0 (Stream Channel #0 Destination Address)]" },
772 { GVCP_SC_SOURCE_PORT(0), "[SCSP0 (Stream Channel #0 Source Port)]" },
773 { GVCP_SC_CAPABILITY(0), "[SCC0 (Stream Channel #0 Capability)]" },
774 { GVCP_SC_CONFIGURATION(0), "[SCCONF0 (Stream Channel #0 Configuration)]" },
775 { GVCP_SC_ZONE(0), "[SCZ0 (Stream Channel Zone #0)]" },
776 { GVCP_SC_ZONE_DIRECTION(0), "[SCZD0 (Stream Channel Zone Direction #0)]" },
777 { GVCP_SC_MAX_PACKET_COUNT(0), "[SCMPC0 (Stream Channel Max Packet Count #0)]" },
778 { GVCP_SC_MAX_BLOCK_SIZE_HIGH(0), "[SCMBSL0 (Stream Channel Max Block Size (High) #0)]" },
779 { GVCP_SC_MAX_BLOCK_SIZE_LOW(0), "[SCMBSH0 (Stream Channel Max Block Size (Low) #0)]" },
780 { GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(0), "SCEBA0 (Stream Channel Extended Bootstrap Address #0)]" },
781 { GVCP_SC_DESTINATION_PORT(1), "[SCP1 (Stream Channel #1 Port)]" },
782 { GVCP_SC_PACKET_SIZE(1), "[SCPS1 (Stream Channel #1 Packet Size)]" },
783 { GVCP_SC_PACKET_DELAY(1), "[SCPD1 (Stream Channel #1 Packet Delay)]" },
784 { GVCP_SC_DESTINATION_ADDRESS(1), "[SCDA1 (Stream Channel #1 Destination Address)]" },
785 { GVCP_SC_SOURCE_PORT(1), "[SCSP1 (Stream Channel #1 Source Port)]" },
786 { GVCP_SC_CAPABILITY(1), "[SCC1 (Stream Channel #1 Capability)]" },
787 { GVCP_SC_CONFIGURATION(1), "[SCCONF1 (Stream Channel #1 Configuration)]" },
788 { GVCP_SC_ZONE(1), "[SCZ1 (Stream Channel Zone #1)]" },
789 { GVCP_SC_ZONE_DIRECTION(1), "[SCZD1 (Stream Channel Zone Direction #1)]" },
790 { GVCP_SC_MAX_PACKET_COUNT(1), "[SCMPC1 (Stream Channel Max Packet Count #1)]" },
791 { GVCP_SC_MAX_BLOCK_SIZE_HIGH(1), "[SCMBSL1 (Stream Channel Max Block Size (High) #1)]" },
792 { GVCP_SC_MAX_BLOCK_SIZE_LOW(1), "[SCMBSH1 (Stream Channel Max Block Size (Low) #1)]" },
793 { GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(1), "SCEBA1 (Stream Channel Extended Bootstrap Address #1)]" },
794 { GVCP_SC_DESTINATION_PORT(2), "[SCP2 (Stream Channel #2 Port)]" },
795 { GVCP_SC_PACKET_SIZE(2), "[SCPS2 (Stream Channel #2 Packet Size)]" },
796 { GVCP_SC_PACKET_DELAY(2), "[SCPD2 (Stream Channel #2 Packet Delay)]" },
797 { GVCP_SC_DESTINATION_ADDRESS(2), "[SCDA2 (Stream Channel #2 Destination Address)]" },
798 { GVCP_SC_SOURCE_PORT(2), "[SCSP2 (Stream Channel #2 Source Port)]" },
799 { GVCP_SC_CAPABILITY(2), "[SCC2 (Stream Channel #2 Capability)]" },
800 { GVCP_SC_CONFIGURATION(2), "[SCCONF2 (Stream Channel #2 Configuration)]" },
801 { GVCP_SC_ZONE(2), "[SCZ2 (Stream Channel Zone #2)]" },
802 { GVCP_SC_ZONE_DIRECTION(2), "[SCZD2 (Stream Channel Zone Direction #2)]" },
803 { GVCP_SC_MAX_PACKET_COUNT(2), "[SCMPC2 (Stream Channel Max Packet Count #2)]" },
804 { GVCP_SC_MAX_BLOCK_SIZE_HIGH(2), "[SCMBSL2 (Stream Channel Max Block Size (High) #2)]" },
805 { GVCP_SC_MAX_BLOCK_SIZE_LOW(2), "[SCMBSH2 (Stream Channel Max Block Size (Low) #2)]" },
806 { GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(2), "SCEBA2 (Stream Channel Extended Bootstrap Address #2)]" },
807 { GVCP_SC_DESTINATION_PORT(3), "[SCP3 (Stream Channel #3 Port)]" },
808 { GVCP_SC_PACKET_SIZE(3), "[SCPS3 (Stream Channel #3 Packet Size)]" },
809 { GVCP_SC_PACKET_DELAY(3), "[SCPD3 (Stream Channel #3 Packet Delay)]" },
810 { GVCP_SC_DESTINATION_ADDRESS(3), "[SCDA3 (Stream Channel #3 Destination Address)]" },
811 { GVCP_SC_SOURCE_PORT(3), "[SCSP3 (Stream Channel #3 Source Port)]" },
812 { GVCP_SC_CAPABILITY(3), "[SCC3 (Stream Channel #3 Capability)]" },
813 { GVCP_SC_CONFIGURATION(3), "[SCCONF3 (Stream Channel #3 Configuration)]" },
814 { GVCP_SC_ZONE(3), "[SCZ3 (Stream Channel Zone #3)]" },
815 { GVCP_SC_ZONE_DIRECTION(3), "[SCZD3 (Stream Channel Zone Direction #3)]" },
816 { GVCP_SC_MAX_PACKET_COUNT(3), "[SCMPC3 (Stream Channel Max Packet Count #3)]" },
817 { GVCP_SC_MAX_BLOCK_SIZE_HIGH(3), "[SCMBSL3 (Stream Channel Max Block Size (High) #3)]" },
818 { GVCP_SC_MAX_BLOCK_SIZE_LOW(3), "[SCMBSH3 (Stream Channel Max Block Size (Low) #3)]" },
819 { GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(3), "SCEBA3 (Stream Channel Extended Bootstrap Address #3)]" },
820 { GVCP_MANIFEST_TABLE
, "[Manifest Table]" },
821 { GVCP_ACTION_GROUP_KEY(0), "[Action Group Key #0]" },
822 { GVCP_ACTION_GROUP_MASK(0), "[Action Group Mask #0]" },
823 { GVCP_ACTION_GROUP_KEY(1), "[Action Group Key #1]" },
824 { GVCP_ACTION_GROUP_MASK(1), "[Action Group Mask #1]" },
825 { GVCP_ACTION_GROUP_KEY(2), "[Action Group Key #2]" },
826 { GVCP_ACTION_GROUP_MASK(2), "[Action Group Mask #2]" },
827 { GVCP_ACTION_GROUP_KEY(3), "[Action Group Key #3]" },
828 { GVCP_ACTION_GROUP_MASK(3), "[Action Group Mask #3]" },
829 { GVCP_ACTION_GROUP_KEY(4), "[Action Group Key #4]" },
830 { GVCP_ACTION_GROUP_MASK(4), "[Action Group Mask #4]" },
831 { GVCP_ACTION_GROUP_KEY(5), "[Action Group Key #5]" },
832 { GVCP_ACTION_GROUP_MASK(5), "[Action Group Mask #5]" },
833 { GVCP_ACTION_GROUP_KEY(6), "[Action Group Key #6]" },
834 { GVCP_ACTION_GROUP_MASK(6), "[Action Group Mask #6]" },
835 { GVCP_ACTION_GROUP_KEY(7), "[Action Group Key #7]" },
836 { GVCP_ACTION_GROUP_MASK(7), "[Action Group Mask #7]" },
837 { GVCP_ACTION_GROUP_KEY(8), "[Action Group Key #8]" },
838 { GVCP_ACTION_GROUP_MASK(8), "[Action Group Mask #8]" },
839 { GVCP_ACTION_GROUP_KEY(9), "[Action Group Key #9]" },
840 { GVCP_ACTION_GROUP_MASK(9), "[Action Group Mask #9]" },
846 brief Extended Register name to address mappings
850 static const value_string extendedbootstrapregisternames
[] = {
851 { GVCP_SC_GENDC_DESCRIPTOR_ADDRESS
, "[SCGDAx (GenDC Descriptor Address)]" },
852 { GVCP_SC_GENDC_DESCRIPTOR_SIZE
, "[SCGDSx (GenDC Descriptor Size)]" },
853 { GVCP_SC_GENDC_FLOW_MAPPING_TABLE_ADDRESS
, "[SCGFTAx (GenDC Flow Mapping Table Address)]" },
854 { GVCP_SC_GENDC_FLOW_MAPPING_TABLE_SIZE
, "[SCGFTSx (GenDC Flow Mapping Table Size)]" },
860 \brief Check is the current register access is into one of the extended stream channel registers
863 static bool is_extended_bootstrap_address(gvcp_conv_info_t
*gvcp_info
, uint32_t addr
, uint32_t* extended_bootstrap_address_offset
)
865 int stream_channel_count
= 0;
866 for (stream_channel_count
= 0; stream_channel_count
< GVCP_MAX_STREAM_CHANNEL_COUNT
; stream_channel_count
++)
868 if ((gvcp_info
->extended_bootstrap_address
[stream_channel_count
] != 0) &&
869 (addr
>= gvcp_info
->extended_bootstrap_address
[stream_channel_count
]) &&
870 (addr
<= (gvcp_info
->extended_bootstrap_address
[stream_channel_count
] + GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS_LAST
)))
872 if (extended_bootstrap_address_offset
)
874 *extended_bootstrap_address_offset
= gvcp_info
->extended_bootstrap_address
[stream_channel_count
];
884 \brief Returns a register name based on its address
887 static const char* get_register_name_from_address(uint32_t addr
, wmem_allocator_t
*scope
, gvcp_conv_info_t
*gvcp_info
, bool* is_custom_register
)
889 const char* address_string
= NULL
;
891 if (is_custom_register
!= NULL
)
893 *is_custom_register
= false;
896 address_string
= try_val_to_str(addr
, bootstrapregisternames
);
899 uint32_t extended_bootstrap_address_offset
= 0;
900 if (is_extended_bootstrap_address(gvcp_info
, addr
, &extended_bootstrap_address_offset
))
902 address_string
= try_val_to_str(addr
- extended_bootstrap_address_offset
, extendedbootstrapregisternames
);
907 address_string
= wmem_strdup_printf(scope
, "[Addr:0x%08X]", addr
);
908 if (is_custom_register
!= NULL
)
910 *is_custom_register
= true;
915 return address_string
;
920 \brief Attempts to dissect a bootstrap register
923 static int dissect_register(uint32_t addr
, proto_tree
*branch
, tvbuff_t
*tvb
, int offset
, int length
)
928 proto_tree_add_item(branch
, hf_gvcp_spec_version_major
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
929 proto_tree_add_item(branch
, hf_gvcp_spec_version_minor
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
932 case GVCP_DEVICE_MODE
:
933 proto_tree_add_item(branch
, hf_gvcp_devicemode_endianness
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
934 proto_tree_add_item(branch
, hf_gvcp_devicemode_deviceclass
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
935 proto_tree_add_item(branch
, hf_gvcp_devicemode_current_link_configuration_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
936 proto_tree_add_item(branch
, hf_gvcp_devicemode_characterset
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
939 case GVCP_DEVICE_MAC_HIGH_0
:
940 case GVCP_DEVICE_MAC_HIGH_1
:
941 case GVCP_DEVICE_MAC_HIGH_2
:
942 case GVCP_DEVICE_MAC_HIGH_3
:
943 proto_tree_add_item(branch
, hf_gvcp_machigh
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
946 case GVCP_DEVICE_MAC_LOW_0
:
947 case GVCP_DEVICE_MAC_LOW_1
:
948 case GVCP_DEVICE_MAC_LOW_2
:
949 case GVCP_DEVICE_MAC_LOW_3
:
950 proto_tree_add_item(branch
, hf_gvcp_maclow
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
953 case GVCP_SUPPORTED_IP_CONFIGURATION_0
:
954 case GVCP_SUPPORTED_IP_CONFIGURATION_1
:
955 case GVCP_SUPPORTED_IP_CONFIGURATION_2
:
956 case GVCP_SUPPORTED_IP_CONFIGURATION_3
:
957 proto_tree_add_item(branch
, hf_gvcp_ip_config_can_handle_pause_frames_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
958 proto_tree_add_item(branch
, hf_gvcp_ip_config_can_generate_pause_frames_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
959 proto_tree_add_item(branch
, hf_gvcp_ip_config_lla
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
960 proto_tree_add_item(branch
, hf_gvcp_ip_config_dhcp
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
961 proto_tree_add_item(branch
, hf_gvcp_ip_config_persistent_ip
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
964 case GVCP_CURIPCFG_0
:
965 case GVCP_CURIPCFG_1
:
966 case GVCP_CURIPCFG_2
:
967 case GVCP_CURIPCFG_3
:
968 proto_tree_add_item(branch
, hf_gvcp_ip_config_can_handle_pause_frames_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
969 proto_tree_add_item(branch
, hf_gvcp_ip_config_can_generate_pause_frames_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
970 proto_tree_add_item(branch
, hf_gvcp_ip_config_lla
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
971 proto_tree_add_item(branch
, hf_gvcp_ip_config_dhcp
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
972 proto_tree_add_item(branch
, hf_gvcp_ip_config_persistent_ip
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
975 case GVCP_CURRENT_IP_ADDRESS_0
:
976 case GVCP_CURRENT_IP_ADDRESS_1
:
977 case GVCP_CURRENT_IP_ADDRESS_2
:
978 case GVCP_CURRENT_IP_ADDRESS_3
:
979 proto_tree_add_item(branch
, hf_gvcp_current_IP
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
982 case GVCP_CURRENT_SUBNET_MASK_0
:
983 case GVCP_CURRENT_SUBNET_MASK_1
:
984 case GVCP_CURRENT_SUBNET_MASK_2
:
985 case GVCP_CURRENT_SUBNET_MASK_3
:
986 proto_tree_add_item(branch
, hf_gvcp_current_subnet_mask
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
989 case GVCP_CURRENT_DEFAULT_GATEWAY_0
:
990 case GVCP_CURRENT_DEFAULT_GATEWAY_1
:
991 case GVCP_CURRENT_DEFAULT_GATEWAY_2
:
992 case GVCP_CURRENT_DEFAULT_GATEWAY_3
:
993 proto_tree_add_item(branch
, hf_gvcp_current_default_gateway
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
996 case GVCP_MANUFACTURER_NAME
:
997 proto_tree_add_item(branch
, hf_gvcp_reserved_bit
, tvb
, 0, length
, ENC_NA
); /*? */
1000 case GVCP_MODEL_NAME
:
1001 proto_tree_add_item(branch
, hf_gvcp_reserved_bit
, tvb
, 0, length
, ENC_NA
); /*? */
1004 case GVCP_DEVICE_VERSION
:
1005 proto_tree_add_item(branch
, hf_gvcp_reserved_bit
, tvb
, 0, length
, ENC_NA
); /*? */
1008 case GVCP_MANUFACTURER_INFO
:
1009 proto_tree_add_item(branch
, hf_gvcp_reserved_bit
, tvb
, 0, length
, ENC_NA
); /*? */
1012 case GVCP_SERIAL_NUMBER
:
1013 proto_tree_add_item(branch
, hf_gvcp_reserved_bit
, tvb
, 0, length
, ENC_NA
); /*? */
1016 case GVCP_USER_DEFINED_NAME
:
1017 proto_tree_add_item(branch
, hf_gvcp_user_defined_name
, tvb
, offset
, 4, ENC_ASCII
); /*? */
1020 case GVCP_FIRST_URL
:
1021 proto_tree_add_item(branch
, hf_gvcp_reserved_bit
, tvb
, 0, length
, ENC_NA
); /*? */
1024 case GVCP_SECOND_URL
:
1025 proto_tree_add_item(branch
, hf_gvcp_reserved_bit
, tvb
, 0, length
, ENC_NA
); /*? */
1028 case GVCP_NUMBER_OF_NETWORK_INTERFACES
:
1029 proto_tree_add_item(branch
, hf_gvcp_number_interfaces
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1032 case GVCP_PERSISTENT_IP_ADDRESS_0
:
1033 case GVCP_PERSISTENT_IP_ADDRESS_1
:
1034 case GVCP_PERSISTENT_IP_ADDRESS_2
:
1035 case GVCP_PERSISTENT_IP_ADDRESS_3
:
1036 proto_tree_add_item(branch
, hf_gvcp_persistent_ip
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1039 case GVCP_PERSISTENT_SUBNET_MASK_0
:
1040 case GVCP_PERSISTENT_SUBNET_MASK_1
:
1041 case GVCP_PERSISTENT_SUBNET_MASK_2
:
1042 case GVCP_PERSISTENT_SUBNET_MASK_3
:
1043 proto_tree_add_item(branch
, hf_gvcp_persistent_subnet
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1046 case GVCP_PERSISTENT_DEFAULT_GATEWAY_0
:
1047 case GVCP_PERSISTENT_DEFAULT_GATEWAY_1
:
1048 case GVCP_PERSISTENT_DEFAULT_GATEWAY_2
:
1049 case GVCP_PERSISTENT_DEFAULT_GATEWAY_3
:
1050 proto_tree_add_item(branch
, hf_gvcp_persistent_gateway
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1053 case GVCP_LINK_SPEED_0
:
1054 case GVCP_LINK_SPEED_1
:
1055 case GVCP_LINK_SPEED_2
:
1056 case GVCP_LINK_SPEED_3
:
1057 proto_tree_add_item(branch
, hf_gvcp_link_speed
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1060 case GVCP_NUMBER_OF_MESSAGE_CHANNELS
:
1061 proto_tree_add_item(branch
, hf_gvcp_number_message_channels
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1064 case GVCP_NUMBER_OF_STREAM_CHANNELS
:
1065 proto_tree_add_item(branch
, hf_gvcp_number_stream_channels
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1068 case GVCP_NUMBER_OF_ACTION_SIGNALS
:
1069 proto_tree_add_item(branch
, hf_gvcp_number_action_signals
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1072 case GVCP_ACTION_DEVICE_KEY
:
1073 proto_tree_add_item(branch
, hf_gvcp_writeregcmd_data
, tvb
, offset
, 4, ENC_BIG_ENDIAN
); /*? */
1076 case GVCP_NUMBER_OF_ACTIVE_LINKS
:
1077 proto_tree_add_item(branch
, hf_gvcp_number_of_active_links_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1081 proto_tree_add_item(branch
, hf_gvcp_sccaps_scspx_register_supported
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1082 proto_tree_add_item(branch
, hf_gvcp_sccaps_legacy_16bit_blockid_supported_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1083 proto_tree_add_item(branch
, hf_gvcp_sccaps_scmbsx_supported_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1084 proto_tree_add_item(branch
, hf_gvcp_sccaps_scebax_supported_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1087 case GVCP_MESSAGE_CHANNEL_CAPS
:
1088 proto_tree_add_item(branch
, hf_gvcp_mcsp_supported
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1089 proto_tree_add_item(branch
, hf_gvcp_mccfg_supported_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1090 proto_tree_add_item(branch
, hf_gvcp_mcec_supported_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1093 case GVCP_CAPABILITY
:
1094 proto_tree_add_item(branch
, hf_gvcp_capability_user_defined
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1095 proto_tree_add_item(branch
, hf_gvcp_capability_serial_number
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1096 proto_tree_add_item(branch
, hf_gvcp_capability_heartbeat_disable
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1097 proto_tree_add_item(branch
, hf_gvcp_capability_link_speed
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1098 proto_tree_add_item(branch
, hf_gvcp_capability_ccp_application_portip
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1099 proto_tree_add_item(branch
, hf_gvcp_capability_manifest_table
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1100 proto_tree_add_item(branch
, hf_gvcp_capability_test_data
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1101 proto_tree_add_item(branch
, hf_gvcp_capability_discovery_ACK_delay
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1102 proto_tree_add_item(branch
, hf_gvcp_capability_writable_discovery_ACK_delay
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1103 proto_tree_add_item(branch
, hf_gvcp_capability_extended_status_code_v1_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1104 proto_tree_add_item(branch
, hf_gvcp_capability_primary_application_switchover
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1105 proto_tree_add_item(branch
, hf_gvcp_capability_unconditional_action_command
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1106 proto_tree_add_item(branch
, hf_gvcp_capability_1588_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1107 proto_tree_add_item(branch
, hf_gvcp_capability_extended_status_code_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1108 proto_tree_add_item(branch
, hf_gvcp_capability_scheduled_action_command_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1109 proto_tree_add_item(branch
, hf_gvcp_capability_ieee1588_extended_capabilities_v2_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1110 proto_tree_add_item(branch
, hf_gvcp_capability_action_command
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1111 proto_tree_add_item(branch
, hf_gvcp_capability_pending
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1112 proto_tree_add_item(branch
, hf_gvcp_capability_evendata
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1113 proto_tree_add_item(branch
, hf_gvcp_capability_event
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1114 proto_tree_add_item(branch
, hf_gvcp_capability_packetresend
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1115 proto_tree_add_item(branch
, hf_gvcp_capability_writemem
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1116 proto_tree_add_item(branch
, hf_gvcp_capability_concatenation
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1119 case GVCP_HEARTBEAT_TIMEOUT
:
1120 proto_tree_add_item(branch
, hf_gvcp_heartbeat
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1123 case GVCP_TIMESTAMP_TICK_FREQUENCY_HIGH
:
1124 proto_tree_add_item(branch
, hf_gvcp_high_timestamp_frequency
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1127 case GVCP_TIMESTAMP_TICK_FREQUENCY_LOW
:
1128 proto_tree_add_item(branch
, hf_gvcp_low_timestamp_frequency
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1131 case GVCP_TIMESTAMP_CONTROL
:
1132 proto_tree_add_item(branch
, hf_gvcp_timestamp_control_latch
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1133 proto_tree_add_item(branch
, hf_gvcp_timestamp_control_reset
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1136 case GVCP_TIMESTAMP_VALUE_HIGH
:
1137 proto_tree_add_item(branch
, hf_gvcp_high_timestamp_value
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1140 case GVCP_TIMESTAMP_VALUE_LOW
:
1141 proto_tree_add_item(branch
, hf_gvcp_low_timestamp_value
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1144 case GVCP_DISCOVERY_ACK_DELAY
:
1145 proto_tree_add_item(branch
, hf_gvcp_discovery_ACK_delay
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1148 case GVCP_CONFIGURATION
:
1149 proto_tree_add_item(branch
, hf_gvcp_configuration_1588_enable_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1150 proto_tree_add_item(branch
, hf_gvcp_configuration_extended_status_codes_enable_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1151 proto_tree_add_item(branch
, hf_gvcp_configuration_unconditional_action_command_enable_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1152 proto_tree_add_item(branch
, hf_gvcp_configuration_extended_status_codes_enable_v1_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1153 proto_tree_add_item(branch
, hf_gvcp_configuration_pending_ack_enable
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1154 proto_tree_add_item(branch
, hf_gvcp_configuration_heartbeat_disable
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1157 case GVCP_PENDING_TIMEOUT
:
1158 proto_tree_add_item(branch
, hf_gvcp_pending_timeout_max_execution
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1161 case GVCP_CONTROL_SWITCHOVER_KEY
:
1162 proto_tree_add_item(branch
, hf_gvcp_control_switchover_key_register
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1165 case GVCP_GVSCP_CONFIGURATION
:
1166 proto_tree_add_item(branch
, hf_gvcp_gvsp_configuration_64bit_blockid_enable_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1169 case GVCP_PHYSICAL_LINK_CAPABILITY
:
1170 proto_tree_add_item(branch
, hf_gvcp_link_dlag_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1171 proto_tree_add_item(branch
, hf_gvcp_link_slag_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1172 proto_tree_add_item(branch
, hf_gvcp_link_ml_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1173 proto_tree_add_item(branch
, hf_gvcp_link_sl_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1176 case GVCP_PHYSICAL_LINK_CONFIGURATION
:
1177 proto_tree_add_item(branch
, hf_gvcp_link_dlag_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1178 proto_tree_add_item(branch
, hf_gvcp_link_slag_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1179 proto_tree_add_item(branch
, hf_gvcp_link_ml_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1180 proto_tree_add_item(branch
, hf_gvcp_link_sl_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1183 case GVCP_IEEE_1588_STATUS
:
1184 proto_tree_add_item(branch
, hf_gvcp_ieee1588_clock_status_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1187 case GVCP_SCHEDULED_ACTION_COMMAND_QUEUE_SIZE
:
1188 proto_tree_add_item(branch
, hf_gvcp_scheduled_action_command_queue_size_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1191 case GVCP_IEEE_1588_EXTENDED_CAPABILITY
:
1192 proto_tree_add_item(branch
, hf_gvcp_ieee1588_profile_registers_present_v2_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1195 case GVCP_IEEE_1588_SUPPORTED_PROFILES
:
1196 proto_tree_add_item(branch
, hf_gvcp_ieee1588_ptp_profile_supported_v2_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1197 proto_tree_add_item(branch
, hf_gvcp_ieee1588_802dot1as_profile_supported_v2_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1200 case GVCP_IEEE_1588_SELECTED_PROFILE
:
1201 proto_tree_add_item(branch
, hf_gvcp_selected_ieee1588_profile_v2_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1205 proto_tree_add_item(branch
, hf_gvcp_control_switchover_key
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1206 proto_tree_add_item(branch
, hf_gvcp_control_switchover_en
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1207 proto_tree_add_item(branch
, hf_gvcp_control_access
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1208 proto_tree_add_item(branch
, hf_gvcp_exclusive_access
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1211 case GVCP_PRIMARY_APPLICATION_PORT
:
1212 proto_tree_add_item(branch
, hf_gvcp_primary_application_host_port
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1215 case GVCP_PRIMARY_APPLICATION_IP_ADDRESS
:
1216 proto_tree_add_item(branch
, hf_gvcp_primary_application_ip_address
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1219 case GVCP_MC_DESTINATION_PORT
:
1220 proto_tree_add_item(branch
, hf_gvcp_network_interface_index
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1221 proto_tree_add_item(branch
, hf_gvcp_host_port
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1224 case GVCP_MC_DESTINATION_ADDRESS
:
1225 proto_tree_add_item(branch
, hf_gvcp_channel_destination_ip
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1228 case GVCP_MC_TIMEOUT
:
1229 proto_tree_add_item(branch
, hf_gvcp_message_channel_transmission_timeout
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1232 case GVCP_MC_RETRY_COUNT
:
1233 proto_tree_add_item(branch
, hf_gvcp_message_channel_retry_count
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1236 case GVCP_MC_SOURCE_PORT
:
1237 proto_tree_add_item(branch
, hf_gvcp_message_channel_source_port
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1240 case GVCP_MC_CONFIGURATION
:
1241 proto_tree_add_item(branch
, hf_gvcp_mcec_enabled_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1244 case GVCP_SC_DESTINATION_PORT(0):
1245 case GVCP_SC_DESTINATION_PORT(1):
1246 case GVCP_SC_DESTINATION_PORT(2):
1247 case GVCP_SC_DESTINATION_PORT(3):
1248 proto_tree_add_item(branch
, hf_gvcp_sc_direction
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1249 proto_tree_add_item(branch
, hf_gvcp_sc_ni_index
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1250 proto_tree_add_item(branch
, hf_gvcp_sc_host_port
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1253 case GVCP_SC_PACKET_SIZE(0):
1254 case GVCP_SC_PACKET_SIZE(1):
1255 case GVCP_SC_PACKET_SIZE(2):
1256 case GVCP_SC_PACKET_SIZE(3):
1257 proto_tree_add_item(branch
, hf_gvcp_sc_fire_test_packet
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1258 proto_tree_add_item(branch
, hf_gvcp_sc_do_not_fragment
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1259 proto_tree_add_item(branch
, hf_gvcp_sc_pixel_endianness
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1260 proto_tree_add_item(branch
, hf_gvcp_sc_packet_size
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1263 case GVCP_SC_PACKET_DELAY(0):
1264 case GVCP_SC_PACKET_DELAY(1):
1265 case GVCP_SC_PACKET_DELAY(2):
1266 case GVCP_SC_PACKET_DELAY(3):
1267 proto_tree_add_item(branch
, hf_gvcp_sc_packet_delay
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1270 case GVCP_SC_DESTINATION_ADDRESS(0):
1271 case GVCP_SC_DESTINATION_ADDRESS(1):
1272 case GVCP_SC_DESTINATION_ADDRESS(2):
1273 case GVCP_SC_DESTINATION_ADDRESS(3):
1276 value
= tvb_get_letohl(tvb
, offset
);
1277 proto_tree_add_ipv4(branch
, hf_gvcp_sc_destination_ip
, tvb
, offset
, 4, value
);
1281 case GVCP_SC_SOURCE_PORT(0):
1282 case GVCP_SC_SOURCE_PORT(1):
1283 case GVCP_SC_SOURCE_PORT(2):
1284 case GVCP_SC_SOURCE_PORT(3):
1285 proto_tree_add_item(branch
, hf_gvcp_sc_source_port
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1288 case GVCP_SC_CAPABILITY(0):
1289 case GVCP_SC_CAPABILITY(1):
1290 case GVCP_SC_CAPABILITY(2):
1291 case GVCP_SC_CAPABILITY(3):
1292 proto_tree_add_item(branch
, hf_gvcp_sc_big_little_endian_supported
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1293 proto_tree_add_item(branch
, hf_gvcp_sc_ip_reassembly_supported
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1294 proto_tree_add_item(branch
, hf_gvcp_sc_scmpcx_supported_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1295 proto_tree_add_item(branch
, hf_gvcp_sc_gendc_supported_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1296 proto_tree_add_item(branch
, hf_gvcp_sc_multi_part_supported_v2_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1297 proto_tree_add_item(branch
, hf_gvcp_sc_large_leader_trailer_supported_v2_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1298 proto_tree_add_item(branch
, hf_gvcp_sc_multizone_supported_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1299 proto_tree_add_item(branch
, hf_gvcp_sc_packet_resend_destination_option_supported_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1300 proto_tree_add_item(branch
, hf_gvcp_sc_packet_resend_all_in_transmission_supported_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1301 proto_tree_add_item(branch
, hf_gvcp_sc_unconditional_streaming_supported
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1302 proto_tree_add_item(branch
, hf_gvcp_sc_extended_chunk_data_supported
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1305 case GVCP_SC_CONFIGURATION(0):
1306 case GVCP_SC_CONFIGURATION(1):
1307 case GVCP_SC_CONFIGURATION(2):
1308 case GVCP_SC_CONFIGURATION(3):
1309 proto_tree_add_item(branch
, hf_gvcp_sc_gendc_enabled_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1310 proto_tree_add_item(branch
, hf_gvcp_sc_multi_part_enabled_v2_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1311 proto_tree_add_item(branch
, hf_gvcp_sc_large_leader_trailer_enabled_v2_1
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1312 proto_tree_add_item(branch
, hf_gvcp_sc_packet_resend_destination_option_enabled_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1313 proto_tree_add_item(branch
, hf_gvcp_sc_packet_resend_all_in_transmission_enabled_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1314 proto_tree_add_item(branch
, hf_gvcp_sc_unconditional_streaming_enabled
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1315 proto_tree_add_item(branch
, hf_gvcp_sc_extended_chunk_data_enabled
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1318 case GVCP_SC_ZONE(0):
1319 case GVCP_SC_ZONE(1):
1320 case GVCP_SC_ZONE(2):
1321 case GVCP_SC_ZONE(3):
1322 proto_tree_add_item(branch
, hf_gvcp_sc_additional_zones_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1325 case GVCP_SC_ZONE_DIRECTION(0):
1326 case GVCP_SC_ZONE_DIRECTION(1):
1327 case GVCP_SC_ZONE_DIRECTION(2):
1328 case GVCP_SC_ZONE_DIRECTION(3):
1329 proto_tree_add_item(branch
, hf_gvcp_sc_zone0_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1330 proto_tree_add_item(branch
, hf_gvcp_sc_zone1_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1331 proto_tree_add_item(branch
, hf_gvcp_sc_zone2_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1332 proto_tree_add_item(branch
, hf_gvcp_sc_zone3_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1333 proto_tree_add_item(branch
, hf_gvcp_sc_zone4_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1334 proto_tree_add_item(branch
, hf_gvcp_sc_zone5_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1335 proto_tree_add_item(branch
, hf_gvcp_sc_zone6_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1336 proto_tree_add_item(branch
, hf_gvcp_sc_zone7_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1337 proto_tree_add_item(branch
, hf_gvcp_sc_zone8_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1338 proto_tree_add_item(branch
, hf_gvcp_sc_zone9_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1339 proto_tree_add_item(branch
, hf_gvcp_sc_zone10_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1340 proto_tree_add_item(branch
, hf_gvcp_sc_zone11_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1341 proto_tree_add_item(branch
, hf_gvcp_sc_zone12_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1342 proto_tree_add_item(branch
, hf_gvcp_sc_zone13_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1343 proto_tree_add_item(branch
, hf_gvcp_sc_zone14_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1344 proto_tree_add_item(branch
, hf_gvcp_sc_zone15_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1345 proto_tree_add_item(branch
, hf_gvcp_sc_zone16_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1346 proto_tree_add_item(branch
, hf_gvcp_sc_zone17_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1347 proto_tree_add_item(branch
, hf_gvcp_sc_zone18_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1348 proto_tree_add_item(branch
, hf_gvcp_sc_zone19_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1349 proto_tree_add_item(branch
, hf_gvcp_sc_zone20_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1350 proto_tree_add_item(branch
, hf_gvcp_sc_zone21_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1351 proto_tree_add_item(branch
, hf_gvcp_sc_zone22_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1352 proto_tree_add_item(branch
, hf_gvcp_sc_zone23_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1353 proto_tree_add_item(branch
, hf_gvcp_sc_zone24_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1354 proto_tree_add_item(branch
, hf_gvcp_sc_zone25_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1355 proto_tree_add_item(branch
, hf_gvcp_sc_zone26_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1356 proto_tree_add_item(branch
, hf_gvcp_sc_zone27_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1357 proto_tree_add_item(branch
, hf_gvcp_sc_zone28_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1358 proto_tree_add_item(branch
, hf_gvcp_sc_zone29_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1359 proto_tree_add_item(branch
, hf_gvcp_sc_zone30_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1360 proto_tree_add_item(branch
, hf_gvcp_sc_zone31_direction_v2_0
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1363 case GVCP_SC_MAX_PACKET_COUNT(0):
1364 case GVCP_SC_MAX_PACKET_COUNT(1):
1365 case GVCP_SC_MAX_PACKET_COUNT(2):
1366 case GVCP_SC_MAX_PACKET_COUNT(3):
1367 proto_tree_add_item(branch
, hf_gvcp_sc_max_packet_count_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1370 case GVCP_SC_MAX_BLOCK_SIZE_HIGH(0):
1371 case GVCP_SC_MAX_BLOCK_SIZE_HIGH(1):
1372 case GVCP_SC_MAX_BLOCK_SIZE_HIGH(2):
1373 case GVCP_SC_MAX_BLOCK_SIZE_HIGH(3):
1374 proto_tree_add_item(branch
, hf_gvcp_sc_max_block_size_high_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1377 case GVCP_SC_MAX_BLOCK_SIZE_LOW(0):
1378 case GVCP_SC_MAX_BLOCK_SIZE_LOW(1):
1379 case GVCP_SC_MAX_BLOCK_SIZE_LOW(2):
1380 case GVCP_SC_MAX_BLOCK_SIZE_LOW(3):
1381 proto_tree_add_item(branch
, hf_gvcp_sc_max_block_size_low_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1384 case GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(0):
1385 case GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(1):
1386 case GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(2):
1387 case GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(3):
1388 proto_tree_add_item(branch
, hf_gvcp_sc_extended_registers_address_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1392 case GVCP_MANIFEST_TABLE
:
1393 proto_tree_add_item(branch
, hf_gvcp_manifest_table
, tvb
, 0, length
, ENC_NA
);
1396 case GVCP_ACTION_GROUP_KEY(0):
1397 case GVCP_ACTION_GROUP_KEY(1):
1398 case GVCP_ACTION_GROUP_KEY(2):
1399 case GVCP_ACTION_GROUP_KEY(3):
1400 case GVCP_ACTION_GROUP_KEY(4):
1401 case GVCP_ACTION_GROUP_KEY(5):
1402 case GVCP_ACTION_GROUP_KEY(6):
1403 case GVCP_ACTION_GROUP_KEY(7):
1404 case GVCP_ACTION_GROUP_KEY(8):
1405 case GVCP_ACTION_GROUP_KEY(9):
1406 proto_tree_add_item(branch
, hf_gvcp_action_group_key
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1409 case GVCP_ACTION_GROUP_MASK(0):
1410 case GVCP_ACTION_GROUP_MASK(1):
1411 case GVCP_ACTION_GROUP_MASK(2):
1412 case GVCP_ACTION_GROUP_MASK(3):
1413 case GVCP_ACTION_GROUP_MASK(4):
1414 case GVCP_ACTION_GROUP_MASK(5):
1415 case GVCP_ACTION_GROUP_MASK(6):
1416 case GVCP_ACTION_GROUP_MASK(7):
1417 case GVCP_ACTION_GROUP_MASK(8):
1418 case GVCP_ACTION_GROUP_MASK(9):
1419 proto_tree_add_item(branch
, hf_gvcp_action_group_mask
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1430 \brief Attempts to dissect an extended bootstrap register
1433 static int dissect_extended_bootstrap_register(uint32_t addr
, proto_tree
*branch
, tvbuff_t
*tvb
, int offset
, int length _U_
)
1437 case GVCP_SC_GENDC_DESCRIPTOR_ADDRESS
:
1438 proto_tree_add_item(branch
, hf_gvcp_sc_gendc_descriptor_address_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1440 case GVCP_SC_GENDC_DESCRIPTOR_SIZE
:
1441 proto_tree_add_item(branch
, hf_gvcp_sc_gendc_descriptor_size_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1443 case GVCP_SC_GENDC_FLOW_MAPPING_TABLE_ADDRESS
:
1444 proto_tree_add_item(branch
, hf_gvcp_sc_gendc_flow_mapping_table_address_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1446 case GVCP_SC_GENDC_FLOW_MAPPING_TABLE_SIZE
:
1447 proto_tree_add_item(branch
, hf_gvcp_sc_gendc_flow_mapping_table_size_v2_2
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1458 /* Attempts to dissect a bootstrap register (readmem context) */
1459 static int dissect_register_data(uint32_t addr
, proto_tree
*branch
, tvbuff_t
*tvb
, int offset
, int length
)
1463 case GVCP_MANUFACTURER_NAME
:
1466 proto_tree_add_item(branch
, hf_gvcp_manufacturer_name
, tvb
, offset
, -1, ENC_ASCII
);
1470 case GVCP_MODEL_NAME
:
1473 proto_tree_add_item(branch
, hf_gvcp_model_name
, tvb
, offset
, -1, ENC_ASCII
);
1477 case GVCP_DEVICE_VERSION
:
1480 proto_tree_add_item(branch
, hf_gvcp_device_version
, tvb
, offset
, -1, ENC_ASCII
);
1484 case GVCP_MANUFACTURER_INFO
:
1487 proto_tree_add_item(branch
, hf_gvcp_manufacturer_specific_info
, tvb
, offset
, -1, ENC_ASCII
);
1491 case GVCP_SERIAL_NUMBER
:
1494 proto_tree_add_item(branch
, hf_gvcp_serial_number
, tvb
, offset
, -1, ENC_ASCII
);
1498 case GVCP_USER_DEFINED_NAME
:
1501 proto_tree_add_item(branch
, hf_gvcp_user_defined_name
, tvb
, offset
, -1, ENC_ASCII
);
1505 case GVCP_FIRST_URL
:
1508 proto_tree_add_item(branch
, hf_gvcp_first_xml_device_description_file
, tvb
, offset
, -1, ENC_ASCII
);
1512 case GVCP_SECOND_URL
:
1515 proto_tree_add_item(branch
, hf_gvcp_second_xml_device_description_file
, tvb
, offset
, -1, ENC_ASCII
);
1528 \brief DISSECT: Force IP command
1531 static void dissect_forceip_cmd(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo _U_
, int startoffset
, int length
)
1533 const int mac_offset
= startoffset
+ 2;
1534 const int ip_offset
= startoffset
+ 20;
1535 const int mask_offset
= startoffset
+ 36;
1536 const int gateway_offset
= startoffset
+ 52;
1538 if (gvcp_telegram_tree
!= NULL
)
1540 gvcp_telegram_tree
= proto_tree_add_subtree(gvcp_telegram_tree
, tvb
, startoffset
, length
,
1541 ett_gvcp_payload_cmd
, NULL
, "FORCEIP_CMD Options");
1543 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_forceip_mac_address
, tvb
, mac_offset
, 6, ENC_NA
);
1544 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_forceip_static_IP
, tvb
, ip_offset
, 4, ENC_BIG_ENDIAN
);
1545 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_forceip_static_subnet_mask
, tvb
, mask_offset
, 4, ENC_BIG_ENDIAN
);
1546 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_forceip_static_default_gateway
, tvb
, gateway_offset
, 4, ENC_BIG_ENDIAN
);
1552 \brief DISSECT: Packet resend command
1555 static void dissect_packetresend_cmd(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int length
, int extendedblockid
)
1558 uint64_t block_id
= 0;
1559 uint32_t first_packet
= 0;
1560 uint32_t last_packet
= 0;
1561 int offset
= startoffset
;
1563 /* Get block ID to generate summary - supports 16 and 64 bits */
1564 if (extendedblockid
== 0)
1566 block_id
= tvb_get_ntohs(tvb
, offset
+ 2);
1572 highid
= tvb_get_ntohl(tvb
, offset
+ 12);
1573 lowid
= tvb_get_ntohl(tvb
, offset
+ 16);
1575 block_id
= lowid
| (highid
<< 32);
1578 /* Get first and last packet IDs for summary - supports 24 and 32 bits */
1579 if (extendedblockid
== 0)
1581 /* in GEV1.2 and prior we use only 24 bit packet IDs */
1582 first_packet
= tvb_get_ntohl(tvb
, offset
+ 4) & 0x00FFFFFF;
1583 last_packet
= tvb_get_ntohl(tvb
, offset
+ 8) & 0x00FFFFFF;
1587 first_packet
= tvb_get_ntohl(tvb
, offset
+ 4);
1588 last_packet
= tvb_get_ntohl(tvb
, offset
+ 8);
1591 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "Block %" PRIu64
", Packets %d->%d", (int64_t)block_id
, first_packet
, last_packet
);
1593 if (gvcp_telegram_tree
!= NULL
)
1595 /* Command header/tree */
1596 gvcp_telegram_tree
= proto_tree_add_subtree(gvcp_telegram_tree
, tvb
, startoffset
, length
,
1597 ett_gvcp_payload_cmd
, NULL
, "PACKETRESEND_CMD Values");
1599 /* Stream channel */
1600 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_resendcmd_stream_channel_index
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1602 /* First, last packet IDs - supports 24 and 32 bits */
1603 if (extendedblockid
== 0)
1605 /* Block ID (16 bits) only if extended block ID disabled */
1606 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_resendcmd_block_id
, tvb
, offset
+ 2, 2, ENC_BIG_ENDIAN
);
1607 /* in GEV1.2 and prior we use only 24 bit packet IDs */
1608 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_resendcmd_first_packet_id
, tvb
, offset
+ 5, 3, ENC_BIG_ENDIAN
);
1609 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_resendcmd_last_packet_id
, tvb
, offset
+ 9, 3, ENC_BIG_ENDIAN
);
1613 /* Extended block ID (64 bits) only if enabled (from GVCP header flags) */
1614 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_resendcmd_extended_block_id_v2_0
, tvb
, offset
+ 12, 8, ENC_BIG_ENDIAN
);
1615 /* Extended packed ID (32 bits) only if enabled */
1616 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_resendcmd_extended_first_packet_id_v2_0
, tvb
, offset
+ 4, 4, ENC_BIG_ENDIAN
);
1617 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_resendcmd_extended_last_packet_id_v2_0
, tvb
, offset
+ 8, 4, ENC_BIG_ENDIAN
);
1624 \brief DISSECT: Read register command
1627 static void dissect_readreg_cmd(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int length
, gvcp_conv_info_t
*gvcp_info
, gvcp_transaction_t
* gvcp_trans
)
1629 proto_item
*item
= NULL
;
1631 const char* address_string
= NULL
;
1632 bool is_custom_register
= false;
1633 int offset
= startoffset
;
1635 int num_registers
= length
/ 4;
1637 addr
= tvb_get_ntohl(tvb
, offset
);
1638 address_string
= get_register_name_from_address(addr
, pinfo
->pool
, gvcp_info
, &is_custom_register
);
1640 if (num_registers
> 1)
1642 col_append_str(pinfo
->cinfo
, COL_INFO
, "[Multiple Register Read Command]");
1646 col_append_str(pinfo
->cinfo
, COL_INFO
, address_string
);
1649 if (!pinfo
->fd
->visited
)
1651 gvcp_trans
->addr_list
= wmem_array_new(wmem_file_scope(), sizeof(uint32_t));
1654 /* Subtree Initialization for Payload Data: READREG_CMD */
1655 if (gvcp_telegram_tree
!= NULL
)
1657 if (num_registers
> 1)
1659 gvcp_telegram_tree
= proto_tree_add_subtree(gvcp_telegram_tree
, tvb
, startoffset
, length
,
1660 ett_gvcp_payload_cmd
, &item
, "READREG_CMD Address List");
1664 for (i
= 0; i
< num_registers
; i
++)
1666 /* For block read register request, address gets re-initialized here in the for loop */
1667 addr
= tvb_get_ntohl(tvb
, offset
);
1669 if (gvcp_trans
&& (!pinfo
->fd
->visited
))
1671 wmem_array_append_one(gvcp_trans
->addr_list
, addr
);
1674 if (gvcp_telegram_tree
!= NULL
)
1676 if (try_val_to_str(addr
, bootstrapregisternames
) != NULL
)
1678 /* Use known bootstrap register */
1679 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_readregcmd_bootstrap_register
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1683 uint32_t extended_bootstrap_address_offset
= 0;
1684 if (is_extended_bootstrap_address(gvcp_info
, addr
, &extended_bootstrap_address_offset
))
1686 dissect_extended_bootstrap_register(addr
- extended_bootstrap_address_offset
, gvcp_telegram_tree
, tvb
, offset
, 4);
1690 /* Insert data as generic register */
1691 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_custom_register_addr
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1693 /* Use generic register name */
1694 proto_item_append_text(item
, " [Unknown Register]");
1704 \brief DISSECT: Write register command
1707 static void dissect_writereg_cmd(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int length
, gvcp_conv_info_t
*gvcp_info
, gvcp_transaction_t
* gvcp_trans
)
1709 int offset
= startoffset
;
1711 proto_item
*item
= NULL
;
1714 const char *address_string
= NULL
;
1715 bool is_custom_register
= false;
1716 int num_registers
= length
/ 8; /* divide by 8 because we are counting register-value pairs */
1717 proto_tree
*subtree
= NULL
;
1721 gvcp_trans
->addr_count
= num_registers
;
1724 addr
= tvb_get_ntohl(tvb
, offset
); /* first register address to be read from WRITEREG_CMD */
1725 value
= tvb_get_ntohl(tvb
, offset
+4);
1726 address_string
= get_register_name_from_address(addr
, pinfo
->pool
, gvcp_info
, &is_custom_register
);
1728 /* Automatically learn stream port. Dissect as external GVSP. */
1729 if ((addr
== GVCP_SC_DESTINATION_PORT(0)) ||
1730 (addr
== GVCP_SC_DESTINATION_PORT(1)) ||
1731 (addr
== GVCP_SC_DESTINATION_PORT(2)) ||
1732 (addr
== GVCP_SC_DESTINATION_PORT(3)))
1734 /* For now we simply (always) add ports. Maybe we should remove when the dissector gets unloaded? */
1735 dissector_add_uint("udp.port", value
, gvsp_handle
);
1738 /* Automatically learn messaging channel port. Dissect as GVCP. */
1739 if (addr
== GVCP_MC_DESTINATION_PORT
)
1741 /* XXX For now we simply (always) add ports. Maybe we should remove when the dissector gets unloaded? */
1742 dissector_add_uint("udp.port", value
, gvcp_handle
);
1745 if (num_registers
> 1)
1747 col_append_str(pinfo
->cinfo
, COL_INFO
, "[Multiple Register Write Command]");
1751 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "%s Value=0x%08X", address_string
, value
);
1754 if (gvcp_telegram_tree
!= NULL
)
1756 if (num_registers
> 1)
1758 gvcp_telegram_tree
= proto_tree_add_subtree(gvcp_telegram_tree
, tvb
, startoffset
, length
,
1759 ett_gvcp_payload_cmd
, &item
, "WRITEREG_CMD Address List");
1762 for (i
= 0; i
< num_registers
; i
++)
1764 /* For block write register request, address gets re-initialized here in the for loop */
1765 addr
= tvb_get_ntohl(tvb
, offset
);
1767 if (try_val_to_str(addr
, bootstrapregisternames
) != NULL
)
1769 /* Read the WRITEREG_CMD requested register address */
1770 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_writeregcmd_bootstrap_register
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1771 subtree
= proto_item_add_subtree(item
, ett_gvcp_payload_cmd_subtree
);
1773 /* Skip 32bit to dissect the value to be written to the specified address */
1776 /* Read the value to be written to the specified register address */
1777 dissect_register(addr
, subtree
, tvb
, offset
, 4);
1781 uint32_t extended_bootstrap_address_offset
= 0;
1782 if (is_extended_bootstrap_address(gvcp_info
, addr
, &extended_bootstrap_address_offset
))
1784 /* Read the WRITEREG_CMD requested register address */
1785 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_writeregcmd_extended_bootstrap_register
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1786 subtree
= proto_item_add_subtree(item
, ett_gvcp_payload_cmd_subtree
);
1788 /* Skip 32bit to dissect the value to be written to the specified address */
1791 /* Read the value to be written to the specified register address */
1792 dissect_extended_bootstrap_register(addr
- extended_bootstrap_address_offset
, subtree
, tvb
, offset
, 4);
1796 proto_tree
* temp_tree
= NULL
;
1798 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_custom_register_addr
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1801 temp_tree
= proto_item_add_subtree(item
, ett_gvcp_payload_cmd_subtree
);
1802 proto_tree_add_item(temp_tree
, hf_gvcp_custom_register_value
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1812 \brief DISSECT: Read memory command
1815 static void dissect_readmem_cmd(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, gvcp_conv_info_t
*gvcp_info
)
1819 int offset
= startoffset
;
1821 addr
= tvb_get_ntohl(tvb
, offset
);
1822 count
= tvb_get_ntohs(tvb
, offset
+ 6); /* Number of bytes to read from memory */
1824 col_append_fstr(pinfo
->cinfo
, COL_INFO
, " (0x%08X (%d) bytes)", addr
, count
);
1826 if (gvcp_telegram_tree
!= NULL
)
1828 proto_item
*item
= NULL
;
1830 if (try_val_to_str(addr
, bootstrapregisternames
) != NULL
)
1832 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_readmemcmd_bootstrap_register
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1836 uint32_t extended_bootstrap_address_offset
= 0;
1837 if (is_extended_bootstrap_address(gvcp_info
, addr
, &extended_bootstrap_address_offset
))
1839 dissect_extended_bootstrap_register(addr
- extended_bootstrap_address_offset
, gvcp_telegram_tree
, tvb
, offset
, 4);
1843 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_custom_memory_addr
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
1844 proto_item_append_text(item
, " [Unknown Register]");
1847 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_readmemcmd_count
, tvb
, (offset
+ 6), 2, ENC_BIG_ENDIAN
);
1853 \brief DISSECT: Write memory command
1856 static void dissect_writemem_cmd(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int length
, gvcp_conv_info_t
*gvcp_info
, gvcp_transaction_t
* gvcp_trans
)
1858 const char* address_string
= NULL
;
1859 bool is_custom_register
= false;
1862 addr
= tvb_get_ntohl(tvb
, startoffset
);
1863 address_string
= get_register_name_from_address(addr
, pinfo
->pool
, gvcp_info
, &is_custom_register
);
1865 /* fill in Info column in Wireshark GUI */
1866 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "%s: %d bytes", address_string
, (length
- 4));
1868 if (gvcp_trans
&& (!pinfo
->fd
->visited
))
1870 gvcp_trans
->addr_list
= wmem_array_new(wmem_file_scope(), sizeof(uint32_t));
1871 wmem_array_append_one(gvcp_trans
->addr_list
, addr
);
1874 if (gvcp_telegram_tree
!= NULL
)
1877 unsigned byte_count
;
1878 offset
= startoffset
+ 4;
1879 byte_count
= (length
- 4);
1881 if (gvcp_trans
&& (gvcp_trans
->rep_frame
))
1883 proto_item
*item
= NULL
;
1884 item
= proto_tree_add_uint(gvcp_telegram_tree
, hf_gvcp_response_in
, tvb
, 0, 0, gvcp_trans
->rep_frame
);
1885 proto_item_set_generated(item
);
1888 if (try_val_to_str(addr
, bootstrapregisternames
) != NULL
)
1890 dissect_register_data(addr
, gvcp_telegram_tree
, tvb
, offset
, byte_count
);
1894 uint32_t extended_bootstrap_address_offset
= 0;
1895 if (is_extended_bootstrap_address(gvcp_info
, addr
, &extended_bootstrap_address_offset
))
1897 dissect_extended_bootstrap_register(addr
- extended_bootstrap_address_offset
, gvcp_telegram_tree
, tvb
, offset
, byte_count
);
1901 /* Generic, unknown value */
1902 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_writememcmd_data
, tvb
, offset
, byte_count
, ENC_NA
);
1910 \brief DISSECT: Event command
1913 static void dissect_event_cmd(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int length
, int extendedblockids
)
1917 offset
= startoffset
;
1920 eventid
= tvb_get_ntohs(tvb
, offset
+ 2);
1922 /* fill in Info column in Wireshark GUI */
1923 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "[ID: 0x%04X]", eventid
);
1925 if (gvcp_telegram_tree
!= NULL
)
1928 int event_count
= 0;
1930 /* Compute event count based on data length */
1931 if (extendedblockids
== 0)
1933 /* No enhanced block id */
1934 event_count
= length
/ 16;
1938 /* Enhanced block id adds */
1939 event_count
= length
/ 24;
1942 if (event_count
> 1)
1944 gvcp_telegram_tree
= proto_tree_add_subtree(gvcp_telegram_tree
, tvb
, offset
, length
,
1945 ett_gvcp_payload_cmd
, NULL
, "EVENT_CMD Event List");
1949 for (i
= 0; i
< event_count
; i
++)
1954 eventid
= tvb_get_ntohs(tvb
, offset
);
1956 /* Use range to determine type of event */
1957 if ((eventid
>= 0x0000) && (eventid
<= 0x8000))
1960 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_id
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1962 else if ((eventid
>= 0x8001) && (eventid
<= 0x8FFF))
1965 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_error_id
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1967 else if ((eventid
>= 0x9000) && (eventid
<= 0xFFFF))
1969 /* Device specific */
1970 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_device_specific_id
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1974 /* Stream channel (possibly) associated with event */
1975 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_stream_channel_index
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1978 if (extendedblockids
== 0)
1980 /* Block id (16 bit) associated with event */
1981 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_block_id
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
1987 /* Block id (64 bit) only if reported by gvcp flag */
1988 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_block_id_64bit_v2_0
, tvb
, offset
, 8, ENC_BIG_ENDIAN
);
1992 /* Timestamp (64 bit) associated with event */
1993 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_timestamp
, tvb
, offset
, 8, ENC_BIG_ENDIAN
);
2001 \brief DISSECT: Event data command
2004 static void dissect_eventdata_cmd(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int extendedblockids
)
2008 int data_length
= 0;
2009 offset
= startoffset
;
2011 while (tvb_captured_length_remaining(tvb
, offset
) > 12) /* At least enough bytes for and GEV 1.2 EVENTDATA_CMD with one byte of payload? */
2014 eventid
= tvb_get_ntohs(tvb
, offset
+ 2);
2016 /* fill in Info column in Wireshark GUI */
2017 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "[ID: 0x%04X]", eventid
);
2019 /* If extended ID, then we have event_size here (2.1) */
2020 if (extendedblockids
)
2022 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_extid_length
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2023 data_length
= tvb_get_ntohs(tvb
, offset
); // We get the data length here
2026 /* skip reserved field */
2029 /* Use range to determine type of event */
2030 if ((eventid
>= 0x0000) && (eventid
<= 0x8000))
2033 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_id
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2035 else if ((eventid
>= 0x8001) && (eventid
<= 0x8FFF))
2038 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_error_id
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2040 else if ((eventid
>= 0x9000) && (eventid
<= 0xFFFF))
2042 /* Device specific */
2043 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_device_specific_id
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2047 /* Stream channel (possibly) associated with event */
2048 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_stream_channel_index
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2051 if (extendedblockids
== 0)
2053 /* Block id (16 bit) associated with event */
2054 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_block_id
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2060 /* Block id (64 bit) only if reported by gvcp flag */
2061 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_block_id_64bit_v2_0
, tvb
, offset
, 8, ENC_BIG_ENDIAN
);
2065 /* Timestamp (64 bit) associated with event */
2066 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_timestamp
, tvb
, offset
, 8, ENC_BIG_ENDIAN
);
2069 if (extendedblockids
)
2071 if (data_length
> 24)
2074 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_data
, tvb
, offset
, data_length
- 24, ENC_NA
);
2075 offset
+= data_length
- 24;
2081 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_eventcmd_data
, tvb
, offset
, -1, ENC_NA
);
2089 \brief DISSECT: Action command
2092 static void dissect_action_cmd(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo _U_
, int startoffset
, int scheduledactioncommand
)
2094 if (gvcp_telegram_tree
!= NULL
)
2097 offset
= startoffset
;
2100 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_actioncmd_device_key
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
2103 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_actioncmd_group_key
, tvb
, offset
+ 4, 4, ENC_BIG_ENDIAN
);
2106 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_actioncmd_group_mask
, tvb
, offset
+ 8, 4, ENC_BIG_ENDIAN
);
2108 if (scheduledactioncommand
!= 0)
2110 /* 64 bits timestamp (optional) if gvcp header flag is set */
2111 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_actioncmd_time_v2_0
, tvb
, offset
+ 12, 8, ENC_BIG_ENDIAN
);
2118 \brief DISSECT: Discovery acknowledge
2121 static void dissect_discovery_ack(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int length
)
2123 proto_item
*item
= NULL
;
2125 const uint8_t* string_manufacturer_name
= NULL
;
2126 const uint8_t* string_serial_number
= NULL
;
2127 int string_length
= 0;
2128 proto_tree
*tree
= NULL
;
2130 offset
= startoffset
;
2131 string_manufacturer_name
= tvb_get_stringz_enc(pinfo
->pool
, tvb
, 80, &string_length
, ENC_ASCII
);
2132 string_serial_number
= tvb_get_stringz_enc(pinfo
->pool
, tvb
, 224, &string_length
, ENC_ASCII
);
2134 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "(%s, %s)",string_manufacturer_name
, string_serial_number
);
2136 if (gvcp_telegram_tree
!= NULL
)
2138 gvcp_telegram_tree
= proto_tree_add_subtree(gvcp_telegram_tree
, tvb
, offset
, length
,
2139 ett_gvcp_payload_cmd
, NULL
, "DISCOVERY_ACK Payload");
2142 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_spec_version
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
2143 tree
= proto_item_add_subtree(item
, ett_gvcp_bootstrap_fields
);
2144 dissect_register(GVCP_VERSION
, tree
, tvb
, offset
, 4 );
2147 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_devicemodediscovery
, tvb
, offset
+ 4, 4, ENC_BIG_ENDIAN
);
2148 tree
= proto_item_add_subtree(item
, ett_gvcp_bootstrap_fields
);
2149 dissect_register(GVCP_DEVICE_MODE
, tree
, tvb
, offset
+ 4, 4 );
2152 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_device_mac_address
, tvb
, offset
+ 10, 6, ENC_NA
);
2154 /* Supported IP configuration */
2155 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_supportedipconfig
, tvb
, offset
+ 16, 4, ENC_BIG_ENDIAN
);
2156 tree
= proto_item_add_subtree(item
, ett_gvcp_bootstrap_fields
);
2157 dissect_register(GVCP_SUPPORTED_IP_CONFIGURATION_0
, tree
, tvb
, offset
+ 16, 4);
2159 /* Current IP configuration */
2160 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_currentipconfig
, tvb
, offset
+ 20, 4, ENC_BIG_ENDIAN
);
2161 tree
= proto_item_add_subtree(item
, ett_gvcp_bootstrap_fields
);
2162 dissect_register(GVCP_CURIPCFG_0
, tree
, tvb
, offset
+ 20, 4);
2164 /* Current IP address */
2165 dissect_register(GVCP_CURRENT_IP_ADDRESS_0
, gvcp_telegram_tree
, tvb
, offset
+ 36, 4);
2167 /* Current subnet mask */
2168 dissect_register(GVCP_CURRENT_SUBNET_MASK_0
, gvcp_telegram_tree
, tvb
, offset
+ 52, 4);
2170 /* Current default gateway */
2171 dissect_register(GVCP_CURRENT_DEFAULT_GATEWAY_0
, gvcp_telegram_tree
, tvb
, offset
+ 68, 4);
2173 /* Manufacturer name */
2174 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_manufacturer_name
, tvb
, offset
+ 72, -1, ENC_ASCII
);
2177 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_model_name
, tvb
, offset
+ 104, -1, ENC_ASCII
);
2179 /* Device version */
2180 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_device_version
, tvb
, offset
+ 136, -1, ENC_ASCII
);
2182 /* Manufacturer specific information */
2183 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_manufacturer_specific_info
, tvb
, offset
+ 168, -1, ENC_ASCII
);
2186 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_serial_number
, tvb
, offset
+ 216, -1, ENC_ASCII
);
2188 /* User defined name */
2189 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_user_defined_name
, tvb
, offset
+ 232, -1, ENC_ASCII
);
2194 \brief DISSECT: Read register acknowledge
2197 static void dissect_readreg_ack(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int length
, gvcp_conv_info_t
*gvcp_info
, gvcp_transaction_t
*gvcp_trans
)
2200 bool is_custom_register
= false;
2201 const char* address_string
= NULL
;
2202 unsigned num_registers
;
2204 bool valid_trans
= false;
2205 unsigned addr_list_size
= 0;
2207 offset
= startoffset
;
2208 num_registers
= length
/ 4;
2210 if (gvcp_trans
&& gvcp_trans
->addr_list
)
2213 addr_list_size
= wmem_array_get_count(gvcp_trans
->addr_list
);
2216 if (num_registers
> 1)
2218 col_append_str(pinfo
->cinfo
, COL_INFO
, "[Multiple ReadReg Ack]");
2224 if (addr_list_size
> 0)
2226 address_string
= get_register_name_from_address(*((uint32_t*)wmem_array_index(gvcp_trans
->addr_list
, 0)), pinfo
->pool
, gvcp_info
, &is_custom_register
);
2227 col_append_str(pinfo
->cinfo
, COL_INFO
, address_string
);
2232 col_append_sep_fstr(pinfo
->cinfo
, COL_INFO
, " ", "Value=0x%08X", tvb_get_ntohl(tvb
, offset
));
2237 if (gvcp_telegram_tree
!= NULL
)
2239 /* Subtree initialization for Payload Data: READREG_ACK */
2240 if (num_registers
> 1)
2242 gvcp_telegram_tree
= proto_tree_add_subtree(gvcp_telegram_tree
, tvb
, offset
, length
,
2243 ett_gvcp_payload_ack
, NULL
, "Register Value List");
2246 for (i
= 0; i
< num_registers
; i
++)
2248 uint32_t curr_register
= 0;
2250 if (valid_trans
&& i
< addr_list_size
)
2252 int stream_channel_count
= 0;
2253 curr_register
= *((uint32_t*)wmem_array_index(gvcp_trans
->addr_list
, i
));
2254 address_string
= get_register_name_from_address(curr_register
, pinfo
->pool
, gvcp_info
, &is_custom_register
);
2255 for (; stream_channel_count
< GVCP_MAX_STREAM_CHANNEL_COUNT
; stream_channel_count
++)
2257 if (curr_register
== (uint32_t)GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(stream_channel_count
))
2259 gvcp_info
->extended_bootstrap_address
[stream_channel_count
] = tvb_get_ntohl(tvb
, offset
);
2264 if (!is_custom_register
) /* bootstrap register */
2266 uint32_t extended_bootstrap_address_offset
= 0;
2267 if (is_extended_bootstrap_address(gvcp_info
, curr_register
, &extended_bootstrap_address_offset
))
2269 proto_tree_add_uint_format_value(gvcp_telegram_tree
, hf_gvcp_readregcmd_extended_bootstrap_register
, tvb
, offset
, 4, curr_register
, "%s (0x%08X)", address_string
, curr_register
);
2270 dissect_extended_bootstrap_register(curr_register
- extended_bootstrap_address_offset
, gvcp_telegram_tree
, tvb
, offset
, length
);
2274 proto_tree_add_uint(gvcp_telegram_tree
, hf_gvcp_readregcmd_bootstrap_register
, tvb
, 0, 4, curr_register
);
2275 dissect_register(curr_register
, gvcp_telegram_tree
, tvb
, offset
, length
);
2280 proto_tree_add_uint_format_value(gvcp_telegram_tree
, hf_gvcp_custom_read_register_addr
, tvb
, offset
, 4, curr_register
, "%s (0x%08X)", address_string
, curr_register
);
2281 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_custom_read_register_value
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
2286 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_custom_register_value
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
2296 \brief DISSECT: Write register acknowledge
2299 static void dissect_writereg_ack(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, gvcp_transaction_t
* gvcp_trans
)
2301 proto_item
*item
= NULL
;
2302 uint16_t ack_index
= 0;
2304 if (gvcp_telegram_tree
!= NULL
)
2306 item
= proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_writeregcmd_data_index
, tvb
, (startoffset
+ 2), 2, ENC_BIG_ENDIAN
);
2309 ack_index
= tvb_get_ntohs(tvb
, 10);
2313 int num_registers
= 0;
2315 num_registers
= gvcp_trans
->addr_count
;
2316 if (num_registers
> 1)
2318 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "[Multiple WriteReg Ack] (%d/%d) %s ", ack_index
, num_registers
, (ack_index
== num_registers
? "(Success)" : "(Failed)"));
2322 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "%s ", (ack_index
== num_registers
? "(Success)" : "(Failed)"));
2325 if (gvcp_telegram_tree
!= NULL
)
2327 proto_item_append_text(item
, " %s", (ack_index
== num_registers
? "(Success)" : "(Failed)"));
2332 col_append_str(pinfo
->cinfo
, COL_INFO
, "[Cannot find requesting packet]");
2338 \brief DISSECT: Read memory acknowledge
2341 static void dissect_readmem_ack(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int length
, gvcp_conv_info_t
*gvcp_info
)
2346 const char *address_string
= NULL
;
2347 bool is_custom_register
= false;
2349 addr
= tvb_get_ntohl(tvb
, startoffset
);
2350 address_string
= get_register_name_from_address(addr
, pinfo
->pool
, gvcp_info
, &is_custom_register
);
2352 /* Fill in Wireshark GUI Info column */
2353 col_append_str(pinfo
->cinfo
, COL_INFO
, address_string
);
2355 if (gvcp_telegram_tree
!= NULL
)
2357 int stream_channel_count
= 0;
2359 unsigned byte_count
;
2360 offset
= startoffset
+ 4;
2361 byte_count
= (length
- 4);
2363 for (stream_channel_count
= 0; stream_channel_count
< GVCP_MAX_STREAM_CHANNEL_COUNT
; stream_channel_count
++)
2365 if (startoffset
== GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(stream_channel_count
))
2367 gvcp_info
->extended_bootstrap_address
[stream_channel_count
] = tvb_get_ntohl(tvb
, offset
);
2372 /* Bootstrap register known address */
2373 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_readmemcmd_address
, tvb
, startoffset
, 4, ENC_BIG_ENDIAN
);
2375 if (try_val_to_str(addr
, bootstrapregisternames
) != NULL
)
2377 dissect_register_data(addr
, gvcp_telegram_tree
, tvb
, offset
, byte_count
);
2381 uint32_t extended_bootstrap_address_offset
= 0;
2382 if (is_extended_bootstrap_address(gvcp_info
, addr
, &extended_bootstrap_address_offset
))
2384 dissect_extended_bootstrap_register(addr
- extended_bootstrap_address_offset
, gvcp_telegram_tree
, tvb
, offset
, byte_count
);
2388 /* Generic, unknown value */
2389 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_readmemcmd_data_read
, tvb
, offset
, byte_count
, ENC_NA
);
2398 \brief DISSECT: Write memory acknowledge
2401 static void dissect_writemem_ack(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo
, int startoffset
, int length
, gvcp_conv_info_t
*gvcp_info
, gvcp_transaction_t
* gvcp_trans
)
2403 if (gvcp_trans
&& gvcp_trans
->addr_list
)
2405 if (wmem_array_get_count(gvcp_trans
->addr_list
) > 0)
2407 const char *address_string
= NULL
;
2408 address_string
= get_register_name_from_address((*((uint32_t*)wmem_array_index(gvcp_trans
->addr_list
, 0))), pinfo
->pool
, gvcp_info
, NULL
);
2409 col_append_str(pinfo
->cinfo
, COL_INFO
, address_string
);
2413 if (gvcp_telegram_tree
!= NULL
)
2415 if (gvcp_trans
&& gvcp_trans
->req_frame
)
2417 proto_item
*item
= proto_tree_add_uint(gvcp_telegram_tree
, hf_gvcp_response_to
, tvb
, 0, 0, gvcp_trans
->req_frame
);
2418 proto_item_set_generated(item
);
2421 gvcp_telegram_tree
= proto_tree_add_subtree(gvcp_telegram_tree
, tvb
, startoffset
, length
,
2422 ett_gvcp_payload_cmd
, NULL
, "Payload Data: WRITEMEM_ACK");
2423 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_writememcmd_data_index
, tvb
, (startoffset
+2), 2, ENC_BIG_ENDIAN
);
2429 \brief DISSECT: Pending acknowledge
2432 static void dissect_pending_ack(proto_tree
*gvcp_telegram_tree
, tvbuff_t
*tvb
, packet_info
*pinfo _U_
, int startoffset
, int length
)
2434 if (gvcp_telegram_tree
!= NULL
)
2436 gvcp_telegram_tree
= proto_tree_add_subtree(gvcp_telegram_tree
, tvb
, startoffset
, length
,
2437 ett_gvcp_payload_cmd
, NULL
, "Payload Data: PENDING_ACK");
2438 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_time_to_completion
, tvb
, (startoffset
+ 2), 2, ENC_BIG_ENDIAN
);
2444 \brief Point of entry of all GVCP packet dissection
2447 static int dissect_gvcp(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *data _U_
)
2450 proto_tree
*gvcp_tree
= NULL
;
2451 proto_tree
*gvcp_tree_flag
= NULL
;
2452 proto_tree
*gvcp_telegram_tree
= NULL
;
2453 int data_length
= 0;
2455 const char* command_string
= NULL
;
2457 int extendedblockids
= -1;
2458 int scheduledactioncommand
= -1;
2460 const char* ack_string
= NULL
;
2463 proto_item
*ti
= NULL
;
2464 proto_item
*item
= NULL
;
2465 conversation_t
*conversation
= 0;
2466 gvcp_conv_info_t
*gvcp_info
= 0;
2467 gvcp_transaction_t
*gvcp_trans
= 0;
2469 if (tvb_captured_length(tvb
) < GVCP_MIN_PACKET_SIZE
)
2474 /* check for valid key/ack code */
2475 key_code
= (char) tvb_get_uint8(tvb
, offset
);
2476 ack_code
= tvb_get_ntohs(tvb
, offset
+2);
2477 ack_string
= try_val_to_str(ack_code
, acknowledgenames
);
2479 if ((key_code
!= 0x42) && !ack_string
)
2484 /* Set the protocol column */
2485 col_set_str(pinfo
->cinfo
, COL_PROTOCOL
, "GVCP");
2487 /* Clear out stuff in the info column */
2488 col_clear(pinfo
->cinfo
, COL_INFO
);
2490 /* Adds "Gigabit-Ethernet Control Protocol" heading to protocol tree */
2491 /* We will add fields to this using the gvcp_tree pointer */
2492 ti
= proto_tree_add_item(tree
, proto_gvcp
, tvb
, offset
, -1, ENC_NA
);
2493 gvcp_tree
= proto_item_add_subtree(ti
, ett_gvcp
);
2495 /* Is this a command message? */
2496 if (key_code
== 0x42)
2498 command
= tvb_get_ntohs(tvb
, offset
+2);
2499 command_string
= val_to_str(command
, commandnames
,"Unknown Command (0x%x)");
2501 /* Add the Command name string to the Info column */
2502 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "> %s ", command_string
);
2504 gvcp_tree
= proto_tree_add_subtree_format(gvcp_tree
, tvb
, offset
, 8,
2505 ett_gvcp_cmd
, NULL
, "Command Header: %s", command_string
);
2507 /* Add the message key code: */
2508 proto_tree_add_item(gvcp_tree
, hf_gvcp_message_key_code
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
2512 flags
= (char) tvb_get_uint8(tvb
, offset
);
2513 item
= proto_tree_add_item(gvcp_tree
, hf_gvcp_flag
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
2514 gvcp_tree_flag
= proto_item_add_subtree(item
, ett_gvcp_flags
);
2515 if (command
== GVCP_ACTION_CMD
)
2517 proto_tree_add_item(gvcp_tree_flag
, hf_gvcp_scheduledactioncommand_flag_v2_0
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
2518 scheduledactioncommand
= (flags
& 0x80);
2520 if ((command
== GVCP_EVENTDATA_CMD
) ||
2521 (command
== GVCP_EVENT_CMD
) ||
2522 (command
== GVCP_PACKETRESEND_CMD
))
2524 proto_tree_add_item(gvcp_tree_flag
, hf_gvcp_64bitid_flag_v2_0
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
2525 flags
= (char) tvb_get_uint8(tvb
, offset
);
2526 extendedblockids
= (flags
& 0x10);
2528 if ((command
== GVCP_DISCOVERY_CMD
) ||
2529 (command
== GVCP_FORCEIP_CMD
))
2531 proto_tree_add_item(gvcp_tree_flag
, hf_gvcp_allow_broadcast_acknowledge_flag
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
2533 proto_tree_add_item(gvcp_tree_flag
, hf_gvcp_acknowledge_required_flag
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
2537 /* Add the command */
2538 proto_tree_add_item(gvcp_tree
, hf_gvcp_command
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2541 else /* ... or else it is an acknowledge */
2543 int status
= tvb_get_ntohs(tvb
, offset
);
2544 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "< %s %s",
2545 ack_string
, val_to_str(status
, statusnames_short
, "Unknown status (0x%04X)"));
2547 gvcp_tree
= proto_tree_add_subtree_format(gvcp_tree
, tvb
, offset
+2, tvb_captured_length(tvb
)-2,
2548 ett_gvcp_ack
, NULL
, "Acknowledge Header: %s", ack_string
);
2550 /* Add the status: */
2551 proto_tree_add_item(gvcp_tree
, hf_gvcp_status
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2554 /* Add the acknowledge */
2555 proto_tree_add_item(gvcp_tree
, hf_gvcp_acknowledge
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2560 /* Parse the second part of both the command and the acknowledge header:
2562 -------- -------- -------- --------
2563 | status | acknowledge |
2564 -------- -------- -------- --------
2566 -------- -------- -------- --------
2569 Number of valid data bytes in this message, not including this header. This
2570 represents the number of bytes of payload appended after this header */
2571 proto_tree_add_item(gvcp_tree
, hf_gvcp_length
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2572 data_length
= tvb_get_ntohs(tvb
, offset
);
2575 /* Add the request ID */
2576 proto_tree_add_item(gvcp_tree
, hf_gvcp_request_id
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
2577 request_id
= tvb_get_ntohs(tvb
, offset
);
2580 conversation
= find_or_create_conversation(pinfo
);
2582 gvcp_info
= (gvcp_conv_info_t
*)conversation_get_proto_data(conversation
, proto_gvcp
);
2585 int stream_channel_count
= 0;
2586 gvcp_info
= wmem_new(wmem_file_scope(), gvcp_conv_info_t
);
2587 gvcp_info
->pdus
= wmem_map_new(wmem_file_scope(), g_direct_hash
, g_direct_equal
);
2588 for (; stream_channel_count
< GVCP_MAX_STREAM_CHANNEL_COUNT
; stream_channel_count
++)
2590 gvcp_info
->extended_bootstrap_address
[stream_channel_count
] = 0;
2592 conversation_add_proto_data(conversation
, proto_gvcp
, gvcp_info
);
2595 if (!pinfo
->fd
->visited
)
2597 if (key_code
== 0x42)
2599 /* This is a request */
2600 gvcp_trans
= wmem_new(pinfo
->pool
, gvcp_transaction_t
);
2601 gvcp_trans
->req_frame
= pinfo
->num
;
2602 gvcp_trans
->rep_frame
= 0;
2603 gvcp_trans
->addr_list
= 0;
2604 gvcp_trans
->addr_count
= 0;
2608 if (ack_string
&& ( ack_code
!= GVCP_PENDING_ACK
) )
2610 /* this is a response, so update trans info with ack's frame number */
2611 /* get list of transactions for given request id */
2612 gvcp_trans_array
= (wmem_array_t
*)wmem_map_lookup(gvcp_info
->pdus
, GUINT_TO_POINTER(request_id
));
2613 if (gvcp_trans_array
)
2616 unsigned array_size
= wmem_array_get_count(gvcp_trans_array
);
2617 for (i
= array_size
-1; i
>= 0; i
--)
2619 gvcp_trans
= (gvcp_transaction_t
*)wmem_array_index(gvcp_trans_array
, i
);
2621 if (gvcp_trans
&& (gvcp_trans
->req_frame
< pinfo
->num
))
2623 if (gvcp_trans
->rep_frame
!= 0)
2629 gvcp_trans
->rep_frame
= pinfo
->num
;
2643 gvcp_trans_array
= (wmem_array_t
*)wmem_map_lookup(gvcp_info
->pdus
, GUINT_TO_POINTER(request_id
));
2645 if (gvcp_trans_array
)
2648 unsigned array_size
= wmem_array_get_count(gvcp_trans_array
);
2650 for (i
= 0; i
< array_size
; ++i
)
2652 gvcp_trans
= (gvcp_transaction_t
*)wmem_array_index(gvcp_trans_array
, i
);
2653 if (gvcp_trans
&& (pinfo
->num
== gvcp_trans
->req_frame
|| pinfo
->num
== gvcp_trans
->rep_frame
))
2665 gvcp_trans
= wmem_new0(pinfo
->pool
, gvcp_transaction_t
);
2668 /* Add telegram subtree */
2669 gvcp_telegram_tree
= proto_item_add_subtree(gvcp_tree
, ett_gvcp
);
2671 /* Is this a command? */
2672 if (key_code
== 0x42)
2674 if (gvcp_telegram_tree
!= NULL
)
2676 if (gvcp_trans
->rep_frame
)
2678 item
= proto_tree_add_uint(gvcp_telegram_tree
, hf_gvcp_response_in
, tvb
, 0, 0, gvcp_trans
->rep_frame
);
2679 proto_item_set_generated(item
);
2685 case GVCP_FORCEIP_CMD
:
2686 dissect_forceip_cmd(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
);
2689 case GVCP_PACKETRESEND_CMD
:
2690 dissect_packetresend_cmd(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
, extendedblockids
);
2693 case GVCP_READREG_CMD
:
2694 dissect_readreg_cmd(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
, gvcp_info
, gvcp_trans
);
2697 case GVCP_WRITEREG_CMD
:
2698 dissect_writereg_cmd(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
, gvcp_info
, gvcp_trans
);
2701 case GVCP_READMEM_CMD
:
2702 dissect_readmem_cmd(gvcp_telegram_tree
, tvb
, pinfo
, offset
, gvcp_info
);
2705 case GVCP_WRITEMEM_CMD
:
2706 dissect_writemem_cmd(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
, gvcp_info
, gvcp_trans
);
2709 case GVCP_EVENT_CMD
:
2710 dissect_event_cmd(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
, extendedblockids
);
2713 case GVCP_EVENTDATA_CMD
:
2714 dissect_eventdata_cmd(gvcp_telegram_tree
, tvb
, pinfo
, offset
, extendedblockids
);
2717 case GVCP_ACTION_CMD
:
2718 dissect_action_cmd(gvcp_telegram_tree
, tvb
, pinfo
, offset
, scheduledactioncommand
);
2721 case GVCP_DISCOVERY_CMD
:
2726 if (!pinfo
->fd
->visited
)
2728 if (key_code
== 0x42)
2730 gvcp_trans_array
= (wmem_array_t
*)wmem_map_lookup(gvcp_info
->pdus
, GUINT_TO_POINTER(request_id
));
2732 if(gvcp_trans_array
)
2734 wmem_array_append(gvcp_trans_array
, gvcp_trans
, 1);
2738 gvcp_trans_array
= wmem_array_new(wmem_file_scope(), sizeof(gvcp_transaction_t
));
2739 wmem_array_append(gvcp_trans_array
, gvcp_trans
, 1);
2740 wmem_map_insert(gvcp_info
->pdus
, GUINT_TO_POINTER(request_id
), (void *)gvcp_trans_array
);
2747 if (gvcp_telegram_tree
!= NULL
)
2749 if (gvcp_trans
->req_frame
)
2751 item
= proto_tree_add_uint(gvcp_telegram_tree
, hf_gvcp_response_to
, tvb
, 0, 0, gvcp_trans
->req_frame
);
2752 proto_item_set_generated(item
);
2758 case GVCP_DISCOVERY_ACK
:
2759 dissect_discovery_ack(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
);
2762 case GVCP_READREG_ACK
:
2763 dissect_readreg_ack(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
, gvcp_info
, gvcp_trans
);
2766 case GVCP_WRITEREG_ACK
:
2767 dissect_writereg_ack(gvcp_telegram_tree
, tvb
, pinfo
, offset
, gvcp_trans
);
2770 case GVCP_READMEM_ACK
:
2771 dissect_readmem_ack(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
, gvcp_info
);
2774 case GVCP_WRITEMEM_ACK
:
2775 dissect_writemem_ack(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
, gvcp_info
, gvcp_trans
);
2778 case GVCP_PENDING_ACK
:
2779 dissect_pending_ack(gvcp_telegram_tree
, tvb
, pinfo
, offset
, data_length
);
2782 case GVCP_FORCEIP_ACK
:
2784 case GVCP_PACKETRESEND_ACK
:
2785 case GVCP_EVENT_ACK
:
2786 case GVCP_EVENTDATA_ACK
:
2787 case GVCP_ACTION_ACK
:
2789 proto_tree_add_item(gvcp_telegram_tree
, hf_gvcp_payloaddata
, tvb
, offset
, data_length
, ENC_NA
);
2793 return tvb_captured_length(tvb
);
2796 void proto_register_gvcp(void)
2799 \brief Structures for register dissection
2802 static hf_register_info hf
[] =
2804 /* Common GVCP data */
2806 { &hf_gvcp_message_key_code
,
2807 { "Message Key Code", "gvcp.message_key_code",
2808 FT_UINT8
, BASE_HEX_DEC
, NULL
, 0x0,
2812 { "Flags", "gvcp.cmd.flags",
2813 FT_UINT8
, BASE_HEX
, NULL
, 0x0,
2816 { &hf_gvcp_acknowledge_required_flag
,
2817 { "Acknowledge Required", "gvcp.cmd.flag.acq_required",
2818 FT_BOOLEAN
, 8, NULL
, 0x01,
2821 { &hf_gvcp_scheduledactioncommand_flag_v2_0
,
2822 { "Scheduled Action Command", "gvcp.cmd.flag.scheduledactioncommand",
2823 FT_BOOLEAN
, 8, NULL
, 0x80,
2826 { &hf_gvcp_64bitid_flag_v2_0
,
2827 { "64 bit ID", "gvcp.cmd.flag.64bitid",
2828 FT_BOOLEAN
, 8, NULL
, 0x10,
2831 { &hf_gvcp_allow_broadcast_acknowledge_flag
,
2832 { "Allow Broadcast Acknowledge", "gvcp.cmd.flag.allowbroadcastacq",
2833 FT_BOOLEAN
, 8, NULL
, 0x10,
2837 { "Command", "gvcp.cmd.command",
2838 FT_UINT16
, BASE_HEX
, VALS(commandnames
), 0x0,
2842 { "Payload Length", "gvcp.cmd.payloadlength",
2843 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
2846 { &hf_gvcp_request_id
,
2847 { "Request ID", "gvcp.cmd.req_id",
2848 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
2851 { &hf_gvcp_payloaddata
,
2852 { "Payload Data", "gvcp.cmd.payloaddata",
2853 FT_BYTES
, BASE_NONE
, NULL
, 0x0,
2857 { "Status", "gvcp.cmd.status",
2858 FT_UINT16
, BASE_HEX
, VALS(statusnames
), 0x0,
2861 { &hf_gvcp_acknowledge
,
2862 { "Acknowledge", "gvcp.ack",
2863 FT_UINT16
, BASE_HEX
, VALS(acknowledgenames
), 0x0,
2866 { &hf_gvcp_devicemodediscovery
,
2867 { "Device Mode", "gvcp.ack.discovery.devicemode",
2868 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
2873 { &hf_gvcp_forceip_mac_address
,
2874 { "MAC Address", "gvcp.cmd.forceip.macaddress",
2875 FT_ETHER
, BASE_NONE
, NULL
, 0x0,
2878 { &hf_gvcp_forceip_static_IP
,
2879 { "IP address", "gvcp.cmd.forceip.ip",
2880 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
2883 { &hf_gvcp_forceip_static_subnet_mask
,
2884 { "Subnet Mask", "gvcp.cmd.forceip.subnetmask",
2885 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
2888 { &hf_gvcp_forceip_static_default_gateway
,
2889 { "Default Gateway", "gvcp.cmd.forceip.defaultgateway",
2890 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
2893 /* Discovery specific */
2895 { &hf_gvcp_device_mac_address
,
2896 { "Device MAC Address", "gvcp.cmd.discovery.devicemacaddress",
2897 FT_ETHER
, BASE_NONE
, NULL
, 0x0,
2901 { &hf_gvcp_readregcmd_bootstrap_register
,
2902 { "Bootstrap Register", "gvcp.cmd.readreg.bootstrapregister",
2903 FT_UINT32
, BASE_HEX_DEC
, VALS(bootstrapregisternames
), 0x0,
2906 { &hf_gvcp_readregcmd_extended_bootstrap_register
,
2907 { "Extended Bootstrap Register", "gvcp.cmd.readreg.extendedbootstrapregister",
2908 FT_UINT32
, BASE_HEX_DEC
, VALS(extendedbootstrapregisternames
), 0x0,
2911 /* Write register */
2913 { &hf_gvcp_writeregcmd_data
,
2914 { "DataX", "gvcp.cmd.writereg.data",
2915 FT_UINT32
, BASE_HEX_DEC
, NULL
, 0x0,
2918 { &hf_gvcp_writeregcmd_bootstrap_register
,
2919 { "Bootstrap Register", "gvcp.cmd.writereg.bootstrapregister",
2920 FT_UINT32
, BASE_HEX_DEC
, VALS(bootstrapregisternames
), 0x0,
2923 { &hf_gvcp_writeregcmd_extended_bootstrap_register
,
2924 { "Extended Bootstrap Register", "gvcp.cmd.writereg.extendedbootstrapregister",
2925 FT_UINT32
, BASE_HEX_DEC
, VALS(extendedbootstrapregisternames
), 0x0,
2928 { &hf_gvcp_writeregcmd_data_index
,
2929 { "Data Index", "gvcp.cmd.writereg.dataindex",
2930 FT_UINT16
, BASE_HEX
, NULL
, 0x0,
2935 { &hf_gvcp_readmemcmd_address
,
2936 { "Register Address", "gvcp.cmd.readmem.address",
2937 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
2940 { &hf_gvcp_readmemcmd_bootstrap_register
,
2941 { "Memory Bootstrap Register", "gvcp.cmd.readmem.bootstrapregister",
2942 FT_UINT32
, BASE_HEX_DEC
, VALS(bootstrapregisternames
), 0x0,
2945 { &hf_gvcp_readmemcmd_count
,
2946 { "Count", "gvcp.cmd.readmem.count",
2947 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
2952 { &hf_gvcp_writememcmd_data
,
2953 { "DataY", "gvcp.cmd.writemem.data",
2954 FT_BYTES
, BASE_NONE
, NULL
, 0x0,
2957 { &hf_gvcp_writememcmd_data_index
,
2958 { "Data Index", "gvcp.cmd.writemem.dataindex",
2959 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
2962 /* Resend request */
2964 { &hf_gvcp_resendcmd_stream_channel_index
,
2965 { "Resend Stream Channel Index", "gvcp.cmd.resend.streamchannelindex",
2966 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
2969 { &hf_gvcp_resendcmd_block_id
,
2970 { "Resend Block ID 16 bits", "gvcp.cmd.resend.blockid",
2971 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
2974 { &hf_gvcp_resendcmd_first_packet_id
,
2975 { "Resend First Packet ID 24 bits", "gvcp.cmd.resend.firstpacketid",
2976 FT_UINT24
, BASE_HEX_DEC
, NULL
, 0x0,
2979 { &hf_gvcp_resendcmd_last_packet_id
,
2980 { "Resend Last Packet ID 24 bits", "gvcp.cmd.resend.lastpacketid",
2981 FT_UINT24
, BASE_HEX_DEC
, NULL
, 0x0,
2984 { &hf_gvcp_resendcmd_extended_block_id_v2_0
,
2985 { "Resend Block ID 64 bits", "gvcp.cmd.resend.extendedblockid",
2986 FT_UINT64
, BASE_HEX_DEC
, NULL
, 0x0,
2989 { &hf_gvcp_resendcmd_extended_first_packet_id_v2_0
,
2990 { "Resend First Packet ID 32 bits", "gvcp.cmd.resend.firstpacketid",
2991 FT_UINT32
, BASE_HEX_DEC
, NULL
, 0x0,
2994 { &hf_gvcp_resendcmd_extended_last_packet_id_v2_0
,
2995 { "Resend Last Packet ID 32 bits", "gvcp.cmd.resend.lastpacketid",
2996 FT_UINT32
, BASE_HEX_DEC
, NULL
, 0x0,
3001 { &hf_gvcp_eventcmd_id
,
3002 { "ID", "gvcp.cmd.event.id",
3003 FT_UINT16
, BASE_HEX_DEC
, VALS(eventidnames
), 0x0,
3006 { &hf_gvcp_eventcmd_error_id
,
3007 { "Error ID", "gvcp.cmd.event.errorid",
3008 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
3011 { &hf_gvcp_eventcmd_extid_length
,
3012 { "Event Size", "gvcp.cmd.event.eventsize",
3013 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
3016 { &hf_gvcp_eventcmd_device_specific_id
,
3017 { "Device Specific ID", "gvcp.cmd.event.devicespecificid",
3018 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
3021 { &hf_gvcp_eventcmd_stream_channel_index
,
3022 { "Stream Channel Index", "gvcp.cmd.event.streamchannelindex",
3023 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
3026 { &hf_gvcp_eventcmd_block_id
,
3027 { "Block ID (16 bit)", "gvcp.cmd.event.blockid",
3028 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
3031 { &hf_gvcp_eventcmd_timestamp
,
3032 { "Timestamp", "gvcp.cmd.event.timestamp",
3033 FT_UINT64
, BASE_HEX_DEC
, NULL
, 0x0,
3036 { &hf_gvcp_eventcmd_block_id_64bit_v2_0
,
3037 { "Block ID 64 bit", "gvcp.event_timestamp",
3038 FT_UINT64
, BASE_HEX_DEC
, NULL
, 0x0,
3043 { &hf_gvcp_eventcmd_data
,
3044 { "Event Data", "gvcp.cmd.eventdata.data",
3045 FT_BYTES
, BASE_NONE
, NULL
, 0x0,
3050 { &hf_gvcp_actioncmd_device_key
,
3051 { "Action Device Key", "gvcp.cmd.action.devicekey",
3052 FT_UINT32
, BASE_HEX_DEC
, NULL
, 0x0,
3055 { &hf_gvcp_actioncmd_group_key
,
3056 { "Action Group Key", "gvcp.cmd.action.groupkey",
3057 FT_UINT32
, BASE_HEX_DEC
, NULL
, 0x0,
3060 { &hf_gvcp_actioncmd_group_mask
,
3061 { "Action Group Mask", "gvcp.cmd.action.groupmask",
3062 FT_UINT32
, BASE_HEX_DEC
, NULL
, 0xFFFFFFFF,
3065 { &hf_gvcp_actioncmd_time_v2_0
,
3066 { "Action Scheduled Time", "gvcp.cmd.action.time",
3067 FT_UINT64
, BASE_HEX_DEC
, NULL
, 0x0,
3070 /* Pending acknowledge */
3072 { &hf_gvcp_time_to_completion
,
3073 { "Time to completion", "gvcp.ack.pendingack.timetocompletion",
3074 FT_UINT16
, BASE_HEX_DEC
, NULL
, 0x0,
3079 { &hf_gvcp_spec_version_major
,
3080 { "Version Major", "gvcp.bootstrap.specversion.major",
3081 FT_UINT32
, BASE_HEX
, NULL
, 0xFFFF0000,
3084 { &hf_gvcp_spec_version_minor
,
3085 { "Version Minor", "gvcp.bootstrap.specversion.minor",
3086 FT_UINT32
, BASE_HEX
, NULL
, 0x0000FFFF,
3089 { &hf_gvcp_spec_version
,
3090 { "Spec Version", "gvcp.bootstrap.specversion",
3091 FT_UINT32
, BASE_HEX
, NULL
, 0,
3094 /* GVCP_devicemode */
3096 { &hf_gvcp_devicemode_endianness
,
3097 { "Endianness", "gvcp.bootstrap.devicemode.endianness",
3098 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3102 { &hf_gvcp_devicemode_deviceclass
,
3103 { "Device Class", "gvcp.bootstrap.devicemode.deviceclass",
3104 FT_UINT32
, BASE_HEX
, VALS(devicemodenames_class
), 0x70000000,
3108 { &hf_gvcp_devicemode_current_link_configuration_v2_0
,
3109 { "Current Link Configuration", "gvcp.bootstrap.devicemode.currentlinkconfiguration",
3110 FT_UINT32
, BASE_HEX
, VALS(linkconfiguration_class
), 0x03000000,
3114 { &hf_gvcp_devicemode_characterset
,
3115 { "Character Set", "gvcp.bootstrap.devicemode.characterset",
3116 FT_UINT32
, BASE_HEX
, VALS(devicemodenames_characterset
), 0x0000000F,
3120 /* GVCP_MAC_HIGH_0, 1, 2, 3 */
3123 { "MAC High", "gvcp.bootstrap.machigh",
3124 FT_UINT32
, BASE_HEX
, NULL
, 0x0000FFFF,
3128 /* GVCP_MAC_LOW_0, 1, 2, 3 */
3131 { "MAC Low", "gvcp.bootstrap.maclow",
3132 FT_UINT32
, BASE_HEX
, NULL
, 0,
3136 /* GVCP_SUPPORTED_IP_CONFIGURATION_0, 1, 2, 3 */
3137 /* GVCP_CURIPCFG_0, 1, 2, 3 */
3139 { &hf_gvcp_ip_config_can_handle_pause_frames_v2_0
,
3140 { "IP Config Can Handle Pause Frames", "gvcp.bootstrap.ipconfig.canhandlepauseframes",
3141 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3144 { &hf_gvcp_ip_config_can_generate_pause_frames_v2_0
,
3145 { "Can Generate Pause Frames", "gvcp.bootstrap.ipconfig.cangeneratepauseframes",
3146 FT_BOOLEAN
, 32, NULL
, 0x40000000,
3149 { &hf_gvcp_ip_config_lla
,
3150 { "LLA", "gvcp.bootstrap.ipconfig.lla",
3151 FT_BOOLEAN
, 32, NULL
, 0x00000004,
3154 { &hf_gvcp_ip_config_dhcp
,
3155 { "DHCP", "gvcp.bootstrap.ipconfig.dhcp",
3156 FT_BOOLEAN
, 32, NULL
, 0x00000002,
3159 { &hf_gvcp_ip_config_persistent_ip
,
3160 { "Persistent IP", "gvcp.bootstrap.ipconfig.persistentip",
3161 FT_BOOLEAN
, 32, NULL
, 0x00000001,
3164 { &hf_gvcp_supportedipconfig
,
3165 { "Supported IP Configuration", "gvcp.bootstrap.supportedipconfig",
3166 FT_UINT32
, BASE_HEX
, NULL
, 0,
3170 { &hf_gvcp_currentipconfig
,
3171 { "Current IP Configuration", "gvcp.bootstrap.currentipconfig",
3172 FT_UINT32
, BASE_HEX
, NULL
, 0,
3176 /* GVCP_CURRENT_IP_ADDRESS_0, 1, 2, 3 */
3178 { &hf_gvcp_current_IP
,
3179 { "Current IP", "gvcp.bootstrap.currentip",
3180 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
3183 /* GVCP_CURRENT_SUBNET_MASK_0, 1, 2, 3 */
3185 { &hf_gvcp_current_subnet_mask
,
3186 { "Subnet Mask", "gvcp.bootstrap.currentsubnetmask",
3187 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
3190 /* GVCP_CURRENT_DEFAULT_GATEWAY_0, 1, 2, 3 */
3192 { &hf_gvcp_current_default_gateway
,
3193 { "Default Gateway", "gvcp.bootstrap.currentdefaultgateway",
3194 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
3197 /* GVCP_MANUFACTURER_NAME */
3199 { &hf_gvcp_manufacturer_name
,
3200 { "Manufacturer Name", "gvcp.bootstrap.manufacturername",
3201 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
3204 /* GVCP_MODEL_NAME */
3206 { &hf_gvcp_model_name
,
3207 { "Model Name", "gvcp.bootstrap.modelname",
3208 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
3211 /* GVCP_DEVICE_VERSION */
3213 { &hf_gvcp_device_version
,
3214 { "Device Version", "gvcp.bootstrap.deviceversion",
3215 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
3218 /* GVCP_MANUFACTURER_INFO */
3220 { &hf_gvcp_manufacturer_specific_info
,
3221 { "Manufacturer Specific Info", "gvcp.bootstrap.manufacturerspecificinfo",
3222 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
3225 /* GVCP_SERIAL_NUMBER */
3227 { &hf_gvcp_serial_number
,
3228 { "Serial Number", "gvcp.bootstrap.serialnumber",
3229 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
3232 /* GVCP_USER_DEFINED_NAME */
3234 { &hf_gvcp_user_defined_name
,
3235 { "User-defined Name", "gvcp.bootstrap.userdefinedname",
3236 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
3239 /* GVCP_FIRST_URL */
3241 { &hf_gvcp_first_xml_device_description_file
,
3242 { "First URL", "gvcp.bootstrap.firsturl",
3243 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
3246 /* GVCP_SECOND_URL */
3248 { &hf_gvcp_second_xml_device_description_file
,
3249 { "Second URL", "gvcp.bootstrap.secondurl",
3250 FT_STRINGZ
, BASE_NONE
, NULL
, 0x0,
3253 /* GVCP_NUMBER_OF_NETWORK_INTERFACES */
3255 { &hf_gvcp_number_interfaces
,
3256 { "Number of Network Interfaces", "gvcp.bootstrap.numberofnetworminterfaces",
3257 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3261 /* GVCP_PERSISTENT_IP_ADDRESS_0, 1, 2, 3 */
3263 { &hf_gvcp_persistent_ip
,
3264 { "Persistent IP", "gvcp.bootstrap.persistentip",
3265 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
3269 /* GVCP_PERSISTENT_SUBNET_MASK_0, 1, 2, 3 */
3271 { &hf_gvcp_persistent_subnet
,
3272 { "Persistent Subnet Mask", "gvcp.bootstrap.persistentsubnetmask",
3273 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
3277 /* GVCP_PERSISTENT_DEFAULT_GATEWAY_0, 1, 2, 3 */
3279 { &hf_gvcp_persistent_gateway
,
3280 { "Persistent GateWay", "gvcp.bootstrap.persistentgateway",
3281 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
3285 /* GVCP_LINK_SPEED_0, 1, 2, 3 */
3287 { &hf_gvcp_link_speed
,
3288 { "Link Speed (in Mbs)", "gvcp.bootstrap.linkspeed",
3289 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3293 /* GVCP_NUMBER_OF_MESSAGE_CHANNELS */
3295 { &hf_gvcp_number_message_channels
,
3296 { "Number of Message Channels", "gvcp.bootstrap.numberofmessagechannels",
3297 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3301 /* GVCP_NUMBER_OF_STREAM_CHANNELS */
3303 { &hf_gvcp_number_stream_channels
,
3304 { "Number of Stream Channels", "gvcp.bootstrap.numberofstreamchannels",
3305 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3309 /* GVCP_NUMBER_OF_ACTION_SIGNALS */
3311 { &hf_gvcp_number_action_signals
,
3312 { "Number of Action Signals", "gvcp.bootstrap.numberofactionsignals",
3313 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3317 /* GVCP_NUMBER_OF_ACTIVE_LINKS */
3319 { &hf_gvcp_number_of_active_links_v2_0
,
3320 { "Number of Active Links", "gvcp.bootstrap.numberofactivelinks",
3321 FT_UINT32
, BASE_DEC
, NULL
, 0x0000000F,
3325 /* GVCP_IEEE_1588_SELECTED_PROFILE */
3327 { &hf_gvcp_selected_ieee1588_profile_v2_1
,
3328 { "IEEE 1588 Selected Profile", "gvcp.bootstrap.ieee1588selectedprofile",
3329 FT_UINT32
, BASE_DEC
, NULL
, 0x0000001F,
3335 { &hf_gvcp_sccaps_scspx_register_supported
,
3336 { "SCSPx Register Supported", "gvcp.bootstrap.sccaps.scspxregistersupported",
3337 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3341 { &hf_gvcp_sccaps_legacy_16bit_blockid_supported_v2_0
,
3342 { "16 bit Block ID Supported", "gvcp.bootstrap.sccaps.16bitblockidsupported",
3343 FT_BOOLEAN
, 32, NULL
, 0x40000000,
3347 { &hf_gvcp_sccaps_scmbsx_supported_v2_2
,
3348 { "Stream Channel Max. Block Size Supported", "gvcp.bootstrap.sccaps.scmbssupported",
3349 FT_BOOLEAN
, 32, NULL
, 0x20000000,
3353 { &hf_gvcp_sccaps_scebax_supported_v2_2
,
3354 { "Stream Channel Extended Bootstrap Address Supported", "gvcp.bootstrap.sccaps.scebasupported",
3355 FT_BOOLEAN
, 32, NULL
, 0x10000000,
3359 /* GVCP_MESSAGE_CHANNEL_CAPS */
3361 { &hf_gvcp_mcsp_supported
,
3362 { "MCSP Supported", "gvcp.bootstrap.mccaps.mcspsupported",
3363 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3367 { &hf_gvcp_mccfg_supported_v2_2
,
3368 { "MCCFG Supported", "gvcp.bootstrap.mccaps.mccfgsupported",
3369 FT_BOOLEAN
, 32, NULL
, 0x40000000,
3373 { &hf_gvcp_mcec_supported_v2_2
,
3374 { "MCEC Supported", "gvcp.bootstrap.mccaps.mcecsupported",
3375 FT_BOOLEAN
, 32, NULL
, 0x20000000,
3379 /* GVCP_IEEE_1588_EXTENDED_CAPABILITY */
3381 { &hf_gvcp_ieee1588_profile_registers_present_v2_1
,
3382 { "IEEE 1588 Profile Registers Present", "gvcp.bootstrap.ieee1588extendedcapabilities.profileregisterspresent",
3383 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3387 /* GVCP_IEEE_1588_SUPPORTED_PROFILES */
3389 { &hf_gvcp_ieee1588_ptp_profile_supported_v2_1
,
3390 { "IEEE 1588 PTP Profile Supported", "gvcp.bootstrap.ieee1588supportedprofiles.ptp",
3391 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3395 { &hf_gvcp_ieee1588_802dot1as_profile_supported_v2_1
,
3396 { "IEEE 1588 802.1as Profile Supported", "gvcp.bootstrap.ieee1588supportedprofiles.802dot1as",
3397 FT_BOOLEAN
, 32, NULL
, 0x40000000,
3401 /* GVCP_CAPABILITY */
3403 { &hf_gvcp_capability_user_defined
,
3404 { "User Defined Name Supported", "gvcp.bootstrap.capability.userdefined",
3405 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3409 { &hf_gvcp_capability_serial_number
,
3410 { "Serial Number Supported", "gvcp.bootstrap.capability.serialnumber",
3411 FT_BOOLEAN
, 32, NULL
, 0x40000000,
3415 { &hf_gvcp_capability_heartbeat_disable
,
3416 { "Heartbeat Disable Supported", "gvcp.bootstrap.capability.heartbeatdisabled",
3417 FT_BOOLEAN
, 32, NULL
, 0x20000000,
3421 { &hf_gvcp_capability_link_speed
,
3422 { "Link Speed Supported", "gvcp.bootstrap.capability.linkspeed",
3423 FT_BOOLEAN
, 32, NULL
, 0x10000000,
3427 { &hf_gvcp_capability_ccp_application_portip
,
3428 { "CCP Application Port/IP Supported", "gvcp.bootstrap.capability.ccpapplicationportip",
3429 FT_BOOLEAN
, 32, NULL
, 0x08000000,
3433 { &hf_gvcp_capability_manifest_table
,
3434 { "Manifest Table Supported", "gvcp.bootstrap.capability.manifesttable",
3435 FT_BOOLEAN
, 32, NULL
, 0x04000000,
3439 { &hf_gvcp_capability_test_data
,
3440 { "Test Data Supported", "gvcp.bootstrap.capability.testdata",
3441 FT_BOOLEAN
, 32, NULL
, 0x02000000,
3445 { &hf_gvcp_capability_discovery_ACK_delay
,
3446 { "Discovery ACK Delay Supported", "gvcp.bootstrap.capability.discoveryackdelay",
3447 FT_BOOLEAN
, 32, NULL
, 0x01000000,
3451 { &hf_gvcp_capability_writable_discovery_ACK_delay
,
3452 { "Writable Discovery ACK Delay Supported", "gvcp.bootstrap.capability.writablediscoveryackdelay",
3453 FT_BOOLEAN
, 32, NULL
, 0x00800000,
3457 { &hf_gvcp_capability_extended_status_code_v1_1
,
3458 { "Extended Status Code Supported (v1.1)", "gvcp.bootstrap.capability.extendedstatuscodesupportedv1_1",
3459 FT_BOOLEAN
, 32, NULL
, 0x00400000,
3463 { &hf_gvcp_capability_primary_application_switchover
,
3464 { "Primary Application Switchover Supported", "gvcp.bootstrap.capability.primaryapplicationswitchover",
3465 FT_BOOLEAN
, 32, NULL
, 0x00200000,
3469 { &hf_gvcp_capability_unconditional_action_command
,
3470 { "Unconditional Action Command Supported", "gvcp.bootstrap.capability.unconditionalactioncommand",
3471 FT_BOOLEAN
, 32, NULL
, 0x00100000,
3475 { &hf_gvcp_capability_1588_v2_0
,
3476 { "Capability 1588", "gvcp.bootstrap.capability.ieee1588",
3477 FT_BOOLEAN
, 32, NULL
, 0x00080000,
3481 { &hf_gvcp_capability_extended_status_code_v2_0
,
3482 { "Status Code", "gvcp.bootstrap.capability.pendingextendedstatuscodev2_0",
3483 FT_BOOLEAN
, 32, NULL
, 0x00040000,
3487 { &hf_gvcp_capability_scheduled_action_command_v2_0
,
3488 { "Scheduled Action Command", "gvcp.bootstrap.capability.scheduledactioncommand",
3489 FT_BOOLEAN
, 32, NULL
, 0x00020000,
3493 { &hf_gvcp_capability_ieee1588_extended_capabilities_v2_1
,
3494 { "IEEE1588 Extended Capabilities", "gvcp.bootstrap.capability.ieee1588extendedcapabilities",
3495 FT_BOOLEAN
, 32, NULL
, 0x00010000,
3499 { &hf_gvcp_capability_action_command
,
3500 { "Action Command", "gvcp.bootstrap.capability.actioncommand",
3501 FT_BOOLEAN
, 32, NULL
, 0x00000040,
3505 { &hf_gvcp_capability_pending
,
3506 { "Pending ACK Supported", "gvcp.bootstrap.capability.pendingack",
3507 FT_BOOLEAN
, 32, NULL
, 0x00000020,
3511 { &hf_gvcp_capability_evendata
,
3512 { "Event Data Supported", "gvcp.bootstrap.capability.eventdata",
3513 FT_BOOLEAN
, 32, NULL
, 0x00000010,
3517 { &hf_gvcp_capability_event
,
3518 { "Event Signal Supported", "gvcp.bootstrap.capability.eventsignal",
3519 FT_BOOLEAN
, 32, NULL
, 0x00000008,
3523 { &hf_gvcp_capability_packetresend
,
3524 { "Packet Resend CMD Supported", "gvcp.bootstrap.capability.packetresendcmd",
3525 FT_BOOLEAN
, 32, NULL
, 0x00000004,
3529 { &hf_gvcp_capability_writemem
,
3530 { "WRITEMEM Supported", "gvcp.bootstrap.capability.writemem",
3531 FT_BOOLEAN
, 32, NULL
, 0x00000002,
3535 { &hf_gvcp_capability_concatenation
,
3536 { "Concatenation Supported", "gvcp.bootstrap.capability.concatenation",
3537 FT_BOOLEAN
, 32, NULL
, 0x00000001,
3541 /* GVCP_HEARTBEAT_TIMEOUT */
3543 { &hf_gvcp_heartbeat
,
3544 { "Heartbeat Timeout (in ms)", "gvcp.bootstrap.heartbeattimeout",
3545 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3549 /* GVCP_TIMESTAMP_TICK_FREQUENCY_HIGH */
3551 { &hf_gvcp_high_timestamp_frequency
,
3552 { "Timestamp Tick High Frequency (in Hz)", "gvcp.bootstrap.timestamptickfrequencyhigh",
3553 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3557 /* GVCP_TIMESTAMP_TICK_FREQUENCY_LOW */
3559 { &hf_gvcp_low_timestamp_frequency
,
3560 { "Timestamp Tick Low Frequency (in Hz)", "gvcp.bootstrap.timestamptickfrequencylow",
3561 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3565 /* GVCP_TIMESTAMP_CONTROL */
3567 { &hf_gvcp_timestamp_control_latch
,
3568 { "Timestamp Control Latch", "gvcp.bootstrap.timestampcontrol.latch",
3569 FT_BOOLEAN
, 32, NULL
, 0x00000002,
3573 { &hf_gvcp_timestamp_control_reset
,
3574 { "Timestamp Control Reset", "gvcp.bootstrap.timestampcontrol.reset",
3575 FT_BOOLEAN
, 32, NULL
, 0x00000001,
3579 /* GVCP_TIMESTAMP_VALUE_HIGH */
3581 { &hf_gvcp_high_timestamp_value
,
3582 { "Timestamp Value High", "gvcp.bootstrap.timestampvaluehigh",
3583 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3587 /* GVCP_TIMESTAMP_VALUE_LOW */
3589 { &hf_gvcp_low_timestamp_value
,
3590 { "Timestamp Value Low", "gvcp.bootstrap.timestampvaluelow",
3591 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3595 /* GVCP_DISCOVERY_ACK_DELAY */
3597 { &hf_gvcp_discovery_ACK_delay
,
3598 { "Discovery ACK Delay (in ms)", "gvcp.bootstrap.discoveryackdelay",
3599 FT_UINT32
, BASE_DEC
, NULL
, 0x0000FFFF,
3603 /* GVCP_CONFIGURATION */
3605 { &hf_gvcp_configuration_1588_enable_v2_0
,
3606 { "IEEE 1588 Enable", "gvcp.bootstrap.config.ieee1588enable",
3607 FT_BOOLEAN
, 32, NULL
, 0x00080000,
3611 { &hf_gvcp_configuration_extended_status_codes_enable_v2_0
,
3612 { "Status Codes v2.0 Enable", "gvcp.bootstrap.config.statuscodesv2_0enable",
3613 FT_BOOLEAN
, 32, NULL
, 0x00040000,
3617 { &hf_gvcp_configuration_unconditional_action_command_enable_v2_0
,
3618 { "Unconditional Action Command Enable", "gvcp.bootstrap.config.unconditionalactioncommandenable",
3619 FT_BOOLEAN
, 32, NULL
, 0x00000008,
3623 { &hf_gvcp_configuration_extended_status_codes_enable_v1_1
,
3624 { "Status Codes v1.1 Enable", "gvcp.bootstrap.config.statuscodesv1_1enable",
3625 FT_BOOLEAN
, 32, NULL
, 0x00000004,
3629 { &hf_gvcp_configuration_pending_ack_enable
,
3630 { "Pending_ACK Enable", "gvcp.bootstrap.config.pendingackenable",
3631 FT_BOOLEAN
, 32, NULL
, 0x00000002,
3635 { &hf_gvcp_configuration_heartbeat_disable
,
3636 { "Heartbeat Disable", "gvcp.bootstrap.config.heartbeatdisable",
3637 FT_BOOLEAN
, 32, NULL
, 0x00000001,
3641 /* GVCP_PENDING_TIMEOUT */
3643 { &hf_gvcp_pending_timeout_max_execution
,
3644 { "Pending Timeout (in ms)", "gvcp.bootstrap.pending.timeout",
3645 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3649 /* GVCP_CONTROL_SWITCHOVER_KEY */
3651 { &hf_gvcp_control_switchover_key_register
,
3652 { "Control Switchover Key", "gvcp.bootstrap.controlswitchoverkey",
3653 FT_UINT32
, BASE_DEC
, NULL
, 0x0000FFFF,
3657 /* GVCP_GVSCP_CONFIGURATION */
3659 { &hf_gvcp_gvsp_configuration_64bit_blockid_enable_v2_0
,
3660 { "GVSP Configuration 64 bit Block ID", "gvcp.bootstrap.gvcspconfig.64bitblockidenable",
3661 FT_BOOLEAN
, 32, NULL
, 0x40000000,
3665 /* GVCP_PHYSICAL_LINK_CAPABILITY, GVCP_PHYSICAL_LINK_CONFIGURATION */
3667 { &hf_gvcp_link_dlag_v2_0
,
3668 { "Link dLAG", "gvcp.bootstrap.link.dlag",
3669 FT_BOOLEAN
, 32, NULL
, 0x00000008,
3673 { &hf_gvcp_link_slag_v2_0
,
3674 { "Link sLAG", "gvcp.bootstrap.link.slag",
3675 FT_BOOLEAN
, 32, NULL
, 0x00000004,
3679 { &hf_gvcp_link_ml_v2_0
,
3680 { "Link ML", "gvcp.bootstrap.link.ml",
3681 FT_BOOLEAN
, 32, NULL
, 0x00000002,
3685 { &hf_gvcp_link_sl_v2_0
,
3686 { "Link SL", "gvcp.bootstrap.link.sl",
3687 FT_BOOLEAN
, 32, NULL
, 0x00000001,
3691 /* GVCP_IEEE_1588_STATUS */
3693 { &hf_gvcp_ieee1588_clock_status_v2_0
,
3694 { "IEEE 1588 Clock Status", "gvcp.bootstrap.ieee1588.clockstatus",
3695 FT_UINT32
, BASE_HEX
, NULL
, 0x0000000F,
3699 /* GVCP_SCHEDULED_ACTION_COMMAND_QUEUE_SIZE */
3701 { &hf_gvcp_scheduled_action_command_queue_size_v2_0
,
3702 { "Scheduled Action Command Queue Size", "gvcp.bootstrap.scheduledactioncommandqueuesize",
3703 FT_UINT32
, BASE_DEC
, NULL
, 0,
3709 { &hf_gvcp_control_switchover_key
,
3710 { "Control Switchover Key", "gvcp.bootstrap.control.switchoverkey",
3711 FT_UINT32
, BASE_HEX
, NULL
, 0xFFFF0000,
3715 { &hf_gvcp_control_switchover_en
,
3716 { "Control Switchover Enable", "gvcp.bootstrap.control.switchoverenable",
3717 FT_BOOLEAN
, 32, NULL
, 0x00000004,
3721 { &hf_gvcp_control_access
,
3722 { "Control Access", "gvcp.bootstrap.control.controlaccess",
3723 FT_BOOLEAN
, 32, NULL
, 0x00000002,
3727 { &hf_gvcp_exclusive_access
,
3728 { "Exclusive Access", "gvcp.bootstrap.control.exclusiveaccess",
3729 FT_BOOLEAN
, 32, NULL
, 0x00000001,
3733 /* GVCP_PRIMARY_APPLICATION_PORT */
3735 { &hf_gvcp_primary_application_host_port
,
3736 { "Primary Application Port", "gvcp.bootstrap.primaryapplicationport",
3737 FT_UINT32
, BASE_DEC
, NULL
, 0x0000FFFF,
3741 /* GVCP_PRIMARY_APPLICATION_IP_ADDRESS */
3743 { &hf_gvcp_primary_application_ip_address
,
3744 { "Primary Application IP Address", "gvcp.bootstrap.primaryapplicationipaddress",
3745 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
3749 /* GVCP_MC_DESTINATION_PORT */
3751 { &hf_gvcp_network_interface_index
,
3752 { "Network Interface Index", "gvcp.bootstrap.mcp.networkinterfaceindex",
3753 FT_UINT32
, BASE_DEC
, NULL
, 0x000F0000,
3757 { &hf_gvcp_host_port
,
3758 { "Host Port", "gvcp.bootstrap.mcp.hostport",
3759 FT_UINT32
, BASE_DEC
, NULL
, 0x0000FFFF,
3763 /* GVCP_MC_DESTINATION_ADDRESS */
3765 { &hf_gvcp_channel_destination_ip
,
3766 { "Destination IP Address", "gvcp.bootstrap.mcda",
3767 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
3771 /* GVCP_MC_TIMEOUT */
3773 { &hf_gvcp_message_channel_transmission_timeout
,
3774 { "Transmission Timeout (in ms)", "gvcp.bootstrap.mctt",
3775 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3779 /* GVCP_MC_RETRY_COUNT */
3781 { &hf_gvcp_message_channel_retry_count
,
3782 { "Retry Count", "gvcp.bootstrap.mcrc",
3783 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3787 /* GVCP_MC_SOURCE_PORT */
3789 { &hf_gvcp_message_channel_source_port
,
3790 { "Source Port", "gvcp.bootstrap.mcsp",
3791 FT_UINT32
, BASE_DEC
, NULL
, 0x0000FFFF,
3795 /* GVCP_MC_CONFIGURATION */
3797 { &hf_gvcp_mcec_enabled_v2_2
,
3798 { "MCEC Enabled", "gvcp.bootstrap.mcconfig.mcecenabled",
3799 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3803 /* GVCP_SC_DESTINATION_PORT(0), 1, 2, 3 */
3805 { &hf_gvcp_sc_direction
,
3806 { "Direction", "gvcp.bootstrap.scpx.direction",
3807 FT_BOOLEAN
, 32, TFS(&directionnames
), 0x80000000,
3811 { &hf_gvcp_sc_ni_index
,
3812 { "Network Interface Index", "gvcp.bootstrap.scpx.networkinterfaceindex",
3813 FT_UINT32
, BASE_DEC
, NULL
, 0x000F0000,
3817 { &hf_gvcp_sc_host_port
,
3818 { "Host Port", "gvcp.bootstrap.scpx.hostport",
3819 FT_UINT32
, BASE_DEC
, NULL
, 0x0000FFFF,
3823 /* GVCP_SC_PACKET_SIZE(0), 1, 2, 3 */
3825 { &hf_gvcp_sc_fire_test_packet
,
3826 { "Fire Test Packet", "gvcp.bootstrap.scpsx.firetestpacket",
3827 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3831 { &hf_gvcp_sc_do_not_fragment
,
3832 { "Do Not Fragment", "gvcp.bootstrap.scpsx.donotfragment",
3833 FT_BOOLEAN
, 32, NULL
, 0x40000000,
3837 { &hf_gvcp_sc_pixel_endianness
,
3838 { "Pixel Endianness", "gvcp.bootstrap.scpsx.pixelendianness",
3839 FT_BOOLEAN
, 32, NULL
, 0x20000000,
3843 { &hf_gvcp_sc_packet_size
,
3844 { "Packet Size", "gvcp.bootstrap.scpsx.packetsize",
3845 FT_UINT32
, BASE_DEC
, NULL
, 0x0000FFFF,
3849 /* GVCP_SC_PACKET_DELAY(0), 1, 2, 3 */
3851 { &hf_gvcp_sc_packet_delay
,
3852 { "Packet Delay", "gvcp.bootstrap.scpdx",
3853 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3857 /* GVCP_SC_DESTINATION_ADDRESS(0), 1, 2, 3 */
3859 { &hf_gvcp_sc_destination_ip
,
3860 { "Destination Address", "gvcp.bootstrap.scdax",
3861 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
3865 /* GVCP_SC_SOURCE_PORT(0), 1, 2, 3 */
3867 { &hf_gvcp_sc_source_port
,
3868 { "Source Port", "gvcp.bootstrap.scspx",
3869 FT_UINT32
, BASE_DEC
, NULL
, 0x0000FFFF,
3873 /* GVCP_SC_CAPABILITY(0), 1, 2, 3 */
3875 { &hf_gvcp_sc_big_little_endian_supported
,
3876 { "Big/Little Endian Supported", "gvcp.bootstrap.sccx.biglittleendiansupported",
3877 FT_BOOLEAN
, 32, NULL
, 0x80000000,
3881 { &hf_gvcp_sc_ip_reassembly_supported
,
3882 { "IP Reassembly Supported", "gvcp.bootstrap.sccx.ipreassemblysupported",
3883 FT_BOOLEAN
, 32, NULL
, 0x40000000,
3887 { &hf_gvcp_sc_scmpcx_supported_v2_2
,
3888 { "Stream Channel Maximum Packet Count Supported", "gvcp.bootstrap.sccx.scmpcxsupported",
3889 FT_BOOLEAN
, 32, NULL
, 0x00000100,
3893 { &hf_gvcp_sc_gendc_supported_v2_2
,
3894 { "GenDC Supported", "gvcp.bootstrap.sccx.gendcsupported",
3895 FT_BOOLEAN
, 32, NULL
, 0x00000080,
3899 { &hf_gvcp_sc_multi_part_supported_v2_1
,
3900 { "Multi-part Supported", "gvcp.bootstrap.sccx.multipartsupported",
3901 FT_BOOLEAN
, 32, NULL
, 0x00000040,
3905 { &hf_gvcp_sc_large_leader_trailer_supported_v2_1
,
3906 { "Large Leader/Trailer Supported", "gvcp.bootstrap.sccx.largeleadertrailersupported",
3907 FT_BOOLEAN
, 32, NULL
, 0x00000020,
3911 { &hf_gvcp_sc_multizone_supported_v2_0
,
3912 { "Multi-zone Supported", "gvcp.bootstrap.sccx.multizonesupported",
3913 FT_BOOLEAN
, 32, NULL
, 0x00000010,
3917 { &hf_gvcp_sc_packet_resend_destination_option_supported_v2_0
,
3918 { "Resend Destination Option Supported", "gvcp.bootstrap.sccx.resenddestinationoptionsupported",
3919 FT_BOOLEAN
, 32, NULL
, 0x00000008,
3923 { &hf_gvcp_sc_packet_resend_all_in_transmission_supported_v2_0
,
3924 { "All In Transmission Supported", "gvcp.bootstrap.sccx.allintransmissionsupported",
3925 FT_BOOLEAN
, 32, NULL
, 0x00000004,
3929 { &hf_gvcp_sc_unconditional_streaming_supported
,
3930 { "Unconditional Streaming Supported", "gvcp.bootstrap.sccx.unconditionalstreamingsupported",
3931 FT_BOOLEAN
, 32, NULL
, 0x00000002,
3935 { &hf_gvcp_sc_extended_chunk_data_supported
,
3936 { "Extended Chunk Data Supported", "gvcp.bootstrap.sccx.extendedchunkdatasupported",
3937 FT_BOOLEAN
, 32, NULL
, 0x00000001,
3941 /* GVCP_SC_CONFIGURATION(0), 1, 2, 3 */
3943 { &hf_gvcp_sc_gendc_enabled_v2_2
,
3944 { "GenDC Enabled", "gvcp.bootstrap.sccfgx.gendcenabled",
3945 FT_BOOLEAN
, 32, NULL
, 0x00000080,
3949 { &hf_gvcp_sc_multi_part_enabled_v2_1
,
3950 { "Multi-part Enabled", "gvcp.bootstrap.sccfgx.multipartenabled",
3951 FT_BOOLEAN
, 32, NULL
, 0x00000040,
3955 { &hf_gvcp_sc_large_leader_trailer_enabled_v2_1
,
3956 { "Large Leader/Trailer Enabled", "gvcp.bootstrap.sccfgx.largeleadertrailerenabled",
3957 FT_BOOLEAN
, 32, NULL
, 0x00000020,
3961 { &hf_gvcp_sc_packet_resend_destination_option_enabled_v2_0
,
3962 { "Resend Destination Option Enabled", "gvcp.bootstrap.sccfgx.resenddestinationoptionenabled",
3963 FT_BOOLEAN
, 32, NULL
, 0x00000008,
3967 { &hf_gvcp_sc_packet_resend_all_in_transmission_enabled_v2_0
,
3968 { "All In Transmission Enabled", "gvcp.bootstrap.sccfgx.allintransmissionenabled",
3969 FT_BOOLEAN
, 32, NULL
, 0x00000004,
3973 { &hf_gvcp_sc_unconditional_streaming_enabled
,
3974 { "Unconditional Streaming Enabled", "gvcp.bootstrap.sccfgx.unconditionalstreamingenabled",
3975 FT_BOOLEAN
, 32, NULL
, 0x00000002,
3979 { &hf_gvcp_sc_extended_chunk_data_enabled
,
3980 { "Extended Chunk Data Enabled", "gvcp.bootstrap.sccfgx.extendedchunkdataenabled",
3981 FT_BOOLEAN
, 32, NULL
, 0x00000001,
3985 /* GVCP_SC_ZONE(0), 1, 2, 3 */
3987 { &hf_gvcp_sc_additional_zones_v2_0
,
3988 { "Additional Zones", "gvcp.bootstrap.sczx.additionalzones",
3989 FT_UINT32
, BASE_DEC
, NULL
, 0x0000000F,
3993 /* GVCP_SC_ZONE_DIRECTION(0), 1, 2, 3 */
3995 { &hf_gvcp_sc_zone0_direction_v2_0
,
3996 { "Zone 0 Direction", "gvcp.bootstrap.sczdx.zone0direction",
3997 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x80000000,
4001 { &hf_gvcp_sc_zone1_direction_v2_0
,
4002 { "Zone 1 Direction", "gvcp.bootstrap.sczdx.zone1direction",
4003 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x40000000,
4007 { &hf_gvcp_sc_zone2_direction_v2_0
,
4008 { "Zone 2 Direction", "gvcp.bootstrap.sczdx.zone2direction",
4009 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x20000000,
4013 { &hf_gvcp_sc_zone3_direction_v2_0
,
4014 { "Zone 3 Direction", "gvcp.bootstrap.sczdx.zone3direction",
4015 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x10000000,
4019 { &hf_gvcp_sc_zone4_direction_v2_0
,
4020 { "Zone 4 Direction", "gvcp.bootstrap.sczdx.zone4direction",
4021 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x08000000,
4025 { &hf_gvcp_sc_zone5_direction_v2_0
,
4026 { "Zone 5 Direction", "gvcp.bootstrap.sczdx.zone5direction",
4027 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x04000000,
4031 { &hf_gvcp_sc_zone6_direction_v2_0
,
4032 { "Zone 6 Direction", "gvcp.bootstrap.sczdx.zone6direction",
4033 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x02000000,
4037 { &hf_gvcp_sc_zone7_direction_v2_0
,
4038 { "Zone 7 Direction", "gvcp.bootstrap.sczdx.zone7direction",
4039 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x01000000,
4043 { &hf_gvcp_sc_zone8_direction_v2_0
,
4044 { "Zone 8 Direction", "gvcp.bootstrap.sczdx.zone8direction",
4045 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00800000,
4049 { &hf_gvcp_sc_zone9_direction_v2_0
,
4050 { "Zone 9 Direction", "gvcp.bootstrap.sczdx.zone9direction",
4051 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00400000,
4055 { &hf_gvcp_sc_zone10_direction_v2_0
,
4056 { "Zone 10 Direction", "gvcp.bootstrap.sczdx.zone10direction",
4057 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00200000,
4061 { &hf_gvcp_sc_zone11_direction_v2_0
,
4062 { "Zone 11 Direction", "gvcp.bootstrap.sczdx.zone11direction",
4063 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00100000,
4067 { &hf_gvcp_sc_zone12_direction_v2_0
,
4068 { "Zone 12 Direction", "gvcp.bootstrap.sczdx.zone12direction",
4069 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00080000,
4073 { &hf_gvcp_sc_zone13_direction_v2_0
,
4074 { "Zone 13 Direction", "gvcp.bootstrap.sczdx.zone13direction",
4075 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00040000,
4079 { &hf_gvcp_sc_zone14_direction_v2_0
,
4080 { "Zone 14 Direction", "gvcp.bootstrap.sczdx.zone14direction",
4081 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00020000,
4085 { &hf_gvcp_sc_zone15_direction_v2_0
,
4086 { "Zone 15 Direction", "gvcp.bootstrap.sczdx.zone15direction",
4087 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00010000,
4091 { &hf_gvcp_sc_zone16_direction_v2_0
,
4092 { "Zone 16 Direction", "gvcp.bootstrap.sczdx.zone16direction",
4093 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00008000,
4097 { &hf_gvcp_sc_zone17_direction_v2_0
,
4098 { "Zone 17 Direction", "gvcp.bootstrap.sczdx.zone17direction",
4099 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00004000,
4103 { &hf_gvcp_sc_zone18_direction_v2_0
,
4104 { "Zone 18 Direction", "gvcp.bootstrap.sczdx.zone18direction",
4105 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00002000,
4109 { &hf_gvcp_sc_zone19_direction_v2_0
,
4110 { "Zone 19 Direction", "gvcp.bootstrap.sczdx.zone19direction",
4111 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00001000,
4115 { &hf_gvcp_sc_zone20_direction_v2_0
,
4116 { "Zone 20 Direction", "gvcp.bootstrap.sczdx.zone20direction",
4117 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000800,
4121 { &hf_gvcp_sc_zone21_direction_v2_0
,
4122 { "Zone 21 Direction", "gvcp.bootstrap.sczdx.zone21direction",
4123 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000400,
4127 { &hf_gvcp_sc_zone22_direction_v2_0
,
4128 { "Zone 22 Direction", "gvcp.bootstrap.sczdx.zone22direction",
4129 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000200,
4133 { &hf_gvcp_sc_zone23_direction_v2_0
,
4134 { "Zone 23 Direction", "gvcp.bootstrap.sczdx.zone23direction",
4135 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000100,
4139 { &hf_gvcp_sc_zone24_direction_v2_0
,
4140 { "Zone 24 Direction", "gvcp.bootstrap.sczdx.zone24direction",
4141 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000080,
4145 { &hf_gvcp_sc_zone25_direction_v2_0
,
4146 { "Zone 25 Direction", "gvcp.bootstrap.sczdx.zone25direction",
4147 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000040,
4151 { &hf_gvcp_sc_zone26_direction_v2_0
,
4152 { "Zone 26 Direction", "gvcp.bootstrap.sczdx.zone26direction",
4153 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000020,
4157 { &hf_gvcp_sc_zone27_direction_v2_0
,
4158 { "Zone 27 Direction", "gvcp.bootstrap.sczdx.zone27direction",
4159 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000010,
4163 { &hf_gvcp_sc_zone28_direction_v2_0
,
4164 { "Zone 28 Direction", "gvcp.bootstrap.sczdx.zone28direction",
4165 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000008,
4169 { &hf_gvcp_sc_zone29_direction_v2_0
,
4170 { "Zone 29 Direction", "gvcp.bootstrap.sczdx.zone29direction",
4171 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000004,
4175 { &hf_gvcp_sc_zone30_direction_v2_0
,
4176 { "Zone 30 Direction", "gvcp.bootstrap.sczdx.zone30direction",
4177 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000002,
4181 { &hf_gvcp_sc_zone31_direction_v2_0
,
4182 { "Zone 31 Direction", "gvcp.bootstrap.sczdx.zone31direction",
4183 FT_BOOLEAN
, 32, TFS(&zonedirectionnames
), 0x00000001,
4187 /* GVCP_SC_MAX_PACKET_COUNT(0), 1, 2, 3 */
4189 { &hf_gvcp_sc_max_packet_count_v2_2
,
4190 { "Max. Packet Count", "gvcp.bootstrap.scmpcx.maxpacketcount",
4191 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
4195 /* GVCP_SC_MAX_BLOCK_SIZE_HIGH(0), 1, 2, 3 */
4197 { &hf_gvcp_sc_max_block_size_high_v2_2
,
4198 { "Max. Block Size (High)", "gvcp.bootstrap.maxblocksizehigh",
4199 FT_UINT32
, BASE_DEC_HEX
, NULL
, 0x0,
4203 /* GVCP_SC_MAX_BLOCK_SIZE_LOW(0), 1, 2, 3 */
4205 { &hf_gvcp_sc_max_block_size_low_v2_2
,
4206 { "Max. Payload Size (Low)", "gvcp.bootstrap.maxblocksizelow",
4207 FT_UINT32
, BASE_DEC_HEX
, NULL
, 0x0,
4211 /* GVCP_SC_EXTENDED_BOOTSTRAP_ADDRESS(0), 1, 2, 3 */
4213 { &hf_gvcp_sc_extended_registers_address_v2_2
,
4214 { "Stream Channel Extended Bootstrap Address", "gvcp.bootstrap.extendedbootstrapaddress",
4215 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4219 /* GVCP_SC_GENDC_DESCRIPTOR_ADDRESS(0), 1, 2, 3 */
4221 { &hf_gvcp_sc_gendc_descriptor_address_v2_2
,
4222 { "Stream Channel GenDC Descriptor Address", "gvcp.bootstrap.gendc.descriptoraddress",
4223 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4227 /* GVCP_SC_GENDC_DESCRIPTOR_SIZE(0), 1, 2, 3 */
4229 { &hf_gvcp_sc_gendc_descriptor_size_v2_2
,
4230 { "Stream Channel GenDC Descriptor Size", "gvcp.bootstrap.gedc.descriptorsize",
4231 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4235 /* GVCP_SC_GENDC_FLOW_MAPPING_TABLE_ADDRESS(0), 1, 2, 3 */
4237 { &hf_gvcp_sc_gendc_flow_mapping_table_address_v2_2
,
4238 { "Stream Channel GenDC Flow Mapping Table Address", "gvcp.bootstrap.gendc.flowmappingtableaddress",
4239 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4243 /* GVCP_SC_GENDC_FLOW_MAPPING_TABLE_SIZE(0), 1, 2, 3 */
4245 { &hf_gvcp_sc_gendc_flow_mapping_table_size_v2_2
,
4246 { "Stream Channel GenDC Flow Mapping Table Size", "gvcp.bootstrap.gendc.flowmappingtablesize",
4247 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4251 /* GVCP_ACTION_GROUP_KEY(0), 1, 2, 3, 4, 5, 6, 7, 8, 9 */
4253 { &hf_gvcp_action_group_key
,
4254 { "Action Group Key", "gvcp.bootstrap.actiongroupkey",
4255 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
4259 /* GVCP_ACTION_GROUP_MASK(0), 1, 2, 3, 4, 5, 6, 7, 8, 9 */
4261 { &hf_gvcp_action_group_mask
,
4262 { "Action Group Mask", "gvcp.bootstrap.actiongroupmask",
4263 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4268 { "Latency Value (in us)", "gvcp.bootstrap.latency",
4269 FT_UINT32, BASE_DEC, NULL, 0x0,
4273 { &hf_gvcp_custom_register_addr
,
4274 { "Custom Register Address", "gvcp.bootstrap.custom.register.write",
4275 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4279 { &hf_gvcp_custom_memory_addr
,
4280 { "Custom Memory Address", "gvcp.bootstrap.custom.memory.write",
4281 FT_UINT32
, BASE_HEX
, NULL
, 0x0,
4285 /* Request/Response tracking */
4286 { &hf_gvcp_response_in
,
4287 { "Response In", "gvcp.response_in",
4288 FT_FRAMENUM
, BASE_NONE
, FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE
), 0x0,
4289 "The response to this GVCP request is in this frame", HFILL
4292 { &hf_gvcp_response_to
,
4293 { "Request In", "gvcp.response_to",
4294 FT_FRAMENUM
, BASE_NONE
, FRAMENUM_TYPE(FT_FRAMENUM_REQUEST
), 0x0,
4295 "This is a response to the GVCP request in this frame", HFILL
4298 /* Generated from convert_proto_tree_add_text.pl */
4299 { &hf_gvcp_reserved_bit
, { "Reserved Bit", "gvcp.reserved_bit", FT_BYTES
, BASE_NONE
, NULL
, 0x0, NULL
, HFILL
}},
4300 { &hf_gvcp_manifest_table
, { "Manifest Table", "gvcp.manifest_table", FT_BYTES
, BASE_NONE
, NULL
, 0x0, NULL
, HFILL
}},
4301 { &hf_gvcp_custom_register_value
, { "Value", "gvcp.bootstrap.custom.register.value", FT_UINT32
, BASE_HEX
, NULL
, 0x0, NULL
, HFILL
}},
4302 { &hf_gvcp_custom_read_register_addr
, { "Custom Register Address", "gvcp.bootstrap.custom.register.read", FT_UINT32
, BASE_HEX
, NULL
, 0x0, NULL
, HFILL
}},
4303 { &hf_gvcp_custom_read_register_value
, { "Custom Register Value", "gvcp.bootstrap.custom.register.read_value", FT_UINT32
, BASE_HEX
, NULL
, 0x0, NULL
, HFILL
}},
4304 { &hf_gvcp_readmemcmd_data_read
, { "Data read", "gvcp.cmd.readmem.data", FT_BYTES
, BASE_NONE
, NULL
, 0x0, NULL
, HFILL
}},
4307 static int *ett
[] = {
4312 &ett_gvcp_payload_cmd
,
4313 &ett_gvcp_payload_ack
,
4314 &ett_gvcp_payload_ack_subtree
,
4315 &ett_gvcp_payload_cmd_subtree
,
4316 &ett_gvcp_bootstrap_fields
4319 proto_gvcp
= proto_register_protocol("GigE Vision Control Protocol", "GVCP", "gvcp");
4321 gvcp_handle
= register_dissector("gvcp", dissect_gvcp
, proto_gvcp
);
4323 proto_register_field_array(proto_gvcp
, hf
, array_length(hf
));
4324 proto_register_subtree_array(ett
, array_length(ett
));
4327 /* The registration hand-off routing */
4329 void proto_reg_handoff_gvcp(void)
4331 dissector_add_uint("udp.port", global_gvcp_port
, gvcp_handle
);
4332 gvsp_handle
= find_dissector("gvsp");
4336 * Editor modelines - https://www.wireshark.org/tools/modelines.html
4341 * indent-tabs-mode: t
4344 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
4345 * :indentSize=8:tabSize=8:noTabs=false: