Coverage Report

Created: 2025-08-04 07:15

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