Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-gvcp.c
blob0a09a2e5da6fca99976ea36379b4639b6ceb3333
1 /* packet-gvcp.c
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
7 * Protocol.
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
16 #include "config.h"
18 #include <epan/packet.h>
19 #include <epan/conversation.h>
20 #include <epan/tfs.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 {
36 uint32_t req_frame;
37 uint32_t rep_frame;
38 wmem_array_t *addr_list;
39 uint32_t addr_count;
40 } gvcp_transaction_t;
42 wmem_array_t* gvcp_trans_array;
45 structure to hold persistent info for each conversation
47 typedef struct _gvcp_conv_info_t {
48 wmem_map_t *pdus;
49 uint32_t extended_bootstrap_address[GVCP_MAX_STREAM_CHANNEL_COUNT];
50 } gvcp_conv_info_t;
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)
201 GVCP statuses
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)
233 Device modes
236 #define GEV_DEVICEMODE_TRANSMITTER (0x00 )
237 #define GEV_DEVICEMODE_RECEIVER (0x01)
238 #define GEV_DEVICEMODE_TRANSCEIVER (0x02)
239 #define GEV_DEVICEMODE_PERIPHERAL (0x03)
243 Event IDs
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)
258 Link configurations
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*/
524 static int ett_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;
537 /*Device Mode*/
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" },
543 { 0, NULL },
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" },
552 { 0, NULL },
555 static const value_string devicemodenames_characterset[] = {
556 { 0x02, "ASCII" },
557 { 0x01, "UTF-8 Character Set" },
558 { 0x00, "Reserved" },
559 { 0, NULL },
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" },
573 { 0, NULL }
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" },
588 { 0, NULL },
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" },
601 { 0, NULL },
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" },
631 { 0, NULL },
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) " },
661 { 0, NULL },
664 static const true_false_string directionnames = {
665 "Receiver",
666 "Transmitter"
669 static const true_false_string zonedirectionnames = {
670 "Bottom-Up",
671 "Top-Down"
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]" },
841 { 0, NULL },
846 brief Extended Register name to address mappings
849 /* GEV 2.2 */
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)]" },
855 { 0, NULL },
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];
876 return true;
879 return false;
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);
897 if (!address_string)
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);
905 if (!address_string)
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)
925 switch (addr)
927 case GVCP_VERSION:
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);
930 break;
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);
937 break;
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);
944 break;
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);
951 break;
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);
962 break;
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);
973 break;
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);
980 break;
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);
987 break;
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);
994 break;
996 case GVCP_MANUFACTURER_NAME:
997 proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */
998 break;
1000 case GVCP_MODEL_NAME:
1001 proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */
1002 break;
1004 case GVCP_DEVICE_VERSION:
1005 proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */
1006 break;
1008 case GVCP_MANUFACTURER_INFO:
1009 proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */
1010 break;
1012 case GVCP_SERIAL_NUMBER:
1013 proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */
1014 break;
1016 case GVCP_USER_DEFINED_NAME:
1017 proto_tree_add_item(branch, hf_gvcp_user_defined_name, tvb, offset, 4, ENC_ASCII); /*? */
1018 break;
1020 case GVCP_FIRST_URL:
1021 proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */
1022 break;
1024 case GVCP_SECOND_URL:
1025 proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */
1026 break;
1028 case GVCP_NUMBER_OF_NETWORK_INTERFACES:
1029 proto_tree_add_item(branch, hf_gvcp_number_interfaces, tvb, offset, 4, ENC_BIG_ENDIAN);
1030 break;
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);
1037 break;
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);
1044 break;
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);
1051 break;
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);
1058 break;
1060 case GVCP_NUMBER_OF_MESSAGE_CHANNELS:
1061 proto_tree_add_item(branch, hf_gvcp_number_message_channels, tvb, offset, 4, ENC_BIG_ENDIAN);
1062 break;
1064 case GVCP_NUMBER_OF_STREAM_CHANNELS:
1065 proto_tree_add_item(branch, hf_gvcp_number_stream_channels, tvb, offset, 4, ENC_BIG_ENDIAN);
1066 break;
1068 case GVCP_NUMBER_OF_ACTION_SIGNALS:
1069 proto_tree_add_item(branch, hf_gvcp_number_action_signals, tvb, offset, 4, ENC_BIG_ENDIAN);
1070 break;
1072 case GVCP_ACTION_DEVICE_KEY:
1073 proto_tree_add_item(branch, hf_gvcp_writeregcmd_data, tvb, offset, 4, ENC_BIG_ENDIAN); /*? */
1074 break;
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);
1078 break;
1080 case GVCP_SC_CAPS:
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);
1085 break;
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);
1091 break;
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);
1117 break;
1119 case GVCP_HEARTBEAT_TIMEOUT:
1120 proto_tree_add_item(branch, hf_gvcp_heartbeat, tvb, offset, 4, ENC_BIG_ENDIAN);
1121 break;
1123 case GVCP_TIMESTAMP_TICK_FREQUENCY_HIGH:
1124 proto_tree_add_item(branch, hf_gvcp_high_timestamp_frequency, tvb, offset, 4, ENC_BIG_ENDIAN);
1125 break;
1127 case GVCP_TIMESTAMP_TICK_FREQUENCY_LOW:
1128 proto_tree_add_item(branch, hf_gvcp_low_timestamp_frequency, tvb, offset, 4, ENC_BIG_ENDIAN);
1129 break;
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);
1134 break;
1136 case GVCP_TIMESTAMP_VALUE_HIGH:
1137 proto_tree_add_item(branch, hf_gvcp_high_timestamp_value, tvb, offset, 4, ENC_BIG_ENDIAN);
1138 break;
1140 case GVCP_TIMESTAMP_VALUE_LOW:
1141 proto_tree_add_item(branch, hf_gvcp_low_timestamp_value, tvb, offset, 4, ENC_BIG_ENDIAN);
1142 break;
1144 case GVCP_DISCOVERY_ACK_DELAY:
1145 proto_tree_add_item(branch, hf_gvcp_discovery_ACK_delay, tvb, offset, 4, ENC_BIG_ENDIAN);
1146 break;
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);
1155 break;
1157 case GVCP_PENDING_TIMEOUT:
1158 proto_tree_add_item(branch, hf_gvcp_pending_timeout_max_execution, tvb, offset, 4, ENC_BIG_ENDIAN);
1159 break;
1161 case GVCP_CONTROL_SWITCHOVER_KEY:
1162 proto_tree_add_item(branch, hf_gvcp_control_switchover_key_register, tvb, offset, 4, ENC_BIG_ENDIAN);
1163 break;
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);
1167 break;
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);
1174 break;
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);
1181 break;
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);
1185 break;
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);
1189 break;
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);
1193 break;
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);
1198 break;
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);
1202 break;
1204 case GVCP_CCP:
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);
1209 break;
1211 case GVCP_PRIMARY_APPLICATION_PORT:
1212 proto_tree_add_item(branch, hf_gvcp_primary_application_host_port, tvb, offset, 4, ENC_BIG_ENDIAN);
1213 break;
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);
1217 break;
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);
1222 break;
1224 case GVCP_MC_DESTINATION_ADDRESS:
1225 proto_tree_add_item(branch, hf_gvcp_channel_destination_ip, tvb, offset, 4, ENC_BIG_ENDIAN);
1226 break;
1228 case GVCP_MC_TIMEOUT:
1229 proto_tree_add_item(branch, hf_gvcp_message_channel_transmission_timeout, tvb, offset, 4, ENC_BIG_ENDIAN);
1230 break;
1232 case GVCP_MC_RETRY_COUNT:
1233 proto_tree_add_item(branch, hf_gvcp_message_channel_retry_count, tvb, offset, 4, ENC_BIG_ENDIAN);
1234 break;
1236 case GVCP_MC_SOURCE_PORT:
1237 proto_tree_add_item(branch, hf_gvcp_message_channel_source_port, tvb, offset, 4, ENC_BIG_ENDIAN);
1238 break;
1240 case GVCP_MC_CONFIGURATION:
1241 proto_tree_add_item(branch, hf_gvcp_mcec_enabled_v2_2, tvb, offset, 4, ENC_BIG_ENDIAN);
1242 break;
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);
1251 break;
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);
1261 break;
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);
1268 break;
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):
1275 uint32_t value = 0;
1276 value = tvb_get_letohl(tvb, offset);
1277 proto_tree_add_ipv4(branch, hf_gvcp_sc_destination_ip, tvb, offset, 4, value);
1279 break;
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);
1286 break;
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);
1303 break;
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);
1316 break;
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);
1323 break;
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);
1361 break;
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);
1368 break;
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);
1375 break;
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);
1382 break;
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);
1390 break;
1392 case GVCP_MANIFEST_TABLE:
1393 proto_tree_add_item(branch, hf_gvcp_manifest_table, tvb, 0, length, ENC_NA);
1394 break;
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);
1407 break;
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);
1420 break;
1422 default:
1423 return 0;
1426 return 1;
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_)
1435 switch (addr)
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);
1439 break;
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);
1442 break;
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);
1445 break;
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);
1448 break;
1450 default:
1451 return 0;
1454 return 1;
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)
1461 switch (addr)
1463 case GVCP_MANUFACTURER_NAME:
1464 if (length == 32)
1466 proto_tree_add_item(branch, hf_gvcp_manufacturer_name, tvb, offset, -1, ENC_ASCII);
1468 break;
1470 case GVCP_MODEL_NAME:
1471 if (length == 32)
1473 proto_tree_add_item(branch, hf_gvcp_model_name, tvb, offset, -1, ENC_ASCII);
1475 break;
1477 case GVCP_DEVICE_VERSION:
1478 if (length == 32)
1480 proto_tree_add_item(branch, hf_gvcp_device_version, tvb, offset, -1, ENC_ASCII);
1482 break;
1484 case GVCP_MANUFACTURER_INFO:
1485 if (length == 48)
1487 proto_tree_add_item(branch, hf_gvcp_manufacturer_specific_info, tvb, offset, -1, ENC_ASCII);
1489 break;
1491 case GVCP_SERIAL_NUMBER:
1492 if (length == 16)
1494 proto_tree_add_item(branch, hf_gvcp_serial_number, tvb, offset, -1, ENC_ASCII);
1496 break;
1498 case GVCP_USER_DEFINED_NAME:
1499 if (length == 16)
1501 proto_tree_add_item(branch, hf_gvcp_user_defined_name, tvb, offset, -1, ENC_ASCII);
1503 break;
1505 case GVCP_FIRST_URL:
1506 if (length == 512)
1508 proto_tree_add_item(branch, hf_gvcp_first_xml_device_description_file, tvb, offset, -1, ENC_ASCII);
1510 break;
1512 case GVCP_SECOND_URL:
1513 if (length == 512)
1515 proto_tree_add_item(branch, hf_gvcp_second_xml_device_description_file, tvb, offset, -1, ENC_ASCII);
1517 break;
1519 default:
1520 return 0;
1523 return 1;
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);
1568 else
1570 uint64_t highid;
1571 uint64_t lowid;
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;
1585 else
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);
1611 else
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;
1630 uint32_t addr = 0;
1631 const char* address_string = NULL;
1632 bool is_custom_register = false;
1633 int offset = startoffset;
1634 int i;
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]");
1644 else
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);
1681 else
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);
1688 else
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]");
1698 offset +=4;
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;
1710 int i;
1711 proto_item *item = NULL;
1712 uint32_t addr = 0;
1713 uint32_t value = 0;
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;
1719 if (gvcp_trans)
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]");
1749 else
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 */
1774 offset += 4;
1776 /* Read the value to be written to the specified register address */
1777 dissect_register(addr, subtree, tvb, offset, 4);
1779 else
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 */
1789 offset += 4;
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);
1794 else
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);
1800 offset += 4;
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);
1805 offset += 4;
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)
1817 uint32_t addr = 0;
1818 uint16_t count = 0;
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);
1834 else
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);
1841 else
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;
1860 uint32_t addr = 0;
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)
1876 unsigned offset;
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);
1892 else
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);
1899 else
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)
1915 int32_t eventid;
1916 int offset;
1917 offset = startoffset;
1919 /* Get event ID */
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)
1927 int i;
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;
1936 else
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++)
1951 offset += 2;
1953 /* Get event ID */
1954 eventid = tvb_get_ntohs(tvb, offset);
1956 /* Use range to determine type of event */
1957 if ((eventid >= 0x0000) && (eventid <= 0x8000))
1959 /* Standard ID */
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))
1964 /* Error */
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);
1972 offset += 2;
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);
1976 offset += 2;
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);
1982 offset += 2;
1984 else
1986 offset += 2;
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);
1989 offset += 8;
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);
1994 offset += 8;
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)
2006 int32_t eventid;
2007 int offset;
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? */
2013 /* Get event ID */
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 */
2027 offset += 2;
2029 /* Use range to determine type of event */
2030 if ((eventid >= 0x0000) && (eventid <= 0x8000))
2032 /* Standard ID */
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))
2037 /* Error */
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);
2045 offset += 2;
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);
2049 offset += 2;
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);
2055 offset += 2;
2057 else
2059 offset += 2;
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);
2062 offset += 8;
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);
2067 offset += 8;
2069 if (extendedblockids)
2071 if (data_length > 24)
2073 /* Data */
2074 proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_data, tvb, offset, data_length - 24, ENC_NA);
2075 offset += data_length - 24;
2078 else
2080 /* Data */
2081 proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_data, tvb, offset, -1, ENC_NA);
2082 return;
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)
2096 int offset;
2097 offset = startoffset;
2099 /* Device key */
2100 proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_actioncmd_device_key, tvb, offset, 4, ENC_BIG_ENDIAN);
2102 /* Group key */
2103 proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_actioncmd_group_key, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
2105 /* Group mask */
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;
2124 int offset;
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");
2141 /* Version */
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 );
2146 /* Device mode */
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 );
2151 /* MAC address */
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);
2176 /* Model name */
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);
2185 /* Serial number */
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)
2199 unsigned i;
2200 bool is_custom_register = false;
2201 const char* address_string = NULL;
2202 unsigned num_registers;
2203 int offset;
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)
2212 valid_trans = true;
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]");
2220 else
2222 if (valid_trans)
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);
2230 if (num_registers)
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);
2260 break;
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);
2272 else
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);
2278 else
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);
2284 else
2286 proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_custom_register_value, tvb, offset, 4, ENC_BIG_ENDIAN);
2289 offset += 4;
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);
2311 if (gvcp_trans)
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)"));
2320 else
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)"));
2330 else
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)
2343 if (length > 0)
2345 uint32_t addr = 0;
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;
2358 unsigned offset;
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);
2368 break;
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);
2379 else
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);
2386 else
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_)
2449 int offset = 0;
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;
2454 int command = -1;
2455 const char* command_string = NULL;
2456 int flags = -1;
2457 int extendedblockids = -1;
2458 int scheduledactioncommand = -1;
2459 int ack_code = -1;
2460 const char* ack_string = NULL;
2461 int request_id = 0;
2462 char key_code = 0;
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)
2471 return 0;
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)
2481 return 0;
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);
2509 offset++;
2511 /* Add the flags */
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);
2535 offset++;
2537 /* Add the command */
2538 proto_tree_add_item(gvcp_tree, hf_gvcp_command, tvb, offset, 2, ENC_BIG_ENDIAN);
2539 offset += 2;
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);
2552 offset += 2;
2554 /* Add the acknowledge */
2555 proto_tree_add_item(gvcp_tree, hf_gvcp_acknowledge, tvb, offset, 2, ENC_BIG_ENDIAN);
2557 offset += 2;
2560 /* Parse the second part of both the command and the acknowledge header:
2561 0 15 16 31
2562 -------- -------- -------- --------
2563 | status | acknowledge |
2564 -------- -------- -------- --------
2565 | length | req_id |
2566 -------- -------- -------- --------
2568 Add the data length
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);
2573 offset += 2;
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);
2578 offset += 2;
2580 conversation = find_or_create_conversation(pinfo);
2582 gvcp_info = (gvcp_conv_info_t*)conversation_get_proto_data(conversation, proto_gvcp);
2583 if (!gvcp_info)
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;
2606 else
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)
2615 int i;
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)
2625 gvcp_trans = 0;
2627 else
2629 gvcp_trans->rep_frame = pinfo->num;
2632 break;
2634 gvcp_trans = 0;
2640 else
2642 gvcp_trans = 0;
2643 gvcp_trans_array = (wmem_array_t*)wmem_map_lookup(gvcp_info->pdus, GUINT_TO_POINTER(request_id));
2645 if (gvcp_trans_array)
2647 unsigned i;
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))
2655 break;
2658 gvcp_trans = 0;
2663 if (!gvcp_trans)
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);
2683 switch (command)
2685 case GVCP_FORCEIP_CMD:
2686 dissect_forceip_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length);
2687 break;
2689 case GVCP_PACKETRESEND_CMD:
2690 dissect_packetresend_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, extendedblockids);
2691 break;
2693 case GVCP_READREG_CMD:
2694 dissect_readreg_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_info, gvcp_trans);
2695 break;
2697 case GVCP_WRITEREG_CMD:
2698 dissect_writereg_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_info, gvcp_trans);
2699 break;
2701 case GVCP_READMEM_CMD:
2702 dissect_readmem_cmd(gvcp_telegram_tree, tvb, pinfo, offset, gvcp_info);
2703 break;
2705 case GVCP_WRITEMEM_CMD:
2706 dissect_writemem_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_info, gvcp_trans);
2707 break;
2709 case GVCP_EVENT_CMD:
2710 dissect_event_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, extendedblockids);
2711 break;
2713 case GVCP_EVENTDATA_CMD:
2714 dissect_eventdata_cmd(gvcp_telegram_tree, tvb, pinfo, offset, extendedblockids);
2715 break;
2717 case GVCP_ACTION_CMD:
2718 dissect_action_cmd(gvcp_telegram_tree, tvb, pinfo, offset, scheduledactioncommand);
2719 break;
2721 case GVCP_DISCOVERY_CMD:
2722 default:
2723 break;
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);
2736 else
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);
2745 else
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);
2756 switch (ack_code)
2758 case GVCP_DISCOVERY_ACK:
2759 dissect_discovery_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length);
2760 break;
2762 case GVCP_READREG_ACK:
2763 dissect_readreg_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_info, gvcp_trans);
2764 break;
2766 case GVCP_WRITEREG_ACK:
2767 dissect_writereg_ack(gvcp_telegram_tree, tvb, pinfo, offset, gvcp_trans);
2768 break;
2770 case GVCP_READMEM_ACK:
2771 dissect_readmem_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_info);
2772 break;
2774 case GVCP_WRITEMEM_ACK:
2775 dissect_writemem_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_info, gvcp_trans);
2776 break;
2778 case GVCP_PENDING_ACK:
2779 dissect_pending_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length);
2780 break;
2782 case GVCP_FORCEIP_ACK:
2783 break;
2784 case GVCP_PACKETRESEND_ACK:
2785 case GVCP_EVENT_ACK:
2786 case GVCP_EVENTDATA_ACK:
2787 case GVCP_ACTION_ACK:
2788 default:
2789 proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_payloaddata, tvb, offset, data_length, ENC_NA);
2790 break;
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,
2809 NULL, HFILL }},
2811 { &hf_gvcp_flag,
2812 { "Flags", "gvcp.cmd.flags",
2813 FT_UINT8, BASE_HEX, NULL, 0x0,
2814 NULL, HFILL }},
2816 { &hf_gvcp_acknowledge_required_flag,
2817 { "Acknowledge Required", "gvcp.cmd.flag.acq_required",
2818 FT_BOOLEAN, 8, NULL, 0x01,
2819 NULL, HFILL }},
2821 { &hf_gvcp_scheduledactioncommand_flag_v2_0,
2822 { "Scheduled Action Command", "gvcp.cmd.flag.scheduledactioncommand",
2823 FT_BOOLEAN, 8, NULL, 0x80,
2824 NULL, HFILL }},
2826 { &hf_gvcp_64bitid_flag_v2_0,
2827 { "64 bit ID", "gvcp.cmd.flag.64bitid",
2828 FT_BOOLEAN, 8, NULL, 0x10,
2829 NULL, HFILL }},
2831 { &hf_gvcp_allow_broadcast_acknowledge_flag,
2832 { "Allow Broadcast Acknowledge", "gvcp.cmd.flag.allowbroadcastacq",
2833 FT_BOOLEAN, 8, NULL, 0x10,
2834 NULL, HFILL }},
2836 { &hf_gvcp_command,
2837 { "Command", "gvcp.cmd.command",
2838 FT_UINT16, BASE_HEX, VALS(commandnames), 0x0,
2839 NULL, HFILL }},
2841 { &hf_gvcp_length,
2842 { "Payload Length", "gvcp.cmd.payloadlength",
2843 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
2844 NULL, HFILL }},
2846 { &hf_gvcp_request_id,
2847 { "Request ID", "gvcp.cmd.req_id",
2848 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
2849 NULL, HFILL }},
2851 { &hf_gvcp_payloaddata,
2852 { "Payload Data", "gvcp.cmd.payloaddata",
2853 FT_BYTES, BASE_NONE, NULL, 0x0,
2854 NULL, HFILL }},
2856 { &hf_gvcp_status,
2857 { "Status", "gvcp.cmd.status",
2858 FT_UINT16, BASE_HEX, VALS(statusnames), 0x0,
2859 NULL, HFILL }},
2861 { &hf_gvcp_acknowledge,
2862 { "Acknowledge", "gvcp.ack",
2863 FT_UINT16, BASE_HEX, VALS(acknowledgenames), 0x0,
2864 NULL, HFILL }},
2866 { &hf_gvcp_devicemodediscovery,
2867 { "Device Mode", "gvcp.ack.discovery.devicemode",
2868 FT_UINT32, BASE_HEX, NULL, 0x0,
2869 NULL, HFILL }},
2871 /* Force IP */
2873 { &hf_gvcp_forceip_mac_address,
2874 { "MAC Address", "gvcp.cmd.forceip.macaddress",
2875 FT_ETHER, BASE_NONE, NULL, 0x0,
2876 NULL, HFILL }},
2878 { &hf_gvcp_forceip_static_IP,
2879 { "IP address", "gvcp.cmd.forceip.ip",
2880 FT_IPv4, BASE_NONE, NULL, 0x0,
2881 NULL, HFILL }},
2883 { &hf_gvcp_forceip_static_subnet_mask,
2884 { "Subnet Mask", "gvcp.cmd.forceip.subnetmask",
2885 FT_IPv4, BASE_NONE, NULL, 0x0,
2886 NULL, HFILL }},
2888 { &hf_gvcp_forceip_static_default_gateway,
2889 { "Default Gateway", "gvcp.cmd.forceip.defaultgateway",
2890 FT_IPv4, BASE_NONE, NULL, 0x0,
2891 NULL, HFILL }},
2893 /* Discovery specific */
2895 { &hf_gvcp_device_mac_address,
2896 { "Device MAC Address", "gvcp.cmd.discovery.devicemacaddress",
2897 FT_ETHER, BASE_NONE, NULL, 0x0,
2898 NULL, HFILL }},
2900 /* Read register */
2901 { &hf_gvcp_readregcmd_bootstrap_register,
2902 { "Bootstrap Register", "gvcp.cmd.readreg.bootstrapregister",
2903 FT_UINT32, BASE_HEX_DEC, VALS(bootstrapregisternames), 0x0,
2904 NULL, HFILL }},
2906 { &hf_gvcp_readregcmd_extended_bootstrap_register,
2907 { "Extended Bootstrap Register", "gvcp.cmd.readreg.extendedbootstrapregister",
2908 FT_UINT32, BASE_HEX_DEC, VALS(extendedbootstrapregisternames), 0x0,
2909 NULL, HFILL } },
2911 /* Write register */
2913 { &hf_gvcp_writeregcmd_data,
2914 { "DataX", "gvcp.cmd.writereg.data",
2915 FT_UINT32, BASE_HEX_DEC, NULL, 0x0,
2916 NULL, HFILL }},
2918 { &hf_gvcp_writeregcmd_bootstrap_register,
2919 { "Bootstrap Register", "gvcp.cmd.writereg.bootstrapregister",
2920 FT_UINT32, BASE_HEX_DEC, VALS(bootstrapregisternames), 0x0,
2921 NULL, HFILL }},
2923 { &hf_gvcp_writeregcmd_extended_bootstrap_register,
2924 { "Extended Bootstrap Register", "gvcp.cmd.writereg.extendedbootstrapregister",
2925 FT_UINT32, BASE_HEX_DEC, VALS(extendedbootstrapregisternames), 0x0,
2926 NULL, HFILL } },
2928 { &hf_gvcp_writeregcmd_data_index,
2929 { "Data Index", "gvcp.cmd.writereg.dataindex",
2930 FT_UINT16, BASE_HEX, NULL, 0x0,
2931 NULL, HFILL }},
2933 /* Read memory */
2935 { &hf_gvcp_readmemcmd_address,
2936 { "Register Address", "gvcp.cmd.readmem.address",
2937 FT_UINT32, BASE_HEX, NULL, 0x0,
2938 NULL, HFILL }},
2940 { &hf_gvcp_readmemcmd_bootstrap_register,
2941 { "Memory Bootstrap Register", "gvcp.cmd.readmem.bootstrapregister",
2942 FT_UINT32, BASE_HEX_DEC, VALS(bootstrapregisternames), 0x0,
2943 NULL, HFILL }},
2945 { &hf_gvcp_readmemcmd_count,
2946 { "Count", "gvcp.cmd.readmem.count",
2947 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
2948 NULL, HFILL }},
2950 /* Write memory */
2952 { &hf_gvcp_writememcmd_data,
2953 { "DataY", "gvcp.cmd.writemem.data",
2954 FT_BYTES, BASE_NONE, NULL, 0x0,
2955 NULL, HFILL }},
2957 { &hf_gvcp_writememcmd_data_index,
2958 { "Data Index", "gvcp.cmd.writemem.dataindex",
2959 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
2960 NULL, HFILL }},
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,
2967 NULL, HFILL }},
2969 { &hf_gvcp_resendcmd_block_id,
2970 { "Resend Block ID 16 bits", "gvcp.cmd.resend.blockid",
2971 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
2972 NULL, HFILL }},
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,
2977 NULL, HFILL }},
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,
2982 NULL, HFILL }},
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,
2987 NULL, HFILL }},
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,
2992 NULL, HFILL }},
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,
2997 NULL, HFILL }},
2999 /* Event */
3001 { &hf_gvcp_eventcmd_id,
3002 { "ID", "gvcp.cmd.event.id",
3003 FT_UINT16, BASE_HEX_DEC, VALS(eventidnames), 0x0,
3004 NULL, HFILL }},
3006 { &hf_gvcp_eventcmd_error_id,
3007 { "Error ID", "gvcp.cmd.event.errorid",
3008 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
3009 NULL, HFILL }},
3011 { &hf_gvcp_eventcmd_extid_length,
3012 { "Event Size", "gvcp.cmd.event.eventsize",
3013 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
3014 NULL, HFILL }},
3016 { &hf_gvcp_eventcmd_device_specific_id,
3017 { "Device Specific ID", "gvcp.cmd.event.devicespecificid",
3018 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
3019 NULL, HFILL }},
3021 { &hf_gvcp_eventcmd_stream_channel_index,
3022 { "Stream Channel Index", "gvcp.cmd.event.streamchannelindex",
3023 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
3024 NULL, HFILL }},
3026 { &hf_gvcp_eventcmd_block_id,
3027 { "Block ID (16 bit)", "gvcp.cmd.event.blockid",
3028 FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
3029 NULL, HFILL }},
3031 { &hf_gvcp_eventcmd_timestamp,
3032 { "Timestamp", "gvcp.cmd.event.timestamp",
3033 FT_UINT64, BASE_HEX_DEC, NULL, 0x0,
3034 NULL, HFILL }},
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,
3039 NULL, HFILL }},
3041 /* Event data */
3043 { &hf_gvcp_eventcmd_data,
3044 { "Event Data", "gvcp.cmd.eventdata.data",
3045 FT_BYTES, BASE_NONE, NULL, 0x0,
3046 NULL, HFILL }},
3048 /* Action */
3050 { &hf_gvcp_actioncmd_device_key,
3051 { "Action Device Key", "gvcp.cmd.action.devicekey",
3052 FT_UINT32, BASE_HEX_DEC, NULL, 0x0,
3053 NULL, HFILL }},
3055 { &hf_gvcp_actioncmd_group_key,
3056 { "Action Group Key", "gvcp.cmd.action.groupkey",
3057 FT_UINT32, BASE_HEX_DEC, NULL, 0x0,
3058 NULL, HFILL }},
3060 { &hf_gvcp_actioncmd_group_mask,
3061 { "Action Group Mask", "gvcp.cmd.action.groupmask",
3062 FT_UINT32, BASE_HEX_DEC, NULL, 0xFFFFFFFF,
3063 NULL, HFILL }},
3065 { &hf_gvcp_actioncmd_time_v2_0,
3066 { "Action Scheduled Time", "gvcp.cmd.action.time",
3067 FT_UINT64, BASE_HEX_DEC, NULL, 0x0,
3068 NULL, HFILL }},
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,
3075 NULL, HFILL }},
3077 /* GVCP_VERSION */
3079 { &hf_gvcp_spec_version_major,
3080 { "Version Major", "gvcp.bootstrap.specversion.major",
3081 FT_UINT32, BASE_HEX, NULL, 0xFFFF0000,
3082 NULL, HFILL }},
3084 { &hf_gvcp_spec_version_minor,
3085 { "Version Minor", "gvcp.bootstrap.specversion.minor",
3086 FT_UINT32, BASE_HEX, NULL, 0x0000FFFF,
3087 NULL, HFILL }},
3089 { &hf_gvcp_spec_version,
3090 { "Spec Version", "gvcp.bootstrap.specversion",
3091 FT_UINT32, BASE_HEX, NULL, 0,
3092 NULL, HFILL }},
3094 /* GVCP_devicemode */
3096 { &hf_gvcp_devicemode_endianness,
3097 { "Endianness", "gvcp.bootstrap.devicemode.endianness",
3098 FT_BOOLEAN, 32, NULL, 0x80000000,
3099 NULL, HFILL
3102 { &hf_gvcp_devicemode_deviceclass,
3103 { "Device Class", "gvcp.bootstrap.devicemode.deviceclass",
3104 FT_UINT32, BASE_HEX, VALS(devicemodenames_class), 0x70000000,
3105 NULL, HFILL
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,
3111 NULL, HFILL
3114 { &hf_gvcp_devicemode_characterset,
3115 { "Character Set", "gvcp.bootstrap.devicemode.characterset",
3116 FT_UINT32, BASE_HEX, VALS(devicemodenames_characterset), 0x0000000F,
3117 NULL, HFILL
3120 /* GVCP_MAC_HIGH_0, 1, 2, 3 */
3122 { &hf_gvcp_machigh,
3123 { "MAC High", "gvcp.bootstrap.machigh",
3124 FT_UINT32, BASE_HEX, NULL, 0x0000FFFF,
3125 NULL, HFILL
3128 /* GVCP_MAC_LOW_0, 1, 2, 3 */
3130 { &hf_gvcp_maclow,
3131 { "MAC Low", "gvcp.bootstrap.maclow",
3132 FT_UINT32, BASE_HEX, NULL, 0,
3133 NULL, HFILL
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,
3142 NULL, HFILL }},
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,
3147 NULL, HFILL }},
3149 { &hf_gvcp_ip_config_lla,
3150 { "LLA", "gvcp.bootstrap.ipconfig.lla",
3151 FT_BOOLEAN, 32, NULL, 0x00000004,
3152 NULL, HFILL }},
3154 { &hf_gvcp_ip_config_dhcp,
3155 { "DHCP", "gvcp.bootstrap.ipconfig.dhcp",
3156 FT_BOOLEAN, 32, NULL, 0x00000002,
3157 NULL, HFILL }},
3159 { &hf_gvcp_ip_config_persistent_ip,
3160 { "Persistent IP", "gvcp.bootstrap.ipconfig.persistentip",
3161 FT_BOOLEAN, 32, NULL, 0x00000001,
3162 NULL, HFILL }},
3164 { &hf_gvcp_supportedipconfig,
3165 { "Supported IP Configuration", "gvcp.bootstrap.supportedipconfig",
3166 FT_UINT32, BASE_HEX, NULL, 0,
3167 NULL, HFILL
3170 { &hf_gvcp_currentipconfig,
3171 { "Current IP Configuration", "gvcp.bootstrap.currentipconfig",
3172 FT_UINT32, BASE_HEX, NULL, 0,
3173 NULL, HFILL
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,
3181 NULL, HFILL }},
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,
3188 NULL, HFILL }},
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,
3195 NULL, HFILL }},
3197 /* GVCP_MANUFACTURER_NAME */
3199 { &hf_gvcp_manufacturer_name,
3200 { "Manufacturer Name", "gvcp.bootstrap.manufacturername",
3201 FT_STRINGZ, BASE_NONE, NULL, 0x0,
3202 NULL, HFILL }},
3204 /* GVCP_MODEL_NAME */
3206 { &hf_gvcp_model_name,
3207 { "Model Name", "gvcp.bootstrap.modelname",
3208 FT_STRINGZ, BASE_NONE, NULL, 0x0,
3209 NULL, HFILL }},
3211 /* GVCP_DEVICE_VERSION */
3213 { &hf_gvcp_device_version,
3214 { "Device Version", "gvcp.bootstrap.deviceversion",
3215 FT_STRINGZ, BASE_NONE, NULL, 0x0,
3216 NULL, HFILL }},
3218 /* GVCP_MANUFACTURER_INFO */
3220 { &hf_gvcp_manufacturer_specific_info,
3221 { "Manufacturer Specific Info", "gvcp.bootstrap.manufacturerspecificinfo",
3222 FT_STRINGZ, BASE_NONE, NULL, 0x0,
3223 NULL, HFILL }},
3225 /* GVCP_SERIAL_NUMBER */
3227 { &hf_gvcp_serial_number,
3228 { "Serial Number", "gvcp.bootstrap.serialnumber",
3229 FT_STRINGZ, BASE_NONE, NULL, 0x0,
3230 NULL, HFILL }},
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,
3237 NULL, HFILL }},
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,
3244 NULL, HFILL }},
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,
3251 NULL, HFILL }},
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,
3258 NULL, HFILL
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,
3266 NULL, HFILL
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,
3274 NULL, HFILL
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,
3282 NULL, HFILL
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,
3290 NULL, HFILL
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,
3298 NULL, HFILL
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,
3306 NULL, HFILL
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,
3314 NULL, HFILL
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,
3322 NULL, HFILL
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,
3330 NULL, HFILL
3333 /* GVCP_SC_CAPS */
3335 { &hf_gvcp_sccaps_scspx_register_supported,
3336 { "SCSPx Register Supported", "gvcp.bootstrap.sccaps.scspxregistersupported",
3337 FT_BOOLEAN, 32, NULL, 0x80000000,
3338 NULL, HFILL
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,
3344 NULL, HFILL
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,
3350 NULL, HFILL
3351 } },
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,
3356 NULL, HFILL
3357 } },
3359 /* GVCP_MESSAGE_CHANNEL_CAPS */
3361 { &hf_gvcp_mcsp_supported,
3362 { "MCSP Supported", "gvcp.bootstrap.mccaps.mcspsupported",
3363 FT_BOOLEAN, 32, NULL, 0x80000000,
3364 NULL, HFILL
3367 { &hf_gvcp_mccfg_supported_v2_2,
3368 { "MCCFG Supported", "gvcp.bootstrap.mccaps.mccfgsupported",
3369 FT_BOOLEAN, 32, NULL, 0x40000000,
3370 NULL, HFILL
3371 } },
3373 { &hf_gvcp_mcec_supported_v2_2,
3374 { "MCEC Supported", "gvcp.bootstrap.mccaps.mcecsupported",
3375 FT_BOOLEAN, 32, NULL, 0x20000000,
3376 NULL, HFILL
3377 } },
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,
3384 NULL, HFILL
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,
3392 NULL, HFILL
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,
3398 NULL, HFILL
3401 /* GVCP_CAPABILITY */
3403 { &hf_gvcp_capability_user_defined,
3404 { "User Defined Name Supported", "gvcp.bootstrap.capability.userdefined",
3405 FT_BOOLEAN, 32, NULL, 0x80000000,
3406 NULL, HFILL
3409 { &hf_gvcp_capability_serial_number,
3410 { "Serial Number Supported", "gvcp.bootstrap.capability.serialnumber",
3411 FT_BOOLEAN, 32, NULL, 0x40000000,
3412 NULL, HFILL
3415 { &hf_gvcp_capability_heartbeat_disable,
3416 { "Heartbeat Disable Supported", "gvcp.bootstrap.capability.heartbeatdisabled",
3417 FT_BOOLEAN, 32, NULL, 0x20000000,
3418 NULL, HFILL
3421 { &hf_gvcp_capability_link_speed,
3422 { "Link Speed Supported", "gvcp.bootstrap.capability.linkspeed",
3423 FT_BOOLEAN, 32, NULL, 0x10000000,
3424 NULL, HFILL
3427 { &hf_gvcp_capability_ccp_application_portip,
3428 { "CCP Application Port/IP Supported", "gvcp.bootstrap.capability.ccpapplicationportip",
3429 FT_BOOLEAN, 32, NULL, 0x08000000,
3430 NULL, HFILL
3433 { &hf_gvcp_capability_manifest_table,
3434 { "Manifest Table Supported", "gvcp.bootstrap.capability.manifesttable",
3435 FT_BOOLEAN, 32, NULL, 0x04000000,
3436 NULL, HFILL
3439 { &hf_gvcp_capability_test_data,
3440 { "Test Data Supported", "gvcp.bootstrap.capability.testdata",
3441 FT_BOOLEAN, 32, NULL, 0x02000000,
3442 NULL, HFILL
3445 { &hf_gvcp_capability_discovery_ACK_delay,
3446 { "Discovery ACK Delay Supported", "gvcp.bootstrap.capability.discoveryackdelay",
3447 FT_BOOLEAN, 32, NULL, 0x01000000,
3448 NULL, HFILL
3451 { &hf_gvcp_capability_writable_discovery_ACK_delay,
3452 { "Writable Discovery ACK Delay Supported", "gvcp.bootstrap.capability.writablediscoveryackdelay",
3453 FT_BOOLEAN, 32, NULL, 0x00800000,
3454 NULL, HFILL
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,
3460 NULL, HFILL
3463 { &hf_gvcp_capability_primary_application_switchover,
3464 { "Primary Application Switchover Supported", "gvcp.bootstrap.capability.primaryapplicationswitchover",
3465 FT_BOOLEAN, 32, NULL, 0x00200000,
3466 NULL, HFILL
3469 { &hf_gvcp_capability_unconditional_action_command,
3470 { "Unconditional Action Command Supported", "gvcp.bootstrap.capability.unconditionalactioncommand",
3471 FT_BOOLEAN, 32, NULL, 0x00100000,
3472 NULL, HFILL
3475 { &hf_gvcp_capability_1588_v2_0,
3476 { "Capability 1588", "gvcp.bootstrap.capability.ieee1588",
3477 FT_BOOLEAN, 32, NULL, 0x00080000,
3478 NULL, HFILL
3481 { &hf_gvcp_capability_extended_status_code_v2_0,
3482 { "Status Code", "gvcp.bootstrap.capability.pendingextendedstatuscodev2_0",
3483 FT_BOOLEAN, 32, NULL, 0x00040000,
3484 NULL, HFILL
3487 { &hf_gvcp_capability_scheduled_action_command_v2_0,
3488 { "Scheduled Action Command", "gvcp.bootstrap.capability.scheduledactioncommand",
3489 FT_BOOLEAN, 32, NULL, 0x00020000,
3490 NULL, HFILL
3493 { &hf_gvcp_capability_ieee1588_extended_capabilities_v2_1,
3494 { "IEEE1588 Extended Capabilities", "gvcp.bootstrap.capability.ieee1588extendedcapabilities",
3495 FT_BOOLEAN, 32, NULL, 0x00010000,
3496 NULL, HFILL
3499 { &hf_gvcp_capability_action_command,
3500 { "Action Command", "gvcp.bootstrap.capability.actioncommand",
3501 FT_BOOLEAN, 32, NULL, 0x00000040,
3502 NULL, HFILL
3505 { &hf_gvcp_capability_pending,
3506 { "Pending ACK Supported", "gvcp.bootstrap.capability.pendingack",
3507 FT_BOOLEAN, 32, NULL, 0x00000020,
3508 NULL, HFILL
3511 { &hf_gvcp_capability_evendata,
3512 { "Event Data Supported", "gvcp.bootstrap.capability.eventdata",
3513 FT_BOOLEAN, 32, NULL, 0x00000010,
3514 NULL, HFILL
3517 { &hf_gvcp_capability_event,
3518 { "Event Signal Supported", "gvcp.bootstrap.capability.eventsignal",
3519 FT_BOOLEAN, 32, NULL, 0x00000008,
3520 NULL, HFILL
3523 { &hf_gvcp_capability_packetresend,
3524 { "Packet Resend CMD Supported", "gvcp.bootstrap.capability.packetresendcmd",
3525 FT_BOOLEAN, 32, NULL, 0x00000004,
3526 NULL, HFILL
3529 { &hf_gvcp_capability_writemem,
3530 { "WRITEMEM Supported", "gvcp.bootstrap.capability.writemem",
3531 FT_BOOLEAN, 32, NULL, 0x00000002,
3532 NULL, HFILL
3535 { &hf_gvcp_capability_concatenation,
3536 { "Concatenation Supported", "gvcp.bootstrap.capability.concatenation",
3537 FT_BOOLEAN, 32, NULL, 0x00000001,
3538 NULL, HFILL
3541 /* GVCP_HEARTBEAT_TIMEOUT */
3543 { &hf_gvcp_heartbeat,
3544 { "Heartbeat Timeout (in ms)", "gvcp.bootstrap.heartbeattimeout",
3545 FT_UINT32, BASE_DEC, NULL, 0x0,
3546 NULL, HFILL
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,
3554 NULL, HFILL
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,
3562 NULL, HFILL
3565 /* GVCP_TIMESTAMP_CONTROL */
3567 { &hf_gvcp_timestamp_control_latch,
3568 { "Timestamp Control Latch", "gvcp.bootstrap.timestampcontrol.latch",
3569 FT_BOOLEAN, 32, NULL, 0x00000002,
3570 NULL, HFILL
3573 { &hf_gvcp_timestamp_control_reset,
3574 { "Timestamp Control Reset", "gvcp.bootstrap.timestampcontrol.reset",
3575 FT_BOOLEAN, 32, NULL, 0x00000001,
3576 NULL, HFILL
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,
3584 NULL, HFILL
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,
3592 NULL, HFILL
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,
3600 NULL, HFILL
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,
3608 NULL, HFILL
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,
3614 NULL, HFILL
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,
3620 NULL, HFILL
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,
3626 NULL, HFILL
3629 { &hf_gvcp_configuration_pending_ack_enable,
3630 { "Pending_ACK Enable", "gvcp.bootstrap.config.pendingackenable",
3631 FT_BOOLEAN, 32, NULL, 0x00000002,
3632 NULL, HFILL
3635 { &hf_gvcp_configuration_heartbeat_disable,
3636 { "Heartbeat Disable", "gvcp.bootstrap.config.heartbeatdisable",
3637 FT_BOOLEAN, 32, NULL, 0x00000001,
3638 NULL, HFILL
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,
3646 NULL, HFILL
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,
3654 NULL, HFILL
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,
3662 NULL, HFILL
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,
3670 NULL, HFILL
3673 { &hf_gvcp_link_slag_v2_0,
3674 { "Link sLAG", "gvcp.bootstrap.link.slag",
3675 FT_BOOLEAN, 32, NULL, 0x00000004,
3676 NULL, HFILL
3679 { &hf_gvcp_link_ml_v2_0,
3680 { "Link ML", "gvcp.bootstrap.link.ml",
3681 FT_BOOLEAN, 32, NULL, 0x00000002,
3682 NULL, HFILL
3685 { &hf_gvcp_link_sl_v2_0,
3686 { "Link SL", "gvcp.bootstrap.link.sl",
3687 FT_BOOLEAN, 32, NULL, 0x00000001,
3688 NULL, HFILL
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,
3696 NULL, HFILL
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,
3704 NULL, HFILL
3707 /* GVCP_CCP */
3709 { &hf_gvcp_control_switchover_key,
3710 { "Control Switchover Key", "gvcp.bootstrap.control.switchoverkey",
3711 FT_UINT32, BASE_HEX, NULL, 0xFFFF0000,
3712 NULL, HFILL
3715 { &hf_gvcp_control_switchover_en,
3716 { "Control Switchover Enable", "gvcp.bootstrap.control.switchoverenable",
3717 FT_BOOLEAN, 32, NULL, 0x00000004,
3718 NULL, HFILL
3721 { &hf_gvcp_control_access,
3722 { "Control Access", "gvcp.bootstrap.control.controlaccess",
3723 FT_BOOLEAN, 32, NULL, 0x00000002,
3724 NULL, HFILL
3727 { &hf_gvcp_exclusive_access,
3728 { "Exclusive Access", "gvcp.bootstrap.control.exclusiveaccess",
3729 FT_BOOLEAN, 32, NULL, 0x00000001,
3730 NULL, HFILL
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,
3738 NULL, HFILL
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,
3746 NULL, HFILL
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,
3754 NULL, HFILL
3757 { &hf_gvcp_host_port,
3758 { "Host Port", "gvcp.bootstrap.mcp.hostport",
3759 FT_UINT32, BASE_DEC, NULL, 0x0000FFFF,
3760 NULL, HFILL
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,
3768 NULL, HFILL
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,
3776 NULL, HFILL
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,
3784 NULL, HFILL
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,
3792 NULL, HFILL
3795 /* GVCP_MC_CONFIGURATION */
3797 { &hf_gvcp_mcec_enabled_v2_2,
3798 { "MCEC Enabled", "gvcp.bootstrap.mcconfig.mcecenabled",
3799 FT_BOOLEAN, 32, NULL, 0x80000000,
3800 NULL, HFILL
3801 } },
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,
3808 NULL, HFILL
3811 { &hf_gvcp_sc_ni_index,
3812 { "Network Interface Index", "gvcp.bootstrap.scpx.networkinterfaceindex",
3813 FT_UINT32, BASE_DEC, NULL, 0x000F0000,
3814 NULL, HFILL
3817 { &hf_gvcp_sc_host_port,
3818 { "Host Port", "gvcp.bootstrap.scpx.hostport",
3819 FT_UINT32, BASE_DEC, NULL, 0x0000FFFF,
3820 NULL, HFILL
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,
3828 NULL, HFILL
3831 { &hf_gvcp_sc_do_not_fragment,
3832 { "Do Not Fragment", "gvcp.bootstrap.scpsx.donotfragment",
3833 FT_BOOLEAN, 32, NULL, 0x40000000,
3834 NULL, HFILL
3837 { &hf_gvcp_sc_pixel_endianness,
3838 { "Pixel Endianness", "gvcp.bootstrap.scpsx.pixelendianness",
3839 FT_BOOLEAN, 32, NULL, 0x20000000,
3840 NULL, HFILL
3843 { &hf_gvcp_sc_packet_size,
3844 { "Packet Size", "gvcp.bootstrap.scpsx.packetsize",
3845 FT_UINT32, BASE_DEC, NULL, 0x0000FFFF,
3846 NULL, HFILL
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,
3854 NULL, HFILL
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,
3862 NULL, HFILL
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,
3870 NULL, HFILL
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,
3878 NULL, HFILL
3881 { &hf_gvcp_sc_ip_reassembly_supported,
3882 { "IP Reassembly Supported", "gvcp.bootstrap.sccx.ipreassemblysupported",
3883 FT_BOOLEAN, 32, NULL, 0x40000000,
3884 NULL, HFILL
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,
3890 NULL, HFILL
3891 } },
3893 { &hf_gvcp_sc_gendc_supported_v2_2,
3894 { "GenDC Supported", "gvcp.bootstrap.sccx.gendcsupported",
3895 FT_BOOLEAN, 32, NULL, 0x00000080,
3896 NULL, HFILL
3897 } },
3899 { &hf_gvcp_sc_multi_part_supported_v2_1,
3900 { "Multi-part Supported", "gvcp.bootstrap.sccx.multipartsupported",
3901 FT_BOOLEAN, 32, NULL, 0x00000040,
3902 NULL, HFILL
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,
3908 NULL, HFILL
3911 { &hf_gvcp_sc_multizone_supported_v2_0,
3912 { "Multi-zone Supported", "gvcp.bootstrap.sccx.multizonesupported",
3913 FT_BOOLEAN, 32, NULL, 0x00000010,
3914 NULL, HFILL
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,
3920 NULL, HFILL
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,
3926 NULL, HFILL
3929 { &hf_gvcp_sc_unconditional_streaming_supported,
3930 { "Unconditional Streaming Supported", "gvcp.bootstrap.sccx.unconditionalstreamingsupported",
3931 FT_BOOLEAN, 32, NULL, 0x00000002,
3932 NULL, HFILL
3935 { &hf_gvcp_sc_extended_chunk_data_supported,
3936 { "Extended Chunk Data Supported", "gvcp.bootstrap.sccx.extendedchunkdatasupported",
3937 FT_BOOLEAN, 32, NULL, 0x00000001,
3938 NULL, HFILL
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,
3946 NULL, HFILL
3947 } },
3949 { &hf_gvcp_sc_multi_part_enabled_v2_1,
3950 { "Multi-part Enabled", "gvcp.bootstrap.sccfgx.multipartenabled",
3951 FT_BOOLEAN, 32, NULL, 0x00000040,
3952 NULL, HFILL
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,
3958 NULL, HFILL
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,
3964 NULL, HFILL
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,
3970 NULL, HFILL
3973 { &hf_gvcp_sc_unconditional_streaming_enabled,
3974 { "Unconditional Streaming Enabled", "gvcp.bootstrap.sccfgx.unconditionalstreamingenabled",
3975 FT_BOOLEAN, 32, NULL, 0x00000002,
3976 NULL, HFILL
3979 { &hf_gvcp_sc_extended_chunk_data_enabled,
3980 { "Extended Chunk Data Enabled", "gvcp.bootstrap.sccfgx.extendedchunkdataenabled",
3981 FT_BOOLEAN, 32, NULL, 0x00000001,
3982 NULL, HFILL
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,
3990 NULL, HFILL
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,
3998 NULL, HFILL
4001 { &hf_gvcp_sc_zone1_direction_v2_0,
4002 { "Zone 1 Direction", "gvcp.bootstrap.sczdx.zone1direction",
4003 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x40000000,
4004 NULL, HFILL
4007 { &hf_gvcp_sc_zone2_direction_v2_0,
4008 { "Zone 2 Direction", "gvcp.bootstrap.sczdx.zone2direction",
4009 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x20000000,
4010 NULL, HFILL
4013 { &hf_gvcp_sc_zone3_direction_v2_0,
4014 { "Zone 3 Direction", "gvcp.bootstrap.sczdx.zone3direction",
4015 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x10000000,
4016 NULL, HFILL
4019 { &hf_gvcp_sc_zone4_direction_v2_0,
4020 { "Zone 4 Direction", "gvcp.bootstrap.sczdx.zone4direction",
4021 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x08000000,
4022 NULL, HFILL
4025 { &hf_gvcp_sc_zone5_direction_v2_0,
4026 { "Zone 5 Direction", "gvcp.bootstrap.sczdx.zone5direction",
4027 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x04000000,
4028 NULL, HFILL
4031 { &hf_gvcp_sc_zone6_direction_v2_0,
4032 { "Zone 6 Direction", "gvcp.bootstrap.sczdx.zone6direction",
4033 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x02000000,
4034 NULL, HFILL
4037 { &hf_gvcp_sc_zone7_direction_v2_0,
4038 { "Zone 7 Direction", "gvcp.bootstrap.sczdx.zone7direction",
4039 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x01000000,
4040 NULL, HFILL
4043 { &hf_gvcp_sc_zone8_direction_v2_0,
4044 { "Zone 8 Direction", "gvcp.bootstrap.sczdx.zone8direction",
4045 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00800000,
4046 NULL, HFILL
4049 { &hf_gvcp_sc_zone9_direction_v2_0,
4050 { "Zone 9 Direction", "gvcp.bootstrap.sczdx.zone9direction",
4051 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00400000,
4052 NULL, HFILL
4055 { &hf_gvcp_sc_zone10_direction_v2_0,
4056 { "Zone 10 Direction", "gvcp.bootstrap.sczdx.zone10direction",
4057 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00200000,
4058 NULL, HFILL
4061 { &hf_gvcp_sc_zone11_direction_v2_0,
4062 { "Zone 11 Direction", "gvcp.bootstrap.sczdx.zone11direction",
4063 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00100000,
4064 NULL, HFILL
4067 { &hf_gvcp_sc_zone12_direction_v2_0,
4068 { "Zone 12 Direction", "gvcp.bootstrap.sczdx.zone12direction",
4069 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00080000,
4070 NULL, HFILL
4073 { &hf_gvcp_sc_zone13_direction_v2_0,
4074 { "Zone 13 Direction", "gvcp.bootstrap.sczdx.zone13direction",
4075 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00040000,
4076 NULL, HFILL
4079 { &hf_gvcp_sc_zone14_direction_v2_0,
4080 { "Zone 14 Direction", "gvcp.bootstrap.sczdx.zone14direction",
4081 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00020000,
4082 NULL, HFILL
4085 { &hf_gvcp_sc_zone15_direction_v2_0,
4086 { "Zone 15 Direction", "gvcp.bootstrap.sczdx.zone15direction",
4087 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00010000,
4088 NULL, HFILL
4091 { &hf_gvcp_sc_zone16_direction_v2_0,
4092 { "Zone 16 Direction", "gvcp.bootstrap.sczdx.zone16direction",
4093 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00008000,
4094 NULL, HFILL
4097 { &hf_gvcp_sc_zone17_direction_v2_0,
4098 { "Zone 17 Direction", "gvcp.bootstrap.sczdx.zone17direction",
4099 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00004000,
4100 NULL, HFILL
4103 { &hf_gvcp_sc_zone18_direction_v2_0,
4104 { "Zone 18 Direction", "gvcp.bootstrap.sczdx.zone18direction",
4105 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00002000,
4106 NULL, HFILL
4109 { &hf_gvcp_sc_zone19_direction_v2_0,
4110 { "Zone 19 Direction", "gvcp.bootstrap.sczdx.zone19direction",
4111 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00001000,
4112 NULL, HFILL
4115 { &hf_gvcp_sc_zone20_direction_v2_0,
4116 { "Zone 20 Direction", "gvcp.bootstrap.sczdx.zone20direction",
4117 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000800,
4118 NULL, HFILL
4121 { &hf_gvcp_sc_zone21_direction_v2_0,
4122 { "Zone 21 Direction", "gvcp.bootstrap.sczdx.zone21direction",
4123 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000400,
4124 NULL, HFILL
4127 { &hf_gvcp_sc_zone22_direction_v2_0,
4128 { "Zone 22 Direction", "gvcp.bootstrap.sczdx.zone22direction",
4129 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000200,
4130 NULL, HFILL
4133 { &hf_gvcp_sc_zone23_direction_v2_0,
4134 { "Zone 23 Direction", "gvcp.bootstrap.sczdx.zone23direction",
4135 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000100,
4136 NULL, HFILL
4139 { &hf_gvcp_sc_zone24_direction_v2_0,
4140 { "Zone 24 Direction", "gvcp.bootstrap.sczdx.zone24direction",
4141 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000080,
4142 NULL, HFILL
4145 { &hf_gvcp_sc_zone25_direction_v2_0,
4146 { "Zone 25 Direction", "gvcp.bootstrap.sczdx.zone25direction",
4147 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000040,
4148 NULL, HFILL
4151 { &hf_gvcp_sc_zone26_direction_v2_0,
4152 { "Zone 26 Direction", "gvcp.bootstrap.sczdx.zone26direction",
4153 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000020,
4154 NULL, HFILL
4157 { &hf_gvcp_sc_zone27_direction_v2_0,
4158 { "Zone 27 Direction", "gvcp.bootstrap.sczdx.zone27direction",
4159 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000010,
4160 NULL, HFILL
4163 { &hf_gvcp_sc_zone28_direction_v2_0,
4164 { "Zone 28 Direction", "gvcp.bootstrap.sczdx.zone28direction",
4165 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000008,
4166 NULL, HFILL
4169 { &hf_gvcp_sc_zone29_direction_v2_0,
4170 { "Zone 29 Direction", "gvcp.bootstrap.sczdx.zone29direction",
4171 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000004,
4172 NULL, HFILL
4175 { &hf_gvcp_sc_zone30_direction_v2_0,
4176 { "Zone 30 Direction", "gvcp.bootstrap.sczdx.zone30direction",
4177 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000002,
4178 NULL, HFILL
4181 { &hf_gvcp_sc_zone31_direction_v2_0,
4182 { "Zone 31 Direction", "gvcp.bootstrap.sczdx.zone31direction",
4183 FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000001,
4184 NULL, HFILL
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,
4192 NULL, HFILL
4193 } },
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,
4200 NULL, HFILL
4201 } },
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,
4208 NULL, HFILL
4209 } },
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,
4216 NULL, HFILL
4217 } },
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,
4224 NULL, HFILL
4225 } },
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,
4232 NULL, HFILL
4233 } },
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,
4240 NULL, HFILL
4241 } },
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,
4248 NULL, HFILL
4249 } },
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,
4256 NULL, HFILL
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,
4264 NULL, HFILL
4267 { &hf_gvcp_latency,
4268 { "Latency Value (in us)", "gvcp.bootstrap.latency",
4269 FT_UINT32, BASE_DEC, NULL, 0x0,
4270 NULL, HFILL
4273 { &hf_gvcp_custom_register_addr,
4274 { "Custom Register Address", "gvcp.bootstrap.custom.register.write",
4275 FT_UINT32, BASE_HEX, NULL, 0x0,
4276 NULL, HFILL
4279 { &hf_gvcp_custom_memory_addr,
4280 { "Custom Memory Address", "gvcp.bootstrap.custom.memory.write",
4281 FT_UINT32, BASE_HEX, NULL, 0x0,
4282 NULL, HFILL
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[] = {
4308 &ett_gvcp,
4309 &ett_gvcp_cmd,
4310 &ett_gvcp_flags,
4311 &ett_gvcp_ack,
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
4338 * Local variables:
4339 * c-basic-offset: 8
4340 * tab-width: 8
4341 * indent-tabs-mode: t
4342 * End:
4344 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
4345 * :indentSize=8:tabSize=8:noTabs=false: