### 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

Show analyzer invocation
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

Keyboard shortcuts:

- Use 'j/k' keys for keyboard navigation
- Use 'Shift+S' to show/hide relevant lines
- Use '?' to toggle this window

Close
Show only relevant lines Show control flow arrows

1 | /* packet-acn.c
2 | * Routines for ACN packet disassembly
3 | *
4 | * Copyright (c) 2003 by Erwin Rol <erwin@erwinrol.com>
5 | * Copyright (c) 2006 by Electronic Theatre Controls, Inc.
6 | * Bill Florac <bflorac@etcconnect.com>
7 | *
8 | * Wireshark - Network traffic analyzer
9 | * By Gerald Combs <gerald@wireshark.org>
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 */
40 | void proto_register_acn(void);
41 | void proto_reg_handoff_acn(void);
42 |
43 | static 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 |
429 | typedef 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 |
438 | typedef 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 */
457 | static uint32_t acn_add_address(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, const char *label);
458 | static int dissect_acn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data);
459 | static int dissect_rdmnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t data_offset, bool_Bool is_udp);
460 |
461 | /* Global variables */
462 | static int proto_acn;
463 | static int ett_acn;
464 | static int ett_acn_channel_owner_info_block;
465 | static int ett_acn_channel_member_info_block;
466 | static int ett_acn_channel_parameter;
467 | static int ett_acn_address;
468 | static int ett_acn_address_type;
469 | static int ett_acn_blob;
470 | static int ett_acn_pdu_flags;
471 | static int ett_acn_dmp_pdu;
472 | static int ett_acn_sdt_pdu;
473 | static int ett_acn_sdt_client_pdu;
474 | static int ett_acn_sdt_base_pdu;
475 | static int ett_acn_root_pdu;
476 |
477 | static int ett_acn_dmx_address;
478 | static int ett_acn_dmx_2_options;
479 | static int ett_acn_dmx_data_pdu;
480 | static int ett_acn_dmx_pdu;
481 |
482 | static int ett_rdmnet_pdu_flags;
483 | static int ett_rdmnet_llrp_base_pdu;
484 | static int ett_rdmnet_llrp_probe_request_pdu;
485 | static int ett_rdmnet_llrp_probe_request_filter_flags;
486 | static int ett_rdmnet_llrp_probe_reply_pdu;
487 | static int ett_rdmnet_llrp_rdm_command_pdu;
488 |
489 | static int ett_rdmnet_broker_base_pdu;
490 | static int ett_rdmnet_broker_client_entry_pdu;
491 | static int ett_rdmnet_broker_client_entry_manufacturer_protocol_ids;
492 | static int ett_rdmnet_broker_connect_connection_flags;
493 | static int ett_rdmnet_broker_client_entry_update_connection_flags;
494 |
495 | static int ett_rdmnet_rpt_base_pdu;
496 | static int ett_rdmnet_rpt_request_pdu;
497 | static int ett_rdmnet_rpt_status_pdu;
498 | static int ett_rdmnet_rpt_notification_pdu;
499 |
500 | static int ett_rdmnet_ept_base_pdu;
501 | static int ett_rdmnet_ept_data_pdu;
502 | static int ett_rdmnet_ept_data_vector_pdu;
503 | static int ett_rdmnet_ept_status_pdu;
504 |
505 | static int ett_rdmnet_uid;
506 |
507 | static expert_field ei_acn_dmx_discovery_outofseq;
508 |
509 | /* Register fields */
510 | /* In alphabetical order */
511 | static int hf_acn_association;
512 | static int hf_acn_blob;
513 | /* static int hf_acn_blob_dimmer_load_properties2_type; */
514 | static int hf_acn_blob_field_length;
515 | static int hf_acn_blob_field_type;
516 | static int hf_acn_blob_field_value_number;
517 | static int hf_acn_blob_field_value_number64;
518 | static int hf_acn_blob_field_value_ipv4;
519 | static int hf_acn_blob_field_value_ipv6;
520 | static int hf_acn_blob_field_value_float;
521 | static int hf_acn_blob_field_value_double;
522 | static int hf_acn_blob_field_value_guid;
523 | static int hf_acn_blob_field_value_string;
524 | /* static int hf_acn_blob_metadata_types_type; */
525 | static int hf_acn_blob_range_number;
526 | /* static int hf_acn_blob_range_start; */
527 | static int hf_acn_blob_range_type;
528 | static int hf_acn_blob_tree_field_type;
529 | static int hf_acn_blob_type;
530 | static int hf_acn_blob_version;
531 | static int hf_acn_blob_time_zone;
532 | static int hf_acn_blob_dst_type;
533 | static int hf_acn_blob_dst_start_day;
534 | static int hf_acn_blob_dst_stop_day;
535 | static int hf_acn_blob_dst_start_locality;
536 | static int hf_acn_blob_dst_stop_locality;
537 | static int hf_acn_channel_number;
538 | static int hf_acn_cid;
539 | /* static int hf_acn_client_protocol_id; */
540 | static int hf_acn_data;
541 | static int hf_acn_data8;
542 | static int hf_acn_data16;
543 | static int hf_acn_data24;
544 | static int hf_acn_data32;
545 | /* static int hf_acn_dmp_adt; */ /* address and data type*/
546 | static int hf_acn_dmp_adt_a;
547 | static int hf_acn_dmp_adt_v;
548 | static int hf_acn_dmp_adt_r;
549 | static int hf_acn_dmp_adt_d;
550 | static int hf_acn_dmp_adt_x;
551 | static int hf_acn_dmp_reason_code;
552 | static int hf_acn_dmp_vector;
553 | static int hf_acn_dmp_actual_address;
554 | static int hf_acn_dmp_virtual_address;
555 | static int hf_acn_dmp_actual_address_first;
556 | static int hf_acn_dmp_virtual_address_first;
557 | static int hf_acn_expiry;
558 | static int hf_acn_first_member_to_ack;
559 | static int hf_acn_first_missed_sequence;
560 | static int hf_acn_ip_address_type;
561 | static int hf_acn_ipv4;
562 | static int hf_acn_ipv6;
563 | static int hf_acn_last_member_to_ack;
564 | static int hf_acn_last_missed_sequence;
565 | static int hf_acn_mak_threshold;
566 | static int hf_acn_member_id;
567 | static int hf_acn_nak_holdoff;
568 | static int hf_acn_nak_max_wait;
569 | static int hf_acn_nak_modulus;
570 | static int hf_acn_nak_outbound_flag;
571 | static int hf_acn_oldest_available_wrapper;
572 | static int hf_acn_packet_identifier;
573 | static int hf_acn_pdu;
574 | static int hf_acn_pdu_flag_d;
575 | static int hf_acn_pdu_flag_h;
576 | static int hf_acn_pdu_flag_l;
577 | static int hf_acn_pdu_flag_v;
578 | static int hf_acn_pdu_flags;
579 | static int hf_acn_pdu_length;
580 | static int hf_acn_port;
581 | static int hf_acn_postamble_size;
582 | static int hf_acn_preamble_size;
583 | static int hf_acn_protocol_id;
584 | static int hf_acn_reason_code;
585 | static int hf_acn_reciprocal_channel;
586 | static int hf_acn_refuse_code;
587 | static int hf_acn_reliable_sequence_number;
588 | static int hf_acn_adhoc_expiry;
589 | /* static int hf_acn_sdt_pdu; */
590 | static int hf_acn_sdt_vector;
591 |
592 | static int hf_acn_dmx_vector;
593 | static int hf_acn_dmx_extension_vector;
594 | /* static int hf_acn_session_count; */
595 | static int hf_acn_total_sequence_number;
596 | static int hf_acn_dmx_source_name;
597 | static int hf_acn_dmx_priority;
598 | static int hf_acn_dmx_2_sync_universe;
599 | static int hf_acn_dmx_3_reserved;
600 | static int hf_acn_dmx_sequence_number;
601 | static int hf_acn_dmx_2_options;
602 | static int hf_acn_dmx_2_option_p;
603 | static int hf_acn_dmx_2_option_s;
604 | static int hf_acn_dmx_2_option_f;
605 | static int hf_acn_dmx_universe;
606 |
607 | static int hf_acn_dmx_start_code;
608 | static int hf_acn_dmx_2_first_property_address;
609 | static int hf_acn_dmx_increment;
610 | static int hf_acn_dmx_count;
611 | static int hf_acn_dmx_2_start_code;
612 | static int hf_acn_dmx_data;
613 |
614 | static int hf_acn_postamble_key_fingerprint;
615 | static int hf_acn_postamble_seq_type;
616 | static int hf_acn_postamble_seq_hi;
617 | static int hf_acn_postamble_seq_low;
618 | static int hf_acn_postamble_message_digest;
619 |
620 | static int hf_acn_dmx_discovery_framing_reserved;
621 | static int hf_acn_dmx_discovery_page;
622 | static int hf_acn_dmx_discovery_last_page;
623 | static int hf_acn_dmx_discovery_vector;
624 | static int hf_acn_dmx_discovery_universe_list;
625 |
626 | static int hf_acn_dmx_sync_universe;
627 | static int hf_acn_dmx_sync_reserved;
628 |
629 | /* static int hf_acn_dmx_dmp_vector; */
630 |
631 | /* Try heuristic ACN decode */
632 | static bool_Bool global_acn_dmx_enable;
633 | static int global_acn_dmx_display_view;
634 | static int global_acn_dmx_display_line_format;
635 | static bool_Bool global_acn_dmx_display_zeros;
636 | static bool_Bool global_acn_dmx_display_leading_zeros;
637 |
638 | static int proto_magic;
639 | static int ett_magic;
640 |
641 | /* Register fields */
642 | static int hf_magic_protocol_id;
643 | static int hf_magic_pdu_subtype;
644 | static int hf_magic_major_version;
645 | static int hf_magic_minor_version;
646 |
647 | static int hf_magic_v1command_vals;
648 |
649 | static int hf_magic_command_vals;
650 | static int hf_magic_command_beacon_duration;
651 | static int hf_magic_command_tftp;
652 | static int hf_magic_command_reset_lease;
653 | static int hf_magic_command_cid;
654 | static int hf_magic_command_ip_configuration;
655 | static int hf_magic_command_ip_address;
656 | static int hf_magic_command_subnet_mask;
657 | static int hf_magic_command_gateway;
658 |
659 | static int hf_magic_reply_ip_address;
660 | static int hf_magic_reply_subnet_mask;
661 | static int hf_magic_reply_gateway;
662 | static int hf_magic_reply_tftp;
663 |
664 | static int hf_magic_reply_version;
665 | static int hf_magic_reply_device_type_name;
666 | static int hf_magic_reply_default_name;
667 | static int hf_magic_reply_user_name;
668 | static int hf_magic_reply_cid;
669 | static int hf_magic_reply_dcid;
670 |
671 | static expert_field ei_magic_reply_invalid_type;
672 |
673 |
674 | static int proto_rdmnet;
675 | static int ett_rdmnet;
676 |
677 | /* Register fields */
678 | static int hf_rdmnet_cid;
679 | static int hf_rdmnet_packet_identifier;
680 | static int hf_rdmnet_pdu;
681 | static int hf_rdmnet_pdu_flag_d;
682 | static int hf_rdmnet_pdu_flag_h;
683 | static int hf_rdmnet_pdu_flag_l;
684 | static int hf_rdmnet_pdu_flag_v;
685 | static int hf_rdmnet_pdu_flags;
686 | static int hf_rdmnet_pdu_length;
687 | static int hf_rdmnet_postamble_size;
688 | static int hf_rdmnet_preamble_size;
689 | static int hf_rdmnet_protocol_id;
690 | static int hf_rdmnet_tcp_length;
691 |
692 | static int hf_rdmnet_llrp_vector;
693 | static int hf_rdmnet_llrp_destination_cid;
694 | static int hf_rdmnet_llrp_transaction_number;
695 | static int hf_rdmnet_llrp_probe_request_vector;
696 | static int hf_rdmnet_llrp_probe_request_pdu_length;
697 | static int hf_rdmnet_llrp_probe_request_lower_uid;
698 | static int hf_rdmnet_llrp_probe_request_upper_uid;
699 | static int hf_rdmnet_llrp_probe_request_filter;
700 | static int hf_rdmnet_llrp_probe_request_filter_client_tcp_inactive;
701 | static int hf_rdmnet_llrp_probe_request_filter_brokers_only;
702 | static int hf_rdmnet_llrp_probe_request_known_uid;
703 | static int hf_rdmnet_llrp_probe_request_known_uid_manf;
704 | static int hf_rdmnet_llrp_probe_request_known_uid_dev;
705 |
706 | static int hf_rdmnet_llrp_probe_reply_vector;
707 | static int hf_rdmnet_llrp_probe_reply_uid;
708 | static int hf_rdmnet_llrp_probe_reply_uid_manf;
709 | static int hf_rdmnet_llrp_probe_reply_uid_dev;
710 | static int hf_rdmnet_llrp_probe_reply_hardware_address;
711 | static int hf_rdmnet_llrp_probe_reply_component_type;
712 | static int hf_rdmnet_llrp_rdm_command_start_code;
713 |
714 | static int hf_rdmnet_rpt_vector;
715 | static int hf_rdmnet_rpt_source_uid;
716 | static int hf_rdmnet_rpt_source_uid_manf;
717 | static int hf_rdmnet_rpt_source_uid_dev;
718 | static int hf_rdmnet_rpt_source_endpoint_id;
719 | static int hf_rdmnet_rpt_destination_uid;
720 | static int hf_rdmnet_rpt_destination_uid_manf;
721 | static int hf_rdmnet_rpt_destination_uid_dev;
722 | static int hf_rdmnet_rpt_destination_endpoint_id;
723 | static int hf_rdmnet_rpt_sequence_number;
724 | static int hf_rdmnet_rpt_reserved;
725 | static int hf_rdmnet_rpt_request_vector;
726 | static int hf_rdmnet_rpt_request_rdm_command;
727 | static int hf_rdmnet_rpt_status_vector;
728 | static int hf_rdmnet_rpt_status_unknown_rpt_uid_string;
729 | static int hf_rdmnet_rpt_status_rdm_timeout_string;
730 | static int hf_rdmnet_rpt_status_rdm_invalid_response_string;
731 | static int hf_rdmnet_rpt_status_unknown_rdm_uid_string;
732 | static int hf_rdmnet_rpt_status_unknown_endpoint_string;
733 | static int hf_rdmnet_rpt_status_broadcast_complete_string;
734 | static int hf_rdmnet_rpt_status_unknown_vector_string;
735 | static int hf_rdmnet_rpt_notification_vector;
736 | static int hf_rdmnet_rpt_notification_rdm_command;
737 |
738 | static int hf_rdmnet_broker_vector;
739 | static int hf_rdmnet_broker_client_protocol_vector;
740 | static int hf_rdmnet_broker_client_protocol_cid;
741 | static int hf_rdmnet_broker_client_rpt_client_uid;
742 | static int hf_rdmnet_broker_client_rpt_client_uid_manf;
743 | static int hf_rdmnet_broker_client_rpt_client_uid_dev;
744 | static int hf_rdmnet_broker_client_rpt_client_type;
745 | static int hf_rdmnet_broker_client_rpt_binding_cid;
746 | static int hf_rdmnet_broker_client_ept_protocol_vector;
747 | static int hf_rdmnet_broker_client_ept_protocol_manufacturer_id;
748 | static int hf_rdmnet_broker_client_ept_protocol_protocol_id;
749 | static int hf_rdmnet_broker_client_ept_protocol_string;
750 | static int hf_rdmnet_broker_connect_client_scope;
751 | static int hf_rdmnet_broker_connect_e133_version;
752 | static int hf_rdmnet_broker_connect_search_domain;
753 | static int hf_rdmnet_broker_connect_connection_flags;
754 | static int hf_rdmnet_broker_connect_connection_flags_incremental_updates;
755 | static int hf_rdmnet_broker_connect_reply_connection_code;
756 | static int hf_rdmnet_broker_connect_reply_e133_version;
757 | static int hf_rdmnet_broker_connect_reply_broker_uid;
758 | static int hf_rdmnet_broker_connect_reply_broker_uid_manf;
759 | static int hf_rdmnet_broker_connect_reply_broker_uid_dev;
760 | static int hf_rdmnet_broker_connect_reply_client_uid;
761 | static int hf_rdmnet_broker_connect_reply_client_uid_manf;
762 | static int hf_rdmnet_broker_connect_reply_client_uid_dev;
763 | static int hf_rdmnet_broker_client_entry_update_connection_flags;
764 | static int hf_rdmnet_broker_client_entry_update_connection_flags_incremental_updates;
765 | static int hf_rdmnet_broker_redirect_ipv4_address;
766 | static int hf_rdmnet_broker_redirect_ipv4_tcp_port;
767 | static int hf_rdmnet_broker_redirect_ipv6_address;
768 | static int hf_rdmnet_broker_redirect_ipv6_tcp_port;
769 | static int hf_rdmnet_broker_disconnect_reason;
770 | static int hf_rdmnet_broker_dynamic_uid_request;
771 | static int hf_rdmnet_broker_rid;
772 | static int hf_rdmnet_broker_assigned_dynamic_uid;
773 | static int hf_rdmnet_broker_assigned_rid;
774 | static int hf_rdmnet_broker_assigned_status_code;
775 | static int hf_rdmnet_broker_fetch_dynamic_uid;
776 |
777 | static int hf_rdmnet_ept_vector;
778 | static int hf_rdmnet_ept_destination_cid;
779 | static int hf_rdmnet_ept_data_pdu_length;
780 | static int hf_rdmnet_ept_data_vector;
781 | static int hf_rdmnet_ept_data_vector_manufacturer_id;
782 | static int hf_rdmnet_ept_data_vector_protocol_id;
783 | static int hf_rdmnet_ept_data_opaque_data;
784 | static int hf_rdmnet_ept_status_pdu_length;
785 | static int hf_rdmnet_ept_status_vector;
786 | static int hf_rdmnet_ept_status_unknown_cid;
787 | static int hf_rdmnet_ept_status_status_string;
788 | static int hf_rdmnet_ept_status_unknown_vector;
789 | static int hf_rdmnet_ept_status_vector_string;
790 |
791 | static 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 |
805 | static 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 |
811 | static 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 |
817 | static 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 |
825 | static 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 |
834 | static 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 |
856 | static const value_string acn_dmx_vector_vals[] = {
857 | { ACN_DMX_VECTOR2, "Streaming DMX"},
858 | { 0, NULL((void*)0) },
859 | };
860 |
861 | static 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 |
867 | static 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 |
872 | static 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 |
881 | static 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 | };
959 | static 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 |
961 | static 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 | };
1016 | static 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 |
1018 | static 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 | };
1076 | static 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 |
1078 | static 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 | };
1181 | static 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 |
1183 | static 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 | };
1211 | static 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 |
1214 | static 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 |
1223 | static 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 |
1242 | static 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 |
1258 | static 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 |
1266 | static 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 |
1273 | static 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 |
1292 | static 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 |
1311 | static 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 |
1320 | static 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 |
1339 | static 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 |
1352 | static 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 |
1369 | static 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 | };
1422 | static 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 |
1424 | static 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 | };
1499 | static 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 |
1501 | static 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 | };
1550 | static 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 |
1553 | static 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 | };
1591 | static 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 |
1593 | static 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 | };
1620 | static 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 |
1622 | static 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 |
1629 | static 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 | };
1841 | static 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 |
1843 | static 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 |
1851 | static 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 |
1860 | static 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 |
1878 | static 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 |
1886 | static 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 |
1912 | static 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 |
1922 | static 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 |
1933 | static 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 |
1960 | static 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 |
2434 | static 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 |
2442 | static 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 |
2459 | static 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 |
2469 | static 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 |
2480 | static const value_string acn_blob_time3_locality_vals[] = {
2481 | { 0, "LOCAL" },
2482 | { 1, "UTC" },
2483 | { 0, NULL((void*)0) }
2484 | };
2485 |
2486 | static 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 |
2493 | static 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 |
2501 | static 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 | };
2711 | static 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 |
2713 | static 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 |
2751 | static 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 |
2773 | static 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 |
2781 | static 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 |
2791 | static 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 |
2803 | static 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 |
2818 | static 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 |
2825 | static 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 |
2832 | static 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 |
2840 | static 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 |
2847 | static 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 |
2864 | static 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 |
2870 | static 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 |
2877 | static 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 |
2884 | static 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 |
2891 | static const value_string rdmnet_llrp_probe_request_vals[] = {
2892 | { VECTOR_PROBE_REQUEST_DATA0x01, "Vector probe request data" },
2893 | { 0, NULL((void*)0) }
2894 | };
2895 |
2896 | static const value_string rdmnet_llrp_probe_reply_vals[] = {
2897 | { VECTOR_PROBE_REPLY_DATA0x01, "Vector probe reply data" },
2898 | { 0, NULL((void*)0) }
2899 | };
2900 |
2901 | static 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 |
2909 | static 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 |
2914 | static 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 |
2927 | static 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 |
2934 | static const value_string rdmnet_rpt_request_vals[] = {
2935 | { RDMNET_RPT_VECTOR_REQUEST_RDM_CMD0x01, "RDM Command" },
2936 | { 0, NULL((void*)0) }
2937 | };
2938 |
2939 | static 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 |
2952 | static const value_string rdmnet_rpt_notification_vals[] = {
2953 | { RDMNET_RPT_VECTOR_NOTIFICATION_RDM_CMD0x01, "RDM Command" },
2954 | { 0, NULL((void*)0) }
2955 | };
2956 |
2957 | static 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 |
2962 | static 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 |
2981 | static 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 |
2991 | static 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 |
3000 | static 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 |
3006 | static 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 |
3012 | static 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 |
3018 | static dissector_handle_t rdm_handle;
3019 |
3020 | /******************************************************************************/
3021 | /* Test to see if it is a Magic Bullet Packet */
3022 | static bool_Bool
3023 | is_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 */
3035 | static int
3036 | dissect_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 */
3230 | static bool_Bool
3231 | is_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 */
3261 | static bool_Bool
3262 | is_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 */
3300 | static bool_Bool
3301 | is_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 */
3319 | static bool_Bool
3320 | is_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 */
3334 | static bool_Bool
3335 | dissect_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 */
3359 | static bool_Bool
3360 | dissect_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 |
3372 | static int
3373 | dissect_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 |
3384 | static unsigned
3385 | get_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 |
3390 | static int
3391 | dissect_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 */
3401 | static bool_Bool
3402 | dissect_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 */
3415 | static uint32_t
3416 | acn_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 */
3444 | static uint32_t
3445 | acn_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 */
3478 | static uint32_t
3479 | acn_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 */
3489 | static uint32_t
3490 | acn_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 */
3512 | static uint32_t
3513 | acn_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 */
3576 | static uint32_t
3577 | acn_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 */
3603 | static uint32_t
3604 | acn_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 */
3785 | static uint32_t
3786 | acn_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 */
4021 | static uint32_t
4022 | acn_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 */
4116 | static void
4117 | get_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 */
4194 | static const char *
4195 | get_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 */
4324 | static void
4325 | display_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 */
4462 | static void
4463 | display_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 */
4550 | static uint32_t
4551 | dissect_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 */
4575 | static uint32_t
4576 | dissect_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 */
4626 | static uint32_t
4627 | dissect_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 */
4653 | static uint32_t
4654 | dissect_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
4714 | Both "Dimmer Properties v2" and "Preset Properties" ended up with blob type 20 */
4715 | static uint8_t
4716 | get_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 */
4745 | static uint32_t
4746 | dissect_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 */
4810 | static void
4811 | dissect_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 */
4839 | static void
4840 | dissect_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 */
4857 | static void
4858 | dissect_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 */
4875 | static void
4876 | dissect_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 */
4896 | static void
4897 | begin_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 */
4937 | static uint32_t
4938 | dissect_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 */
5208 | static uint32_t
5209 | dissect_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 */
5299 | static uint32_t
5300 | dissect_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() */
5388 | static char *
5389 | ltos(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
5433 | static uint32_t
5434 | dissect_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 */
5633 | static void
5634 | dissect_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
5654 | static uint32_t
5655 | dissect_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 */
5770 | static uint32_t
5771 | dissect_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 */
5837 | static uint32_t
5838 | dissect_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 */
5934 | static uint32_t
5935 | dissect_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 */
6110 | static uint32_t
6111 | rdmnet_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 */
6128 | static uint32_t
6129 | dissect_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 */
6191 | static uint32_t
6192 | dissect_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 */
6238 | static uint32_t
6239 | dissect_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 */
6264 | static uint32_t
6265 | dissect_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 */
6311 | static uint32_t
6312 | dissect_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 */
6375 | static uint32_t
6376 | dissect_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 */
6453 | static uint32_t
6454 | dissect_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 */
6489 | static uint32_t
6490 | dissect_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 */
6514 | static uint32_t
6515 | dissect_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 */
6539 | static uint32_t
6540 | dissect_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 */
6555 | static uint32_t
6556 | dissect_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 */
6571 | static uint32_t
6572 | dissect_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 */
6583 | static uint32_t
6584 | dissect_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 */
6603 | static uint32_t
6604 | dissect_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 */
6627 | static uint32_t
6628 | dissect_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 */
6643 | static uint32_t
6644 | dissect_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 */
6733 | static uint32_t
6734 | dissect_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 */
6776 | static uint32_t
6777 | dissect_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 */
6819 | static uint32_t
6820 | dissect_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 */
6903 | static uint32_t
6904 | dissect_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 */
6946 | static uint32_t
6947 | dissect_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 */
6996 | static uint32_t
6997 | dissect_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 */
7073 | static uint32_t
7074 | dissect_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 */
7114 | static uint32_t
7115 | dissect_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 */
7169 | static uint32_t
7170 | dissect_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 */
7222 | static uint32_t
7223 | dissect_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 */
7257 | static uint32_t
7258 | dissect_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 */
7381 | static int
7382 | dissect_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 */
7437 | static int
7438 | dissect_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 */
7496 | void
7497 | proto_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 */
9098 | void
9099 | proto_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 | */