Bug Summary

File:epan/dissectors/packet-acn.c
Warning:line 6505, column 3
Value stored to 'offset' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name packet-acn.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -ffloat16-excess-precision=fast -fbfloat16-excess-precision=fast -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/builds/wireshark/wireshark/build -fcoverage-compilation-dir=/builds/wireshark/wireshark/build -resource-dir /usr/lib/llvm-21/lib/clang/21 -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /builds/wireshark/wireshark/epan/dissectors -isystem /builds/wireshark/wireshark/build/epan/dissectors -isystem /usr/include/mit-krb5 -isystem /usr/include/libxml2 -isystem /builds/wireshark/wireshark/epan -D G_DISABLE_DEPRECATED -D G_DISABLE_SINGLE_INCLUDES -D WS_BUILD_DLL -D WS_DEBUG -D WS_DEBUG_UTF_8 -I /builds/wireshark/wireshark/build -I /builds/wireshark/wireshark -I /builds/wireshark/wireshark/include -D _GLIBCXX_ASSERTIONS -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/builds/wireshark/wireshark/= -fmacro-prefix-map=/builds/wireshark/wireshark/build/= -fmacro-prefix-map=../= -Wno-format-nonliteral -std=gnu11 -ferror-limit 19 -fvisibility=hidden -fwrapv -fwrapv-pointer -fstrict-flex-arrays=3 -stack-protector 2 -fstack-clash-protection -fcf-protection=full -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fexceptions -fcolor-diagnostics -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /builds/wireshark/wireshark/sbout/2025-12-11-100311-3573-1 -x c /builds/wireshark/wireshark/epan/dissectors/packet-acn.c
1/* packet-acn.c
2 * Routines for ACN packet disassembly
3 *
4 * Copyright (c) 2003 by Erwin Rol <[email protected]>
5 * Copyright (c) 2006 by Electronic Theatre Controls, Inc.
6 * Bill Florac <[email protected]>
7 *
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <[email protected]>
10 * Copyright 1999 Gerald Combs
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 */
14
15 /*
16 Todo:
17 Add reading of DDL files so we can further explode DMP packets
18 For some of the Set/Get properties where we have a range of data
19 it would be better to show the block of data rather and
20 address-data pair on each line...
21
22 Build CID to "Name" table from file so we can display real names
23 rather than CIDs
24 */
25
26/* Include files */
27
28#include "config.h"
29
30#include <epan/packet.h>
31#include <epan/prefs.h>
32#include <epan/strutil.h>
33#include <epan/to_str.h>
34#include <epan/expert.h>
35
36#include "packet-tcp.h"
37#include "packet-dmx-manfid.h"
38
39/* Forward declarations */
40void proto_register_acn(void);
41void proto_reg_handoff_acn(void);
42
43static dissector_handle_t acn_handle;
44
45/* pdu flags */
46#define ACN_PDU_FLAG_L0x80 0x80
47#define ACN_PDU_FLAG_V0x40 0x40
48#define ACN_PDU_FLAG_H0x20 0x20
49#define ACN_PDU_FLAG_D0x10 0x10
50
51#define ACN_DMX_OPTION_P0x80 0x80
52#define ACN_DMX_OPTION_S0x40 0x40
53#define ACN_DMX_OPTION_F0x20 0x20
54
55#define ACN_DMP_ADT_FLAG_V0x80 0x80 /* V = Specifies whether address is a virtual address or not. */
56#define ACN_DMP_ADT_FLAG_R0x40 0x40 /* R = Specifies whether address is relative to last valid address in packet or not. */
57#define ACN_DMP_ADT_FLAG_D0x30 0x30 /* D1, D0 = Specify non-range or range address, single data, equal size
58 or mixed size data array */
59#define ACN_DMP_ADT_EXTRACT_D(f)(((f) & 0x30) >> 4) (((f) & ACN_DMP_ADT_FLAG_D0x30) >> 4)
60
61#define ACN_DMP_ADT_FLAG_X0x0c 0x0c /* X1, X0 = These bits are reserved and their values shall be set to 0
62 when encoded. Their values shall be ignored when decoding. */
63
64#define ACN_DMP_ADT_FLAG_A0x03 0x03 /* A1, A0 = Size of Address elements */
65#define ACN_DMP_ADT_EXTRACT_A(f)((f) & 0x03) ((f) & ACN_DMP_ADT_FLAG_A0x03)
66
67#define ACN_DMP_ADT_V_ACTUAL0 0
68#define ACN_DMP_ADT_V_VIRTUAL1 1
69
70#define ACN_DMP_ADT_R_ABSOLUTE0 0
71#define ACN_DMP_ADT_R_RELATIVE1 1
72
73#define ACN_DMP_ADT_D_NS0 0
74#define ACN_DMP_ADT_D_RS1 1
75#define ACN_DMP_ADT_D_RE2 2
76#define ACN_DMP_ADT_D_RM3 3
77
78#define ACN_DMP_ADT_A_10 0
79#define ACN_DMP_ADT_A_21 1
80#define ACN_DMP_ADT_A_42 2
81#define ACN_DMP_ADT_A_R3 3
82
83#define ACN_PROTOCOL_ID_SDT0x00000001 0x00000001
84#define ACN_PROTOCOL_ID_DMP0x00000002 0x00000002
85#define ACN_PROTOCOL_ID_DMX0x00000003 0x00000003
86#define ACN_PROTOCOL_ID_DMX_20x00000004 0x00000004
87#define ACN_PROTOCOL_ID_RPT0x00000005 0x00000005
88#define ACN_PROTOCOL_ID_EXTENDED0x00000008 0x00000008
89#define ACN_PROTOCOL_ID_BROKER0x00000009 0x00000009
90#define ACN_PROTOCOL_ID_LLRP0x0000000A 0x0000000A
91#define ACN_PROTOCOL_ID_EPT0x0000000B 0x0000000B
92#define ACN_PROTOCOL_ID_DMX_30x50430001 0x50430001
93
94#define ACN_ADDR_NULL0 0
95#define ACN_ADDR_IPV41 1
96#define ACN_ADDR_IPV62 2
97#define ACN_ADDR_IPPORT3 3
98
99/* SDT Messages */
100#define ACN_SDT_VECTOR_UNKNOWN0 0
101#define ACN_SDT_VECTOR_REL_WRAP1 1
102#define ACN_SDT_VECTOR_UNREL_WRAP2 2
103#define ACN_SDT_VECTOR_CHANNEL_PARAMS3 3
104#define ACN_SDT_VECTOR_JOIN4 4
105#define ACN_SDT_VECTOR_JOIN_REFUSE5 5
106#define ACN_SDT_VECTOR_JOIN_ACCEPT6 6
107#define ACN_SDT_VECTOR_LEAVE7 7
108#define ACN_SDT_VECTOR_LEAVING8 8
109#define ACN_SDT_VECTOR_CONNECT9 9
110#define ACN_SDT_VECTOR_CONNECT_ACCEPT10 10
111#define ACN_SDT_VECTOR_CONNECT_REFUSE11 11
112#define ACN_SDT_VECTOR_DISCONNECT12 12
113#define ACN_SDT_VECTOR_DISCONNECTING13 13
114#define ACN_SDT_VECTOR_ACK14 14
115#define ACN_SDT_VECTOR_NAK15 15
116#define ACN_SDT_VECTOR_GET_SESSION16 16
117#define ACN_SDT_VECTOR_SESSIONS17 17
118
119#define ACN_REFUSE_CODE_NONSPECIFIC1 1
120#define ACN_REFUSE_CODE_ILLEGAL_PARAMS2 2
121#define ACN_REFUSE_CODE_LOW_RESOURCES3 3
122#define ACN_REFUSE_CODE_ALREADY_MEMBER4 4
123#define ACN_REFUSE_CODE_BAD_ADDR_TYPE5 5
124#define ACN_REFUSE_CODE_NO_RECIP_CHAN6 6
125
126#define ACN_REASON_CODE_NONSPECIFIC1 1
127/*#define ACN_REASON_CODE_ 2 */
128/*#define ACN_REASON_CODE_ 3 */
129/*#define ACN_REASON_CODE_ 4 */
130/*#define ACN_REASON_CODE_ 5 */
131#define ACN_REASON_CODE_NO_RECIP_CHAN6 6
132#define ACN_REASON_CODE_CHANNEL_EXPIRED7 7
133#define ACN_REASON_CODE_LOST_SEQUENCE8 8
134#define ACN_REASON_CODE_SATURATED9 9
135#define ACN_REASON_CODE_TRANS_ADDR_CHANGING10 10
136#define ACN_REASON_CODE_ASKED_TO_LEAVE11 11
137#define ACN_REASON_CODE_NO_RECIPIENT12 12
138
139/* Blob Information */
140#define ACN_BLOB_FIELD_TYPE11 1
141#define ACN_BLOB_FIELD_TYPE22 2
142#define ACN_BLOB_FIELD_TYPE33 3
143#define ACN_BLOB_FIELD_TYPE44 4
144#define ACN_BLOB_FIELD_TYPE55 5
145#define ACN_BLOB_FIELD_TYPE66 6
146#define ACN_BLOB_FIELD_TYPE77 7
147#define ACN_BLOB_FIELD_TYPE88 8
148#define ACN_BLOB_FIELD_TYPE99 9
149#define ACN_BLOB_FIELD_TYPE1010 10
150#define ACN_BLOB_FIELD_TYPE1111 11
151#define ACN_BLOB_FIELD_TYPE1212 12
152
153#define ACN_BLOB_RANGE_MID0 0
154#define ACN_BLOB_RANGE_START1 1
155#define ACN_BLOB_RANGE_END2 2
156#define ACN_BLOB_RANGE_SINGLE3 3
157
158#define ACN_BLOB_IPV41 1
159#define ACN_BLOB_IPV62 2
160#define ACN_BLOB_ERROR13 3
161#define ACN_BLOB_ERROR24 4
162#define ACN_BLOB_METADATA5 5
163#define ACN_BLOB_METADATA_DEVICES6 6
164#define ACN_BLOB_METADATA_TYPES7 7
165#define ACN_BLOB_TIME18 8
166#define ACN_BLOB_DIMMER_PROPERTIES9 9
167#define ACN_BLOB_DIMMER_LOAD_PROPERTIES10 10
168#define ACN_BLOB_DIMMING_RACK_PROPERTIES11 11
169#define ACN_BLOB_DIMMING_RACK_STATUS_PROPERTIES12 12
170#define ACN_BLOB_DIMMER_STATUS_PROPERTIES13 13
171#define ACN_BLOB_SET_LEVELS_OPERATION14 14
172#define ACN_BLOB_PRESET_OPERATION15 15
173#define ACN_BLOB_ADVANCED_FEATURES_OPERATION16 16
174#define ACN_BLOB_DIRECT_CONTROL_OPERATION17 17
175#define ACN_BLOB_GENERATE_CONFIG_OPERATION18 18
176#define ACN_BLOB_ERROR319 19
177#define ACN_BLOB_DIMMER_PROPERTIES220 20
178#define ACN_BLOB_DIMMER_LOAD_PROPERTIES221 21
179#define ACN_BLOB_DIMMER_RACK_PROPERTIES222 22
180#define ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223 23
181#define ACN_BLOB_DIMMER_STATUS_PROPERTIES224 24
182#define ACN_BLOB_TIME225 25
183#define ACN_BLOB_RPC26 26
184#define ACN_BLOB_DHCP_CONFIG_SUBNET27 27
185#define ACN_BLOB_DHCP_CONFIG_STATIC_ROUTE28 28
186#define ACN_BLOB_ENERGY_MANAGEMENT29 29
187#define ACN_BLOB_TIME330 30
188#define ACN_BLOB_ENERGY_COST31 31
189#define ACN_BLOB_SEQUENCE_OPERATIONS32 32
190#define ACN_BLOB_SEQUENCE_STEP_PROPERTIES33 33
191
192#define ACN_BLOB_PRESET_PROPERTIES250 250
193
194#define ACN_DMP_VECTOR_UNKNOWN0 0
195#define ACN_DMP_VECTOR_GET_PROPERTY1 1
196#define ACN_DMP_VECTOR_SET_PROPERTY2 2
197#define ACN_DMP_VECTOR_GET_PROPERTY_REPLY3 3
198#define ACN_DMP_VECTOR_EVENT4 4
199#define ACN_DMP_VECTOR_MAP_PROPERTY5 5
200#define ACN_DMP_VECTOR_UNMAP_PROPERTY6 6
201#define ACN_DMP_VECTOR_SUBSCRIBE7 7
202#define ACN_DMP_VECTOR_UNSUBSCRIBE8 8
203#define ACN_DMP_VECTOR_GET_PROPERTY_FAIL9 9
204#define ACN_DMP_VECTOR_SET_PROPERTY_FAIL10 10
205#define ACN_DMP_VECTOR_MAP_PROPERTY_FAIL11 11
206#define ACN_DMP_VECTOR_SUBSCRIBE_ACCEPT12 12
207#define ACN_DMP_VECTOR_SUBSCRIBE_REJECT13 13
208#define ACN_DMP_VECTOR_ALLOCATE_MAP14 14
209#define ACN_DMP_VECTOR_ALLOCATE_MAP_REPLY15 15
210#define ACN_DMP_VECTOR_DEALLOCATE_MAP16 16
211#define ACN_DMP_VECTOR_SYNC_EVENT17 17
212
213#define ACN_DMP_REASON_CODE_NONSPECIFIC1 1
214#define ACN_DMP_REASON_CODE_NOT_A_PROPERTY2 2
215#define ACN_DMP_REASON_CODE_WRITE_ONLY3 3
216#define ACN_DMP_REASON_CODE_NOT_WRITABLE4 4
217#define ACN_DMP_REASON_CODE_DATA_ERROR5 5
218#define ACN_DMP_REASON_CODE_MAPS_NOT_SUPPORTED6 6
219#define ACN_DMP_REASON_CODE_SPACE_NOT_AVAILABLE7 7
220#define ACN_DMP_REASON_CODE_PROP_NOT_MAPPABLE8 8
221#define ACN_DMP_REASON_CODE_MAP_NOT_ALLOCATED9 9
222#define ACN_DMP_REASON_CODE_SUBSCRIPTION_NOT_SUPPORTED10 10
223#define ACN_DMP_REASON_CODE_NO_SUBSCRIPTIONS_SUPPORTED11 11
224
225#define ACN_DMX_VECTOR2 2
226
227#define ACN_DMX_EXT_SYNC_VECTOR1 1
228#define ACN_DMX_EXT_DISCOVERY_VECTOR2 2
229#define ACN_DMX_DISCOVERY_UNIVERSE_LIST_VECTOR1 1
230
231#define ACN_PREF_DMX_DISPLAY_HEX0 0
232#define ACN_PREF_DMX_DISPLAY_DEC1 1
233#define ACN_PREF_DMX_DISPLAY_PER2 2
234
235#define ACN_PREF_DMX_DISPLAY_20PL0 0
236#define ACN_PREF_DMX_DISPLAY_16PL1 1
237
238
239#define MAGIC_V10 0 /* 1.0 default version */
240#define MAGIC_COMMAND1 1 /* 2.0 command */
241#define MAGIC_REPLY2 2 /* 2.0 reply */
242#define MAGIC_REPLY_TYPE_33 3 /* 2.0 reply type 3 */
243
244#define V1_SWITCH_TO_NET11 1
245#define V1_SWITCH_TO_NET22 2
246#define V1_BOOTP1114467 1114467
247
248#define V2_CMD_SWITCH_TO_NET11 1
249#define V2_CMD_SWITCH_TO_NET22 2
250#define V2_CMD_DOWNLOAD3 3
251#define V2_CMD_SOFTBOOT4 4
252#define V2_CMD_PHYSICAL_BEACON5 5
253#define V2_CMD_NETWORK_BEACON6 6
254#define V2_CMD_SWITCH_TO_ACN7 7
255#define V2_CMD_SWITCH_TO_DYNAMIC_IP8 8
256#define V2_CMD_EXTENDED_NETWORK_BEACON9 9
257#define V2_CMD_IP_CONFIGURATION10 10
258#define V2_CMD_RESTORE_FACTORY_DEFAULT11 11
259#define V2_CMD_PHYSICAL_BEACON_BY_CID12 12
260#define V2_CMD_NET2_DOWNLOAD110163 110163
261
262#define MAGIC_SWITCH_TO_DYNAMIC_MAINTAIN_LEASE0 0
263#define MAGIC_SWITCH_TO_DYNAMIC_RESET_LEASE1 1
264
265#define MAGIC_DYNAMIC_IP_MAINTAIN_LEASE0 0
266#define MAGIC_DYNAMIC_IP_RESET_LEASE1 1
267#define MAGIC_STATIC_IP2 2
268
269/* E1.33 Table A-1 Broadcast UID Defines */
270#define ACN_RPT_ALL_CONTROLLERS0xFFFCFFFFFFFF 0xFFFCFFFFFFFF
271#define ACN_RPT_ALL_DEVICES0xFFFDFFFFFFFF 0xFFFDFFFFFFFF
272#define ACN_RPT_ALL_MID_DEVICES0xFFFDmmmmFFFF 0xFFFDmmmmFFFF /*Addresses all Devices with the specific Manufacturer ID 0xmmmm*/
273
274/* E1.33 Table A-2 LLRP Constants */
275#define ACN_LLRP_MULTICAST_IPV4_ADDRESS_REQUEST239.255.250.133 239.255.250.133
276#define ACN_LLRP_MULTICAST_IPV4_ADDRESS_RESPONSE239.255.250.134 239.255.250.134
277#define ACN_LLRP_MULTICAST_IPV6_ADDRESS_REQUESTff18::85:0:0:85 ff18::85:0:0:85
278#define ACN_LLRP_MULTICAST_IPV6_ADDRESS_RESPONSEff18::85:0:0:86 ff18::85:0:0:86
279#define ACN_LLRP_PORT5569 5569
280#define ACN_LLRP_TIMEOUT2 2 /*seconds*/
281#define ACN_LLRP_TARGET_TIMEOUT500 500 /*milliseconds*/
282#define ACN_LLRP_MAX_BACKOFF1.5 1.5 /*seconds*/
283#define ACN_LLRP_KNOWN_UID_SIZE200 200
284#define ACN_LLRP_BROADCAST_CIDFBAD822C-BD0C-4D4C-BDC8-7EABEBC85AFF FBAD822C-BD0C-4D4C-BDC8-7EABEBC85AFF
285
286/* E1.33 Table A-3 Vector Defines for Root Layer PDU */
287/* (already defined above)
288 * #define ACN_PDU_VECTOR_ROOT_LLRP 0x0000000A
289 * #define ACN_PDU_VECTOR_ROOT_RPT 0x00000005
290 * #define ACN_PDU_VECTOR_ROOT_BROKER 0x00000009
291 * #define ACN_PDU_VECTOR_ROOT_EPT 0x0000000B
292 */
293
294/* E1.33 Table A-4 LLRP Messages */
295#define RDMNET_LLRP_VECTOR_PROBE_REQUEST0x00000001 0x00000001
296#define RDMNET_LLRP_VECTOR_PROBE_REPLY0x00000002 0x00000002
297#define RDMNET_LLRP_VECTOR_RDM_CMD0x00000003 0x00000003
298
299#define RDMNET_LLRP_VECTOR_PROBE_REQUEST_CLIENT_TCP_INACTIVE0x01 0x01
300#define RDMNET_LLRP_VECTOR_PROBE_REQUEST_BROKERS_ONLY0x02 0x02
301
302#define RDMNET_LLRP_VECTOR_RDM_CMD_START_CODE0xCC 0xCC
303
304/* E1.33 Table A-5 LLRP Probe Request Messages */
305#define VECTOR_PROBE_REQUEST_DATA0x01 0x01
306
307/* E1.33 Table A-6 LLRP Probe Reply Messages */
308#define VECTOR_PROBE_REPLY_DATA0x01 0x01
309
310/* E1.33 Table A-7 Broker Messages */
311#define RDMNET_BROKER_VECTOR_CONNECT0x0001 0x0001
312#define RDMNET_BROKER_VECTOR_CONNECT_REPLY0x0002 0x0002
313#define RDMNET_BROKER_VECTOR_CLIENT_ENTRY_UPDATE0x0003 0x0003
314#define RDMNET_BROKER_VECTOR_REDIRECT_V40x0004 0x0004
315#define RDMNET_BROKER_VECTOR_REDIRECT_V60x0005 0x0005
316#define RDMNET_BROKER_VECTOR_FETCH_CLIENT_LIST0x0006 0x0006
317#define RDMNET_BROKER_VECTOR_CONNECTED_CLIENT_LIST0x0007 0x0007
318#define RDMNET_BROKER_VECTOR_CLIENT_ADD0x0008 0x0008
319#define RDMNET_BROKER_VECTOR_CLIENT_REMOVE0x0009 0x0009
320#define RDMNET_BROKER_VECTOR_CLIENT_ENTRY_CHANGE0x000A 0x000A
321#define RDMNET_BROKER_VECTOR_REQUEST_DYNAMIC_UIDS0x000B 0x000B
322#define RDMNET_BROKER_VECTOR_ASSIGNED_DYNAMIC_UIDS0x000C 0x000C
323#define RDMNET_BROKER_VECTOR_FETCH_DYNAMIC_UID_LIST0x000D 0x000D
324#define RDMNET_BROKER_VECTOR_DISCONNECT0x000E 0x000E
325#define RDMNET_BROKER_VECTOR_NULL0x000F 0x000F
326
327#define RDMNET_BROKER_VECTOR_CONNECT_INCREMENTAL_UPDATES0x01 0x01
328
329/* E1.33 Table A-8 RPT Messages */
330#define RDMNET_RPT_VECTOR_REQUEST0x00000001 0x00000001
331#define RDMNET_RPT_VECTOR_STATUS0x00000002 0x00000002
332#define RDMNET_RPT_VECTOR_NOTIFICATION0x00000003 0x00000003
333
334/* E1.33 Table A-9 RPT Request PDUs */
335#define RDMNET_RPT_VECTOR_REQUEST_RDM_CMD0x01 0x01
336
337/* E1.33 Table A-10 RPT Status PDUs */
338#define RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RPT_UID0x0001 0x0001
339#define RDMNET_RPT_VECTOR_STATUS_RDM_TIMEOUT0x0002 0x0002
340#define RDMNET_RPT_VECTOR_STATUS_RDM_INVALID_RESPONSE0x0003 0x0003
341#define RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RDM_UID0x0004 0x0004
342#define RDMNET_RPT_VECTOR_STATUS_UNKNOWN_ENDPOINT0x0005 0x0005
343#define RDMNET_RPT_VECTOR_STATUS_BROADCAST_COMPLETE0x0006 0x0006
344#define RDMNET_RPT_VECTOR_STATUS_UNKNOWN_VECTOR0x0007 0x0007
345#define RDMNET_RPT_VECTOR_STATUS_INVALID_MESSAGE0x0008 0x0008
346#define RDMNET_RPT_VECTOR_STATUS_INVALID_COMMAND_CLASS0x0009 0x0009
347
348/* E1.33 Table A-11 RPT Notification PDUs */
349#define RDMNET_RPT_VECTOR_NOTIFICATION_RDM_CMD0x01 0x01
350
351/* E1.33 Table A-12 RDM Command PDUs */
352#define RDMNET_RPT_VECTOR_RDM_CMD_RD_DATA0xCC 0xCC
353
354/* E1.33 Table A-13 EPT PDUs */
355#define RDMNET_EPT_VECTOR_DATA0x00000001 0x00000001
356#define RDMNET_EPT_VECTOR_STATUS0x00000002 0x00000002
357
358/* E1.33 Table A-14 EPT Status PDUs */
359#define RDMNET_EPT_VECTOR_UNKNOWN_CID0x0001 0x0001
360#define RDMNET_EPT_VECTOR_UNKNOWN_VECTOR0x0002 0x0002
361
362/* E1.33 Table A-15 RDM Parameter IDs (only used in packet-rdm.c) */
363
364/* E1.33 Table A-16 RDM NACK Reason Codes (only used in packet-rdm.c) */
365
366/* E1.33 Table A-17 Static Config Types for Component Scope Messages (only used in packet-rdm.c) */
367
368/* E1.33 Table A-18 Broker States for Broker Status Messages (only used in packet-rdm.c) */
369
370/* E1.33 Table A-19 Connection Status Codes for Broker Connect */
371#define RDMNET_BROKER_CONNECT_OK0x0000 0x0000
372#define RDMNET_BROKER_CONNECT_SCOPE_MISMATCH0x0001 0x0001
373#define RDMNET_BROKER_CONNECT_CAPACITY_EXCEEDED0x0002 0x0002
374#define RDMNET_BROKER_CONNECT_DUPLICATE_UID0x0003 0x0003
375#define RDMNET_BROKER_CONNECT_INVALID_CLIENT_ENTRY0x0004 0x0004
376#define RDMNET_BROKER_CONNECT_INVALID_UID0x0005 0x0005
377
378/* E1.33 Table A-20 Status Codes for Dynamic UID Mapping*/
379#define RDMNET_DYNAMIC_UID_STATUS_OK0x0000 0x0000
380#define RDMNET_DYNAMIC_UID_STATUS_INVALID_REQUEST0x0001 0x0001
381#define RDMNET_DYNAMIC_UID_STATUS_UID_NOT_FOUND0x0002 0x0002
382#define RDMNET_DYNAMIC_UID_STATUS_DUPLICATE_RID0x0003 0x0003
383#define RDMNET_DYNAMIC_UID_STATUS_CAPACITY_EXHAUSTED0x0004 0x0004
384
385/* E1.33 Table A-21 Client Protocol Codes */
386#define RDMNET_CLIENT_PROTOCOL_RPT0x00000005 0x00000005
387#define RDMNET_CLIENT_PROTOCOL_EPT0x0000000B 0x0000000B
388
389/* E1.33 Table A-22 RPT Client Type Codes */
390#define RDMNET_RPT_CLIENT_TYPE_DEVICE0x00 0x00
391#define RDMNET_RPT_CLIENT_TYPE_CONTROLLER0x01 0x01
392
393/* E1.33 Table A-23 LLRP Component Type Codes - LLRP TARGETS */
394#define RDMNET_LLRP_COMPONENT_TYPE_RPT_DEVICE0x00 0x00 /* Target is a Device */
395#define RDMNET_LLRP_COMPONENT_TYPE_RPT_CONTROLLER0x01 0x01 /* Target is a Controller */
396#define RDMNET_LLRP_COMPONENT_TYPE_BROKER0x02 0x02 /* Target is a Broker */
397#define RDMNET_LLRP_COMPONENT_TYPE_NON_RDMNET0xFF 0xFF /* Target does not implement RDMnet other than LLRP */
398
399/* E1.33 Table A-24 RPT Client Disconnect Reason Codes */
400#define RDMNET_RPT_DISCONNECT_SHUTDOWN0x0000 0x0000 /* Sent by Components to indicate that they are */
401 /* about to shut down. */
402#define RDMNET_RPT_DISCONNECT_CAPACITY_EXHAUSTED0x0001 0x0001 /* Sent by Components when they do not */
403 /* have the ability to support this connection. */
404 /* Note that a Component must reserve certain */
405 /* resources to be able to send this message */
406 /* when it is in such a state. */
407#define RDMNET_RPT_DISCONNECT_HARDWARE_FAULT0x0002 0x0002 /* Sent by Components which must terminate a */
408 /* connection due to an internal hardware fault */
409#define RDMNET_RPT_DISCONNECT_SOFTWARE_FAULT0x0003 0x0003 /* Sent by Components which must terminate a */
410 /* connection due to a software fault. */
411#define RDMNET_RPT_DISCONNECT_SOFTWARE_RESET0x0004 0x0004 /* Sent by Components which must terminate a */
412 /* connection because of a software reset. */
413 /* This message should not be sent in the case */
414 /* of a reboot, as the Shutdown message */
415 /* is preferred. */
416#define RDMNET_RPT_DISCONNECT_INCORRECT_SCOPE0x0005 0x0005 /* Sent by Brokers that are not on the */
417 /* desired Scope. */
418#define RDMNET_RPT_DISCONNECT_RPT_RECONFIGURE0x0006 0x0006 /* Sent by components which must terminate a */
419 /* connection because they were reconfigured */
420 /* using RPT */
421#define RDMNET_RPT_DISCONNECT_LLRP_RECONFIGURE0x0007 0x0007 /* Sent by Components which must terminate a */
422 /* connection because they were reconfigured */
423 /* using LLRP. */
424#define RDMNET_RPT_DISCONNECT_USER_RECONFIGURE0x0008 0x0008 /* Sent by Components which must terminate a */
425 /* connection because they were reconfigured */
426 /* through some means outside the scope of this */
427 /* standard (i.e. front panel configuration) */
428
429typedef struct
430{
431 uint32_t start;
432 uint32_t vector;
433 uint32_t header;
434 uint32_t data;
435 uint32_t data_length;
436} acn_pdu_offsets;
437
438typedef struct
439{
440 uint8_t flags;
441 uint32_t address; /* or first address */
442 uint32_t increment;
443 uint32_t count;
444 uint32_t size;
445 uint32_t data_length;
446} acn_dmp_adt_type;
447
448/*
449 * See
450 * ANSI BSR E1.17 Architecture for Control Networks
451 * ANSI BSR E1.31
452 * ANSI BSR E1.33 RDMnet
453 */
454
455#define ACTUAL_ADDRESS0 0
456/* forward reference */
457static uint32_t acn_add_address(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, const char *label);
458static int dissect_acn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data);
459static int dissect_rdmnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t data_offset, bool_Bool is_udp);
460
461/* Global variables */
462static int proto_acn;
463static int ett_acn;
464static int ett_acn_channel_owner_info_block;
465static int ett_acn_channel_member_info_block;
466static int ett_acn_channel_parameter;
467static int ett_acn_address;
468static int ett_acn_address_type;
469static int ett_acn_blob;
470static int ett_acn_pdu_flags;
471static int ett_acn_dmp_pdu;
472static int ett_acn_sdt_pdu;
473static int ett_acn_sdt_client_pdu;
474static int ett_acn_sdt_base_pdu;
475static int ett_acn_root_pdu;
476
477static int ett_acn_dmx_address;
478static int ett_acn_dmx_2_options;
479static int ett_acn_dmx_data_pdu;
480static int ett_acn_dmx_pdu;
481
482static int ett_rdmnet_pdu_flags;
483static int ett_rdmnet_llrp_base_pdu;
484static int ett_rdmnet_llrp_probe_request_pdu;
485static int ett_rdmnet_llrp_probe_request_filter_flags;
486static int ett_rdmnet_llrp_probe_reply_pdu;
487static int ett_rdmnet_llrp_rdm_command_pdu;
488
489static int ett_rdmnet_broker_base_pdu;
490static int ett_rdmnet_broker_client_entry_pdu;
491static int ett_rdmnet_broker_client_entry_manufacturer_protocol_ids;
492static int ett_rdmnet_broker_connect_connection_flags;
493static int ett_rdmnet_broker_client_entry_update_connection_flags;
494
495static int ett_rdmnet_rpt_base_pdu;
496static int ett_rdmnet_rpt_request_pdu;
497static int ett_rdmnet_rpt_status_pdu;
498static int ett_rdmnet_rpt_notification_pdu;
499
500static int ett_rdmnet_ept_base_pdu;
501static int ett_rdmnet_ept_data_pdu;
502static int ett_rdmnet_ept_data_vector_pdu;
503static int ett_rdmnet_ept_status_pdu;
504
505static int ett_rdmnet_uid;
506
507static expert_field ei_acn_dmx_discovery_outofseq;
508
509/* Register fields */
510/* In alphabetical order */
511static int hf_acn_association;
512static int hf_acn_blob;
513/* static int hf_acn_blob_dimmer_load_properties2_type; */
514static int hf_acn_blob_field_length;
515static int hf_acn_blob_field_type;
516static int hf_acn_blob_field_value_number;
517static int hf_acn_blob_field_value_number64;
518static int hf_acn_blob_field_value_ipv4;
519static int hf_acn_blob_field_value_ipv6;
520static int hf_acn_blob_field_value_float;
521static int hf_acn_blob_field_value_double;
522static int hf_acn_blob_field_value_guid;
523static int hf_acn_blob_field_value_string;
524/* static int hf_acn_blob_metadata_types_type; */
525static int hf_acn_blob_range_number;
526/* static int hf_acn_blob_range_start; */
527static int hf_acn_blob_range_type;
528static int hf_acn_blob_tree_field_type;
529static int hf_acn_blob_type;
530static int hf_acn_blob_version;
531static int hf_acn_blob_time_zone;
532static int hf_acn_blob_dst_type;
533static int hf_acn_blob_dst_start_day;
534static int hf_acn_blob_dst_stop_day;
535static int hf_acn_blob_dst_start_locality;
536static int hf_acn_blob_dst_stop_locality;
537static int hf_acn_channel_number;
538static int hf_acn_cid;
539/* static int hf_acn_client_protocol_id; */
540static int hf_acn_data;
541static int hf_acn_data8;
542static int hf_acn_data16;
543static int hf_acn_data24;
544static int hf_acn_data32;
545/* static int hf_acn_dmp_adt; */ /* address and data type*/
546static int hf_acn_dmp_adt_a;
547static int hf_acn_dmp_adt_v;
548static int hf_acn_dmp_adt_r;
549static int hf_acn_dmp_adt_d;
550static int hf_acn_dmp_adt_x;
551static int hf_acn_dmp_reason_code;
552static int hf_acn_dmp_vector;
553static int hf_acn_dmp_actual_address;
554static int hf_acn_dmp_virtual_address;
555static int hf_acn_dmp_actual_address_first;
556static int hf_acn_dmp_virtual_address_first;
557static int hf_acn_expiry;
558static int hf_acn_first_member_to_ack;
559static int hf_acn_first_missed_sequence;
560static int hf_acn_ip_address_type;
561static int hf_acn_ipv4;
562static int hf_acn_ipv6;
563static int hf_acn_last_member_to_ack;
564static int hf_acn_last_missed_sequence;
565static int hf_acn_mak_threshold;
566static int hf_acn_member_id;
567static int hf_acn_nak_holdoff;
568static int hf_acn_nak_max_wait;
569static int hf_acn_nak_modulus;
570static int hf_acn_nak_outbound_flag;
571static int hf_acn_oldest_available_wrapper;
572static int hf_acn_packet_identifier;
573static int hf_acn_pdu;
574static int hf_acn_pdu_flag_d;
575static int hf_acn_pdu_flag_h;
576static int hf_acn_pdu_flag_l;
577static int hf_acn_pdu_flag_v;
578static int hf_acn_pdu_flags;
579static int hf_acn_pdu_length;
580static int hf_acn_port;
581static int hf_acn_postamble_size;
582static int hf_acn_preamble_size;
583static int hf_acn_protocol_id;
584static int hf_acn_reason_code;
585static int hf_acn_reciprocal_channel;
586static int hf_acn_refuse_code;
587static int hf_acn_reliable_sequence_number;
588static int hf_acn_adhoc_expiry;
589/* static int hf_acn_sdt_pdu; */
590static int hf_acn_sdt_vector;
591
592static int hf_acn_dmx_vector;
593static int hf_acn_dmx_extension_vector;
594/* static int hf_acn_session_count; */
595static int hf_acn_total_sequence_number;
596static int hf_acn_dmx_source_name;
597static int hf_acn_dmx_priority;
598static int hf_acn_dmx_2_sync_universe;
599static int hf_acn_dmx_3_reserved;
600static int hf_acn_dmx_sequence_number;
601static int hf_acn_dmx_2_options;
602static int hf_acn_dmx_2_option_p;
603static int hf_acn_dmx_2_option_s;
604static int hf_acn_dmx_2_option_f;
605static int hf_acn_dmx_universe;
606
607static int hf_acn_dmx_start_code;
608static int hf_acn_dmx_2_first_property_address;
609static int hf_acn_dmx_increment;
610static int hf_acn_dmx_count;
611static int hf_acn_dmx_2_start_code;
612static int hf_acn_dmx_data;
613
614static int hf_acn_postamble_key_fingerprint;
615static int hf_acn_postamble_seq_type;
616static int hf_acn_postamble_seq_hi;
617static int hf_acn_postamble_seq_low;
618static int hf_acn_postamble_message_digest;
619
620static int hf_acn_dmx_discovery_framing_reserved;
621static int hf_acn_dmx_discovery_page;
622static int hf_acn_dmx_discovery_last_page;
623static int hf_acn_dmx_discovery_vector;
624static int hf_acn_dmx_discovery_universe_list;
625
626static int hf_acn_dmx_sync_universe;
627static int hf_acn_dmx_sync_reserved;
628
629/* static int hf_acn_dmx_dmp_vector; */
630
631/* Try heuristic ACN decode */
632static bool_Bool global_acn_dmx_enable;
633static int global_acn_dmx_display_view;
634static int global_acn_dmx_display_line_format;
635static bool_Bool global_acn_dmx_display_zeros;
636static bool_Bool global_acn_dmx_display_leading_zeros;
637
638static int proto_magic;
639static int ett_magic;
640
641/* Register fields */
642static int hf_magic_protocol_id;
643static int hf_magic_pdu_subtype;
644static int hf_magic_major_version;
645static int hf_magic_minor_version;
646
647static int hf_magic_v1command_vals;
648
649static int hf_magic_command_vals;
650static int hf_magic_command_beacon_duration;
651static int hf_magic_command_tftp;
652static int hf_magic_command_reset_lease;
653static int hf_magic_command_cid;
654static int hf_magic_command_ip_configuration;
655static int hf_magic_command_ip_address;
656static int hf_magic_command_subnet_mask;
657static int hf_magic_command_gateway;
658
659static int hf_magic_reply_ip_address;
660static int hf_magic_reply_subnet_mask;
661static int hf_magic_reply_gateway;
662static int hf_magic_reply_tftp;
663
664static int hf_magic_reply_version;
665static int hf_magic_reply_device_type_name;
666static int hf_magic_reply_default_name;
667static int hf_magic_reply_user_name;
668static int hf_magic_reply_cid;
669static int hf_magic_reply_dcid;
670
671static expert_field ei_magic_reply_invalid_type;
672
673
674static int proto_rdmnet;
675static int ett_rdmnet;
676
677/* Register fields */
678static int hf_rdmnet_cid;
679static int hf_rdmnet_packet_identifier;
680static int hf_rdmnet_pdu;
681static int hf_rdmnet_pdu_flag_d;
682static int hf_rdmnet_pdu_flag_h;
683static int hf_rdmnet_pdu_flag_l;
684static int hf_rdmnet_pdu_flag_v;
685static int hf_rdmnet_pdu_flags;
686static int hf_rdmnet_pdu_length;
687static int hf_rdmnet_postamble_size;
688static int hf_rdmnet_preamble_size;
689static int hf_rdmnet_protocol_id;
690static int hf_rdmnet_tcp_length;
691
692static int hf_rdmnet_llrp_vector;
693static int hf_rdmnet_llrp_destination_cid;
694static int hf_rdmnet_llrp_transaction_number;
695static int hf_rdmnet_llrp_probe_request_vector;
696static int hf_rdmnet_llrp_probe_request_pdu_length;
697static int hf_rdmnet_llrp_probe_request_lower_uid;
698static int hf_rdmnet_llrp_probe_request_upper_uid;
699static int hf_rdmnet_llrp_probe_request_filter;
700static int hf_rdmnet_llrp_probe_request_filter_client_tcp_inactive;
701static int hf_rdmnet_llrp_probe_request_filter_brokers_only;
702static int hf_rdmnet_llrp_probe_request_known_uid;
703static int hf_rdmnet_llrp_probe_request_known_uid_manf;
704static int hf_rdmnet_llrp_probe_request_known_uid_dev;
705
706static int hf_rdmnet_llrp_probe_reply_vector;
707static int hf_rdmnet_llrp_probe_reply_uid;
708static int hf_rdmnet_llrp_probe_reply_uid_manf;
709static int hf_rdmnet_llrp_probe_reply_uid_dev;
710static int hf_rdmnet_llrp_probe_reply_hardware_address;
711static int hf_rdmnet_llrp_probe_reply_component_type;
712static int hf_rdmnet_llrp_rdm_command_start_code;
713
714static int hf_rdmnet_rpt_vector;
715static int hf_rdmnet_rpt_source_uid;
716static int hf_rdmnet_rpt_source_uid_manf;
717static int hf_rdmnet_rpt_source_uid_dev;
718static int hf_rdmnet_rpt_source_endpoint_id;
719static int hf_rdmnet_rpt_destination_uid;
720static int hf_rdmnet_rpt_destination_uid_manf;
721static int hf_rdmnet_rpt_destination_uid_dev;
722static int hf_rdmnet_rpt_destination_endpoint_id;
723static int hf_rdmnet_rpt_sequence_number;
724static int hf_rdmnet_rpt_reserved;
725static int hf_rdmnet_rpt_request_vector;
726static int hf_rdmnet_rpt_request_rdm_command;
727static int hf_rdmnet_rpt_status_vector;
728static int hf_rdmnet_rpt_status_unknown_rpt_uid_string;
729static int hf_rdmnet_rpt_status_rdm_timeout_string;
730static int hf_rdmnet_rpt_status_rdm_invalid_response_string;
731static int hf_rdmnet_rpt_status_unknown_rdm_uid_string;
732static int hf_rdmnet_rpt_status_unknown_endpoint_string;
733static int hf_rdmnet_rpt_status_broadcast_complete_string;
734static int hf_rdmnet_rpt_status_unknown_vector_string;
735static int hf_rdmnet_rpt_notification_vector;
736static int hf_rdmnet_rpt_notification_rdm_command;
737
738static int hf_rdmnet_broker_vector;
739static int hf_rdmnet_broker_client_protocol_vector;
740static int hf_rdmnet_broker_client_protocol_cid;
741static int hf_rdmnet_broker_client_rpt_client_uid;
742static int hf_rdmnet_broker_client_rpt_client_uid_manf;
743static int hf_rdmnet_broker_client_rpt_client_uid_dev;
744static int hf_rdmnet_broker_client_rpt_client_type;
745static int hf_rdmnet_broker_client_rpt_binding_cid;
746static int hf_rdmnet_broker_client_ept_protocol_vector;
747static int hf_rdmnet_broker_client_ept_protocol_manufacturer_id;
748static int hf_rdmnet_broker_client_ept_protocol_protocol_id;
749static int hf_rdmnet_broker_client_ept_protocol_string;
750static int hf_rdmnet_broker_connect_client_scope;
751static int hf_rdmnet_broker_connect_e133_version;
752static int hf_rdmnet_broker_connect_search_domain;
753static int hf_rdmnet_broker_connect_connection_flags;
754static int hf_rdmnet_broker_connect_connection_flags_incremental_updates;
755static int hf_rdmnet_broker_connect_reply_connection_code;
756static int hf_rdmnet_broker_connect_reply_e133_version;
757static int hf_rdmnet_broker_connect_reply_broker_uid;
758static int hf_rdmnet_broker_connect_reply_broker_uid_manf;
759static int hf_rdmnet_broker_connect_reply_broker_uid_dev;
760static int hf_rdmnet_broker_connect_reply_client_uid;
761static int hf_rdmnet_broker_connect_reply_client_uid_manf;
762static int hf_rdmnet_broker_connect_reply_client_uid_dev;
763static int hf_rdmnet_broker_client_entry_update_connection_flags;
764static int hf_rdmnet_broker_client_entry_update_connection_flags_incremental_updates;
765static int hf_rdmnet_broker_redirect_ipv4_address;
766static int hf_rdmnet_broker_redirect_ipv4_tcp_port;
767static int hf_rdmnet_broker_redirect_ipv6_address;
768static int hf_rdmnet_broker_redirect_ipv6_tcp_port;
769static int hf_rdmnet_broker_disconnect_reason;
770static int hf_rdmnet_broker_dynamic_uid_request;
771static int hf_rdmnet_broker_rid;
772static int hf_rdmnet_broker_assigned_dynamic_uid;
773static int hf_rdmnet_broker_assigned_rid;
774static int hf_rdmnet_broker_assigned_status_code;
775static int hf_rdmnet_broker_fetch_dynamic_uid;
776
777static int hf_rdmnet_ept_vector;
778static int hf_rdmnet_ept_destination_cid;
779static int hf_rdmnet_ept_data_pdu_length;
780static int hf_rdmnet_ept_data_vector;
781static int hf_rdmnet_ept_data_vector_manufacturer_id;
782static int hf_rdmnet_ept_data_vector_protocol_id;
783static int hf_rdmnet_ept_data_opaque_data;
784static int hf_rdmnet_ept_status_pdu_length;
785static int hf_rdmnet_ept_status_vector;
786static int hf_rdmnet_ept_status_unknown_cid;
787static int hf_rdmnet_ept_status_status_string;
788static int hf_rdmnet_ept_status_unknown_vector;
789static int hf_rdmnet_ept_status_vector_string;
790
791static const value_string acn_protocol_id_vals[] = {
792 { ACN_PROTOCOL_ID_SDT0x00000001, "SDT Protocol" },
793 { ACN_PROTOCOL_ID_DMP0x00000002, "DMP Protocol" },
794 { ACN_PROTOCOL_ID_DMX0x00000003, "DMX Protocol" },
795 { ACN_PROTOCOL_ID_DMX_20x00000004, "Ratified DMX Protocol" },
796 { ACN_PROTOCOL_ID_RPT0x00000005, "RDM Packet Transport Protocol" },
797 { ACN_PROTOCOL_ID_BROKER0x00000009, "Broker Protocol" },
798 { ACN_PROTOCOL_ID_LLRP0x0000000A, "Low Level Recovery Protocol" },
799 { ACN_PROTOCOL_ID_EPT0x0000000B, "Extensible Packet Transport Protocol" },
800 { ACN_PROTOCOL_ID_DMX_30x50430001, "Pathway Connectivity Secure DMX Protocol" },
801 { ACN_PROTOCOL_ID_EXTENDED0x00000008, "Protocol Extension" },
802 { 0, NULL((void*)0) },
803};
804
805static const value_string acn_dmp_adt_r_vals[] = {
806 { ACN_DMP_ADT_R_RELATIVE1, "Relative" },
807 { ACN_DMP_ADT_R_ABSOLUTE0, "Absolute" },
808 { 0, NULL((void*)0) },
809};
810
811static const value_string acn_dmp_adt_v_vals[] = {
812 { ACN_DMP_ADT_V_ACTUAL0, "Actual" },
813 { ACN_DMP_ADT_V_VIRTUAL1, "Virtual" },
814 { 0, NULL((void*)0) },
815};
816
817static const value_string acn_dmp_adt_d_vals[] = {
818 { ACN_DMP_ADT_D_NS0, "Non-range, single data item" },
819 { ACN_DMP_ADT_D_RS1, "Range, single data item" },
820 { ACN_DMP_ADT_D_RE2, "Range, array of equal size data items" },
821 { ACN_DMP_ADT_D_RM3, "Range, series of mixed size data items" },
822 { 0, NULL((void*)0) },
823};
824
825static const value_string acn_dmp_adt_a_vals[] = {
826 { ACN_DMP_ADT_A_10, "1 octet" },
827 { ACN_DMP_ADT_A_21, "2 octets" },
828 { ACN_DMP_ADT_A_42, "4 octets" },
829 { ACN_DMP_ADT_A_R3, "reserved" },
830 { 0, NULL((void*)0) },
831};
832
833
834static const value_string acn_sdt_vector_vals[] = {
835 { ACN_SDT_VECTOR_UNKNOWN0, "Unknown"},
836 { ACN_SDT_VECTOR_REL_WRAP1, "Reliable Wrapper"},
837 { ACN_SDT_VECTOR_UNREL_WRAP2, "Unreliable Wrapper"},
838 { ACN_SDT_VECTOR_CHANNEL_PARAMS3, "Channel Parameters"},
839 { ACN_SDT_VECTOR_JOIN4, "Join"},
840 { ACN_SDT_VECTOR_JOIN_REFUSE5, "Join Refuse"},
841 { ACN_SDT_VECTOR_JOIN_ACCEPT6, "Join Accept"},
842 { ACN_SDT_VECTOR_LEAVE7, "Leave"},
843 { ACN_SDT_VECTOR_LEAVING8, "Leaving"},
844 { ACN_SDT_VECTOR_CONNECT9, "Connect"},
845 { ACN_SDT_VECTOR_CONNECT_ACCEPT10, "Connect Accept"},
846 { ACN_SDT_VECTOR_CONNECT_REFUSE11, "Connect Refuse"},
847 { ACN_SDT_VECTOR_DISCONNECT12, "Disconnect"},
848 { ACN_SDT_VECTOR_DISCONNECTING13, "Disconnecting"},
849 { ACN_SDT_VECTOR_ACK14, "Ack"},
850 { ACN_SDT_VECTOR_NAK15, "Nak"},
851 { ACN_SDT_VECTOR_GET_SESSION16, "Get Session"},
852 { ACN_SDT_VECTOR_SESSIONS17, "Sessions"},
853 { 0, NULL((void*)0) },
854};
855
856static const value_string acn_dmx_vector_vals[] = {
857 { ACN_DMX_VECTOR2, "Streaming DMX"},
858 { 0, NULL((void*)0) },
859};
860
861static const value_string acn_dmx_extension_vector_vals[] = {
862 { ACN_DMX_EXT_SYNC_VECTOR1, "Streaming DMX Sync"},
863 { ACN_DMX_EXT_DISCOVERY_VECTOR2, "Streaming DMX Discovery"},
864 { 0, NULL((void*)0) },
865};
866
867static const value_string acn_dmx_discovery_vector_vals[] = {
868 { ACN_DMX_DISCOVERY_UNIVERSE_LIST_VECTOR1, "Source Universe List"},
869 { 0, NULL((void*)0) },
870};
871
872static const value_string acn_blob_advanced_features_operation_field_name[] = {
873 { 1, "Operation Type" },
874 { 2, "Use Controlled Loads" },
875 { 3, "Start Dimmer Address" },
876 { 4, "End Dimmer Address" },
877 { 5, "Space" },
878 { 0, NULL((void*)0) }
879};
880
881static const value_string acn_blob_dimmer_load_properties2_field_name[] = {
882 { 1, "System" },
883 { 2, "Processor" },
884 { 3, "Rack" },
885 { 4, "Lug" },
886 { 5, "Module" },
887 { 6, "Station" },
888 { 7, "Port" },
889 { 8, "Subdevice" },
890 { 9, "Space" },
891 { 10, "UDN" },
892 { 11, "Reserved" },
893 { 12, "Is Load Recorded" },
894 { 13, "Output Voltage Step 1" },
895 { 14, "Output Voltage Step 2" },
896 { 15, "Output Voltage Step 3" },
897 { 16, "Output Voltage Step 4" },
898 { 17, "Output Voltage Step 5" },
899 { 18, "Output Voltage Step 6" },
900 { 19, "Output Voltage Step 7" },
901 { 20, "Output Voltage Step 8" },
902 { 21, "Output Voltage Step 9" },
903 { 22, "Output Voltage Step 10" },
904 { 23, "Output Voltage Step 11" },
905 { 24, "Output Voltage Step 12" },
906 { 25, "Output Voltage Step 13" },
907 { 26, "Output Voltage Step 14" },
908 { 27, "Output Voltage Step 15" },
909 { 28, "Output Voltage Step 16" },
910 { 29, "Output Voltage Step 17" },
911 { 30, "Output Voltage Step 18" },
912 { 31, "Output Voltage Step 19" },
913 { 32, "Output Voltage Step 20" },
914 { 33, "Amperage Step 1" },
915 { 34, "Amperage Step 2" },
916 { 35, "Amperage Step 3" },
917 { 36, "Amperage Step 4" },
918 { 37, "Amperage Step 5" },
919 { 38, "Amperage Step 6" },
920 { 39, "Amperage Step 7" },
921 { 40, "Amperage Step 8" },
922 { 41, "Amperage Step 9" },
923 { 42, "Amperage Step 10" },
924 { 43, "Amperage Step 11" },
925 { 44, "Amperage Step 12" },
926 { 45, "Amperage Step 13" },
927 { 46, "Amperage Step 14" },
928 { 47, "Amperage Step 15" },
929 { 48, "Amperage Step 16" },
930 { 49, "Amperage Step 17" },
931 { 50, "Amperage Step 18" },
932 { 51, "Amperage Step 19" },
933 { 52, "Amperage Step 20" },
934 { 53, "Voltage Time Step 1" },
935 { 54, "Voltage Time Step 2" },
936 { 55, "Voltage Time Step 3" },
937 { 56, "Voltage Time Step 4" },
938 { 57, "Voltage Time Step 5" },
939 { 58, "Voltage Time Step 6" },
940 { 59, "Voltage Time Step 7" },
941 { 60, "Voltage Time Step 8" },
942 { 61, "Voltage Time Step 9" },
943 { 62, "Voltage Time Step 10" },
944 { 63, "Voltage Time Step 11" },
945 { 64, "Voltage Time Step 12" },
946 { 65, "Voltage Time Step 13" },
947 { 66, "Voltage Time Step 14" },
948 { 67, "Voltage Time Step 15" },
949 { 68, "Voltage Time Step 16" },
950 { 69, "Voltage Time Step 17" },
951 { 70, "Voltage Time Step 18" },
952 { 71, "Voltage Time Step 19" },
953 { 72, "Voltage Time Step 20" },
954 { 73, "Is Rig Check Recorded" },
955 { 74, "Recorded Level" },
956 { 75, "Recorded Current" },
957 { 0, NULL((void*)0) }
958};
959static value_string_ext acn_blob_dimmer_load_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_load_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_load_properties2_field_name
) / sizeof ((acn_blob_dimmer_load_properties2_field_name)[0])
)-1, acn_blob_dimmer_load_properties2_field_name, "acn_blob_dimmer_load_properties2_field_name"
, ((void*)0) }
;
960
961static const value_string acn_blob_dimmer_properties2_field_name[] = {
962 { 1, "System" },
963 { 2, "Processor" },
964 { 3, "Rack" },
965 { 4, "Lug" },
966 { 5, "Module" },
967 { 6, "Station" },
968 { 7, "Port" },
969 { 8, "Subdevice" },
970 { 9, "Space" },
971 { 10, "UDN" },
972 { 11, "Reserved" },
973 { 12, "Dimmer Name" },
974 { 13, "Dimmer Module" },
975 { 14, "Dimmer Mode" },
976 { 15, "Dimmer Control" },
977 { 16, "Dimmer Curve" },
978 { 17, "Off Level Percent" },
979 { 18, "On Level Percent" },
980 { 19, "On Time(sec)" },
981 { 20, "Off Time(sec)" },
982 { 21, "Dimmer AF Enabled" },
983 { 22, "Threshold" },
984 { 23, "Min Scale" },
985 { 24, "Unregulated Min Scale" },
986 { 25, "Max Scale" },
987 { 26, "Unregulated Max Scale" },
988 { 27, "Voltage Regulation" },
989 { 28, "Preheat Enable" },
990 { 29, "Preheat Time" },
991 { 30, "DC Output Prevent" },
992 { 31, "Inrush Protect" },
993 { 32, "AF Sensitivity" },
994 { 33, "AF Reaction Time" },
995 { 34, "Scale Load" },
996 { 35, "PTIO" },
997 { 36, "Allow In Preset" },
998 { 37, "Allow In Panic" },
999 { 38, "Allow In Panic DD" },
1000 { 39, "Report No Loads" },
1001 { 40, "Loads Error Reporting Enabled" },
1002 { 41, "New Dimmer Space Number" },
1003 { 42, "New Dimmer Number" },
1004 { 43, "DMX A Patch" },
1005 { 44, "DMX B Patch" },
1006 { 45, "sACN Patch" },
1007 { 46, "DMX A Patch DD" },
1008 { 47, "DMX B Patch DD" },
1009 { 48, "sACN Patch DD" },
1010 { 49, "DMX A 16-bit Enable" },
1011 { 50, "DMX B 16-bit Enable" },
1012 { 51, "sACN 16-bit Enable" },
1013 { 52, "Dimmer Zone" },
1014 { 0, NULL((void*)0) }
1015};
1016static value_string_ext acn_blob_dimmer_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_properties2_field_name
) / sizeof ((acn_blob_dimmer_properties2_field_name)[0]))-1, acn_blob_dimmer_properties2_field_name
, "acn_blob_dimmer_properties2_field_name", ((void*)0) }
;
1017
1018static const value_string acn_blob_dimmer_rack_properties2_field_name[] = {
1019 { 1, "System" },
1020 { 2, "Processor" },
1021 { 3, "Rack" },
1022 { 4, "Lug" },
1023 { 5, "Module" },
1024 { 6, "Station" },
1025 { 7, "Port" },
1026 { 8, "Subdevice" },
1027 { 9, "Space" },
1028 { 10, "UDN" },
1029 { 11, "Reserved" },
1030 { 12, "Rack CID" },
1031 { 13, "Rack Number" },
1032 { 14, "Rack Name" },
1033 { 15, "Rack Model" },
1034 { 16, "Rack AF Enable" },
1035 { 17, "Temperature Format" },
1036 { 18, "Data Loss Behavior DMX A" },
1037 { 19, "Data Loss Behavior DMX B" },
1038 { 20, "Data Loss Behavior sACN" },
1039 { 21, "Data Loss Cross/Wait Time DMX A" },
1040 { 22, "Data Loss Cross/Wait Time DMX B" },
1041 { 23, "Data Loss Wait Time sACN" },
1042 { 24, "Data Loss Fade Time DMX A" },
1043 { 25, "Data Loss Fade Time DMX B" },
1044 { 26, "Data Loss Fade Time sACN" },
1045 { 27, "Data Loss Preset DMX A" },
1046 { 28, "Data Loss Preset DMX B" },
1047 { 29, "Data Loss Preset sACN" },
1048 { 30, "Data Port Priority DMX A" },
1049 { 31, "Data Port Priority DMX B" },
1050 { 32, "Data Port Enabled DMX A" },
1051 { 33, "Data Port Enabled DMX B" },
1052 { 34, "Data Port Enabled sACN" },
1053 { 35, "16 Bit Enabled DMX A" },
1054 { 36, "16 Bit Enabled DMX B" },
1055 { 37, "16 Bit Enabled sACN" },
1056 { 38, "Patch From Home Screen" },
1057 { 39, "SCR Off Time" },
1058 { 40, "Time Mode" },
1059 { 41, "Offset from UTC" },
1060 { 42, "Universal Hold Last Look Time" },
1061 { 43, "Reactivate Presets On Boot" },
1062 { 44, "Voltage High Warning Level" },
1063 { 45, "Temperature High Warning Level" },
1064 { 46, "Fan Operation Timing" },
1065 { 47, "Allow Backplane Communication Errors" },
1066 { 48, "Activate Presets on Boot" },
1067 { 49, "SmartLink2 Power Supply Enable" },
1068 { 50, "Remote Record Enable" },
1069 { 51, "System Number" },
1070 { 52, "Architectural Priority" },
1071 { 53, "Data Loss Preset Space DMX A" },
1072 { 54, "Data Loss Preset Space DMX B" },
1073 { 55, "Arch. Off Behavior" },
1074 { 0, NULL((void*)0) }
1075};
1076static value_string_ext acn_blob_dimmer_rack_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_rack_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_rack_properties2_field_name
) / sizeof ((acn_blob_dimmer_rack_properties2_field_name)[0])
)-1, acn_blob_dimmer_rack_properties2_field_name, "acn_blob_dimmer_rack_properties2_field_name"
, ((void*)0) }
;
1077
1078static const value_string acn_blob_dimmer_rack_status_properties2_field_name[] = {
1079 { 1, "System" },
1080 { 2, "Processor" },
1081 { 3, "Rack" },
1082 { 4, "Lug" },
1083 { 5, "Module" },
1084 { 6, "Station" },
1085 { 7, "Port" },
1086 { 8, "Subdevice" },
1087 { 9, "Space" },
1088 { 10, "UDN" },
1089 { 11, "Reserved" },
1090 { 12, "CPU Temperature" },
1091 { 13, "Time of Last Reboot" },
1092 { 14, "Time Now" },
1093 { 15, "Rack Phasing" },
1094 { 16, "Power Frequency" },
1095 { 17, "Phase A Voltage" },
1096 { 18, "Phase B Voltage" },
1097 { 19, "Phase C Voltage" },
1098 { 20, "DMX A Port Status" },
1099 { 21, "DMX B Port Status" },
1100 { 22, "Active Preset Group IDs" },
1101 { 23, "Active Preset Group ID[0]" },
1102 { 24, "Active Preset Group ID[1]" },
1103 { 25, "Active Preset Group ID[2]" },
1104 { 26, "Active Preset Group ID[3]" },
1105 { 27, "Active Preset Group ID[4]" },
1106 { 28, "Active Preset Group ID[5]" },
1107 { 29, "Active Preset Group ID[6]" },
1108 { 30, "Active Preset Group ID[7]" },
1109 { 31, "Active Preset Group ID[8]" },
1110 { 32, "Active Preset Group ID[9]" },
1111 { 33, "Active Preset Group ID[10]" },
1112 { 34, "Active Preset Group ID[11]" },
1113 { 35, "Active Preset Group ID[12]" },
1114 { 36, "Active Preset Group ID[13]" },
1115 { 37, "Active Preset Group ID[14]" },
1116 { 38, "Active Preset Group ID[15]" },
1117 { 39, "Active Preset Group ID[16]" },
1118 { 40, "Active Preset Group ID[17]" },
1119 { 41, "Active Preset Group ID[18]" },
1120 { 42, "Active Preset Group ID[19]" },
1121 { 43, "Active Preset Group ID[20]" },
1122 { 44, "Active Preset Group ID[21]" },
1123 { 45, "Active Preset Group ID[22]" },
1124 { 46, "Active Preset Group ID[23]" },
1125 { 47, "Active Preset Group ID[24]" },
1126 { 48, "Active Preset Group ID[25]" },
1127 { 49, "Active Preset Group ID[26]" },
1128 { 50, "Active Preset Group ID[27]" },
1129 { 51, "Active Preset Group ID[28]" },
1130 { 52, "Active Preset Group ID[29]" },
1131 { 53, "Active Preset Group ID[30]" },
1132 { 54, "Active Preset Group ID[31]" },
1133 { 55, "Active Preset Group ID[32]" },
1134 { 56, "Active Preset Group ID[33]" },
1135 { 57, "Active Preset Group ID[34]" },
1136 { 58, "Active Preset Group ID[35]" },
1137 { 59, "Active Preset Group ID[36]" },
1138 { 60, "Active Preset Group ID[37]" },
1139 { 61, "Active Preset Group ID[38]" },
1140 { 62, "Active Preset Group ID[39]" },
1141 { 63, "Active Preset Group ID[40]" },
1142 { 64, "Active Preset Group ID[41]" },
1143 { 65, "Active Preset Group ID[42]" },
1144 { 66, "Active Preset Group ID[43]" },
1145 { 67, "Active Preset Group ID[44]" },
1146 { 68, "Active Preset Group ID[45]" },
1147 { 69, "Active Preset Group ID[46]" },
1148 { 70, "Active Preset Group ID[47]" },
1149 { 71, "Active Preset Group ID[48]" },
1150 { 72, "Active Preset Group ID[49]" },
1151 { 73, "Active Preset Group ID[50]" },
1152 { 74, "Active Preset Group ID[51]" },
1153 { 75, "Active Preset Group ID[52]" },
1154 { 76, "Active Preset Group ID[53]" },
1155 { 77, "Active Preset Group ID[54]" },
1156 { 78, "Active Preset Group ID[55]" },
1157 { 79, "Active Preset Group ID[56]" },
1158 { 80, "Active Preset Group ID[57]" },
1159 { 81, "Active Preset Group ID[58]" },
1160 { 82, "Active Preset Group ID[59]" },
1161 { 83, "Active Preset Group ID[60]" },
1162 { 84, "Active Preset Group ID[61]" },
1163 { 85, "Active Preset Group ID[62]" },
1164 { 86, "Active Preset Group ID[63]" },
1165 { 87, "Rack AF State" },
1166 { 88, "Number of Stored Presets for This Rack" },
1167 { 89, "Number of Lugs in This Rack" },
1168 { 90, "DSP Version" },
1169 { 91, "AF Card Version Slot 1" },
1170 { 92, "AF Card Version Slot 2" },
1171 { 93, "AF Card Version Slot 3" },
1172 { 94, "AF Card Version Slot 4" },
1173 { 95, "HCS08 Version" },
1174 { 96, "FPGA Version" },
1175 { 97, "Upload Progress AF Card 1" },
1176 { 98, "Upload Progress AF Card 2" },
1177 { 99, "Upload Progress AF Card 3" },
1178 { 100, "Upload Progress AF Card 4" },
1179 { 0, NULL((void*)0) }
1180};
1181static value_string_ext acn_blob_dimmer_rack_status_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_rack_status_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_rack_status_properties2_field_name
) / sizeof ((acn_blob_dimmer_rack_status_properties2_field_name
)[0]))-1, acn_blob_dimmer_rack_status_properties2_field_name,
"acn_blob_dimmer_rack_status_properties2_field_name", ((void
*)0) }
;
1182
1183static const value_string acn_blob_dimmer_status_properties2_field_name[] = {
1184 { 1, "System" },
1185 { 2, "Processor" },
1186 { 3, "Rack" },
1187 { 4, "Lug" },
1188 { 5, "Module" },
1189 { 6, "Station" },
1190 { 7, "Port" },
1191 { 8, "Subdevice" },
1192 { 9, "Space" },
1193 { 10, "UDN" },
1194 { 11, "Reserved" },
1195 { 12, "Source Winning Control" },
1196 { 13, "Priority of Winning Source" },
1197 { 14, "Winning Level" },
1198 { 15, "Winning DMX A Level" },
1199 { 16, "Winning DMX B Level" },
1200 { 17, "Winning sACN Level" },
1201 { 18, "Source Winning Control DD" },
1202 { 19, "Priority of Winning Source DD" },
1203 { 20, "Winning Level DD" },
1204 { 21, "Winning DMX A Level DD" },
1205 { 22, "Winning DMX B Level DD" },
1206 { 23, "Winning DMX sACN Level DD" },
1207 { 24, "Actual Load" },
1208 { 25, "Load Status" },
1209 { 0, NULL((void*)0) }
1210};
1211static value_string_ext acn_blob_dimmer_status_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_status_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_status_properties2_field_name
) / sizeof ((acn_blob_dimmer_status_properties2_field_name)[0
]))-1, acn_blob_dimmer_status_properties2_field_name, "acn_blob_dimmer_status_properties2_field_name"
, ((void*)0) }
;
1212
1213
1214static const value_string acn_blob_direct_control_operation_field_name[] = {
1215 { 1, "Space" },
1216 { 2, "Dimmer Number" },
1217 { 3, "DD Side" },
1218 { 4, "Level" },
1219 { 5, "Priority" },
1220 { 0, NULL((void*)0) }
1221};
1222
1223static const value_string acn_blob_error3_field_name[] = {
1224 { 1, "System" },
1225 { 2, "Processor" },
1226 { 3, "Rack" },
1227 { 4, "Lug" },
1228 { 5, "Module" },
1229 { 6, "Station" },
1230 { 7, "Port" },
1231 { 8, "Subdevice" },
1232 { 9, "Space" },
1233 { 10, "UDN" },
1234 { 11, "sACN Address" },
1235 { 12, "Error Type" },
1236 { 13, "Severity" },
1237 { 14, "Timestamp" },
1238 { 15, "Error Text" },
1239 { 0, NULL((void*)0) }
1240};
1241
1242static const value_string acn_blob_field_type_vals[] = {
1243 { ACN_BLOB_FIELD_TYPE11, "1 Byte Signed Integer" },
1244 { ACN_BLOB_FIELD_TYPE22, "2 Bytes Signed Integer" },
1245 { ACN_BLOB_FIELD_TYPE33, "4 Bytes Signed Integer" },
1246 { ACN_BLOB_FIELD_TYPE44, "8 Bytes Signed Integer" },
1247 { ACN_BLOB_FIELD_TYPE55, "1 Byte Unsigned Integer" },
1248 { ACN_BLOB_FIELD_TYPE66, "2 Bytes Unsigned Integer" },
1249 { ACN_BLOB_FIELD_TYPE77, "4 Bytes Unsigned Integer" },
1250 { ACN_BLOB_FIELD_TYPE88, "8 Bytes Unsigned Integer" },
1251 { ACN_BLOB_FIELD_TYPE99, "Float" },
1252 { ACN_BLOB_FIELD_TYPE1010, "Double" },
1253 { ACN_BLOB_FIELD_TYPE1111, "Variblob" },
1254 { ACN_BLOB_FIELD_TYPE1212, "Ignore" },
1255 { 0, NULL((void*)0) }
1256};
1257
1258static const value_string acn_blob_generate_config_operation_field_name[] = {
1259 { 1, "First Dimmer" },
1260 { 2, "Numbering Style" },
1261 { 3, "Use Dimmer Doubling" },
1262 { 4, "Default Module Type" },
1263 { 0, NULL((void*)0) }
1264};
1265
1266static const value_string acn_blob_ip_field_name[] = {
1267 { 1, "IP Address" },
1268 { 2, "Subnet Mask" },
1269 { 3, "Gateway" },
1270 { 0, NULL((void*)0) }
1271};
1272
1273static const value_string acn_blob_error1_field_name[] = {
1274 { 1, "System" },
1275 { 2, "Processor" },
1276 { 3, "Rack" },
1277 { 4, "Lug" },
1278 { 5, "Module" },
1279 { 6, "Station" },
1280 { 7, "Port" },
1281 { 8, "Subdevice" },
1282 /*{9, "Space"}, */
1283 { 9, "UDN" },
1284 { 10, "sACN Address" },
1285 { 11, "Error Type" },
1286 { 12, "Severity" },
1287 { 13, "Timestamp" },
1288 { 14, "Error Text" },
1289 { 0, NULL((void*)0) }
1290};
1291
1292static const value_string acn_blob_error2_field_name[] = {
1293 { 1, "System" },
1294 { 2, "Processor" },
1295 { 3, "Rack" },
1296 { 4, "Lug" },
1297 { 5, "Module" },
1298 { 6, "Station" },
1299 { 7, "Port" },
1300 { 8, "Subdevice" },
1301 { 9, "Space" },
1302 { 10, "UDN" },
1303 { 11, "sACN Address" },
1304 { 12, "Error Type" },
1305 { 13, "Severity" },
1306 { 14, "Timestamp" },
1307 { 15, "Error Text" },
1308 { 0, NULL((void*)0) }
1309};
1310
1311static const value_string acn_blob_metadata_devices_field_name[] = {
1312 { 1, "Device Type" },
1313 { 2, "Identifier Name 1" },
1314 { 3, "Identifier Name 2" },
1315 { 4, "Identifier Name 3" },
1316 { 5, "Identifier Name 4" },
1317 { 0, NULL((void*)0) }
1318};
1319
1320static const value_string acn_blob_metadata_field_name[] = {
1321 { 1, "Device Type" },
1322 { 2, "Metadata Type" },
1323 { 3, "Identifier Name 1" },
1324 { 4, "Identifier Name 2" },
1325 { 5, "Identifier Name 3" },
1326 { 6, "Identifier Name 4" },
1327 { 7, "Metadata 1" },
1328 { 8, "Metadata 2" },
1329 { 9, "Metadata 3" },
1330 { 10, "Metadata 4" },
1331 { 11, "Metadata 5" },
1332 { 12, "Metadata 6" },
1333 { 13, "Metadata 7" },
1334 { 14, "Metadata 8" },
1335 { 15, "Device CID" },
1336 { 0, NULL((void*)0) }
1337};
1338
1339static const value_string acn_blob_metadata_types_field_name[] = {
1340 { 1, "Metadata Type" },
1341 { 2, "Identifier Name 1" },
1342 { 3, "Identifier Name 2" },
1343 { 4, "Identifier Name 3" },
1344 { 5, "Identifier Name 4" },
1345 { 6, "Identifier Name 5" },
1346 { 7, "Identifier Name 6" },
1347 { 8, "Identifier Name 7" },
1348 { 9, "Identifier Name 8" },
1349 { 0, NULL((void*)0) }
1350};
1351
1352static const value_string acn_blob_time1_field_name[] = {
1353 { 1, "Time" },
1354 { 2, "Time Zone Name" },
1355 { 3, "Time Zone Offset Hour" },
1356 { 4, "Time Zone Offset Min" },
1357 { 5, "Time Zone Offset Sec" },
1358 { 6, "DST Name" },
1359 { 7, "Start Month" },
1360 { 8, "Start Week" },
1361 { 9, "Start Day" },
1362 { 10, "End Month" },
1363 { 11, "End Week" },
1364 { 12, "End Day" },
1365 { 13, "Timed Event Update" },
1366 { 0, NULL((void*)0) }
1367};
1368
1369static const value_string acn_blob_dimmer_properties1_field_name[] = {
1370 { 1, "System" },
1371 { 2, "Processor" },
1372 { 3, "Rack" },
1373 { 4, "Lug" },
1374 { 5, "Module" },
1375 { 6, "Station" },
1376 { 7, "Port" },
1377 { 8, "Subdevice" },
1378 { 9, "Space" },
1379 { 10, "UDN" },
1380 { 11, "Reserved" },
1381 { 12, "Dimmer Name" },
1382 { 13, "Dimmer Module" },
1383 { 14, "Dimmer Mode" },
1384 { 15, "Dimmer Control" },
1385 { 16, "Dimmer Curve" },
1386 { 17, "On Level Percent" },
1387 { 18, "Off Level Percent" },
1388 { 19, "On Time(sec)" },
1389 { 20, "Off Time(sec)" },
1390 { 21, "Dimmer AF Enabled" },
1391 { 22, "Threshold" },
1392 { 23, "Min Scale" },
1393 { 24, "Unregulated Min Scale" },
1394 { 25, "Max Scale" },
1395 { 26, "Unregulated Max Scale" },
1396 { 27, "Voltage Regulation" },
1397 { 28, "Preheat Enable" },
1398 { 29, "Preheat Time" },
1399 { 30, "DC Output Prevent" },
1400 { 31, "Inrush Protect" },
1401 { 32, "AF Sensitivity" },
1402 { 33, "AF Reaction Time" },
1403 { 34, "Scale Load" },
1404 { 35, "PTIO" },
1405 { 36, "Allow In Preset" },
1406 { 37, "Allow In Panic" },
1407 { 38, "Allow In Panic DD" },
1408 /*{39, "Loads Reporting Mode"},
1409 {40, "New Dimmer Space Number"}, */
1410 { 39, "Report No Loads Enable" },
1411 { 40, "Loads Error Reporting Enable" },
1412 { 41, "Dimmer Space" },
1413 { 42, "New Dimmer Number" },
1414 { 43, "DMX A Patch" },
1415 { 44, "DMX B Patch" },
1416 { 45, "sACN Patch" },
1417 { 46, "DMX A Patch DD" },
1418 { 47, "DMX B Patch DD" },
1419 { 48, "sACN Patch DD" },
1420 { 0, NULL((void*)0) }
1421};
1422static value_string_ext acn_blob_dimmer_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_properties1_field_name
) / sizeof ((acn_blob_dimmer_properties1_field_name)[0]))-1, acn_blob_dimmer_properties1_field_name
, "acn_blob_dimmer_properties1_field_name", ((void*)0) }
;
1423
1424static const value_string acn_blob_dimmer_load_properties1_field_name[] = {
1425 { 1, "System" },
1426 { 2, "Processor" },
1427 { 3, "Rack" },
1428 { 4, "Lug" },
1429 { 5, "Module" },
1430 { 6, "Station" },
1431 { 7, "Port" },
1432 { 8, "Subdevice" },
1433 { 9, "Space" },
1434 { 10, "UDN" },
1435 { 11, "Reserved" },
1436 { 12, "Is Load Recorded" },
1437 { 13, "Output Voltage Step 1" },
1438 { 14, "Output Voltage Step 2" },
1439 { 15, "Output Voltage Step 3" },
1440 { 16, "Output Voltage Step 4" },
1441 { 17, "Output Voltage Step 5" },
1442 { 18, "Output Voltage Step 6" },
1443 { 19, "Output Voltage Step 7" },
1444 { 20, "Output Voltage Step 8" },
1445 { 21, "Output Voltage Step 9" },
1446 { 22, "Output Voltage Step 10" },
1447 { 23, "Output Voltage Step 11" },
1448 { 24, "Output Voltage Step 12" },
1449 { 25, "Output Voltage Step 13" },
1450 { 26, "Output Voltage Step 14" },
1451 { 27, "Output Voltage Step 15" },
1452 { 28, "Output Voltage Step 16" },
1453 { 29, "Output Voltage Step 17" },
1454 { 30, "Output Voltage Step 18" },
1455 { 31, "Output Voltage Step 19" },
1456 { 32, "Output Voltage Step 20" },
1457 { 33, "Amperage Step 1" },
1458 { 34, "Amperage Step 2" },
1459 { 35, "Amperage Step 3" },
1460 { 36, "Amperage Step 4" },
1461 { 37, "Amperage Step 5" },
1462 { 38, "Amperage Step 6" },
1463 { 39, "Amperage Step 7" },
1464 { 40, "Amperage Step 8" },
1465 { 41, "Amperage Step 9" },
1466 { 42, "Amperage Step 10" },
1467 { 43, "Amperage Step 11" },
1468 { 44, "Amperage Step 12" },
1469 { 45, "Amperage Step 13" },
1470 { 46, "Amperage Step 14" },
1471 { 47, "Amperage Step 15" },
1472 { 48, "Amperage Step 16" },
1473 { 49, "Amperage Step 17" },
1474 { 50, "Amperage Step 18" },
1475 { 51, "Amperage Step 19" },
1476 { 52, "Amperage Step 20" },
1477 { 53, "Voltage Time Step 1" },
1478 { 54, "Voltage Time Step 2" },
1479 { 55, "Voltage Time Step 3" },
1480 { 56, "Voltage Time Step 4" },
1481 { 57, "Voltage Time Step 5" },
1482 { 58, "Voltage Time Step 6" },
1483 { 59, "Voltage Time Step 7" },
1484 { 60, "Voltage Time Step 8" },
1485 { 61, "Voltage Time Step 9" },
1486 { 62, "Voltage Time Step 10" },
1487 { 63, "Voltage Time Step 11" },
1488 { 64, "Voltage Time Step 12" },
1489 { 65, "Voltage Time Step 13" },
1490 { 66, "Voltage Time Step 14" },
1491 { 67, "Voltage Time Step 15" },
1492 { 68, "Voltage Time Step 16" },
1493 { 69, "Voltage Time Step 17" },
1494 { 70, "Voltage Time Step 18" },
1495 { 71, "Voltage Time Step 19" },
1496 { 72, "Voltage Time Step 20" },
1497 { 0, NULL((void*)0) }
1498};
1499static value_string_ext acn_blob_dimmer_load_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_load_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_load_properties1_field_name
) / sizeof ((acn_blob_dimmer_load_properties1_field_name)[0])
)-1, acn_blob_dimmer_load_properties1_field_name, "acn_blob_dimmer_load_properties1_field_name"
, ((void*)0) }
;
1500
1501static const value_string acn_blob_dimmer_rack_properties1_field_name[] = {
1502 { 1, "System" },
1503 { 2, "Processor" },
1504 { 3, "Rack" },
1505 { 4, "Lug" },
1506 { 5, "Module" },
1507 { 6, "Station" },
1508 { 7, "Port" },
1509 { 8, "Subdevice" },
1510 { 9, "Space" },
1511 { 10, "UDN" },
1512 { 11, "Reserved" },
1513 { 12, "Rack CID" },
1514 { 13, "Rack Number" },
1515 { 14, "Rack Name" },
1516 { 15, "Rack Model" },
1517 { 16, "Rack AF Enable" },
1518 { 17, "Temperature Format" },
1519 { 18, "Data Loss Behavior DMX A" },
1520 { 19, "Data Loss Behavior DMX B" },
1521 { 20, "Data Loss Behavior sACN" },
1522 { 21, "Data Loss Cross/Wait Time DMX A" },
1523 { 22, "Data Loss Cross/Wait Time DMX B" },
1524 { 23, "Data Loss Wait Time sACN" },
1525 { 24, "Data Loss Fade Time DMX A" },
1526 { 25, "Data Loss Fade Time DMX B" },
1527 { 26, "Data Loss Fade Time sACN" },
1528 { 27, "Data Loss Preset DMX A" },
1529 { 28, "Data Loss Preset DMX B" },
1530 { 29, "Data Port Priority DMX A" },
1531 { 30, "Data Port Priority DMX B" },
1532 { 31, "Data Port Enabled DMX A" },
1533 { 32, "Data Port Enabled DMX B" },
1534 { 33, "Data Port Enabled sACN" },
1535 { 34, "16 Bit Enabled DMX A" },
1536 { 35, "16 Bit Enabled DMX B" },
1537 { 36, "16 Bit Enabled sACN" },
1538 { 37, "Patch From Home Screen" },
1539 { 38, "SCR Off Time" },
1540 { 39, "Time Mode" },
1541 { 40, "Offset from UTC" },
1542 { 41, "Universal Hold Last Look Time" },
1543 { 42, "Reactivate Presets On Boot" },
1544 { 43, "Voltage High Warning Level" },
1545 { 44, "Temperature High Warning Level" },
1546 { 45, "Fan Operation Timing" },
1547 { 46, "Allow Backplane Communication Errors" },
1548 { 0, NULL((void*)0) }
1549};
1550static value_string_ext acn_blob_dimmer_rack_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_rack_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_rack_properties1_field_name
) / sizeof ((acn_blob_dimmer_rack_properties1_field_name)[0])
)-1, acn_blob_dimmer_rack_properties1_field_name, "acn_blob_dimmer_rack_properties1_field_name"
, ((void*)0) }
;
1551
1552
1553static const value_string acn_blob_dimmer_rack_status_properties1_field_name[] = {
1554 { 1, "System" },
1555 { 2, "Processor" },
1556 { 3, "Rack" },
1557 { 4, "Lug" },
1558 { 5, "Module" },
1559 { 6, "Station" },
1560 { 7, "Port" },
1561 { 8, "Subdevice" },
1562 { 9, "Space" },
1563 { 10, "UDN" },
1564 { 11, "Reserved" },
1565 { 12, "CPU Temperature" },
1566 { 13, "Time of Last Reboot" },
1567 { 14, "Time Now" },
1568 { 15, "Rack Phasing" },
1569 { 16, "Power Frequency" },
1570 { 17, "Phase A Voltage" },
1571 { 18, "Phase B Voltage" },
1572 { 19, "Phase C Voltage" },
1573 { 20, "DMX A Port Status" },
1574 { 21, "DMX B Port Status" },
1575 { 22, "Rack AF State" },
1576 { 23, "Number of Stored Presets for This Rack" },
1577 { 24, "Number of Lugs in This Rack" },
1578 { 25, "DSP Version" },
1579 { 26, "AF Card Version Slot 1" },
1580 { 27, "AF Card Version Slot 2" },
1581 { 28, "AF Card Version Slot 3" },
1582 { 29, "AF Card Version Slot 4" },
1583 { 30, "HCS08 Version" },
1584 { 31, "FPGA Version" },
1585 { 32, "Upload Progress AF Card 1" },
1586 { 33, "Upload Progress AF Card 2" },
1587 { 34, "Upload Progress AF Card 3" },
1588 { 35, "Upload Progress AF Card 4" },
1589 { 0, NULL((void*)0) }
1590};
1591static value_string_ext acn_blob_dimmer_rack_status_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_rack_status_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_rack_status_properties1_field_name
) / sizeof ((acn_blob_dimmer_rack_status_properties1_field_name
)[0]))-1, acn_blob_dimmer_rack_status_properties1_field_name,
"acn_blob_dimmer_rack_status_properties1_field_name", ((void
*)0) }
;
1592
1593static const value_string acn_blob_dimmer_status_properties1_field_name[] = {
1594 { 1, "System" },
1595 { 2, "Processor" },
1596 { 3, "Rack" },
1597 { 4, "Lug" },
1598 { 5, "Module" },
1599 { 6, "Station" },
1600 { 7, "Port" },
1601 { 8, "Subdevice" },
1602 { 9, "Space" },
1603 { 10, "UDN" },
1604 { 11, "Reserved" },
1605 { 12, "Source Winning Control" },
1606 { 13, "Priority of Winning Source" },
1607 { 14, "Winning Level" },
1608 { 15, "Winning DMX A Level" },
1609 { 16, "Winning DMX B Level" },
1610 { 17, "Winning sACN Level" },
1611 { 18, "Source Winning Control DD" },
1612 { 19, "Priority of Winning Source DD" },
1613 { 20, "Winning Level DD" },
1614 { 21, "Winning DMX A Level DD" },
1615 { 22, "Winning DMX B Level DD" },
1616 { 23, "Winning DMX sACN Level DD" },
1617 { 24, "Actual Load" },
1618 { 0, NULL((void*)0) }
1619};
1620static value_string_ext acn_blob_dimmer_status_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_status_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_status_properties1_field_name
) / sizeof ((acn_blob_dimmer_status_properties1_field_name)[0
]))-1, acn_blob_dimmer_status_properties1_field_name, "acn_blob_dimmer_status_properties1_field_name"
, ((void*)0) }
;
1621
1622static const value_string acn_blob_preset_operation_field_name[] = {
1623 { 1, "Operation Type" },
1624 { 2, "Preset Number" },
1625 { 3, "Space" },
1626 { 0, NULL((void*)0) }
1627};
1628
1629static const value_string acn_blob_preset_properties_field_name[] = {
1630 { 1, "System" },
1631 { 2, "Processor" },
1632 { 3, "Rack" },
1633 { 4, "Lug" },
1634 { 5, "Module" },
1635 { 6, "Station" },
1636 { 7, "Port" },
1637 { 8, "Subdevice" },
1638 { 9, "Space" },
1639 { 10, "UDN" },
1640 { 11, "Reserved" },
1641 { 12, "Preset Number" },
1642 { 13, "Preset Name" },
1643 { 14, "Fade In Time" },
1644 { 15, "Fade Out Time" },
1645 { 16, "Priority" },
1646 { 17, "Levels" },
1647 { 18, "Level[0]" },
1648 { 19, "Level[1]" },
1649 { 20, "Level[2]" },
1650 { 21, "Level[3]" },
1651 { 22, "Level[4]" },
1652 { 23, "Level[5]" },
1653 { 24, "Level[6]" },
1654 { 25, "Level[7]" },
1655 { 26, "Level[8]" },
1656 { 27, "Level[9]" },
1657 { 28, "Level[10]" },
1658 { 29, "Level[11]" },
1659 { 30, "Level[12]" },
1660 { 31, "Level[13]" },
1661 { 32, "Level[14]" },
1662 { 33, "Level[15]" },
1663 { 34, "Level[16]" },
1664 { 35, "Level[17]" },
1665 { 36, "Level[18]" },
1666 { 37, "Level[19]" },
1667 { 38, "Level[20]" },
1668 { 39, "Level[21]" },
1669 { 40, "Level[22]" },
1670 { 41, "Level[23]" },
1671 { 42, "Level[24]" },
1672 { 43, "Level[25]" },
1673 { 44, "Level[26]" },
1674 { 45, "Level[27]" },
1675 { 46, "Level[28]" },
1676 { 47, "Level[29]" },
1677 { 48, "Level[30]" },
1678 { 49, "Level[31]" },
1679 { 50, "Level[32]" },
1680 { 51, "Level[33]" },
1681 { 52, "Level[34]" },
1682 { 53, "Level[35]" },
1683 { 54, "Level[36]" },
1684 { 55, "Level[37]" },
1685 { 56, "Level[38]" },
1686 { 57, "Level[39]" },
1687 { 58, "Level[40]" },
1688 { 59, "Level[41]" },
1689 { 60, "Level[42]" },
1690 { 61, "Level[43]" },
1691 { 62, "Level[44]" },
1692 { 63, "Level[45]" },
1693 { 64, "Level[46]" },
1694 { 65, "Level[47]" },
1695 { 66, "Level[48]" },
1696 { 67, "Level[49]" },
1697 { 68, "Level[50]" },
1698 { 69, "Level[51]" },
1699 { 70, "Level[52]" },
1700 { 71, "Level[53]" },
1701 { 72, "Level[54]" },
1702 { 73, "Level[55]" },
1703 { 74, "Level[56]" },
1704 { 75, "Level[57]" },
1705 { 76, "Level[58]" },
1706 { 77, "Level[59]" },
1707 { 78, "Level[60]" },
1708 { 79, "Level[61]" },
1709 { 80, "Level[62]" },
1710 { 81, "Level[63]" },
1711 { 82, "Level[64]" },
1712 { 83, "Level[65]" },
1713 { 84, "Level[66]" },
1714 { 85, "Level[67]" },
1715 { 86, "Level[68]" },
1716 { 87, "Level[69]" },
1717 { 88, "Level[70]" },
1718 { 89, "Level[71]" },
1719 { 90, "Level[72]" },
1720 { 91, "Level[73]" },
1721 { 92, "Level[74]" },
1722 { 93, "Level[75]" },
1723 { 94, "Level[76]" },
1724 { 95, "Level[77]" },
1725 { 96, "Level[78]" },
1726 { 97, "Level[79]" },
1727 { 98, "Level[80]" },
1728 { 99, "Level[81]" },
1729 { 100, "Level[82]" },
1730 { 101, "Level[83]" },
1731 { 102, "Level[84]" },
1732 { 103, "Level[85]" },
1733 { 104, "Level[86]" },
1734 { 105, "Level[87]" },
1735 { 106, "Level[88]" },
1736 { 107, "Level[89]" },
1737 { 108, "Level[90]" },
1738 { 109, "Level[91]" },
1739 { 110, "Level[92]" },
1740 { 111, "Level[93]" },
1741 { 112, "Level[94]" },
1742 { 113, "Level[95]" },
1743 { 114, "Level[96]" },
1744 { 115, "Level[97]" },
1745 { 116, "Level[98]" },
1746 { 117, "Level[99]" },
1747 { 118, "Level[100]" },
1748 { 119, "Level[101]" },
1749 { 120, "Level[102]" },
1750 { 121, "Level[103]" },
1751 { 122, "Level[104]" },
1752 { 123, "Level[105]" },
1753 { 124, "Level[106]" },
1754 { 125, "Level[107]" },
1755 { 126, "Level[108]" },
1756 { 127, "Level[109]" },
1757 { 128, "Level[110]" },
1758 { 129, "Level[111]" },
1759 { 130, "Level[112]" },
1760 { 131, "Level[113]" },
1761 { 132, "Level[114]" },
1762 { 133, "Level[115]" },
1763 { 134, "Level[116]" },
1764 { 135, "Level[117]" },
1765 { 136, "Level[118]" },
1766 { 137, "Level[119]" },
1767 { 138, "Level[120]" },
1768 { 139, "Level[121]" },
1769 { 140, "Level[122]" },
1770 { 141, "Level[123]" },
1771 { 142, "Level[124]" },
1772 { 143, "Level[125]" },
1773 { 144, "Level[126]" },
1774 { 145, "Level[127]" },
1775 { 146, "Level[128]" },
1776 { 147, "Level[129]" },
1777 { 148, "Level[130]" },
1778 { 149, "Level[131]" },
1779 { 150, "Level[132]" },
1780 { 151, "Level[133]" },
1781 { 152, "Level[134]" },
1782 { 153, "Level[135]" },
1783 { 154, "Level[136]" },
1784 { 155, "Level[137]" },
1785 { 156, "Level[138]" },
1786 { 157, "Level[139]" },
1787 { 158, "Level[140]" },
1788 { 159, "Level[141]" },
1789 { 160, "Level[142]" },
1790 { 161, "Level[143]" },
1791 { 162, "Level[144]" },
1792 { 163, "Level[145]" },
1793 { 164, "Level[146]" },
1794 { 165, "Level[147]" },
1795 { 166, "Level[148]" },
1796 { 167, "Level[149]" },
1797 { 168, "Level[150]" },
1798 { 169, "Level[151]" },
1799 { 170, "Level[152]" },
1800 { 171, "Level[153]" },
1801 { 172, "Level[154]" },
1802 { 173, "Level[155]" },
1803 { 174, "Level[156]" },
1804 { 175, "Level[157]" },
1805 { 176, "Level[158]" },
1806 { 177, "Level[159]" },
1807 { 178, "Level[160]" },
1808 { 179, "Level[161]" },
1809 { 180, "Level[162]" },
1810 { 181, "Level[163]" },
1811 { 182, "Level[164]" },
1812 { 183, "Level[165]" },
1813 { 184, "Level[166]" },
1814 { 185, "Level[167]" },
1815 { 186, "Level[168]" },
1816 { 187, "Level[169]" },
1817 { 188, "Level[170]" },
1818 { 189, "Level[171]" },
1819 { 190, "Level[172]" },
1820 { 191, "Level[173]" },
1821 { 192, "Level[174]" },
1822 { 193, "Level[175]" },
1823 { 194, "Level[176]" },
1824 { 195, "Level[177]" },
1825 { 196, "Level[178]" },
1826 { 197, "Level[179]" },
1827 { 198, "Level[180]" },
1828 { 199, "Level[181]" },
1829 { 200, "Level[182]" },
1830 { 201, "Level[183]" },
1831 { 202, "Level[184]" },
1832 { 203, "Level[185]" },
1833 { 204, "Level[186]" },
1834 { 205, "Level[187]" },
1835 { 206, "Level[188]" },
1836 { 207, "Level[189]" },
1837 { 208, "Level[190]" },
1838 { 209, "Level[191]" },
1839 { 0, NULL((void*)0) }
1840};
1841static value_string_ext acn_blob_preset_properties_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_preset_properties_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_preset_properties_field_name
) / sizeof ((acn_blob_preset_properties_field_name)[0]))-1, acn_blob_preset_properties_field_name
, "acn_blob_preset_properties_field_name", ((void*)0) }
;
1842
1843static const value_string acn_blob_range_type_vals[] = {
1844 { ACN_BLOB_RANGE_MID0, "Middle range Blob" },
1845 { ACN_BLOB_RANGE_START1, "Start range Blob" },
1846 { ACN_BLOB_RANGE_END2, "End Range Blob" },
1847 { ACN_BLOB_RANGE_SINGLE3, "Single Blob" },
1848 { 0, NULL((void*)0) }
1849};
1850
1851static const value_string acn_blob_set_levels_operation_field_name[] = {
1852 { 1, "Start Dimmer Address" },
1853 { 2, "End Dimmer Address" },
1854 { 3, "DD Side" },
1855 { 4, "Space" },
1856 { 5, "Level" },
1857 { 0, NULL((void*)0) }
1858};
1859
1860static const value_string acn_blob_time2_field_name[] = {
1861 { 1, "Time" },
1862 { 2, "Time Zone Name" },
1863 { 3, "Time Zone Offset Hour" },
1864 { 4, "Time Zone Offset Min" },
1865 { 5, "Time Zone Offset Sec" },
1866 { 6, "DST Name" },
1867 { 7, "Start Month" },
1868 { 8, "Start Week" },
1869 { 9, "Start Day" },
1870 { 10, "End Month" },
1871 { 11, "End Week" },
1872 { 12, "End Day" },
1873 { 13, "Timed Event Update" },
1874 { 14, "Unix Time Zone Environment-compatible Name" },
1875 { 0, NULL((void*)0) }
1876};
1877
1878static const value_string acn_blob_rpc_field_name[] = {
1879 { 1, "Command" },
1880 { 2, "Transaction ID" },
1881 { 3, "Number of Arguments" },
1882 { 4, "Argument" },
1883 { 0, NULL((void*)0) }
1884};
1885
1886static const value_string acn_blob_dhcp_config_subnet_field_name[] = {
1887 { 1, "Command" },
1888 { 2, "Subnet" },
1889 { 3, "Netmask" },
1890 { 4, "Given Next Server" },
1891 { 5, "Given Router" },
1892 { 6, "Given Netmask" },
1893 { 7, "Default Lease Time" },
1894 { 8, "Max Lease Time" },
1895 { 9, "Given Domain Name" },
1896 { 10, "Given DNS Servers" },
1897 { 11, "Given NTP Server" },
1898 { 12, "Given Time Zone Offset Hour" },
1899 { 13, "Given Time Zone Offset Minute" },
1900 { 14, "Given Time Zone Offset Second" },
1901 { 15, "Given Time Zone DST Name" },
1902 { 16, "Given Time Zone Start Month" },
1903 { 17, "Given Time Zone Start Week" },
1904 { 18, "Given Time Zone Start Day" },
1905 { 19, "Given Time Zone End Month" },
1906 { 20, "Given Time Zone End Week" },
1907 { 21, "Given Time Zone End Day" },
1908 { 22, "Given UNIX Timezone Name" },
1909 { 0, NULL((void*)0) }
1910};
1911
1912static const value_string acn_blob_dhcp_config_static_route_field_name[] = {
1913 { 1, "Command" },
1914 { 2, "Subnet" },
1915 { 3, "Netmask" },
1916 { 4, "MAC Address" },
1917 { 5, "Host Name" },
1918 { 6, "Address" },
1919 { 0, NULL((void*)0) }
1920};
1921
1922static const value_string acn_blob_energy_management_field_name[] = {
1923 { 1, "Project ID" },
1924 { 2, "Space" },
1925 { 3, "Circuit Power Count" },
1926 { 4, "Circuit" },
1927 { 5, "Power" },
1928 { 6, "Shed Actual" },
1929 { 7, "Shed Potential" },
1930 { 0, NULL((void*)0) }
1931};
1932
1933static const value_string acn_blob_time3_field_name[] = {
1934 { 1, "Time" },
1935 { 2, "Time Zone Index" },
1936 { 3, "City" },
1937 { 4, "Country" },
1938 { 5, "Longitude" },
1939 { 6, "Latitude" },
1940 { 7, "UTC Offset Hours" },
1941 { 8, "UTC Offset Minutes" },
1942 { 9, "Time Zone Name" },
1943 { 10, "DST Type" },
1944 { 11, "DST Start Month" },
1945 { 12, "DST Start Week" },
1946 { 13, "DST Start Day" },
1947 { 14, "DST Start Hours" },
1948 { 15, "DST Start Minutes" },
1949 { 16, "DST Start Locality" },
1950 { 17, "DST Stop Month" },
1951 { 18, "DST Stop Week" },
1952 { 19, "DST Stop Day" },
1953 { 20, "DST Stop Hours" },
1954 { 21, "DST Stop Minutes" },
1955 { 22, "DST Stop Locality" },
1956 { 23, "Timed Event Update" },
1957 { 0, NULL((void*)0) }
1958};
1959
1960static const value_string acn_blob_time3_time_zone_vals[] = {
1961 { 0, "Aalborg, Denmark - Central European Standard Time : (UTC+01:00)" },
1962 { 1, "Aberdeen, United Kingdom - Greenwich Mean Time : (UTC)" },
1963 { 2, "Abu Dhabi, United Arab Emirates - Gulf Standard Time : (UTC+04:00)" },
1964 { 3, "Abuja, Nigeria - West Africa Time : (UTC+01:00)" },
1965 { 4, "Accra, Ghana - Greenwich Mean Time : (UTC)" },
1966 { 5, "Addis Ababa, Ethiopia - Eastern Africa Standard Time : (UTC+03:00)" },
1967 { 6, "Adelaide, SA, Australia - Australian Central Standard Time : (UTC+09:30)" },
1968 { 7, "Agana, GU, Guam - Chamorro Standard Time : (UTC+10:00)" },
1969 { 8, "Ahmadabad, India - India Standard Time : (UTC+05:30)" },
1970 { 9, "Akita, Japan - Japan Standard Time : (UTC+09:00)" },
1971 { 10, "Akron, OH, USA - Eastern Standard Time : (UTC-05:00)" },
1972 { 11, "Albuquerque, NM, USA - Mountain Standard Time : (UTC-07:00)" },
1973 { 12, "Alexandria, VA, USA - Eastern Standard Time : (UTC-05:00)" },
1974 { 13, "Algiers, Algeria - Central European Standard Time : (UTC+01:00)" },
1975 { 14, "Allentown, PA, USA - Eastern Standard Time : (UTC-05:00)" },
1976 { 15, "Almaty, Kazakhstan - Alma-Ata Time : (UTC+06:00)" },
1977 { 16, "Amman, Jordan - Arabia Standard Time : (UTC+03:00)" },
1978 { 17, "Amsterdam, Netherlands - Central European Standard Time : (UTC+01:00)" },
1979 { 18, "Anaheim, CA, USA - Pacific Standard Time : (UTC-08:00)" },
1980 { 19, "Anchorage, AK, USA - Alaska Standard Time : (UTC-09:00)" },
1981 { 20, "Andorra la Vella, Andorra - Central European Standard Time : (UTC+01:00)" },
1982 { 21, "Angers, France - Central European Standard Time : (UTC+01:00)" },
1983 { 22, "Ankara, Turkey - Eastern European Standard Time : (UTC+02:00)" },
1984 { 23, "Ann Arbor, MI, USA - Eastern Standard Time : (UTC-05:00)" },
1985 { 24, "Antananarivo, Madagascar - Eastern Africa Standard Time : (UTC+03:00)" },
1986 { 25, "Antwerp, Belgium - Central European Standard Time : (UTC+01:00)" },
1987 { 26, "Apia, Samoa - West Samoa Time : (UTC+14:00)" },
1988 { 27, "Ashgabat, Turkmenistan - Turkmenistan Time : (UTC+05:00)" },
1989 { 28, "Asmara, Eritrea - Eastern Africa Standard Time : (UTC+03:00)" },
1990 { 29, "Athens, Greece - Eastern European Standard Time : (UTC+02:00)" },
1991 { 30, "Atlanta, GA, USA - Eastern Standard Time : (UTC-05:00)" },
1992 { 31, "Auckland, New Zealand - New Zealand Standard Time : (UTC+12:00)" },
1993 { 32, "Austin, TX, USA - Central Standard Time : (UTC-06:00)" },
1994 { 33, "Badajoz, Spain - Central European Standard Time : (UTC+01:00)" },
1995 { 34, "Baghdad, Iraq - Arabia Standard Time : (UTC+03:00)" },
1996 { 35, "Bakersfield, CA, USA - Pacific Standard Time : (UTC-08:00)" },
1997 { 36, "Baku, Azerbaijan - Azerbaijan Time : (UTC+04:00)" },
1998 { 37, "Baltimore, MD, USA - Eastern Standard Time : (UTC-05:00)" },
1999 { 38, "Bamako, Mali - Greenwich Mean Time : (UTC)" },
2000 { 39, "Bandar Seri Begawan, Brunei - Brunei Darussalam Time : (UTC+08:00)" },
2001 { 40, "Bangalore, India - India Standard Time : (UTC+05:30)" },
2002 { 41, "Bangkok, Thailand - Indochina Time : (UTC+07:00)" },
2003 { 42, "Bangui, Central African Republic - West Africa Time : (UTC+01:00)" },
2004 { 43, "Banjul, Gambia - Greenwich Mean Time : (UTC)" },
2005 { 44, "Barcelona, Spain - Central European Standard Time : (UTC+01:00)" },
2006 { 45, "Bari, Italy - Central European Standard Time : (UTC+01:00)" },
2007 { 46, "Baton Rouge, LA, USA - Central Standard Time : (UTC-06:00)" },
2008 { 47, "Beaumont, TX, USA - Central Standard Time : (UTC-06:00)" },
2009 { 48, "Beijing, China - China Standard Time : (UTC+08:00)" },
2010 { 49, "Beirut, Lebanon - Eastern European Standard Time : (UTC+02:00)" },
2011 { 50, "Belem, Brazil - Brasilia Time : (UTC-03:00)" },
2012 { 51, "Belfast, United Kingdom - Greenwich Mean Time : (UTC)" },
2013 { 52, "Belgrade, Serbia - Central European Standard Time : (UTC+01:00)" },
2014 { 53, "Belmopan, Belize - Central Standard Time : (UTC-06:00)" },
2015 { 54, "Belo Horizonte, Brazil - Brasilia Time : (UTC-03:00)" },
2016 { 55, "Bergen, Norway - Central European Standard Time : (UTC+01:00)" },
2017 { 56, "Berkeley, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2018 { 57, "Berlin, Germany - Central European Standard Time : (UTC+01:00)" },
2019 { 58, "Bern, Switzerland - Central European Standard Time : (UTC+01:00)" },
2020 { 59, "Birmingham, AL, USA - Central Standard Time : (UTC-06:00)" },
2021 { 60, "Birmingham, United Kingdom - Greenwich Mean Time : (UTC)" },
2022 { 61, "Bishkek, Kyrgyzstan - Kyrgyzstan Time : (UTC+06:00)" },
2023 { 62, "Bissau, Guinea-Bissau - Greenwich Mean Time : (UTC)" },
2024 { 63, "Boise, ID, USA - Mountain Standard Time : (UTC-07:00)" },
2025 { 64, "Bologna, Italy - Central European Standard Time : (UTC+01:00)" },
2026 { 65, "Bonn, Germany - Central European Standard Time : (UTC+01:00)" },
2027 { 66, "Bordeaux, France - Central European Standard Time : (UTC+01:00)" },
2028 { 67, "Boston, MA, USA - Eastern Standard Time : (UTC-05:00)" },
2029 { 68, "Bournemouth, United Kingdom - Greenwich Mean Time : (UTC)" },
2030 { 69, "Brasilia, Brazil - Brasilia Time : (UTC-03:00)" },
2031 { 70, "Bratislava, Slovakia - Central European Standard Time : (UTC+01:00)" },
2032 { 71, "Brazzaville, Republic of the Congo - West Africa Time : (UTC+01:00)" },
2033 { 72, "Bremen, Germany - Central European Standard Time : (UTC+01:00)" },
2034 { 73, "Brest, France - Central European Standard Time : (UTC+01:00)" },
2035 { 74, "Bridgeport, CT, USA - Eastern Standard Time : (UTC-05:00)" },
2036 { 75, "Bridgetown, Barbados - Atlantic Standard Time : (UTC-04:00)" },
2037 { 76, "Brisbane, QLD, Australia - Australian Eastern Standard Time : (UTC+10:00)" },
2038 { 77, "Brno, Czech Republic - Central European Standard Time : (UTC+01:00)" },
2039 { 78, "Brussels, Belgium - Central European Standard Time : (UTC+01:00)" },
2040 { 79, "Bucharest, Romania - Eastern European Standard Time : (UTC+02:00)" },
2041 { 80, "Budapest, Hungary - Central European Standard Time : (UTC+01:00)" },
2042 { 81, "Buenos Aires, Argentina - Argentina Time : (UTC-03:00)" },
2043 { 82, "Buffalo, NY, USA - Eastern Standard Time : (UTC-05:00)" },
2044 { 83, "Bujumbura, Burundi - South Africa Standard Time : (UTC+02:00)" },
2045 { 84, "Cagliari, Italy - Central European Standard Time : (UTC+01:00)" },
2046 { 85, "Cairo, Egypt - Eastern European Standard Time : (UTC+02:00)" },
2047 { 86, "Calgary, AB, Canada - Mountain Standard Time : (UTC-07:00)" },
2048 { 87, "Cali, Colombia - Colombia Time : (UTC-05:00)" },
2049 { 88, "Canberra, Australia - Australian Eastern Standard Time : (UTC+10:00)" },
2050 { 89, "Cape Town, South Africa - South Africa Standard Time : (UTC+02:00)" },
2051 { 90, "Caracas, Venezuela - Venezuelan Standard Time : (UTC-04:30)" },
2052 { 91, "Cardiff, United Kingdom - Greenwich Mean Time : (UTC)" },
2053 { 92, "Cedar Rapids, IA, USA - Central Standard Time : (UTC-06:00)" },
2054 { 93, "Charlotte, NC, USA - Eastern Standard Time : (UTC-05:00)" },
2055 { 94, "Charlottetown, PE, Canada - Atlantic Standard Time : (UTC-04:00)" },
2056 { 95, "Chatham Islands, Chatham Islands, New Zealand - Chatham Island Standard Time : (UTC+12:45)" },
2057 { 96, "Chengdu, China - China Standard Time : (UTC+08:00)" },
2058 { 97, "Chennai, India - India Standard Time : (UTC+05:30)" },
2059 { 98, "Chiba, Japan - Japan Standard Time : (UTC+09:00)" },
2060 { 99, "Chicago, IL, USA - Central Standard Time : (UTC-06:00)" },
2061 { 100, "Chisinau, Moldova - Eastern European Standard Time : (UTC+02:00)" },
2062 { 101, "Chongqing, China - China Standard Time : (UTC+08:00)" },
2063 { 102, "Cincinnati, OH, USA - Eastern Standard Time : (UTC-05:00)" },
2064 { 103, "Cleveland, OH, USA - Eastern Standard Time : (UTC-05:00)" },
2065 { 104, "Colorado Springs, CO, USA - Mountain Standard Time : (UTC-07:00)" },
2066 { 105, "Columbus, GA, USA - Eastern Standard Time : (UTC-05:00)" },
2067 { 106, "Columbus, OH, USA - Eastern Standard Time : (UTC-05:00)" },
2068 { 107, "Conakry, Guinea - Greenwich Mean Time : (UTC)" },
2069 { 108, "Copenhagen, Denmark - Central European Standard Time : (UTC+01:00)" },
2070 { 109, "Cork, Ireland - Greenwich Mean Time : (UTC)" },
2071 { 110, "Corpus Christi, TX, USA - Central Standard Time : (UTC-06:00)" },
2072 { 111, "Curitiba, Brazil - Brasilia Time : (UTC-03:00)" },
2073 { 112, "Dakar, Senegal - Greenwich Mean Time : (UTC)" },
2074 { 113, "Dallas, TX, USA - Central Standard Time : (UTC-06:00)" },
2075 { 114, "Damascus, Syria - Eastern European Standard Time : (UTC+02:00)" },
2076 { 115, "Dar es Salaam, Tanzania - Eastern Africa Standard Time : (UTC+03:00)" },
2077 { 116, "Darwin, NT, Australia - Australian Central Standard Time : (UTC+09:30)" },
2078 { 117, "Dayton, OH, USA - Eastern Standard Time : (UTC-05:00)" },
2079 { 118, "Delhi, India - India Standard Time : (UTC+05:30)" },
2080 { 119, "Denver, CO, USA - Mountain Standard Time : (UTC-07:00)" },
2081 { 120, "Des Moines, IA, USA - Central Standard Time : (UTC-06:00)" },
2082 { 121, "Detroit, MI, USA - Eastern Standard Time : (UTC-05:00)" },
2083 { 122, "Dhaka, Bangladesh - Central Asia Standard Time : (UTC+06:00)" },
2084 { 123, "Dijon, France - Romance Standard Time : (UTC+01:00)" },
2085 { 124, "Djibouti, Djibouti - Eastern Africa Standard Time : (UTC+03:00)" },
2086 { 125, "Doha, Qatar - Arabia Standard Time : (UTC+03:00)" },
2087 { 126, "Dortmund, Germany - Central European Standard Time : (UTC+01:00)" },
2088 { 127, "Dresden, Germany - Central European Standard Time : (UTC+01:00)" },
2089 { 128, "Dublin, Ireland - Greenwich Mean Time : (UTC)" },
2090 { 129, "Dushanbe, Tajikistan - Tajikistan Time : (UTC+05:00)" },
2091 { 130, "Dusseldorf, Germany - Central European Standard Time : (UTC+01:00)" },
2092 { 131, "Edinburgh, United Kingdom - Greenwich Mean Time : (UTC)" },
2093 { 132, "Edmonton, AB, Canada - Mountain Standard Time : (UTC-07:00)" },
2094 { 133, "El Paso, TX, USA - Mountain Standard Time : (UTC-07:00)" },
2095 { 134, "Erfurt, Germany - Central European Standard Time : (UTC+01:00)" },
2096 { 135, "Eucla, WA, Australia - Australian Central Western Standard Time : (UTC+08:45)" },
2097 { 136, "Eugene, OR, USA - Pacific Standard Time : (UTC-08:00)" },
2098 { 137, "Evansville, IN, USA - Eastern Standard Time : (UTC-05:00)" },
2099 { 138, "Florence, Italy - Central European Standard Time : (UTC+01:00)" },
2100 { 139, "Fort Defiance, AZ, USA - Mountain Standard Time : (UTC-07:00)" },
2101 { 140, "Fort Lauderdale, FL, USA - Eastern Standard Time : (UTC-05:00)" },
2102 { 141, "Fort Wayne, IN, USA - Eastern Standard Time : (UTC-05:00)" },
2103 { 142, "Fort Worth, TX, USA - Central Standard Time : (UTC-06:00)" },
2104 { 143, "Fortaleza, Brazil - Brasilia Time : (UTC-03:00)" },
2105 { 144, "Frankfurt, Germany - Central European Standard Time : (UTC+01:00)" },
2106 { 145, "Freetown, Sierra Leone - Greenwich Mean Time : (UTC)" },
2107 { 146, "Freiburg, Germany - Central European Standard Time : (UTC+01:00)" },
2108 { 147, "Fremont, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2109 { 148, "Fresno, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2110 { 149, "Fukuoka, Japan - Japan Standard Time : (UTC+09:00)" },
2111 { 150, "Gaborone, Botswana - Central Africa Time : (UTC+02:00)" },
2112 { 151, "Galway, Ireland - Greenwich Mean Time : (UTC)" },
2113 { 152, "Geneva, Switzerland - Central European Standard Time : (UTC+01:00)" },
2114 { 153, "Genova, Italy - Central European Standard Time : (UTC+01:00)" },
2115 { 154, "George Town, Cayman Islands - Eastern Standard Time : (UTC-05:00)" },
2116 { 155, "Georgetown, Guyana - Guyana Time : (UTC-04:00)" },
2117 { 156, "Glasgow, United Kingdom - Greenwich Mean Time : (UTC)" },
2118 { 157, "Glendale, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2119 { 158, "Granada, Spain - Central European Standard Time : (UTC+01:00)" },
2120 { 159, "Grand Rapids, MI, USA - Eastern Standard Time : (UTC-05:00)" },
2121 { 160, "Guadalajara, Mexico - Central Standard Time : (UTC-06:00)" },
2122 { 161, "Guangzhou, China - China Standard Time : (UTC+08:00)" },
2123 { 162, "Guatemala City, Guatemala - Central Standard Time : (UTC-06:00)" },
2124 { 163, "Haikou, China - China Standard Time : (UTC+08:00)" },
2125 { 164, "Halifax, NS, Canada - Atlantic Standard Time : (UTC-04:00)" },
2126 { 165, "Hamburg, Germany - Central European Standard Time : (UTC+01:00)" },
2127 { 166, "Hamilton, Bermuda - Atlantic Standard Time : (UTC-04:00)" },
2128 { 167, "Hannover, Germany - Central European Standard Time : (UTC+01:00)" },
2129 { 168, "Hanoi, Vietnam - Indochina Time : (UTC+07:00)" },
2130 { 169, "Harare, Zimbabwe - Central Africa Time : (UTC+02:00)" },
2131 { 170, "Harbin, China - China Standard Time : (UTC+08:00)" },
2132 { 171, "Hartford, CT, USA - Eastern Standard Time : (UTC-05:00)" },
2133 { 172, "Havana, Cuba - Cuba Standard Time : (UTC-05:00)" },
2134 { 173, "Helsinki, Finland - Eastern European Standard Time : (UTC+02:00)" },
2135 { 174, "Hiroshima, Japan - Japan Standard Time : (UTC+09:00)" },
2136 { 175, "Hobart, TAS, Australia - Australian Eastern Standard Time : (UTC+10:00)" },
2137 { 176, "Hong Kong SAR, China - China Standard Time : (UTC+08:00)" },
2138 { 177, "Honiara, Solomon Islands - Solomon Islands Time : (UTC+11:00)" },
2139 { 178, "Honolulu, HI, USA - Hawaii-Aleutian Standard Time : (UTC-10:00)" },
2140 { 179, "Houston, TX, USA - Central Standard Time : (UTC-06:00)" },
2141 { 180, "Hull, PQ, Canada - Eastern Standard Time : (UTC-05:00)" },
2142 { 181, "Huntsville, AL, USA - Central Standard Time : (UTC-06:00)" },
2143 { 182, "Indianapolis, IN, USA - Eastern Standard Time : (UTC-05:00)" },
2144 { 183, "Irkutsk, Russia - Irkutsk Time : (UTC+08:00)" },
2145 { 184, "Islamabad, Pakistan - Pakistan Standard Time : (UTC+05:00)" },
2146 { 185, "Istanbul, Turkey - Eastern European Standard Time : (UTC+02:00)" },
2147 { 186, "Jackson, MS, USA - Central Standard Time : (UTC-06:00)" },
2148 { 187, "Jacksonville, FL, USA - Eastern Standard Time : (UTC-05:00)" },
2149 { 188, "Jakarta, Indonesia - Western Indonesian Time : (UTC+07:00)" },
2150 { 189, "Jerusalem, Israel - Israel Standard Time : (UTC+02:00)" },
2151 { 190, "Kabul, Afghanistan - Afghanistan Standard Time : (UTC+04:30)" },
2152 { 191, "Kampala, Uganda - Eastern Africa Standard Time : (UTC+03:00)" },
2153 { 192, "Kanazawa, Japan - Japan Standard Time : (UTC+09:00)" },
2154 { 193, "Kansas City, KS, USA - Central Standard Time : (UTC-06:00)" },
2155 { 194, "Kansas City, MO, USA - Central Standard Time : (UTC-06:00)" },
2156 { 195, "Karachi, Pakistan - Pakistan Standard Time : (UTC+05:00)" },
2157 { 196, "Kathmandu, Nepal - Nepal Standard Time : (UTC+05:45)" },
2158 { 197, "Kelowna, BC, Canada - Pacific Standard Time : (UTC-08:00)" },
2159 { 198, "Khartoum, Sudan - Eastern Africa Standard Time : (UTC+03:00)" },
2160 { 199, "Kiev, Ukraine - Eastern European Standard Time : (UTC+02:00)" },
2161 { 200, "Kigali, Rwanda - Central Africa Time : (UTC+02:00)" },
2162 { 201, "Kingston, Jamaica - Eastern Standard Time : (UTC-05:00)" },
2163 { 202, "Kingston, Norfolk Island - Norfolk Time : (UTC+11:30)" },
2164 { 203, "Kinshasa, Democratic Republic of the Congo - West Africa Time : (UTC+01:00)" },
2165 { 204, "Kiritimati, Christmas Island, Kiribati - Line Islands Time : (UTC+14:00)" },
2166 { 205, "Knoxville, TN, USA - Eastern Standard Time : (UTC-05:00)" },
2167 { 206, "Kobe, Japan - Japan Standard Time : (UTC+09:00)" },
2168 { 207, "Kochi, Japan - Japan Standard Time : (UTC+09:00)" },
2169 { 208, "Kolkata (Calcutta), India - India Standard Time : (UTC+05:30)" },
2170 { 209, "Krasnoyarsk, Russia - Krasnoyarsk Time : (UTC+07:00)" },
2171 { 210, "Kuala Lumpur, Malaysia - Singapore Standard Time : (UTC+08:00)" },
2172 { 211, "Kuwait, Kuwait - Arabia Standard Time : (UTC+03:00)" },
2173 { 212, "Kwangju, Korea - Korea Standard Time : (UTC+09:00)" },
2174 { 213, "Kyoto, Japan - Japan Standard Time : (UTC+09:00)" },
2175 { 214, "La Paz, Bolivia - Bolivia Time : (UTC-04:00)" },
2176 { 215, "Lansing, MI, USA - Eastern Standard Time : (UTC-05:00)" },
2177 { 216, "Laredo, TX, USA - Central Standard Time : (UTC-06:00)" },
2178 { 217, "Las Vegas, NV, USA - Pacific Standard Time : (UTC-08:00)" },
2179 { 218, "Leipzig, Germany - Central European Standard Time : (UTC+01:00)" },
2180 { 219, "Lexington, KY, USA - Eastern Standard Time : (UTC-05:00)" },
2181 { 220, "Lhasa, China - China Standard Time : (UTC+08:00)" },
2182 { 221, "Libreville, Gabon - West Africa Time : (UTC+01:00)" },
2183 { 222, "Lille, France - Central European Standard Time : (UTC+01:00)" },
2184 { 223, "Lilongwe, Malawi - Central Africa Time : (UTC+02:00)" },
2185 { 224, "Lima, Peru - Peru Time : (UTC-05:00)" },
2186 { 225, "Limerick, Ireland - Greenwich Mean Time : (UTC)" },
2187 { 226, "Limoges, France - Central European Standard Time : (UTC+01:00)" },
2188 { 227, "Lincoln, NE, USA - Central Standard Time : (UTC-06:00)" },
2189 { 228, "Lisbon, Portugal - Greenwich Mean Time : (UTC)" },
2190 { 229, "Little Rock, AR, USA - Central Standard Time : (UTC-06:00)" },
2191 { 230, "Liverpool, United Kingdom - Greenwich Mean Time : (UTC)" },
2192 { 231, "Ljubljana, Slovenia - Central European Standard Time : (UTC+01:00)" },
2193 { 232, "London, United Kingdom - Greenwich Mean Time : (UTC)" },
2194 { 233, "Londonderry, United Kingdom - Greenwich Mean Time : (UTC)" },
2195 { 234, "Long Beach, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2196 { 235, "Lord Howe Island, Lord Howe Island, Australia - Lord Howe Standard Time : (UTC+10:30)" },
2197 { 236, "Los Angeles, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2198 { 237, "Louisville, KY, USA - Eastern Standard Time : (UTC-05:00)" },
2199 { 238, "Luanda, Angola - West Africa Time : (UTC+01:00)" },
2200 { 239, "Lubbock, TX, USA - Central Standard Time : (UTC-06:00)" },
2201 { 240, "Lusaka, Zambia - Central Africa Time : (UTC+02:00)" },
2202 { 241, "Luxembourg, Luxembourg - Central European Standard Time : (UTC+01:00)" },
2203 { 242, "Lyon, France - Central European Standard Time : (UTC+01:00)" },
2204 { 243, "Madison, WI, USA - Central Standard Time : (UTC-06:00)" },
2205 { 244, "Madrid, Spain - Central European Standard Time : (UTC+01:00)" },
2206 { 245, "Malabo, Equatorial Guinea - West Africa Time : (UTC+01:00)" },
2207 { 246, "Malaga, Spain - Central European Standard Time : (UTC+01:00)" },
2208 { 247, "Managua, Nicaragua - Central Standard Time : (UTC-06:00)" },
2209 { 248, "Manama, Bahrain - Arabia Standard Time : (UTC+03:00)" },
2210 { 249, "Manaus, Brazil - Amazon Time : (UTC-04:00)" },
2211 { 250, "Manchester, United Kingdom - Greenwich Mean Time : (UTC)" },
2212 { 251, "Manila, Philippines - Philippine Time : (UTC+08:00)" },
2213 { 252, "Maputo, Mozambique - Central Africa Time : (UTC+02:00)" },
2214 { 253, "Maracaibo, Venezuela - Venezuelan Standard Time : (UTC-04:30)" },
2215 { 254, "Marseille, France - Central European Standard Time : (UTC+01:00)" },
2216 { 255, "Maseru, Lesotho - South Africa Standard Time : (UTC+02:00)" },
2217 { 256, "Masqat, Oman - Gulf Standard Time : (UTC+04:00)" },
2218 { 257, "Mbabane, Swaziland - South Africa Standard Time : (UTC+02:00)" },
2219 { 258, "Medellin, Colombia - Colombia Time : (UTC-05:00)" },
2220 { 259, "Melbourne, VIC, Australia - Australian Eastern Standard Time : (UTC+10:00)" },
2221 { 260, "Memphis, TN, USA - Central Standard Time : (UTC-06:00)" },
2222 { 261, "Metz, France - Central European Standard Time : (UTC+01:00)" },
2223 { 262, "Mexico City, Mexico - Central Standard Time : (UTC-06:00)" },
2224 { 263, "Miami, FL, USA - Eastern Standard Time : (UTC-05:00)" },
2225 { 264, "Milan, Italy - Central European Standard Time : (UTC+01:00)" },
2226 { 265, "Milwaukee, WI, USA - Central Standard Time : (UTC-06:00)" },
2227 { 266, "Minneapolis, MN, USA - Central Standard Time : (UTC-06:00)" },
2228 { 267, "Minsk, Belarus - Further-Eastern European Time : (UTC+03:00)" },
2229 { 268, "Mobile, AL, USA - Central Standard Time : (UTC-06:00)" },
2230 { 269, "Mogadishu, Somalia - Eastern Africa Standard Time : (UTC+03:00)" },
2231 { 270, "Monaco, Monaco - Central European Standard Time : (UTC+01:00)" },
2232 { 271, "Monrovia, Liberia - Greenwich Mean Time : (UTC)" },
2233 { 272, "Monterrey, Mexico - Central Standard Time : (UTC-06:00)" },
2234 { 273, "Montevideo, Uruguay - Uruguay Time : (UTC-03:00)" },
2235 { 274, "Montreal, PQ, Canada - Eastern Standard Time : (UTC-05:00)" },
2236 { 275, "Morioka, Japan - Japan Standard Time : (UTC+09:00)" },
2237 { 276, "Moscow, Russia - Moscow Standard Time : (UTC+03:00)" },
2238 { 277, "Mumbai, India - India Standard Time : (UTC+05:30)" },
2239 { 278, "Munich, Germany - Central European Standard Time : (UTC+01:00)" },
2240 { 279, "Murmansk, Russia - Moscow Standard Time : (UTC+03:00)" },
2241 { 280, "N'Djamena, Chad - West Africa Time : (UTC+01:00)" },
2242 { 281, "Nagano, Japan - Japan Standard Time : (UTC+09:00)" },
2243 { 282, "Nagasaki, Japan - Japan Standard Time : (UTC+09:00)" },
2244 { 283, "Nagoya, Japan - Japan Standard Time : (UTC+09:00)" },
2245 { 284, "Nairobi, Kenya - Eastern Africa Standard Time : (UTC+03:00)" },
2246 { 285, "Nanjing, China - China Standard Time : (UTC+08:00)" },
2247 { 286, "Naples, Italy - Central European Standard Time : (UTC+01:00)" },
2248 { 287, "Nashville, TN, USA - Central Standard Time : (UTC-06:00)" },
2249 { 288, "Nassau, Bahamas - Eastern Standard Time : (UTC-05:00)" },
2250 { 289, "New Orleans, LA, USA - Central Standard Time : (UTC-06:00)" },
2251 { 290, "New York, NY, USA - Eastern Standard Time : (UTC-05:00)" },
2252 { 291, "Newark, NJ, USA - Eastern Standard Time : (UTC-05:00)" },
2253 { 292, "Niamey, Niger - West Africa Time : (UTC+01:00)" },
2254 { 293, "Nicosia, Cyprus - Eastern European Standard Time : (UTC+02:00)" },
2255 { 294, "Norwich, United Kingdom - Greenwich Mean Time : (UTC)" },
2256 { 295, "Nouakchott, Mauritania - Greenwich Mean Time : (UTC)" },
2257 { 296, "Novosibirsk, Russia - Novosibirsk Time : (UTC+06:00)" },
2258 { 297, "Nuku'alofa, Tonga - Tonga Standard Time : (UTC+13:00)" },
2259 { 298, "Nuuk, Greenland - West Greenland Time : (UTC-03;00)" },
2260 { 299, "Oakland, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2261 { 300, "Oklahoma City, OK, USA - Central Standard Time : (UTC-06:00)" },
2262 { 301, "Omaha, NE, USA - Central Standard Time : (UTC-06:00)" },
2263 { 302, "Orlando, FL, USA - Eastern Standard Time : (UTC-05:00)" },
2264 { 303, "Osaka, Japan - Japan Standard Time : (UTC+09:00)" },
2265 { 304, "Oshawa, ON, Canada - Eastern Standard Time : (UTC-05:00)" },
2266 { 305, "Oslo, Norway - Central European Standard Time : (UTC+01:00)" },
2267 { 306, "Ottawa, ON, Canada - Eastern Standard Time : (UTC-05:00)" },
2268 { 307, "Ouagadougou, Burkina Faso - Greenwich Mean Time : (UTC)" },
2269 { 308, "Overland Park, KS, USA - Central Standard Time : (UTC-06:00)" },
2270 { 309, "Oviedo, Spain - Central European Standard Time : (UTC+01:00)" },
2271 { 310, "Palermo, Italy - Central European Standard Time : (UTC+01:00)" },
2272 { 311, "Palma de Mallorca, Spain - Central European Standard Time : (UTC+01:00)" },
2273 { 312, "Panama City, Panama - Eastern Standard Time : (UTC-05:00)" },
2274 { 313, "Paramaribo, Surinam - Suriname Time : (UTC-03:00)" },
2275 { 314, "Paris, France - Central European Standard Time : (UTC+01:00)" },
2276 { 315, "Pasadena, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2277 { 316, "Pasadena, TX, USA - Central Standard Time : (UTC-06:00)" },
2278 { 317, "Peoria, IL, USA - Central Standard Time : (UTC-06:00)" },
2279 { 318, "Perth, WA, Australia - Australia Western Standard Time : (UTC+08:00)" },
2280 { 319, "Perugia, Italy - Central European Standard Time : (UTC+01:00)" },
2281 { 320, "Philadelphia, PA, USA - Eastern Standard Time : (UTC-05:00)" },
2282 { 321, "Phnom Penh, Cambodia - Indochina Time : (UTC+07:00)" },
2283 { 322, "Phoenix, AZ, USA - Mountain Standard Time : (UTC-07:00)" },
2284 { 323, "Pisa, Italy - Central European Standard Time : (UTC+01:00)" },
2285 { 324, "Pittsburgh, PA, USA - Eastern Standard Time : (UTC-05:00)" },
2286 { 325, "Plymouth, United Kingdom - Greenwich Mean Time : (UTC)" },
2287 { 326, "Port Louis, Mauritius - Mauritius Time : (UTC+04:00)" },
2288 { 327, "Port Moresby, Papua New Guinea - Papua New Guinea Time : (UTC+10:00)" },
2289 { 328, "Port-au-Prince, Haiti - Eastern Standard Time : (UTC-05:00)" },
2290 { 329, "Port-of-Spain, Trinidad and Tobago - Atlantic Standard Time : (UTC-04:00)" },
2291 { 330, "Portland, OR, USA - Pacific Standard Time : (UTC-08:00)" },
2292 { 331, "Porto Alegre, Brazil - Brasilia Time : (UTC-03:00)" },
2293 { 332, "Porto, Portugal - Western European Time : (UTC)" },
2294 { 333, "Porto-Novo, Benin - West Africa Time : (UTC+01:00)" },
2295 { 334, "Prague, Czech Republic - Central European Standard Time : (UTC+01:00)" },
2296 { 335, "Praia, Cape Verde - Cape Verde Time : (UTC-01:00)" },
2297 { 336, "Pretoria, South Africa - South Africa Standard Time : (UTC+02:00)" },
2298 { 337, "Providence, RI, USA - Eastern Standard Time : (UTC-05:00)" },
2299 { 338, "Puebla de Zaragoza, Mexico - Eastern Standard Time : (UTC-05:00)" },
2300 { 339, "Pusan, Korea - Korea Standard Time : (UTC+09:00)" },
2301 { 340, "Pyongyang, North Korea - Korea Standard Time : (UTC+09:00)" },
2302 { 341, "Quebec City, PQ, Canada - Eastern Standard Time : (UTC-05:00)" },
2303 { 342, "Quito, Ecuador - Ecuador Time : (UTC-05:00)" },
2304 { 343, "Rabat, Morocco - Western European Time : (UTC)" },
2305 { 344, "Raleigh, NC, USA - Eastern Standard Time : (UTC-05:00)" },
2306 { 345, "Recife, Brazil - Brasilia Time : (UTC-03:00)" },
2307 { 346, "Redmond, WA, USA - Pacific Standard Time : (UTC-08:00)" },
2308 { 347, "Reggio Calabria, Italy - Central European Standard Time : (UTC+01:00)" },
2309 { 348, "Regina, SK, Canada - Central Standard Time : (UTC-06:00)" },
2310 { 349, "Richmond, VA, USA - Eastern Standard Time : (UTC-05:00)" },
2311 { 350, "Riga, Latvia - Eastern European Standard Time : (UTC+02:00)" },
2312 { 351, "Rio de Janeiro, Brazil - Brasilia Time : (UTC-03:00)" },
2313 { 352, "Riyadh, Saudi Arabia - Arabia Standard Time : (UTC+03:00)" },
2314 { 353, "Rockford, IL, USA - Central Standard Time : (UTC-06:00)" },
2315 { 354, "Rome, Italy - Central European Standard Time : (UTC+01:00)" },
2316 { 355, "Roseau, Dominica - Atlantic Standard Time : (UTC-04:00)" },
2317 { 356, "Roswell, NM, USA - Mountain Standard Time : (UTC-07:00)" },
2318 { 357, "Rouen, France - Central European Standard Time : (UTC+01:00)" },
2319 { 358, "Sacramento, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2320 { 359, "Saint John, NB, Canada - Atlantic Standard Time : (UTC-04:00)" },
2321 { 360, "Saint Louis, MO, USA - Central Standard Time : (UTC-06:00)" },
2322 { 361, "Saint Paul, MN, USA - Central Standard Time : (UTC-06:00)" },
2323 { 362, "Salt Lake City, UT, USA - Mountain Standard Time : (UTC-07:00)" },
2324 { 363, "Salvador, Brazil - Brasilia Time : (UTC-03:00)" },
2325 { 364, "Salzburg, Austria - Central European Standard Time : (UTC+01:00)" },
2326 { 365, "San Antonio, TX, USA - Central Standard Time : (UTC-06:00)" },
2327 { 366, "San Bernardino, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2328 { 367, "San Diego, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2329 { 368, "San Francisco, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2330 { 369, "San Jose, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2331 { 370, "San Salvador, El Salvador - Central Standard Time : (UTC-06:00)" },
2332 { 371, "Sana'a, Yemen - Arabia Standard Time : (UTC+03:00)" },
2333 { 372, "Santa Ana, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2334 { 373, "Santa Rosa, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2335 { 374, "Santander, Spain - Central European Standard Time : (UTC+01:00)" },
2336 { 375, "Santiago, Chile - Chile Standard Time : (UTC-04:00)" },
2337 { 376, "Santo Domingo, Dominican Republic - Atlantic Standard Time : (UTC-04:00)" },
2338 { 377, "Sao Paulo, Brazil - Brasilia Time : (UTC-03:00)" },
2339 { 378, "Sapporo, Japan - Japan Standard Time : (UTC+09:00)" },
2340 { 379, "Sarajevo, Bosnia and Herzegovina - Central European Standard Time : (UTC+01:00)" },
2341 { 380, "Saskatoon, SK, Canada - Central Standard Time : (UTC-06:00)" },
2342 { 381, "Savannah, GA, USA - Eastern Standard Time : (UTC-05:00)" },
2343 { 382, "Seattle, WA, USA - Pacific Standard Time : (UTC-08:00)" },
2344 { 383, "Sendai, Japan - Japan Standard Time : (UTC+09:00)" },
2345 { 384, "Seoul, Korea - Korea Standard Time : (UTC+09:00)" },
2346 { 385, "Sevilla, Spain - Central European Standard Time : (UTC+01:00)" },
2347 { 386, "Shanghai, China - China Standard Time : (UTC+08:00)" },
2348 { 387, "Shreveport, LA, USA - Central Standard Time : (UTC-06:00)" },
2349 { 388, "Simi Valley, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2350 { 389, "Singapore, Singapore - Singapore Standard Time : (UTC+08:00)" },
2351 { 390, "Sioux Falls, SD, USA - Central Standard Time : (UTC-06:00)" },
2352 { 391, "Skopje, F.Y.R.O. Macedonia - Central European Standard Time : (UTC+01:00)" },
2353 { 392, "Sofia, Bulgaria - Eastern European Standard Time : (UTC+02:00)" },
2354 { 393, "South Bend, IN, USA - Eastern Standard Time : (UTC-05:00)" },
2355 { 394, "Spokane, WA, USA - Pacific Standard Time : (UTC-08:00)" },
2356 { 395, "Springfield, IL, USA - Central Standard Time : (UTC-06:00)" },
2357 { 396, "Springfield, MA, USA - Eastern Standard Time : (UTC-05:00)" },
2358 { 397, "Springfield, MO, USA - Central Standard Time : (UTC-06:00)" },
2359 { 398, "Sri Jayawardenepura, Sri Lanka - India Standard Time : (UTC+05:30)" },
2360 { 399, "St. Catharines, ON, Canada - Eastern Standard Time : (UTC-05:00)" },
2361 { 400, "St. John's, NF, Canada - Newfoundland Standard Time : (UTC-03:30)" },
2362 { 401, "St. Petersburg, FL, USA - Eastern Standard Time : (UTC-05:00)" },
2363 { 402, "St. Petersburg, Russia - Moscow Standard Time : (UTC+03:00)" },
2364 { 403, "Stockholm, Sweden - Central European Standard Time : (UTC+01:00)" },
2365 { 404, "Stockton, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2366 { 405, "Strasbourg, France - Central European Standard Time : (UTC+01:00)" },
2367 { 406, "Stuttgart, Germany - Central European Standard Time : (UTC+01:00)" },
2368 { 407, "Sucre, Bolivia - Bolivia Time : (UTC-04:00)" },
2369 { 408, "Sunnyvale, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2370 { 409, "Suva, Fiji Islands - Fiji Standard Time : (UTC+12:00)" },
2371 { 410, "Sydney, NSW, Australia - Australian Eastern Standard Time : (UTC+10:00)" },
2372 { 411, "Syracuse, NY, USA - Eastern Standard Time : (UTC-05:00)" },
2373 { 412, "T'bilisi, Georgia - Georgia Standard Time : (UTC+04:00)" },
2374 { 413, "Taejon, Korea - Korea Standard Time : (UTC+09:00)" },
2375 { 414, "Taiohae, Marquesas Islands, French Polynesia - Marquesas Time : (UTC-9:30)" },
2376 { 415, "Taipei, Taiwan - China Standard Time : (UTC+08:00)" },
2377 { 416, "Tallinn, Estonia - Eastern European Standard Time : (UTC+02:00)" },
2378 { 417, "Tampa, FL, USA - Eastern Standard Time : (UTC-05:00)" },
2379 { 418, "Taranto, Italy - Central European Standard Time : (UTC+01:00)" },
2380 { 419, "Tashkent, Uzbekistan - Uzbekistan Time : (UTC+05:00)" },
2381 { 420, "Tegucigalpa, Honduras - Central Standard Time : (UTC-06:00)" },
2382 { 421, "Tehran, Iran - Iran Standard Time : (UTC+03:30)" },
2383 { 422, "Tel Aviv, Israel - Israel Standard Time : (UTC+02:00)" },
2384 { 423, "The Hague, Netherlands - Central European Standard Time : (UTC+01:00)" },
2385 { 424, "Thimphu, Bhutan - Bhutan Time : (UTC+06:00)" },
2386 { 425, "Thunder Bay, ON, Canada - Eastern Standard Time : (UTC-05:00)" },
2387 { 426, "Tirana, Albania - Central European Standard Time : (UTC+01:00)" },
2388 { 427, "Tokyo, Japan - Japan Standard Time : (UTC+09:00)" },
2389 { 428, "Toledo, OH, USA - Eastern Standard Time : (UTC-05:00)" },
2390 { 429, "Torino, Italy - Central European Standard Time : (UTC+01:00)" },
2391 { 430, "Toronto, ON, Canada - Eastern Standard Time : (UTC-05:00)" },
2392 { 431, "Torrance, CA, USA - Pacific Standard Time : (UTC-08:00)" },
2393 { 432, "Toulouse, France - Central European Standard Time : (UTC+01:00)" },
2394 { 433, "Tripoli, Libya - Eastern European Standard Time : (UTC+02:00)" },
2395 { 434, "Tucson, AZ, USA - Mountain Standard Time : (UTC-07:00)" },
2396 { 435, "Tulsa, OK, USA - Central Standard Time : (UTC-06:00)" },
2397 { 436, "Tunis, Tunisia - West Africa Time : (UTC+01:00)" },
2398 { 437, "Ulaanbaatar, Mongolia - Ulaanbaatar Time : (UTC+08:00)" },
2399 { 438, "Urumqi, China - China Standard Time : (UTC+08:00)" },
2400 { 439, "Vaduz, Liechtenstein - Central European Standard Time : (UTC+01:00)" },
2401 { 440, "Valencia, Spain - Central European Standard Time : (UTC+01:00)" },
2402 { 441, "Valletta, Malta - Central European Standard Time : (UTC+01:00)" },
2403 { 442, "Vancouver, BC, Canada - Pacific Standard Time : (UTC-08:00)" },
2404 { 443, "Vatican City, Vatican City - Central European Standard Time : (UTC+01:00)" },
2405 { 444, "Venice, Italy - Central European Standard Time : (UTC+01:00)" },
2406 { 445, "Veracruz, Mexico - Central Standard Time : (UTC-06:00)" },
2407 { 446, "Victoria, Seychelles - Seychelles Time : (UTC+04:00)" },
2408 { 447, "Vienna, Austria - Central European Standard Time : (UTC+01:00)" },
2409 { 448, "Vientiane, Laos - Indochina Time : (UTC+07:00)" },
2410 { 449, "Vilnius, Lithuania - Eastern European Standard Time : (UTC+02:00)" },
2411 { 450, "Vladivostok, Russia - Vladivostok Standard Time : (UTC+10:00)" },
2412 { 451, "Volgograd, Russia - Moscow Standard Time : (UTC+03:00)" },
2413 { 452, "Waco, TX, USA - Central Standard Time : (UTC-06:00)" },
2414 { 453, "Warsaw, Poland - Central European Standard Time : (UTC+01:00)" },
2415 { 454, "Washington, DC, USA - Eastern Standard Time : (UTC-05:00)" },
2416 { 455, "Wellington, New Zealand - New Zealand Standard Time : (UTC+12:00)" },
2417 { 456, "Whitehorse, YT, Canada - Pacific Standard Time : (UTC-08:00)" },
2418 { 457, "Windhoek, Namibia - West Africa Time : (UTC+01:00)" },
2419 { 458, "Winnipeg, MB, Canada - Central Standard Time : (UTC-06:00)" },
2420 { 459, "Wuhan, China - China Standard Time : (UTC+08:00)" },
2421 { 460, "Xian, China - China Standard Time : (UTC+08:00)" },
2422 { 461, "Yakutsk, Russia - Yakutsk Standard Time : (UTC+09:00)" },
2423 { 462, "Yangon, Myanmar - Myanmar Standard Time : (UTC+06:30)" },
2424 { 463, "Yekaterinburg, Russia - Yekaterinburg Standard Time : (UTC+05:00)" },
2425 { 464, "Yellowknife, NT, Canada - Mountain Standard Time : (UTC-07:00)" },
2426 { 465, "Yerevan, Armenia - Armenia Time : (UTC+04:00)" },
2427 { 466, "Yokohama, Japan - Japan Standard Time : (UTC+09:00)" },
2428 { 467, "Zagreb, Croatia - Central European Standard Time : (UTC+01:00)" },
2429 { 468, "Zaragoza, Spain - Central European Standard Time : (UTC+01:00)" },
2430 { 469, "Zurich, Switzerland - Central European Standard Time : (UTC+01:00)" },
2431 { 0, NULL((void*)0) }
2432};
2433
2434static const value_string acn_blob_time3_dst_vals[] = {
2435 { 0, "DST US" },
2436 { 1, "DST Europe" },
2437 { 2, "DST Funky" },
2438 { 3, "DST None" },
2439 { 0, NULL((void*)0) }
2440};
2441
2442static const value_string acn_blob_time3_month_vals[] = {
2443 { 0, "None" },
2444 { 1, "January" },
2445 { 2, "February" },
2446 { 3, "March" },
2447 { 4, "April" },
2448 { 5, "May" },
2449 { 6, "June" },
2450 { 7, "July" },
2451 { 8, "August" },
2452 { 9, "September" },
2453 { 10, "October" },
2454 { 11, "November" },
2455 { 12, "December" },
2456 { 0, NULL((void*)0) }
2457};
2458
2459static const value_string acn_blob_time3_week_vals[] = {
2460 { 0, "None" },
2461 { 1, "First" },
2462 { 2, "Second" },
2463 { 3, "Third" },
2464 { 4, "Fourth" },
2465 { 5, "Last" },
2466 { 0, NULL((void*)0) }
2467};
2468
2469static const value_string acn_blob_time3_day_vals[] = {
2470 { 0, "Sunday" },
2471 { 1, "Monday" },
2472 { 2, "Tuesday" },
2473 { 3, "Wednesday" },
2474 { 4, "Thursday" },
2475 { 5, "Friday" },
2476 { 6, "Saturday" },
2477 { 0, NULL((void*)0) }
2478};
2479
2480static const value_string acn_blob_time3_locality_vals[] = {
2481 { 0, "LOCAL" },
2482 { 1, "UTC" },
2483 { 0, NULL((void*)0) }
2484};
2485
2486static const value_string acn_blob_energy_cost_field_name[] = {
2487 { 1, "Month" },
2488 { 2, "Day" },
2489 { 3, "Cost per Hour" },
2490 { 0, NULL((void*)0) }
2491};
2492
2493static const value_string acn_blob_sequence_operation_field_name[] = {
2494 { 1, "Operation Type" },
2495 { 2, "Space" },
2496 { 3, "Sequence Number" },
2497 { 4, "Step Number" },
2498 { 0, NULL((void*)0) }
2499};
2500
2501static const value_string acn_blob_sequence_step_properties_field_name[] = {
2502 { 1, "System" },
2503 { 2, "Processor" },
2504 { 3, "Rack" },
2505 { 4, "Lug" },
2506 { 5, "Module" },
2507 { 6, "Station" },
2508 { 7, "Port" },
2509 { 8, "Subdevice" },
2510 { 9, "Space" },
2511 { 10, "UDN" },
2512 { 11, "Reserved" },
2513 { 12, "Sequence Number" },
2514 { 13, "Step Number" },
2515 { 14, "Fade Time" },
2516 { 15, "Hold Time" },
2517 { 16, "Level[0]" },
2518 { 17, "Level[1]" },
2519 { 18, "Level[2]" },
2520 { 19, "Level[3]" },
2521 { 20, "Level[4]" },
2522 { 21, "Level[5]" },
2523 { 22, "Level[6]" },
2524 { 23, "Level[7]" },
2525 { 24, "Level[8]" },
2526 { 25, "Level[9]" },
2527 { 26, "Level[10]" },
2528 { 27, "Level[11]" },
2529 { 28, "Level[12]" },
2530 { 29, "Level[13]" },
2531 { 30, "Level[14]" },
2532 { 31, "Level[15]" },
2533 { 32, "Level[16]" },
2534 { 33, "Level[17]" },
2535 { 34, "Level[18]" },
2536 { 35, "Level[19]" },
2537 { 36, "Level[20]" },
2538 { 37, "Level[21]" },
2539 { 38, "Level[22]" },
2540 { 39, "Level[23]" },
2541 { 40, "Level[24]" },
2542 { 41, "Level[25]" },
2543 { 42, "Level[26]" },
2544 { 43, "Level[27]" },
2545 { 44, "Level[28]" },
2546 { 45, "Level[29]" },
2547 { 46, "Level[30]" },
2548 { 47, "Level[31]" },
2549 { 48, "Level[32]" },
2550 { 49, "Level[33]" },
2551 { 50, "Level[34]" },
2552 { 51, "Level[35]" },
2553 { 52, "Level[36]" },
2554 { 53, "Level[37]" },
2555 { 54, "Level[38]" },
2556 { 55, "Level[39]" },
2557 { 56, "Level[40]" },
2558 { 57, "Level[41]" },
2559 { 58, "Level[42]" },
2560 { 59, "Level[43]" },
2561 { 60, "Level[44]" },
2562 { 61, "Level[45]" },
2563 { 62, "Level[46]" },
2564 { 63, "Level[47]" },
2565 { 64, "Level[48]" },
2566 { 65, "Level[49]" },
2567 { 66, "Level[50]" },
2568 { 67, "Level[51]" },
2569 { 68, "Level[52]" },
2570 { 69, "Level[53]" },
2571 { 70, "Level[54]" },
2572 { 71, "Level[55]" },
2573 { 72, "Level[56]" },
2574 { 73, "Level[57]" },
2575 { 74, "Level[58]" },
2576 { 75, "Level[59]" },
2577 { 76, "Level[60]" },
2578 { 77, "Level[61]" },
2579 { 78, "Level[62]" },
2580 { 79, "Level[63]" },
2581 { 80, "Level[64]" },
2582 { 81, "Level[65]" },
2583 { 82, "Level[66]" },
2584 { 83, "Level[67]" },
2585 { 84, "Level[68]" },
2586 { 85, "Level[69]" },
2587 { 86, "Level[70]" },
2588 { 87, "Level[71]" },
2589 { 88, "Level[72]" },
2590 { 89, "Level[73]" },
2591 { 90, "Level[74]" },
2592 { 91, "Level[75]" },
2593 { 92, "Level[76]" },
2594 { 93, "Level[77]" },
2595 { 94, "Level[78]" },
2596 { 95, "Level[79]" },
2597 { 96, "Level[80]" },
2598 { 97, "Level[81]" },
2599 { 98, "Level[82]" },
2600 { 99, "Level[83]" },
2601 { 100, "Level[84]" },
2602 { 101, "Level[85]" },
2603 { 102, "Level[86]" },
2604 { 103, "Level[87]" },
2605 { 104, "Level[88]" },
2606 { 105, "Level[89]" },
2607 { 106, "Level[90]" },
2608 { 107, "Level[91]" },
2609 { 108, "Level[92]" },
2610 { 109, "Level[93]" },
2611 { 110, "Level[94]" },
2612 { 111, "Level[95]" },
2613 { 112, "Level[96]" },
2614 { 113, "Level[97]" },
2615 { 114, "Level[98]" },
2616 { 115, "Level[99]" },
2617 { 116, "Level[100]" },
2618 { 117, "Level[101]" },
2619 { 118, "Level[102]" },
2620 { 119, "Level[103]" },
2621 { 120, "Level[104]" },
2622 { 121, "Level[105]" },
2623 { 122, "Level[106]" },
2624 { 123, "Level[107]" },
2625 { 124, "Level[108]" },
2626 { 125, "Level[109]" },
2627 { 126, "Level[110]" },
2628 { 127, "Level[111]" },
2629 { 128, "Level[112]" },
2630 { 129, "Level[113]" },
2631 { 130, "Level[114]" },
2632 { 131, "Level[115]" },
2633 { 132, "Level[116]" },
2634 { 133, "Level[117]" },
2635 { 134, "Level[118]" },
2636 { 135, "Level[119]" },
2637 { 136, "Level[120]" },
2638 { 137, "Level[121]" },
2639 { 138, "Level[122]" },
2640 { 139, "Level[123]" },
2641 { 140, "Level[124]" },
2642 { 141, "Level[125]" },
2643 { 142, "Level[126]" },
2644 { 143, "Level[127]" },
2645 { 144, "Level[128]" },
2646 { 145, "Level[129]" },
2647 { 146, "Level[130]" },
2648 { 147, "Level[131]" },
2649 { 148, "Level[132]" },
2650 { 149, "Level[133]" },
2651 { 150, "Level[134]" },
2652 { 151, "Level[135]" },
2653 { 152, "Level[136]" },
2654 { 153, "Level[137]" },
2655 { 154, "Level[138]" },
2656 { 155, "Level[139]" },
2657 { 156, "Level[140]" },
2658 { 157, "Level[141]" },
2659 { 158, "Level[142]" },
2660 { 159, "Level[143]" },
2661 { 160, "Level[144]" },
2662 { 161, "Level[145]" },
2663 { 162, "Level[146]" },
2664 { 163, "Level[147]" },
2665 { 164, "Level[148]" },
2666 { 165, "Level[149]" },
2667 { 166, "Level[150]" },
2668 { 167, "Level[151]" },
2669 { 168, "Level[152]" },
2670 { 169, "Level[153]" },
2671 { 170, "Level[154]" },
2672 { 171, "Level[155]" },
2673 { 172, "Level[156]" },
2674 { 173, "Level[157]" },
2675 { 174, "Level[158]" },
2676 { 175, "Level[159]" },
2677 { 176, "Level[160]" },
2678 { 177, "Level[161]" },
2679 { 178, "Level[162]" },
2680 { 179, "Level[163]" },
2681 { 180, "Level[164]" },
2682 { 181, "Level[165]" },
2683 { 182, "Level[166]" },
2684 { 183, "Level[167]" },
2685 { 184, "Level[168]" },
2686 { 185, "Level[169]" },
2687 { 186, "Level[170]" },
2688 { 187, "Level[171]" },
2689 { 188, "Level[172]" },
2690 { 189, "Level[173]" },
2691 { 190, "Level[174]" },
2692 { 191, "Level[175]" },
2693 { 192, "Level[176]" },
2694 { 193, "Level[177]" },
2695 { 194, "Level[178]" },
2696 { 195, "Level[179]" },
2697 { 196, "Level[180]" },
2698 { 197, "Level[181]" },
2699 { 198, "Level[182]" },
2700 { 199, "Level[183]" },
2701 { 200, "Level[184]" },
2702 { 201, "Level[185]" },
2703 { 202, "Level[186]" },
2704 { 203, "Level[187]" },
2705 { 204, "Level[188]" },
2706 { 205, "Level[189]" },
2707 { 206, "Level[190]" },
2708 { 207, "Level[191]" },
2709 { 0, NULL((void*)0) }
2710};
2711static value_string_ext acn_blob_sequence_step_properties_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_sequence_step_properties_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_sequence_step_properties_field_name
) / sizeof ((acn_blob_sequence_step_properties_field_name)[0]
))-1, acn_blob_sequence_step_properties_field_name, "acn_blob_sequence_step_properties_field_name"
, ((void*)0) }
;
2712
2713static const value_string acn_blob_type_vals[] = {
2714 { ACN_BLOB_IPV41, "IPv4 Blob" },
2715 { ACN_BLOB_IPV62, "IPv6 Blob" },
2716 { ACN_BLOB_ERROR13, "Error Blob v1" },
2717 { ACN_BLOB_ERROR24, "Error Blob v2" },
2718 { ACN_BLOB_METADATA5, "Metadata" },
2719 { ACN_BLOB_METADATA_DEVICES6, "Metadata Devices" },
2720 { ACN_BLOB_METADATA_TYPES7, "Metadata Types" },
2721 { ACN_BLOB_TIME18, "Time Blob (deprecated 1)" },
2722 { ACN_BLOB_DIMMER_PROPERTIES9, "Dimmer Properties Blob v1" },
2723 { ACN_BLOB_DIMMER_LOAD_PROPERTIES10, "Dimmer Load Properties Blob v1" },
2724 { ACN_BLOB_DIMMING_RACK_PROPERTIES11, "Dimming Rack Properties Blob v1" },
2725 { ACN_BLOB_DIMMING_RACK_STATUS_PROPERTIES12, "Dimming Rack Status Properties Blob v1" },
2726 { ACN_BLOB_DIMMER_STATUS_PROPERTIES13, "Dimmer Status Properties Blob v1" },
2727 { ACN_BLOB_SET_LEVELS_OPERATION14, "Set Levels Operation Blob" },
2728 { ACN_BLOB_PRESET_OPERATION15, "Preset Operation Blob" },
2729 { ACN_BLOB_ADVANCED_FEATURES_OPERATION16, "Advanced Features Operation Blob" },
2730 { ACN_BLOB_DIRECT_CONTROL_OPERATION17, "Direct Control Operation Blob" },
2731 { ACN_BLOB_GENERATE_CONFIG_OPERATION18, "Generate Config Operation Blob" },
2732 { ACN_BLOB_ERROR319, "Error Blob v3" },
2733 { ACN_BLOB_DIMMER_PROPERTIES220, "Dimmer Properties Blob v2" },
2734 { ACN_BLOB_DIMMER_LOAD_PROPERTIES221, "Dimmer Load Properties Blob v2" },
2735 { ACN_BLOB_DIMMER_RACK_PROPERTIES222, "Dimming Rack Properties Blob v2" },
2736 { ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223, "Dimming Rack Status Properties Blob v2" },
2737 { ACN_BLOB_DIMMER_STATUS_PROPERTIES224, "Dimmer Status Properties Blob v2" },
2738 { ACN_BLOB_TIME225, "Time Blob (deprecated 2)" },
2739 { ACN_BLOB_RPC26, "RPC Blob" },
2740 { ACN_BLOB_DHCP_CONFIG_SUBNET27, "DHCP Config Subnet Blob" },
2741 { ACN_BLOB_DHCP_CONFIG_STATIC_ROUTE28, "DHCP Config Static Route Blob" },
2742 { ACN_BLOB_ENERGY_MANAGEMENT29, "Energy Management Blob" },
2743 { ACN_BLOB_PRESET_PROPERTIES250, "Preset Properties Blob" },
2744 { ACN_BLOB_TIME330, "Time Blob v2" },
2745 { ACN_BLOB_ENERGY_COST31, "Energy Cost Blob" },
2746 { ACN_BLOB_SEQUENCE_OPERATIONS32, "Sequence Operations Blob" },
2747 { ACN_BLOB_SEQUENCE_STEP_PROPERTIES33, "Sequence Step Properties Blob" },
2748 { 0, NULL((void*)0) }
2749};
2750
2751static const value_string acn_dmp_vector_vals[] = {
2752 { ACN_DMP_VECTOR_UNKNOWN0, "Unknown"},
2753 { ACN_DMP_VECTOR_GET_PROPERTY1, "Get Property"},
2754 { ACN_DMP_VECTOR_SET_PROPERTY2, "Set Property"},
2755 { ACN_DMP_VECTOR_GET_PROPERTY_REPLY3, "Get property reply"},
2756 { ACN_DMP_VECTOR_EVENT4, "Event"},
2757 { ACN_DMP_VECTOR_MAP_PROPERTY5, "Map Property"},
2758 { ACN_DMP_VECTOR_UNMAP_PROPERTY6, "Unmap Property"},
2759 { ACN_DMP_VECTOR_SUBSCRIBE7, "Subscribe"},
2760 { ACN_DMP_VECTOR_UNSUBSCRIBE8, "Unsubscribe"},
2761 { ACN_DMP_VECTOR_GET_PROPERTY_FAIL9, "Get Property Fail"},
2762 { ACN_DMP_VECTOR_SET_PROPERTY_FAIL10, "Set Property Fail"},
2763 { ACN_DMP_VECTOR_MAP_PROPERTY_FAIL11, "Map Property Fail"},
2764 { ACN_DMP_VECTOR_SUBSCRIBE_ACCEPT12, "Subscribe Accept"},
2765 { ACN_DMP_VECTOR_SUBSCRIBE_REJECT13, "Subscribe Reject"},
2766 { ACN_DMP_VECTOR_ALLOCATE_MAP14, "Allocate Map"},
2767 { ACN_DMP_VECTOR_ALLOCATE_MAP_REPLY15, "Allocate Map Reply"},
2768 { ACN_DMP_VECTOR_DEALLOCATE_MAP16, "Deallocate Map" },
2769 { ACN_DMP_VECTOR_SYNC_EVENT17, "Sync Event" },
2770 { 0, NULL((void*)0) },
2771};
2772
2773static const value_string acn_ip_address_type_vals[] = {
2774 { ACN_ADDR_NULL0, "Null"},
2775 { ACN_ADDR_IPV41, "IPv4"},
2776 { ACN_ADDR_IPV62, "IPv6"},
2777 { ACN_ADDR_IPPORT3, "Port"},
2778 { 0, NULL((void*)0) },
2779};
2780
2781static const value_string acn_refuse_code_vals[] = {
2782 { ACN_REFUSE_CODE_NONSPECIFIC1, "Nonspecific" },
2783 { ACN_REFUSE_CODE_ILLEGAL_PARAMS2, "Illegal Parameters" },
2784 { ACN_REFUSE_CODE_LOW_RESOURCES3, "Low Resources" },
2785 { ACN_REFUSE_CODE_ALREADY_MEMBER4, "Already Member" },
2786 { ACN_REFUSE_CODE_BAD_ADDR_TYPE5, "Bad Address Type" },
2787 { ACN_REFUSE_CODE_NO_RECIP_CHAN6, "No Reciprocal Channel" },
2788 { 0, NULL((void*)0) },
2789};
2790
2791static const value_string acn_reason_code_vals[] = {
2792 { ACN_REASON_CODE_NONSPECIFIC1, "Nonspecific" },
2793 { ACN_REASON_CODE_NO_RECIP_CHAN6, "No Reciprocal Channel" },
2794 { ACN_REASON_CODE_CHANNEL_EXPIRED7, "Channel Expired" },
2795 { ACN_REASON_CODE_LOST_SEQUENCE8, "Lost Sequence" },
2796 { ACN_REASON_CODE_SATURATED9, "Saturated" },
2797 { ACN_REASON_CODE_TRANS_ADDR_CHANGING10, "Transport Address Changing" },
2798 { ACN_REASON_CODE_ASKED_TO_LEAVE11, "Asked to Leave" },
2799 { ACN_REASON_CODE_NO_RECIPIENT12, "No Recipient"},
2800 { 0, NULL((void*)0) },
2801};
2802
2803static const value_string acn_dmp_reason_code_vals[] = {
2804 { ACN_DMP_REASON_CODE_NONSPECIFIC1, "Nonspecific" },
2805 { ACN_DMP_REASON_CODE_NOT_A_PROPERTY2, "Not a Property" },
2806 { ACN_DMP_REASON_CODE_WRITE_ONLY3, "Write Only" },
2807 { ACN_DMP_REASON_CODE_NOT_WRITABLE4, "Not Writable" },
2808 { ACN_DMP_REASON_CODE_DATA_ERROR5, "Data Error" },
2809 { ACN_DMP_REASON_CODE_MAPS_NOT_SUPPORTED6, "Maps not Supported" },
2810 { ACN_DMP_REASON_CODE_SPACE_NOT_AVAILABLE7, "Space not Available" },
2811 { ACN_DMP_REASON_CODE_PROP_NOT_MAPPABLE8, "Property not Mappable"},
2812 { ACN_DMP_REASON_CODE_MAP_NOT_ALLOCATED9, "Map not Allocated"},
2813 { ACN_DMP_REASON_CODE_SUBSCRIPTION_NOT_SUPPORTED10, "Subscription not Supported"},
2814 { ACN_DMP_REASON_CODE_NO_SUBSCRIPTIONS_SUPPORTED11, "No Subscriptions Supported"},
2815 { 0, NULL((void*)0) },
2816};
2817
2818static const enum_val_t dmx_display_view[] = {
2819 { "hex" , "Hex ", ACN_PREF_DMX_DISPLAY_HEX0 },
2820 { "decimal", "Decimal", ACN_PREF_DMX_DISPLAY_DEC1 },
2821 { "percent", "Percent", ACN_PREF_DMX_DISPLAY_PER2 },
2822 { NULL((void*)0), NULL((void*)0), 0 }
2823};
2824
2825static const enum_val_t dmx_display_line_format[] = {
2826 { "20", "20 per line", ACN_PREF_DMX_DISPLAY_20PL0 },
2827 { "16", "16 per line", ACN_PREF_DMX_DISPLAY_16PL1 },
2828 { NULL((void*)0), NULL((void*)0), 0 }
2829};
2830
2831
2832static const value_string magic_pdu_subtypes[] = {
2833 { MAGIC_V10, "V1" },
2834 { MAGIC_COMMAND1, "V2 Command" },
2835 { MAGIC_REPLY2, "V2 Reply" },
2836 { MAGIC_REPLY_TYPE_33, "V2 Reply Type 3" },
2837 { 0, NULL((void*)0) }
2838};
2839
2840static const value_string magic_v1command_vals[] = {
2841 { V1_SWITCH_TO_NET11, "Switch to Net1" },
2842 { V1_SWITCH_TO_NET22, "Switch to Net2" },
2843 { V1_BOOTP1114467, "bootp" },
2844 { 0, NULL((void*)0) }
2845};
2846
2847static const value_string magic_command_vals[] = {
2848 { V2_CMD_SWITCH_TO_NET11, "Switch to Net1 mode" },
2849 { V2_CMD_SWITCH_TO_NET22, "Switch to Net2 mode" },
2850 { V2_CMD_DOWNLOAD3, "Code download" },
2851 { V2_CMD_SOFTBOOT4, "Soft reboot" },
2852 { V2_CMD_PHYSICAL_BEACON5, "Physical beacon" },
2853 { V2_CMD_NETWORK_BEACON6, "Network beacon" },
2854 { V2_CMD_SWITCH_TO_ACN7, "Switch to ACN mode" },
2855 { V2_CMD_SWITCH_TO_DYNAMIC_IP8, "Switch to dynamic IP address configuration" },
2856 { V2_CMD_EXTENDED_NETWORK_BEACON9, "Extended network beacon" },
2857 { V2_CMD_IP_CONFIGURATION10, "IP configuration" },
2858 { V2_CMD_RESTORE_FACTORY_DEFAULT11, "Restore factory default" },
2859 { V2_CMD_PHYSICAL_BEACON_BY_CID12, "Physical beacon by CID" },
2860 { V2_CMD_NET2_DOWNLOAD110163, "NET2 code download and reboot" },
2861 { 0, NULL((void*)0) }
2862};
2863
2864static const value_string magic_reset_lease_vals[] = {
2865 { MAGIC_SWITCH_TO_DYNAMIC_MAINTAIN_LEASE0, "Maintain lease" },
2866 { MAGIC_SWITCH_TO_DYNAMIC_RESET_LEASE1, "Reset lease" },
2867 { 0, NULL((void*)0) }
2868};
2869
2870static const value_string magic_ip_configuration_vals[] = {
2871 { MAGIC_DYNAMIC_IP_MAINTAIN_LEASE0, "Dynamic IP, maintain lease" },
2872 { MAGIC_DYNAMIC_IP_RESET_LEASE1, "Dynamic IP, reset lease" },
2873 { MAGIC_STATIC_IP2, "Static IP" },
2874 { 0, NULL((void*)0) }
2875};
2876
2877static const value_string security_seq_type_vals[] = {
2878 { 0, "Time (ms since epoch)" },
2879 { 1, "Volatile" },
2880 { 2, "Non-volatile" },
2881 { 0, NULL((void*)0) }
2882};
2883
2884static const value_string rdmnet_llrp_vector_vals[] = {
2885 { RDMNET_LLRP_VECTOR_PROBE_REQUEST0x00000001, "LLRP probe request" },
2886 { RDMNET_LLRP_VECTOR_PROBE_REPLY0x00000002, "LLRP probe reply" },
2887 { RDMNET_LLRP_VECTOR_RDM_CMD0x00000003, "LLRP RDM command" },
2888 { 0, NULL((void*)0) }
2889};
2890
2891static const value_string rdmnet_llrp_probe_request_vals[] = {
2892 { VECTOR_PROBE_REQUEST_DATA0x01, "Vector probe request data" },
2893 { 0, NULL((void*)0) }
2894};
2895
2896static const value_string rdmnet_llrp_probe_reply_vals[] = {
2897 { VECTOR_PROBE_REPLY_DATA0x01, "Vector probe reply data" },
2898 { 0, NULL((void*)0) }
2899};
2900
2901static const value_string rdmnet_llrp_probe_reply_component_type_vals[] = {
2902 { RDMNET_LLRP_COMPONENT_TYPE_RPT_DEVICE0x00, "Device target" },
2903 { RDMNET_LLRP_COMPONENT_TYPE_RPT_CONTROLLER0x01, "Controller target" },
2904 { RDMNET_LLRP_COMPONENT_TYPE_BROKER0x02, "Broker target" },
2905 { RDMNET_LLRP_COMPONENT_TYPE_NON_RDMNET0xFF, "Non RDMnet target" },
2906 { 0, NULL((void*)0) }
2907};
2908
2909static const value_string rdmnet_llrp_rdm_command_start_code_vals[] = {
2910 { RDMNET_LLRP_VECTOR_RDM_CMD_START_CODE0xCC, "RDM Start Code" },
2911 { 0, NULL((void*)0) }
2912};
2913
2914static const value_string rdmnet_broker_disconnect_reason_vals[] = {
2915 { RDMNET_RPT_DISCONNECT_SHUTDOWN0x0000, "Component shut down" },
2916 { RDMNET_RPT_DISCONNECT_CAPACITY_EXHAUSTED0x0001, "Component capacity exhausted" },
2917 { RDMNET_RPT_DISCONNECT_HARDWARE_FAULT0x0002, "Component hardware fault" },
2918 { RDMNET_RPT_DISCONNECT_SOFTWARE_FAULT0x0003, "Component software fault" },
2919 { RDMNET_RPT_DISCONNECT_SOFTWARE_RESET0x0004, "Component software reset" },
2920 { RDMNET_RPT_DISCONNECT_INCORRECT_SCOPE0x0005, "Broker incorrect scope" },
2921 { RDMNET_RPT_DISCONNECT_LLRP_RECONFIGURE0x0007, "Component reconfigured by LLRP" },
2922 { RDMNET_RPT_DISCONNECT_RPT_RECONFIGURE0x0006, "Component reconfigured by RPT" },
2923 { RDMNET_RPT_DISCONNECT_USER_RECONFIGURE0x0008, "Component reconfigured by user" },
2924 { 0, NULL((void*)0) }
2925};
2926
2927static const value_string rdmnet_rpt_vector_vals[] = {
2928 { RDMNET_RPT_VECTOR_REQUEST0x00000001, "Request" },
2929 { RDMNET_RPT_VECTOR_STATUS0x00000002, "Status" },
2930 { RDMNET_RPT_VECTOR_NOTIFICATION0x00000003, "Notification" },
2931 { 0, NULL((void*)0) }
2932};
2933
2934static const value_string rdmnet_rpt_request_vals[] = {
2935 { RDMNET_RPT_VECTOR_REQUEST_RDM_CMD0x01, "RDM Command" },
2936 { 0, NULL((void*)0) }
2937};
2938
2939static const value_string rdmnet_rpt_status_vector_vals[] = {
2940 { RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RPT_UID0x0001, "Unknown RPT UID" },
2941 { RDMNET_RPT_VECTOR_STATUS_RDM_TIMEOUT0x0002, "RDM Timeout" },
2942 { RDMNET_RPT_VECTOR_STATUS_RDM_INVALID_RESPONSE0x0003, "Invalid RDM Response" },
2943 { RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RDM_UID0x0004, "Unknown RDM UID" },
2944 { RDMNET_RPT_VECTOR_STATUS_UNKNOWN_ENDPOINT0x0005, "Unknown Endpoint" },
2945 { RDMNET_RPT_VECTOR_STATUS_BROADCAST_COMPLETE0x0006, "Broadcast Complete" },
2946 { RDMNET_RPT_VECTOR_STATUS_UNKNOWN_VECTOR0x0007, "Unknown Vector" },
2947 { RDMNET_RPT_VECTOR_STATUS_INVALID_MESSAGE0x0008, "Invalid Message" },
2948 { RDMNET_RPT_VECTOR_STATUS_INVALID_COMMAND_CLASS0x0009, "Invalid Command Class" },
2949 { 0, NULL((void*)0) }
2950};
2951
2952static const value_string rdmnet_rpt_notification_vals[] = {
2953 { RDMNET_RPT_VECTOR_NOTIFICATION_RDM_CMD0x01, "RDM Command" },
2954 { 0, NULL((void*)0) }
2955};
2956
2957static const value_string rdmnet_rpt_request_rdm_command_start_code_vals[] = {
2958 { RDMNET_RPT_VECTOR_RDM_CMD_RD_DATA0xCC, "RDM Start Code" },
2959 { 0, NULL((void*)0) }
2960};
2961
2962static const value_string rdmnet_broker_vector_vals[] = {
2963 { RDMNET_BROKER_VECTOR_FETCH_CLIENT_LIST0x0006, "Fetch client list" },
2964 { RDMNET_BROKER_VECTOR_CONNECTED_CLIENT_LIST0x0007, "Connected client list" },
2965 { RDMNET_BROKER_VECTOR_CLIENT_ADD0x0008, "Add client" },
2966 { RDMNET_BROKER_VECTOR_CLIENT_REMOVE0x0009, "Remove client" },
2967 { RDMNET_BROKER_VECTOR_CLIENT_ENTRY_CHANGE0x000A, "Change client entry" },
2968 { RDMNET_BROKER_VECTOR_CONNECT0x0001, "Connect" },
2969 { RDMNET_BROKER_VECTOR_CONNECT_REPLY0x0002, "Connect reply" },
2970 { RDMNET_BROKER_VECTOR_CLIENT_ENTRY_UPDATE0x0003, "Update client entry" },
2971 { RDMNET_BROKER_VECTOR_REDIRECT_V40x0004, "Redirect IP v4" },
2972 { RDMNET_BROKER_VECTOR_REDIRECT_V60x0005, "Redirect IP v6" },
2973 { RDMNET_BROKER_VECTOR_DISCONNECT0x000E, "Disconnect" },
2974 { RDMNET_BROKER_VECTOR_NULL0x000F, "Null" },
2975 { RDMNET_BROKER_VECTOR_REQUEST_DYNAMIC_UIDS0x000B, "Request Dynamic UIDs" },
2976 { RDMNET_BROKER_VECTOR_ASSIGNED_DYNAMIC_UIDS0x000C, "Assigned Dynamic UIDs" },
2977 { RDMNET_BROKER_VECTOR_FETCH_DYNAMIC_UID_LIST0x000D, "Fetch dynamic UID List" },
2978 { 0, NULL((void*)0) }
2979};
2980
2981static const value_string rdmnet_broker_status_code_vals[] = {
2982 { RDMNET_BROKER_CONNECT_OK0x0000, "Ok" },
2983 { RDMNET_BROKER_CONNECT_SCOPE_MISMATCH0x0001, "Scope mismatch" },
2984 { RDMNET_BROKER_CONNECT_CAPACITY_EXCEEDED0x0002, "Capacity exceeded" },
2985 { RDMNET_BROKER_CONNECT_DUPLICATE_UID0x0003, "Duplicate UID" },
2986 { RDMNET_BROKER_CONNECT_INVALID_CLIENT_ENTRY0x0004, "Invalid client entry" },
2987 { RDMNET_BROKER_CONNECT_INVALID_UID0x0005, "Invalid UID" },
2988 { 0, NULL((void*)0) }
2989};
2990
2991static const value_string dynamic_uid_mapping_status_code_vals[] = {
2992 { RDMNET_DYNAMIC_UID_STATUS_OK0x0000, "Dynamic UID Status Ok" },
2993 { RDMNET_DYNAMIC_UID_STATUS_INVALID_REQUEST0x0001, "Dynamic UID Status Invalid Request" },
2994 { RDMNET_DYNAMIC_UID_STATUS_UID_NOT_FOUND0x0002, "Dynamic UID Status UID Not Found" },
2995 { RDMNET_DYNAMIC_UID_STATUS_DUPLICATE_RID0x0003, "Dynamic UID Status Duplicate RID" },
2996 { RDMNET_DYNAMIC_UID_STATUS_CAPACITY_EXHAUSTED0x0004, "Dynamic UID Status Capacity Exhausted" },
2997 { 0, NULL((void*)0) }
2998};
2999
3000static const value_string broker_client_protocol_vals[] = {
3001 { RDMNET_CLIENT_PROTOCOL_RPT0x00000005, "Client Protocol RPT" },
3002 { RDMNET_CLIENT_PROTOCOL_EPT0x0000000B, "Client Protocol EPT" },
3003 { 0, NULL((void*)0) }
3004};
3005
3006static const value_string broker_client_rpt_client_type_vals[] = {
3007 { RDMNET_RPT_CLIENT_TYPE_DEVICE0x00, "Device" },
3008 { RDMNET_RPT_CLIENT_TYPE_CONTROLLER0x01, "Controller" },
3009 { 0, NULL((void*)0) }
3010};
3011
3012static const value_string rdmnet_ept_vector_vals[] = {
3013 { RDMNET_EPT_VECTOR_DATA0x00000001, "Data" },
3014 { RDMNET_EPT_VECTOR_STATUS0x00000002, "Status" },
3015 { 0, NULL((void*)0) }
3016};
3017
3018static dissector_handle_t rdm_handle;
3019
3020/******************************************************************************/
3021/* Test to see if it is a Magic Bullet Packet */
3022static bool_Bool
3023is_magic(tvbuff_t *tvb)
3024{
3025 static const uint8_t magic_protocol_id = 15;
3026
3027 if (tvb_get_uint8(tvb, 0) == magic_protocol_id)
3028 return true1;
3029
3030 return false0;
3031}
3032
3033/******************************************************************************/
3034/* Dissect Magic Bullet */
3035static int
3036dissect_magic(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3037{
3038 uint8_t pdu_subtype;
3039 int offset = 0;
3040 const char *pdu_subtype_string;
3041 proto_tree *ti, *subtype_item;
3042 proto_tree *magic_tree;
3043 uint32_t command;
3044 int32_t str_len;
3045 uint32_t major, minor, patch, aud, crit, build;
3046 char *buffer;
3047
3048 /* Set the protocol column */
3049 col_set_str(pinfo->cinfo, COL_PROTOCOL, "MAGIC");
3050
3051 /* Create our tree */
3052 ti = proto_tree_add_item(tree, proto_magic, tvb, offset, -1, ENC_NA0x00000000);
3053 magic_tree = proto_item_add_subtree(ti, ett_magic);
3054
3055 /* Protocol ID */
3056 proto_tree_add_item(magic_tree, hf_magic_protocol_id, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3057 offset++;
3058
3059 /* PDU Type */
3060 pdu_subtype = tvb_get_uint8(tvb, offset);
3061 pdu_subtype_string = val_to_str(pinfo->pool, pdu_subtype, magic_pdu_subtypes, "Unknown (0x%02x)");
3062
3063 /* Adjust info column */
3064 col_clear(pinfo->cinfo, COL_INFO);
3065 col_add_fstr(pinfo->cinfo, COL_INFO, "MAGIC - %s", pdu_subtype_string);
3066
3067 /* Append subtype description */
3068 proto_item_append_text(ti, ": %s", pdu_subtype_string);
3069
3070 subtype_item = proto_tree_add_item(magic_tree, hf_magic_pdu_subtype, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3071 offset++;
3072 proto_tree_add_item(magic_tree, hf_magic_major_version, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3073 offset++;
3074 proto_tree_add_item(magic_tree, hf_magic_minor_version, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3075 offset++;
3076
3077 switch (pdu_subtype) {
3078 case MAGIC_V10:
3079 proto_tree_add_item(magic_tree, hf_magic_v1command_vals, tvb, offset, 4, ENC_LITTLE_ENDIAN0x80000000);
3080 offset += 4;
3081 break;
3082
3083 case MAGIC_COMMAND1:
3084 /* note, v2 is big-endian */
3085 proto_tree_add_item_ret_uint(magic_tree, hf_magic_command_vals, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &command);
3086 offset += 4;
3087 /* deal with variable parameter */
3088 switch (command) {
3089 case V2_CMD_DOWNLOAD3:
3090 proto_tree_add_item(magic_tree, hf_magic_command_tftp, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3091 offset += 4;
3092 break;
3093 case V2_CMD_PHYSICAL_BEACON5:
3094 proto_tree_add_item(magic_tree, hf_magic_command_beacon_duration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3095 offset += 4;
3096 break;
3097 case V2_CMD_NETWORK_BEACON6:
3098 proto_tree_add_item(magic_tree, hf_magic_command_beacon_duration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3099 offset += 4;
3100 break;
3101 case V2_CMD_SWITCH_TO_DYNAMIC_IP8:
3102 proto_tree_add_item(magic_tree, hf_magic_command_reset_lease, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3103 offset += 4;
3104 break;
3105 case V2_CMD_EXTENDED_NETWORK_BEACON9:
3106 proto_tree_add_item(magic_tree, hf_magic_command_beacon_duration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3107 offset += 4;
3108 break;
3109 case V2_CMD_IP_CONFIGURATION10:
3110 proto_tree_add_item(magic_tree, hf_magic_command_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000);
3111 offset += 16;
3112 proto_tree_add_item(magic_tree, hf_magic_command_ip_configuration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3113 offset += 4;
3114 proto_tree_add_item(magic_tree, hf_magic_command_ip_address, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3115 offset += 4;
3116 proto_tree_add_item(magic_tree, hf_magic_command_subnet_mask, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3117 offset += 4;
3118 proto_tree_add_item(magic_tree, hf_magic_command_gateway, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3119 offset += 4;
3120 break;
3121 case V2_CMD_RESTORE_FACTORY_DEFAULT11:
3122 proto_tree_add_item(magic_tree, hf_magic_command_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000);
3123 offset += 16;
3124 break;
3125 case V2_CMD_PHYSICAL_BEACON_BY_CID12:
3126 proto_tree_add_item(magic_tree, hf_magic_command_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000);
3127 offset += 16;
3128 proto_tree_add_item(magic_tree, hf_magic_command_beacon_duration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3129 offset += 4;
3130 break;
3131 /* case V2_CMD_SOFTBOOT: */
3132 /* case V2_CMD_SWITCH_TO_NET1: */
3133 /* case V2_CMD_SWITCH_TO_NET2: */
3134 /* case V2_CMD_SWITCH_TO_ACN: */
3135 /* case V2_CMD_NET2_DOWNLOAD: */
3136 }
3137 break;
3138
3139 case MAGIC_REPLY2:
3140 /* note, v2 is big-endian */
3141 proto_tree_add_item(magic_tree, hf_magic_reply_ip_address, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3142 offset += 4;
3143 proto_tree_add_item(magic_tree, hf_magic_reply_subnet_mask, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3144 offset += 4;
3145 proto_tree_add_item(magic_tree, hf_magic_reply_gateway, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3146 offset += 4;
3147 proto_tree_add_item(magic_tree, hf_magic_reply_tftp, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3148 offset += 4;
3149
3150 /* encoded and display version */
3151 major = tvb_get_uint8(tvb, offset++);
3152 minor = tvb_get_uint8(tvb, offset++);
3153 patch = tvb_get_uint8(tvb, offset++);
3154 aud = tvb_get_uint8(tvb, offset++);
3155 crit = tvb_get_uint8(tvb, offset++);
3156 build = tvb_get_ntohs(tvb, offset);
3157 offset += 2;
3158
3159 offset -= 7;
3160 buffer = wmem_strdup_printf(pinfo->pool, "%d.%d.%d.%d.%d.%d", major, minor, patch, aud, crit, build);
3161 proto_tree_add_string(magic_tree, hf_magic_reply_version, tvb, offset, 7, buffer);
3162 offset += 7;
3163
3164 /* Device Type Name string */
3165 proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_device_type_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len);
3166 offset += str_len;
3167
3168 /* Default Name string */
3169 proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_default_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len);
3170 offset += str_len;
3171
3172 /* User Name string */
3173 proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_user_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len);
3174 offset += str_len;
3175 break;
3176
3177 case MAGIC_REPLY_TYPE_33:
3178 command = tvb_get_ntohl(tvb, offset);
3179 proto_tree_add_item(magic_tree, hf_magic_command_vals, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3180 offset += 4;
3181 proto_tree_add_item(magic_tree, hf_magic_reply_ip_address, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3182 offset += 4;
3183 proto_tree_add_item(magic_tree, hf_magic_reply_subnet_mask, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3184 offset += 4;
3185 proto_tree_add_item(magic_tree, hf_magic_reply_gateway, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3186 offset += 4;
3187 proto_tree_add_item(magic_tree, hf_magic_reply_tftp, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3188 offset += 4;
3189 proto_tree_add_item(magic_tree, hf_magic_reply_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000);
3190 offset += 16;
3191 proto_tree_add_item(magic_tree, hf_magic_reply_dcid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000);
3192 offset += 16;
3193
3194 /* encoded and display version */
3195 major = tvb_get_uint8(tvb, offset++);
3196 minor = tvb_get_uint8(tvb, offset++);
3197 patch = tvb_get_uint8(tvb, offset++);
3198 aud = tvb_get_uint8(tvb, offset++);
3199 crit = tvb_get_uint8(tvb, offset++);
3200 build = tvb_get_ntohs(tvb, offset);
3201 offset += 2;
3202
3203 offset -= 7;
3204 buffer = wmem_strdup_printf(pinfo->pool, "%d.%d.%d.%d.%d.%d", major, minor, patch, aud, crit, build);
3205 proto_tree_add_string(magic_tree, hf_magic_reply_version, tvb, offset, 7, buffer);
3206 offset += 7;
3207
3208 /* Device Type Name string */
3209 proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_device_type_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len);
3210 offset += str_len;
3211
3212 /* Default Name string */
3213 proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_default_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len);
3214 offset += str_len;
3215
3216 /* User Name string */
3217 proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_user_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len);
3218 offset += str_len;
3219 break;
3220
3221 default:
3222 expert_add_info(pinfo, subtype_item, &ei_magic_reply_invalid_type);
3223 offset = tvb_captured_length(tvb);
3224 }
3225 return offset;
3226}
3227
3228/******************************************************************************/
3229/* Test to see if it is an ACN or an RDMnet Packet over UDP */
3230static bool_Bool
3231is_acn_or_rdmnet_over_udp(tvbuff_t *tvb, uint32_t *protocol_id)
3232{
3233 static const char acn_packet_id[] = "ASC-E1.17\0\0\0"; /* must be 12 bytes */
3234 uint32_t offset;
3235 uint8_t pdu_flags;
3236
3237 if (tvb_captured_length(tvb) < (4+sizeof(acn_packet_id) + 6))
3238 return false0;
3239
3240 /* Check the bytes in octets 4 - 16 */
3241 if (tvb_memeql(tvb, 4, (const uint8_t*)acn_packet_id, sizeof(acn_packet_id)-1) != 0)
3242 return false0;
3243
3244 offset = 16;
3245 pdu_flags = tvb_get_uint8(tvb, offset) & 0xf0;
3246 if (pdu_flags & ACN_PDU_FLAG_L0x80) {
3247 /* length bit is set: there are three length bytes */
3248 offset += 3;
3249 }
3250 else {
3251 /* length bit is clear: there are two length bytes */
3252 offset += 2;
3253 }
3254
3255 *protocol_id = tvb_get_ntohl(tvb, offset);
3256 return true1;
3257}
3258
3259/******************************************************************************/
3260/* Test to see if it is an RDMnet Packet over TCP */
3261static bool_Bool
3262is_rdmnet_over_tcp(tvbuff_t *tvb)
3263{
3264 static const char acn_packet_id[] = "ASC-E1.17\0\0\0"; /* must be 12 bytes */
3265 uint32_t offset;
3266 uint32_t protocol_id;
3267 uint8_t pdu_flags;
3268
3269 if (tvb_captured_length(tvb) < (4+sizeof(acn_packet_id))) {
3270 return false0;
3271 }
3272
3273 /* Check the bytes in octets 0 - 12 */
3274 if (tvb_memeql(tvb, 0, (const uint8_t*)acn_packet_id, sizeof(acn_packet_id)-1) != 0) {
3275 return false0;
3276 }
3277
3278 offset = 16;
3279 pdu_flags = tvb_get_uint8(tvb, offset) & 0xf0;
3280 if (pdu_flags & ACN_PDU_FLAG_L0x80) {
3281 /* length bit is set: there are three length bytes */
3282 offset += 3;
3283 } else {
3284 /* length bit is clear: there are two length bytes */
3285 offset += 2;
3286 }
3287
3288 protocol_id = tvb_get_ntohl(tvb, offset);
3289 if ((protocol_id == ACN_PROTOCOL_ID_BROKER0x00000009) ||
3290 (protocol_id == ACN_PROTOCOL_ID_RPT0x00000005) ||
3291 (protocol_id == ACN_PROTOCOL_ID_EPT0x0000000B)) {
3292 return true1;
3293 }
3294
3295 return false0;
3296}
3297
3298/******************************************************************************/
3299/* Test to see if it is an ACN Packet */
3300static bool_Bool
3301is_acn(tvbuff_t *tvb)
3302{
3303 uint32_t protocol_id;
3304
3305 if (is_acn_or_rdmnet_over_udp(tvb, &protocol_id)) {
3306 if ((protocol_id == ACN_PROTOCOL_ID_DMX0x00000003) ||
3307 (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004) ||
3308 (protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) ||
3309 (protocol_id == ACN_PROTOCOL_ID_SDT0x00000001) ||
3310 (protocol_id == ACN_PROTOCOL_ID_EXTENDED0x00000008))
3311 return true1;
3312 }
3313
3314 return false0;
3315}
3316
3317/******************************************************************************/
3318/* Test to see if it is an ACN Packet */
3319static bool_Bool
3320is_rdmnet_over_udp(tvbuff_t *tvb)
3321{
3322 uint32_t protocol_id;
3323
3324 if (is_acn_or_rdmnet_over_udp(tvb, &protocol_id) && (protocol_id == ACN_PROTOCOL_ID_LLRP0x0000000A)) {
3325 return true1;
3326 }
3327
3328 return false0;
3329}
3330
3331
3332/******************************************************************************/
3333/* Heuristic dissector */
3334static bool_Bool
3335dissect_acn_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
3336{
3337 /* This is a heuristic dissector, which means we get all the UDP
3338 * traffic not sent to a known dissector and not claimed by
3339 * a heuristic dissector called before us!
3340 */
3341
3342 if (is_acn(tvb)) {
3343 dissect_acn(tvb, pinfo, tree, data);
3344 return true1;
3345 }
3346
3347 if (is_magic(tvb)) {
3348 dissect_magic(tvb, pinfo, tree);
3349 return true1;
3350 }
3351
3352 /* abort if it is NOT an ACN or Magic Bullet packet */
3353 return false0;
3354}
3355
3356
3357/******************************************************************************/
3358/* Heuristic dissector */
3359static bool_Bool
3360dissect_rdmnet_over_udp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U___attribute__((unused)))
3361{
3362 if (!is_rdmnet_over_udp(tvb)) {
3363 return false0;
3364 }
3365
3366 dissect_rdmnet(tvb, pinfo, tree, 0, 1);
3367 return true1;
3368}
3369
3370#define RDMNET_TCP_FRAME_HEADER_LENGTH16 16
3371
3372static int
3373dissect_one_rdmnet_over_tcp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U___attribute__((unused)))
3374{
3375 if (!is_rdmnet_over_tcp(tvb)) {
3376 return 0;
3377 }
3378
3379 dissect_rdmnet(tvb, pinfo, tree, 0, 0);
3380 return tvb_captured_length(tvb);
3381}
3382
3383
3384static unsigned
3385get_rdmnet_tcp_message_length(packet_info *pinfo _U___attribute__((unused)), tvbuff_t *tvb, int offset, void *data _U___attribute__((unused)))
3386{
3387 return (unsigned)tvb_get_ntohl(tvb, offset + 12) + 16;
3388}
3389
3390static int
3391dissect_rdmnet_over_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
3392{
3393 tcp_dissect_pdus(tvb, pinfo, tree, true1, RDMNET_TCP_FRAME_HEADER_LENGTH16,
3394 get_rdmnet_tcp_message_length, dissect_one_rdmnet_over_tcp_message, data);
3395 return tvb_captured_length(tvb);
3396}
3397
3398
3399/******************************************************************************/
3400/* Heuristic dissector */
3401static bool_Bool
3402dissect_rdmnet_over_tcp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
3403{
3404 if (!is_rdmnet_over_tcp(tvb)) {
3405 return false0;
3406 }
3407
3408 dissect_rdmnet_over_tcp(tvb, pinfo, tree, data);
3409 return true1;
3410}
3411
3412
3413/******************************************************************************/
3414/* Adds tree branch for channel owner info block */
3415static uint32_t
3416acn_add_channel_owner_info_block(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
3417{
3418 proto_item *pi;
3419 proto_tree *this_tree;
3420 uint32_t session_count;
3421 uint32_t x;
3422
3423 this_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_acn_channel_owner_info_block, NULL((void*)0),
3424 "Channel Owner Info Block");
3425
3426 proto_tree_add_item(this_tree, hf_acn_member_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3427 offset += 2;
3428 proto_tree_add_item(this_tree, hf_acn_channel_number, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3429 offset += 2;
3430 offset = acn_add_address(tvb, pinfo, this_tree, offset, "Destination Address:");
3431 offset = acn_add_address(tvb, pinfo, this_tree, offset, "Source Address:");
3432
3433 session_count = tvb_get_ntohs(tvb, offset);
3434 for (x=0; x<session_count; x++) {
3435 pi = proto_tree_add_item(this_tree, hf_acn_protocol_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3436 proto_item_append_text(pi, " #%d", x+1);
3437 offset += 4;
3438 }
3439 return offset;
3440}
3441
3442/******************************************************************************/
3443/* Adds tree branch for channel member info block */
3444static uint32_t
3445acn_add_channel_member_info_block(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
3446{
3447 proto_item *pi;
3448 proto_tree *this_tree;
3449 uint32_t session_count;
3450 uint32_t x;
3451
3452 this_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_acn_channel_member_info_block,
3453 NULL((void*)0), "Channel Member Info Block");
3454
3455 proto_tree_add_item(this_tree, hf_acn_member_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3456 offset += 2;
3457 proto_tree_add_item(this_tree, hf_acn_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000);
3458 offset += 16;
3459 proto_tree_add_item(this_tree, hf_acn_channel_number, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3460 offset += 2;
3461 offset = acn_add_address(tvb, pinfo, this_tree, offset, "Destination Address:");
3462 offset = acn_add_address(tvb, pinfo, this_tree, offset, "Source Address:");
3463 proto_tree_add_item(this_tree, hf_acn_reciprocal_channel, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3464 offset += 2;
3465
3466 session_count = tvb_get_ntohs(tvb, offset);
3467 for (x=0; x<session_count; x++) {
3468 pi = proto_tree_add_item(this_tree, hf_acn_protocol_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3469 proto_item_append_text(pi, " #%d", x+1);
3470 offset += 4;
3471 }
3472 return offset;
3473}
3474
3475
3476/******************************************************************************/
3477/* Add labeled expiry */
3478static uint32_t
3479acn_add_expiry(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, int hf)
3480{
3481 proto_tree_add_item(tree, hf, tvb, offset, 1, ENC_NA0x00000000);
3482 offset += 1;
3483 return offset;
3484}
3485
3486
3487/******************************************************************************/
3488/* Adds tree branch for channel parameters */
3489static uint32_t
3490acn_add_channel_parameter(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset)
3491{
3492 proto_tree *param_tree;
3493
3494 param_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_acn_channel_parameter,
3495 NULL((void*)0), "Channel Parameter Block");
3496 proto_tree_add_item(param_tree, hf_acn_expiry, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3497 offset += 1;
3498 proto_tree_add_item(param_tree, hf_acn_nak_outbound_flag, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3499 offset += 1;
3500 proto_tree_add_item(param_tree, hf_acn_nak_holdoff, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3501 offset += 2;
3502 proto_tree_add_item(param_tree, hf_acn_nak_modulus, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3503 offset += 2;
3504 proto_tree_add_item(param_tree, hf_acn_nak_max_wait, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3505 offset += 2;
3506 return offset; /* bytes used */
3507}
3508
3509
3510/******************************************************************************/
3511/* Add an address tree */
3512static uint32_t
3513acn_add_address(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, const char *label)
3514{
3515 proto_item *pi;
3516 proto_tree *addr_tree = NULL((void*)0);
3517 uint8_t ip_address_type;
3518 uint32_t port;
3519
3520 /* Get type */
3521 ip_address_type = tvb_get_uint8(tvb, offset);
3522
3523 switch (ip_address_type) {
3524 case ACN_ADDR_NULL0:
3525 proto_tree_add_item(tree, hf_acn_ip_address_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3526 offset += 1;
3527 break;
3528 case ACN_ADDR_IPV41:
3529 /* Build tree and add type*/
3530 addr_tree = proto_tree_add_subtree(tree, tvb, offset, 7, ett_acn_address, &pi, label);
3531 proto_tree_add_item(addr_tree, hf_acn_ip_address_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3532 offset += 1;
3533 /* Add port */
3534 port = tvb_get_ntohs(tvb, offset);
3535 proto_tree_add_item(addr_tree, hf_acn_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3536 offset += 2;
3537 /* Add Address */
3538 proto_tree_add_item(addr_tree, hf_acn_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3539 /* Append port and address to tree item */
3540 proto_item_append_text(pi, " %s, Port %d", tvb_address_to_str(pinfo->pool, tvb, AT_IPv4, offset), port);
3541 offset += 4;
3542 break;
3543 case ACN_ADDR_IPV62:
3544 /* Build tree and add type*/
3545 addr_tree = proto_tree_add_subtree(tree, tvb, offset, 19, ett_acn_address, &pi, label);
3546 proto_tree_add_item(addr_tree, hf_acn_ip_address_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3547 offset += 1;
3548 /* Add port */
3549 port = tvb_get_ntohs(tvb, offset);
3550 proto_tree_add_item(addr_tree, hf_acn_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3551 offset += 2;
3552 /* Add Address */
3553 proto_tree_add_item(addr_tree, hf_acn_ipv6, tvb, offset, 16, ENC_NA0x00000000);
3554 /* Append port and address to tree item */
3555 proto_item_append_text(pi, " %s, Port %d", tvb_address_to_str(pinfo->pool, tvb, AT_IPv6, offset), port);
3556 offset += 16;
3557 break;
3558 case ACN_ADDR_IPPORT3:
3559 /* Build tree and add type*/
3560 addr_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_acn_address, &pi, label);
3561 proto_tree_add_item(addr_tree, hf_acn_ip_address_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3562 offset += 1;
3563 /* Add port */
3564 port = tvb_get_ntohs(tvb, offset);
3565 proto_tree_add_item(addr_tree, hf_acn_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3566 /* Append port to tree item */
3567 proto_item_append_text(pi, " Port %d", port);
3568 offset += 2;
3569 break;
3570 }
3571 return offset;
3572}
3573
3574/******************************************************************************/
3575/* Adds tree branch for address type */
3576static uint32_t
3577acn_add_dmp_address_type(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, acn_dmp_adt_type *adt)
3578{
3579 proto_tree *this_tree;
3580 uint8_t D;
3581 const char *name;
3582
3583 /* header contains address and data type */
3584 adt->flags = tvb_get_uint8(tvb, offset);
3585
3586 D = ACN_DMP_ADT_EXTRACT_D(adt->flags)(((adt->flags) & 0x30) >> 4);
3587 name = val_to_str(pinfo->pool, D, acn_dmp_adt_d_vals, "not valid (%d)");
3588 this_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1, ett_acn_address_type,
3589 NULL((void*)0), "Address and Data Type: %s", name);
3590
3591 proto_tree_add_uint(this_tree, hf_acn_dmp_adt_v, tvb, offset, 1, adt->flags);
3592 proto_tree_add_uint(this_tree, hf_acn_dmp_adt_r, tvb, offset, 1, adt->flags);
3593 proto_tree_add_uint(this_tree, hf_acn_dmp_adt_d, tvb, offset, 1, adt->flags);
3594 proto_tree_add_uint(this_tree, hf_acn_dmp_adt_x, tvb, offset, 1, adt->flags);
3595 proto_tree_add_uint(this_tree, hf_acn_dmp_adt_a, tvb, offset, 1, adt->flags);
3596 offset += 1;
3597
3598 return offset; /* bytes used */
3599}
3600
3601/******************************************************************************/
3602/* Add an dmp address */
3603static uint32_t
3604acn_add_dmp_address(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, acn_dmp_adt_type *adt)
3605{
3606 int32_t start_offset;
3607 int32_t bytes_used;
3608 uint8_t D, A;
3609
3610 start_offset = offset;
3611
3612 D = ACN_DMP_ADT_EXTRACT_D(adt->flags)(((adt->flags) & 0x30) >> 4);
3613 A = ACN_DMP_ADT_EXTRACT_A(adt->flags)((adt->flags) & 0x03);
3614
3615 switch (D) {
3616 case ACN_DMP_ADT_D_NS0: /* Non-range address, Single data item */
3617 adt->increment = 1;
3618 adt->count = 1;
3619 switch (A) { /* address */
3620 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
3621 adt->address = tvb_get_uint8(tvb, offset);
3622 offset += 1;
3623 bytes_used = 1;
3624 break;
3625 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
3626 adt->address = tvb_get_ntohs(tvb, offset);
3627 offset += 2;
3628 bytes_used = 2;
3629 break;
3630 case ACN_DMP_ADT_A_42: /* Four octet address, (range: one octet address, increment, and count). */
3631 adt->address = tvb_get_ntohl(tvb, offset);
3632 offset += 4;
3633 bytes_used = 4;
3634 break;
3635 default: /* and ACN_DMP_ADT_A_R (Four octet address, (range: four octet address, increment, and count)*/
3636 return offset;
3637 } /* of switch (A) */
3638
3639 if (adt->flags & ACN_DMP_ADT_FLAG_V0x80) {
3640 proto_tree_add_uint(tree, hf_acn_dmp_virtual_address, tvb, start_offset, bytes_used, adt->address);
3641 } else {
3642 proto_tree_add_uint(tree, hf_acn_dmp_actual_address, tvb, start_offset, bytes_used, adt->address);
3643 }
3644 break;
3645
3646 case ACN_DMP_ADT_D_RS1: /* Range address, Single data item */
3647 switch (A) {
3648 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
3649 adt->address = tvb_get_uint8(tvb, offset);
3650 offset += 1;
3651 adt->increment = tvb_get_uint8(tvb, offset);
3652 offset += 1;
3653 adt->count = tvb_get_uint8(tvb, offset);
3654 offset += 1;
3655 bytes_used = 3;
3656 break;
3657 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
3658 adt->address = tvb_get_ntohs(tvb, offset);
3659 offset += 2;
3660 adt->increment = tvb_get_ntohs(tvb, offset);
3661 offset += 2;
3662 adt->count = tvb_get_ntohs(tvb, offset);
3663 offset += 2;
3664 bytes_used = 6;
3665 break;
3666 case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */
3667 adt->address = tvb_get_ntohl(tvb, offset);
3668 offset += 4;
3669 adt->increment = tvb_get_ntohl(tvb, offset);
3670 offset += 4;
3671 adt->count = tvb_get_ntohl(tvb, offset);
3672 offset += 4;
3673 bytes_used = 12;
3674 break;
3675 default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */
3676 return offset;
3677 } /* of switch (A) */
3678
3679 if (adt->flags & ACN_DMP_ADT_FLAG_V0x80) {
3680 proto_tree_add_uint_format_value(tree, hf_acn_dmp_virtual_address_first, tvb, start_offset, bytes_used,
3681 adt->address, "0x%X, inc: %d, count: %d",
3682 adt->address, adt->increment, adt->count);
3683 } else {
3684 proto_tree_add_uint_format_value(tree, hf_acn_dmp_actual_address_first, tvb, start_offset, bytes_used,
3685 adt->address, "0x%X, inc: %d, count: %d",
3686 adt->address, adt->increment, adt->count);
3687 }
3688 break;
3689
3690 case ACN_DMP_ADT_D_RE2: /* Range address, Array of equal size data items */
3691 switch (A) {
3692 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
3693 adt->address = tvb_get_uint8(tvb, offset);
3694 offset += 1;
3695 adt->increment = tvb_get_uint8(tvb, offset);
3696 offset += 1;
3697 adt->count = tvb_get_uint8(tvb, offset);
3698 offset += 1;
3699 bytes_used = 3;
3700 break;
3701 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
3702 adt->address = tvb_get_ntohs(tvb, offset);
3703 offset += 2;
3704 adt->increment = tvb_get_ntohs(tvb, offset);
3705 offset += 2;
3706 adt->count = tvb_get_ntohs(tvb, offset);
3707 offset += 2;
3708 bytes_used = 6;
3709 break;
3710 case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */
3711 adt->address = tvb_get_ntohl(tvb, offset);
3712 offset += 4;
3713 adt->increment = tvb_get_ntohl(tvb, offset);
3714 offset += 4;
3715 adt->count = tvb_get_ntohl(tvb, offset);
3716 offset += 4;
3717 bytes_used = 12;
3718 break;
3719 default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */
3720 return offset;
3721 } /* of switch (A) */
3722
3723 if (adt->flags & ACN_DMP_ADT_FLAG_V0x80) {
3724 proto_tree_add_uint_format_value(tree, hf_acn_dmp_virtual_address_first, tvb, start_offset, bytes_used,
3725 adt->address, "0x%X, inc: %d, count: %d",
3726 adt->address, adt->increment, adt->count);
3727 } else {
3728 proto_tree_add_uint_format_value(tree, hf_acn_dmp_actual_address_first, tvb, start_offset, bytes_used,
3729 adt->address, "0x%X, inc: %d, count: %d",
3730 adt->address, adt->increment, adt->count);
3731 }
3732 break;
3733
3734 case ACN_DMP_ADT_D_RM3: /* Range address, Series of mixed size data items */
3735 switch (A) {
3736 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
3737 adt->address = tvb_get_uint8(tvb, offset);
3738 offset += 1;
3739 adt->increment = tvb_get_uint8(tvb, offset);
3740 offset += 1;
3741 adt->count = tvb_get_uint8(tvb, offset);
3742 offset += 1;
3743 bytes_used = 3;
3744 break;
3745 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
3746 adt->address = tvb_get_ntohs(tvb, offset);
3747 offset += 2;
3748 adt->increment = tvb_get_ntohs(tvb, offset);
3749 offset += 2;
3750 adt->count = tvb_get_ntohs(tvb, offset);
3751 offset += 2;
3752 bytes_used = 6;
3753 break;
3754 case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */
3755 adt->address = tvb_get_ntohl(tvb, offset);
3756 offset += 4;
3757 adt->increment = tvb_get_ntohl(tvb, offset);
3758 offset += 4;
3759 adt->count = tvb_get_ntohl(tvb, offset);
3760 offset += 4;
3761 bytes_used = 12;
3762 break;
3763 default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */
3764 return offset;
3765 } /* of switch (A) */
3766
3767 if (adt->flags & ACN_DMP_ADT_FLAG_V0x80) {
3768 proto_tree_add_uint_format_value(tree, hf_acn_dmp_virtual_address_first, tvb, start_offset, bytes_used,
3769 adt->address, "0x%X, inc: %d, count: %d",
3770 adt->address, adt->increment, adt->count);
3771 } else {
3772 proto_tree_add_uint_format_value(tree, hf_acn_dmp_actual_address_first, tvb, start_offset, bytes_used,
3773 adt->address, "0x%X, inc: %d, count: %d",
3774 adt->address, adt->increment, adt->count);
3775 }
3776 break;
3777 } /* of switch (D) */
3778
3779 return offset;
3780}
3781
3782
3783/*******************************************************************************/
3784/* Display DMP Data */
3785static uint32_t
3786acn_add_dmp_data(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, acn_dmp_adt_type *adt)
3787{
3788 uint8_t D, A;
3789 uint32_t data_size;
3790 uint32_t data_value;
3791 uint32_t data_address;
3792 uint32_t x,y;
3793 char *buffer;
3794 wmem_strbuf_t *default_buffer;
3795 proto_item *ti;
3796 uint32_t ok_to_process = false0;
3797
3798 /* We would like to rip through Property Address-Data pairs */
3799 /* but since we don't now how many there are nor how big the data size is, */
3800 /* it not possible. So, we just show the whole thing as a block of date! */
3801 /* */
3802 /* There are a few exceptions however */
3803 /* 1) if the address type is ACN_DMP_ADT_D_NS or ACN_DMP_ADT_D_RS and */
3804 /* or ACN_DMP_ADT_D_RE */
3805 /* then number of bytes is <= count + 4. Each value is at least one byte */
3806 /* and another address/data pair is at least 4 bytes so if the remaining */
3807 /* bytes is less than the count plus 4 then the remaining data */
3808 /* must be all data */
3809 /* */
3810 /* 2) if the address type is ACN_DMP_ADT_D_RE and the number of bytes */
3811 /* equals the number of bytes in remaining in the pdu then there is */
3812 /* a 1 to one match */
3813
3814 D = ACN_DMP_ADT_EXTRACT_D(adt->flags)(((adt->flags) & 0x30) >> 4);
3815 switch (D) {
3816 case ACN_DMP_ADT_D_NS0:
3817 case ACN_DMP_ADT_D_RS1:
3818 if (adt->data_length <= adt->count + 4) {
3819 ok_to_process = true1;
3820 }
3821 break;
3822 case ACN_DMP_ADT_D_RE2:
3823 if (adt->count == 0) {
3824 break;
3825 }
3826 if (adt->data_length <= adt->count + 4) {
3827 ok_to_process = true1;
3828 }
3829 break;
3830 }
3831
3832 if (!ok_to_process) {
3833 data_size = adt->data_length;
3834 ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000);
3835 offset += data_size;
3836 proto_item_set_text(ti, "Data and more Address-Data Pairs (further dissection not possible)");
3837 return offset;
3838 }
3839
3840 A = ACN_DMP_ADT_EXTRACT_A(adt->flags)((adt->flags) & 0x03);
3841
3842 switch (D) {
3843 case ACN_DMP_ADT_D_NS0: /* Non-range address, Single data item */
3844 /* calculate data size */
3845 data_size = adt->data_length;
3846 data_address = adt->address;
3847
3848 switch (A) {
3849 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
3850 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address);
3851 break;
3852 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
3853 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address);
3854 break;
3855 case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */
3856 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address);
3857 break;
3858 default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */
3859 offset += data_size;
3860 return offset;
3861 }
3862
3863 switch (data_size) {
3864 case 1:
3865 data_value = tvb_get_uint8(tvb, offset);
3866 proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %2.2X", buffer, data_value);
3867 break;
3868 case 2:
3869 data_value = tvb_get_ntohs(tvb, offset);
3870 proto_tree_add_uint_format(tree, hf_acn_data16, tvb, offset, 2, data_value, "%s %4.4X", buffer, data_value);
3871 break;
3872 case 3:
3873 data_value = tvb_get_ntoh24(tvb, offset);
3874 proto_tree_add_uint_format(tree, hf_acn_data24, tvb, offset, 3, data_value, "%s %6.6X", buffer, data_value);
3875 break;
3876 case 4:
3877 data_value = tvb_get_ntohl(tvb, offset);
3878 proto_tree_add_uint_format(tree, hf_acn_data32, tvb, offset, 4, data_value, "%s %8.8X", buffer, data_value);
3879 break;
3880 default:
3881 default_buffer = wmem_strbuf_new(pinfo->pool, "");
3882 /* build string of values */
3883 for (y=0; y<20 && y<data_size; y++) {
3884 data_value = tvb_get_uint8(tvb, offset+y);
3885 wmem_strbuf_append_printf(default_buffer, " %2.2X", data_value);
3886 }
3887 /* add the item */
3888 ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000);
3889 offset += data_size;
3890 /* change the text */
3891 proto_item_set_text(ti, "%s", wmem_strbuf_get_str(default_buffer));
3892 break;
3893 } /* of switch (data_size) */
3894 offset += data_size;
3895 break;
3896
3897 case ACN_DMP_ADT_D_RS1: /* Range address, Single data item */
3898 /* calculate data size */
3899 data_size = adt->data_length;
3900 data_address = adt->address;
3901
3902 for (x=0; x<adt->count; x++) {
3903 switch (A) {
3904 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
3905 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address);
3906 break;
3907 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
3908 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address);
3909 break;
3910 case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */
3911 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address);
3912 break;
3913 default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */
3914 return offset;
3915 }
3916
3917 switch (data_size) {
3918 case 1:
3919 data_value = tvb_get_uint8(tvb, offset);
3920 proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %2.2X", buffer, data_value);
3921 break;
3922 case 2:
3923 data_value = tvb_get_ntohs(tvb, offset);
3924 proto_tree_add_uint_format(tree, hf_acn_data16, tvb, offset, 2, data_value, "%s %4.4X", buffer, data_value);
3925 break;
3926 case 3:
3927 data_value = tvb_get_ntoh24(tvb, offset);
3928 proto_tree_add_uint_format(tree, hf_acn_data24, tvb, offset, 3, data_value, "%s %6.6X", buffer, data_value);
3929 break;
3930 case 4:
3931 data_value = tvb_get_ntohl(tvb, offset);
3932 proto_tree_add_uint_format(tree, hf_acn_data32, tvb, offset, 4, data_value, "%s %8.8X", buffer, data_value);
3933 break;
3934 default:
3935 /* build string of values */
3936 default_buffer = wmem_strbuf_new(pinfo->pool, "");
3937 for (y=0; y<20 && y<data_size; y++) {
3938 data_value = tvb_get_uint8(tvb, offset+y);
3939 wmem_strbuf_append_printf(default_buffer, " %2.2X", data_value);
3940 }
3941 /* add the item */
3942 ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000);
3943 /* change the text */
3944 proto_item_set_text(ti, "%s", wmem_strbuf_get_str(default_buffer));
3945 break;
3946 } /* of switch (data_size) */
3947 data_address += adt->increment;
3948 } /* of (x=0;x<adt->count;x++) */
3949 offset += data_size;
3950 break;
3951
3952 case ACN_DMP_ADT_D_RE2: /* Range address, Array of equal size data items */
3953 /* calculate data size */
3954 data_size = adt->data_length / adt->count;
3955 data_address = adt->address;
3956
3957 for (x=0; x<adt->count; x++) {
3958 switch (A) {
3959 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
3960 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address);
3961 break;
3962 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
3963 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address);
3964 break;
3965 case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */
3966 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address);
3967 break;
3968 default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */
3969 return offset;
3970 }
3971
3972 switch (data_size) {
3973 case 1:
3974 data_value = tvb_get_uint8(tvb, offset);
3975 proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %2.2X", buffer, data_value);
3976 break;
3977 case 2:
3978 data_value = tvb_get_ntohs(tvb, offset);
3979 proto_tree_add_uint_format(tree, hf_acn_data16, tvb, offset, 2, data_value, "%s %4.4X", buffer, data_value);
3980 break;
3981 case 3:
3982 data_value = tvb_get_ntoh24(tvb, offset);
3983 proto_tree_add_uint_format(tree, hf_acn_data24, tvb, offset, 3, data_value, "%s %6.6X", buffer, data_value);
3984 break;
3985 case 4:
3986 data_value = tvb_get_ntohl(tvb, offset);
3987 proto_tree_add_uint_format(tree, hf_acn_data32, tvb, offset, 4, data_value, "%s %8.8X", buffer, data_value);
3988 break;
3989 default:
3990 /* build string of values */
3991 default_buffer = wmem_strbuf_new(pinfo->pool, "");
3992 for (y=0; y<20 && y<data_size; y++) {
3993 data_value = tvb_get_uint8(tvb, offset+y);
3994 wmem_strbuf_append_printf(default_buffer, " %2.2X", data_value);
3995 }
3996 /* add the item */
3997 ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000);
3998 /* change the text */
3999 proto_item_set_text(ti, "%s", wmem_strbuf_get_str(default_buffer));
4000 break;
4001 } /* of switch (data_size) */
4002
4003 offset += data_size;
4004 data_address += adt->increment;
4005 } /* of (x=0;x<adt->count;x++) */
4006 break;
4007
4008 case ACN_DMP_ADT_D_RM3: /* Range address, Series of mixed size data items */
4009 data_size = adt->data_length;
4010 ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000);
4011 offset += data_size;
4012 /* change the text */
4013 proto_item_set_text(ti, "Mixed size data items");
4014 break;
4015 } /* of switch (D) */
4016 return offset;
4017}
4018
4019/*******************************************************************************/
4020/* Display DMP Reason codes */
4021static uint32_t
4022acn_add_dmp_reason_codes(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, acn_dmp_adt_type *adt)
4023{
4024 uint8_t D, A;
4025 uint32_t data_value;
4026 uint32_t data_address;
4027 uint32_t x;
4028
4029 char *buffer;
4030 const char *name;
4031
4032 D = ACN_DMP_ADT_EXTRACT_D(adt->flags)(((adt->flags) & 0x30) >> 4);
4033 A = ACN_DMP_ADT_EXTRACT_A(adt->flags)((adt->flags) & 0x03);
4034 switch (D) {
4035 case ACN_DMP_ADT_D_NS0: /* Non-range address, Single data item */
4036 data_address = adt->address;
4037 switch (A) {
4038 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
4039 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address);
4040 break;
4041 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
4042 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address);
4043 break;
4044 case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */
4045 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address);
4046 break;
4047 default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */
4048 return offset;
4049 }
4050
4051 /* Get reason */
4052 data_value = tvb_get_uint8(tvb, offset);
4053 name = val_to_str(pinfo->pool, data_value, acn_dmp_reason_code_vals, "reason not valid (%d)");
4054 proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %s", buffer, name);
4055 offset += 1;
4056 break;
4057
4058 case ACN_DMP_ADT_D_RS1: /* Range address, Single data item */
4059 data_address = adt->address;
4060 for (x=0; x<adt->count; x++) {
4061 switch (A) {
4062 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
4063 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address);
4064 break;
4065 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
4066 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address);
4067 break;
4068 case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */
4069 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address);
4070 break;
4071 default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */
4072 return offset;
4073 }
4074
4075 /* Get reason */
4076 data_value = tvb_get_uint8(tvb, offset);
4077 name = val_to_str(pinfo->pool, data_value, acn_dmp_reason_code_vals, "reason not valid (%d)");
4078 proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %s", buffer, name);
4079
4080 data_address += adt->increment;
4081 } /* of (x=0;x<adt->count;x++) */
4082 offset += 1;
4083 break;
4084
4085 case ACN_DMP_ADT_D_RE2: /* Range address, Array of equal size data items */
4086 case ACN_DMP_ADT_D_RM3: /* Range address, Series of mixed size data items */
4087 data_address = adt->address;
4088 for (x=0; x<adt->count; x++) {
4089 switch (A) {
4090 case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */
4091 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address);
4092 break;
4093 case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */
4094 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address);
4095 break;
4096 case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */
4097 buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address);
4098 break;
4099 default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */
4100 return offset;
4101 }
4102 /* Get reason */
4103 data_value = tvb_get_uint8(tvb, offset);
4104 name = val_to_str(pinfo->pool, data_value, acn_dmp_reason_code_vals, "reason not valid (%d)");
4105 proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %s", buffer, name);
4106 data_address += adt->increment;
4107 offset += 1;
4108 } /* of (x=0;x<adt->count;x++) */
4109 break;
4110 } /* of switch (D) */
4111 return offset;
4112}
4113
4114/******************************************************************************/
4115/* Get Field Type Parameters */
4116static void
4117get_field_type_parameters(tvbuff_t *tvb, int blob_offset, uint8_t field_type, uint8_t *field_length, uint8_t *blob_offset1, uint8_t *blob_offset2, uint8_t *blob_offset3)
4118{
4119 /* Switch Over Field Type to Determine Data */
4120 switch (field_type) {
4121 case ACN_BLOB_FIELD_TYPE11:
4122 case ACN_BLOB_FIELD_TYPE55:
4123 /* Set field length and blob_offsets to use */
4124 *field_length = 1;
4125 *blob_offset1 = 0;
4126 *blob_offset2 = 1;
4127 *blob_offset3 = *field_length;
4128 break;
4129 case ACN_BLOB_FIELD_TYPE22:
4130 case ACN_BLOB_FIELD_TYPE66:
4131 /* Set field length and blob_offsets to use */
4132 *field_length = 2;
4133 *blob_offset1 = 0;
4134 *blob_offset2 = 1;
4135 *blob_offset3 = *field_length;
4136 break;
4137 case ACN_BLOB_FIELD_TYPE33:
4138 case ACN_BLOB_FIELD_TYPE77:
4139 /* Set field length and blob_offsets to use */
4140 *field_length = 4;
4141 *blob_offset1 = 0;
4142 *blob_offset2 = 1;
4143 *blob_offset3 = *field_length;
4144 break;
4145 case ACN_BLOB_FIELD_TYPE44:
4146 case ACN_BLOB_FIELD_TYPE88:
4147 /* Set field length and blob_offsets to use */
4148 *field_length = 8;
4149 *blob_offset1 = 0;
4150 *blob_offset2 = 1;
4151 *blob_offset3 = *field_length;
4152 break;
4153 case ACN_BLOB_FIELD_TYPE99:
4154 /* float */
4155 /* Set field length and blob_offsets to use */
4156 *field_length = 4;
4157 *blob_offset1 = 0;
4158 *blob_offset2 = 1;
4159 *blob_offset3 = *field_length;
4160 break;
4161 case ACN_BLOB_FIELD_TYPE1010:
4162 /* double */
4163 /* Set field length and blob_offsets to use */
4164 *field_length = 8;
4165 *blob_offset1 = 0;
4166 *blob_offset2 = 1;
4167 *blob_offset3 = *field_length;
4168 break;
4169 case ACN_BLOB_FIELD_TYPE1111:
4170 /* Set field length and blob_offsets to use */
4171 *field_length = tvb_get_uint8(tvb, blob_offset + 2);
4172 *blob_offset1 = 2;
4173 *blob_offset2 = 1;
4174 *blob_offset3 = (*field_length) - 2;
4175 break;
4176 case ACN_BLOB_FIELD_TYPE1212:
4177 /* Set field length and blob_offsets to use for ignores */
4178 *field_length = 0;
4179 *blob_offset1 = 0;
4180 *blob_offset2 = 0;
4181 *blob_offset3 = 1;
4182 break;
4183 default:
4184 /* Set field length and blob_offsets to use for unknowns */
4185 *field_length = 0;
4186 *blob_offset1 = 0;
4187 *blob_offset2 = 0;
4188 *blob_offset3 = 1;
4189 }
4190}
4191
4192/******************************************************************************/
4193/* Get Field Name */
4194static const char *
4195get_field_name(wmem_allocator_t* scope, uint8_t blob_type, uint16_t field_number)
4196{
4197 uint16_t temp_field_number;
4198 const char *field_name;
4199
4200 /*Find the field sub tree name depending on the blob type.*/
4201 switch (blob_type) {
4202 case ACN_BLOB_IPV41:
4203 case ACN_BLOB_IPV62:
4204 field_name = val_to_str(scope, field_number, acn_blob_ip_field_name, "not valid (%d)");
4205 break;
4206 case ACN_BLOB_ERROR13:
4207 field_name = val_to_str(scope, field_number, acn_blob_error1_field_name, "not valid (%d)");
4208 break;
4209 case ACN_BLOB_ERROR24:
4210 field_name = val_to_str(scope, field_number, acn_blob_error2_field_name, "not valid (%d)");
4211 break;
4212 case ACN_BLOB_METADATA5:
4213 field_name = val_to_str(scope, field_number, acn_blob_metadata_field_name, "not valid (%d)");
4214 break;
4215 case ACN_BLOB_METADATA_DEVICES6:
4216 field_name = val_to_str(scope, field_number, acn_blob_metadata_devices_field_name, "not valid (%d)");
4217 break;
4218 case ACN_BLOB_METADATA_TYPES7:
4219 field_name = val_to_str(scope, field_number, acn_blob_metadata_types_field_name, "not valid (%d)");
4220 break;
4221 case ACN_BLOB_TIME18:
4222 field_name = val_to_str(scope, field_number, acn_blob_time1_field_name, "not valid (%d)");
4223 break;
4224 case ACN_BLOB_DIMMER_PROPERTIES9:
4225 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_properties1_field_name_ext, "not valid (%d)");
4226 break;
4227 case ACN_BLOB_DIMMER_LOAD_PROPERTIES10:
4228 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_load_properties1_field_name_ext, "not valid (%d)");
4229 break;
4230 case ACN_BLOB_DIMMING_RACK_PROPERTIES11:
4231 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_rack_properties1_field_name_ext, "not valid (%d)");
4232 break;
4233 case ACN_BLOB_DIMMING_RACK_STATUS_PROPERTIES12:
4234 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_rack_status_properties1_field_name_ext, "not valid (%d)");
4235 break;
4236 case ACN_BLOB_DIMMER_STATUS_PROPERTIES13:
4237 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_status_properties1_field_name_ext, "not valid (%d)");
4238 break;
4239 case ACN_BLOB_SET_LEVELS_OPERATION14:
4240 field_name = val_to_str(scope, field_number, acn_blob_set_levels_operation_field_name, "not valid (%d)");
4241 break;
4242 case ACN_BLOB_PRESET_OPERATION15:
4243 field_name = val_to_str(scope, field_number, acn_blob_preset_operation_field_name, "not valid (%d)");
4244 break;
4245 case ACN_BLOB_ADVANCED_FEATURES_OPERATION16:
4246 field_name = val_to_str(scope, field_number, acn_blob_advanced_features_operation_field_name, "not valid (%d)");
4247 break;
4248 case ACN_BLOB_DIRECT_CONTROL_OPERATION17:
4249 field_name = val_to_str(scope, field_number, acn_blob_direct_control_operation_field_name, "not valid (%d)");
4250 break;
4251 case ACN_BLOB_GENERATE_CONFIG_OPERATION18:
4252 field_name = val_to_str(scope, field_number, acn_blob_generate_config_operation_field_name, "not valid (%d)");
4253 break;
4254 case ACN_BLOB_ERROR319:
4255 field_name = val_to_str(scope, field_number, acn_blob_error3_field_name, "not valid (%d)");
4256 break;
4257 case ACN_BLOB_DIMMER_PROPERTIES220:
4258 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_properties2_field_name_ext, "not valid (%d)");
4259 break;
4260 case ACN_BLOB_DIMMER_LOAD_PROPERTIES221:
4261 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_load_properties2_field_name_ext, "not valid (%d)");
4262 break;
4263 case ACN_BLOB_DIMMER_RACK_PROPERTIES222:
4264 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_rack_properties2_field_name_ext, "not valid (%d)");
4265 break;
4266 case ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223:
4267 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_rack_status_properties2_field_name_ext, "not valid (%d)");
4268 break;
4269 case ACN_BLOB_DIMMER_STATUS_PROPERTIES224:
4270 field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_status_properties2_field_name_ext, "not valid (%d)");
4271 break;
4272 case ACN_BLOB_TIME225:
4273 field_name = val_to_str(scope, field_number, acn_blob_time2_field_name, "not valid (%d)");
4274 break;
4275 case ACN_BLOB_RPC26:
4276 {
4277 temp_field_number = field_number;
4278 /* field names 4 repeats: 1, 2, 3, 4, 4, 4, ... */
4279 if (temp_field_number > 3)
4280 temp_field_number = 4;
4281 field_name = val_to_str(scope, temp_field_number, acn_blob_rpc_field_name, "not valid (%d)");
4282 }
4283 break;
4284 case ACN_BLOB_DHCP_CONFIG_SUBNET27:
4285 field_name = val_to_str(scope, field_number, acn_blob_dhcp_config_subnet_field_name, "not valid (%d)");
4286 break;
4287 case ACN_BLOB_DHCP_CONFIG_STATIC_ROUTE28:
4288 field_name = val_to_str(scope, field_number, acn_blob_dhcp_config_static_route_field_name, "not valid (%d)");
4289 break;
4290 case ACN_BLOB_ENERGY_MANAGEMENT29:
4291 {
4292 temp_field_number = field_number;
4293 /* field names 4 through 7 repeat: 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, ... */
4294 if (temp_field_number > 3)
4295 temp_field_number = (field_number % 4) + 4;
4296 field_name = val_to_str(scope, temp_field_number, acn_blob_energy_management_field_name, "not valid (%d)");
4297 }
4298 break;
4299 case ACN_BLOB_PRESET_PROPERTIES250:
4300 field_name = val_to_str_ext(scope, field_number, &acn_blob_preset_properties_field_name_ext, "not valid (%d)");
4301 break;
4302 case ACN_BLOB_TIME330:
4303 field_name = val_to_str(scope, field_number, acn_blob_time3_field_name, "not valid (%d)");
4304 break;
4305 case ACN_BLOB_ENERGY_COST31:
4306 field_name = val_to_str(scope, field_number, acn_blob_energy_cost_field_name, "not valid (%d)");
4307 break;
4308 case ACN_BLOB_SEQUENCE_OPERATIONS32:
4309 field_name = val_to_str(scope, field_number, acn_blob_sequence_operation_field_name, "not valid (%d)");
4310 break;
4311 case ACN_BLOB_SEQUENCE_STEP_PROPERTIES33:
4312 field_name = val_to_str_ext(scope, field_number, &acn_blob_sequence_step_properties_field_name_ext, "not valid (%d)");
4313 break;
4314 default:
4315 field_name = "Unknown field";
4316 break;
4317 }
4318
4319 return field_name;
4320}
4321
4322/******************************************************************************/
4323/* Display Blob Field Value */
4324static void
4325display_blob_field_value(tvbuff_t *tvb, packet_info* pinfo, proto_tree *field_tree, uint16_t field_number, uint8_t blob_type, uint8_t field_type, uint8_t field_length, int blob_offset, uint8_t blob_offset3, int display_variblob_as_CID)
4326{
4327 int8_t field_value8;
4328 int32_t field_value32;
4329 const char *field_string;
4330 proto_item *ti;
4331
4332 /* Add field value to field sub tree */
4333 if (field_type == ACN_BLOB_FIELD_TYPE1212) {
4334 /* "ignore" always takes priority */
4335 proto_tree_add_string(field_tree, hf_acn_blob_field_value_string, tvb, blob_offset, field_length, "Ignore");
4336 }
4337 else if (blob_type == ACN_BLOB_IPV41) {
4338 proto_tree_add_item(field_tree, hf_acn_blob_field_value_ipv4, tvb, blob_offset, field_length-2, ENC_BIG_ENDIAN0x00000000);
4339 }
4340 else if (blob_type == ACN_BLOB_IPV62) {
4341 proto_tree_add_item(field_tree, hf_acn_blob_field_value_ipv6, tvb, blob_offset, field_length-2, ENC_NA0x00000000);
4342 }
4343 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 2)) {
4344 /* time zone index */
4345 field_value32 = (int32_t)(tvb_get_ntohl(tvb, blob_offset));
4346 if (field_value32 == -1) {
4347 field_string = "Field Value: Custom";
4348 }
4349 else {
4350 field_string = val_to_str(pinfo->pool, field_value32, acn_blob_time3_time_zone_vals, "not valid (%d)");
4351 }
4352 proto_tree_add_int_format(field_tree, hf_acn_blob_time_zone, tvb, blob_offset, 4, field_value32, "%s", field_string);
4353 }
4354 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 10)) {
4355 /* DST type */
4356 field_value8 = tvb_get_uint8(tvb, blob_offset);
4357 field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_dst_vals, "not valid (%d)");
4358 proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string);
4359 }
4360 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 11)) {
4361 /* DST on month */
4362 field_value8 = tvb_get_uint8(tvb, blob_offset);
4363 field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_month_vals, "not valid (%d)");
4364 proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string);
4365 }
4366 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 12)) {
4367 /* DST on week */
4368 field_value8 = tvb_get_uint8(tvb, blob_offset);
4369 field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_week_vals, "not valid (%d)");
4370 proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string);
4371 }
4372 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 13)) {
4373 /* DST start day */
4374 field_value8 = tvb_get_uint8(tvb, blob_offset);
4375 field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_day_vals, "not valid (%d)");
4376 proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_start_day, tvb, blob_offset, 1, field_value8, "%s", field_string);
4377 }
4378 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 16)) {
4379 /* DST start locality */
4380 field_value8 = tvb_get_uint8(tvb, blob_offset);
4381 field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_locality_vals, "not valid (%d)");
4382 proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_start_locality, tvb, blob_offset, 1, field_value8, "%s", field_string);
4383 }
4384 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 17)) {
4385 /* DST off month */
4386 field_value8 = tvb_get_uint8(tvb, blob_offset);
4387 field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_month_vals, "not valid (%d)");
4388 proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string);
4389 }
4390 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 18)) {
4391 /* DST off week */
4392 field_value8 = tvb_get_uint8(tvb, blob_offset);
4393 field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_week_vals, "not valid (%d)");
4394 proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string);
4395 }
4396 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 19)) {
4397 /* DST stop day */
4398 field_value8 = tvb_get_uint8(tvb, blob_offset);
4399 field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_day_vals, "not valid (%d)");
4400 proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_stop_day, tvb, blob_offset, 1, field_value8, "%s", field_string);
4401 }
4402 else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 22)) {
4403 /* DST stop locality */
4404 field_value8 = tvb_get_uint8(tvb, blob_offset);
4405 field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_locality_vals, "not valid (%d)");
4406 proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_stop_locality, tvb, blob_offset, 1, field_value8, "%s", field_string);
4407 }
4408 else {
4409 switch (field_type) {
4410 case ACN_BLOB_FIELD_TYPE11:
4411 /* Need special code to display signed data */
4412 ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, blob_offset, 1, ENC_BIG_ENDIAN0x00000000);
4413 proto_item_set_len(ti, blob_offset3);
4414 break;
4415 case ACN_BLOB_FIELD_TYPE22:
4416 /* Need special code to display signed data */
4417 ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, blob_offset, 2, ENC_BIG_ENDIAN0x00000000);
4418 proto_item_set_len(ti, blob_offset3);
4419 break;
4420 case ACN_BLOB_FIELD_TYPE33:
4421 /* Need special code to display signed data */
4422 ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, blob_offset, 3, ENC_BIG_ENDIAN0x00000000);
4423 proto_item_set_len(ti, blob_offset3);
4424 break;
4425 case ACN_BLOB_FIELD_TYPE44:
4426 /* Need special code to display signed data */
4427 ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number64, tvb, blob_offset, 8, ENC_BIG_ENDIAN0x00000000);
4428 proto_item_set_len(ti, blob_offset3);
4429 break;
4430 case ACN_BLOB_FIELD_TYPE99:
4431 /* float */
4432 proto_tree_add_item(field_tree, hf_acn_blob_field_value_float, tvb, blob_offset, field_length, ENC_BIG_ENDIAN0x00000000);
4433 break;
4434 case ACN_BLOB_FIELD_TYPE1010:
4435 /* double */
4436 proto_tree_add_item(field_tree, hf_acn_blob_field_value_double, tvb, blob_offset, field_length, ENC_BIG_ENDIAN0x00000000);
4437 break;
4438 case ACN_BLOB_FIELD_TYPE1111:
4439 if (blob_offset3 == 0) {
4440 proto_tree_add_string(field_tree, hf_acn_blob_field_value_string, tvb, blob_offset, 0, "<none>");
4441 }
4442 else if (display_variblob_as_CID) {
4443 proto_tree_add_item(field_tree, hf_acn_blob_field_value_guid, tvb, blob_offset, field_length, ENC_BIG_ENDIAN0x00000000);
4444 }
4445 else {
4446 proto_tree_add_item(field_tree, hf_acn_blob_field_value_string, tvb, blob_offset, blob_offset3, ENC_UTF_80x00000002);
4447 }
4448 break;
4449 /* "ignore", handled above */
4450 /* case ACN_BLOB_FIELD_TYPE12: */
4451 /* proto_tree_add_string(field_tree, hf_acn_blob_field_value_string, tvb, blob_offset, field_length, "Field Value: Ignore"); */
4452 /* break; */
4453 default:
4454 proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, blob_offset, blob_offset3, ENC_BIG_ENDIAN0x00000000);
4455 break;
4456 }
4457 }
4458}
4459
4460/******************************************************************************/
4461/* Display Blob Field */
4462static void
4463display_blob_field(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, uint8_t blob_type, int *blob_offset, uint16_t *field_number, int display_variblob_as_CID)
4464{
4465 uint8_t field_type;
4466 uint8_t field_length;
4467 uint8_t blob_offset1;
4468 uint8_t blob_offset2;
4469 uint8_t blob_offset3;
4470 uint16_t temp_field_number;
4471
4472 proto_item *fi;
4473 proto_tree *field_tree = NULL((void*)0);
4474 proto_item *ti;
4475
4476 const char *field_name;
4477
4478 if ((blob_type == ACN_BLOB_ENERGY_MANAGEMENT29) && (*field_number > 3)) {
4479 /* an exception to blob field rules: no "type" subfield, no "length" subfield */
4480
4481 /* field names 4 through 7 repeat: 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, ... */
4482 temp_field_number = (*field_number % 4) + 4;
4483
4484 switch (temp_field_number) {
4485 case 4:
4486 /* uint2 */
4487 field_length = 2;
4488 blob_offset3 = 2;
4489 field_name = get_field_name(pinfo->pool, blob_type, temp_field_number);
4490
4491 /* Create Sub Tree for Field Type*/
4492 fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, *blob_offset, field_length, ENC_NA0x00000000);
4493 field_tree = proto_item_add_subtree(fi, ett_acn_blob);
4494
4495 /* Add the Field Name Found to Sub Tree */
4496 proto_item_append_text(fi, ": %s", field_name);
4497
4498 ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, *blob_offset, 2, ENC_BIG_ENDIAN0x00000000);
4499 proto_item_set_len(ti, blob_offset3);
4500 break;
4501 case 5:
4502 case 6:
4503 case 7:
4504 /* uint4 */
4505 field_length = 4;
4506 blob_offset3 = 4;
4507 field_name = get_field_name(pinfo->pool, blob_type, temp_field_number);
4508
4509 /* Create Sub Tree for Field Type*/
4510 fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, *blob_offset, field_length, ENC_NA0x00000000);
4511 field_tree = proto_item_add_subtree(fi, ett_acn_blob);
4512
4513 /* Add the Field Name Found to Sub Tree */
4514 proto_item_append_text(fi, ": %s", field_name);
4515 ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, *blob_offset, 4, ENC_BIG_ENDIAN0x00000000);
4516 proto_item_set_len(ti, blob_offset3);
4517 break;
4518 }
4519 }
4520 else {
4521 /* Get field type*/
4522 field_type = tvb_get_uint8(tvb, *blob_offset);
4523 get_field_type_parameters(tvb, *blob_offset, field_type, &field_length, &blob_offset1, &blob_offset2, &blob_offset3);
4524 field_name = get_field_name(pinfo->pool, blob_type, *field_number);
4525
4526 /* Create Sub Tree for Field Type*/
4527 fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, *blob_offset, field_length + 1, ENC_NA0x00000000);
4528 field_tree = proto_item_add_subtree(fi, ett_acn_blob);
4529
4530 /* Add the Field Name Found to Sub Tree */
4531 proto_item_append_text(fi, ": %s", field_name);
4532
4533 /* Add field type to field sub tree */
4534 proto_tree_add_uint(field_tree, hf_acn_blob_field_type, tvb, *blob_offset, 1, field_type);
4535 *blob_offset += blob_offset1;
4536
4537 /* Add field length to field sub tree */
4538 proto_tree_add_uint(field_tree, hf_acn_blob_field_length, tvb, *blob_offset, 1, field_length);
4539 *blob_offset += blob_offset2;
4540
4541 display_blob_field_value(tvb, pinfo, field_tree, *field_number, blob_type, field_type, field_length, *blob_offset, blob_offset3, display_variblob_as_CID);
4542 }
4543
4544 *blob_offset += blob_offset3;
4545 *field_number += 1;
4546}
4547
4548/******************************************************************************/
4549/* Dissect Blob Metadata */
4550static uint32_t
4551dissect_acn_blob_metadata(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, int blob_offset, int end_offset)
4552{
4553 uint8_t blob_type = ACN_BLOB_METADATA5;
4554 uint16_t field_number = 1;
4555 bool_Bool display_variblob_as_CID;
4556
4557 /* Loop though dissecting fields until the end is reached */
4558 while (blob_offset < end_offset) {
4559 if (field_number == 15) {
4560
4561 display_variblob_as_CID = 1;
4562 }
4563 else {
4564 display_variblob_as_CID = 0;
4565
4566 }
4567
4568 display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, display_variblob_as_CID);
4569 }
4570 return 0;
4571}
4572
4573/******************************************************************************/
4574/* Dissect Blob Preset Properties */
4575static uint32_t
4576dissect_acn_blob_preset_properties(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, int blob_offset, int end_offset)
4577{
4578 uint8_t blob_type = ACN_BLOB_PRESET_PROPERTIES250;
4579 uint8_t field_type;
4580 uint8_t field_length;
4581 uint8_t blob_offset1;
4582 uint8_t blob_offset2;
4583 uint8_t blob_offset3;
4584 uint8_t sub_blob_index;
4585 uint16_t field_number = 1;
4586 uint8_t max_sub_blobs = 192;
4587 proto_item *fi;
4588 proto_tree *sub_blob_tree = NULL((void*)0);
4589 const char *field_name;
4590
4591 /* Loop though dissecting fields until the end is reached */
4592 while (blob_offset < end_offset) {
4593 if (field_number == 17) {
4594 /* Create subtree for "Levels" */
4595 field_type = tvb_get_uint8(tvb, blob_offset);
4596 get_field_type_parameters(tvb, blob_offset, field_type, &field_length, &blob_offset1, &blob_offset2, &blob_offset3);
4597
4598 field_name = get_field_name(pinfo->pool, blob_type, field_number);
4599 field_number += 1;
4600
4601 /* Create Sub Tree for Field Type */
4602 fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, blob_offset, (field_length + 1) * max_sub_blobs, ENC_NA0x00000000);
4603 sub_blob_tree = proto_item_add_subtree(fi, ett_acn_blob);
4604
4605 proto_item_append_text(fi, ": %s", field_name);
4606 sub_blob_index = 0;
4607
4608 while ((sub_blob_index < max_sub_blobs) && (blob_offset < end_offset)) {
4609 display_blob_field(tvb, pinfo, sub_blob_tree, blob_type, &blob_offset, &field_number, 0);
4610
4611 sub_blob_index += 1;
4612 }
4613
4614 }
4615
4616 else {
4617 display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, 0);
4618 }
4619
4620 }
4621 return 0;
4622}
4623
4624/******************************************************************************/
4625/* Dissect Blob Dimming Rack Properties v2 */
4626static uint32_t
4627dissect_acn_blob_dimming_rack_properties_v2(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, int blob_offset, int end_offset)
4628{
4629 uint8_t blob_type = ACN_BLOB_DIMMER_RACK_PROPERTIES222;
4630 uint16_t field_number = 1;
4631 bool_Bool display_variblob_as_CID;
4632
4633 /* Loop though dissecting fields until the end is reached */
4634 while (blob_offset < end_offset) {
4635 if (field_number == 12) {
4636
4637 display_variblob_as_CID = 1;
4638
4639 }
4640 else {
4641
4642 display_variblob_as_CID = 0;
4643
4644 }
4645
4646 display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, display_variblob_as_CID);
4647 }
4648 return 0;
4649}
4650
4651/******************************************************************************/
4652/* Dissect Blob Dimming Rack Status Properties v2 */
4653static uint32_t
4654dissect_acn_blob_dimming_rack_status_properties_v2(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, int blob_offset, int end_offset)
4655{
4656 uint8_t blob_type;
4657 uint8_t field_type;
4658 uint8_t field_length;
4659 uint8_t blob_offset1;
4660 uint8_t blob_offset2;
4661 uint8_t blob_offset3;
4662 uint8_t sub_blob_index;
4663 uint16_t field_number;
4664
4665 int number_of_sub_blobs;
4666
4667 proto_item *fi;
4668 proto_tree *sub_blob_tree = NULL((void*)0);
4669
4670 const char *field_name;
4671
4672 /*First Assignments*/
4673 blob_type = ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223;
4674 field_number = 1;
4675 number_of_sub_blobs = 64;
4676
4677 /* Loop though dissecting fields until the end is reached */
4678 while (blob_offset < end_offset) {
4679 if (field_number == 22) {
4680 /* Create subtree for "Active Preset Group IDs" */
4681 field_type = tvb_get_uint8(tvb, blob_offset);
4682 get_field_type_parameters(tvb, blob_offset, field_type, &field_length, &blob_offset1, &blob_offset2, &blob_offset3);
4683
4684 field_name = get_field_name(pinfo->pool, blob_type, field_number);
4685 field_number += 1;
4686
4687 /* Create Sub Tree for Field Type */
4688 fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, blob_offset, (field_length + 1) * number_of_sub_blobs, ENC_NA0x00000000);
4689 sub_blob_tree = proto_item_add_subtree(fi, ett_acn_blob);
4690
4691 proto_item_append_text(fi, ": %s", field_name);
4692
4693 sub_blob_index = 0;
4694
4695 while ((sub_blob_index < number_of_sub_blobs) && (blob_offset < end_offset)) {
4696 display_blob_field(tvb, pinfo, sub_blob_tree, blob_type, &blob_offset, &field_number, 0);
4697
4698 sub_blob_index += 1;
4699
4700 }
4701
4702 }
4703
4704 else {
4705 display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, 0);
4706 }
4707
4708 }
4709 return 0;
4710}
4711
4712/******************************************************************************/
4713/* Get Blob Type From Fields
4714Both "Dimmer Properties v2" and "Preset Properties" ended up with blob type 20 */
4715static uint8_t
4716get_blob_type_from_fields(tvbuff_t *tvb, int blob_offset, int end_offset)
4717{
4718 uint8_t field_type;
4719 uint8_t field_length;
4720 uint8_t blob_offset1;
4721 uint8_t blob_offset2;
4722 uint8_t blob_offset3;
4723 uint16_t field_number = 1;
4724
4725 while (blob_offset < end_offset) {
4726 field_type = tvb_get_uint8(tvb, blob_offset);
4727 if (field_number == 12) {
4728 if (field_type == ACN_BLOB_FIELD_TYPE1111) {
4729 /* string: dimmer name field */
4730 return ACN_BLOB_DIMMER_PROPERTIES220;
4731 }
4732 /* number: preset number field */
4733 return ACN_BLOB_PRESET_PROPERTIES250;
4734 }
4735 get_field_type_parameters(tvb, blob_offset, field_type, &field_length, &blob_offset1, &blob_offset2, &blob_offset3);
4736 blob_offset += blob_offset2 + blob_offset3;
4737 field_number += 1;
4738 }
4739
4740 return ACN_BLOB_DIMMER_PROPERTIES220;
4741}
4742
4743/******************************************************************************/
4744/* Dissect Blob */
4745static uint32_t
4746dissect_acn_blob(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pdu_tree, int blob_offset, int end_offset)
4747{
4748 /* Declarations for blobs*/
4749 uint8_t blob_type;
4750 uint16_t field_number = 1;
4751 proto_item *bi;
4752 proto_tree *blob_tree = NULL((void*)0);
4753 const char *blob_name;
4754 /* const char *range_type; */
4755
4756 /* Add blob to tree */
4757 bi = proto_tree_add_item(pdu_tree, hf_acn_blob, tvb, blob_offset, end_offset, ENC_NA0x00000000);
4758 blob_tree = proto_item_add_subtree(bi, 0);
4759 end_offset = blob_offset + end_offset;
4760 blob_offset += 4;
4761
4762 /* Add Blob version item to tree */
4763 proto_tree_add_item(blob_tree, hf_acn_blob_version, tvb, blob_offset, 1, ENC_BIG_ENDIAN0x00000000);
4764 blob_offset += 1;
4765
4766 /* Add Blob Start and End Range Info */
4767 proto_tree_add_item(blob_tree, hf_acn_blob_range_type, tvb, blob_offset, 1, ENC_BIG_ENDIAN0x00000000);
4768 /* range_type = val_to_str(pinfo->pool, range, acn_blob_range_type_vals, "not valid (%d)"); */
4769 blob_offset += 1;
4770
4771 /* Add Blob Range Number */
4772 proto_tree_add_item(blob_tree, hf_acn_blob_range_number, tvb, blob_offset, 1, ENC_BIG_ENDIAN0x00000000);
4773 blob_offset += 1;
4774
4775 /* Add Blob Meta-Type */
4776 blob_type = tvb_get_uint8(tvb, blob_offset);
4777 if (blob_type == ACN_BLOB_DIMMER_PROPERTIES220) {
4778 /* Dimmer Properties v2 and Preset Properties have the same 'type' value (20) */
4779 blob_type = get_blob_type_from_fields(tvb, blob_offset + 1, end_offset);
4780 }
4781
4782 proto_tree_add_uint(blob_tree, hf_acn_blob_type, tvb, blob_offset, 1, blob_type);
4783
4784 blob_name = val_to_str(pinfo->pool, blob_type, acn_blob_type_vals, "not valid (%d)");
4785 proto_item_append_text(bi, ": %s", blob_name);
4786 blob_offset += 1;
4787
4788 if (blob_type == ACN_BLOB_METADATA5) {
4789 return dissect_acn_blob_metadata(tvb, pinfo, blob_tree, blob_offset, end_offset);
4790 }
4791 if (blob_type == ACN_BLOB_PRESET_PROPERTIES250) {
4792 return dissect_acn_blob_preset_properties(tvb, pinfo, blob_tree, blob_offset, end_offset);
4793 }
4794 if (blob_type == ACN_BLOB_DIMMER_RACK_PROPERTIES222) {
4795 return dissect_acn_blob_dimming_rack_properties_v2(tvb, pinfo, blob_tree, blob_offset, end_offset);
4796 }
4797 if (blob_type == ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223) {
4798 return dissect_acn_blob_dimming_rack_status_properties_v2(tvb, pinfo, blob_tree, blob_offset, end_offset);
4799 }
4800
4801 /* Loop though dissecting fields until the end is reached */
4802 while (blob_offset < end_offset) {
4803 display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, 0);
4804 }
4805 return 0;
4806}
4807
4808/******************************************************************************/
4809/* Dissect PDU L bit flag */
4810static void
4811dissect_pdu_bit_flag_l(tvbuff_t *tvb, int *offset, uint8_t *pdu_flags, uint32_t *pdu_length, uint32_t *pdu_flvh_length)
4812{
4813 uint8_t octet;
4814 uint32_t length1;
4815 uint32_t length2;
4816 uint32_t length3;
4817
4818 /* get PDU flags and length flag */
4819 octet = tvb_get_uint8(tvb, (*offset)++);
4820 *pdu_flags = octet & 0xf0;
4821 length1 = octet & 0x0f; /* bottom 4 bits only */
4822 length2 = tvb_get_uint8(tvb, (*offset)++);
4823
4824 /* if length flag is set, then we have a 20 bit length else we have a 12 bit */
4825 /* flvh = flags, length, vector, header */
4826 if (*pdu_flags & ACN_PDU_FLAG_L0x80) {
4827 length3 = tvb_get_uint8(tvb, *offset);
4828 *offset += 1;
4829 *pdu_length = length3 | (length2 << 8) | (length1 << 16);
4830 *pdu_flvh_length = 3;
4831 } else {
4832 *pdu_length = length2 | (length1 << 8);
4833 *pdu_flvh_length = 2;
4834 }
4835}
4836
4837/******************************************************************************/
4838/* Dissect PDU V bit flag */
4839static void
4840dissect_pdu_bit_flag_v(int *offset, uint8_t pdu_flags, uint32_t *vector_offset, acn_pdu_offsets *last_pdu_offsets, uint32_t *pdu_flvh_length, uint8_t increment)
4841{
4842 /* Set vector offset */
4843 if (pdu_flags & ACN_PDU_FLAG_V0x40) {
4844 /* use new values */
4845 *vector_offset = *offset;
4846 last_pdu_offsets->vector = *offset;
4847 *offset += increment;
4848 *pdu_flvh_length += increment;
4849 } else {
4850 /* use last values */
4851 *vector_offset = last_pdu_offsets->vector;
4852 }
4853}
4854
4855/******************************************************************************/
4856/* Dissect PDU H bit flag */
4857static void
4858dissect_pdu_bit_flag_h(int *offset, uint8_t pdu_flags, uint32_t *header_offset, acn_pdu_offsets *last_pdu_offsets, uint32_t *pdu_flvh_length, uint8_t increment)
4859{
4860 /* Set header offset */
4861 if (pdu_flags & ACN_PDU_FLAG_H0x20) {
4862 /* use new values */
4863 *header_offset = *offset;
4864 last_pdu_offsets->header = *offset;
4865 *offset += increment;
4866 *pdu_flvh_length += increment;
4867 } else {
4868 /* use last values */
4869 *header_offset = last_pdu_offsets->header;
4870 }
4871}
4872
4873/******************************************************************************/
4874/* Dissect PDU D bit flag */
4875static void
4876dissect_pdu_bit_flag_d(int offset, uint8_t pdu_flags, uint32_t pdu_length, uint32_t *data_offset, uint32_t *data_length, acn_pdu_offsets *last_pdu_offsets, uint32_t pdu_flvh_length, bool_Bool set_last_value_length)
4877{
4878 /* Adjust data */
4879 if (pdu_flags & ACN_PDU_FLAG_D0x10) {
4880 /* use new values */
4881 *data_offset = offset;
4882 *data_length = pdu_length - pdu_flvh_length;
4883 last_pdu_offsets->data = offset;
4884 last_pdu_offsets->data_length = *data_length;
4885 } else {
4886 /* use last values */
4887 *data_offset = last_pdu_offsets->data;
4888 if (set_last_value_length) {
4889 *data_length = last_pdu_offsets->data_length;
4890 }
4891 }
4892}
4893
4894/******************************************************************************/
4895/* Add flag and flag tree */
4896static void
4897begin_dissect_acn_pdu(proto_tree **pdu_tree, tvbuff_t *tvb, proto_item **ti, proto_tree *tree, uint32_t *pdu_start, int *offset, uint8_t *pdu_flags, uint32_t *pdu_length, uint32_t *pdu_flvh_length, int ett_base_pdu, bool_Bool is_acn)
4898{
4899 proto_item *pi;
4900 proto_tree *flag_tree;
4901
4902 /* save start of pdu block */
4903 *pdu_start = *offset;
4904
4905 dissect_pdu_bit_flag_l(tvb, offset, pdu_flags, pdu_length, pdu_flvh_length);
4906 /* offset should now be pointing to vector (if one exists) */
4907
4908 /* add pdu item and tree */
4909 if (is_acn) {
4910 *ti = proto_tree_add_item(tree, hf_acn_pdu, tvb, *pdu_start, *pdu_length, ENC_NA0x00000000);
4911 } else {
4912 *ti = proto_tree_add_item(tree, hf_rdmnet_pdu, tvb, *pdu_start, *pdu_length, ENC_NA0x00000000);
4913 }
4914 *pdu_tree = proto_item_add_subtree(*ti, ett_base_pdu);
4915
4916 /* add flag item and tree */
4917 if (is_acn) {
4918 pi = proto_tree_add_uint(*pdu_tree, hf_acn_pdu_flags, tvb, *pdu_start, 1, *pdu_flags);
4919 flag_tree = proto_item_add_subtree(pi, ett_acn_pdu_flags);
4920 proto_tree_add_item(flag_tree, hf_acn_pdu_flag_l, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000);
4921 proto_tree_add_item(flag_tree, hf_acn_pdu_flag_v, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000);
4922 proto_tree_add_item(flag_tree, hf_acn_pdu_flag_h, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000);
4923 proto_tree_add_item(flag_tree, hf_acn_pdu_flag_d, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000);
4924 }
4925 else {
4926 pi = proto_tree_add_uint(*pdu_tree, hf_rdmnet_pdu_flags, tvb, *pdu_start, 1, *pdu_flags);
4927 flag_tree = proto_item_add_subtree(pi, ett_rdmnet_pdu_flags);
4928 proto_tree_add_item(flag_tree, hf_rdmnet_pdu_flag_l, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000);
4929 proto_tree_add_item(flag_tree, hf_rdmnet_pdu_flag_v, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000);
4930 proto_tree_add_item(flag_tree, hf_rdmnet_pdu_flag_h, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000);
4931 proto_tree_add_item(flag_tree, hf_rdmnet_pdu_flag_d, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000);
4932 }
4933}
4934
4935/******************************************************************************/
4936/* Dissect wrapped SDT PDU */
4937static uint32_t
4938dissect_acn_dmp_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
4939{
4940 /* common to all pdu */
4941 bool_Bool blob_exists = 0;
4942 uint8_t pdu_flags;
4943 uint32_t pdu_start;
4944 uint32_t pdu_length;
4945 uint32_t pdu_flvh_length; /* flags, length, vector, header */
4946 uint8_t D;
4947 uint32_t vector_offset;
4948 uint32_t header_offset;
4949 uint32_t data_offset;
4950 uint32_t old_offset;
4951 uint32_t end_offset;
4952 uint32_t data_length;
4953 uint32_t address_count;
4954 uint32_t blob_offset;
4955 uint32_t blob_end_offset = 0;
4956
4957 proto_item *ti;
4958 proto_tree *pdu_tree = NULL((void*)0);
4959
4960 /* this pdu */
4961 const char *name;
4962 acn_dmp_adt_type adt = {0,0,0,0,0,0};
4963 acn_dmp_adt_type adt2 = {0,0,0,0,0,0};
4964 uint32_t vector;
4965
4966 begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_dmp_pdu, 1);
4967
4968 /* Add PDU Length item */
4969 proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
4970
4971 dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 1);
4972 /* offset should now be pointing to header (if one exists) */
4973
4974 /* Add Vector item */
4975 vector = tvb_get_uint8(tvb, vector_offset);
4976 proto_tree_add_uint(pdu_tree, hf_acn_dmp_vector, tvb, vector_offset, 1, vector);
4977
4978 /* Add Vector item to tree*/
4979 name = val_to_str(pinfo->pool, vector, acn_dmp_vector_vals, "not valid (%d)");
4980 proto_item_append_text(ti, ": ");
4981 proto_item_append_text(ti, "%s", name);
4982
4983 dissect_pdu_bit_flag_h(&offset, pdu_flags, &header_offset, last_pdu_offsets, &pdu_flvh_length, 1);
4984 /* offset should now be pointing to data (if one exists) */
4985
4986 /* header contains address and data type */
4987 acn_add_dmp_address_type(tvb, pinfo, pdu_tree, header_offset, &adt);
4988
4989 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 1);
4990 end_offset = data_offset + data_length;
4991
4992 /* Check if blob exists, find beginning offset */
4993 blob_offset = data_offset;
4994 blob_exists = 0;
4995 while ((blob_offset < (end_offset - 4)) && (blob_exists != 1)) {
4996 if (tvb_get_ntohl(tvb, blob_offset) == 0x426c6f62) {
4997 /* 0x426c6f62 == "Blob" */
4998 blob_exists = 1;
4999 break;
5000 }
5001 blob_offset += 1;
5002 }
5003
5004 /* Fix the end_offset for finding Address-Data pair if blob exists*/
5005 if (blob_exists == 1) {
5006 blob_end_offset = end_offset - blob_offset;
5007 end_offset = blob_offset;
5008 data_length = blob_offset - data_offset;
5009 }
5010
5011 switch (vector) {
5012 case ACN_DMP_VECTOR_UNKNOWN0:
5013 break;
5014 case ACN_DMP_VECTOR_GET_PROPERTY1:
5015 /* Rip through property address */
5016 while (data_offset < end_offset) {
5017 old_offset = data_offset;
5018 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5019 if (old_offset == data_offset) break;
5020 }
5021 break;
5022 case ACN_DMP_VECTOR_SET_PROPERTY2:
5023 /* Rip through Property Address-Data pairs */
5024 /* But, in reality, this generally won't work as we have know way of */
5025 /* calculating the next Address-Data pair */
5026 while (data_offset < end_offset) {
5027 old_offset = data_offset;
5028 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5029 if (old_offset == data_offset) break;
5030
5031 adt.data_length = data_length - (data_offset - old_offset);
5032 old_offset = data_offset;
5033 data_offset = acn_add_dmp_data(tvb, pinfo, pdu_tree, data_offset, &adt);
5034 if (old_offset == data_offset) break;
5035 }
5036 break;
5037 case ACN_DMP_VECTOR_GET_PROPERTY_REPLY3:
5038 /* Rip through Property Address-Data pairs */
5039 /* But, in reality, this generally won't work as we have know way of */
5040 /* calculating the next Address-Data pair */
5041 while (data_offset < end_offset) {
5042 old_offset = data_offset;
5043 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5044 if (old_offset == data_offset) break;
5045
5046 adt.data_length = data_length - (data_offset - old_offset);
5047 old_offset = data_offset;
5048 data_offset = acn_add_dmp_data(tvb, pinfo, pdu_tree, data_offset, &adt);
5049 if (old_offset == data_offset) break;
5050 }
5051 break;
5052 case ACN_DMP_VECTOR_EVENT4:
5053 case ACN_DMP_VECTOR_SYNC_EVENT17:
5054 /* Rip through Property Address-Data pairs */
5055 /* But, in reality, this generally won't work as we have know way of */
5056 /* calculating the next Address-Data pair */
5057 while (data_offset < end_offset) {
5058 old_offset = data_offset;
5059 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5060 if (old_offset == data_offset) break;
5061
5062 adt.data_length = data_length - (data_offset - old_offset);
5063 old_offset = data_offset;
5064 data_offset = acn_add_dmp_data(tvb, pinfo, pdu_tree, data_offset, &adt);
5065 if (old_offset == data_offset) break;
5066 }
5067 break;
5068 case ACN_DMP_VECTOR_MAP_PROPERTY5:
5069 /* Virtual Address type */
5070 data_offset = acn_add_dmp_address_type(tvb, pinfo, pdu_tree, data_offset, &adt2);
5071 /* Rip through Actual-Virtual Address Pairs */
5072 while (data_offset < end_offset) {
5073 /* actual */
5074 old_offset = data_offset;
5075 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5076 if (old_offset == data_offset) break;
5077 D = ACN_DMP_ADT_EXTRACT_D(adt.flags)(((adt.flags) & 0x30) >> 4);
5078 switch (D) {
5079 case ACN_DMP_ADT_D_NS0:
5080 address_count = 1;
5081 break;
5082 case ACN_DMP_ADT_D_RS1:
5083 address_count = 1;
5084 break;
5085 case ACN_DMP_ADT_D_RE2:
5086 address_count = adt.count;
5087 break;
5088 /*case ACN_DMP_ADT_D_RM: */
5089 default:
5090 /* OUCH */
5091 return pdu_start + pdu_length;
5092 }
5093
5094 /* virtual */
5095 while (address_count > 0) {
5096 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt2);
5097 address_count--;
5098 }
5099 }
5100 break;
5101 case ACN_DMP_VECTOR_UNMAP_PROPERTY6:
5102 /* Rip through Actual Property Address */
5103 while (data_offset < end_offset) {
5104 old_offset = data_offset;
5105 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5106 if (old_offset == data_offset) break;
5107 }
5108 break;
5109 case ACN_DMP_VECTOR_SUBSCRIBE7:
5110 /* Rip through Property Address */
5111 while (data_offset < end_offset) {
5112 old_offset = data_offset;
5113 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5114 if (old_offset == data_offset) break;
5115 }
5116 break;
5117 case ACN_DMP_VECTOR_UNSUBSCRIBE8:
5118 /* Rip through Property Address */
5119 while (data_offset < end_offset) {
5120 old_offset = data_offset;
5121 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5122 if (old_offset == data_offset) break;
5123 }
5124 break;
5125 case ACN_DMP_VECTOR_GET_PROPERTY_FAIL9:
5126 /* Rip through Address-Reason Code Pairs */
5127 while (data_offset < end_offset) {
5128 old_offset = data_offset;
5129 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5130 if (old_offset == data_offset) break;
5131
5132 adt.data_length = data_length - (data_offset - old_offset);
5133 old_offset = data_offset;
5134 data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt);
5135 if (old_offset == data_offset) break;
5136 }
5137 break;
5138 case ACN_DMP_VECTOR_SET_PROPERTY_FAIL10:
5139 /* Rip through Address-Reason Code Pairs */
5140 while (data_offset < end_offset) {
5141 old_offset = data_offset;
5142 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5143 if (old_offset == data_offset) break;
5144
5145 adt.data_length = data_length - (data_offset - old_offset);
5146 old_offset = data_offset;
5147 data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt);
5148 if (old_offset == data_offset) break;
5149 }
5150 break;
5151 case ACN_DMP_VECTOR_MAP_PROPERTY_FAIL11:
5152 /* Rip through Address-Reason Code Pairs */
5153 while (data_offset < end_offset) {
5154 old_offset = data_offset;
5155 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5156 if (old_offset == data_offset) break;
5157
5158 adt.data_length = data_length - (data_offset - old_offset);
5159 old_offset = data_offset;
5160 data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt);
5161 if (old_offset == data_offset) break;
5162 }
5163 break;
5164 case ACN_DMP_VECTOR_SUBSCRIBE_ACCEPT12:
5165 /* Rip through Property Addresses */
5166 while (data_offset < end_offset) {
5167 old_offset = data_offset;
5168 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5169 if (old_offset == data_offset) break;
5170 }
5171 break;
5172 case ACN_DMP_VECTOR_SUBSCRIBE_REJECT13:
5173 /* Rip through Address-Reason Code Pairs */
5174 while (data_offset < end_offset) {
5175 old_offset = data_offset;
5176 data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
5177 if (old_offset == data_offset) break;
5178
5179 adt.data_length = data_length - (data_offset - old_offset);
5180 old_offset = data_offset;
5181 data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt);
5182 if (old_offset == data_offset) break;
5183 }
5184 break;
5185 case ACN_DMP_VECTOR_ALLOCATE_MAP14:
5186 /* No data for this */
5187 break;
5188 case ACN_DMP_VECTOR_ALLOCATE_MAP_REPLY15:
5189 /* Single reason code */
5190 proto_tree_add_item(pdu_tree, hf_acn_dmp_reason_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5191 /* data_offset += 1; */
5192 case ACN_DMP_VECTOR_DEALLOCATE_MAP16:
5193 /* No data for this */
5194 break;
5195 }
5196
5197 /* If blob exists, call function to dissect blob*/
5198 if (blob_exists == 1) {
5199 dissect_acn_blob(tvb, pinfo, pdu_tree, blob_offset, blob_end_offset);
5200 }
5201
5202 return pdu_start + pdu_length;
5203}
5204
5205
5206/******************************************************************************/
5207/* Dissect wrapped SDT PDU */
5208static uint32_t
5209dissect_acn_sdt_wrapped_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
5210{
5211 /* common to all pdu */
5212 uint8_t pdu_flags;
5213 uint32_t pdu_start;
5214 uint32_t pdu_length;
5215 uint32_t pdu_flvh_length; /* flags, length, vector, header */
5216 uint32_t vector_offset;
5217 uint32_t data_offset;
5218 uint32_t data_length;
5219
5220 proto_item *ti;
5221 proto_tree *pdu_tree = NULL((void*)0);
5222
5223 /* this pdu */
5224 const char *name;
5225 uint32_t vector;
5226
5227 begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_sdt_pdu, 1);
5228
5229 /* Add PDU Length item */
5230 proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
5231
5232 dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 1);
5233 /* offset should now be pointing to header (if one exists) */
5234
5235 /* Add Vector item */
5236 vector = tvb_get_uint8(tvb, vector_offset);
5237 proto_tree_add_uint(pdu_tree, hf_acn_sdt_vector, tvb, vector_offset, 1, vector);
5238
5239 /* Add Vector item to tree*/
5240 name = val_to_str(pinfo->pool, vector, acn_sdt_vector_vals, "not valid (%d)");
5241 proto_item_append_text(ti, ": ");
5242 proto_item_append_text(ti, "%s", name);
5243
5244 /* NO HEADER DATA ON THESE* (at least so far) */
5245
5246 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
5247
5248 switch (vector) {
5249 case ACN_SDT_VECTOR_ACK14:
5250 proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5251 /*data_offset += 4;*/
5252 break;
5253 case ACN_SDT_VECTOR_CHANNEL_PARAMS3:
5254 data_offset = acn_add_channel_parameter(tvb, pinfo, pdu_tree, data_offset);
5255 data_offset = acn_add_address(tvb, pinfo, pdu_tree, data_offset, "Ad-hoc Address:");
5256 /*data_offset =*/ acn_add_expiry(tvb, pinfo, pdu_tree, data_offset, hf_acn_adhoc_expiry);
5257 break;
5258 case ACN_SDT_VECTOR_LEAVE7:
5259 /* nothing more */
5260 break;
5261 case ACN_SDT_VECTOR_CONNECT9:
5262 /* Protocol ID item */
5263 proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5264 /*data_offset += 4;*/
5265 break;
5266 case ACN_SDT_VECTOR_CONNECT_ACCEPT10:
5267 /* Protocol ID item */
5268 proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5269 /*data_offset += 4;*/
5270 break;
5271 case ACN_SDT_VECTOR_CONNECT_REFUSE11:
5272 /* Protocol ID item */
5273 proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5274 data_offset += 4;
5275 proto_tree_add_item(pdu_tree, hf_acn_refuse_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5276 /*data_offset += 1;*/
5277 break;
5278 case ACN_SDT_VECTOR_DISCONNECT12:
5279 /* Protocol ID item */
5280 proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5281 /*data_offset += 4;*/
5282 break;
5283 case ACN_SDT_VECTOR_DISCONNECTING13:
5284 /* Protocol ID item */
5285 proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5286 data_offset += 4;
5287 proto_tree_add_item(pdu_tree, hf_acn_reason_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5288 /*data_offset += 1;*/
5289 break;
5290
5291 }
5292
5293 return pdu_start + pdu_length;
5294}
5295
5296
5297/******************************************************************************/
5298/* Dissect SDT Client PDU */
5299static uint32_t
5300dissect_acn_sdt_client_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
5301{
5302 /* common to all pdu */
5303 uint8_t pdu_flags;
5304 uint32_t pdu_start;
5305 uint32_t pdu_length;
5306 uint32_t pdu_flvh_length; /* flags, length, vector, header */
5307 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
5308 uint32_t vector_offset;
5309 uint32_t header_offset;
5310 uint32_t data_offset;
5311 uint32_t data_length;
5312 uint32_t old_offset;
5313 uint32_t end_offset;
5314
5315 proto_item *ti;
5316 proto_tree *pdu_tree = NULL((void*)0);
5317
5318 /* this pdu */
5319 const char *name;
5320 uint32_t member_id;
5321 uint32_t protocol_id;
5322 uint16_t association;
5323
5324 begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_sdt_client_pdu, 1);
5325
5326 /* Add PDU Length item */
5327 proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
5328
5329 dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 2);
5330 /* offset should now be pointing to header (if one exists) */
5331
5332 /* add Member ID item */
5333 member_id = tvb_get_ntohs(tvb, vector_offset);
5334 proto_tree_add_uint(pdu_tree, hf_acn_member_id, tvb, vector_offset, 2, member_id);
5335
5336 dissect_pdu_bit_flag_h(&offset, pdu_flags, &header_offset, last_pdu_offsets, &pdu_flvh_length, 6);
5337 /* offset should now be pointing to data (if one exists) */
5338
5339 /* add Protocol ID item (Header)*/
5340 protocol_id = tvb_get_ntohl(tvb, header_offset);
5341 proto_tree_add_uint(pdu_tree, hf_acn_protocol_id, tvb, header_offset, 4, protocol_id);
5342 header_offset += 4;
5343
5344 /* Add protocol to tree*/
5345 name = val_to_str(pinfo->pool, protocol_id, acn_protocol_id_vals, "id not valid (%d)");
5346 proto_item_append_text(ti, ": ");
5347 proto_item_append_text(ti, "%s", name);
5348
5349 /* add association item */
5350 association = tvb_get_ntohs(tvb, header_offset);
5351 proto_tree_add_uint(pdu_tree, hf_acn_association, tvb, header_offset, 2, association);
5352 /*header_offset += 2;*/
5353
5354 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 1);
5355 end_offset = data_offset + data_length;
5356
5357 switch (protocol_id) {
5358 case ACN_PROTOCOL_ID_SDT0x00000001:
5359 while (data_offset < end_offset) {
5360 old_offset = data_offset;
5361 data_offset = dissect_acn_sdt_wrapped_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
5362 if (old_offset == data_offset) break;
5363 }
5364 break;
5365 case ACN_PROTOCOL_ID_DMP0x00000002:
5366 while (data_offset < end_offset) {
5367 old_offset = data_offset;
5368 data_offset = dissect_acn_dmp_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
5369 if (data_offset == old_offset) break;
5370 }
5371 break;
5372 }
5373 return pdu_start + pdu_length;
5374}
5375
5376
5377/******************************************************************************/
5378/* level to string (ascii) */
5379/* level : 8 bit value */
5380/* string : pointer to buffer to fill */
5381/* leading_char: character to buffer left of digits */
5382/* min_char : minimum number of characters (for filling, not including space)*/
5383/* show_zero: show zeros or dots */
5384/* also adds a space to right end */
5385/* */
5386/* returns end of string */
5387/* faster than printf() */
5388static char *
5389ltos(uint8_t level, char *string, uint8_t base, char leading_char, uint8_t min_chars, bool_Bool show_zero)
5390{
5391 uint8_t i;
5392 /* verify base */
5393 if (base < 2 || base > 16) {
5394 *string = '\0';
5395 return string;
5396 }
5397 /* deal with zeros */
5398 if ((level == 0) && (!show_zero)) {
5399 for (i=0; i<min_chars; i++) {
5400 string[i] = '.';
5401 }
5402 string[i++] = ' ';
5403 string[i] = '\0';
5404 return string+i;
5405 }
5406
5407 i = 0;
5408 /* do our convert, comes out backwards! */
5409 do {
5410 string[i++] = "0123456789ABCDEF"[level % base];
5411 } while ((level /= base) > 0);
5412
5413 /* expand to needed character */
5414 for (; i<min_chars; i++) {
5415 string[i] = leading_char;
5416 }
5417 /* terminate */
5418 string[i] = '\0';
5419
5420 /* now reverse (and correct) the order */
5421 g_strreverse(string);
5422
5423 /* add a space at the end (ok it's at the start but it will be at the end)*/
5424 string[i++] = ' ';
5425 string[i] = '\0';
5426 return string+i;
5427}
5428
5429
5430/******************************************************************************/
5431/* Dissect DMX data PDU */
5432#define BUFFER_SIZE128 128
5433static uint32_t
5434dissect_acn_dmx_data_pdu(uint32_t protocol_id, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
5435{
5436 /* common to all pdu */
5437 uint8_t pdu_flags;
5438 uint32_t pdu_start;
5439 uint32_t pdu_length;
5440 uint32_t pdu_flvh_length; /* flags, length, vector, header */
5441 uint32_t vector_offset;
5442 uint32_t data_offset;
5443 uint32_t end_offset;
5444 uint32_t data_length;
5445 uint32_t header_offset;
5446 uint32_t total_cnt;
5447 uint32_t item_cnt;
5448
5449 proto_item *ti;
5450 proto_tree *pdu_tree;
5451
5452/* this pdu */
5453 acn_dmp_adt_type adt = {0,0,0,0,0,0};
5454 const char *name;
5455 uint32_t vector;
5456 char *buffer;
5457 char *buf_ptr;
5458 unsigned x;
5459 uint8_t level;
5460 uint8_t min_char;
5461 uint8_t base;
5462 char leading_char;
5463 unsigned perline;
5464 unsigned halfline;
5465 uint16_t dmx_count;
5466 uint16_t dmx_start_code;
5467 uint16_t info_start_code;
5468 uint8_t dmx_2_start_code;
5469
5470 buffer = (char*)wmem_alloc(pinfo->pool, BUFFER_SIZE128);
5471 buffer[0] = '\0';
5472
5473 begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_dmx_data_pdu, 1);
5474
5475 /* Add PDU Length item */
5476 proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
5477
5478 dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 1);
5479 /* offset should now be pointing to header (if one exists) */
5480
5481 /* Add Vector item */
5482 vector = tvb_get_uint8(tvb, vector_offset);
5483 proto_tree_add_uint(pdu_tree, hf_acn_dmp_vector, tvb, vector_offset, 1, vector);
5484
5485 /* Add Vector item to tree*/
5486 name = val_to_str(pinfo->pool, vector, acn_dmp_vector_vals, "not valid (%d)");
5487 proto_item_append_text(ti, ": ");
5488 proto_item_append_text(ti, "%s", name);
5489
5490 dissect_pdu_bit_flag_h(&offset, pdu_flags, &header_offset, last_pdu_offsets, &pdu_flvh_length, 1);
5491 /* offset should now be pointing to data (if one exists) */
5492
5493 /* process based on vector */
5494 acn_add_dmp_address_type(tvb, pinfo, pdu_tree, header_offset, &adt);
5495
5496 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 1);
5497 end_offset = data_offset + data_length;
5498
5499 switch (vector) {
5500 case ACN_DMP_VECTOR_SET_PROPERTY2:
5501 dmx_start_code = tvb_get_ntohs(tvb, data_offset);
5502 if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) {
5503 proto_tree_add_item(pdu_tree, hf_acn_dmx_2_first_property_address, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5504 } else {
5505 proto_tree_add_item(pdu_tree, hf_acn_dmx_start_code, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5506 }
5507 data_offset += 2;
5508 proto_tree_add_item(pdu_tree, hf_acn_dmx_increment, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5509 data_offset += 2;
5510 dmx_count = tvb_get_ntohs(tvb, data_offset);
5511 proto_tree_add_item(pdu_tree, hf_acn_dmx_count, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5512 data_offset += 2;
5513
5514 if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) {
5515 dmx_2_start_code = (uint8_t)tvb_get_ntohs(tvb, data_offset - 1);
5516 proto_tree_add_item(pdu_tree, hf_acn_dmx_2_start_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5517 data_offset += 1;
5518 dmx_count -= 1;
5519 }
5520
5521 buf_ptr = buffer;
5522
5523 switch (global_acn_dmx_display_line_format) {
5524 case ACN_PREF_DMX_DISPLAY_16PL1:
5525 perline = 16;
5526 halfline = 8;
5527 break;
5528 default:
5529 perline = 20;
5530 halfline = 10;
5531 }
5532
5533 /* values base on display mode */
5534 switch ((unsigned)global_acn_dmx_display_view) {
5535 case ACN_PREF_DMX_DISPLAY_HEX0:
5536 min_char = 2;
5537 base = 16;
5538 break;
5539/* case ACN_PREF_DMX_DISPLAY_PER: */
5540 default:
5541 min_char = 3;
5542 base = 10;
5543 }
5544
5545 /* do we display leading zeros */
5546 if (global_acn_dmx_display_leading_zeros) {
5547 leading_char = '0';
5548 } else {
5549 leading_char = ' ';
5550 }
5551 /* add a snippet to info (this may be slow) */
5552 if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) {
5553 info_start_code = dmx_2_start_code;
5554 }
5555 else {
5556 info_start_code = dmx_start_code;
5557 }
5558 col_append_fstr(pinfo->cinfo,COL_INFO, ", Sc %02x, [%02x %02x %02x %02x %02x %02x...]",
5559 info_start_code,
5560 tvb_get_uint8(tvb, data_offset),
5561 tvb_get_uint8(tvb, data_offset+1),
5562 tvb_get_uint8(tvb, data_offset+2),
5563 tvb_get_uint8(tvb, data_offset+3),
5564 tvb_get_uint8(tvb, data_offset+4),
5565 tvb_get_uint8(tvb, data_offset+5));
5566
5567 /* add a header line */
5568 *buf_ptr++ = ' ';
5569 *buf_ptr++ = ' ';
5570 *buf_ptr++ = ' ';
5571 for (x=0; x<perline; x++) {
5572 buf_ptr = ltos((uint8_t)(x+1), buf_ptr, 10, ' ', min_char, false0);
5573 if ((x+1)==halfline) {
5574 *buf_ptr++ = '|';
5575 *buf_ptr++ = ' ';
5576 }
5577 }
5578 *buf_ptr = '\0';
5579 proto_tree_add_string(pdu_tree, hf_acn_dmx_data, tvb, data_offset, dmx_count, buffer);
5580
5581 /* start our line */
5582 snprintf(buffer, BUFFER_SIZE128, "001-%03d: ", perline);
5583 buf_ptr = buffer + 9;
5584
5585 total_cnt = 0;
5586 item_cnt = 0;
5587 for (x=data_offset; x<end_offset; x++) {
5588 level = tvb_get_uint8(tvb, x);
5589 if (global_acn_dmx_display_view == ACN_PREF_DMX_DISPLAY_PER2) {
5590 if ((level > 0) && (level < 3)) {
5591 level = 1;
5592 } else {
5593 level = level * 100 / 255;
5594 }
5595 }
5596 buf_ptr = ltos(level, buf_ptr, base, leading_char, min_char, global_acn_dmx_display_zeros);
5597 total_cnt++;
5598 item_cnt++;
5599
5600 if (item_cnt == perline || x == (end_offset-1)) {
5601 /* add leader... */
5602 proto_tree_add_string_format(pdu_tree, hf_acn_dmx_data, tvb, data_offset, item_cnt, buffer, "%s", buffer);
5603 data_offset += perline;
5604 snprintf(buffer, BUFFER_SIZE128, "%03d-%03d: ",total_cnt, total_cnt+perline);
5605 buf_ptr = buffer + 9;
5606 item_cnt = 0;
5607 } else {
5608 /* add separator character */
5609 if (item_cnt == halfline) {
5610 *buf_ptr++ = '|';
5611 *buf_ptr++ = ' ';
5612 *buf_ptr = '\0';
5613 }
5614 }
5615 }
5616 /* NOTE:
5617 address data type (fixed at 0xA2)
5618 start code - 1 byte, reserved (should be 0)
5619 - 1 byte, start code (0x255)
5620 - 2 bytes, packet offset (should be 0000)
5621 address increment - 4 bytes (ignore)
5622 number of dmx values - 4 bytes (0-512)
5623 dmx values 0-512 bytes (data)
5624 */
5625
5626 break;
5627 }
5628 return pdu_start + pdu_length;
5629}
5630
5631/******************************************************************************/
5632/* Dissect Common Base PDU */
5633static void
5634dissect_acn_common_base_pdu(tvbuff_t *tvb, proto_tree *tree, int *offset, acn_pdu_offsets *last_pdu_offsets, uint8_t *pdu_flags, uint32_t *pdu_start, uint32_t *pdu_length, uint32_t *pdu_flvh_length, uint32_t *vector_offset, proto_item **ti, proto_tree **pdu_tree, int ett_base_pdu, uint8_t v_flag_increment, bool_Bool is_acn)
5635{
5636 begin_dissect_acn_pdu(pdu_tree, tvb, ti, tree, pdu_start, offset, pdu_flags, pdu_length, pdu_flvh_length, ett_base_pdu, is_acn);
5637
5638 /* Add PDU Length item */
5639 if (is_acn) {
5640 proto_tree_add_uint(*pdu_tree, hf_acn_pdu_length, tvb, *pdu_start, *pdu_flvh_length, *pdu_length);
5641 } else {
5642 proto_tree_add_uint(*pdu_tree, hf_rdmnet_pdu_length, tvb, *pdu_start, *pdu_flvh_length, *pdu_length);
5643 }
5644
5645 dissect_pdu_bit_flag_v(offset, *pdu_flags, vector_offset, last_pdu_offsets, pdu_flvh_length, v_flag_increment);
5646 /* offset should now be pointing to header (if one exists) */
5647}
5648
5649/******************************************************************************/
5650/* Dissect sACN Discovery PDU*/
5651#define DMX_UNIV_LIST_MAX_DIGITS5 5
5652#define DMX_UNIV_LIST_MAX_ITEMS_PER_LINE16 16
5653#define DMX_UNIV_LIST_BUF_SIZE(5 + 1) * 16 + 1 (DMX_UNIV_LIST_MAX_DIGITS5 + 1) * DMX_UNIV_LIST_MAX_ITEMS_PER_LINE16 + 1
5654static uint32_t
5655dissect_acn_dmx_discovery_pdu(uint32_t protocol_id, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
5656{
5657 /* common to all pdu */
5658 uint8_t pdu_flags;
5659 uint32_t pdu_start;
5660 uint32_t pdu_length;
5661 uint32_t pdu_flvh_length; /* flags, length, vector, header */
5662 uint32_t vector_offset;
5663 uint32_t data_offset;
5664 uint32_t end_offset;
5665 uint32_t data_length;
5666 uint32_t item_cnt;
5667
5668 proto_item *ti;
5669 proto_tree *pdu_tree;
5670
5671/* this pdu */
5672 const char *name;
5673 uint32_t vector;
5674 char *buffer;
5675 char *buf_ptr;
5676 unsigned x;
5677 uint16_t universe;
5678 uint16_t last_universe;
5679
5680 uint32_t page;
5681 uint32_t lastpage;
5682 uint32_t current_universe_idx;
5683 uint32_t bytes_printed;
5684 bool_Bool warned_unorder_once;
5685
5686 (void)protocol_id;
5687 warned_unorder_once = false0;
5688
5689 buffer = (char*)wmem_alloc(pinfo->pool, DMX_UNIV_LIST_BUF_SIZE(5 + 1) * 16 + 1);
5690 buffer[0] = '\0';
5691
5692 data_length = 0;
5693
5694 //discovery pdu
5695 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_acn_dmx_pdu, 4, 1);
5696 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
5697 end_offset = data_offset + data_length;
5698
5699 /* Add Vector item */
5700 vector = tvb_get_ntohl(tvb, vector_offset);
5701 proto_tree_add_item(ti, hf_acn_dmx_discovery_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000);
5702
5703 /* Add Vector item to tree*/
5704 name = val_to_str(pinfo->pool, vector, acn_dmx_discovery_vector_vals, "not valid (%d)");
5705 proto_item_append_text(ti, ": %s", name);
5706
5707 page = tvb_get_uint8(tvb, data_offset);
5708 proto_tree_add_item(ti, hf_acn_dmx_discovery_page, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5709 data_offset += 1;
5710
5711 lastpage = tvb_get_uint8(tvb, data_offset);
5712 proto_tree_add_item(ti, hf_acn_dmx_discovery_last_page, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5713 data_offset += 1;
5714
5715 switch (vector) {
5716 case ACN_DMX_DISCOVERY_UNIVERSE_LIST_VECTOR1:
5717 buf_ptr = buffer;
5718
5719 /* add a snippet to info (this may be slow) */
5720 col_append_fstr(pinfo->cinfo,COL_INFO, ",[Universe Page %u/%u: ", page+1, lastpage+1);
5721 current_universe_idx = 0;
5722 while(data_offset + (sizeof(uint16_t)*current_universe_idx) != end_offset && current_universe_idx < 6)
5723 {
5724 col_append_fstr(pinfo->cinfo,COL_INFO, "%u ", tvb_get_uint16(tvb, data_offset + (sizeof(uint16_t)*current_universe_idx), ENC_BIG_ENDIAN0x00000000));
5725 ++current_universe_idx;
5726 }
5727 if(data_offset + (sizeof(uint16_t)*current_universe_idx) != end_offset)
5728 col_append_str(pinfo->cinfo,COL_INFO, "...");
5729 else if(current_universe_idx == 0)
5730 col_append_str(pinfo->cinfo,COL_INFO, "none");
5731
5732 col_append_str(pinfo->cinfo,COL_INFO, "]");
5733
5734 proto_tree_add_string(pdu_tree, hf_acn_dmx_discovery_universe_list, tvb, data_offset, end_offset-data_offset, "");
5735
5736 item_cnt = 0;
5737 last_universe = 0;
5738 for (x=data_offset; x<end_offset; x+=2) {
5739 universe = tvb_get_uint16(tvb, x, ENC_BIG_ENDIAN0x00000000);
5740
5741 if(!warned_unorder_once && last_universe > universe)
5742 {
5743 expert_add_info(pinfo, pdu_tree, &ei_acn_dmx_discovery_outofseq);
5744 warned_unorder_once = true1;
5745 }
5746 bytes_printed = snprintf(buf_ptr, DMX_UNIV_LIST_BUF_SIZE(5 + 1) * 16 + 1, "%*u ", DMX_UNIV_LIST_MAX_DIGITS5 /*max 5 digits (1-63999), align right*/, universe);
5747 if(bytes_printed > 0)
5748 buf_ptr += bytes_printed;
5749
5750 item_cnt++;
5751 if((item_cnt % DMX_UNIV_LIST_MAX_ITEMS_PER_LINE16) == 0 || x+2 >= end_offset)
5752 {
5753 proto_tree_add_string_format(pdu_tree, hf_acn_dmx_discovery_universe_list, tvb, data_offset, item_cnt*2, buffer, "%s", buffer);
5754 data_offset += item_cnt * 2;
5755 item_cnt = 0;
5756
5757 buf_ptr = buffer;
5758 }
5759
5760 last_universe = universe;
5761 }
5762
5763 break;
5764 }
5765 return pdu_start + pdu_length;
5766}
5767
5768/******************************************************************************/
5769/* Dissect DMX Base PDU */
5770static uint32_t
5771dissect_acn_dmx_extension_base_pdu(uint32_t protocol_id, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
5772{
5773 (void)protocol_id;
5774 (void)pinfo;
5775 /* common to all pdu */
5776 uint8_t pdu_flags;
5777 uint32_t pdu_start;
5778 uint32_t pdu_length;
5779 uint32_t pdu_flvh_length; /* flags, length, vector, header */
5780 uint32_t vector_offset;
5781 uint32_t data_offset;
5782 uint32_t data_length;
5783
5784 proto_item *ti;
5785 proto_tree *pdu_tree;
5786
5787 /* this pdu */
5788 const char *name;
5789 uint32_t vector;
5790
5791 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_acn_dmx_pdu, 4, 1);
5792
5793 /* Add Vector item */
5794 vector = tvb_get_ntohl(tvb, vector_offset);
5795 proto_tree_add_item(pdu_tree, hf_acn_dmx_extension_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000);
5796
5797 /* Add Vector item to tree*/
5798 name = val_to_str(pinfo->pool, vector, acn_dmx_extension_vector_vals, "not valid (%d)");
5799 proto_item_append_text(ti, ": %s", name);
5800
5801 ///* NO HEADER DATA ON THESE* (at least so far) */
5802
5803 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
5804
5805 ///* process based on vector */
5806 switch (vector) {
5807 case ACN_DMX_EXT_DISCOVERY_VECTOR2:
5808 proto_tree_add_item(pdu_tree, hf_acn_dmx_source_name, tvb, data_offset, 64, ENC_UTF_80x00000002);
5809 data_offset += 64;
5810
5811 proto_tree_add_item(pdu_tree, hf_acn_dmx_discovery_framing_reserved, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5812 data_offset += 4;
5813
5814 dissect_acn_dmx_discovery_pdu(protocol_id, tvb, pinfo, pdu_tree, data_offset, last_pdu_offsets);
5815
5816 break;
5817
5818 case ACN_DMX_EXT_SYNC_VECTOR1:
5819 proto_tree_add_item(ti, hf_acn_dmx_sequence_number, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5820 data_offset += 1;
5821
5822 proto_tree_add_item(ti, hf_acn_dmx_sync_universe, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5823 data_offset += 2;
5824
5825 proto_tree_add_item(ti, hf_acn_dmx_sync_reserved, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5826 data_offset += 2;
5827 break;
5828
5829 default:
5830 break;
5831 }
5832 return pdu_start + pdu_length;
5833}
5834
5835/******************************************************************************/
5836/* Dissect DMX Base PDU */
5837static uint32_t
5838dissect_acn_dmx_base_pdu(uint32_t protocol_id, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
5839{
5840 /* common to all pdu */
5841 uint8_t pdu_flags;
5842 uint32_t pdu_start;
5843 uint32_t pdu_length;
5844 uint32_t pdu_flvh_length; /* flags, length, vector, header */
5845 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
5846 uint8_t option_flags;
5847 uint32_t vector_offset;
5848 uint32_t data_offset;
5849 uint32_t data_length;
5850
5851 proto_item *ti, *pi;
5852 proto_tree *pdu_tree;
5853 proto_tree *flag_tree;
5854
5855 /* this pdu */
5856 const char *name;
5857 uint32_t vector;
5858
5859 uint32_t universe;
5860 uint32_t priority;
5861 uint32_t sequence;
5862
5863 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_acn_dmx_pdu, 4, 1);
5864
5865 /* Add Vector item */
5866 vector = tvb_get_ntohl(tvb, vector_offset);
5867 proto_tree_add_item(pdu_tree, hf_acn_dmx_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000);
5868 /* vector_offset +=4; */
5869
5870 /* Add Vector item to tree*/
5871 name = val_to_str(pinfo->pool, vector, acn_dmx_vector_vals, "not valid (%d)");
5872 proto_item_append_text(ti, ": %s", name);
5873
5874 /* NO HEADER DATA ON THESE* (at least so far) */
5875
5876 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
5877
5878 /* process based on vector */
5879 switch (vector) {
5880 case ACN_DMP_VECTOR_SET_PROPERTY2:
5881 if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) {
5882 proto_tree_add_item(pdu_tree, hf_acn_dmx_source_name, tvb, data_offset, 64, ENC_UTF_80x00000002);
5883 data_offset += 64;
5884 } else {
5885 proto_tree_add_item(pdu_tree, hf_acn_dmx_source_name, tvb, data_offset, 32, ENC_UTF_80x00000002);
5886 data_offset += 32;
5887 }
5888
5889 priority = tvb_get_uint8(tvb, data_offset);
5890 proto_tree_add_item(pdu_tree, hf_acn_dmx_priority, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5891 data_offset += 1;
5892
5893 if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004) {
5894 proto_tree_add_item(pdu_tree, hf_acn_dmx_2_sync_universe, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5895 data_offset += 2;
5896 }
5897 else if (protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) {
5898 //it is not clear if ssacn uses sync universes or not, leaving this as reserved (previous behavior)
5899 proto_tree_add_item(pdu_tree, hf_acn_dmx_3_reserved, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5900 data_offset += 2;
5901 }
5902
5903 sequence = tvb_get_uint8(tvb, data_offset);
5904 proto_tree_add_item(pdu_tree, hf_acn_dmx_sequence_number, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5905 data_offset += 1;
5906
5907 if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) {
5908 option_flags = tvb_get_uint8(tvb, data_offset);
5909 pi = proto_tree_add_uint(pdu_tree, hf_acn_dmx_2_options, tvb, data_offset, 1, option_flags);
5910 flag_tree = proto_item_add_subtree(pi, ett_acn_dmx_2_options);
5911 proto_tree_add_item(flag_tree, hf_acn_dmx_2_option_p, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5912 proto_tree_add_item(flag_tree, hf_acn_dmx_2_option_s, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5913 proto_tree_add_item(flag_tree, hf_acn_dmx_2_option_f, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
5914 data_offset += 1;
5915 }
5916
5917 universe = tvb_get_ntohs(tvb, data_offset);
5918 proto_tree_add_item(pdu_tree, hf_acn_dmx_universe, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5919 data_offset += 2;
5920
5921 /* add universe to info */
5922 col_append_fstr(pinfo->cinfo,COL_INFO, ", Universe %d, Seq %3d", universe, sequence );
5923 proto_item_append_text(ti, ", Universe: %d, Priority: %d", universe, priority);
5924
5925 /*data_offset =*/ dissect_acn_dmx_data_pdu(protocol_id, tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
5926
5927 break;
5928 }
5929 return pdu_start + pdu_length;
5930}
5931
5932/******************************************************************************/
5933/* Dissect SDT Base PDU */
5934static uint32_t
5935dissect_acn_sdt_base_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
5936{
5937 /* common to all pdu */
5938 uint8_t pdu_flags;
5939 uint32_t pdu_start;
5940 uint32_t pdu_length;
5941 uint32_t pdu_flvh_length; /* flags, length, vector, header */
5942 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
5943 uint32_t vector_offset;
5944 uint32_t data_offset;
5945 uint32_t end_offset;
5946 uint32_t old_offset;
5947 uint32_t data_length;
5948
5949 proto_item *ti, *pi;
5950 proto_tree *pdu_tree;
5951
5952 /* this pdu */
5953 const char *name;
5954 uint32_t vector;
5955 uint32_t member_id;
5956
5957 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_acn_sdt_base_pdu, 1, 1);
5958
5959 /* Add Vector item */
5960 vector = tvb_get_uint8(tvb, vector_offset);
5961 proto_tree_add_uint(pdu_tree, hf_acn_sdt_vector, tvb, vector_offset, 1, vector);
5962
5963 /* Add Vector item to tree*/
5964 name = val_to_str(pinfo->pool, vector, acn_sdt_vector_vals, "not valid (%d)");
5965 proto_item_append_text(ti, ": %s", name);
5966 /* proto_item_append_text(ti, "%s", name); */
5967
5968 /* NO HEADER DATA ON THESE* (at least so far) */
5969
5970 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 1);
5971 end_offset = data_offset + data_length;
5972
5973 /* process based on vector */
5974 switch (vector) {
5975 case ACN_SDT_VECTOR_UNKNOWN0:
5976 break;
5977 case ACN_SDT_VECTOR_REL_WRAP1:
5978 case ACN_SDT_VECTOR_UNREL_WRAP2:
5979 proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5980 data_offset += 2;
5981 proto_tree_add_item(pdu_tree, hf_acn_total_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5982 data_offset += 4;
5983 proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5984 data_offset += 4;
5985 proto_tree_add_item(pdu_tree, hf_acn_oldest_available_wrapper, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
5986 data_offset += 4;
5987 proto_tree_add_item(pdu_tree, hf_acn_first_member_to_ack, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5988 data_offset += 2;
5989 proto_tree_add_item(pdu_tree, hf_acn_last_member_to_ack, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5990 data_offset += 2;
5991 proto_tree_add_item(pdu_tree, hf_acn_mak_threshold, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
5992 data_offset += 2;
5993
5994 while (data_offset < end_offset) {
5995 old_offset = data_offset;
5996 data_offset = dissect_acn_sdt_client_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
5997 if (data_offset == old_offset) break;
5998 }
5999 break;
6000 case ACN_SDT_VECTOR_CHANNEL_PARAMS3:
6001 break;
6002 case ACN_SDT_VECTOR_JOIN4:
6003 proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000);
6004 data_offset += 16;
6005 proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6006 data_offset += 2;
6007 proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6008 data_offset += 2;
6009 proto_tree_add_item(pdu_tree, hf_acn_reciprocal_channel, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6010 data_offset += 2;
6011 proto_tree_add_item(pdu_tree, hf_acn_total_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
6012 data_offset += 4;
6013 proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
6014 data_offset += 4;
6015 data_offset = acn_add_address(tvb, pinfo, pdu_tree, data_offset, "Destination Address:");
6016 data_offset = acn_add_channel_parameter(tvb, pinfo, pdu_tree, data_offset);
6017 /*data_offset =*/ acn_add_expiry(tvb, pinfo, pdu_tree, data_offset, hf_acn_adhoc_expiry);
6018 break;
6019 case ACN_SDT_VECTOR_JOIN_REFUSE5:
6020 pi = proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000);
6021 data_offset += 16;
6022 proto_item_append_text(pi, "(Leader)");
6023 proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6024 data_offset += 2;
6025 proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6026 data_offset += 2;
6027 proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
6028 data_offset += 4;
6029 proto_tree_add_item(pdu_tree, hf_acn_refuse_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
6030 /*data_offset ++;*/
6031 break;
6032 case ACN_SDT_VECTOR_JOIN_ACCEPT6:
6033 pi = proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000);
6034 data_offset += 16;
6035 proto_item_append_text(pi, "(Leader)");
6036 proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6037 data_offset += 2;
6038 proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6039 data_offset += 2;
6040 proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
6041 data_offset += 4;
6042 proto_tree_add_item(pdu_tree, hf_acn_reciprocal_channel, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6043 /*data_offset += 2;*/
6044 break;
6045 case ACN_SDT_VECTOR_LEAVE7:
6046 break;
6047 case ACN_SDT_VECTOR_LEAVING8:
6048 pi = proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000);
6049 data_offset += 16;
6050 proto_item_append_text(pi, "(Leader)");
6051 proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6052 data_offset += 2;
6053 proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6054 data_offset += 2;
6055 proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
6056 data_offset += 4;
6057 proto_tree_add_item(pdu_tree, hf_acn_reason_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
6058 /* offset += 1; */
6059 break;
6060 case ACN_SDT_VECTOR_CONNECT9:
6061 break;
6062 case ACN_SDT_VECTOR_CONNECT_ACCEPT10:
6063 break;
6064 case ACN_SDT_VECTOR_CONNECT_REFUSE11:
6065 break;
6066 case ACN_SDT_VECTOR_DISCONNECT12:
6067 break;
6068 case ACN_SDT_VECTOR_DISCONNECTING13:
6069 break;
6070 case ACN_SDT_VECTOR_ACK14:
6071 break;
6072 case ACN_SDT_VECTOR_NAK15:
6073 pi = proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000);
6074 data_offset += 16;
6075 proto_item_append_text(pi, "(Leader)");
6076 proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6077 data_offset += 2;
6078 proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6079 data_offset += 2;
6080 proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
6081 data_offset += 4;
6082 proto_tree_add_item(pdu_tree, hf_acn_first_missed_sequence, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
6083 data_offset += 4;
6084 proto_tree_add_item(pdu_tree, hf_acn_last_missed_sequence, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
6085 /*data_offset += 4;*/
6086 break;
6087 case ACN_SDT_VECTOR_GET_SESSION16:
6088 proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000);
6089 /*data_offset += 16;*/
6090 break;
6091 case ACN_SDT_VECTOR_SESSIONS17:
6092 member_id = tvb_get_ntohs(tvb, data_offset);
6093 switch (member_id) {
6094 case 0:
6095 /*data_offset =*/ acn_add_channel_owner_info_block(tvb, pinfo, pdu_tree, data_offset);
6096 break;
6097 case 1:
6098 /*data_offset =*/ acn_add_channel_member_info_block(tvb, pinfo, pdu_tree, data_offset);
6099 break;
6100 }
6101 break;
6102 }
6103
6104 return pdu_start + pdu_length;
6105}
6106
6107
6108/******************************************************************************/
6109/* Add tree for RDM UID */
6110static uint32_t
6111rdmnet_add_uid(tvbuff_t *tvb, proto_tree *tree, int offset, int hf_uid, int hf_uid_manf, int hf_uid_dev)
6112{
6113 proto_item *ti;
6114 proto_tree *uid_tree;
6115
6116 ti = proto_tree_add_item(tree, hf_uid, tvb, offset, 6, ENC_NA0x00000000);
6117 uid_tree = proto_item_add_subtree(ti, ett_rdmnet_uid);
6118 proto_tree_add_item(uid_tree, hf_uid_manf, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6119 offset += 2;
6120 proto_tree_add_item(uid_tree, hf_uid_dev, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
6121 offset += 4;
6122
6123 return offset;
6124}
6125
6126/******************************************************************************/
6127/* Dissect LLRP Probe Request PDU */
6128static uint32_t
6129dissect_llrp_probe_request_pdu(tvbuff_t *tvb, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6130{
6131 /* common to all pdu */
6132 uint8_t pdu_flags;
6133 uint8_t vector;
6134 uint8_t filter_flags;
6135 uint32_t pdu_start;
6136 uint32_t pdu_length;
6137 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6138 uint32_t data_offset;
6139 uint32_t end_offset;
6140
6141 proto_item *ti, *pi;
6142 proto_tree *flag_tree;
6143 proto_tree *pdu_tree;
6144
6145 begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_rdmnet_llrp_probe_request_pdu, 0);
6146
6147 /* Add PDU Length item */
6148 proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
6149
6150 dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2);
6151 /* offset should now be pointing to header (if one exists) */
6152
6153 /* add vector item */
6154 vector = tvb_get_uint8(tvb, data_offset);
6155 proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_vector, tvb, data_offset, 1, vector);
6156
6157 dissect_pdu_bit_flag_h(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 6);
6158 data_offset -= 1;
6159 /* offset should now be pointing to data (if one exists) */
6160
6161 /* lower uid */
6162 proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_probe_request_lower_uid, tvb, data_offset, 6, ENC_NA0x00000000);
6163 data_offset += 6;
6164
6165 /* upper uid */
6166 proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_probe_request_upper_uid, tvb, data_offset, 6, ENC_NA0x00000000);
6167 data_offset += 6;
6168
6169 /* filter */
6170 filter_flags = tvb_get_uint8(tvb, data_offset);
6171 filter_flags = filter_flags & 0x03;
6172 pi = proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_filter, tvb, data_offset, 1, filter_flags);
6173 flag_tree = proto_item_add_subtree(pi, ett_rdmnet_llrp_probe_request_filter_flags);
6174 proto_tree_add_item(flag_tree, hf_rdmnet_llrp_probe_request_filter_brokers_only, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
6175 proto_tree_add_item(flag_tree, hf_rdmnet_llrp_probe_request_filter_client_tcp_inactive, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
6176 data_offset += 2;
6177
6178 /* known uids */
6179 end_offset = pdu_start + pdu_length;
6180 while (data_offset + 6 <= end_offset) {
6181 data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_llrp_probe_request_known_uid,
6182 hf_rdmnet_llrp_probe_request_known_uid_manf, hf_rdmnet_llrp_probe_request_known_uid_dev);
6183 }
6184
6185 return pdu_start + pdu_length;
6186}
6187
6188
6189/******************************************************************************/
6190/* Dissect LLRP Probe Reply PDU */
6191static uint32_t
6192dissect_llrp_probe_reply_pdu(tvbuff_t *tvb, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6193{
6194 /* common to all pdu */
6195 uint8_t pdu_flags;
6196 uint8_t vector;
6197 uint32_t pdu_start;
6198 uint32_t pdu_length;
6199 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6200 uint32_t data_offset;
6201
6202 proto_item *ti;
6203 proto_tree *pdu_tree;
6204
6205 begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_rdmnet_llrp_probe_reply_pdu, 0);
6206
6207 /* Add PDU Length item */
6208 proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
6209
6210 dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2);
6211 /* offset should now be pointing to header (if one exists) */
6212
6213 /* add vector item */
6214 vector = tvb_get_uint8(tvb, data_offset);
6215 proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_reply_vector, tvb, data_offset, 1, vector);
6216
6217 dissect_pdu_bit_flag_h(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 6);
6218 data_offset -= 1;
6219 /* offset should now be pointing to data (if one exists) */
6220
6221 /* uid */
6222 data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_llrp_probe_reply_uid,
6223 hf_rdmnet_llrp_probe_reply_uid_manf, hf_rdmnet_llrp_probe_reply_uid_dev);
6224
6225 /* hardware address */
6226 proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_probe_reply_hardware_address, tvb, data_offset, 6, ENC_NA0x00000000);
6227 data_offset += 6;
6228
6229 /* component type */
6230 proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_probe_reply_component_type, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
6231
6232 return pdu_start + pdu_length;
6233}
6234
6235
6236/******************************************************************************/
6237/* Dissect RDM Command */
6238static uint32_t
6239dissect_rdm_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pdu_tree, uint32_t data_offset, uint32_t length)
6240{
6241 bool_Bool save_info;
6242 bool_Bool save_protocol;
6243 uint32_t data_end;
6244 tvbuff_t *next_tvb;
6245
6246 save_info = col_get_writable(pinfo->cinfo, COL_INFO);
6247 save_protocol = col_get_writable(pinfo->cinfo, COL_PROTOCOL);
6248 col_set_writable(pinfo->cinfo, COL_INFO, false0);
6249 col_set_writable(pinfo->cinfo, COL_PROTOCOL, false0);
6250
6251 data_end = data_offset + length;
6252 next_tvb = tvb_new_subset_length(tvb, data_offset, length);
6253 call_dissector(rdm_handle, next_tvb, pinfo, pdu_tree);
6254
6255 col_set_writable(pinfo->cinfo, COL_INFO, save_info);
6256 col_set_writable(pinfo->cinfo, COL_PROTOCOL, save_protocol);
6257
6258 return data_end;
6259}
6260
6261
6262/******************************************************************************/
6263/* Dissect LLRP RDM Command PDU */
6264static uint32_t
6265dissect_llrp_rdm_command_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6266{
6267 /* common to all pdu */
6268 uint8_t pdu_flags;
6269 uint8_t vector;
6270 uint32_t pdu_start;
6271 uint32_t pdu_length;
6272 uint32_t pdu_end;
6273 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6274 uint32_t data_offset;
6275
6276 proto_item *ti;
6277 proto_tree *pdu_tree;
6278
6279 /* this pdu */
6280 const char *name;
6281
6282 begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_rdmnet_llrp_rdm_command_pdu, 0);
6283
6284 /* Add PDU Length item */
6285 proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
6286
6287 dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2);
6288 /* offset should now be pointing to header (if one exists) */
6289
6290 /* add vector item */
6291 vector = tvb_get_uint8(tvb, data_offset);
6292 proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_rdm_command_start_code, tvb, data_offset, 1, vector);
6293
6294 /* Add Vector item to tree */
6295 name = val_to_str(pinfo->pool, vector, rdmnet_llrp_rdm_command_start_code_vals, "unknown (%d)");
6296 proto_item_append_text(ti, ": %s", name);
6297
6298 dissect_pdu_bit_flag_h(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 6);
6299 data_offset -= 1;
6300 /* offset should now be pointing to data (if one exists) */
6301
6302 pdu_end = pdu_start + pdu_length;
6303 dissect_rdm_command(tvb, pinfo, pdu_tree, data_offset, (pdu_length-4));
6304
6305 return pdu_end;
6306}
6307
6308
6309/******************************************************************************/
6310/* Dissect LLRP Base PDU */
6311static uint32_t
6312dissect_acn_llrp_base_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6313{
6314 uint8_t pdu_flags;
6315 uint32_t pdu_start;
6316 uint32_t pdu_length;
6317 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6318 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
6319 uint32_t vector_offset;
6320 uint32_t data_offset;
6321 uint32_t data_length;
6322 e_guid_t guid;
6323
6324 proto_item *ti;
6325 proto_tree *pdu_tree;
6326
6327 /* this pdu */
6328 const char *name;
6329 uint32_t vector;
6330
6331 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_llrp_base_pdu, 1, 0);
6332
6333 /* Add Vector item */
6334 vector = tvb_get_ntohl(tvb, vector_offset);
6335 proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000);
6336
6337 /* Add Vector item to tree */
6338 name = val_to_str(pinfo->pool, vector, rdmnet_llrp_vector_vals, "unknown (%d)");
6339 proto_item_append_text(ti, ": %s", name);
6340
6341 /* NO HEADER DATA ON THESE* (at least so far) */
6342
6343 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
6344 data_offset += 3;
6345
6346 /* get destination (CID) 16 bytes */
6347 proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_destination_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000);
6348 tvb_get_guid(tvb, data_offset, &guid, ENC_BIG_ENDIAN0x00000000);
6349 proto_item_append_text(ti, ", Dest: %s", guid_to_str(pinfo->pool, &guid));
6350 data_offset += 16;
6351
6352 /* transaction number (4 bytes) */
6353 proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_transaction_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
6354 data_offset += 4;
6355
6356 /* process based on vector */
6357 switch (vector) {
6358 case RDMNET_LLRP_VECTOR_PROBE_REQUEST0x00000001:
6359 dissect_llrp_probe_request_pdu(tvb, pdu_tree, data_offset, &pdu_offsets);
6360 break;
6361 case RDMNET_LLRP_VECTOR_PROBE_REPLY0x00000002:
6362 dissect_llrp_probe_reply_pdu(tvb, pdu_tree, data_offset, &pdu_offsets);
6363 break;
6364 case RDMNET_LLRP_VECTOR_RDM_CMD0x00000003:
6365 dissect_llrp_rdm_command_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
6366 break;
6367 }
6368
6369 return pdu_start + pdu_length;
6370}
6371
6372
6373/******************************************************************************/
6374/* Dissect Broker Client Entry PDU */
6375static uint32_t
6376dissect_broker_client_entry_pdu(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6377{
6378 uint8_t pdu_flags;
6379 uint32_t pdu_start;
6380 uint32_t pdu_length;
6381 uint32_t pdu_end;
6382 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6383 uint32_t vector_offset;
6384 uint32_t data_offset;
6385 uint32_t data_length;
6386
6387 proto_item *ti;
6388 proto_item *ti2;
6389 proto_tree *pdu_tree;
6390 proto_tree *pdu_tree2;
6391
6392 /* this pdu */
6393 const char *name;
6394 uint32_t vector;
6395
6396 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_broker_client_entry_pdu, 1, 0);
6397 pdu_end = pdu_start + pdu_length;
6398
6399 /* Add Vector item */
6400 vector = tvb_get_ntohl(tvb, vector_offset);
6401 proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_protocol_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000);
6402
6403 /* Add Vector item to tree */
6404 name = val_to_str(pinfo->pool, vector, broker_client_protocol_vals, "unknown (%d)");
6405 proto_item_append_text(ti, ": %s", name);
6406
6407 /* NO HEADER DATA ON THESE* (at least so far) */
6408
6409 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
6410 data_offset += 3;
6411
6412 /* client protocol cid */
6413 proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_protocol_cid, tvb, data_offset, 16, ENC_NA0x00000000);
6414 data_offset += 16;
6415
6416 /* process based on vector */
6417 switch (vector) {
6418 case RDMNET_CLIENT_PROTOCOL_RPT0x00000005:
6419 /* client uid */
6420 data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_broker_client_rpt_client_uid,
6421 hf_rdmnet_broker_client_rpt_client_uid_manf, hf_rdmnet_broker_client_rpt_client_uid_dev);
6422
6423 /* client type */
6424 proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_rpt_client_type, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
6425 data_offset += 1;
6426
6427 /* binding cid */
6428 proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_rpt_binding_cid, tvb, data_offset, 16, ENC_NA0x00000000);
6429 data_offset += 16;
6430 break;
6431 case RDMNET_CLIENT_PROTOCOL_EPT0x0000000B:
6432 while ((unsigned)offset + 36 < pdu_end) {
6433 /* protocol vector (manufacturer id + protocol id) */
6434 ti2 = proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_ept_protocol_vector, tvb, data_offset, 4, ENC_NA0x00000000);
6435 pdu_tree2 = proto_item_add_subtree(ti2, ett_rdmnet_broker_client_entry_manufacturer_protocol_ids);
6436 proto_tree_add_item(pdu_tree2, hf_rdmnet_broker_client_ept_protocol_manufacturer_id, tvb, 0, 2, ENC_BIG_ENDIAN0x00000000);
6437 proto_tree_add_item(pdu_tree2, hf_rdmnet_broker_client_ept_protocol_protocol_id, tvb, 2, 2, ENC_BIG_ENDIAN0x00000000);
6438 offset += 4;
6439
6440 /* protocol string */
6441 proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_ept_protocol_string, tvb, data_offset, 32, ENC_ASCII0x00000000);
6442 data_offset += 32;
6443 }
6444 break;
6445 }
6446
6447 return pdu_end;
6448}
6449
6450
6451/******************************************************************************/
6452/* Dissect Broker Connect */
6453static uint32_t
6454dissect_broker_connect(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets, uint32_t pdu_end)
6455{
6456 uint8_t connection_flags;
6457 proto_item *pi;
6458 proto_tree *flag_tree;
6459
6460 /* client scope */
6461 proto_tree_add_item(tree, hf_rdmnet_broker_connect_client_scope, tvb, offset, 63, ENC_ASCII0x00000000);
6462 offset += 63;
6463
6464 /* e133 version */
6465 proto_tree_add_item(tree, hf_rdmnet_broker_connect_e133_version, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6466 offset += 2;
6467
6468 /* search domain */
6469 proto_tree_add_item(tree, hf_rdmnet_broker_connect_search_domain, tvb, offset, 231, ENC_ASCII0x00000000);
6470 offset += 231;
6471
6472 /* connection flags */
6473 connection_flags = tvb_get_uint8(tvb, offset);
6474 connection_flags = connection_flags & 0x01;
6475 pi = proto_tree_add_uint(tree, hf_rdmnet_broker_connect_connection_flags, tvb, offset, 1, connection_flags);
6476 flag_tree = proto_item_add_subtree(pi, ett_rdmnet_broker_connect_connection_flags);
6477 proto_tree_add_item(flag_tree, hf_rdmnet_broker_connect_connection_flags_incremental_updates, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
6478 offset += 1;
6479
6480 /* client_entry_pdu */
6481 dissect_broker_client_entry_pdu(tvb, pinfo, tree, offset, last_pdu_offsets);
6482
6483 return pdu_end;
6484}
6485
6486
6487/******************************************************************************/
6488/* Dissect Broker Connect Reply */
6489static uint32_t
6490dissect_broker_connect_reply(tvbuff_t *tvb, proto_tree *tree, int offset)
6491{
6492 /* connection code */
6493 proto_tree_add_item(tree, hf_rdmnet_broker_connect_reply_connection_code, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6494 offset += 2;
6495
6496 /* e133 version */
6497 proto_tree_add_item(tree, hf_rdmnet_broker_connect_reply_e133_version, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6498 offset += 2;
6499
6500 /* broker uid */
6501 offset = rdmnet_add_uid(tvb, tree, offset, hf_rdmnet_broker_connect_reply_broker_uid,
6502 hf_rdmnet_broker_connect_reply_broker_uid_manf, hf_rdmnet_broker_connect_reply_broker_uid_dev);
6503
6504 /* client uid */
6505 offset = rdmnet_add_uid(tvb, tree, offset, hf_rdmnet_broker_connect_reply_client_uid,
Value stored to 'offset' is never read
6506 hf_rdmnet_broker_connect_reply_client_uid_manf, hf_rdmnet_broker_connect_reply_client_uid_dev);
6507
6508 return 0;
6509}
6510
6511
6512/******************************************************************************/
6513/* Dissect Broker Client Entry Update */
6514static uint32_t
6515dissect_broker_client_entry_update(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets, uint32_t pdu_end)
6516{
6517 uint8_t connection_flags;
6518
6519 proto_item *pi;
6520 proto_tree *flag_tree;
6521
6522 /* connection flags */
6523 connection_flags = tvb_get_uint8(tvb, offset);
6524 connection_flags = connection_flags & 0x01;
6525 pi = proto_tree_add_uint(tree, hf_rdmnet_broker_client_entry_update_connection_flags, tvb, offset, 1, connection_flags);
6526 flag_tree = proto_item_add_subtree(pi, ett_rdmnet_broker_client_entry_update_connection_flags);
6527 proto_tree_add_item(flag_tree, hf_rdmnet_broker_client_entry_update_connection_flags_incremental_updates, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
6528 offset += 1;
6529
6530 /* client_entry_pdu */
6531 dissect_broker_client_entry_pdu(tvb, pinfo, tree, offset, last_pdu_offsets);
6532
6533 return pdu_end;
6534}
6535
6536
6537/******************************************************************************/
6538/* Dissect Broker Redirect V4 */
6539static uint32_t
6540dissect_broker_redirect_v4(tvbuff_t *tvb, proto_tree *tree, int offset)
6541{
6542 /* ipv4 address */
6543 proto_tree_add_item(tree, hf_rdmnet_broker_redirect_ipv4_address, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
6544 offset += 4;
6545
6546 /* tcp port */
6547 proto_tree_add_item(tree, hf_rdmnet_broker_redirect_ipv4_tcp_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6548
6549 return 0;
6550}
6551
6552
6553/******************************************************************************/
6554/* Dissect Broker Redirect V6 */
6555static uint32_t
6556dissect_broker_redirect_v6(tvbuff_t *tvb, proto_tree *tree, int offset)
6557{
6558 /* ipv6 address */
6559 proto_tree_add_item(tree, hf_rdmnet_broker_redirect_ipv6_address, tvb, offset, 16, ENC_NA0x00000000);
6560 offset += 16;
6561
6562 /* tcp port */
6563 proto_tree_add_item(tree, hf_rdmnet_broker_redirect_ipv6_tcp_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6564
6565 return 0;
6566}
6567
6568
6569/******************************************************************************/
6570/* Dissect Broker Disconnect */
6571static uint32_t
6572dissect_broker_disconnect(tvbuff_t *tvb, proto_tree *tree, int offset)
6573{
6574 /* disconnect reason */
6575 proto_tree_add_item(tree, hf_rdmnet_broker_disconnect_reason, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6576
6577 return 0;
6578}
6579
6580
6581/******************************************************************************/
6582/* Dissect Broker Request Dynamic UIDs */
6583static uint32_t
6584dissect_broker_request_dynamic_uids(tvbuff_t *tvb, proto_tree *tree, uint32_t offset, uint32_t pdu_end)
6585{
6586 /* packed list of dynamic uid request (6 bytes) and rid (16 bytes) */
6587 while (offset + 22 < pdu_end) {
6588 /* dynamic uid request (6 bytes) */
6589 proto_tree_add_item(tree, hf_rdmnet_broker_dynamic_uid_request, tvb, offset, 6, ENC_NA0x00000000);
6590 offset += 6;
6591
6592 /* rid (16 bytes) */
6593 proto_tree_add_item(tree, hf_rdmnet_broker_rid, tvb, offset, 16, ENC_NA0x00000000);
6594 offset += 16;
6595 }
6596
6597 return 0;
6598}
6599
6600
6601/******************************************************************************/
6602/* Dissect Broker Assigned Dynamic UIDs */
6603static uint32_t
6604dissect_broker_assigned_dynamic_uids(tvbuff_t *tvb, proto_tree *tree, uint32_t offset, uint32_t pdu_end)
6605{
6606 /* packed list of dynamic uid request (6 bytes), rid (16 bytes), and status_code (2 bytes) */
6607 while (offset + 24 < pdu_end) {
6608 /* dynamic uid request (6 bytes) */
6609 proto_tree_add_item(tree, hf_rdmnet_broker_assigned_dynamic_uid, tvb, offset, 6, ENC_NA0x00000000);
6610 offset += 6;
6611
6612 /* rid (16 bytes) */
6613 proto_tree_add_item(tree, hf_rdmnet_broker_assigned_rid, tvb, offset, 16, ENC_NA0x00000000);
6614 offset += 16;
6615
6616 /* status code (2 bytes) */
6617 proto_tree_add_item(tree, hf_rdmnet_broker_assigned_status_code, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6618 offset += 2;
6619 }
6620
6621 return 0;
6622}
6623
6624
6625/******************************************************************************/
6626/* Dissect Broker Fetch Dynamic UIDs */
6627static uint32_t
6628dissect_broker_fetch_dynamic_uids(tvbuff_t *tvb, proto_tree *tree, uint32_t offset, uint32_t pdu_end)
6629{
6630 /* packed list of dynamic uid request (6 bytes) */
6631 while (offset + 6 < pdu_end) {
6632 /* dynamic uid request (6 bytes) */
6633 proto_tree_add_item(tree, hf_rdmnet_broker_fetch_dynamic_uid, tvb, offset, 6, ENC_NA0x00000000);
6634 offset += 6;
6635 }
6636
6637 return 0;
6638}
6639
6640
6641/******************************************************************************/
6642/* Dissect Broker Base PDU */
6643static uint32_t
6644dissect_acn_broker_base_pdu(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6645{
6646 uint8_t pdu_flags;
6647 uint32_t pdu_start;
6648 uint32_t pdu_length;
6649 uint32_t pdu_end;
6650 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6651 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
6652 uint32_t vector_offset;
6653 uint32_t data_offset;
6654 uint32_t old_offset;
6655 uint32_t end_offset;
6656 uint32_t data_length;
6657
6658 proto_item *ti;
6659 proto_tree *pdu_tree;
6660
6661 /* this pdu */
6662 const char *name;
6663 uint16_t vector;
6664
6665 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_broker_base_pdu, 1, 0);
6666 pdu_end = pdu_start + pdu_length;
6667
6668 /* Add Vector item */
6669 vector = tvb_get_ntohs(tvb, vector_offset);
6670 proto_tree_add_item(pdu_tree, hf_rdmnet_broker_vector, tvb, vector_offset, 2, ENC_BIG_ENDIAN0x00000000);
6671
6672 /* Add Vector item to tree */
6673 name = val_to_str(pinfo->pool, vector, rdmnet_broker_vector_vals, "unknown (%d)");
6674 proto_item_append_text(ti, ": %s", name);
6675
6676 /* NO HEADER DATA ON THESE* (at least so far) */
6677
6678 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
6679 data_offset += 1;
6680
6681 /* process based on vector */
6682 switch (vector) {
6683 case RDMNET_BROKER_VECTOR_FETCH_CLIENT_LIST0x0006:
6684 case RDMNET_BROKER_VECTOR_NULL0x000F:
6685 /* no data */
6686 break;
6687 case RDMNET_BROKER_VECTOR_CONNECTED_CLIENT_LIST0x0007:
6688 case RDMNET_BROKER_VECTOR_CLIENT_ADD0x0008:
6689 case RDMNET_BROKER_VECTOR_CLIENT_REMOVE0x0009:
6690 case RDMNET_BROKER_VECTOR_CLIENT_ENTRY_CHANGE0x000A:
6691 end_offset = pdu_start + pdu_length;
6692 while (data_offset < end_offset) {
6693 old_offset = data_offset;
6694 data_offset = dissect_broker_client_entry_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
6695 if (data_offset == old_offset) break;
6696 }
6697 break;
6698 case RDMNET_BROKER_VECTOR_CONNECT0x0001:
6699 dissect_broker_connect(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets, pdu_end);
6700 break;
6701 case RDMNET_BROKER_VECTOR_CONNECT_REPLY0x0002:
6702 dissect_broker_connect_reply(tvb, pdu_tree, data_offset);
6703 break;
6704 case RDMNET_BROKER_VECTOR_CLIENT_ENTRY_UPDATE0x0003:
6705 dissect_broker_client_entry_update(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets, pdu_end);
6706 break;
6707 case RDMNET_BROKER_VECTOR_REDIRECT_V40x0004:
6708 dissect_broker_redirect_v4(tvb, pdu_tree, data_offset);
6709 break;
6710 case RDMNET_BROKER_VECTOR_REDIRECT_V60x0005:
6711 dissect_broker_redirect_v6(tvb, pdu_tree, data_offset);
6712 break;
6713 case RDMNET_BROKER_VECTOR_DISCONNECT0x000E:
6714 dissect_broker_disconnect(tvb, pdu_tree, data_offset);
6715 break;
6716 case RDMNET_BROKER_VECTOR_REQUEST_DYNAMIC_UIDS0x000B:
6717 dissect_broker_request_dynamic_uids(tvb, pdu_tree, data_offset, pdu_end);
6718 break;
6719 case RDMNET_BROKER_VECTOR_ASSIGNED_DYNAMIC_UIDS0x000C:
6720 dissect_broker_assigned_dynamic_uids(tvb, pdu_tree, data_offset, pdu_end);
6721 break;
6722 case RDMNET_BROKER_VECTOR_FETCH_DYNAMIC_UID_LIST0x000D:
6723 dissect_broker_fetch_dynamic_uids(tvb, pdu_tree, data_offset, pdu_end);
6724 break;
6725 }
6726
6727 return pdu_start + pdu_length;
6728}
6729
6730
6731/******************************************************************************/
6732/* Dissect RPT Request RDM Command */
6733static uint32_t
6734dissect_rpt_request_rdm_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6735{
6736 uint8_t pdu_flags;
6737 uint32_t pdu_start;
6738 uint32_t pdu_length;
6739 uint32_t pdu_end;
6740 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6741 uint32_t vector_offset;
6742 uint32_t data_offset;
6743 uint32_t data_length;
6744
6745 proto_item *ti;
6746 proto_tree *pdu_tree;
6747
6748 /* this pdu */
6749 const char *name;
6750 uint8_t vector;
6751
6752 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_request_pdu, 1, 0);
6753
6754 /* Add Vector item */
6755 vector = tvb_get_uint8(tvb, vector_offset);
6756 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_request_rdm_command, tvb, vector_offset, 1, ENC_BIG_ENDIAN0x00000000);
6757
6758 /* Add Vector item to tree */
6759 name = val_to_str(pinfo->pool, vector, rdmnet_rpt_request_rdm_command_start_code_vals, "unknown (%d)");
6760 proto_item_append_text(ti, ": %s", name);
6761
6762 /* NO HEADER DATA ON THESE* (at least so far) */
6763
6764 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
6765 /* data_offset += 3; */
6766
6767 pdu_end = pdu_start + pdu_length;
6768 dissect_rdm_command(tvb, pinfo, pdu_tree, data_offset, (pdu_length-4));
6769
6770 return pdu_end;
6771}
6772
6773
6774/******************************************************************************/
6775/* Dissect RPT Request */
6776static uint32_t
6777dissect_rpt_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6778{
6779 uint8_t pdu_flags;
6780 uint32_t pdu_start;
6781 uint32_t pdu_length;
6782 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6783 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
6784 uint32_t vector_offset;
6785 uint32_t data_offset;
6786 uint32_t data_length;
6787
6788 proto_item *ti;
6789 proto_tree *pdu_tree;
6790
6791 /* this pdu */
6792 const char *name;
6793 uint32_t vector;
6794
6795 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_request_pdu, 1, 0);
6796
6797 /* Add Vector item */
6798 vector = tvb_get_ntohl(tvb, vector_offset);
6799 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_request_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000);
6800
6801 /* Add Vector item to tree */
6802 name = val_to_str(pinfo->pool, vector, rdmnet_rpt_request_vals, "unknown (%d)");
6803 proto_item_append_text(ti, ": %s", name);
6804
6805 /* NO HEADER DATA ON THESE* (at least so far) */
6806
6807 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
6808 data_offset += 3;
6809
6810 /* rdm command */
6811 dissect_rpt_request_rdm_command(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
6812
6813 return 0;
6814}
6815
6816
6817/******************************************************************************/
6818/* Dissect RPT Status */
6819static uint32_t
6820dissect_rpt_status(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6821{
6822 uint8_t pdu_flags;
6823 uint32_t pdu_start;
6824 uint32_t pdu_length;
6825 uint32_t pdu_end;
6826 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6827 uint32_t vector_offset;
6828 uint32_t data_offset;
6829 uint32_t data_length;
6830
6831 proto_item *ti;
6832 proto_tree *pdu_tree;
6833
6834 /* this pdu */
6835 const char *name;
6836 uint16_t vector;
6837
6838 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_status_pdu, 1, 0);
6839
6840 /* Add Vector item */
6841 vector = tvb_get_ntohs(tvb, vector_offset);
6842 proto_item_append_text(ti, ", vector = %u", vector);
6843 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_vector, tvb, vector_offset, 2, ENC_BIG_ENDIAN0x00000000);
6844
6845 /* Add Vector item to tree */
6846 name = val_to_str(pinfo->pool, vector, rdmnet_rpt_status_vector_vals, "unknown (%d)");
6847 proto_item_append_text(ti, ": %s", name);
6848
6849 /* NO HEADER DATA ON THESE* (at least so far) */
6850
6851 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
6852 data_offset += 3;
6853
6854 pdu_end = pdu_start + pdu_length;
6855 switch (vector) {
6856 case RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RPT_UID0x0001:
6857 if (pdu_end > data_offset) {
6858 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_unknown_rpt_uid_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000);
6859 }
6860 break;
6861 case RDMNET_RPT_VECTOR_STATUS_RDM_TIMEOUT0x0002:
6862 if (pdu_end > data_offset) {
6863 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_rdm_timeout_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000);
6864 }
6865 break;
6866 case RDMNET_RPT_VECTOR_STATUS_RDM_INVALID_RESPONSE0x0003:
6867 if (pdu_end > data_offset) {
6868 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_rdm_invalid_response_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000);
6869 }
6870 break;
6871 case RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RDM_UID0x0004:
6872 if (pdu_end > data_offset) {
6873 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_unknown_rdm_uid_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000);
6874 }
6875 break;
6876 case RDMNET_RPT_VECTOR_STATUS_UNKNOWN_ENDPOINT0x0005:
6877 if (pdu_end > data_offset) {
6878 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_unknown_endpoint_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000);
6879 }
6880 break;
6881 case RDMNET_RPT_VECTOR_STATUS_BROADCAST_COMPLETE0x0006:
6882 if (pdu_end > data_offset) {
6883 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_broadcast_complete_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000);
6884 }
6885 break;
6886 case RDMNET_RPT_VECTOR_STATUS_UNKNOWN_VECTOR0x0007:
6887 if (pdu_end > data_offset) {
6888 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_unknown_vector_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000);
6889 }
6890 break;
6891 case RDMNET_RPT_VECTOR_STATUS_INVALID_MESSAGE0x0008:
6892 case RDMNET_RPT_VECTOR_STATUS_INVALID_COMMAND_CLASS0x0009:
6893 /* no data */
6894 break;
6895 }
6896
6897 return pdu_start + pdu_length;
6898}
6899
6900
6901/******************************************************************************/
6902/* Dissect RPT Notification RDM Command */
6903static uint32_t
6904dissect_rpt_notification_rdm_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6905{
6906 uint8_t pdu_flags;
6907 uint32_t pdu_start;
6908 uint32_t pdu_length;
6909 uint32_t pdu_end;
6910 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6911 uint32_t vector_offset;
6912 uint32_t data_offset;
6913 uint32_t data_length;
6914
6915 proto_item *ti;
6916 proto_tree *pdu_tree;
6917
6918 /* this pdu */
6919 const char *name;
6920 uint8_t vector;
6921
6922 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_request_pdu, 1, 0);
6923
6924 /* Add Vector item */
6925 vector = tvb_get_uint8(tvb, vector_offset);
6926 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_notification_rdm_command, tvb, vector_offset, 1, ENC_BIG_ENDIAN0x00000000);
6927
6928 /* Add Vector item to tree */
6929 name = val_to_str(pinfo->pool, vector, rdmnet_rpt_request_rdm_command_start_code_vals, "unknown (%d)");
6930 proto_item_append_text(ti, ": %s", name);
6931
6932 /* NO HEADER DATA ON THESE* (at least so far) */
6933
6934 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
6935 /* data_offset += 3; */
6936
6937 pdu_end = pdu_start + pdu_length;
6938 dissect_rdm_command(tvb, pinfo, pdu_tree, data_offset, (pdu_length-4));
6939
6940 return pdu_end;
6941}
6942
6943
6944/******************************************************************************/
6945/* Dissect RPT Notification */
6946static uint32_t
6947dissect_rpt_notification(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6948{
6949 uint8_t pdu_flags;
6950 uint32_t pdu_start;
6951 uint32_t pdu_length;
6952 uint32_t pdu_end;
6953 uint32_t pdu_flvh_length; /* flags, length, vector, header */
6954 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
6955 uint32_t vector_offset;
6956 uint32_t data_offset;
6957 uint32_t data_length;
6958 uint32_t old_offset;
6959
6960 proto_item *ti;
6961 proto_tree *pdu_tree;
6962
6963 /* this pdu */
6964 const char *name;
6965 uint32_t vector;
6966
6967 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_notification_pdu, 1, 0);
6968
6969 /* Add Vector item */
6970 vector = tvb_get_ntohl(tvb, vector_offset);
6971 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_notification_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000);
6972
6973 /* Add Vector item to tree "RDM Command" */
6974 name = val_to_str(pinfo->pool, vector, rdmnet_rpt_notification_vals, "unknown (%d)");
6975 proto_item_append_text(ti, ": %s", name);
6976
6977 /* NO HEADER DATA ON THESE* (at least so far) */
6978
6979 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
6980 data_offset += 3;
6981
6982 /* rdm command */
6983 pdu_end = pdu_start + pdu_length;
6984 while (data_offset < pdu_end) {
6985 old_offset = data_offset;
6986 data_offset = dissect_rpt_notification_rdm_command(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
6987 if (data_offset == old_offset) break;
6988 }
6989
6990 return pdu_end;
6991}
6992
6993
6994/******************************************************************************/
6995/* Dissect RPT Base PDU */
6996static uint32_t
6997dissect_acn_rpt_base_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
6998{
6999 uint8_t pdu_flags;
7000 uint32_t pdu_start;
7001 uint32_t pdu_length;
7002 uint32_t pdu_flvh_length; /* flags, length, vector, header */
7003 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
7004 uint32_t vector_offset;
7005 uint32_t data_offset;
7006 uint32_t data_length;
7007
7008 proto_item *ti;
7009 proto_tree *pdu_tree;
7010
7011 /* this pdu */
7012 const char *name;
7013 uint32_t vector;
7014
7015 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_base_pdu, 1, 0);
7016
7017 /* Add Vector item */
7018 vector = tvb_get_ntohl(tvb, vector_offset);
7019 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000);
7020
7021 /* Add Vector item to tree */
7022 name = val_to_str(pinfo->pool, vector, rdmnet_rpt_vector_vals, "unknown (%d)");
7023 proto_item_append_text(ti, ": %s", name);
7024
7025 /* NO HEADER DATA ON THESE* (at least so far) */
7026
7027 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
7028 data_offset += 3;
7029
7030 /* source uid (6 bytes) */
7031 data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_rpt_source_uid,
7032 hf_rdmnet_rpt_source_uid_manf, hf_rdmnet_rpt_source_uid_dev);
7033
7034 /* source endpoint id (2 bytes) */
7035 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_source_endpoint_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
7036 data_offset += 2;
7037
7038 /* destination uid (6 bytes) */
7039 data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_rpt_destination_uid,
7040 hf_rdmnet_rpt_destination_uid_manf, hf_rdmnet_rpt_destination_uid_dev);
7041
7042 /* destination endpoint id (2 bytes) */
7043 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_destination_endpoint_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
7044 data_offset += 2;
7045
7046 /* sequence number (4 bytes) */
7047 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
7048 data_offset += 4;
7049
7050 /* reserved (1 byte) */
7051 proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_reserved, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000);
7052 data_offset += 1;
7053
7054 /* process based on vector */
7055 switch (vector) {
7056 case RDMNET_RPT_VECTOR_REQUEST0x00000001:
7057 dissect_rpt_request(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7058 break;
7059 case RDMNET_RPT_VECTOR_STATUS0x00000002:
7060 dissect_rpt_status(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7061 break;
7062 case RDMNET_RPT_VECTOR_NOTIFICATION0x00000003:
7063 dissect_rpt_notification(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7064 break;
7065 }
7066
7067 return pdu_start + pdu_length;
7068}
7069
7070
7071/******************************************************************************/
7072/* Dissect EPT Data */
7073static uint32_t
7074dissect_ept_data(tvbuff_t *tvb, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
7075{
7076 uint8_t pdu_flags;
7077 uint32_t pdu_start;
7078 uint32_t pdu_length;
7079 uint32_t pdu_end;
7080 uint32_t pdu_flvh_length; /* flags, length, vector, header */
7081 uint32_t vector_offset;
7082 uint32_t data_offset;
7083
7084 proto_item *ti;
7085 proto_item *ti2;
7086 proto_tree *pdu_tree;
7087 proto_tree *pdu_tree2;
7088
7089 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_ept_data_pdu, 1, 0);
7090
7091 /* Add PDU Length item */
7092 proto_tree_add_uint(pdu_tree, hf_rdmnet_ept_data_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
7093
7094 dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2);
7095 /* offset should now be pointing to header (if one exists) */
7096
7097 /* esta manufacturer id + protocol id (4 bytes) */
7098 ti2 = proto_tree_add_item(pdu_tree, hf_rdmnet_ept_data_vector, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
7099 pdu_tree2 = proto_item_add_subtree(ti2, ett_rdmnet_ept_data_vector_pdu);
7100 proto_tree_add_item(pdu_tree2, hf_rdmnet_ept_data_vector_manufacturer_id, tvb, 0, 2, ENC_BIG_ENDIAN0x00000000);
7101 proto_tree_add_item(pdu_tree2, hf_rdmnet_ept_data_vector_protocol_id, tvb, 2, 2, ENC_BIG_ENDIAN0x00000000);
7102 data_offset += 4;
7103
7104 /* opaque data */
7105 pdu_end = pdu_start + pdu_length;
7106 proto_tree_add_item(pdu_tree, hf_rdmnet_ept_data_opaque_data, tvb, data_offset, (pdu_end - data_offset), ENC_NA0x00000000);
7107
7108 return pdu_start + pdu_length;
7109}
7110
7111
7112/******************************************************************************/
7113/* Dissect EPT Status */
7114static uint32_t
7115dissect_ept_status(tvbuff_t *tvb, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
7116{
7117 uint8_t pdu_flags;
7118 uint16_t vector;
7119 uint32_t pdu_start;
7120 uint32_t pdu_length;
7121 uint32_t pdu_end;
7122 uint32_t pdu_flvh_length; /* flags, length, vector, header */
7123 uint32_t vector_offset;
7124 uint32_t data_offset;
7125
7126 proto_item *ti;
7127 proto_tree *pdu_tree;
7128
7129 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_ept_status_pdu, 1, 0);
7130
7131 /* Add PDU Length item */
7132 proto_tree_add_uint(pdu_tree, hf_rdmnet_ept_status_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
7133
7134 dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2);
7135 /* offset should now be pointing to header (if one exists) */
7136
7137 vector = tvb_get_ntohs(tvb, data_offset);
7138 proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_vector, tvb, data_offset, 2, ENC_NA0x00000000);
7139 data_offset += 2;
7140
7141 /* process based on vector */
7142 switch (vector) {
7143 case RDMNET_EPT_VECTOR_UNKNOWN_CID0x0001:
7144 /* unknown cid (16 bytes) */
7145 proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_unknown_cid, tvb, data_offset, 16, ENC_NA0x00000000);
7146 data_offset += 16;
7147
7148 /* status string */
7149 pdu_end = pdu_start + pdu_length;
7150 proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_status_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000);
7151 break;
7152 case RDMNET_EPT_VECTOR_UNKNOWN_VECTOR0x0002:
7153 /* unknown cid (4 bytes) */
7154 proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_unknown_vector, tvb, data_offset, 4, ENC_NA0x00000000);
7155 data_offset += 4;
7156
7157 /* vector string */
7158 pdu_end = pdu_start + pdu_length;
7159 proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_vector_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000);
7160 break;
7161 }
7162
7163 return pdu_start + pdu_length;
7164}
7165
7166
7167/******************************************************************************/
7168/* Dissect EPT Base PDU */
7169static uint32_t
7170dissect_acn_ept_base_pdu(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
7171{
7172 uint8_t pdu_flags;
7173 uint32_t pdu_start;
7174 uint32_t pdu_length;
7175 uint32_t pdu_flvh_length; /* flags, length, vector, header */
7176 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
7177 uint32_t vector_offset;
7178 uint32_t data_offset;
7179 uint32_t data_length;
7180
7181 proto_item *ti;
7182 proto_tree *pdu_tree;
7183
7184 /* this pdu */
7185 const char *name;
7186 uint32_t vector;
7187
7188 dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_ept_base_pdu, 1, 0);
7189
7190 /* Add Vector item */
7191 vector = tvb_get_ntohl(tvb, vector_offset);
7192 proto_tree_add_item(pdu_tree, hf_rdmnet_ept_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000);
7193
7194 /* Add Vector item to tree */
7195 name = val_to_str(pinfo->pool, vector, rdmnet_ept_vector_vals, "unknown (%d)");
7196 proto_item_append_text(ti, ": %s", name);
7197
7198 /* NO HEADER DATA ON THESE* (at least so far) */
7199
7200 dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0);
7201 data_offset += 3;
7202
7203 /* destination cid (16 bytes) */
7204 proto_tree_add_item(pdu_tree, hf_rdmnet_ept_destination_cid, tvb, data_offset, 16, ENC_NA0x00000000);
7205 data_offset += 16;
7206
7207 /* process based on vector */
7208 switch (vector) {
7209 case RDMNET_EPT_VECTOR_DATA0x00000001:
7210 dissect_ept_data(tvb, pdu_tree, data_offset, &pdu_offsets);
7211 break;
7212 case RDMNET_EPT_VECTOR_STATUS0x00000002:
7213 dissect_ept_status(tvb, pdu_tree, data_offset, &pdu_offsets);
7214 break;
7215 }
7216
7217 return pdu_start + pdu_length;
7218}
7219
7220/******************************************************************************/
7221/* Dissect Root PDU */
7222static uint32_t
7223dissect_acn_root_pdu_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pdu_tree, proto_item *ti, const char *title, int *offset, uint8_t pdu_flags, uint32_t pdu_length, uint32_t *data_offset, uint32_t *data_length, acn_pdu_offsets *last_pdu_offsets, bool_Bool add_cid_to_info, uint32_t *pdu_flvh_length, bool_Bool is_acn)
7224{
7225 uint32_t header_offset;
7226 e_guid_t guid;
7227
7228 /* Adjust header */
7229 proto_item_append_text(ti, "%s", title);
7230
7231 dissect_pdu_bit_flag_h(offset, pdu_flags, &header_offset, last_pdu_offsets, pdu_flvh_length, 16);
7232 /* offset should now be pointing to data (if one exists) */
7233
7234 /* get Header (CID) 16 bytes */
7235 tvb_get_guid(tvb, header_offset, &guid, ENC_BIG_ENDIAN0x00000000);
7236 proto_item_append_text(ti, ", Src: %s", guid_to_str(pinfo->pool, &guid));
7237
7238 if (add_cid_to_info) {
7239 /* add cid to info */
7240 col_add_fstr(pinfo->cinfo, COL_INFO, "CID %s", guid_to_str(pinfo->pool, &guid));
7241 }
7242
7243 if (is_acn) {
7244 proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, header_offset, 16, ENC_BIG_ENDIAN0x00000000);
7245 } else {
7246 proto_tree_add_item(pdu_tree, hf_rdmnet_cid, tvb, header_offset, 16, ENC_BIG_ENDIAN0x00000000);
7247 }
7248 /* header_offset += 16; */
7249
7250 dissect_pdu_bit_flag_d(*offset, pdu_flags, pdu_length, data_offset, data_length, last_pdu_offsets, *pdu_flvh_length, 1);
7251
7252 return (*data_offset) + (*data_length);
7253}
7254
7255/******************************************************************************/
7256/* Dissect Root PDU */
7257static uint32_t
7258dissect_acn_root_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets, bool_Bool is_acn)
7259{
7260 /* common to all pdu */
7261 uint8_t pdu_flags;
7262 uint32_t pdu_start;
7263 uint32_t pdu_length;
7264 uint32_t pdu_flvh_length; /* flags, length, vector, header */
7265 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
7266 uint32_t vector_offset;
7267 uint32_t data_offset;
7268 uint32_t end_offset;
7269 uint32_t old_offset;
7270 uint32_t data_length;
7271
7272 proto_item *ti;
7273 proto_tree *pdu_tree;
7274
7275 /* this pdu */
7276 uint32_t protocol_id;
7277
7278 begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_root_pdu, is_acn);
7279
7280 /* Add PDU Length item */
7281 if (is_acn) {
7282 proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
7283 } else {
7284 proto_tree_add_uint(pdu_tree, hf_rdmnet_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
7285 }
7286
7287 dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 4);
7288 /* offset should now be pointing to header (if one exists) */
7289
7290 /* Get Protocol ID (vector) */
7291 protocol_id = tvb_get_ntohl(tvb, vector_offset);
7292 if (is_acn) {
7293 proto_tree_add_uint(pdu_tree, hf_acn_protocol_id, tvb, vector_offset, 4, protocol_id);
7294 } else {
7295 proto_tree_add_uint(pdu_tree, hf_rdmnet_protocol_id, tvb, vector_offset, 4, protocol_id);
7296 }
7297
7298 /* process based on protocol_id */
7299 switch (protocol_id) {
7300 case ACN_PROTOCOL_ID_DMX0x00000003:
7301 case ACN_PROTOCOL_ID_DMX_20x00000004:
7302 case ACN_PROTOCOL_ID_DMX_30x50430001:
7303 if (global_acn_dmx_enable) {
7304 end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root DMX", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 1, &pdu_flvh_length, 1);
7305
7306 /* adjust for what we used */
7307 while (data_offset < end_offset) {
7308 old_offset = data_offset;
7309 data_offset = dissect_acn_dmx_base_pdu(protocol_id, tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7310 if (data_offset == old_offset) break;
7311 }
7312 }
7313 break;
7314 case ACN_PROTOCOL_ID_EXTENDED0x00000008:
7315 end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root DMX Extension", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 1, &pdu_flvh_length, 1);
7316
7317 /* adjust for what we used */
7318 while (data_offset < end_offset) {
7319 old_offset = data_offset;
7320 data_offset = dissect_acn_dmx_extension_base_pdu(protocol_id, tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7321 if (data_offset == old_offset) break;
7322 }
7323 break;
7324 case ACN_PROTOCOL_ID_SDT0x00000001:
7325 end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root SDT", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 1);
7326
7327 /* adjust for what we used */
7328 while (data_offset < end_offset) {
7329 old_offset = data_offset;
7330 data_offset = dissect_acn_sdt_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7331 if (data_offset == old_offset) break;
7332 }
7333 break;
7334 case ACN_PROTOCOL_ID_RPT0x00000005:
7335 end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root RPT", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 0);
7336
7337 /* adjust for what we used */
7338 while (data_offset < end_offset) {
7339 old_offset = data_offset;
7340 data_offset = dissect_acn_rpt_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7341 if (data_offset == old_offset) break;
7342 }
7343 break;
7344 case ACN_PROTOCOL_ID_BROKER0x00000009:
7345 end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root Broker", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 0);
7346
7347 /* adjust for what we used */
7348 while (data_offset < end_offset) {
7349 old_offset = data_offset;
7350 data_offset = dissect_acn_broker_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7351 if (data_offset == old_offset) break;
7352 }
7353 break;
7354 case ACN_PROTOCOL_ID_LLRP0x0000000A:
7355 end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root LLRP", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 0);
7356
7357 /* adjust for what we used */
7358 while (data_offset < end_offset) {
7359 old_offset = data_offset;
7360 data_offset = dissect_acn_llrp_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7361 if (data_offset == old_offset) break;
7362 }
7363 break;
7364 case ACN_PROTOCOL_ID_EPT0x0000000B:
7365 end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root EPT", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 0);
7366
7367 /* adjust for what we used */
7368 while (data_offset < end_offset) {
7369 old_offset = data_offset;
7370 data_offset = dissect_acn_ept_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets);
7371 if (data_offset == old_offset) break;
7372 }
7373 break;
7374 }
7375
7376 return pdu_start + pdu_length;
7377}
7378
7379/******************************************************************************/
7380/* Dissect ACN */
7381static int
7382dissect_acn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U___attribute__((unused)))
7383{
7384 proto_item *ti;
7385 proto_tree *acn_tree;
7386 uint32_t data_offset = 0;
7387 uint32_t old_offset;
7388 uint32_t end_offset;
7389 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
7390 uint16_t postamble_size;
7391
7392/* if (!is_acn(tvb)) { */
7393/* return 0; */
7394/* } */
7395
7396 /* Set the protocol column */
7397 col_set_str(pinfo->cinfo, COL_PROTOCOL, "ACN");
7398 col_add_fstr(pinfo->cinfo, COL_INFO, "ACN [Src Port: %d, Dst Port: %d]", pinfo->srcport, pinfo->destport );
7399
7400 ti = proto_tree_add_item(tree, proto_acn, tvb, 0, -1, ENC_NA0x00000000);
7401 acn_tree = proto_item_add_subtree(ti, ett_acn);
7402
7403 /* add preamble, postamble and ACN Packet ID */
7404 proto_tree_add_item(acn_tree, hf_acn_preamble_size, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
7405 data_offset += 2;
7406 postamble_size = tvb_get_uint16(tvb, data_offset, ENC_BIG_ENDIAN0x00000000);
7407 proto_tree_add_item(acn_tree, hf_acn_postamble_size, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
7408 data_offset += 2;
7409 proto_tree_add_item(acn_tree, hf_acn_packet_identifier, tvb, data_offset, 12, ENC_UTF_80x00000002);
7410 data_offset += 12;
7411
7412 /* one past the last data byte, not including the postamble */
7413 end_offset = data_offset + tvb_reported_length_remaining(tvb, data_offset);
7414 while (data_offset < end_offset - postamble_size) {
7415 old_offset = data_offset;
7416 data_offset = dissect_acn_root_pdu(tvb, pinfo, acn_tree, data_offset, &pdu_offsets, 1);
7417 if (data_offset == old_offset) return tvb_reported_length(tvb);
7418 }
7419 /* one past the last postamble byte */
7420 while (data_offset < end_offset) {
7421 proto_tree_add_item(acn_tree, hf_acn_postamble_key_fingerprint, tvb, data_offset, 4, ENC_NA0x00000000);
7422 data_offset += 4;
7423 proto_tree_add_item(acn_tree, hf_acn_postamble_seq_type, tvb, data_offset, 1, ENC_NA0x00000000);
7424 data_offset += 1;
7425 proto_tree_add_item(acn_tree, hf_acn_postamble_seq_hi, tvb, data_offset, 3, ENC_BIG_ENDIAN0x00000000);
7426 data_offset += 3;
7427 proto_tree_add_item(acn_tree, hf_acn_postamble_seq_low, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
7428 data_offset += 4;
7429 proto_tree_add_item(acn_tree, hf_acn_postamble_message_digest, tvb, data_offset, 16, ENC_NA0x00000000);
7430 data_offset += 16;
7431 }
7432 return tvb_reported_length(tvb);
7433}
7434
7435/******************************************************************************/
7436/* Dissect RDMnet */
7437static int
7438dissect_rdmnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t data_offset, bool_Bool is_udp)
7439{
7440 proto_item *ti;
7441 proto_tree *rdmnet_tree;
7442 /* uint32_t data_offset = 0; */
7443 uint32_t old_offset;
7444 uint32_t end_offset;
7445 uint32_t pdu_length;
7446 acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
7447
7448 /* Set the protocol column */
7449 col_set_str(pinfo->cinfo, COL_PROTOCOL, "RDMnet");
7450 col_add_fstr(pinfo->cinfo, COL_INFO, "RDMnet [Src Port: %d, Dst Port: %d]", pinfo->srcport, pinfo->destport );
7451
7452 if (is_udp) {
7453 ti = proto_tree_add_item(tree, proto_rdmnet, tvb, data_offset, -1, ENC_NA0x00000000);
7454 } else {
7455 pdu_length = tvb_get_ntohl(tvb, 12) + 16;
7456 ti = proto_tree_add_item(tree, proto_rdmnet, tvb, data_offset, pdu_length, ENC_NA0x00000000);
7457 }
7458 rdmnet_tree = proto_item_add_subtree(ti, ett_rdmnet);
7459
7460 if (is_udp) {
7461 /* UDP only: preamble and postamble */
7462 proto_tree_add_item(rdmnet_tree, hf_rdmnet_preamble_size, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
7463 data_offset += 2;
7464 proto_tree_add_item(rdmnet_tree, hf_rdmnet_postamble_size, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000);
7465 data_offset += 2;
7466 }
7467 /* add ACN Packet ID */
7468 proto_tree_add_item(rdmnet_tree, hf_rdmnet_packet_identifier, tvb, data_offset, 12, ENC_UTF_80x00000002);
7469 data_offset += 12;
7470
7471 pdu_length = 0;
7472 if (!is_udp) {
7473 /* TCP only: data length (may be less than packet length) */
7474 proto_tree_add_item(rdmnet_tree, hf_rdmnet_tcp_length, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000);
7475 pdu_length = tvb_get_ntohl(tvb, data_offset);
7476 data_offset += 4;
7477 }
7478
7479 /* one past the last byte */
7480 if (is_udp) {
7481 end_offset = data_offset + tvb_reported_length_remaining(tvb, data_offset);
7482 } else {
7483 end_offset = data_offset + pdu_length;
7484 }
7485 while (data_offset < end_offset) {
7486 old_offset = data_offset;
7487 data_offset = dissect_acn_root_pdu(tvb, pinfo, rdmnet_tree, data_offset, &pdu_offsets, 0);
7488 if (data_offset == old_offset) break;
7489 }
7490
7491 return end_offset;
7492}
7493
7494/******************************************************************************/
7495/* Register protocol */
7496void
7497proto_register_acn(void)
7498{
7499 static hf_register_info hf[] = {
7500 /**************************************************************************/
7501 /* In alphabetical order */
7502 /* Address Type */
7503 /* PDU flags*/
7504 { &hf_acn_ip_address_type,
7505 { "Addr Type", "acn.ip_address_type",
7506 FT_UINT8, BASE_DEC, VALS(acn_ip_address_type_vals)((0 ? (const struct _value_string*)0 : ((acn_ip_address_type_vals
))))
, 0x0,
7507 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7508 },
7509 /* Association */
7510 { &hf_acn_association,
7511 { "Association", "acn.association",
7512 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7513 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7514 },
7515 /* Blob */
7516 { &hf_acn_blob,
7517 { "Blob", "acn.blob",
7518 FT_NONE, BASE_NONE, NULL((void*)0), 0x0,
7519 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7520 },
7521#if 0
7522 /* Blob Dimmer Load Properties 2 Type */
7523 { &hf_acn_blob_dimmer_load_properties2_type,
7524 { "Blob Field", "acn.blob_dimmer_load_properties2_type",
7525 FT_NONE, BASE_NONE, NULL((void*)0), 0x0,
7526 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7527 },
7528#endif
7529 /* Blob Field Length */
7530 { &hf_acn_blob_field_length,
7531 { "Field Length", "acn.blob_field_length",
7532 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7533 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7534 },
7535 /* Blob Field Type */
7536 { &hf_acn_blob_field_type,
7537 { "Field Type", "acn.blob_field_type",
7538 FT_UINT8, BASE_DEC, VALS(acn_blob_field_type_vals)((0 ? (const struct _value_string*)0 : ((acn_blob_field_type_vals
))))
, 0x0,
7539 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7540 },
7541 /* Blob Field Value Number */
7542 { &hf_acn_blob_field_value_number,
7543 { "Field Value", "acn.blob_field_value_number",
7544 FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0,
7545 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7546 },
7547 { &hf_acn_blob_field_value_number64,
7548 { "Field Value", "acn.blob_field_value_number64",
7549 FT_UINT64, BASE_DEC_HEX, NULL((void*)0), 0x0,
7550 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7551 },
7552 { &hf_acn_blob_field_value_float,
7553 { "Field Value", "acn.blob_field_value_float",
7554 FT_FLOAT, BASE_NONE, NULL((void*)0), 0x0,
7555 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7556 },
7557 { &hf_acn_blob_field_value_double,
7558 { "Field Value", "acn.blob_field_value_double",
7559 FT_DOUBLE, BASE_NONE, NULL((void*)0), 0x0,
7560 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7561 },
7562 { &hf_acn_blob_field_value_guid,
7563 { "Field Value", "acn.blob_field_value_guid",
7564 FT_GUID, BASE_NONE, NULL((void*)0), 0x0,
7565 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7566 },
7567
7568 /* Blob Field Value String*/
7569 { &hf_acn_blob_field_value_string,
7570 { "Field Value", "acn.blob_field_value_string",
7571 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
7572 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7573 },
7574 /* Blob Field Value IPV4 */
7575 { &hf_acn_blob_field_value_ipv4,
7576 { "Field Value", "acn.blob_field_value_ipv4",
7577 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
7578 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7579 },
7580 /* Blob Field Value IPV6 */
7581 { &hf_acn_blob_field_value_ipv6,
7582 { "Field Value", "acn.blob_field_value_ipv6",
7583 FT_IPv6, BASE_NONE, NULL((void*)0), 0x0,
7584 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7585 },
7586 /* Blob Metadata Device Type */
7587 { &hf_acn_blob_tree_field_type,
7588 { "Blob Field", "acn.blob_tree_field_type",
7589 FT_NONE, BASE_NONE, NULL((void*)0), 0x0,
7590 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7591 },
7592#if 0
7593 /* Blob Metadata Types Type */
7594 { &hf_acn_blob_metadata_types_type,
7595 { "Blob Field", "acn.blob_metadata_types_type",
7596 FT_NONE, BASE_NONE, NULL((void*)0), 0x0,
7597 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7598 },
7599#endif
7600 /* Blob Range Number */
7601 { &hf_acn_blob_range_number,
7602 { "Blob Range Number", "acn.blob_range_number",
7603 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7604 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7605 },
7606 /* Blob Range Type */
7607 { &hf_acn_blob_range_type,
7608 { "Blob Range Type", "acn.blob_range_type",
7609 FT_UINT8, BASE_HEX, VALS(acn_blob_range_type_vals)((0 ? (const struct _value_string*)0 : ((acn_blob_range_type_vals
))))
, 0x0,
7610 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7611 },
7612#if 0
7613 /* Blob Range Start */
7614 { &hf_acn_blob_range_start,
7615 { "Blob Range Start", "acn.blob_range_start",
7616 FT_UINT8, BASE_DEC_HEX, NULL((void*)0), 0x0,
7617 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7618 },
7619#endif
7620 /* Blob Type */
7621 { &hf_acn_blob_type,
7622 { "Blob Type", "acn.blob_type",
7623 FT_UINT8, BASE_DEC, VALS(acn_blob_type_vals)((0 ? (const struct _value_string*)0 : ((acn_blob_type_vals))
))
, 0x0,
7624 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7625 },
7626 /* Blob Version */
7627 { &hf_acn_blob_version,
7628 { "Blob Version", "acn.blob_version",
7629 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7630 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7631 },
7632 { &hf_acn_blob_time_zone,
7633 { "Time Zone", "acn.blob_time_zone",
7634 FT_INT32, BASE_DEC, NULL((void*)0), 0x0,
7635 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7636 },
7637 { &hf_acn_blob_dst_type,
7638 { "DST Type", "acn.blob_dst_type",
7639 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7640 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7641 },
7642 { &hf_acn_blob_dst_start_day,
7643 { "DST Start Day", "acn.blob_dst_start_day",
7644 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7645 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7646 },
7647 { &hf_acn_blob_dst_stop_day,
7648 { "DST Stop Day", "acn.blob_dst_stop_day",
7649 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7650 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7651 },
7652 { &hf_acn_blob_dst_start_locality,
7653 { "DST Start Locality", "acn.blob_dst_start_locality",
7654 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7655 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7656 },
7657 { &hf_acn_blob_dst_stop_locality,
7658 { "DST Stop Locality", "acn.blob_dst_stop_locality",
7659 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7660 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7661 },
7662 /* Channel Number */
7663 { &hf_acn_channel_number,
7664 { "Channel Number", "acn.channel_number",
7665 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7666 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7667 },
7668 /* CID */
7669 { &hf_acn_cid,
7670 { "CID", "acn.cid",
7671 FT_GUID, BASE_NONE, NULL((void*)0), 0x0,
7672 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7673 },
7674 /* Client Protocol ID */
7675#if 0
7676 { &hf_acn_client_protocol_id,
7677 { "Client Protocol ID", "acn.client_protocol_id",
7678 FT_UINT32, BASE_DEC, VALS(acn_protocol_id_vals)((0 ? (const struct _value_string*)0 : ((acn_protocol_id_vals
))))
, 0x0,
7679 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7680 },
7681#endif
7682 /* DMP data */
7683 { &hf_acn_data,
7684 { "Data", "acn.dmp_data",
7685 FT_BYTES, BASE_NONE, NULL((void*)0), 0x0,
7686 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7687 },
7688 { &hf_acn_data8,
7689 { "Addr", "acn.dmp_data8",
7690 FT_UINT8, BASE_DEC_HEX, NULL((void*)0), 0x0,
7691 "Data8", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7692 },
7693 { &hf_acn_data16,
7694 { "Addr", "acn.dmp_data16",
7695 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7696 "Data16", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7697 },
7698 { &hf_acn_data24,
7699 { "Addr", "acn.dmp_data24",
7700 FT_UINT24, BASE_DEC_HEX, NULL((void*)0), 0x0,
7701 "Data24", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7702 },
7703 { &hf_acn_data32,
7704 { "Addr", "acn.dmp_data32",
7705 FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0,
7706 "Data32", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7707 },
7708
7709 /* DMP Address type*/
7710#if 0
7711 { &hf_acn_dmp_adt,
7712 { "Address and Data Type", "acn.dmp_adt",
7713 FT_UINT8, BASE_DEC_HEX, NULL((void*)0), 0x0,
7714 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7715 },
7716#endif
7717 { &hf_acn_dmp_adt_a,
7718 { "Size", "acn.dmp_adt_a",
7719 FT_UINT8, BASE_DEC, VALS(acn_dmp_adt_a_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_adt_a_vals))
))
, 0x03,
7720 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7721 },
7722 { &hf_acn_dmp_adt_d,
7723 { "Data Type", "acn.dmp_adt_d",
7724 FT_UINT8, BASE_DEC, VALS(acn_dmp_adt_d_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_adt_d_vals))
))
, 0x30,
7725 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7726 },
7727 { &hf_acn_dmp_adt_r,
7728 { "Relative", "acn.dmp_adt_r",
7729 FT_UINT8, BASE_DEC, VALS(acn_dmp_adt_r_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_adt_r_vals))
))
, 0x40,
7730 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7731 },
7732 { &hf_acn_dmp_adt_v,
7733 { "Virtual", "acn.dmp_adt_v",
7734 FT_UINT8, BASE_DEC, VALS(acn_dmp_adt_v_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_adt_v_vals))
))
, 0x80,
7735 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7736 },
7737 { &hf_acn_dmp_adt_x,
7738 { "Reserved", "acn.dmp_adt_x",
7739 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0c,
7740 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7741 },
7742
7743 /* DMP Reason Code */
7744 { &hf_acn_dmp_reason_code,
7745 { "Reason Code", "acn.dmp_reason_code",
7746 FT_UINT8, BASE_DEC, VALS(acn_dmp_reason_code_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_reason_code_vals
))))
, 0x0,
7747 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7748 },
7749
7750 /* DMP Vector */
7751 { &hf_acn_dmp_vector,
7752 { "DMP Vector", "acn.dmp_vector",
7753 FT_UINT8, BASE_DEC, VALS(acn_dmp_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_vector_vals)
)))
, 0x0,
7754 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7755 },
7756
7757 { &hf_acn_dmp_actual_address,
7758 { "Actual Address", "acn.dmp_actual_address",
7759 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
7760 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7761 },
7762
7763 { &hf_acn_dmp_virtual_address,
7764 { "Virtual Address", "acn.dmp_virtual_address",
7765 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
7766 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7767 },
7768
7769 { &hf_acn_dmp_actual_address_first,
7770 { "Actual Address First", "acn.dmp_actual_address_first",
7771 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
7772 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7773 },
7774
7775 { &hf_acn_dmp_virtual_address_first,
7776 { "Virtual Address First", "acn.dmp_virtual_address_first",
7777 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
7778 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7779 },
7780
7781 /* Expiry */
7782 { &hf_acn_expiry,
7783 { "Expiry", "acn.expiry",
7784 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7785 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7786 },
7787 /* First Member to ACK */
7788 { &hf_acn_first_member_to_ack,
7789 { "First Member to ACK", "acn.first_member_to_ack",
7790 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7791 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7792 },
7793 /* First Missed Sequence */
7794 { &hf_acn_first_missed_sequence,
7795 { "First Missed Sequence", "acn.first_missed_sequence",
7796 FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0,
7797 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7798 },
7799 /* IPV4 */
7800 { &hf_acn_ipv4,
7801 { "IPV4", "acn.ipv4",
7802 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
7803 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7804 },
7805 /* IPV6 */
7806 { &hf_acn_ipv6,
7807 { "IPV6", "acn.ipv6",
7808 FT_IPv6, BASE_NONE, NULL((void*)0), 0x0,
7809 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7810 },
7811 /* Last Member to ACK */
7812 { &hf_acn_last_member_to_ack,
7813 { "Last Member to ACK", "acn.last_member_to_ack",
7814 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7815 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7816 },
7817 /* Last Missed Sequence */
7818 { &hf_acn_last_missed_sequence,
7819 { "Last Missed Sequence", "acn.last_missed_sequence",
7820 FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0,
7821 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7822 },
7823 /* MAK threshold */
7824 { &hf_acn_mak_threshold,
7825 { "MAK Threshold", "acn.mak_threshold",
7826 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7827 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7828 },
7829 /* Member ID */
7830 { &hf_acn_member_id,
7831 { "Member ID", "acn.member_id",
7832 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7833 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7834 },
7835 /* NAK Holdoff */
7836 { &hf_acn_nak_holdoff,
7837 { "NAK holdoff (ms)", "acn.nak_holdoff",
7838 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7839 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7840 },
7841 /* NAK Max Wait */
7842 { &hf_acn_nak_max_wait,
7843 { "NAK Max Wait (ms)", "acn.nak_max_wait",
7844 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7845 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7846 },
7847 /* NAK Modulus */
7848 { &hf_acn_nak_modulus,
7849 { "NAK Modulus", "acn.nak_modulus",
7850 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7851 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7852 },
7853 /* NAK Outbound Flag */
7854 { &hf_acn_nak_outbound_flag,
7855 { "NAK Outbound Flag", "acn.nak_outbound_flag",
7856 FT_BOOLEAN, 8, NULL((void*)0), 0x80,
7857 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7858 },
7859 /* Oldest Available Wrapper */
7860 { &hf_acn_oldest_available_wrapper,
7861 { "Oldest Available Wrapper", "acn.oldest_available_wrapper",
7862 FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0,
7863 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7864 },
7865 /* Preamble Size */
7866 { &hf_acn_preamble_size,
7867 { "Size of preamble", "acn.preamble_size",
7868 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
7869 "Preamble size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7870 },
7871 /* Packet Identifier */
7872 { &hf_acn_packet_identifier,
7873 { "Packet Identifier", "acn.packet_identifier",
7874 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
7875 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7876 },
7877 /* PDU */
7878 { &hf_acn_pdu,
7879 { "PDU", "acn.pdu",
7880 FT_NONE, BASE_NONE, NULL((void*)0), 0x0,
7881 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7882 },
7883 /* PDU flags*/
7884 { &hf_acn_pdu_flags,
7885 { "Flags", "acn.pdu.flags",
7886 FT_UINT8, BASE_HEX, NULL((void*)0), 0x0,
7887 "PDU Flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7888 },
7889 { &hf_acn_pdu_flag_d,
7890 { "Data", "acn.pdu.flag_d",
7891 FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_D0x10,
7892 "Data flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7893 },
7894 { &hf_acn_pdu_flag_h,
7895 { "Header", "acn.pdu.flag_h",
7896 FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_H0x20,
7897 "Header flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7898 },
7899 { &hf_acn_pdu_flag_l,
7900 { "Length", "acn.pdu.flag_l",
7901 FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_L0x80,
7902 "Length flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7903 },
7904 { &hf_acn_pdu_flag_v,
7905 { "Vector", "acn.pdu.flag_v",
7906 FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_V0x40,
7907 "Vector flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7908 },
7909 /* PDU Length */
7910 { &hf_acn_pdu_length,
7911 { "Length", "acn.pdu.length",
7912 FT_UINT32, BASE_DEC, NULL((void*)0), 0x0,
7913 "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7914 },
7915 /* Port */
7916 { &hf_acn_port,
7917 { "Port", "acn.port",
7918 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7919 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7920 },
7921 /* Postamble Size */
7922 { &hf_acn_postamble_size,
7923 { "Size of postamble", "acn.postamble_size",
7924 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
7925 "Postamble size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7926 },
7927 /* Protocol ID */
7928 { &hf_acn_protocol_id,
7929 { "Protocol ID", "acn.protocol_id",
7930 FT_UINT32, BASE_DEC, VALS(acn_protocol_id_vals)((0 ? (const struct _value_string*)0 : ((acn_protocol_id_vals
))))
, 0x0,
7931 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7932 },
7933 /* Reason Code */
7934 { &hf_acn_reason_code,
7935 { "Reason Code", "acn.reason_code",
7936 FT_UINT8, BASE_DEC, VALS(acn_reason_code_vals)((0 ? (const struct _value_string*)0 : ((acn_reason_code_vals
))))
, 0x0,
7937 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7938 },
7939 /* Reciprocal Channel */
7940 { &hf_acn_reciprocal_channel,
7941 { "Reciprocal Channel Number", "acn.reciprocal_channel",
7942 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
7943 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7944 },
7945 /* Refuse Code */
7946 { &hf_acn_refuse_code,
7947 { "Refuse Code", "acn.refuse_code",
7948 FT_UINT8, BASE_DEC, VALS(acn_refuse_code_vals)((0 ? (const struct _value_string*)0 : ((acn_refuse_code_vals
))))
, 0x0,
7949 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7950 },
7951 /* Reliable Sequence Number */
7952 { &hf_acn_reliable_sequence_number,
7953 { "Reliable Sequence Number", "acn.reliable_sequence_number",
7954 FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0,
7955 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7956 },
7957 /* Ad-hoc Expiry */
7958 { &hf_acn_adhoc_expiry,
7959 { "Ad-hoc Expiry", "acn.adhoc_expiry",
7960 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7961 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7962 },
7963 /* SDT Vector */
7964 { &hf_acn_sdt_vector,
7965 { "SDT Vector", "acn.sdt_vector",
7966 FT_UINT8, BASE_DEC, VALS(acn_sdt_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_sdt_vector_vals)
)))
, 0x0,
7967 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7968 },
7969
7970 /* DMX Vector */
7971 { &hf_acn_dmx_vector,
7972 { "Vector", "acn.dmx_vector",
7973 FT_UINT32, BASE_DEC, VALS(acn_dmx_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_dmx_vector_vals)
)))
, 0x0,
7974 "DMX Vector", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7975 },
7976 /* DMX Source Name */
7977 { &hf_acn_dmx_source_name,
7978 { "Source", "acn.dmx.source_name",
7979 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
7980 "DMX Source Name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7981 },
7982
7983 /* DMX priority */
7984 { &hf_acn_dmx_priority,
7985 { "Priority", "acn.dmx.priority",
7986 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7987 "DMX Priority", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7988 },
7989
7990 /* DMX 2 sync universe*/
7991 { &hf_acn_dmx_2_sync_universe,
7992 { "Sync Universe", "acn.dmx.sync",
7993 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
7994 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7995 },
7996
7997 /* DMX 3 reserved */
7998 { &hf_acn_dmx_3_reserved,
7999 { "Reserved", "acn.dmx.reserved",
8000 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8001 "DMX Reserved", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8002 },
8003
8004 /* DMX Sequence number */
8005 { &hf_acn_dmx_sequence_number,
8006 { "Seq No", "acn.dmx.seq_number",
8007 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
8008 "DMX Sequence Number", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8009 },
8010
8011 /* DMX 2 options */
8012 { &hf_acn_dmx_2_options,
8013 { "Options", "acn.dmx.options",
8014 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
8015 "DMX Options", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8016 },
8017
8018 { &hf_acn_dmx_2_option_p,
8019 { "Preview Data", "acn.dmx.option_p",
8020 FT_BOOLEAN, 8, NULL((void*)0), ACN_DMX_OPTION_P0x80,
8021 "Preview Data flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8022 },
8023
8024 { &hf_acn_dmx_2_option_s,
8025 { "Stream Terminated", "acn.dmx.option_s",
8026 FT_BOOLEAN, 8, NULL((void*)0), ACN_DMX_OPTION_S0x40,
8027 "Stream Terminated flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8028 },
8029
8030 { &hf_acn_dmx_2_option_f,
8031 { "Force Synchronization", "acn.dmx.option_sync",
8032 FT_BOOLEAN, 8, NULL((void*)0), ACN_DMX_OPTION_F0x20,
8033 "Force Synchronization flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8034 },
8035
8036 /* DMX Universe */
8037 { &hf_acn_dmx_universe,
8038 { "Universe", "acn.dmx.universe",
8039 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8040 "DMX Universe", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8041 },
8042
8043 /* DMX Start Code */
8044 { &hf_acn_dmx_start_code,
8045 { "Start Code", "acn.dmx.start_code",
8046 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
8047 "DMX Start Code", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8048 },
8049
8050 /* DMX 2 First Property Address */
8051 { &hf_acn_dmx_2_first_property_address,
8052 { "First Property Address", "acn.dmx.first_property_address",
8053 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
8054 "DMX First Property Address", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8055 },
8056
8057 /* DMX Address Increment */
8058 { &hf_acn_dmx_increment,
8059 { "Increment", "acn.dmx.increment",
8060 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8061 "DMX Increment", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8062 },
8063
8064 /* DMX Packet Count */
8065 { &hf_acn_dmx_count,
8066 { "Count", "acn.dmx.count",
8067 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8068 "DMX Count", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8069 },
8070
8071 /* DMX 2 Start Code */
8072 { &hf_acn_dmx_2_start_code,
8073 { "Start Code", "acn.dmx.start_code2",
8074 FT_UINT8, BASE_DEC_HEX, NULL((void*)0), 0x0,
8075 "DMX Start Code", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8076 },
8077
8078 /* DMX Extension Vector */
8079 { &hf_acn_dmx_extension_vector,
8080 { "Vector", "acn.dmx.extension.vector",
8081 FT_UINT32, BASE_DEC, VALS(acn_dmx_extension_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_dmx_extension_vector_vals
))))
, 0x0,
8082 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8083 },
8084 { &hf_acn_dmx_discovery_vector,
8085 { "Vector", "acn.dmx.discovery.vector",
8086 FT_UINT32, BASE_DEC, VALS(acn_dmx_discovery_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_dmx_discovery_vector_vals
))))
, 0x0,
8087 "DMX Extension Discovery Vector", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8088 },
8089 { &hf_acn_dmx_discovery_universe_list,
8090 { "Universe List", "acn.dmx.discovery.list",
8091 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8092 "DMX Extension Discovery Universe List", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8093 },
8094
8095 /* DMX Discovery Pages */
8096 { &hf_acn_dmx_discovery_page,
8097 { "Page", "acn.dmx.discovery.page",
8098 FT_UINT32, BASE_DEC, NULL((void*)0), 0x0,
8099 "DMX Extension Discovery Page", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8100 },
8101
8102 { &hf_acn_dmx_discovery_last_page,
8103 { "Last Page", "acn.dmx.discovery.last_page",
8104 FT_UINT32, BASE_DEC, NULL((void*)0), 0x0,
8105 "DMX Extension Discovery Last Page", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8106 },
8107
8108 { &hf_acn_dmx_discovery_framing_reserved,
8109 { "Reserved", "acn.dmx.discovery.reserved",
8110 FT_UINT32, BASE_DEC, NULL((void*)0), 0x0,
8111 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8112 },
8113
8114 { &hf_acn_dmx_sync_universe,
8115 { "Sync Universe", "acn.dmx.sync.universe",
8116 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8117 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8118 },
8119
8120 { &hf_acn_dmx_sync_reserved,
8121 { "Reserved", "acn.dmx.sync.reserved",
8122 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8123 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8124 },
8125
8126 /*
8127 * If you want the pretty-printed data in the field, for filtering
8128 * purposes, you have to make it an FT_STRING.
8129 *
8130 * If you want the raw data in the field, for filtering purposes,
8131 * you have to make it an FT_BYTES *AND* use "proto_tree_add_bytes_format()"
8132 * to put the pretty-printed data into the display but not the field.
8133 */
8134 { &hf_acn_dmx_data,
8135 { "Data", "acn.dmx.data",
8136 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8137 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8138 },
8139
8140 /* Session Count */
8141#if 0
8142 { &hf_acn_session_count,
8143 { "Session Count", "acn.session_count",
8144 FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0,
8145 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8146 },
8147#endif
8148 /* Total Sequence Number */
8149 { &hf_acn_total_sequence_number,
8150 { "Total Sequence Number", "acn.total_sequence_number",
8151 FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0,
8152 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8153 }
8154 };
8155
8156 static hf_register_info magic_hf[] = {
8157 /* Protocol ID */
8158 { &hf_magic_protocol_id,
8159 { "Protocol ID", "magic.protocol_id",
8160 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
8161 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8162 },
8163
8164 /* PDU Type */
8165 { &hf_magic_pdu_subtype,
8166 { "PDU type", "magic.type",
8167 FT_UINT8, BASE_DEC, VALS(magic_pdu_subtypes)((0 ? (const struct _value_string*)0 : ((magic_pdu_subtypes))
))
, 0x0,
8168 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) },
8169 },
8170
8171 /* Major Version */
8172 { &hf_magic_major_version,
8173 { "Major Version", "magic.major_version",
8174 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
8175 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8176 },
8177
8178 /* Minor Version */
8179 { &hf_magic_minor_version,
8180 { "Minor Version", "magic.minor_version",
8181 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
8182 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8183 },
8184
8185 /* V1 Command */
8186 { &hf_magic_v1command_vals,
8187 { "Command", "magic.v1_command",
8188 FT_UINT32, BASE_DEC, VALS(magic_v1command_vals)((0 ? (const struct _value_string*)0 : ((magic_v1command_vals
))))
, 0x0,
8189 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8190 },
8191
8192 /* V2 Command */
8193 { &hf_magic_command_vals,
8194 { "Command", "magic.command",
8195 FT_UINT32, BASE_DEC, VALS(magic_command_vals)((0 ? (const struct _value_string*)0 : ((magic_command_vals))
))
, 0x0,
8196 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8197 },
8198
8199 /* Beacon Duration */
8200 { &hf_magic_command_beacon_duration,
8201 { "Duration", "magic.beacon_duration",
8202 FT_UINT32, BASE_DEC, NULL((void*)0), 0x0,
8203 "Beacon Duration", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8204 },
8205
8206 /* TFTP */
8207 { &hf_magic_command_tftp,
8208 { "TFTP IP", "magic.tftp",
8209 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8210 "IP of TFTP server", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8211 },
8212
8213 /* Reset Lease */
8214 { &hf_magic_command_reset_lease,
8215 { "Reset Lease", "magic.reset_lease",
8216 FT_UINT32, BASE_DEC, VALS(magic_reset_lease_vals)((0 ? (const struct _value_string*)0 : ((magic_reset_lease_vals
))))
, 0x0,
8217 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8218 },
8219
8220 /* CID */
8221 { &hf_magic_command_cid,
8222 { "CID", "magic.cid",
8223 FT_GUID, BASE_NONE, NULL((void*)0), 0x0,
8224 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8225 },
8226
8227 /* Command IP Configuration */
8228 { &hf_magic_command_ip_configuration,
8229 { "IP Configuration", "magic.ip_configuration",
8230 FT_UINT32, BASE_DEC, VALS(magic_ip_configuration_vals)((0 ? (const struct _value_string*)0 : ((magic_ip_configuration_vals
))))
, 0x0,
8231 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8232 },
8233
8234 /* Command IP Address */
8235 { &hf_magic_command_ip_address,
8236 { "IP Address", "magic.ip_address",
8237 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8238 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8239 },
8240
8241 /* Command Subnet Mask */
8242 { &hf_magic_command_subnet_mask,
8243 { "Subnet Mask", "magic.subnet_mask",
8244 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8245 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8246 },
8247
8248 /* Command Gateway */
8249 { &hf_magic_command_gateway,
8250 { "Gateway", "magic.gateway",
8251 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8252 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8253 },
8254
8255 /* Reply IP Address */
8256 { &hf_magic_reply_ip_address,
8257 { "IP", "magic.reply.ip_address",
8258 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8259 "Local IP Address", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8260 },
8261
8262 /* Reply Subnet Mask */
8263 { &hf_magic_reply_subnet_mask,
8264 { "Subnet Mask", "magic.reply.subnet_mask",
8265 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8266 "Local Subnet Mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8267 },
8268
8269 /* Reply Gateway */
8270 { &hf_magic_reply_gateway,
8271 { "Gateway", "magic.reply.gateway",
8272 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8273 "Local Gateway", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8274 },
8275
8276 /* Reply TFTP */
8277 { &hf_magic_reply_tftp,
8278 { "TFTP IP", "magic.reply.tftp",
8279 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8280 "IP of TFTP server", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8281 },
8282
8283 /* Reply Version */
8284 { &hf_magic_reply_version,
8285 { "Reply Version", "magic.reply.version",
8286 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8287 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8288 },
8289
8290 /* Reply Device Type Name */
8291 { &hf_magic_reply_device_type_name,
8292 { "Device Type Name", "magic.reply.device_type_name",
8293 FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8294 "Reply Device Type Name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8295 },
8296
8297 /* Reply Default Name */
8298 { &hf_magic_reply_default_name,
8299 { "Default Name", "magic.reply.default_name",
8300 FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8301 "Reply Default Name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8302 },
8303
8304 /* Reply User Name */
8305 { &hf_magic_reply_user_name,
8306 { "User Name", "magic.reply.user_name",
8307 FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8308 "Reply User Name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8309 },
8310
8311 /* CID */
8312 { &hf_magic_reply_cid,
8313 { "CID", "magic.reply.cid",
8314 FT_GUID, BASE_NONE, NULL((void*)0), 0x0,
8315 "Reply CID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8316 },
8317
8318 /* DCID */
8319 { &hf_magic_reply_dcid,
8320 { "DCID", "magic.reply.dcid",
8321 FT_GUID, BASE_NONE, NULL((void*)0), 0x0,
8322 "Reply DCID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8323 },
8324
8325 /* Key Fingerprint */
8326 { &hf_acn_postamble_key_fingerprint,
8327 { "Key Fingerprint", "acn.security.key_fingerprint",
8328 FT_BYTES, BASE_NONE, NULL((void*)0), 0x0,
8329 "Security Key Fingerprint", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8330 },
8331
8332 /* Sequence type */
8333 { &hf_acn_postamble_seq_type,
8334 { "Sequence Type", "acn.security.seq_type",
8335 FT_UINT8, BASE_DEC, VALS(security_seq_type_vals)((0 ? (const struct _value_string*)0 : ((security_seq_type_vals
))))
, 0x0,
8336 "Security Sequence Type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8337 },
8338
8339 /* Sequence High */
8340 { &hf_acn_postamble_seq_hi,
8341 { "Sequence High", "acn.security.seq_hi",
8342 FT_UINT24, BASE_HEX, NULL((void*)0), 0x0,
8343 "Security Sequence High", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8344 },
8345
8346 /* Sequence Low */
8347 { &hf_acn_postamble_seq_low,
8348 { "Sequence Low", "acn.security.seq_low",
8349 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
8350 "Security Sequence Low", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8351 },
8352
8353 /* Message Digest */
8354 { &hf_acn_postamble_message_digest,
8355 { "Message Digest", "acn.security.digest",
8356 FT_BYTES, BASE_NONE, NULL((void*)0), 0x0,
8357 "Security Message Digest", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8358 },
8359 };
8360
8361 static hf_register_info rdmnet_hf[] = {
8362 /* CID */
8363 { &hf_rdmnet_cid,
8364 { "CID", "rdmnet.cid",
8365 FT_GUID, BASE_NONE, NULL((void*)0), 0x0,
8366 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8367 },
8368 /* Packet Identifier */
8369 { &hf_rdmnet_packet_identifier,
8370 { "Packet Identifier", "rdmnet.packet_identifier",
8371 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8372 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8373 },
8374 /* PDU */
8375 { &hf_rdmnet_pdu,
8376 { "PDU", "rdmnet.pdu",
8377 FT_NONE, BASE_NONE, NULL((void*)0), 0x0,
8378 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8379 },
8380 /* PDU flags*/
8381 { &hf_rdmnet_pdu_flags,
8382 { "Flags", "rdmnet.pdu.flags",
8383 FT_UINT8, BASE_HEX, NULL((void*)0), 0x0,
8384 "PDU Flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8385 },
8386 { &hf_rdmnet_pdu_flag_d,
8387 { "Data", "rdmnet.pdu.flag_d",
8388 FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_D0x10,
8389 "Data flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8390 },
8391 { &hf_rdmnet_pdu_flag_h,
8392 { "Header", "rdmnet.pdu.flag_h",
8393 FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_H0x20,
8394 "Header flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8395 },
8396 { &hf_rdmnet_pdu_flag_l,
8397 { "Length", "rdmnet.pdu.flag_l",
8398 FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_L0x80,
8399 "Length flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8400 },
8401 { &hf_rdmnet_pdu_flag_v,
8402 { "Vector", "rdmnet.pdu.flag_v",
8403 FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_V0x40,
8404 "Vector flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8405 },
8406 /* PDU Length */
8407 { &hf_rdmnet_pdu_length,
8408 { "Length", "rdmnet.pdu.length",
8409 FT_UINT32, BASE_DEC, NULL((void*)0), 0x0,
8410 "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8411 },
8412 /* Postamble Size */
8413 { &hf_rdmnet_postamble_size,
8414 { "Size of postamble", "rdmnet.postamble_size",
8415 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8416 "Postamble size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8417 },
8418 /* Preamble Size */
8419 { &hf_rdmnet_preamble_size,
8420 { "Size of preamble", "rdmnet.preamble_size",
8421 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8422 "Preamble size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8423 },
8424 /* Protocol ID */
8425 { &hf_rdmnet_protocol_id,
8426 { "Protocol ID", "rdmnet.protocol_id",
8427 FT_UINT32, BASE_DEC, VALS(acn_protocol_id_vals)((0 ? (const struct _value_string*)0 : ((acn_protocol_id_vals
))))
, 0x0,
8428 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8429 },
8430 /* Postamble Size */
8431 { &hf_rdmnet_tcp_length,
8432 { "Data length", "rdmnet.tcp_length",
8433 FT_UINT32, BASE_DEC, NULL((void*)0), 0x0,
8434 "TCP data size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8435 },
8436 /* LLRP Vector */
8437 { &hf_rdmnet_llrp_vector,
8438 { "LLRP Vector", "rdmnet.llrp_vector",
8439 FT_UINT32, BASE_DEC, VALS(rdmnet_llrp_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_vector_vals
))))
, 0x0,
8440 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8441 },
8442 /* LLRP Destination CID */
8443 { &hf_rdmnet_llrp_destination_cid,
8444 { "CID", "rdmnet.llrp.destination_cid",
8445 FT_GUID, BASE_NONE, NULL((void*)0), 0x0,
8446 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8447 },
8448 /* LLRP Transaction Number */
8449 { &hf_rdmnet_llrp_transaction_number,
8450 { "Transaction Number", "rdmnet.llrp.transaction_number",
8451 FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0,
8452 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8453 },
8454 /* LLRP Probe Request PDU Length */
8455 { &hf_rdmnet_llrp_probe_request_pdu_length,
8456 { "Length", "rdmnet.llrp.probe_request.pdu.length",
8457 FT_UINT24, BASE_DEC, NULL((void*)0), 0x0,
8458 "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8459 },
8460 /* LLRP Probe Request Vector */
8461 { &hf_rdmnet_llrp_probe_request_vector,
8462 { "LLRP Vector", "rdmnet.llrp.probe_request_vector",
8463 FT_UINT8, BASE_DEC, VALS(rdmnet_llrp_probe_request_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_probe_request_vals
))))
, 0x0,
8464 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8465 },
8466 /* LLRP Probe Request Lower UID */
8467 { &hf_rdmnet_llrp_probe_request_lower_uid,
8468 { "Lower UID", "rdmnet.llrp.probe_request.lower_uid",
8469 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8470 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8471 },
8472 /* LLRP Probe Request Upper UID */
8473 { &hf_rdmnet_llrp_probe_request_upper_uid,
8474 { "Upper UID", "rdmnet.llrp.probe_request.upper_uid",
8475 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8476 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8477 },
8478 /* LLRP Probe Request Filter */
8479 { &hf_rdmnet_llrp_probe_request_filter,
8480 { "Filter", "rdmnet.llrp.probe_request.filter",
8481 FT_UINT16, BASE_HEX, NULL((void*)0), 0x0,
8482 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8483 },
8484 { &hf_rdmnet_llrp_probe_request_filter_brokers_only,
8485 { "Brokers Only", "rdmnet.llrp.probe_request.filter_brokers_only",
8486 FT_BOOLEAN, 8, NULL((void*)0), RDMNET_LLRP_VECTOR_PROBE_REQUEST_BROKERS_ONLY0x02,
8487 "Brokers only flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8488 },
8489 { &hf_rdmnet_llrp_probe_request_filter_client_tcp_inactive,
8490 { "Client TCP Inactive", "rdmnet.llrp.probe_request.filter_client_tcp_inactive",
8491 FT_BOOLEAN, 8, NULL((void*)0), RDMNET_LLRP_VECTOR_PROBE_REQUEST_CLIENT_TCP_INACTIVE0x01,
8492 "Client TCP inactive flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8493 },
8494 /* LLRP Probe Request Unknown UID */
8495 { &hf_rdmnet_llrp_probe_request_known_uid,
8496 { "Known UID", "rdmnet.llrp.probe_request.known_uid",
8497 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8498 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8499 },
8500 { &hf_rdmnet_llrp_probe_request_known_uid_manf,
8501 { "Manufacturer ID", "rdmnet.llrp.probe_request.known_uid.manf",
8502 FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0,
8503 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8504 },
8505 { &hf_rdmnet_llrp_probe_request_known_uid_dev,
8506 { "Device ID", "rdmnet.llrp.probe_request.known_uid.dev",
8507 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
8508 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8509 },
8510 /* LLRP Probe Reply Vector */
8511 { &hf_rdmnet_llrp_probe_reply_vector,
8512 { "LLRP Vector", "rdmnet.llrp.probe_reply_vector",
8513 FT_UINT8, BASE_DEC, VALS(rdmnet_llrp_probe_reply_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_probe_reply_vals
))))
, 0x0,
8514 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8515 },
8516 /* LLRP Probe Reply UID */
8517 { &hf_rdmnet_llrp_probe_reply_uid,
8518 { "UID", "rdmnet.llrp.probe_reply.uid",
8519 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8520 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8521 },
8522 { &hf_rdmnet_llrp_probe_reply_uid_manf,
8523 { "Manufacturer ID", "rdmnet.llrp.probe_reply.uid.manf",
8524 FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0,
8525 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8526 },
8527 { &hf_rdmnet_llrp_probe_reply_uid_dev,
8528 { "Device ID", "rdmnet.llrp.probe_reply.uid.dev",
8529 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
8530 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8531 },
8532 /* LLRP Probe Reply Hardware Address */
8533 { &hf_rdmnet_llrp_probe_reply_hardware_address,
8534 { "Hardware Address", "rdmnet.llrp.probe_reply.hardware_address",
8535 FT_BYTES, SEP_COLON, NULL((void*)0), 0x0,
8536 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8537 },
8538 /* LLRP Probe Reply Component Type */
8539 { &hf_rdmnet_llrp_probe_reply_component_type,
8540 { "Component Type", "rdmnet.llrp.probe_reply.component_type",
8541 FT_UINT8, BASE_DEC, VALS(rdmnet_llrp_probe_reply_component_type_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_probe_reply_component_type_vals
))))
, 0x0,
8542 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8543 },
8544 /* LLRP RDM Command Start Code */
8545 { &hf_rdmnet_llrp_rdm_command_start_code,
8546 { "RDM Command", "rdmnet.llrp.rdm_command.start_code",
8547 FT_UINT8, BASE_DEC, VALS(rdmnet_llrp_rdm_command_start_code_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_rdm_command_start_code_vals
))))
, 0x0,
8548 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8549 },
8550 /* RPT Vector */
8551 { &hf_rdmnet_rpt_vector,
8552 { "RPT Vector", "rdmnet.rpt_vector",
8553 FT_UINT32, BASE_DEC, VALS(rdmnet_rpt_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_vector_vals
))))
, 0x0,
8554 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8555 },
8556 /* RPT Source UID */
8557 { &hf_rdmnet_rpt_source_uid,
8558 { "Source UID", "rdmnet.rpt.source_uid",
8559 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8560 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8561 },
8562 { &hf_rdmnet_rpt_source_uid_manf,
8563 { "Manufacturer ID", "rdmnet.rpt.source_uid.manf",
8564 FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0,
8565 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8566 },
8567 { &hf_rdmnet_rpt_source_uid_dev,
8568 { "Device ID", "rdmnet.rpt.source_uid.dev",
8569 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
8570 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8571 },
8572 /* RPT Source Endpoint ID */
8573 { &hf_rdmnet_rpt_source_endpoint_id,
8574 { "Source Endpoint ID", "rdmnet.rpt.source_endpoint_id",
8575 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8576 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8577 },
8578 /* RPT Destination UID */
8579 { &hf_rdmnet_rpt_destination_uid,
8580 { "Destination UID", "rdmnet.rpt.destination_uid",
8581 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8582 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8583 },
8584 { &hf_rdmnet_rpt_destination_uid_manf,
8585 { "Manufacturer ID", "rdmnet.rpt.destination_uid.manf",
8586 FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0,
8587 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8588 },
8589 { &hf_rdmnet_rpt_destination_uid_dev,
8590 { "Device ID", "rdmnet.rpt.destination_uid.dev",
8591 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
8592 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8593 },
8594 /* RPT Destination Endpoint ID */
8595 { &hf_rdmnet_rpt_destination_endpoint_id,
8596 { "Destination Endpoint ID", "rdmnet.rpt.destination_endpoint_id",
8597 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8598 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8599 },
8600 /* RPT Sequence Number */
8601 { &hf_rdmnet_rpt_sequence_number,
8602 { "Sequence Number", "rdmnet.rpt.sequence_number",
8603 FT_UINT32, BASE_DEC, NULL((void*)0), 0x0,
8604 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8605 },
8606 /* RPT Reserved */
8607 { &hf_rdmnet_rpt_reserved,
8608 { "Reserved", "rdmnet.rpt.reserved",
8609 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
8610 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8611 },
8612 /* RPT Request Vector */
8613 { &hf_rdmnet_rpt_request_vector,
8614 { "RPT Request Vector", "rdmnet.rpt.request_vector",
8615 FT_UINT32, BASE_DEC, VALS(rdmnet_rpt_request_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_request_vals
))))
, 0x0,
8616 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8617 },
8618 /* RPT Request RDM Command */
8619 { &hf_rdmnet_rpt_request_rdm_command,
8620 { "RDM Command", "rdmnet.rpt.request.rdm_command",
8621 FT_UINT8, BASE_DEC, VALS(rdmnet_rpt_request_rdm_command_start_code_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_request_rdm_command_start_code_vals
))))
, 0x0,
8622 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8623 },
8624 /* RPT Status Vector */
8625 { &hf_rdmnet_rpt_status_vector,
8626 { "Status Vector", "rdmnet.rpt.status.vector",
8627 FT_UINT16, BASE_DEC, VALS(rdmnet_rpt_status_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_status_vector_vals
))))
, 0x0,
8628 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8629 },
8630 /* RPT Status Unknown RPT UID String */
8631 { &hf_rdmnet_rpt_status_unknown_rpt_uid_string,
8632 { "Status", "rdmnet.rpt.status.unknown_rpt_uid_string",
8633 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8634 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8635 },
8636 /* RPT Status RDM Timeout String */
8637 { &hf_rdmnet_rpt_status_rdm_timeout_string,
8638 { "Status", "rdmnet.rpt.status.rdm_timeout_string",
8639 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8640 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8641 },
8642 /* RPT Status Invalid RDM Response String */
8643 { &hf_rdmnet_rpt_status_rdm_invalid_response_string,
8644 { "Status", "rdmnet.rpt.status.invalid_rdm_response_string",
8645 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8646 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8647 },
8648 /* RPT Status Unknown RDM UID String */
8649 { &hf_rdmnet_rpt_status_unknown_rdm_uid_string,
8650 { "Status", "rdmnet.rpt.status.unknown_rdm_uid_string",
8651 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8652 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8653 },
8654 /* RPT Status Unknown Endpoint String */
8655 { &hf_rdmnet_rpt_status_unknown_endpoint_string,
8656 { "Status", "rdmnet.rpt.status.unknown_endpoint_string",
8657 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8658 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8659 },
8660 /* RPT Status Broadcast Complete String */
8661 { &hf_rdmnet_rpt_status_broadcast_complete_string,
8662 { "Status", "rdmnet.rpt.status.broadcast_complete_string",
8663 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8664 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8665 },
8666 /* RPT Status Unknown Vector String */
8667 { &hf_rdmnet_rpt_status_unknown_vector_string,
8668 { "Status", "rdmnet.rpt.status.unknown_vector_string",
8669 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8670 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8671 },
8672 /* RPT Notification Vector */
8673 { &hf_rdmnet_rpt_notification_vector,
8674 { "RPT Notification Vector", "rdmnet.rpt.notification_vector",
8675 FT_UINT32, BASE_DEC, VALS(rdmnet_rpt_notification_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_notification_vals
))))
, 0x0,
8676 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8677 },
8678 /* RPT Notification RDM Command */
8679 { &hf_rdmnet_rpt_notification_rdm_command,
8680 { "RDM Command", "rdmnet.rpt.notification.rdm_command",
8681 FT_UINT8, BASE_DEC, VALS(rdmnet_rpt_request_rdm_command_start_code_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_request_rdm_command_start_code_vals
))))
, 0x0,
8682 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8683 },
8684 /* Broker Vector */
8685 { &hf_rdmnet_broker_vector,
8686 { "Broker Vector", "rdmnet.broker_vector",
8687 FT_UINT16, BASE_DEC, VALS(rdmnet_broker_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_broker_vector_vals
))))
, 0x0,
8688 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8689 },
8690 /* Broker Client Protocol Vector */
8691 { &hf_rdmnet_broker_client_protocol_vector,
8692 { "Client Protocol", "rdmnet.broker_client_protocol_vector",
8693 FT_UINT32, BASE_DEC, VALS(broker_client_protocol_vals)((0 ? (const struct _value_string*)0 : ((broker_client_protocol_vals
))))
, 0x0,
8694 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8695 },
8696 /* Broker Client Protocol CID */
8697 { &hf_rdmnet_broker_client_protocol_cid,
8698 { "Client CID", "rdmnet.broker_client_cid",
8699 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8700 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8701 },
8702 /* Broker Client RPT Client UID */
8703 { &hf_rdmnet_broker_client_rpt_client_uid,
8704 { "Client UID", "rdmnet.broker_client_rpt_client_uid",
8705 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8706 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8707 },
8708 { &hf_rdmnet_broker_client_rpt_client_uid_manf,
8709 { "Manufacturer ID", "rdmnet.broker_client_rpt_client_uid.manf",
8710 FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0,
8711 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8712 },
8713 { &hf_rdmnet_broker_client_rpt_client_uid_dev,
8714 { "Device ID", "rdmnet.broker_client_rpt_client_uid.dev",
8715 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
8716 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8717 },
8718 /* Broker Client RPT Client Type */
8719 { &hf_rdmnet_broker_client_rpt_client_type,
8720 { "RPT client type", "rdmnet.broker_client_rpt_client_type",
8721 FT_UINT8, BASE_DEC, VALS(broker_client_rpt_client_type_vals)((0 ? (const struct _value_string*)0 : ((broker_client_rpt_client_type_vals
))))
, 0x0,
8722 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8723 },
8724 /* Broker Client RPT Binding CID */
8725 { &hf_rdmnet_broker_client_rpt_binding_cid,
8726 { "Binding CID", "rdmnet.broker_client_rpt_binding_cid",
8727 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8728 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8729 },
8730 /* Broker Client EPT Protocol Vector */
8731 { &hf_rdmnet_broker_client_ept_protocol_vector,
8732 { "Protocol Vector", "rdmnet.broker_client_ept_vector",
8733 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8734 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8735 },
8736 /* Broker Client EPT Manufacturer ID */
8737 { &hf_rdmnet_broker_client_ept_protocol_manufacturer_id,
8738 { "Manufacturer ID", "rdmnet.broker_client_ept_manufacturer_id",
8739 FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0,
8740 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8741 },
8742 /* Broker Client EPT Protocol ID */
8743 { &hf_rdmnet_broker_client_ept_protocol_protocol_id,
8744 { "Protocol ID", "rdmnet.broker_client_ept_protocol_id",
8745 FT_UINT16, BASE_HEX, NULL((void*)0), 0x0,
8746 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8747 },
8748 /* Broker Client EPT Protocol String */
8749 { &hf_rdmnet_broker_client_ept_protocol_string,
8750 { "Protocol String", "rdmnet.broker_client_ept_protocol_string",
8751 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8752 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8753 },
8754 /* Broker Connect Scope */
8755 { &hf_rdmnet_broker_connect_client_scope,
8756 { "Client Scope", "rdmnet.broker.connect.client_scope",
8757 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8758 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8759 },
8760 /* Broker Connect E1.33 Version */
8761 { &hf_rdmnet_broker_connect_e133_version,
8762 { "E1.33 Version", "rdmnet.broker.connect.e133_version",
8763 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8764 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8765 },
8766 /* Broker Connect Search Domain */
8767 { &hf_rdmnet_broker_connect_search_domain,
8768 { "Search Domain", "rdmnet.broker.connect.search_domain",
8769 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8770 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8771 },
8772 /* Broker Connect Connection Flags */
8773 { &hf_rdmnet_broker_connect_connection_flags,
8774 { "Flags", "rdmnet.broker.connect.flags",
8775 FT_UINT8, BASE_HEX, NULL((void*)0), 0x0,
8776 "Connection Flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8777 },
8778 { &hf_rdmnet_broker_connect_connection_flags_incremental_updates,
8779 { "Incremental Updates", "rdmnet.broker.connect.flags_incremental_updates",
8780 FT_BOOLEAN, 8, NULL((void*)0), RDMNET_BROKER_VECTOR_CONNECT_INCREMENTAL_UPDATES0x01,
8781 "Incremental updates flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8782 },
8783 /* Broker Connect Reply Connection Code */
8784 { &hf_rdmnet_broker_connect_reply_connection_code,
8785 { "Connection Code", "rdmnet.broker.connect_reply.connection_code",
8786 FT_UINT16, BASE_DEC, VALS(rdmnet_broker_status_code_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_broker_status_code_vals
))))
, 0x0,
8787 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8788 },
8789 /* Broker Connect Reply E1.33 Version */
8790 { &hf_rdmnet_broker_connect_reply_e133_version,
8791 { "E1.33 Version", "rdmnet.broker.connect_reply.e133_version",
8792 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
8793 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8794 },
8795 /* Broker Connect Reply Broker UID */
8796 { &hf_rdmnet_broker_connect_reply_broker_uid,
8797 { "Broker UID", "rdmnet.broker.connect_reply.broker_uid",
8798 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8799 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8800 },
8801 { &hf_rdmnet_broker_connect_reply_broker_uid_manf,
8802 { "Manufacturer ID", "rdmnet.broker.connect_reply.broker_uid.manf",
8803 FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0,
8804 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8805 },
8806 { &hf_rdmnet_broker_connect_reply_broker_uid_dev,
8807 { "Device ID", "rdmnet.broker.connect_reply.broker_uid.dev",
8808 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
8809 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8810 },
8811 /* Broker Connect Reply Client UID */
8812 { &hf_rdmnet_broker_connect_reply_client_uid,
8813 { "Client UID", "rdmnet.broker.connect_reply.client_uid",
8814 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8815 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8816 },
8817 { &hf_rdmnet_broker_connect_reply_client_uid_manf,
8818 { "Manufacturer ID", "rdmnet.broker.connect_reply.client_uid.manf",
8819 FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0,
8820 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8821 },
8822 { &hf_rdmnet_broker_connect_reply_client_uid_dev,
8823 { "Device ID", "rdmnet.broker.connect_reply.client_uid.dev",
8824 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
8825 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8826 },
8827 /* Broker Client Entry Update Connection Flags */
8828 { &hf_rdmnet_broker_client_entry_update_connection_flags,
8829 { "Flags", "rdmnet.broker.client_entry_update.flags",
8830 FT_UINT8, BASE_HEX, NULL((void*)0), 0x0,
8831 "Connection Flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8832 },
8833 { &hf_rdmnet_broker_client_entry_update_connection_flags_incremental_updates,
8834 { "Incremental Updates", "rdmnet.broker.client_entry_update.flags_incremental_updates",
8835 FT_BOOLEAN, 8, NULL((void*)0), RDMNET_BROKER_VECTOR_CONNECT_INCREMENTAL_UPDATES0x01,
8836 "Incremental updates flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8837 },
8838 /* Broker Redirect IPv4 Address */
8839 { &hf_rdmnet_broker_redirect_ipv4_address,
8840 { "IPv4 Address", "rdmnet.broker.redirect_ipv4.ipv4_address",
8841 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8842 "Redirect IPv4 address", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8843 },
8844 /* Broker Redirect IPv4 TCP Port */
8845 { &hf_rdmnet_broker_redirect_ipv4_tcp_port,
8846 { "IPv4 TCP Port", "rdmnet.broker.redirect_ipv4.tcp_port",
8847 FT_UINT16, BASE_PT_TCP, NULL((void*)0), 0x0,
8848 "Redirect IPv4 TCP port", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8849 },
8850 /* Broker Redirect IPv6 Address. TODO: is filter correct here? */
8851 { &hf_rdmnet_broker_redirect_ipv6_address,
8852 { "IPv6 Address", "rdmnet.broker.redirect_ipv6.ipv4_address",
8853 FT_IPv6, BASE_NONE, NULL((void*)0), 0x0,
8854 "Redirect IPv6 address", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8855 },
8856 /* Broker Redirect IPv6 TCP Port */
8857 { &hf_rdmnet_broker_redirect_ipv6_tcp_port,
8858 { "TCP Port", "rdmnet.broker.redirect_ipv6.tcp_port",
8859 FT_UINT16, BASE_PT_TCP, NULL((void*)0), 0x0,
8860 "Redirect IPv6 TCP port", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8861 },
8862 /* Broker Disconnect Reason */
8863 { &hf_rdmnet_broker_disconnect_reason,
8864 { "Reason", "rdmnet.broker.disconnect.reason",
8865 FT_UINT16, BASE_DEC, VALS(rdmnet_broker_disconnect_reason_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_broker_disconnect_reason_vals
))))
, 0x0,
8866 "Disconnect reason", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8867 },
8868 /* Broker Dynamic UID Request */
8869 { &hf_rdmnet_broker_dynamic_uid_request,
8870 { "Dynamic UID Request", "rdmnet.broker.request_dynamic_uids.dynamic_uid_request",
8871 FT_BYTES, SEP_DOT, NULL((void*)0), 0x0,
8872 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8873 },
8874 /* Broker RID */
8875 { &hf_rdmnet_broker_rid,
8876 { "RID", "rdmnet.broker.request_dynamic_uids.rid",
8877 FT_BYTES, SEP_DOT, NULL((void*)0), 0x0,
8878 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8879 },
8880 /* Broker Assigned Dynamic UID */
8881 { &hf_rdmnet_broker_assigned_dynamic_uid,
8882 { "Dynamic UID Request", "rdmnet.broker.assigned_dynamic_uids.dynamic_uid",
8883 FT_BYTES, SEP_DOT, NULL((void*)0), 0x0,
8884 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8885 },
8886 /* Broker Assigned RID */
8887 { &hf_rdmnet_broker_assigned_rid,
8888 { "RID", "rdmnet.broker.assigned_dynamic_uids.rid",
8889 FT_BYTES, SEP_DOT, NULL((void*)0), 0x0,
8890 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8891 },
8892 /* Broker_Assigned Status Code */
8893 { &hf_rdmnet_broker_assigned_status_code,
8894 { "Status Code", "rdmnet.broker.assigned_dynamic_uids.status_code",
8895 FT_UINT16, BASE_DEC, VALS(dynamic_uid_mapping_status_code_vals)((0 ? (const struct _value_string*)0 : ((dynamic_uid_mapping_status_code_vals
))))
, 0x0,
8896 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8897 },
8898 /* Broker Fetch Dynamic UID */
8899 { &hf_rdmnet_broker_fetch_dynamic_uid,
8900 { "Dynamic UID", "rdmnet.broker.fetch_dynamic_uids.dynamic_uid",
8901 FT_BYTES, SEP_DOT, NULL((void*)0), 0x0,
8902 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8903 },
8904 /* EPT Vector */
8905 { &hf_rdmnet_ept_vector,
8906 { "EPT Vector", "rdmnet.ept_vector",
8907 FT_UINT32, BASE_DEC, VALS(rdmnet_ept_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_ept_vector_vals
))))
, 0x0,
8908 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8909 },
8910 /* EPT Destination CID */
8911 { &hf_rdmnet_ept_destination_cid,
8912 { "Destination CID", "rdmnet.ept.destination_cid",
8913 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8914 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8915 },
8916 /* EPT Data PDU Length */
8917 { &hf_rdmnet_ept_data_pdu_length,
8918 { "Length", "rdmnet.ept.data.pdu.length",
8919 FT_UINT24, BASE_DEC, NULL((void*)0), 0x0,
8920 "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8921 },
8922 /* EPT Data Vector */
8923 { &hf_rdmnet_ept_data_vector,
8924 { "Vector", "rdmnet.ept.data.vector",
8925 FT_UINT32, BASE_HEX, NULL((void*)0), 0x0,
8926 "Data vector", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8927 },
8928 /* EPT Data Vector Manufacturer ID */
8929 { &hf_rdmnet_ept_data_vector_manufacturer_id,
8930 { "Manufac. ID", "rdmnet.ept.data.vector.manufacturer_id",
8931 FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0,
8932 "Manufacturer id", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8933 },
8934 /* EPT Data Vector Protocol ID */
8935 { &hf_rdmnet_ept_data_vector_protocol_id,
8936 { "Protocol", "rdmnet.ept.data.vector.protocol_id",
8937 FT_UINT16, BASE_HEX, NULL((void*)0), 0x0,
8938 "Protocol id", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8939 },
8940 /* EPT Data Opaque Data */
8941 { &hf_rdmnet_ept_data_opaque_data,
8942 { "Data", "rdmnet.ept.data.opaque_data",
8943 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8944 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8945 },
8946 /* EPT Status PDU Length */
8947 { &hf_rdmnet_ept_status_pdu_length,
8948 { "Length", "rdmnet.ept.status.pdu.length",
8949 FT_UINT24, BASE_DEC, NULL((void*)0), 0x0,
8950 "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8951 },
8952 /* EPT Status Unknown CID */
8953 { &hf_rdmnet_ept_status_unknown_cid,
8954 { "Unknown CID", "rdmnet.ept.status.unknown_cid",
8955 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8956 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8957 },
8958 /* EPT Status Status String */
8959 { &hf_rdmnet_ept_status_status_string,
8960 { "Status String", "rdmnet.ept.status.status_string",
8961 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8962 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8963 },
8964 /* EPT Status Vector */
8965 { &hf_rdmnet_ept_status_vector,
8966 { "Unknown Vector", "rdmnet.ept.status.vector",
8967 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8968 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8969 },
8970 /* EPT Status Unknown Vector */
8971 { &hf_rdmnet_ept_status_unknown_vector,
8972 { "Unknown Vector", "rdmnet.ept.status.unknown_vector",
8973 FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0,
8974 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8975 },
8976 /* EPT Status Vector String */
8977 { &hf_rdmnet_ept_status_vector_string,
8978 { "Vector String", "rdmnet.ept.status.vector_string",
8979 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
8980 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8981 }
8982 };
8983
8984 /* Setup protocol subtree array */
8985 static int *ett[] = {
8986 &ett_acn,
8987 &ett_acn_channel_owner_info_block,
8988 &ett_acn_channel_member_info_block,
8989 &ett_acn_channel_parameter,
8990 &ett_acn_address,
8991 &ett_acn_address_type,
8992 &ett_acn_pdu_flags,
8993 &ett_acn_dmp_pdu,
8994 &ett_acn_sdt_pdu,
8995 &ett_acn_sdt_client_pdu,
8996 &ett_acn_sdt_base_pdu,
8997 &ett_acn_root_pdu,
8998 &ett_acn_dmx_address,
8999 &ett_acn_dmx_2_options,
9000 &ett_acn_dmx_data_pdu,
9001 &ett_acn_dmx_pdu,
9002 &ett_acn_blob
9003 };
9004
9005 /* Setup protocol subtree array */
9006 static int *magic_ett[] = {
9007 &ett_magic
9008 };
9009
9010 /* Setup protocol subtree array */
9011 static int *rdmnet_ett[] = {
9012 &ett_rdmnet,
9013 &ett_rdmnet_pdu_flags,
9014 &ett_rdmnet_llrp_base_pdu,
9015 &ett_rdmnet_llrp_probe_request_pdu,
9016 &ett_rdmnet_llrp_probe_request_filter_flags,
9017 &ett_rdmnet_llrp_probe_reply_pdu,
9018 &ett_rdmnet_llrp_rdm_command_pdu,
9019 &ett_rdmnet_rpt_base_pdu,
9020 &ett_rdmnet_rpt_request_pdu,
9021 &ett_rdmnet_rpt_status_pdu,
9022 &ett_rdmnet_rpt_notification_pdu,
9023 &ett_rdmnet_broker_base_pdu,
9024 &ett_rdmnet_broker_client_entry_pdu,
9025 &ett_rdmnet_broker_client_entry_manufacturer_protocol_ids,
9026 &ett_rdmnet_broker_connect_connection_flags,
9027 &ett_rdmnet_broker_client_entry_update_connection_flags,
9028 &ett_rdmnet_ept_base_pdu,
9029 &ett_rdmnet_ept_data_pdu,
9030 &ett_rdmnet_ept_data_vector_pdu,
9031 &ett_rdmnet_ept_status_pdu,
9032 &ett_rdmnet_uid
9033 };
9034
9035 static ei_register_info ei[] = {
9036 { &ei_magic_reply_invalid_type, { "magic.reply.invalid_type", PI_PROTOCOL0x09000000, PI_WARN0x00600000, "Invalid type", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
9037 { &ei_acn_dmx_discovery_outofseq, { "acn.dmx.discovery.out_of_order_universes", PI_PROTOCOL0x09000000, PI_WARN0x00600000, "Universe list is unordered, E1.31 Sec. 8.5 requires sorted lists", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
9038 };
9039
9040 module_t *acn_module;
9041 expert_module_t* expert_acn;
9042
9043 proto_acn = proto_register_protocol("Architecture for Control Networks", "ACN", "acn");
9044
9045 proto_magic = proto_register_protocol("Magic Bullet", "MAGIC", "magic");
9046
9047 proto_rdmnet = proto_register_protocol("RDMnet", "RDMnet", "rdmnet");
9048
9049 proto_register_field_array(proto_acn, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0]));
9050 proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0]));
9051
9052 acn_module = prefs_register_protocol(proto_acn, NULL((void*)0));
9053 prefs_register_obsolete_preference(acn_module, "heuristic_acn");
9054
9055 prefs_register_bool_preference(acn_module, "dmx_enable",
9056 "Streaming DMX",
9057 "Enable Streaming DMX extension dissector (ANSI BSR E1.31)",
9058 &global_acn_dmx_enable);
9059
9060 prefs_register_enum_preference(acn_module, "dmx_display_view",
9061 "DMX, display format",
9062 "Display format",
9063 &global_acn_dmx_display_view,
9064 dmx_display_view,
9065 true1);
9066
9067 prefs_register_bool_preference(acn_module, "dmx_display_zeros",
9068 "DMX, display zeros",
9069 "Display zeros instead of dots",
9070 &global_acn_dmx_display_zeros);
9071
9072 prefs_register_bool_preference(acn_module, "dmx_display_leading_zeros",
9073 "DMX, display leading zeros",
9074 "Display leading zeros on levels",
9075 &global_acn_dmx_display_leading_zeros);
9076
9077 prefs_register_enum_preference(acn_module, "dmx_display_line_format",
9078 "DMX, display line format",
9079 "Display line format",
9080 &global_acn_dmx_display_line_format,
9081 dmx_display_line_format,
9082 true1);
9083
9084 proto_register_field_array(proto_magic, magic_hf, array_length(magic_hf)(sizeof (magic_hf) / sizeof (magic_hf)[0]));
9085 proto_register_subtree_array(magic_ett, array_length(magic_ett)(sizeof (magic_ett) / sizeof (magic_ett)[0]));
9086 expert_acn = expert_register_protocol(proto_magic);
9087 expert_register_field_array(expert_acn, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0]));
9088
9089 proto_register_field_array(proto_rdmnet, rdmnet_hf, array_length(rdmnet_hf)(sizeof (rdmnet_hf) / sizeof (rdmnet_hf)[0]));
9090 proto_register_subtree_array(rdmnet_ett, array_length(rdmnet_ett)(sizeof (rdmnet_ett) / sizeof (rdmnet_ett)[0]));
9091
9092 acn_handle = register_dissector("acn", dissect_acn, proto_acn);
9093}
9094
9095
9096/******************************************************************************/
9097/* Register handoff */
9098void
9099proto_reg_handoff_acn(void)
9100{
9101 dissector_add_for_decode_as_with_preference("udp.port", acn_handle);
9102
9103 rdm_handle = find_dissector_add_dependency("rdm", proto_acn);
9104
9105 heur_dissector_add("udp", dissect_acn_heur, "ACN over UDP", "acn", proto_acn, HEURISTIC_DISABLE);
9106 heur_dissector_add("udp", dissect_rdmnet_over_udp_heur, "RDMnet over UDP (LLRP)", "rdmnet_udp", proto_acn, HEURISTIC_DISABLE);
9107 heur_dissector_add("tcp", dissect_rdmnet_over_tcp_heur, "RDMnet over TCP (Broker, RPT, EPT)", "rdmnet_tcp", proto_acn, HEURISTIC_DISABLE);
9108}
9109
9110/*
9111 * Editor modelines
9112 *
9113 * Local Variables:
9114 * c-basic-offset: 2
9115 * tab-width: 8
9116 * indent-tabs-mode: nil
9117 * End:
9118 *
9119 * ex: set shiftwidth=2 tabstop=8 expandtab:
9120 * :indentSize=2:tabSize=8:noTabs=true:
9121 */