| File: | epan/dissectors/packet-acn.c |
| Warning: | line 6505, column 3 Value stored to 'offset' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* packet-acn.c |
| 2 | * Routines for ACN packet disassembly |
| 3 | * |
| 4 | * Copyright (c) 2003 by Erwin Rol <[email protected]> |
| 5 | * Copyright (c) 2006 by Electronic Theatre Controls, Inc. |
| 6 | * Bill Florac <[email protected]> |
| 7 | * |
| 8 | * Wireshark - Network traffic analyzer |
| 9 | * By Gerald Combs <[email protected]> |
| 10 | * Copyright 1999 Gerald Combs |
| 11 | * |
| 12 | * SPDX-License-Identifier: GPL-2.0-or-later |
| 13 | */ |
| 14 | |
| 15 | /* |
| 16 | Todo: |
| 17 | Add reading of DDL files so we can further explode DMP packets |
| 18 | For some of the Set/Get properties where we have a range of data |
| 19 | it would be better to show the block of data rather and |
| 20 | address-data pair on each line... |
| 21 | |
| 22 | Build CID to "Name" table from file so we can display real names |
| 23 | rather than CIDs |
| 24 | */ |
| 25 | |
| 26 | /* Include files */ |
| 27 | |
| 28 | #include "config.h" |
| 29 | |
| 30 | #include <epan/packet.h> |
| 31 | #include <epan/prefs.h> |
| 32 | #include <epan/strutil.h> |
| 33 | #include <epan/to_str.h> |
| 34 | #include <epan/expert.h> |
| 35 | |
| 36 | #include "packet-tcp.h" |
| 37 | #include "packet-dmx-manfid.h" |
| 38 | |
| 39 | /* Forward declarations */ |
| 40 | void proto_register_acn(void); |
| 41 | void proto_reg_handoff_acn(void); |
| 42 | |
| 43 | static dissector_handle_t acn_handle; |
| 44 | |
| 45 | /* pdu flags */ |
| 46 | #define ACN_PDU_FLAG_L0x80 0x80 |
| 47 | #define ACN_PDU_FLAG_V0x40 0x40 |
| 48 | #define ACN_PDU_FLAG_H0x20 0x20 |
| 49 | #define ACN_PDU_FLAG_D0x10 0x10 |
| 50 | |
| 51 | #define ACN_DMX_OPTION_P0x80 0x80 |
| 52 | #define ACN_DMX_OPTION_S0x40 0x40 |
| 53 | #define ACN_DMX_OPTION_F0x20 0x20 |
| 54 | |
| 55 | #define ACN_DMP_ADT_FLAG_V0x80 0x80 /* V = Specifies whether address is a virtual address or not. */ |
| 56 | #define ACN_DMP_ADT_FLAG_R0x40 0x40 /* R = Specifies whether address is relative to last valid address in packet or not. */ |
| 57 | #define ACN_DMP_ADT_FLAG_D0x30 0x30 /* D1, D0 = Specify non-range or range address, single data, equal size |
| 58 | or mixed size data array */ |
| 59 | #define ACN_DMP_ADT_EXTRACT_D(f)(((f) & 0x30) >> 4) (((f) & ACN_DMP_ADT_FLAG_D0x30) >> 4) |
| 60 | |
| 61 | #define ACN_DMP_ADT_FLAG_X0x0c 0x0c /* X1, X0 = These bits are reserved and their values shall be set to 0 |
| 62 | when encoded. Their values shall be ignored when decoding. */ |
| 63 | |
| 64 | #define ACN_DMP_ADT_FLAG_A0x03 0x03 /* A1, A0 = Size of Address elements */ |
| 65 | #define ACN_DMP_ADT_EXTRACT_A(f)((f) & 0x03) ((f) & ACN_DMP_ADT_FLAG_A0x03) |
| 66 | |
| 67 | #define ACN_DMP_ADT_V_ACTUAL0 0 |
| 68 | #define ACN_DMP_ADT_V_VIRTUAL1 1 |
| 69 | |
| 70 | #define ACN_DMP_ADT_R_ABSOLUTE0 0 |
| 71 | #define ACN_DMP_ADT_R_RELATIVE1 1 |
| 72 | |
| 73 | #define ACN_DMP_ADT_D_NS0 0 |
| 74 | #define ACN_DMP_ADT_D_RS1 1 |
| 75 | #define ACN_DMP_ADT_D_RE2 2 |
| 76 | #define ACN_DMP_ADT_D_RM3 3 |
| 77 | |
| 78 | #define ACN_DMP_ADT_A_10 0 |
| 79 | #define ACN_DMP_ADT_A_21 1 |
| 80 | #define ACN_DMP_ADT_A_42 2 |
| 81 | #define ACN_DMP_ADT_A_R3 3 |
| 82 | |
| 83 | #define ACN_PROTOCOL_ID_SDT0x00000001 0x00000001 |
| 84 | #define ACN_PROTOCOL_ID_DMP0x00000002 0x00000002 |
| 85 | #define ACN_PROTOCOL_ID_DMX0x00000003 0x00000003 |
| 86 | #define ACN_PROTOCOL_ID_DMX_20x00000004 0x00000004 |
| 87 | #define ACN_PROTOCOL_ID_RPT0x00000005 0x00000005 |
| 88 | #define ACN_PROTOCOL_ID_EXTENDED0x00000008 0x00000008 |
| 89 | #define ACN_PROTOCOL_ID_BROKER0x00000009 0x00000009 |
| 90 | #define ACN_PROTOCOL_ID_LLRP0x0000000A 0x0000000A |
| 91 | #define ACN_PROTOCOL_ID_EPT0x0000000B 0x0000000B |
| 92 | #define ACN_PROTOCOL_ID_DMX_30x50430001 0x50430001 |
| 93 | |
| 94 | #define ACN_ADDR_NULL0 0 |
| 95 | #define ACN_ADDR_IPV41 1 |
| 96 | #define ACN_ADDR_IPV62 2 |
| 97 | #define ACN_ADDR_IPPORT3 3 |
| 98 | |
| 99 | /* SDT Messages */ |
| 100 | #define ACN_SDT_VECTOR_UNKNOWN0 0 |
| 101 | #define ACN_SDT_VECTOR_REL_WRAP1 1 |
| 102 | #define ACN_SDT_VECTOR_UNREL_WRAP2 2 |
| 103 | #define ACN_SDT_VECTOR_CHANNEL_PARAMS3 3 |
| 104 | #define ACN_SDT_VECTOR_JOIN4 4 |
| 105 | #define ACN_SDT_VECTOR_JOIN_REFUSE5 5 |
| 106 | #define ACN_SDT_VECTOR_JOIN_ACCEPT6 6 |
| 107 | #define ACN_SDT_VECTOR_LEAVE7 7 |
| 108 | #define ACN_SDT_VECTOR_LEAVING8 8 |
| 109 | #define ACN_SDT_VECTOR_CONNECT9 9 |
| 110 | #define ACN_SDT_VECTOR_CONNECT_ACCEPT10 10 |
| 111 | #define ACN_SDT_VECTOR_CONNECT_REFUSE11 11 |
| 112 | #define ACN_SDT_VECTOR_DISCONNECT12 12 |
| 113 | #define ACN_SDT_VECTOR_DISCONNECTING13 13 |
| 114 | #define ACN_SDT_VECTOR_ACK14 14 |
| 115 | #define ACN_SDT_VECTOR_NAK15 15 |
| 116 | #define ACN_SDT_VECTOR_GET_SESSION16 16 |
| 117 | #define ACN_SDT_VECTOR_SESSIONS17 17 |
| 118 | |
| 119 | #define ACN_REFUSE_CODE_NONSPECIFIC1 1 |
| 120 | #define ACN_REFUSE_CODE_ILLEGAL_PARAMS2 2 |
| 121 | #define ACN_REFUSE_CODE_LOW_RESOURCES3 3 |
| 122 | #define ACN_REFUSE_CODE_ALREADY_MEMBER4 4 |
| 123 | #define ACN_REFUSE_CODE_BAD_ADDR_TYPE5 5 |
| 124 | #define ACN_REFUSE_CODE_NO_RECIP_CHAN6 6 |
| 125 | |
| 126 | #define ACN_REASON_CODE_NONSPECIFIC1 1 |
| 127 | /*#define ACN_REASON_CODE_ 2 */ |
| 128 | /*#define ACN_REASON_CODE_ 3 */ |
| 129 | /*#define ACN_REASON_CODE_ 4 */ |
| 130 | /*#define ACN_REASON_CODE_ 5 */ |
| 131 | #define ACN_REASON_CODE_NO_RECIP_CHAN6 6 |
| 132 | #define ACN_REASON_CODE_CHANNEL_EXPIRED7 7 |
| 133 | #define ACN_REASON_CODE_LOST_SEQUENCE8 8 |
| 134 | #define ACN_REASON_CODE_SATURATED9 9 |
| 135 | #define ACN_REASON_CODE_TRANS_ADDR_CHANGING10 10 |
| 136 | #define ACN_REASON_CODE_ASKED_TO_LEAVE11 11 |
| 137 | #define ACN_REASON_CODE_NO_RECIPIENT12 12 |
| 138 | |
| 139 | /* Blob Information */ |
| 140 | #define ACN_BLOB_FIELD_TYPE11 1 |
| 141 | #define ACN_BLOB_FIELD_TYPE22 2 |
| 142 | #define ACN_BLOB_FIELD_TYPE33 3 |
| 143 | #define ACN_BLOB_FIELD_TYPE44 4 |
| 144 | #define ACN_BLOB_FIELD_TYPE55 5 |
| 145 | #define ACN_BLOB_FIELD_TYPE66 6 |
| 146 | #define ACN_BLOB_FIELD_TYPE77 7 |
| 147 | #define ACN_BLOB_FIELD_TYPE88 8 |
| 148 | #define ACN_BLOB_FIELD_TYPE99 9 |
| 149 | #define ACN_BLOB_FIELD_TYPE1010 10 |
| 150 | #define ACN_BLOB_FIELD_TYPE1111 11 |
| 151 | #define ACN_BLOB_FIELD_TYPE1212 12 |
| 152 | |
| 153 | #define ACN_BLOB_RANGE_MID0 0 |
| 154 | #define ACN_BLOB_RANGE_START1 1 |
| 155 | #define ACN_BLOB_RANGE_END2 2 |
| 156 | #define ACN_BLOB_RANGE_SINGLE3 3 |
| 157 | |
| 158 | #define ACN_BLOB_IPV41 1 |
| 159 | #define ACN_BLOB_IPV62 2 |
| 160 | #define ACN_BLOB_ERROR13 3 |
| 161 | #define ACN_BLOB_ERROR24 4 |
| 162 | #define ACN_BLOB_METADATA5 5 |
| 163 | #define ACN_BLOB_METADATA_DEVICES6 6 |
| 164 | #define ACN_BLOB_METADATA_TYPES7 7 |
| 165 | #define ACN_BLOB_TIME18 8 |
| 166 | #define ACN_BLOB_DIMMER_PROPERTIES9 9 |
| 167 | #define ACN_BLOB_DIMMER_LOAD_PROPERTIES10 10 |
| 168 | #define ACN_BLOB_DIMMING_RACK_PROPERTIES11 11 |
| 169 | #define ACN_BLOB_DIMMING_RACK_STATUS_PROPERTIES12 12 |
| 170 | #define ACN_BLOB_DIMMER_STATUS_PROPERTIES13 13 |
| 171 | #define ACN_BLOB_SET_LEVELS_OPERATION14 14 |
| 172 | #define ACN_BLOB_PRESET_OPERATION15 15 |
| 173 | #define ACN_BLOB_ADVANCED_FEATURES_OPERATION16 16 |
| 174 | #define ACN_BLOB_DIRECT_CONTROL_OPERATION17 17 |
| 175 | #define ACN_BLOB_GENERATE_CONFIG_OPERATION18 18 |
| 176 | #define ACN_BLOB_ERROR319 19 |
| 177 | #define ACN_BLOB_DIMMER_PROPERTIES220 20 |
| 178 | #define ACN_BLOB_DIMMER_LOAD_PROPERTIES221 21 |
| 179 | #define ACN_BLOB_DIMMER_RACK_PROPERTIES222 22 |
| 180 | #define ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223 23 |
| 181 | #define ACN_BLOB_DIMMER_STATUS_PROPERTIES224 24 |
| 182 | #define ACN_BLOB_TIME225 25 |
| 183 | #define ACN_BLOB_RPC26 26 |
| 184 | #define ACN_BLOB_DHCP_CONFIG_SUBNET27 27 |
| 185 | #define ACN_BLOB_DHCP_CONFIG_STATIC_ROUTE28 28 |
| 186 | #define ACN_BLOB_ENERGY_MANAGEMENT29 29 |
| 187 | #define ACN_BLOB_TIME330 30 |
| 188 | #define ACN_BLOB_ENERGY_COST31 31 |
| 189 | #define ACN_BLOB_SEQUENCE_OPERATIONS32 32 |
| 190 | #define ACN_BLOB_SEQUENCE_STEP_PROPERTIES33 33 |
| 191 | |
| 192 | #define ACN_BLOB_PRESET_PROPERTIES250 250 |
| 193 | |
| 194 | #define ACN_DMP_VECTOR_UNKNOWN0 0 |
| 195 | #define ACN_DMP_VECTOR_GET_PROPERTY1 1 |
| 196 | #define ACN_DMP_VECTOR_SET_PROPERTY2 2 |
| 197 | #define ACN_DMP_VECTOR_GET_PROPERTY_REPLY3 3 |
| 198 | #define ACN_DMP_VECTOR_EVENT4 4 |
| 199 | #define ACN_DMP_VECTOR_MAP_PROPERTY5 5 |
| 200 | #define ACN_DMP_VECTOR_UNMAP_PROPERTY6 6 |
| 201 | #define ACN_DMP_VECTOR_SUBSCRIBE7 7 |
| 202 | #define ACN_DMP_VECTOR_UNSUBSCRIBE8 8 |
| 203 | #define ACN_DMP_VECTOR_GET_PROPERTY_FAIL9 9 |
| 204 | #define ACN_DMP_VECTOR_SET_PROPERTY_FAIL10 10 |
| 205 | #define ACN_DMP_VECTOR_MAP_PROPERTY_FAIL11 11 |
| 206 | #define ACN_DMP_VECTOR_SUBSCRIBE_ACCEPT12 12 |
| 207 | #define ACN_DMP_VECTOR_SUBSCRIBE_REJECT13 13 |
| 208 | #define ACN_DMP_VECTOR_ALLOCATE_MAP14 14 |
| 209 | #define ACN_DMP_VECTOR_ALLOCATE_MAP_REPLY15 15 |
| 210 | #define ACN_DMP_VECTOR_DEALLOCATE_MAP16 16 |
| 211 | #define ACN_DMP_VECTOR_SYNC_EVENT17 17 |
| 212 | |
| 213 | #define ACN_DMP_REASON_CODE_NONSPECIFIC1 1 |
| 214 | #define ACN_DMP_REASON_CODE_NOT_A_PROPERTY2 2 |
| 215 | #define ACN_DMP_REASON_CODE_WRITE_ONLY3 3 |
| 216 | #define ACN_DMP_REASON_CODE_NOT_WRITABLE4 4 |
| 217 | #define ACN_DMP_REASON_CODE_DATA_ERROR5 5 |
| 218 | #define ACN_DMP_REASON_CODE_MAPS_NOT_SUPPORTED6 6 |
| 219 | #define ACN_DMP_REASON_CODE_SPACE_NOT_AVAILABLE7 7 |
| 220 | #define ACN_DMP_REASON_CODE_PROP_NOT_MAPPABLE8 8 |
| 221 | #define ACN_DMP_REASON_CODE_MAP_NOT_ALLOCATED9 9 |
| 222 | #define ACN_DMP_REASON_CODE_SUBSCRIPTION_NOT_SUPPORTED10 10 |
| 223 | #define ACN_DMP_REASON_CODE_NO_SUBSCRIPTIONS_SUPPORTED11 11 |
| 224 | |
| 225 | #define ACN_DMX_VECTOR2 2 |
| 226 | |
| 227 | #define ACN_DMX_EXT_SYNC_VECTOR1 1 |
| 228 | #define ACN_DMX_EXT_DISCOVERY_VECTOR2 2 |
| 229 | #define ACN_DMX_DISCOVERY_UNIVERSE_LIST_VECTOR1 1 |
| 230 | |
| 231 | #define ACN_PREF_DMX_DISPLAY_HEX0 0 |
| 232 | #define ACN_PREF_DMX_DISPLAY_DEC1 1 |
| 233 | #define ACN_PREF_DMX_DISPLAY_PER2 2 |
| 234 | |
| 235 | #define ACN_PREF_DMX_DISPLAY_20PL0 0 |
| 236 | #define ACN_PREF_DMX_DISPLAY_16PL1 1 |
| 237 | |
| 238 | |
| 239 | #define MAGIC_V10 0 /* 1.0 default version */ |
| 240 | #define MAGIC_COMMAND1 1 /* 2.0 command */ |
| 241 | #define MAGIC_REPLY2 2 /* 2.0 reply */ |
| 242 | #define MAGIC_REPLY_TYPE_33 3 /* 2.0 reply type 3 */ |
| 243 | |
| 244 | #define V1_SWITCH_TO_NET11 1 |
| 245 | #define V1_SWITCH_TO_NET22 2 |
| 246 | #define V1_BOOTP1114467 1114467 |
| 247 | |
| 248 | #define V2_CMD_SWITCH_TO_NET11 1 |
| 249 | #define V2_CMD_SWITCH_TO_NET22 2 |
| 250 | #define V2_CMD_DOWNLOAD3 3 |
| 251 | #define V2_CMD_SOFTBOOT4 4 |
| 252 | #define V2_CMD_PHYSICAL_BEACON5 5 |
| 253 | #define V2_CMD_NETWORK_BEACON6 6 |
| 254 | #define V2_CMD_SWITCH_TO_ACN7 7 |
| 255 | #define V2_CMD_SWITCH_TO_DYNAMIC_IP8 8 |
| 256 | #define V2_CMD_EXTENDED_NETWORK_BEACON9 9 |
| 257 | #define V2_CMD_IP_CONFIGURATION10 10 |
| 258 | #define V2_CMD_RESTORE_FACTORY_DEFAULT11 11 |
| 259 | #define V2_CMD_PHYSICAL_BEACON_BY_CID12 12 |
| 260 | #define V2_CMD_NET2_DOWNLOAD110163 110163 |
| 261 | |
| 262 | #define MAGIC_SWITCH_TO_DYNAMIC_MAINTAIN_LEASE0 0 |
| 263 | #define MAGIC_SWITCH_TO_DYNAMIC_RESET_LEASE1 1 |
| 264 | |
| 265 | #define MAGIC_DYNAMIC_IP_MAINTAIN_LEASE0 0 |
| 266 | #define MAGIC_DYNAMIC_IP_RESET_LEASE1 1 |
| 267 | #define MAGIC_STATIC_IP2 2 |
| 268 | |
| 269 | /* E1.33 Table A-1 Broadcast UID Defines */ |
| 270 | #define ACN_RPT_ALL_CONTROLLERS0xFFFCFFFFFFFF 0xFFFCFFFFFFFF |
| 271 | #define ACN_RPT_ALL_DEVICES0xFFFDFFFFFFFF 0xFFFDFFFFFFFF |
| 272 | #define ACN_RPT_ALL_MID_DEVICES0xFFFDmmmmFFFF 0xFFFDmmmmFFFF /*Addresses all Devices with the specific Manufacturer ID 0xmmmm*/ |
| 273 | |
| 274 | /* E1.33 Table A-2 LLRP Constants */ |
| 275 | #define ACN_LLRP_MULTICAST_IPV4_ADDRESS_REQUEST239.255.250.133 239.255.250.133 |
| 276 | #define ACN_LLRP_MULTICAST_IPV4_ADDRESS_RESPONSE239.255.250.134 239.255.250.134 |
| 277 | #define ACN_LLRP_MULTICAST_IPV6_ADDRESS_REQUESTff18::85:0:0:85 ff18::85:0:0:85 |
| 278 | #define ACN_LLRP_MULTICAST_IPV6_ADDRESS_RESPONSEff18::85:0:0:86 ff18::85:0:0:86 |
| 279 | #define ACN_LLRP_PORT5569 5569 |
| 280 | #define ACN_LLRP_TIMEOUT2 2 /*seconds*/ |
| 281 | #define ACN_LLRP_TARGET_TIMEOUT500 500 /*milliseconds*/ |
| 282 | #define ACN_LLRP_MAX_BACKOFF1.5 1.5 /*seconds*/ |
| 283 | #define ACN_LLRP_KNOWN_UID_SIZE200 200 |
| 284 | #define ACN_LLRP_BROADCAST_CIDFBAD822C-BD0C-4D4C-BDC8-7EABEBC85AFF FBAD822C-BD0C-4D4C-BDC8-7EABEBC85AFF |
| 285 | |
| 286 | /* E1.33 Table A-3 Vector Defines for Root Layer PDU */ |
| 287 | /* (already defined above) |
| 288 | * #define ACN_PDU_VECTOR_ROOT_LLRP 0x0000000A |
| 289 | * #define ACN_PDU_VECTOR_ROOT_RPT 0x00000005 |
| 290 | * #define ACN_PDU_VECTOR_ROOT_BROKER 0x00000009 |
| 291 | * #define ACN_PDU_VECTOR_ROOT_EPT 0x0000000B |
| 292 | */ |
| 293 | |
| 294 | /* E1.33 Table A-4 LLRP Messages */ |
| 295 | #define RDMNET_LLRP_VECTOR_PROBE_REQUEST0x00000001 0x00000001 |
| 296 | #define RDMNET_LLRP_VECTOR_PROBE_REPLY0x00000002 0x00000002 |
| 297 | #define RDMNET_LLRP_VECTOR_RDM_CMD0x00000003 0x00000003 |
| 298 | |
| 299 | #define RDMNET_LLRP_VECTOR_PROBE_REQUEST_CLIENT_TCP_INACTIVE0x01 0x01 |
| 300 | #define RDMNET_LLRP_VECTOR_PROBE_REQUEST_BROKERS_ONLY0x02 0x02 |
| 301 | |
| 302 | #define RDMNET_LLRP_VECTOR_RDM_CMD_START_CODE0xCC 0xCC |
| 303 | |
| 304 | /* E1.33 Table A-5 LLRP Probe Request Messages */ |
| 305 | #define VECTOR_PROBE_REQUEST_DATA0x01 0x01 |
| 306 | |
| 307 | /* E1.33 Table A-6 LLRP Probe Reply Messages */ |
| 308 | #define VECTOR_PROBE_REPLY_DATA0x01 0x01 |
| 309 | |
| 310 | /* E1.33 Table A-7 Broker Messages */ |
| 311 | #define RDMNET_BROKER_VECTOR_CONNECT0x0001 0x0001 |
| 312 | #define RDMNET_BROKER_VECTOR_CONNECT_REPLY0x0002 0x0002 |
| 313 | #define RDMNET_BROKER_VECTOR_CLIENT_ENTRY_UPDATE0x0003 0x0003 |
| 314 | #define RDMNET_BROKER_VECTOR_REDIRECT_V40x0004 0x0004 |
| 315 | #define RDMNET_BROKER_VECTOR_REDIRECT_V60x0005 0x0005 |
| 316 | #define RDMNET_BROKER_VECTOR_FETCH_CLIENT_LIST0x0006 0x0006 |
| 317 | #define RDMNET_BROKER_VECTOR_CONNECTED_CLIENT_LIST0x0007 0x0007 |
| 318 | #define RDMNET_BROKER_VECTOR_CLIENT_ADD0x0008 0x0008 |
| 319 | #define RDMNET_BROKER_VECTOR_CLIENT_REMOVE0x0009 0x0009 |
| 320 | #define RDMNET_BROKER_VECTOR_CLIENT_ENTRY_CHANGE0x000A 0x000A |
| 321 | #define RDMNET_BROKER_VECTOR_REQUEST_DYNAMIC_UIDS0x000B 0x000B |
| 322 | #define RDMNET_BROKER_VECTOR_ASSIGNED_DYNAMIC_UIDS0x000C 0x000C |
| 323 | #define RDMNET_BROKER_VECTOR_FETCH_DYNAMIC_UID_LIST0x000D 0x000D |
| 324 | #define RDMNET_BROKER_VECTOR_DISCONNECT0x000E 0x000E |
| 325 | #define RDMNET_BROKER_VECTOR_NULL0x000F 0x000F |
| 326 | |
| 327 | #define RDMNET_BROKER_VECTOR_CONNECT_INCREMENTAL_UPDATES0x01 0x01 |
| 328 | |
| 329 | /* E1.33 Table A-8 RPT Messages */ |
| 330 | #define RDMNET_RPT_VECTOR_REQUEST0x00000001 0x00000001 |
| 331 | #define RDMNET_RPT_VECTOR_STATUS0x00000002 0x00000002 |
| 332 | #define RDMNET_RPT_VECTOR_NOTIFICATION0x00000003 0x00000003 |
| 333 | |
| 334 | /* E1.33 Table A-9 RPT Request PDUs */ |
| 335 | #define RDMNET_RPT_VECTOR_REQUEST_RDM_CMD0x01 0x01 |
| 336 | |
| 337 | /* E1.33 Table A-10 RPT Status PDUs */ |
| 338 | #define RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RPT_UID0x0001 0x0001 |
| 339 | #define RDMNET_RPT_VECTOR_STATUS_RDM_TIMEOUT0x0002 0x0002 |
| 340 | #define RDMNET_RPT_VECTOR_STATUS_RDM_INVALID_RESPONSE0x0003 0x0003 |
| 341 | #define RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RDM_UID0x0004 0x0004 |
| 342 | #define RDMNET_RPT_VECTOR_STATUS_UNKNOWN_ENDPOINT0x0005 0x0005 |
| 343 | #define RDMNET_RPT_VECTOR_STATUS_BROADCAST_COMPLETE0x0006 0x0006 |
| 344 | #define RDMNET_RPT_VECTOR_STATUS_UNKNOWN_VECTOR0x0007 0x0007 |
| 345 | #define RDMNET_RPT_VECTOR_STATUS_INVALID_MESSAGE0x0008 0x0008 |
| 346 | #define RDMNET_RPT_VECTOR_STATUS_INVALID_COMMAND_CLASS0x0009 0x0009 |
| 347 | |
| 348 | /* E1.33 Table A-11 RPT Notification PDUs */ |
| 349 | #define RDMNET_RPT_VECTOR_NOTIFICATION_RDM_CMD0x01 0x01 |
| 350 | |
| 351 | /* E1.33 Table A-12 RDM Command PDUs */ |
| 352 | #define RDMNET_RPT_VECTOR_RDM_CMD_RD_DATA0xCC 0xCC |
| 353 | |
| 354 | /* E1.33 Table A-13 EPT PDUs */ |
| 355 | #define RDMNET_EPT_VECTOR_DATA0x00000001 0x00000001 |
| 356 | #define RDMNET_EPT_VECTOR_STATUS0x00000002 0x00000002 |
| 357 | |
| 358 | /* E1.33 Table A-14 EPT Status PDUs */ |
| 359 | #define RDMNET_EPT_VECTOR_UNKNOWN_CID0x0001 0x0001 |
| 360 | #define RDMNET_EPT_VECTOR_UNKNOWN_VECTOR0x0002 0x0002 |
| 361 | |
| 362 | /* E1.33 Table A-15 RDM Parameter IDs (only used in packet-rdm.c) */ |
| 363 | |
| 364 | /* E1.33 Table A-16 RDM NACK Reason Codes (only used in packet-rdm.c) */ |
| 365 | |
| 366 | /* E1.33 Table A-17 Static Config Types for Component Scope Messages (only used in packet-rdm.c) */ |
| 367 | |
| 368 | /* E1.33 Table A-18 Broker States for Broker Status Messages (only used in packet-rdm.c) */ |
| 369 | |
| 370 | /* E1.33 Table A-19 Connection Status Codes for Broker Connect */ |
| 371 | #define RDMNET_BROKER_CONNECT_OK0x0000 0x0000 |
| 372 | #define RDMNET_BROKER_CONNECT_SCOPE_MISMATCH0x0001 0x0001 |
| 373 | #define RDMNET_BROKER_CONNECT_CAPACITY_EXCEEDED0x0002 0x0002 |
| 374 | #define RDMNET_BROKER_CONNECT_DUPLICATE_UID0x0003 0x0003 |
| 375 | #define RDMNET_BROKER_CONNECT_INVALID_CLIENT_ENTRY0x0004 0x0004 |
| 376 | #define RDMNET_BROKER_CONNECT_INVALID_UID0x0005 0x0005 |
| 377 | |
| 378 | /* E1.33 Table A-20 Status Codes for Dynamic UID Mapping*/ |
| 379 | #define RDMNET_DYNAMIC_UID_STATUS_OK0x0000 0x0000 |
| 380 | #define RDMNET_DYNAMIC_UID_STATUS_INVALID_REQUEST0x0001 0x0001 |
| 381 | #define RDMNET_DYNAMIC_UID_STATUS_UID_NOT_FOUND0x0002 0x0002 |
| 382 | #define RDMNET_DYNAMIC_UID_STATUS_DUPLICATE_RID0x0003 0x0003 |
| 383 | #define RDMNET_DYNAMIC_UID_STATUS_CAPACITY_EXHAUSTED0x0004 0x0004 |
| 384 | |
| 385 | /* E1.33 Table A-21 Client Protocol Codes */ |
| 386 | #define RDMNET_CLIENT_PROTOCOL_RPT0x00000005 0x00000005 |
| 387 | #define RDMNET_CLIENT_PROTOCOL_EPT0x0000000B 0x0000000B |
| 388 | |
| 389 | /* E1.33 Table A-22 RPT Client Type Codes */ |
| 390 | #define RDMNET_RPT_CLIENT_TYPE_DEVICE0x00 0x00 |
| 391 | #define RDMNET_RPT_CLIENT_TYPE_CONTROLLER0x01 0x01 |
| 392 | |
| 393 | /* E1.33 Table A-23 LLRP Component Type Codes - LLRP TARGETS */ |
| 394 | #define RDMNET_LLRP_COMPONENT_TYPE_RPT_DEVICE0x00 0x00 /* Target is a Device */ |
| 395 | #define RDMNET_LLRP_COMPONENT_TYPE_RPT_CONTROLLER0x01 0x01 /* Target is a Controller */ |
| 396 | #define RDMNET_LLRP_COMPONENT_TYPE_BROKER0x02 0x02 /* Target is a Broker */ |
| 397 | #define RDMNET_LLRP_COMPONENT_TYPE_NON_RDMNET0xFF 0xFF /* Target does not implement RDMnet other than LLRP */ |
| 398 | |
| 399 | /* E1.33 Table A-24 RPT Client Disconnect Reason Codes */ |
| 400 | #define RDMNET_RPT_DISCONNECT_SHUTDOWN0x0000 0x0000 /* Sent by Components to indicate that they are */ |
| 401 | /* about to shut down. */ |
| 402 | #define RDMNET_RPT_DISCONNECT_CAPACITY_EXHAUSTED0x0001 0x0001 /* Sent by Components when they do not */ |
| 403 | /* have the ability to support this connection. */ |
| 404 | /* Note that a Component must reserve certain */ |
| 405 | /* resources to be able to send this message */ |
| 406 | /* when it is in such a state. */ |
| 407 | #define RDMNET_RPT_DISCONNECT_HARDWARE_FAULT0x0002 0x0002 /* Sent by Components which must terminate a */ |
| 408 | /* connection due to an internal hardware fault */ |
| 409 | #define RDMNET_RPT_DISCONNECT_SOFTWARE_FAULT0x0003 0x0003 /* Sent by Components which must terminate a */ |
| 410 | /* connection due to a software fault. */ |
| 411 | #define RDMNET_RPT_DISCONNECT_SOFTWARE_RESET0x0004 0x0004 /* Sent by Components which must terminate a */ |
| 412 | /* connection because of a software reset. */ |
| 413 | /* This message should not be sent in the case */ |
| 414 | /* of a reboot, as the Shutdown message */ |
| 415 | /* is preferred. */ |
| 416 | #define RDMNET_RPT_DISCONNECT_INCORRECT_SCOPE0x0005 0x0005 /* Sent by Brokers that are not on the */ |
| 417 | /* desired Scope. */ |
| 418 | #define RDMNET_RPT_DISCONNECT_RPT_RECONFIGURE0x0006 0x0006 /* Sent by components which must terminate a */ |
| 419 | /* connection because they were reconfigured */ |
| 420 | /* using RPT */ |
| 421 | #define RDMNET_RPT_DISCONNECT_LLRP_RECONFIGURE0x0007 0x0007 /* Sent by Components which must terminate a */ |
| 422 | /* connection because they were reconfigured */ |
| 423 | /* using LLRP. */ |
| 424 | #define RDMNET_RPT_DISCONNECT_USER_RECONFIGURE0x0008 0x0008 /* Sent by Components which must terminate a */ |
| 425 | /* connection because they were reconfigured */ |
| 426 | /* through some means outside the scope of this */ |
| 427 | /* standard (i.e. front panel configuration) */ |
| 428 | |
| 429 | typedef struct |
| 430 | { |
| 431 | uint32_t start; |
| 432 | uint32_t vector; |
| 433 | uint32_t header; |
| 434 | uint32_t data; |
| 435 | uint32_t data_length; |
| 436 | } acn_pdu_offsets; |
| 437 | |
| 438 | typedef struct |
| 439 | { |
| 440 | uint8_t flags; |
| 441 | uint32_t address; /* or first address */ |
| 442 | uint32_t increment; |
| 443 | uint32_t count; |
| 444 | uint32_t size; |
| 445 | uint32_t data_length; |
| 446 | } acn_dmp_adt_type; |
| 447 | |
| 448 | /* |
| 449 | * See |
| 450 | * ANSI BSR E1.17 Architecture for Control Networks |
| 451 | * ANSI BSR E1.31 |
| 452 | * ANSI BSR E1.33 RDMnet |
| 453 | */ |
| 454 | |
| 455 | #define ACTUAL_ADDRESS0 0 |
| 456 | /* forward reference */ |
| 457 | static uint32_t acn_add_address(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, const char *label); |
| 458 | static int dissect_acn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data); |
| 459 | static int dissect_rdmnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t data_offset, bool_Bool is_udp); |
| 460 | |
| 461 | /* Global variables */ |
| 462 | static int proto_acn; |
| 463 | static int ett_acn; |
| 464 | static int ett_acn_channel_owner_info_block; |
| 465 | static int ett_acn_channel_member_info_block; |
| 466 | static int ett_acn_channel_parameter; |
| 467 | static int ett_acn_address; |
| 468 | static int ett_acn_address_type; |
| 469 | static int ett_acn_blob; |
| 470 | static int ett_acn_pdu_flags; |
| 471 | static int ett_acn_dmp_pdu; |
| 472 | static int ett_acn_sdt_pdu; |
| 473 | static int ett_acn_sdt_client_pdu; |
| 474 | static int ett_acn_sdt_base_pdu; |
| 475 | static int ett_acn_root_pdu; |
| 476 | |
| 477 | static int ett_acn_dmx_address; |
| 478 | static int ett_acn_dmx_2_options; |
| 479 | static int ett_acn_dmx_data_pdu; |
| 480 | static int ett_acn_dmx_pdu; |
| 481 | |
| 482 | static int ett_rdmnet_pdu_flags; |
| 483 | static int ett_rdmnet_llrp_base_pdu; |
| 484 | static int ett_rdmnet_llrp_probe_request_pdu; |
| 485 | static int ett_rdmnet_llrp_probe_request_filter_flags; |
| 486 | static int ett_rdmnet_llrp_probe_reply_pdu; |
| 487 | static int ett_rdmnet_llrp_rdm_command_pdu; |
| 488 | |
| 489 | static int ett_rdmnet_broker_base_pdu; |
| 490 | static int ett_rdmnet_broker_client_entry_pdu; |
| 491 | static int ett_rdmnet_broker_client_entry_manufacturer_protocol_ids; |
| 492 | static int ett_rdmnet_broker_connect_connection_flags; |
| 493 | static int ett_rdmnet_broker_client_entry_update_connection_flags; |
| 494 | |
| 495 | static int ett_rdmnet_rpt_base_pdu; |
| 496 | static int ett_rdmnet_rpt_request_pdu; |
| 497 | static int ett_rdmnet_rpt_status_pdu; |
| 498 | static int ett_rdmnet_rpt_notification_pdu; |
| 499 | |
| 500 | static int ett_rdmnet_ept_base_pdu; |
| 501 | static int ett_rdmnet_ept_data_pdu; |
| 502 | static int ett_rdmnet_ept_data_vector_pdu; |
| 503 | static int ett_rdmnet_ept_status_pdu; |
| 504 | |
| 505 | static int ett_rdmnet_uid; |
| 506 | |
| 507 | static expert_field ei_acn_dmx_discovery_outofseq; |
| 508 | |
| 509 | /* Register fields */ |
| 510 | /* In alphabetical order */ |
| 511 | static int hf_acn_association; |
| 512 | static int hf_acn_blob; |
| 513 | /* static int hf_acn_blob_dimmer_load_properties2_type; */ |
| 514 | static int hf_acn_blob_field_length; |
| 515 | static int hf_acn_blob_field_type; |
| 516 | static int hf_acn_blob_field_value_number; |
| 517 | static int hf_acn_blob_field_value_number64; |
| 518 | static int hf_acn_blob_field_value_ipv4; |
| 519 | static int hf_acn_blob_field_value_ipv6; |
| 520 | static int hf_acn_blob_field_value_float; |
| 521 | static int hf_acn_blob_field_value_double; |
| 522 | static int hf_acn_blob_field_value_guid; |
| 523 | static int hf_acn_blob_field_value_string; |
| 524 | /* static int hf_acn_blob_metadata_types_type; */ |
| 525 | static int hf_acn_blob_range_number; |
| 526 | /* static int hf_acn_blob_range_start; */ |
| 527 | static int hf_acn_blob_range_type; |
| 528 | static int hf_acn_blob_tree_field_type; |
| 529 | static int hf_acn_blob_type; |
| 530 | static int hf_acn_blob_version; |
| 531 | static int hf_acn_blob_time_zone; |
| 532 | static int hf_acn_blob_dst_type; |
| 533 | static int hf_acn_blob_dst_start_day; |
| 534 | static int hf_acn_blob_dst_stop_day; |
| 535 | static int hf_acn_blob_dst_start_locality; |
| 536 | static int hf_acn_blob_dst_stop_locality; |
| 537 | static int hf_acn_channel_number; |
| 538 | static int hf_acn_cid; |
| 539 | /* static int hf_acn_client_protocol_id; */ |
| 540 | static int hf_acn_data; |
| 541 | static int hf_acn_data8; |
| 542 | static int hf_acn_data16; |
| 543 | static int hf_acn_data24; |
| 544 | static int hf_acn_data32; |
| 545 | /* static int hf_acn_dmp_adt; */ /* address and data type*/ |
| 546 | static int hf_acn_dmp_adt_a; |
| 547 | static int hf_acn_dmp_adt_v; |
| 548 | static int hf_acn_dmp_adt_r; |
| 549 | static int hf_acn_dmp_adt_d; |
| 550 | static int hf_acn_dmp_adt_x; |
| 551 | static int hf_acn_dmp_reason_code; |
| 552 | static int hf_acn_dmp_vector; |
| 553 | static int hf_acn_dmp_actual_address; |
| 554 | static int hf_acn_dmp_virtual_address; |
| 555 | static int hf_acn_dmp_actual_address_first; |
| 556 | static int hf_acn_dmp_virtual_address_first; |
| 557 | static int hf_acn_expiry; |
| 558 | static int hf_acn_first_member_to_ack; |
| 559 | static int hf_acn_first_missed_sequence; |
| 560 | static int hf_acn_ip_address_type; |
| 561 | static int hf_acn_ipv4; |
| 562 | static int hf_acn_ipv6; |
| 563 | static int hf_acn_last_member_to_ack; |
| 564 | static int hf_acn_last_missed_sequence; |
| 565 | static int hf_acn_mak_threshold; |
| 566 | static int hf_acn_member_id; |
| 567 | static int hf_acn_nak_holdoff; |
| 568 | static int hf_acn_nak_max_wait; |
| 569 | static int hf_acn_nak_modulus; |
| 570 | static int hf_acn_nak_outbound_flag; |
| 571 | static int hf_acn_oldest_available_wrapper; |
| 572 | static int hf_acn_packet_identifier; |
| 573 | static int hf_acn_pdu; |
| 574 | static int hf_acn_pdu_flag_d; |
| 575 | static int hf_acn_pdu_flag_h; |
| 576 | static int hf_acn_pdu_flag_l; |
| 577 | static int hf_acn_pdu_flag_v; |
| 578 | static int hf_acn_pdu_flags; |
| 579 | static int hf_acn_pdu_length; |
| 580 | static int hf_acn_port; |
| 581 | static int hf_acn_postamble_size; |
| 582 | static int hf_acn_preamble_size; |
| 583 | static int hf_acn_protocol_id; |
| 584 | static int hf_acn_reason_code; |
| 585 | static int hf_acn_reciprocal_channel; |
| 586 | static int hf_acn_refuse_code; |
| 587 | static int hf_acn_reliable_sequence_number; |
| 588 | static int hf_acn_adhoc_expiry; |
| 589 | /* static int hf_acn_sdt_pdu; */ |
| 590 | static int hf_acn_sdt_vector; |
| 591 | |
| 592 | static int hf_acn_dmx_vector; |
| 593 | static int hf_acn_dmx_extension_vector; |
| 594 | /* static int hf_acn_session_count; */ |
| 595 | static int hf_acn_total_sequence_number; |
| 596 | static int hf_acn_dmx_source_name; |
| 597 | static int hf_acn_dmx_priority; |
| 598 | static int hf_acn_dmx_2_sync_universe; |
| 599 | static int hf_acn_dmx_3_reserved; |
| 600 | static int hf_acn_dmx_sequence_number; |
| 601 | static int hf_acn_dmx_2_options; |
| 602 | static int hf_acn_dmx_2_option_p; |
| 603 | static int hf_acn_dmx_2_option_s; |
| 604 | static int hf_acn_dmx_2_option_f; |
| 605 | static int hf_acn_dmx_universe; |
| 606 | |
| 607 | static int hf_acn_dmx_start_code; |
| 608 | static int hf_acn_dmx_2_first_property_address; |
| 609 | static int hf_acn_dmx_increment; |
| 610 | static int hf_acn_dmx_count; |
| 611 | static int hf_acn_dmx_2_start_code; |
| 612 | static int hf_acn_dmx_data; |
| 613 | |
| 614 | static int hf_acn_postamble_key_fingerprint; |
| 615 | static int hf_acn_postamble_seq_type; |
| 616 | static int hf_acn_postamble_seq_hi; |
| 617 | static int hf_acn_postamble_seq_low; |
| 618 | static int hf_acn_postamble_message_digest; |
| 619 | |
| 620 | static int hf_acn_dmx_discovery_framing_reserved; |
| 621 | static int hf_acn_dmx_discovery_page; |
| 622 | static int hf_acn_dmx_discovery_last_page; |
| 623 | static int hf_acn_dmx_discovery_vector; |
| 624 | static int hf_acn_dmx_discovery_universe_list; |
| 625 | |
| 626 | static int hf_acn_dmx_sync_universe; |
| 627 | static int hf_acn_dmx_sync_reserved; |
| 628 | |
| 629 | /* static int hf_acn_dmx_dmp_vector; */ |
| 630 | |
| 631 | /* Try heuristic ACN decode */ |
| 632 | static bool_Bool global_acn_dmx_enable; |
| 633 | static int global_acn_dmx_display_view; |
| 634 | static int global_acn_dmx_display_line_format; |
| 635 | static bool_Bool global_acn_dmx_display_zeros; |
| 636 | static bool_Bool global_acn_dmx_display_leading_zeros; |
| 637 | |
| 638 | static int proto_magic; |
| 639 | static int ett_magic; |
| 640 | |
| 641 | /* Register fields */ |
| 642 | static int hf_magic_protocol_id; |
| 643 | static int hf_magic_pdu_subtype; |
| 644 | static int hf_magic_major_version; |
| 645 | static int hf_magic_minor_version; |
| 646 | |
| 647 | static int hf_magic_v1command_vals; |
| 648 | |
| 649 | static int hf_magic_command_vals; |
| 650 | static int hf_magic_command_beacon_duration; |
| 651 | static int hf_magic_command_tftp; |
| 652 | static int hf_magic_command_reset_lease; |
| 653 | static int hf_magic_command_cid; |
| 654 | static int hf_magic_command_ip_configuration; |
| 655 | static int hf_magic_command_ip_address; |
| 656 | static int hf_magic_command_subnet_mask; |
| 657 | static int hf_magic_command_gateway; |
| 658 | |
| 659 | static int hf_magic_reply_ip_address; |
| 660 | static int hf_magic_reply_subnet_mask; |
| 661 | static int hf_magic_reply_gateway; |
| 662 | static int hf_magic_reply_tftp; |
| 663 | |
| 664 | static int hf_magic_reply_version; |
| 665 | static int hf_magic_reply_device_type_name; |
| 666 | static int hf_magic_reply_default_name; |
| 667 | static int hf_magic_reply_user_name; |
| 668 | static int hf_magic_reply_cid; |
| 669 | static int hf_magic_reply_dcid; |
| 670 | |
| 671 | static expert_field ei_magic_reply_invalid_type; |
| 672 | |
| 673 | |
| 674 | static int proto_rdmnet; |
| 675 | static int ett_rdmnet; |
| 676 | |
| 677 | /* Register fields */ |
| 678 | static int hf_rdmnet_cid; |
| 679 | static int hf_rdmnet_packet_identifier; |
| 680 | static int hf_rdmnet_pdu; |
| 681 | static int hf_rdmnet_pdu_flag_d; |
| 682 | static int hf_rdmnet_pdu_flag_h; |
| 683 | static int hf_rdmnet_pdu_flag_l; |
| 684 | static int hf_rdmnet_pdu_flag_v; |
| 685 | static int hf_rdmnet_pdu_flags; |
| 686 | static int hf_rdmnet_pdu_length; |
| 687 | static int hf_rdmnet_postamble_size; |
| 688 | static int hf_rdmnet_preamble_size; |
| 689 | static int hf_rdmnet_protocol_id; |
| 690 | static int hf_rdmnet_tcp_length; |
| 691 | |
| 692 | static int hf_rdmnet_llrp_vector; |
| 693 | static int hf_rdmnet_llrp_destination_cid; |
| 694 | static int hf_rdmnet_llrp_transaction_number; |
| 695 | static int hf_rdmnet_llrp_probe_request_vector; |
| 696 | static int hf_rdmnet_llrp_probe_request_pdu_length; |
| 697 | static int hf_rdmnet_llrp_probe_request_lower_uid; |
| 698 | static int hf_rdmnet_llrp_probe_request_upper_uid; |
| 699 | static int hf_rdmnet_llrp_probe_request_filter; |
| 700 | static int hf_rdmnet_llrp_probe_request_filter_client_tcp_inactive; |
| 701 | static int hf_rdmnet_llrp_probe_request_filter_brokers_only; |
| 702 | static int hf_rdmnet_llrp_probe_request_known_uid; |
| 703 | static int hf_rdmnet_llrp_probe_request_known_uid_manf; |
| 704 | static int hf_rdmnet_llrp_probe_request_known_uid_dev; |
| 705 | |
| 706 | static int hf_rdmnet_llrp_probe_reply_vector; |
| 707 | static int hf_rdmnet_llrp_probe_reply_uid; |
| 708 | static int hf_rdmnet_llrp_probe_reply_uid_manf; |
| 709 | static int hf_rdmnet_llrp_probe_reply_uid_dev; |
| 710 | static int hf_rdmnet_llrp_probe_reply_hardware_address; |
| 711 | static int hf_rdmnet_llrp_probe_reply_component_type; |
| 712 | static int hf_rdmnet_llrp_rdm_command_start_code; |
| 713 | |
| 714 | static int hf_rdmnet_rpt_vector; |
| 715 | static int hf_rdmnet_rpt_source_uid; |
| 716 | static int hf_rdmnet_rpt_source_uid_manf; |
| 717 | static int hf_rdmnet_rpt_source_uid_dev; |
| 718 | static int hf_rdmnet_rpt_source_endpoint_id; |
| 719 | static int hf_rdmnet_rpt_destination_uid; |
| 720 | static int hf_rdmnet_rpt_destination_uid_manf; |
| 721 | static int hf_rdmnet_rpt_destination_uid_dev; |
| 722 | static int hf_rdmnet_rpt_destination_endpoint_id; |
| 723 | static int hf_rdmnet_rpt_sequence_number; |
| 724 | static int hf_rdmnet_rpt_reserved; |
| 725 | static int hf_rdmnet_rpt_request_vector; |
| 726 | static int hf_rdmnet_rpt_request_rdm_command; |
| 727 | static int hf_rdmnet_rpt_status_vector; |
| 728 | static int hf_rdmnet_rpt_status_unknown_rpt_uid_string; |
| 729 | static int hf_rdmnet_rpt_status_rdm_timeout_string; |
| 730 | static int hf_rdmnet_rpt_status_rdm_invalid_response_string; |
| 731 | static int hf_rdmnet_rpt_status_unknown_rdm_uid_string; |
| 732 | static int hf_rdmnet_rpt_status_unknown_endpoint_string; |
| 733 | static int hf_rdmnet_rpt_status_broadcast_complete_string; |
| 734 | static int hf_rdmnet_rpt_status_unknown_vector_string; |
| 735 | static int hf_rdmnet_rpt_notification_vector; |
| 736 | static int hf_rdmnet_rpt_notification_rdm_command; |
| 737 | |
| 738 | static int hf_rdmnet_broker_vector; |
| 739 | static int hf_rdmnet_broker_client_protocol_vector; |
| 740 | static int hf_rdmnet_broker_client_protocol_cid; |
| 741 | static int hf_rdmnet_broker_client_rpt_client_uid; |
| 742 | static int hf_rdmnet_broker_client_rpt_client_uid_manf; |
| 743 | static int hf_rdmnet_broker_client_rpt_client_uid_dev; |
| 744 | static int hf_rdmnet_broker_client_rpt_client_type; |
| 745 | static int hf_rdmnet_broker_client_rpt_binding_cid; |
| 746 | static int hf_rdmnet_broker_client_ept_protocol_vector; |
| 747 | static int hf_rdmnet_broker_client_ept_protocol_manufacturer_id; |
| 748 | static int hf_rdmnet_broker_client_ept_protocol_protocol_id; |
| 749 | static int hf_rdmnet_broker_client_ept_protocol_string; |
| 750 | static int hf_rdmnet_broker_connect_client_scope; |
| 751 | static int hf_rdmnet_broker_connect_e133_version; |
| 752 | static int hf_rdmnet_broker_connect_search_domain; |
| 753 | static int hf_rdmnet_broker_connect_connection_flags; |
| 754 | static int hf_rdmnet_broker_connect_connection_flags_incremental_updates; |
| 755 | static int hf_rdmnet_broker_connect_reply_connection_code; |
| 756 | static int hf_rdmnet_broker_connect_reply_e133_version; |
| 757 | static int hf_rdmnet_broker_connect_reply_broker_uid; |
| 758 | static int hf_rdmnet_broker_connect_reply_broker_uid_manf; |
| 759 | static int hf_rdmnet_broker_connect_reply_broker_uid_dev; |
| 760 | static int hf_rdmnet_broker_connect_reply_client_uid; |
| 761 | static int hf_rdmnet_broker_connect_reply_client_uid_manf; |
| 762 | static int hf_rdmnet_broker_connect_reply_client_uid_dev; |
| 763 | static int hf_rdmnet_broker_client_entry_update_connection_flags; |
| 764 | static int hf_rdmnet_broker_client_entry_update_connection_flags_incremental_updates; |
| 765 | static int hf_rdmnet_broker_redirect_ipv4_address; |
| 766 | static int hf_rdmnet_broker_redirect_ipv4_tcp_port; |
| 767 | static int hf_rdmnet_broker_redirect_ipv6_address; |
| 768 | static int hf_rdmnet_broker_redirect_ipv6_tcp_port; |
| 769 | static int hf_rdmnet_broker_disconnect_reason; |
| 770 | static int hf_rdmnet_broker_dynamic_uid_request; |
| 771 | static int hf_rdmnet_broker_rid; |
| 772 | static int hf_rdmnet_broker_assigned_dynamic_uid; |
| 773 | static int hf_rdmnet_broker_assigned_rid; |
| 774 | static int hf_rdmnet_broker_assigned_status_code; |
| 775 | static int hf_rdmnet_broker_fetch_dynamic_uid; |
| 776 | |
| 777 | static int hf_rdmnet_ept_vector; |
| 778 | static int hf_rdmnet_ept_destination_cid; |
| 779 | static int hf_rdmnet_ept_data_pdu_length; |
| 780 | static int hf_rdmnet_ept_data_vector; |
| 781 | static int hf_rdmnet_ept_data_vector_manufacturer_id; |
| 782 | static int hf_rdmnet_ept_data_vector_protocol_id; |
| 783 | static int hf_rdmnet_ept_data_opaque_data; |
| 784 | static int hf_rdmnet_ept_status_pdu_length; |
| 785 | static int hf_rdmnet_ept_status_vector; |
| 786 | static int hf_rdmnet_ept_status_unknown_cid; |
| 787 | static int hf_rdmnet_ept_status_status_string; |
| 788 | static int hf_rdmnet_ept_status_unknown_vector; |
| 789 | static int hf_rdmnet_ept_status_vector_string; |
| 790 | |
| 791 | static const value_string acn_protocol_id_vals[] = { |
| 792 | { ACN_PROTOCOL_ID_SDT0x00000001, "SDT Protocol" }, |
| 793 | { ACN_PROTOCOL_ID_DMP0x00000002, "DMP Protocol" }, |
| 794 | { ACN_PROTOCOL_ID_DMX0x00000003, "DMX Protocol" }, |
| 795 | { ACN_PROTOCOL_ID_DMX_20x00000004, "Ratified DMX Protocol" }, |
| 796 | { ACN_PROTOCOL_ID_RPT0x00000005, "RDM Packet Transport Protocol" }, |
| 797 | { ACN_PROTOCOL_ID_BROKER0x00000009, "Broker Protocol" }, |
| 798 | { ACN_PROTOCOL_ID_LLRP0x0000000A, "Low Level Recovery Protocol" }, |
| 799 | { ACN_PROTOCOL_ID_EPT0x0000000B, "Extensible Packet Transport Protocol" }, |
| 800 | { ACN_PROTOCOL_ID_DMX_30x50430001, "Pathway Connectivity Secure DMX Protocol" }, |
| 801 | { ACN_PROTOCOL_ID_EXTENDED0x00000008, "Protocol Extension" }, |
| 802 | { 0, NULL((void*)0) }, |
| 803 | }; |
| 804 | |
| 805 | static const value_string acn_dmp_adt_r_vals[] = { |
| 806 | { ACN_DMP_ADT_R_RELATIVE1, "Relative" }, |
| 807 | { ACN_DMP_ADT_R_ABSOLUTE0, "Absolute" }, |
| 808 | { 0, NULL((void*)0) }, |
| 809 | }; |
| 810 | |
| 811 | static const value_string acn_dmp_adt_v_vals[] = { |
| 812 | { ACN_DMP_ADT_V_ACTUAL0, "Actual" }, |
| 813 | { ACN_DMP_ADT_V_VIRTUAL1, "Virtual" }, |
| 814 | { 0, NULL((void*)0) }, |
| 815 | }; |
| 816 | |
| 817 | static const value_string acn_dmp_adt_d_vals[] = { |
| 818 | { ACN_DMP_ADT_D_NS0, "Non-range, single data item" }, |
| 819 | { ACN_DMP_ADT_D_RS1, "Range, single data item" }, |
| 820 | { ACN_DMP_ADT_D_RE2, "Range, array of equal size data items" }, |
| 821 | { ACN_DMP_ADT_D_RM3, "Range, series of mixed size data items" }, |
| 822 | { 0, NULL((void*)0) }, |
| 823 | }; |
| 824 | |
| 825 | static const value_string acn_dmp_adt_a_vals[] = { |
| 826 | { ACN_DMP_ADT_A_10, "1 octet" }, |
| 827 | { ACN_DMP_ADT_A_21, "2 octets" }, |
| 828 | { ACN_DMP_ADT_A_42, "4 octets" }, |
| 829 | { ACN_DMP_ADT_A_R3, "reserved" }, |
| 830 | { 0, NULL((void*)0) }, |
| 831 | }; |
| 832 | |
| 833 | |
| 834 | static const value_string acn_sdt_vector_vals[] = { |
| 835 | { ACN_SDT_VECTOR_UNKNOWN0, "Unknown"}, |
| 836 | { ACN_SDT_VECTOR_REL_WRAP1, "Reliable Wrapper"}, |
| 837 | { ACN_SDT_VECTOR_UNREL_WRAP2, "Unreliable Wrapper"}, |
| 838 | { ACN_SDT_VECTOR_CHANNEL_PARAMS3, "Channel Parameters"}, |
| 839 | { ACN_SDT_VECTOR_JOIN4, "Join"}, |
| 840 | { ACN_SDT_VECTOR_JOIN_REFUSE5, "Join Refuse"}, |
| 841 | { ACN_SDT_VECTOR_JOIN_ACCEPT6, "Join Accept"}, |
| 842 | { ACN_SDT_VECTOR_LEAVE7, "Leave"}, |
| 843 | { ACN_SDT_VECTOR_LEAVING8, "Leaving"}, |
| 844 | { ACN_SDT_VECTOR_CONNECT9, "Connect"}, |
| 845 | { ACN_SDT_VECTOR_CONNECT_ACCEPT10, "Connect Accept"}, |
| 846 | { ACN_SDT_VECTOR_CONNECT_REFUSE11, "Connect Refuse"}, |
| 847 | { ACN_SDT_VECTOR_DISCONNECT12, "Disconnect"}, |
| 848 | { ACN_SDT_VECTOR_DISCONNECTING13, "Disconnecting"}, |
| 849 | { ACN_SDT_VECTOR_ACK14, "Ack"}, |
| 850 | { ACN_SDT_VECTOR_NAK15, "Nak"}, |
| 851 | { ACN_SDT_VECTOR_GET_SESSION16, "Get Session"}, |
| 852 | { ACN_SDT_VECTOR_SESSIONS17, "Sessions"}, |
| 853 | { 0, NULL((void*)0) }, |
| 854 | }; |
| 855 | |
| 856 | static const value_string acn_dmx_vector_vals[] = { |
| 857 | { ACN_DMX_VECTOR2, "Streaming DMX"}, |
| 858 | { 0, NULL((void*)0) }, |
| 859 | }; |
| 860 | |
| 861 | static const value_string acn_dmx_extension_vector_vals[] = { |
| 862 | { ACN_DMX_EXT_SYNC_VECTOR1, "Streaming DMX Sync"}, |
| 863 | { ACN_DMX_EXT_DISCOVERY_VECTOR2, "Streaming DMX Discovery"}, |
| 864 | { 0, NULL((void*)0) }, |
| 865 | }; |
| 866 | |
| 867 | static const value_string acn_dmx_discovery_vector_vals[] = { |
| 868 | { ACN_DMX_DISCOVERY_UNIVERSE_LIST_VECTOR1, "Source Universe List"}, |
| 869 | { 0, NULL((void*)0) }, |
| 870 | }; |
| 871 | |
| 872 | static const value_string acn_blob_advanced_features_operation_field_name[] = { |
| 873 | { 1, "Operation Type" }, |
| 874 | { 2, "Use Controlled Loads" }, |
| 875 | { 3, "Start Dimmer Address" }, |
| 876 | { 4, "End Dimmer Address" }, |
| 877 | { 5, "Space" }, |
| 878 | { 0, NULL((void*)0) } |
| 879 | }; |
| 880 | |
| 881 | static const value_string acn_blob_dimmer_load_properties2_field_name[] = { |
| 882 | { 1, "System" }, |
| 883 | { 2, "Processor" }, |
| 884 | { 3, "Rack" }, |
| 885 | { 4, "Lug" }, |
| 886 | { 5, "Module" }, |
| 887 | { 6, "Station" }, |
| 888 | { 7, "Port" }, |
| 889 | { 8, "Subdevice" }, |
| 890 | { 9, "Space" }, |
| 891 | { 10, "UDN" }, |
| 892 | { 11, "Reserved" }, |
| 893 | { 12, "Is Load Recorded" }, |
| 894 | { 13, "Output Voltage Step 1" }, |
| 895 | { 14, "Output Voltage Step 2" }, |
| 896 | { 15, "Output Voltage Step 3" }, |
| 897 | { 16, "Output Voltage Step 4" }, |
| 898 | { 17, "Output Voltage Step 5" }, |
| 899 | { 18, "Output Voltage Step 6" }, |
| 900 | { 19, "Output Voltage Step 7" }, |
| 901 | { 20, "Output Voltage Step 8" }, |
| 902 | { 21, "Output Voltage Step 9" }, |
| 903 | { 22, "Output Voltage Step 10" }, |
| 904 | { 23, "Output Voltage Step 11" }, |
| 905 | { 24, "Output Voltage Step 12" }, |
| 906 | { 25, "Output Voltage Step 13" }, |
| 907 | { 26, "Output Voltage Step 14" }, |
| 908 | { 27, "Output Voltage Step 15" }, |
| 909 | { 28, "Output Voltage Step 16" }, |
| 910 | { 29, "Output Voltage Step 17" }, |
| 911 | { 30, "Output Voltage Step 18" }, |
| 912 | { 31, "Output Voltage Step 19" }, |
| 913 | { 32, "Output Voltage Step 20" }, |
| 914 | { 33, "Amperage Step 1" }, |
| 915 | { 34, "Amperage Step 2" }, |
| 916 | { 35, "Amperage Step 3" }, |
| 917 | { 36, "Amperage Step 4" }, |
| 918 | { 37, "Amperage Step 5" }, |
| 919 | { 38, "Amperage Step 6" }, |
| 920 | { 39, "Amperage Step 7" }, |
| 921 | { 40, "Amperage Step 8" }, |
| 922 | { 41, "Amperage Step 9" }, |
| 923 | { 42, "Amperage Step 10" }, |
| 924 | { 43, "Amperage Step 11" }, |
| 925 | { 44, "Amperage Step 12" }, |
| 926 | { 45, "Amperage Step 13" }, |
| 927 | { 46, "Amperage Step 14" }, |
| 928 | { 47, "Amperage Step 15" }, |
| 929 | { 48, "Amperage Step 16" }, |
| 930 | { 49, "Amperage Step 17" }, |
| 931 | { 50, "Amperage Step 18" }, |
| 932 | { 51, "Amperage Step 19" }, |
| 933 | { 52, "Amperage Step 20" }, |
| 934 | { 53, "Voltage Time Step 1" }, |
| 935 | { 54, "Voltage Time Step 2" }, |
| 936 | { 55, "Voltage Time Step 3" }, |
| 937 | { 56, "Voltage Time Step 4" }, |
| 938 | { 57, "Voltage Time Step 5" }, |
| 939 | { 58, "Voltage Time Step 6" }, |
| 940 | { 59, "Voltage Time Step 7" }, |
| 941 | { 60, "Voltage Time Step 8" }, |
| 942 | { 61, "Voltage Time Step 9" }, |
| 943 | { 62, "Voltage Time Step 10" }, |
| 944 | { 63, "Voltage Time Step 11" }, |
| 945 | { 64, "Voltage Time Step 12" }, |
| 946 | { 65, "Voltage Time Step 13" }, |
| 947 | { 66, "Voltage Time Step 14" }, |
| 948 | { 67, "Voltage Time Step 15" }, |
| 949 | { 68, "Voltage Time Step 16" }, |
| 950 | { 69, "Voltage Time Step 17" }, |
| 951 | { 70, "Voltage Time Step 18" }, |
| 952 | { 71, "Voltage Time Step 19" }, |
| 953 | { 72, "Voltage Time Step 20" }, |
| 954 | { 73, "Is Rig Check Recorded" }, |
| 955 | { 74, "Recorded Level" }, |
| 956 | { 75, "Recorded Current" }, |
| 957 | { 0, NULL((void*)0) } |
| 958 | }; |
| 959 | static value_string_ext acn_blob_dimmer_load_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_load_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_load_properties2_field_name ) / sizeof ((acn_blob_dimmer_load_properties2_field_name)[0]) )-1, acn_blob_dimmer_load_properties2_field_name, "acn_blob_dimmer_load_properties2_field_name" , ((void*)0) }; |
| 960 | |
| 961 | static const value_string acn_blob_dimmer_properties2_field_name[] = { |
| 962 | { 1, "System" }, |
| 963 | { 2, "Processor" }, |
| 964 | { 3, "Rack" }, |
| 965 | { 4, "Lug" }, |
| 966 | { 5, "Module" }, |
| 967 | { 6, "Station" }, |
| 968 | { 7, "Port" }, |
| 969 | { 8, "Subdevice" }, |
| 970 | { 9, "Space" }, |
| 971 | { 10, "UDN" }, |
| 972 | { 11, "Reserved" }, |
| 973 | { 12, "Dimmer Name" }, |
| 974 | { 13, "Dimmer Module" }, |
| 975 | { 14, "Dimmer Mode" }, |
| 976 | { 15, "Dimmer Control" }, |
| 977 | { 16, "Dimmer Curve" }, |
| 978 | { 17, "Off Level Percent" }, |
| 979 | { 18, "On Level Percent" }, |
| 980 | { 19, "On Time(sec)" }, |
| 981 | { 20, "Off Time(sec)" }, |
| 982 | { 21, "Dimmer AF Enabled" }, |
| 983 | { 22, "Threshold" }, |
| 984 | { 23, "Min Scale" }, |
| 985 | { 24, "Unregulated Min Scale" }, |
| 986 | { 25, "Max Scale" }, |
| 987 | { 26, "Unregulated Max Scale" }, |
| 988 | { 27, "Voltage Regulation" }, |
| 989 | { 28, "Preheat Enable" }, |
| 990 | { 29, "Preheat Time" }, |
| 991 | { 30, "DC Output Prevent" }, |
| 992 | { 31, "Inrush Protect" }, |
| 993 | { 32, "AF Sensitivity" }, |
| 994 | { 33, "AF Reaction Time" }, |
| 995 | { 34, "Scale Load" }, |
| 996 | { 35, "PTIO" }, |
| 997 | { 36, "Allow In Preset" }, |
| 998 | { 37, "Allow In Panic" }, |
| 999 | { 38, "Allow In Panic DD" }, |
| 1000 | { 39, "Report No Loads" }, |
| 1001 | { 40, "Loads Error Reporting Enabled" }, |
| 1002 | { 41, "New Dimmer Space Number" }, |
| 1003 | { 42, "New Dimmer Number" }, |
| 1004 | { 43, "DMX A Patch" }, |
| 1005 | { 44, "DMX B Patch" }, |
| 1006 | { 45, "sACN Patch" }, |
| 1007 | { 46, "DMX A Patch DD" }, |
| 1008 | { 47, "DMX B Patch DD" }, |
| 1009 | { 48, "sACN Patch DD" }, |
| 1010 | { 49, "DMX A 16-bit Enable" }, |
| 1011 | { 50, "DMX B 16-bit Enable" }, |
| 1012 | { 51, "sACN 16-bit Enable" }, |
| 1013 | { 52, "Dimmer Zone" }, |
| 1014 | { 0, NULL((void*)0) } |
| 1015 | }; |
| 1016 | static value_string_ext acn_blob_dimmer_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_properties2_field_name ) / sizeof ((acn_blob_dimmer_properties2_field_name)[0]))-1, acn_blob_dimmer_properties2_field_name , "acn_blob_dimmer_properties2_field_name", ((void*)0) }; |
| 1017 | |
| 1018 | static const value_string acn_blob_dimmer_rack_properties2_field_name[] = { |
| 1019 | { 1, "System" }, |
| 1020 | { 2, "Processor" }, |
| 1021 | { 3, "Rack" }, |
| 1022 | { 4, "Lug" }, |
| 1023 | { 5, "Module" }, |
| 1024 | { 6, "Station" }, |
| 1025 | { 7, "Port" }, |
| 1026 | { 8, "Subdevice" }, |
| 1027 | { 9, "Space" }, |
| 1028 | { 10, "UDN" }, |
| 1029 | { 11, "Reserved" }, |
| 1030 | { 12, "Rack CID" }, |
| 1031 | { 13, "Rack Number" }, |
| 1032 | { 14, "Rack Name" }, |
| 1033 | { 15, "Rack Model" }, |
| 1034 | { 16, "Rack AF Enable" }, |
| 1035 | { 17, "Temperature Format" }, |
| 1036 | { 18, "Data Loss Behavior DMX A" }, |
| 1037 | { 19, "Data Loss Behavior DMX B" }, |
| 1038 | { 20, "Data Loss Behavior sACN" }, |
| 1039 | { 21, "Data Loss Cross/Wait Time DMX A" }, |
| 1040 | { 22, "Data Loss Cross/Wait Time DMX B" }, |
| 1041 | { 23, "Data Loss Wait Time sACN" }, |
| 1042 | { 24, "Data Loss Fade Time DMX A" }, |
| 1043 | { 25, "Data Loss Fade Time DMX B" }, |
| 1044 | { 26, "Data Loss Fade Time sACN" }, |
| 1045 | { 27, "Data Loss Preset DMX A" }, |
| 1046 | { 28, "Data Loss Preset DMX B" }, |
| 1047 | { 29, "Data Loss Preset sACN" }, |
| 1048 | { 30, "Data Port Priority DMX A" }, |
| 1049 | { 31, "Data Port Priority DMX B" }, |
| 1050 | { 32, "Data Port Enabled DMX A" }, |
| 1051 | { 33, "Data Port Enabled DMX B" }, |
| 1052 | { 34, "Data Port Enabled sACN" }, |
| 1053 | { 35, "16 Bit Enabled DMX A" }, |
| 1054 | { 36, "16 Bit Enabled DMX B" }, |
| 1055 | { 37, "16 Bit Enabled sACN" }, |
| 1056 | { 38, "Patch From Home Screen" }, |
| 1057 | { 39, "SCR Off Time" }, |
| 1058 | { 40, "Time Mode" }, |
| 1059 | { 41, "Offset from UTC" }, |
| 1060 | { 42, "Universal Hold Last Look Time" }, |
| 1061 | { 43, "Reactivate Presets On Boot" }, |
| 1062 | { 44, "Voltage High Warning Level" }, |
| 1063 | { 45, "Temperature High Warning Level" }, |
| 1064 | { 46, "Fan Operation Timing" }, |
| 1065 | { 47, "Allow Backplane Communication Errors" }, |
| 1066 | { 48, "Activate Presets on Boot" }, |
| 1067 | { 49, "SmartLink2 Power Supply Enable" }, |
| 1068 | { 50, "Remote Record Enable" }, |
| 1069 | { 51, "System Number" }, |
| 1070 | { 52, "Architectural Priority" }, |
| 1071 | { 53, "Data Loss Preset Space DMX A" }, |
| 1072 | { 54, "Data Loss Preset Space DMX B" }, |
| 1073 | { 55, "Arch. Off Behavior" }, |
| 1074 | { 0, NULL((void*)0) } |
| 1075 | }; |
| 1076 | static value_string_ext acn_blob_dimmer_rack_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_rack_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_rack_properties2_field_name ) / sizeof ((acn_blob_dimmer_rack_properties2_field_name)[0]) )-1, acn_blob_dimmer_rack_properties2_field_name, "acn_blob_dimmer_rack_properties2_field_name" , ((void*)0) }; |
| 1077 | |
| 1078 | static const value_string acn_blob_dimmer_rack_status_properties2_field_name[] = { |
| 1079 | { 1, "System" }, |
| 1080 | { 2, "Processor" }, |
| 1081 | { 3, "Rack" }, |
| 1082 | { 4, "Lug" }, |
| 1083 | { 5, "Module" }, |
| 1084 | { 6, "Station" }, |
| 1085 | { 7, "Port" }, |
| 1086 | { 8, "Subdevice" }, |
| 1087 | { 9, "Space" }, |
| 1088 | { 10, "UDN" }, |
| 1089 | { 11, "Reserved" }, |
| 1090 | { 12, "CPU Temperature" }, |
| 1091 | { 13, "Time of Last Reboot" }, |
| 1092 | { 14, "Time Now" }, |
| 1093 | { 15, "Rack Phasing" }, |
| 1094 | { 16, "Power Frequency" }, |
| 1095 | { 17, "Phase A Voltage" }, |
| 1096 | { 18, "Phase B Voltage" }, |
| 1097 | { 19, "Phase C Voltage" }, |
| 1098 | { 20, "DMX A Port Status" }, |
| 1099 | { 21, "DMX B Port Status" }, |
| 1100 | { 22, "Active Preset Group IDs" }, |
| 1101 | { 23, "Active Preset Group ID[0]" }, |
| 1102 | { 24, "Active Preset Group ID[1]" }, |
| 1103 | { 25, "Active Preset Group ID[2]" }, |
| 1104 | { 26, "Active Preset Group ID[3]" }, |
| 1105 | { 27, "Active Preset Group ID[4]" }, |
| 1106 | { 28, "Active Preset Group ID[5]" }, |
| 1107 | { 29, "Active Preset Group ID[6]" }, |
| 1108 | { 30, "Active Preset Group ID[7]" }, |
| 1109 | { 31, "Active Preset Group ID[8]" }, |
| 1110 | { 32, "Active Preset Group ID[9]" }, |
| 1111 | { 33, "Active Preset Group ID[10]" }, |
| 1112 | { 34, "Active Preset Group ID[11]" }, |
| 1113 | { 35, "Active Preset Group ID[12]" }, |
| 1114 | { 36, "Active Preset Group ID[13]" }, |
| 1115 | { 37, "Active Preset Group ID[14]" }, |
| 1116 | { 38, "Active Preset Group ID[15]" }, |
| 1117 | { 39, "Active Preset Group ID[16]" }, |
| 1118 | { 40, "Active Preset Group ID[17]" }, |
| 1119 | { 41, "Active Preset Group ID[18]" }, |
| 1120 | { 42, "Active Preset Group ID[19]" }, |
| 1121 | { 43, "Active Preset Group ID[20]" }, |
| 1122 | { 44, "Active Preset Group ID[21]" }, |
| 1123 | { 45, "Active Preset Group ID[22]" }, |
| 1124 | { 46, "Active Preset Group ID[23]" }, |
| 1125 | { 47, "Active Preset Group ID[24]" }, |
| 1126 | { 48, "Active Preset Group ID[25]" }, |
| 1127 | { 49, "Active Preset Group ID[26]" }, |
| 1128 | { 50, "Active Preset Group ID[27]" }, |
| 1129 | { 51, "Active Preset Group ID[28]" }, |
| 1130 | { 52, "Active Preset Group ID[29]" }, |
| 1131 | { 53, "Active Preset Group ID[30]" }, |
| 1132 | { 54, "Active Preset Group ID[31]" }, |
| 1133 | { 55, "Active Preset Group ID[32]" }, |
| 1134 | { 56, "Active Preset Group ID[33]" }, |
| 1135 | { 57, "Active Preset Group ID[34]" }, |
| 1136 | { 58, "Active Preset Group ID[35]" }, |
| 1137 | { 59, "Active Preset Group ID[36]" }, |
| 1138 | { 60, "Active Preset Group ID[37]" }, |
| 1139 | { 61, "Active Preset Group ID[38]" }, |
| 1140 | { 62, "Active Preset Group ID[39]" }, |
| 1141 | { 63, "Active Preset Group ID[40]" }, |
| 1142 | { 64, "Active Preset Group ID[41]" }, |
| 1143 | { 65, "Active Preset Group ID[42]" }, |
| 1144 | { 66, "Active Preset Group ID[43]" }, |
| 1145 | { 67, "Active Preset Group ID[44]" }, |
| 1146 | { 68, "Active Preset Group ID[45]" }, |
| 1147 | { 69, "Active Preset Group ID[46]" }, |
| 1148 | { 70, "Active Preset Group ID[47]" }, |
| 1149 | { 71, "Active Preset Group ID[48]" }, |
| 1150 | { 72, "Active Preset Group ID[49]" }, |
| 1151 | { 73, "Active Preset Group ID[50]" }, |
| 1152 | { 74, "Active Preset Group ID[51]" }, |
| 1153 | { 75, "Active Preset Group ID[52]" }, |
| 1154 | { 76, "Active Preset Group ID[53]" }, |
| 1155 | { 77, "Active Preset Group ID[54]" }, |
| 1156 | { 78, "Active Preset Group ID[55]" }, |
| 1157 | { 79, "Active Preset Group ID[56]" }, |
| 1158 | { 80, "Active Preset Group ID[57]" }, |
| 1159 | { 81, "Active Preset Group ID[58]" }, |
| 1160 | { 82, "Active Preset Group ID[59]" }, |
| 1161 | { 83, "Active Preset Group ID[60]" }, |
| 1162 | { 84, "Active Preset Group ID[61]" }, |
| 1163 | { 85, "Active Preset Group ID[62]" }, |
| 1164 | { 86, "Active Preset Group ID[63]" }, |
| 1165 | { 87, "Rack AF State" }, |
| 1166 | { 88, "Number of Stored Presets for This Rack" }, |
| 1167 | { 89, "Number of Lugs in This Rack" }, |
| 1168 | { 90, "DSP Version" }, |
| 1169 | { 91, "AF Card Version Slot 1" }, |
| 1170 | { 92, "AF Card Version Slot 2" }, |
| 1171 | { 93, "AF Card Version Slot 3" }, |
| 1172 | { 94, "AF Card Version Slot 4" }, |
| 1173 | { 95, "HCS08 Version" }, |
| 1174 | { 96, "FPGA Version" }, |
| 1175 | { 97, "Upload Progress AF Card 1" }, |
| 1176 | { 98, "Upload Progress AF Card 2" }, |
| 1177 | { 99, "Upload Progress AF Card 3" }, |
| 1178 | { 100, "Upload Progress AF Card 4" }, |
| 1179 | { 0, NULL((void*)0) } |
| 1180 | }; |
| 1181 | static value_string_ext acn_blob_dimmer_rack_status_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_rack_status_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_rack_status_properties2_field_name ) / sizeof ((acn_blob_dimmer_rack_status_properties2_field_name )[0]))-1, acn_blob_dimmer_rack_status_properties2_field_name, "acn_blob_dimmer_rack_status_properties2_field_name", ((void *)0) }; |
| 1182 | |
| 1183 | static const value_string acn_blob_dimmer_status_properties2_field_name[] = { |
| 1184 | { 1, "System" }, |
| 1185 | { 2, "Processor" }, |
| 1186 | { 3, "Rack" }, |
| 1187 | { 4, "Lug" }, |
| 1188 | { 5, "Module" }, |
| 1189 | { 6, "Station" }, |
| 1190 | { 7, "Port" }, |
| 1191 | { 8, "Subdevice" }, |
| 1192 | { 9, "Space" }, |
| 1193 | { 10, "UDN" }, |
| 1194 | { 11, "Reserved" }, |
| 1195 | { 12, "Source Winning Control" }, |
| 1196 | { 13, "Priority of Winning Source" }, |
| 1197 | { 14, "Winning Level" }, |
| 1198 | { 15, "Winning DMX A Level" }, |
| 1199 | { 16, "Winning DMX B Level" }, |
| 1200 | { 17, "Winning sACN Level" }, |
| 1201 | { 18, "Source Winning Control DD" }, |
| 1202 | { 19, "Priority of Winning Source DD" }, |
| 1203 | { 20, "Winning Level DD" }, |
| 1204 | { 21, "Winning DMX A Level DD" }, |
| 1205 | { 22, "Winning DMX B Level DD" }, |
| 1206 | { 23, "Winning DMX sACN Level DD" }, |
| 1207 | { 24, "Actual Load" }, |
| 1208 | { 25, "Load Status" }, |
| 1209 | { 0, NULL((void*)0) } |
| 1210 | }; |
| 1211 | static value_string_ext acn_blob_dimmer_status_properties2_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_status_properties2_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_status_properties2_field_name ) / sizeof ((acn_blob_dimmer_status_properties2_field_name)[0 ]))-1, acn_blob_dimmer_status_properties2_field_name, "acn_blob_dimmer_status_properties2_field_name" , ((void*)0) }; |
| 1212 | |
| 1213 | |
| 1214 | static const value_string acn_blob_direct_control_operation_field_name[] = { |
| 1215 | { 1, "Space" }, |
| 1216 | { 2, "Dimmer Number" }, |
| 1217 | { 3, "DD Side" }, |
| 1218 | { 4, "Level" }, |
| 1219 | { 5, "Priority" }, |
| 1220 | { 0, NULL((void*)0) } |
| 1221 | }; |
| 1222 | |
| 1223 | static const value_string acn_blob_error3_field_name[] = { |
| 1224 | { 1, "System" }, |
| 1225 | { 2, "Processor" }, |
| 1226 | { 3, "Rack" }, |
| 1227 | { 4, "Lug" }, |
| 1228 | { 5, "Module" }, |
| 1229 | { 6, "Station" }, |
| 1230 | { 7, "Port" }, |
| 1231 | { 8, "Subdevice" }, |
| 1232 | { 9, "Space" }, |
| 1233 | { 10, "UDN" }, |
| 1234 | { 11, "sACN Address" }, |
| 1235 | { 12, "Error Type" }, |
| 1236 | { 13, "Severity" }, |
| 1237 | { 14, "Timestamp" }, |
| 1238 | { 15, "Error Text" }, |
| 1239 | { 0, NULL((void*)0) } |
| 1240 | }; |
| 1241 | |
| 1242 | static const value_string acn_blob_field_type_vals[] = { |
| 1243 | { ACN_BLOB_FIELD_TYPE11, "1 Byte Signed Integer" }, |
| 1244 | { ACN_BLOB_FIELD_TYPE22, "2 Bytes Signed Integer" }, |
| 1245 | { ACN_BLOB_FIELD_TYPE33, "4 Bytes Signed Integer" }, |
| 1246 | { ACN_BLOB_FIELD_TYPE44, "8 Bytes Signed Integer" }, |
| 1247 | { ACN_BLOB_FIELD_TYPE55, "1 Byte Unsigned Integer" }, |
| 1248 | { ACN_BLOB_FIELD_TYPE66, "2 Bytes Unsigned Integer" }, |
| 1249 | { ACN_BLOB_FIELD_TYPE77, "4 Bytes Unsigned Integer" }, |
| 1250 | { ACN_BLOB_FIELD_TYPE88, "8 Bytes Unsigned Integer" }, |
| 1251 | { ACN_BLOB_FIELD_TYPE99, "Float" }, |
| 1252 | { ACN_BLOB_FIELD_TYPE1010, "Double" }, |
| 1253 | { ACN_BLOB_FIELD_TYPE1111, "Variblob" }, |
| 1254 | { ACN_BLOB_FIELD_TYPE1212, "Ignore" }, |
| 1255 | { 0, NULL((void*)0) } |
| 1256 | }; |
| 1257 | |
| 1258 | static const value_string acn_blob_generate_config_operation_field_name[] = { |
| 1259 | { 1, "First Dimmer" }, |
| 1260 | { 2, "Numbering Style" }, |
| 1261 | { 3, "Use Dimmer Doubling" }, |
| 1262 | { 4, "Default Module Type" }, |
| 1263 | { 0, NULL((void*)0) } |
| 1264 | }; |
| 1265 | |
| 1266 | static const value_string acn_blob_ip_field_name[] = { |
| 1267 | { 1, "IP Address" }, |
| 1268 | { 2, "Subnet Mask" }, |
| 1269 | { 3, "Gateway" }, |
| 1270 | { 0, NULL((void*)0) } |
| 1271 | }; |
| 1272 | |
| 1273 | static const value_string acn_blob_error1_field_name[] = { |
| 1274 | { 1, "System" }, |
| 1275 | { 2, "Processor" }, |
| 1276 | { 3, "Rack" }, |
| 1277 | { 4, "Lug" }, |
| 1278 | { 5, "Module" }, |
| 1279 | { 6, "Station" }, |
| 1280 | { 7, "Port" }, |
| 1281 | { 8, "Subdevice" }, |
| 1282 | /*{9, "Space"}, */ |
| 1283 | { 9, "UDN" }, |
| 1284 | { 10, "sACN Address" }, |
| 1285 | { 11, "Error Type" }, |
| 1286 | { 12, "Severity" }, |
| 1287 | { 13, "Timestamp" }, |
| 1288 | { 14, "Error Text" }, |
| 1289 | { 0, NULL((void*)0) } |
| 1290 | }; |
| 1291 | |
| 1292 | static const value_string acn_blob_error2_field_name[] = { |
| 1293 | { 1, "System" }, |
| 1294 | { 2, "Processor" }, |
| 1295 | { 3, "Rack" }, |
| 1296 | { 4, "Lug" }, |
| 1297 | { 5, "Module" }, |
| 1298 | { 6, "Station" }, |
| 1299 | { 7, "Port" }, |
| 1300 | { 8, "Subdevice" }, |
| 1301 | { 9, "Space" }, |
| 1302 | { 10, "UDN" }, |
| 1303 | { 11, "sACN Address" }, |
| 1304 | { 12, "Error Type" }, |
| 1305 | { 13, "Severity" }, |
| 1306 | { 14, "Timestamp" }, |
| 1307 | { 15, "Error Text" }, |
| 1308 | { 0, NULL((void*)0) } |
| 1309 | }; |
| 1310 | |
| 1311 | static const value_string acn_blob_metadata_devices_field_name[] = { |
| 1312 | { 1, "Device Type" }, |
| 1313 | { 2, "Identifier Name 1" }, |
| 1314 | { 3, "Identifier Name 2" }, |
| 1315 | { 4, "Identifier Name 3" }, |
| 1316 | { 5, "Identifier Name 4" }, |
| 1317 | { 0, NULL((void*)0) } |
| 1318 | }; |
| 1319 | |
| 1320 | static const value_string acn_blob_metadata_field_name[] = { |
| 1321 | { 1, "Device Type" }, |
| 1322 | { 2, "Metadata Type" }, |
| 1323 | { 3, "Identifier Name 1" }, |
| 1324 | { 4, "Identifier Name 2" }, |
| 1325 | { 5, "Identifier Name 3" }, |
| 1326 | { 6, "Identifier Name 4" }, |
| 1327 | { 7, "Metadata 1" }, |
| 1328 | { 8, "Metadata 2" }, |
| 1329 | { 9, "Metadata 3" }, |
| 1330 | { 10, "Metadata 4" }, |
| 1331 | { 11, "Metadata 5" }, |
| 1332 | { 12, "Metadata 6" }, |
| 1333 | { 13, "Metadata 7" }, |
| 1334 | { 14, "Metadata 8" }, |
| 1335 | { 15, "Device CID" }, |
| 1336 | { 0, NULL((void*)0) } |
| 1337 | }; |
| 1338 | |
| 1339 | static const value_string acn_blob_metadata_types_field_name[] = { |
| 1340 | { 1, "Metadata Type" }, |
| 1341 | { 2, "Identifier Name 1" }, |
| 1342 | { 3, "Identifier Name 2" }, |
| 1343 | { 4, "Identifier Name 3" }, |
| 1344 | { 5, "Identifier Name 4" }, |
| 1345 | { 6, "Identifier Name 5" }, |
| 1346 | { 7, "Identifier Name 6" }, |
| 1347 | { 8, "Identifier Name 7" }, |
| 1348 | { 9, "Identifier Name 8" }, |
| 1349 | { 0, NULL((void*)0) } |
| 1350 | }; |
| 1351 | |
| 1352 | static const value_string acn_blob_time1_field_name[] = { |
| 1353 | { 1, "Time" }, |
| 1354 | { 2, "Time Zone Name" }, |
| 1355 | { 3, "Time Zone Offset Hour" }, |
| 1356 | { 4, "Time Zone Offset Min" }, |
| 1357 | { 5, "Time Zone Offset Sec" }, |
| 1358 | { 6, "DST Name" }, |
| 1359 | { 7, "Start Month" }, |
| 1360 | { 8, "Start Week" }, |
| 1361 | { 9, "Start Day" }, |
| 1362 | { 10, "End Month" }, |
| 1363 | { 11, "End Week" }, |
| 1364 | { 12, "End Day" }, |
| 1365 | { 13, "Timed Event Update" }, |
| 1366 | { 0, NULL((void*)0) } |
| 1367 | }; |
| 1368 | |
| 1369 | static const value_string acn_blob_dimmer_properties1_field_name[] = { |
| 1370 | { 1, "System" }, |
| 1371 | { 2, "Processor" }, |
| 1372 | { 3, "Rack" }, |
| 1373 | { 4, "Lug" }, |
| 1374 | { 5, "Module" }, |
| 1375 | { 6, "Station" }, |
| 1376 | { 7, "Port" }, |
| 1377 | { 8, "Subdevice" }, |
| 1378 | { 9, "Space" }, |
| 1379 | { 10, "UDN" }, |
| 1380 | { 11, "Reserved" }, |
| 1381 | { 12, "Dimmer Name" }, |
| 1382 | { 13, "Dimmer Module" }, |
| 1383 | { 14, "Dimmer Mode" }, |
| 1384 | { 15, "Dimmer Control" }, |
| 1385 | { 16, "Dimmer Curve" }, |
| 1386 | { 17, "On Level Percent" }, |
| 1387 | { 18, "Off Level Percent" }, |
| 1388 | { 19, "On Time(sec)" }, |
| 1389 | { 20, "Off Time(sec)" }, |
| 1390 | { 21, "Dimmer AF Enabled" }, |
| 1391 | { 22, "Threshold" }, |
| 1392 | { 23, "Min Scale" }, |
| 1393 | { 24, "Unregulated Min Scale" }, |
| 1394 | { 25, "Max Scale" }, |
| 1395 | { 26, "Unregulated Max Scale" }, |
| 1396 | { 27, "Voltage Regulation" }, |
| 1397 | { 28, "Preheat Enable" }, |
| 1398 | { 29, "Preheat Time" }, |
| 1399 | { 30, "DC Output Prevent" }, |
| 1400 | { 31, "Inrush Protect" }, |
| 1401 | { 32, "AF Sensitivity" }, |
| 1402 | { 33, "AF Reaction Time" }, |
| 1403 | { 34, "Scale Load" }, |
| 1404 | { 35, "PTIO" }, |
| 1405 | { 36, "Allow In Preset" }, |
| 1406 | { 37, "Allow In Panic" }, |
| 1407 | { 38, "Allow In Panic DD" }, |
| 1408 | /*{39, "Loads Reporting Mode"}, |
| 1409 | {40, "New Dimmer Space Number"}, */ |
| 1410 | { 39, "Report No Loads Enable" }, |
| 1411 | { 40, "Loads Error Reporting Enable" }, |
| 1412 | { 41, "Dimmer Space" }, |
| 1413 | { 42, "New Dimmer Number" }, |
| 1414 | { 43, "DMX A Patch" }, |
| 1415 | { 44, "DMX B Patch" }, |
| 1416 | { 45, "sACN Patch" }, |
| 1417 | { 46, "DMX A Patch DD" }, |
| 1418 | { 47, "DMX B Patch DD" }, |
| 1419 | { 48, "sACN Patch DD" }, |
| 1420 | { 0, NULL((void*)0) } |
| 1421 | }; |
| 1422 | static value_string_ext acn_blob_dimmer_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_properties1_field_name ) / sizeof ((acn_blob_dimmer_properties1_field_name)[0]))-1, acn_blob_dimmer_properties1_field_name , "acn_blob_dimmer_properties1_field_name", ((void*)0) }; |
| 1423 | |
| 1424 | static const value_string acn_blob_dimmer_load_properties1_field_name[] = { |
| 1425 | { 1, "System" }, |
| 1426 | { 2, "Processor" }, |
| 1427 | { 3, "Rack" }, |
| 1428 | { 4, "Lug" }, |
| 1429 | { 5, "Module" }, |
| 1430 | { 6, "Station" }, |
| 1431 | { 7, "Port" }, |
| 1432 | { 8, "Subdevice" }, |
| 1433 | { 9, "Space" }, |
| 1434 | { 10, "UDN" }, |
| 1435 | { 11, "Reserved" }, |
| 1436 | { 12, "Is Load Recorded" }, |
| 1437 | { 13, "Output Voltage Step 1" }, |
| 1438 | { 14, "Output Voltage Step 2" }, |
| 1439 | { 15, "Output Voltage Step 3" }, |
| 1440 | { 16, "Output Voltage Step 4" }, |
| 1441 | { 17, "Output Voltage Step 5" }, |
| 1442 | { 18, "Output Voltage Step 6" }, |
| 1443 | { 19, "Output Voltage Step 7" }, |
| 1444 | { 20, "Output Voltage Step 8" }, |
| 1445 | { 21, "Output Voltage Step 9" }, |
| 1446 | { 22, "Output Voltage Step 10" }, |
| 1447 | { 23, "Output Voltage Step 11" }, |
| 1448 | { 24, "Output Voltage Step 12" }, |
| 1449 | { 25, "Output Voltage Step 13" }, |
| 1450 | { 26, "Output Voltage Step 14" }, |
| 1451 | { 27, "Output Voltage Step 15" }, |
| 1452 | { 28, "Output Voltage Step 16" }, |
| 1453 | { 29, "Output Voltage Step 17" }, |
| 1454 | { 30, "Output Voltage Step 18" }, |
| 1455 | { 31, "Output Voltage Step 19" }, |
| 1456 | { 32, "Output Voltage Step 20" }, |
| 1457 | { 33, "Amperage Step 1" }, |
| 1458 | { 34, "Amperage Step 2" }, |
| 1459 | { 35, "Amperage Step 3" }, |
| 1460 | { 36, "Amperage Step 4" }, |
| 1461 | { 37, "Amperage Step 5" }, |
| 1462 | { 38, "Amperage Step 6" }, |
| 1463 | { 39, "Amperage Step 7" }, |
| 1464 | { 40, "Amperage Step 8" }, |
| 1465 | { 41, "Amperage Step 9" }, |
| 1466 | { 42, "Amperage Step 10" }, |
| 1467 | { 43, "Amperage Step 11" }, |
| 1468 | { 44, "Amperage Step 12" }, |
| 1469 | { 45, "Amperage Step 13" }, |
| 1470 | { 46, "Amperage Step 14" }, |
| 1471 | { 47, "Amperage Step 15" }, |
| 1472 | { 48, "Amperage Step 16" }, |
| 1473 | { 49, "Amperage Step 17" }, |
| 1474 | { 50, "Amperage Step 18" }, |
| 1475 | { 51, "Amperage Step 19" }, |
| 1476 | { 52, "Amperage Step 20" }, |
| 1477 | { 53, "Voltage Time Step 1" }, |
| 1478 | { 54, "Voltage Time Step 2" }, |
| 1479 | { 55, "Voltage Time Step 3" }, |
| 1480 | { 56, "Voltage Time Step 4" }, |
| 1481 | { 57, "Voltage Time Step 5" }, |
| 1482 | { 58, "Voltage Time Step 6" }, |
| 1483 | { 59, "Voltage Time Step 7" }, |
| 1484 | { 60, "Voltage Time Step 8" }, |
| 1485 | { 61, "Voltage Time Step 9" }, |
| 1486 | { 62, "Voltage Time Step 10" }, |
| 1487 | { 63, "Voltage Time Step 11" }, |
| 1488 | { 64, "Voltage Time Step 12" }, |
| 1489 | { 65, "Voltage Time Step 13" }, |
| 1490 | { 66, "Voltage Time Step 14" }, |
| 1491 | { 67, "Voltage Time Step 15" }, |
| 1492 | { 68, "Voltage Time Step 16" }, |
| 1493 | { 69, "Voltage Time Step 17" }, |
| 1494 | { 70, "Voltage Time Step 18" }, |
| 1495 | { 71, "Voltage Time Step 19" }, |
| 1496 | { 72, "Voltage Time Step 20" }, |
| 1497 | { 0, NULL((void*)0) } |
| 1498 | }; |
| 1499 | static value_string_ext acn_blob_dimmer_load_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_load_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_load_properties1_field_name ) / sizeof ((acn_blob_dimmer_load_properties1_field_name)[0]) )-1, acn_blob_dimmer_load_properties1_field_name, "acn_blob_dimmer_load_properties1_field_name" , ((void*)0) }; |
| 1500 | |
| 1501 | static const value_string acn_blob_dimmer_rack_properties1_field_name[] = { |
| 1502 | { 1, "System" }, |
| 1503 | { 2, "Processor" }, |
| 1504 | { 3, "Rack" }, |
| 1505 | { 4, "Lug" }, |
| 1506 | { 5, "Module" }, |
| 1507 | { 6, "Station" }, |
| 1508 | { 7, "Port" }, |
| 1509 | { 8, "Subdevice" }, |
| 1510 | { 9, "Space" }, |
| 1511 | { 10, "UDN" }, |
| 1512 | { 11, "Reserved" }, |
| 1513 | { 12, "Rack CID" }, |
| 1514 | { 13, "Rack Number" }, |
| 1515 | { 14, "Rack Name" }, |
| 1516 | { 15, "Rack Model" }, |
| 1517 | { 16, "Rack AF Enable" }, |
| 1518 | { 17, "Temperature Format" }, |
| 1519 | { 18, "Data Loss Behavior DMX A" }, |
| 1520 | { 19, "Data Loss Behavior DMX B" }, |
| 1521 | { 20, "Data Loss Behavior sACN" }, |
| 1522 | { 21, "Data Loss Cross/Wait Time DMX A" }, |
| 1523 | { 22, "Data Loss Cross/Wait Time DMX B" }, |
| 1524 | { 23, "Data Loss Wait Time sACN" }, |
| 1525 | { 24, "Data Loss Fade Time DMX A" }, |
| 1526 | { 25, "Data Loss Fade Time DMX B" }, |
| 1527 | { 26, "Data Loss Fade Time sACN" }, |
| 1528 | { 27, "Data Loss Preset DMX A" }, |
| 1529 | { 28, "Data Loss Preset DMX B" }, |
| 1530 | { 29, "Data Port Priority DMX A" }, |
| 1531 | { 30, "Data Port Priority DMX B" }, |
| 1532 | { 31, "Data Port Enabled DMX A" }, |
| 1533 | { 32, "Data Port Enabled DMX B" }, |
| 1534 | { 33, "Data Port Enabled sACN" }, |
| 1535 | { 34, "16 Bit Enabled DMX A" }, |
| 1536 | { 35, "16 Bit Enabled DMX B" }, |
| 1537 | { 36, "16 Bit Enabled sACN" }, |
| 1538 | { 37, "Patch From Home Screen" }, |
| 1539 | { 38, "SCR Off Time" }, |
| 1540 | { 39, "Time Mode" }, |
| 1541 | { 40, "Offset from UTC" }, |
| 1542 | { 41, "Universal Hold Last Look Time" }, |
| 1543 | { 42, "Reactivate Presets On Boot" }, |
| 1544 | { 43, "Voltage High Warning Level" }, |
| 1545 | { 44, "Temperature High Warning Level" }, |
| 1546 | { 45, "Fan Operation Timing" }, |
| 1547 | { 46, "Allow Backplane Communication Errors" }, |
| 1548 | { 0, NULL((void*)0) } |
| 1549 | }; |
| 1550 | static value_string_ext acn_blob_dimmer_rack_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_rack_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_rack_properties1_field_name ) / sizeof ((acn_blob_dimmer_rack_properties1_field_name)[0]) )-1, acn_blob_dimmer_rack_properties1_field_name, "acn_blob_dimmer_rack_properties1_field_name" , ((void*)0) }; |
| 1551 | |
| 1552 | |
| 1553 | static const value_string acn_blob_dimmer_rack_status_properties1_field_name[] = { |
| 1554 | { 1, "System" }, |
| 1555 | { 2, "Processor" }, |
| 1556 | { 3, "Rack" }, |
| 1557 | { 4, "Lug" }, |
| 1558 | { 5, "Module" }, |
| 1559 | { 6, "Station" }, |
| 1560 | { 7, "Port" }, |
| 1561 | { 8, "Subdevice" }, |
| 1562 | { 9, "Space" }, |
| 1563 | { 10, "UDN" }, |
| 1564 | { 11, "Reserved" }, |
| 1565 | { 12, "CPU Temperature" }, |
| 1566 | { 13, "Time of Last Reboot" }, |
| 1567 | { 14, "Time Now" }, |
| 1568 | { 15, "Rack Phasing" }, |
| 1569 | { 16, "Power Frequency" }, |
| 1570 | { 17, "Phase A Voltage" }, |
| 1571 | { 18, "Phase B Voltage" }, |
| 1572 | { 19, "Phase C Voltage" }, |
| 1573 | { 20, "DMX A Port Status" }, |
| 1574 | { 21, "DMX B Port Status" }, |
| 1575 | { 22, "Rack AF State" }, |
| 1576 | { 23, "Number of Stored Presets for This Rack" }, |
| 1577 | { 24, "Number of Lugs in This Rack" }, |
| 1578 | { 25, "DSP Version" }, |
| 1579 | { 26, "AF Card Version Slot 1" }, |
| 1580 | { 27, "AF Card Version Slot 2" }, |
| 1581 | { 28, "AF Card Version Slot 3" }, |
| 1582 | { 29, "AF Card Version Slot 4" }, |
| 1583 | { 30, "HCS08 Version" }, |
| 1584 | { 31, "FPGA Version" }, |
| 1585 | { 32, "Upload Progress AF Card 1" }, |
| 1586 | { 33, "Upload Progress AF Card 2" }, |
| 1587 | { 34, "Upload Progress AF Card 3" }, |
| 1588 | { 35, "Upload Progress AF Card 4" }, |
| 1589 | { 0, NULL((void*)0) } |
| 1590 | }; |
| 1591 | static value_string_ext acn_blob_dimmer_rack_status_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_rack_status_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_rack_status_properties1_field_name ) / sizeof ((acn_blob_dimmer_rack_status_properties1_field_name )[0]))-1, acn_blob_dimmer_rack_status_properties1_field_name, "acn_blob_dimmer_rack_status_properties1_field_name", ((void *)0) }; |
| 1592 | |
| 1593 | static const value_string acn_blob_dimmer_status_properties1_field_name[] = { |
| 1594 | { 1, "System" }, |
| 1595 | { 2, "Processor" }, |
| 1596 | { 3, "Rack" }, |
| 1597 | { 4, "Lug" }, |
| 1598 | { 5, "Module" }, |
| 1599 | { 6, "Station" }, |
| 1600 | { 7, "Port" }, |
| 1601 | { 8, "Subdevice" }, |
| 1602 | { 9, "Space" }, |
| 1603 | { 10, "UDN" }, |
| 1604 | { 11, "Reserved" }, |
| 1605 | { 12, "Source Winning Control" }, |
| 1606 | { 13, "Priority of Winning Source" }, |
| 1607 | { 14, "Winning Level" }, |
| 1608 | { 15, "Winning DMX A Level" }, |
| 1609 | { 16, "Winning DMX B Level" }, |
| 1610 | { 17, "Winning sACN Level" }, |
| 1611 | { 18, "Source Winning Control DD" }, |
| 1612 | { 19, "Priority of Winning Source DD" }, |
| 1613 | { 20, "Winning Level DD" }, |
| 1614 | { 21, "Winning DMX A Level DD" }, |
| 1615 | { 22, "Winning DMX B Level DD" }, |
| 1616 | { 23, "Winning DMX sACN Level DD" }, |
| 1617 | { 24, "Actual Load" }, |
| 1618 | { 0, NULL((void*)0) } |
| 1619 | }; |
| 1620 | static value_string_ext acn_blob_dimmer_status_properties1_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_dimmer_status_properties1_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_dimmer_status_properties1_field_name ) / sizeof ((acn_blob_dimmer_status_properties1_field_name)[0 ]))-1, acn_blob_dimmer_status_properties1_field_name, "acn_blob_dimmer_status_properties1_field_name" , ((void*)0) }; |
| 1621 | |
| 1622 | static const value_string acn_blob_preset_operation_field_name[] = { |
| 1623 | { 1, "Operation Type" }, |
| 1624 | { 2, "Preset Number" }, |
| 1625 | { 3, "Space" }, |
| 1626 | { 0, NULL((void*)0) } |
| 1627 | }; |
| 1628 | |
| 1629 | static const value_string acn_blob_preset_properties_field_name[] = { |
| 1630 | { 1, "System" }, |
| 1631 | { 2, "Processor" }, |
| 1632 | { 3, "Rack" }, |
| 1633 | { 4, "Lug" }, |
| 1634 | { 5, "Module" }, |
| 1635 | { 6, "Station" }, |
| 1636 | { 7, "Port" }, |
| 1637 | { 8, "Subdevice" }, |
| 1638 | { 9, "Space" }, |
| 1639 | { 10, "UDN" }, |
| 1640 | { 11, "Reserved" }, |
| 1641 | { 12, "Preset Number" }, |
| 1642 | { 13, "Preset Name" }, |
| 1643 | { 14, "Fade In Time" }, |
| 1644 | { 15, "Fade Out Time" }, |
| 1645 | { 16, "Priority" }, |
| 1646 | { 17, "Levels" }, |
| 1647 | { 18, "Level[0]" }, |
| 1648 | { 19, "Level[1]" }, |
| 1649 | { 20, "Level[2]" }, |
| 1650 | { 21, "Level[3]" }, |
| 1651 | { 22, "Level[4]" }, |
| 1652 | { 23, "Level[5]" }, |
| 1653 | { 24, "Level[6]" }, |
| 1654 | { 25, "Level[7]" }, |
| 1655 | { 26, "Level[8]" }, |
| 1656 | { 27, "Level[9]" }, |
| 1657 | { 28, "Level[10]" }, |
| 1658 | { 29, "Level[11]" }, |
| 1659 | { 30, "Level[12]" }, |
| 1660 | { 31, "Level[13]" }, |
| 1661 | { 32, "Level[14]" }, |
| 1662 | { 33, "Level[15]" }, |
| 1663 | { 34, "Level[16]" }, |
| 1664 | { 35, "Level[17]" }, |
| 1665 | { 36, "Level[18]" }, |
| 1666 | { 37, "Level[19]" }, |
| 1667 | { 38, "Level[20]" }, |
| 1668 | { 39, "Level[21]" }, |
| 1669 | { 40, "Level[22]" }, |
| 1670 | { 41, "Level[23]" }, |
| 1671 | { 42, "Level[24]" }, |
| 1672 | { 43, "Level[25]" }, |
| 1673 | { 44, "Level[26]" }, |
| 1674 | { 45, "Level[27]" }, |
| 1675 | { 46, "Level[28]" }, |
| 1676 | { 47, "Level[29]" }, |
| 1677 | { 48, "Level[30]" }, |
| 1678 | { 49, "Level[31]" }, |
| 1679 | { 50, "Level[32]" }, |
| 1680 | { 51, "Level[33]" }, |
| 1681 | { 52, "Level[34]" }, |
| 1682 | { 53, "Level[35]" }, |
| 1683 | { 54, "Level[36]" }, |
| 1684 | { 55, "Level[37]" }, |
| 1685 | { 56, "Level[38]" }, |
| 1686 | { 57, "Level[39]" }, |
| 1687 | { 58, "Level[40]" }, |
| 1688 | { 59, "Level[41]" }, |
| 1689 | { 60, "Level[42]" }, |
| 1690 | { 61, "Level[43]" }, |
| 1691 | { 62, "Level[44]" }, |
| 1692 | { 63, "Level[45]" }, |
| 1693 | { 64, "Level[46]" }, |
| 1694 | { 65, "Level[47]" }, |
| 1695 | { 66, "Level[48]" }, |
| 1696 | { 67, "Level[49]" }, |
| 1697 | { 68, "Level[50]" }, |
| 1698 | { 69, "Level[51]" }, |
| 1699 | { 70, "Level[52]" }, |
| 1700 | { 71, "Level[53]" }, |
| 1701 | { 72, "Level[54]" }, |
| 1702 | { 73, "Level[55]" }, |
| 1703 | { 74, "Level[56]" }, |
| 1704 | { 75, "Level[57]" }, |
| 1705 | { 76, "Level[58]" }, |
| 1706 | { 77, "Level[59]" }, |
| 1707 | { 78, "Level[60]" }, |
| 1708 | { 79, "Level[61]" }, |
| 1709 | { 80, "Level[62]" }, |
| 1710 | { 81, "Level[63]" }, |
| 1711 | { 82, "Level[64]" }, |
| 1712 | { 83, "Level[65]" }, |
| 1713 | { 84, "Level[66]" }, |
| 1714 | { 85, "Level[67]" }, |
| 1715 | { 86, "Level[68]" }, |
| 1716 | { 87, "Level[69]" }, |
| 1717 | { 88, "Level[70]" }, |
| 1718 | { 89, "Level[71]" }, |
| 1719 | { 90, "Level[72]" }, |
| 1720 | { 91, "Level[73]" }, |
| 1721 | { 92, "Level[74]" }, |
| 1722 | { 93, "Level[75]" }, |
| 1723 | { 94, "Level[76]" }, |
| 1724 | { 95, "Level[77]" }, |
| 1725 | { 96, "Level[78]" }, |
| 1726 | { 97, "Level[79]" }, |
| 1727 | { 98, "Level[80]" }, |
| 1728 | { 99, "Level[81]" }, |
| 1729 | { 100, "Level[82]" }, |
| 1730 | { 101, "Level[83]" }, |
| 1731 | { 102, "Level[84]" }, |
| 1732 | { 103, "Level[85]" }, |
| 1733 | { 104, "Level[86]" }, |
| 1734 | { 105, "Level[87]" }, |
| 1735 | { 106, "Level[88]" }, |
| 1736 | { 107, "Level[89]" }, |
| 1737 | { 108, "Level[90]" }, |
| 1738 | { 109, "Level[91]" }, |
| 1739 | { 110, "Level[92]" }, |
| 1740 | { 111, "Level[93]" }, |
| 1741 | { 112, "Level[94]" }, |
| 1742 | { 113, "Level[95]" }, |
| 1743 | { 114, "Level[96]" }, |
| 1744 | { 115, "Level[97]" }, |
| 1745 | { 116, "Level[98]" }, |
| 1746 | { 117, "Level[99]" }, |
| 1747 | { 118, "Level[100]" }, |
| 1748 | { 119, "Level[101]" }, |
| 1749 | { 120, "Level[102]" }, |
| 1750 | { 121, "Level[103]" }, |
| 1751 | { 122, "Level[104]" }, |
| 1752 | { 123, "Level[105]" }, |
| 1753 | { 124, "Level[106]" }, |
| 1754 | { 125, "Level[107]" }, |
| 1755 | { 126, "Level[108]" }, |
| 1756 | { 127, "Level[109]" }, |
| 1757 | { 128, "Level[110]" }, |
| 1758 | { 129, "Level[111]" }, |
| 1759 | { 130, "Level[112]" }, |
| 1760 | { 131, "Level[113]" }, |
| 1761 | { 132, "Level[114]" }, |
| 1762 | { 133, "Level[115]" }, |
| 1763 | { 134, "Level[116]" }, |
| 1764 | { 135, "Level[117]" }, |
| 1765 | { 136, "Level[118]" }, |
| 1766 | { 137, "Level[119]" }, |
| 1767 | { 138, "Level[120]" }, |
| 1768 | { 139, "Level[121]" }, |
| 1769 | { 140, "Level[122]" }, |
| 1770 | { 141, "Level[123]" }, |
| 1771 | { 142, "Level[124]" }, |
| 1772 | { 143, "Level[125]" }, |
| 1773 | { 144, "Level[126]" }, |
| 1774 | { 145, "Level[127]" }, |
| 1775 | { 146, "Level[128]" }, |
| 1776 | { 147, "Level[129]" }, |
| 1777 | { 148, "Level[130]" }, |
| 1778 | { 149, "Level[131]" }, |
| 1779 | { 150, "Level[132]" }, |
| 1780 | { 151, "Level[133]" }, |
| 1781 | { 152, "Level[134]" }, |
| 1782 | { 153, "Level[135]" }, |
| 1783 | { 154, "Level[136]" }, |
| 1784 | { 155, "Level[137]" }, |
| 1785 | { 156, "Level[138]" }, |
| 1786 | { 157, "Level[139]" }, |
| 1787 | { 158, "Level[140]" }, |
| 1788 | { 159, "Level[141]" }, |
| 1789 | { 160, "Level[142]" }, |
| 1790 | { 161, "Level[143]" }, |
| 1791 | { 162, "Level[144]" }, |
| 1792 | { 163, "Level[145]" }, |
| 1793 | { 164, "Level[146]" }, |
| 1794 | { 165, "Level[147]" }, |
| 1795 | { 166, "Level[148]" }, |
| 1796 | { 167, "Level[149]" }, |
| 1797 | { 168, "Level[150]" }, |
| 1798 | { 169, "Level[151]" }, |
| 1799 | { 170, "Level[152]" }, |
| 1800 | { 171, "Level[153]" }, |
| 1801 | { 172, "Level[154]" }, |
| 1802 | { 173, "Level[155]" }, |
| 1803 | { 174, "Level[156]" }, |
| 1804 | { 175, "Level[157]" }, |
| 1805 | { 176, "Level[158]" }, |
| 1806 | { 177, "Level[159]" }, |
| 1807 | { 178, "Level[160]" }, |
| 1808 | { 179, "Level[161]" }, |
| 1809 | { 180, "Level[162]" }, |
| 1810 | { 181, "Level[163]" }, |
| 1811 | { 182, "Level[164]" }, |
| 1812 | { 183, "Level[165]" }, |
| 1813 | { 184, "Level[166]" }, |
| 1814 | { 185, "Level[167]" }, |
| 1815 | { 186, "Level[168]" }, |
| 1816 | { 187, "Level[169]" }, |
| 1817 | { 188, "Level[170]" }, |
| 1818 | { 189, "Level[171]" }, |
| 1819 | { 190, "Level[172]" }, |
| 1820 | { 191, "Level[173]" }, |
| 1821 | { 192, "Level[174]" }, |
| 1822 | { 193, "Level[175]" }, |
| 1823 | { 194, "Level[176]" }, |
| 1824 | { 195, "Level[177]" }, |
| 1825 | { 196, "Level[178]" }, |
| 1826 | { 197, "Level[179]" }, |
| 1827 | { 198, "Level[180]" }, |
| 1828 | { 199, "Level[181]" }, |
| 1829 | { 200, "Level[182]" }, |
| 1830 | { 201, "Level[183]" }, |
| 1831 | { 202, "Level[184]" }, |
| 1832 | { 203, "Level[185]" }, |
| 1833 | { 204, "Level[186]" }, |
| 1834 | { 205, "Level[187]" }, |
| 1835 | { 206, "Level[188]" }, |
| 1836 | { 207, "Level[189]" }, |
| 1837 | { 208, "Level[190]" }, |
| 1838 | { 209, "Level[191]" }, |
| 1839 | { 0, NULL((void*)0) } |
| 1840 | }; |
| 1841 | static value_string_ext acn_blob_preset_properties_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_preset_properties_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_preset_properties_field_name ) / sizeof ((acn_blob_preset_properties_field_name)[0]))-1, acn_blob_preset_properties_field_name , "acn_blob_preset_properties_field_name", ((void*)0) }; |
| 1842 | |
| 1843 | static const value_string acn_blob_range_type_vals[] = { |
| 1844 | { ACN_BLOB_RANGE_MID0, "Middle range Blob" }, |
| 1845 | { ACN_BLOB_RANGE_START1, "Start range Blob" }, |
| 1846 | { ACN_BLOB_RANGE_END2, "End Range Blob" }, |
| 1847 | { ACN_BLOB_RANGE_SINGLE3, "Single Blob" }, |
| 1848 | { 0, NULL((void*)0) } |
| 1849 | }; |
| 1850 | |
| 1851 | static const value_string acn_blob_set_levels_operation_field_name[] = { |
| 1852 | { 1, "Start Dimmer Address" }, |
| 1853 | { 2, "End Dimmer Address" }, |
| 1854 | { 3, "DD Side" }, |
| 1855 | { 4, "Space" }, |
| 1856 | { 5, "Level" }, |
| 1857 | { 0, NULL((void*)0) } |
| 1858 | }; |
| 1859 | |
| 1860 | static const value_string acn_blob_time2_field_name[] = { |
| 1861 | { 1, "Time" }, |
| 1862 | { 2, "Time Zone Name" }, |
| 1863 | { 3, "Time Zone Offset Hour" }, |
| 1864 | { 4, "Time Zone Offset Min" }, |
| 1865 | { 5, "Time Zone Offset Sec" }, |
| 1866 | { 6, "DST Name" }, |
| 1867 | { 7, "Start Month" }, |
| 1868 | { 8, "Start Week" }, |
| 1869 | { 9, "Start Day" }, |
| 1870 | { 10, "End Month" }, |
| 1871 | { 11, "End Week" }, |
| 1872 | { 12, "End Day" }, |
| 1873 | { 13, "Timed Event Update" }, |
| 1874 | { 14, "Unix Time Zone Environment-compatible Name" }, |
| 1875 | { 0, NULL((void*)0) } |
| 1876 | }; |
| 1877 | |
| 1878 | static const value_string acn_blob_rpc_field_name[] = { |
| 1879 | { 1, "Command" }, |
| 1880 | { 2, "Transaction ID" }, |
| 1881 | { 3, "Number of Arguments" }, |
| 1882 | { 4, "Argument" }, |
| 1883 | { 0, NULL((void*)0) } |
| 1884 | }; |
| 1885 | |
| 1886 | static const value_string acn_blob_dhcp_config_subnet_field_name[] = { |
| 1887 | { 1, "Command" }, |
| 1888 | { 2, "Subnet" }, |
| 1889 | { 3, "Netmask" }, |
| 1890 | { 4, "Given Next Server" }, |
| 1891 | { 5, "Given Router" }, |
| 1892 | { 6, "Given Netmask" }, |
| 1893 | { 7, "Default Lease Time" }, |
| 1894 | { 8, "Max Lease Time" }, |
| 1895 | { 9, "Given Domain Name" }, |
| 1896 | { 10, "Given DNS Servers" }, |
| 1897 | { 11, "Given NTP Server" }, |
| 1898 | { 12, "Given Time Zone Offset Hour" }, |
| 1899 | { 13, "Given Time Zone Offset Minute" }, |
| 1900 | { 14, "Given Time Zone Offset Second" }, |
| 1901 | { 15, "Given Time Zone DST Name" }, |
| 1902 | { 16, "Given Time Zone Start Month" }, |
| 1903 | { 17, "Given Time Zone Start Week" }, |
| 1904 | { 18, "Given Time Zone Start Day" }, |
| 1905 | { 19, "Given Time Zone End Month" }, |
| 1906 | { 20, "Given Time Zone End Week" }, |
| 1907 | { 21, "Given Time Zone End Day" }, |
| 1908 | { 22, "Given UNIX Timezone Name" }, |
| 1909 | { 0, NULL((void*)0) } |
| 1910 | }; |
| 1911 | |
| 1912 | static const value_string acn_blob_dhcp_config_static_route_field_name[] = { |
| 1913 | { 1, "Command" }, |
| 1914 | { 2, "Subnet" }, |
| 1915 | { 3, "Netmask" }, |
| 1916 | { 4, "MAC Address" }, |
| 1917 | { 5, "Host Name" }, |
| 1918 | { 6, "Address" }, |
| 1919 | { 0, NULL((void*)0) } |
| 1920 | }; |
| 1921 | |
| 1922 | static const value_string acn_blob_energy_management_field_name[] = { |
| 1923 | { 1, "Project ID" }, |
| 1924 | { 2, "Space" }, |
| 1925 | { 3, "Circuit Power Count" }, |
| 1926 | { 4, "Circuit" }, |
| 1927 | { 5, "Power" }, |
| 1928 | { 6, "Shed Actual" }, |
| 1929 | { 7, "Shed Potential" }, |
| 1930 | { 0, NULL((void*)0) } |
| 1931 | }; |
| 1932 | |
| 1933 | static const value_string acn_blob_time3_field_name[] = { |
| 1934 | { 1, "Time" }, |
| 1935 | { 2, "Time Zone Index" }, |
| 1936 | { 3, "City" }, |
| 1937 | { 4, "Country" }, |
| 1938 | { 5, "Longitude" }, |
| 1939 | { 6, "Latitude" }, |
| 1940 | { 7, "UTC Offset Hours" }, |
| 1941 | { 8, "UTC Offset Minutes" }, |
| 1942 | { 9, "Time Zone Name" }, |
| 1943 | { 10, "DST Type" }, |
| 1944 | { 11, "DST Start Month" }, |
| 1945 | { 12, "DST Start Week" }, |
| 1946 | { 13, "DST Start Day" }, |
| 1947 | { 14, "DST Start Hours" }, |
| 1948 | { 15, "DST Start Minutes" }, |
| 1949 | { 16, "DST Start Locality" }, |
| 1950 | { 17, "DST Stop Month" }, |
| 1951 | { 18, "DST Stop Week" }, |
| 1952 | { 19, "DST Stop Day" }, |
| 1953 | { 20, "DST Stop Hours" }, |
| 1954 | { 21, "DST Stop Minutes" }, |
| 1955 | { 22, "DST Stop Locality" }, |
| 1956 | { 23, "Timed Event Update" }, |
| 1957 | { 0, NULL((void*)0) } |
| 1958 | }; |
| 1959 | |
| 1960 | static const value_string acn_blob_time3_time_zone_vals[] = { |
| 1961 | { 0, "Aalborg, Denmark - Central European Standard Time : (UTC+01:00)" }, |
| 1962 | { 1, "Aberdeen, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 1963 | { 2, "Abu Dhabi, United Arab Emirates - Gulf Standard Time : (UTC+04:00)" }, |
| 1964 | { 3, "Abuja, Nigeria - West Africa Time : (UTC+01:00)" }, |
| 1965 | { 4, "Accra, Ghana - Greenwich Mean Time : (UTC)" }, |
| 1966 | { 5, "Addis Ababa, Ethiopia - Eastern Africa Standard Time : (UTC+03:00)" }, |
| 1967 | { 6, "Adelaide, SA, Australia - Australian Central Standard Time : (UTC+09:30)" }, |
| 1968 | { 7, "Agana, GU, Guam - Chamorro Standard Time : (UTC+10:00)" }, |
| 1969 | { 8, "Ahmadabad, India - India Standard Time : (UTC+05:30)" }, |
| 1970 | { 9, "Akita, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 1971 | { 10, "Akron, OH, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 1972 | { 11, "Albuquerque, NM, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 1973 | { 12, "Alexandria, VA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 1974 | { 13, "Algiers, Algeria - Central European Standard Time : (UTC+01:00)" }, |
| 1975 | { 14, "Allentown, PA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 1976 | { 15, "Almaty, Kazakhstan - Alma-Ata Time : (UTC+06:00)" }, |
| 1977 | { 16, "Amman, Jordan - Arabia Standard Time : (UTC+03:00)" }, |
| 1978 | { 17, "Amsterdam, Netherlands - Central European Standard Time : (UTC+01:00)" }, |
| 1979 | { 18, "Anaheim, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 1980 | { 19, "Anchorage, AK, USA - Alaska Standard Time : (UTC-09:00)" }, |
| 1981 | { 20, "Andorra la Vella, Andorra - Central European Standard Time : (UTC+01:00)" }, |
| 1982 | { 21, "Angers, France - Central European Standard Time : (UTC+01:00)" }, |
| 1983 | { 22, "Ankara, Turkey - Eastern European Standard Time : (UTC+02:00)" }, |
| 1984 | { 23, "Ann Arbor, MI, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 1985 | { 24, "Antananarivo, Madagascar - Eastern Africa Standard Time : (UTC+03:00)" }, |
| 1986 | { 25, "Antwerp, Belgium - Central European Standard Time : (UTC+01:00)" }, |
| 1987 | { 26, "Apia, Samoa - West Samoa Time : (UTC+14:00)" }, |
| 1988 | { 27, "Ashgabat, Turkmenistan - Turkmenistan Time : (UTC+05:00)" }, |
| 1989 | { 28, "Asmara, Eritrea - Eastern Africa Standard Time : (UTC+03:00)" }, |
| 1990 | { 29, "Athens, Greece - Eastern European Standard Time : (UTC+02:00)" }, |
| 1991 | { 30, "Atlanta, GA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 1992 | { 31, "Auckland, New Zealand - New Zealand Standard Time : (UTC+12:00)" }, |
| 1993 | { 32, "Austin, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 1994 | { 33, "Badajoz, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 1995 | { 34, "Baghdad, Iraq - Arabia Standard Time : (UTC+03:00)" }, |
| 1996 | { 35, "Bakersfield, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 1997 | { 36, "Baku, Azerbaijan - Azerbaijan Time : (UTC+04:00)" }, |
| 1998 | { 37, "Baltimore, MD, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 1999 | { 38, "Bamako, Mali - Greenwich Mean Time : (UTC)" }, |
| 2000 | { 39, "Bandar Seri Begawan, Brunei - Brunei Darussalam Time : (UTC+08:00)" }, |
| 2001 | { 40, "Bangalore, India - India Standard Time : (UTC+05:30)" }, |
| 2002 | { 41, "Bangkok, Thailand - Indochina Time : (UTC+07:00)" }, |
| 2003 | { 42, "Bangui, Central African Republic - West Africa Time : (UTC+01:00)" }, |
| 2004 | { 43, "Banjul, Gambia - Greenwich Mean Time : (UTC)" }, |
| 2005 | { 44, "Barcelona, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2006 | { 45, "Bari, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2007 | { 46, "Baton Rouge, LA, USA - Central Standard Time : (UTC-06:00)" }, |
| 2008 | { 47, "Beaumont, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2009 | { 48, "Beijing, China - China Standard Time : (UTC+08:00)" }, |
| 2010 | { 49, "Beirut, Lebanon - Eastern European Standard Time : (UTC+02:00)" }, |
| 2011 | { 50, "Belem, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2012 | { 51, "Belfast, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2013 | { 52, "Belgrade, Serbia - Central European Standard Time : (UTC+01:00)" }, |
| 2014 | { 53, "Belmopan, Belize - Central Standard Time : (UTC-06:00)" }, |
| 2015 | { 54, "Belo Horizonte, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2016 | { 55, "Bergen, Norway - Central European Standard Time : (UTC+01:00)" }, |
| 2017 | { 56, "Berkeley, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2018 | { 57, "Berlin, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2019 | { 58, "Bern, Switzerland - Central European Standard Time : (UTC+01:00)" }, |
| 2020 | { 59, "Birmingham, AL, USA - Central Standard Time : (UTC-06:00)" }, |
| 2021 | { 60, "Birmingham, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2022 | { 61, "Bishkek, Kyrgyzstan - Kyrgyzstan Time : (UTC+06:00)" }, |
| 2023 | { 62, "Bissau, Guinea-Bissau - Greenwich Mean Time : (UTC)" }, |
| 2024 | { 63, "Boise, ID, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 2025 | { 64, "Bologna, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2026 | { 65, "Bonn, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2027 | { 66, "Bordeaux, France - Central European Standard Time : (UTC+01:00)" }, |
| 2028 | { 67, "Boston, MA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2029 | { 68, "Bournemouth, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2030 | { 69, "Brasilia, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2031 | { 70, "Bratislava, Slovakia - Central European Standard Time : (UTC+01:00)" }, |
| 2032 | { 71, "Brazzaville, Republic of the Congo - West Africa Time : (UTC+01:00)" }, |
| 2033 | { 72, "Bremen, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2034 | { 73, "Brest, France - Central European Standard Time : (UTC+01:00)" }, |
| 2035 | { 74, "Bridgeport, CT, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2036 | { 75, "Bridgetown, Barbados - Atlantic Standard Time : (UTC-04:00)" }, |
| 2037 | { 76, "Brisbane, QLD, Australia - Australian Eastern Standard Time : (UTC+10:00)" }, |
| 2038 | { 77, "Brno, Czech Republic - Central European Standard Time : (UTC+01:00)" }, |
| 2039 | { 78, "Brussels, Belgium - Central European Standard Time : (UTC+01:00)" }, |
| 2040 | { 79, "Bucharest, Romania - Eastern European Standard Time : (UTC+02:00)" }, |
| 2041 | { 80, "Budapest, Hungary - Central European Standard Time : (UTC+01:00)" }, |
| 2042 | { 81, "Buenos Aires, Argentina - Argentina Time : (UTC-03:00)" }, |
| 2043 | { 82, "Buffalo, NY, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2044 | { 83, "Bujumbura, Burundi - South Africa Standard Time : (UTC+02:00)" }, |
| 2045 | { 84, "Cagliari, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2046 | { 85, "Cairo, Egypt - Eastern European Standard Time : (UTC+02:00)" }, |
| 2047 | { 86, "Calgary, AB, Canada - Mountain Standard Time : (UTC-07:00)" }, |
| 2048 | { 87, "Cali, Colombia - Colombia Time : (UTC-05:00)" }, |
| 2049 | { 88, "Canberra, Australia - Australian Eastern Standard Time : (UTC+10:00)" }, |
| 2050 | { 89, "Cape Town, South Africa - South Africa Standard Time : (UTC+02:00)" }, |
| 2051 | { 90, "Caracas, Venezuela - Venezuelan Standard Time : (UTC-04:30)" }, |
| 2052 | { 91, "Cardiff, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2053 | { 92, "Cedar Rapids, IA, USA - Central Standard Time : (UTC-06:00)" }, |
| 2054 | { 93, "Charlotte, NC, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2055 | { 94, "Charlottetown, PE, Canada - Atlantic Standard Time : (UTC-04:00)" }, |
| 2056 | { 95, "Chatham Islands, Chatham Islands, New Zealand - Chatham Island Standard Time : (UTC+12:45)" }, |
| 2057 | { 96, "Chengdu, China - China Standard Time : (UTC+08:00)" }, |
| 2058 | { 97, "Chennai, India - India Standard Time : (UTC+05:30)" }, |
| 2059 | { 98, "Chiba, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2060 | { 99, "Chicago, IL, USA - Central Standard Time : (UTC-06:00)" }, |
| 2061 | { 100, "Chisinau, Moldova - Eastern European Standard Time : (UTC+02:00)" }, |
| 2062 | { 101, "Chongqing, China - China Standard Time : (UTC+08:00)" }, |
| 2063 | { 102, "Cincinnati, OH, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2064 | { 103, "Cleveland, OH, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2065 | { 104, "Colorado Springs, CO, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 2066 | { 105, "Columbus, GA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2067 | { 106, "Columbus, OH, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2068 | { 107, "Conakry, Guinea - Greenwich Mean Time : (UTC)" }, |
| 2069 | { 108, "Copenhagen, Denmark - Central European Standard Time : (UTC+01:00)" }, |
| 2070 | { 109, "Cork, Ireland - Greenwich Mean Time : (UTC)" }, |
| 2071 | { 110, "Corpus Christi, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2072 | { 111, "Curitiba, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2073 | { 112, "Dakar, Senegal - Greenwich Mean Time : (UTC)" }, |
| 2074 | { 113, "Dallas, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2075 | { 114, "Damascus, Syria - Eastern European Standard Time : (UTC+02:00)" }, |
| 2076 | { 115, "Dar es Salaam, Tanzania - Eastern Africa Standard Time : (UTC+03:00)" }, |
| 2077 | { 116, "Darwin, NT, Australia - Australian Central Standard Time : (UTC+09:30)" }, |
| 2078 | { 117, "Dayton, OH, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2079 | { 118, "Delhi, India - India Standard Time : (UTC+05:30)" }, |
| 2080 | { 119, "Denver, CO, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 2081 | { 120, "Des Moines, IA, USA - Central Standard Time : (UTC-06:00)" }, |
| 2082 | { 121, "Detroit, MI, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2083 | { 122, "Dhaka, Bangladesh - Central Asia Standard Time : (UTC+06:00)" }, |
| 2084 | { 123, "Dijon, France - Romance Standard Time : (UTC+01:00)" }, |
| 2085 | { 124, "Djibouti, Djibouti - Eastern Africa Standard Time : (UTC+03:00)" }, |
| 2086 | { 125, "Doha, Qatar - Arabia Standard Time : (UTC+03:00)" }, |
| 2087 | { 126, "Dortmund, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2088 | { 127, "Dresden, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2089 | { 128, "Dublin, Ireland - Greenwich Mean Time : (UTC)" }, |
| 2090 | { 129, "Dushanbe, Tajikistan - Tajikistan Time : (UTC+05:00)" }, |
| 2091 | { 130, "Dusseldorf, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2092 | { 131, "Edinburgh, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2093 | { 132, "Edmonton, AB, Canada - Mountain Standard Time : (UTC-07:00)" }, |
| 2094 | { 133, "El Paso, TX, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 2095 | { 134, "Erfurt, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2096 | { 135, "Eucla, WA, Australia - Australian Central Western Standard Time : (UTC+08:45)" }, |
| 2097 | { 136, "Eugene, OR, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2098 | { 137, "Evansville, IN, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2099 | { 138, "Florence, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2100 | { 139, "Fort Defiance, AZ, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 2101 | { 140, "Fort Lauderdale, FL, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2102 | { 141, "Fort Wayne, IN, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2103 | { 142, "Fort Worth, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2104 | { 143, "Fortaleza, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2105 | { 144, "Frankfurt, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2106 | { 145, "Freetown, Sierra Leone - Greenwich Mean Time : (UTC)" }, |
| 2107 | { 146, "Freiburg, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2108 | { 147, "Fremont, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2109 | { 148, "Fresno, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2110 | { 149, "Fukuoka, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2111 | { 150, "Gaborone, Botswana - Central Africa Time : (UTC+02:00)" }, |
| 2112 | { 151, "Galway, Ireland - Greenwich Mean Time : (UTC)" }, |
| 2113 | { 152, "Geneva, Switzerland - Central European Standard Time : (UTC+01:00)" }, |
| 2114 | { 153, "Genova, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2115 | { 154, "George Town, Cayman Islands - Eastern Standard Time : (UTC-05:00)" }, |
| 2116 | { 155, "Georgetown, Guyana - Guyana Time : (UTC-04:00)" }, |
| 2117 | { 156, "Glasgow, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2118 | { 157, "Glendale, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2119 | { 158, "Granada, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2120 | { 159, "Grand Rapids, MI, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2121 | { 160, "Guadalajara, Mexico - Central Standard Time : (UTC-06:00)" }, |
| 2122 | { 161, "Guangzhou, China - China Standard Time : (UTC+08:00)" }, |
| 2123 | { 162, "Guatemala City, Guatemala - Central Standard Time : (UTC-06:00)" }, |
| 2124 | { 163, "Haikou, China - China Standard Time : (UTC+08:00)" }, |
| 2125 | { 164, "Halifax, NS, Canada - Atlantic Standard Time : (UTC-04:00)" }, |
| 2126 | { 165, "Hamburg, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2127 | { 166, "Hamilton, Bermuda - Atlantic Standard Time : (UTC-04:00)" }, |
| 2128 | { 167, "Hannover, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2129 | { 168, "Hanoi, Vietnam - Indochina Time : (UTC+07:00)" }, |
| 2130 | { 169, "Harare, Zimbabwe - Central Africa Time : (UTC+02:00)" }, |
| 2131 | { 170, "Harbin, China - China Standard Time : (UTC+08:00)" }, |
| 2132 | { 171, "Hartford, CT, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2133 | { 172, "Havana, Cuba - Cuba Standard Time : (UTC-05:00)" }, |
| 2134 | { 173, "Helsinki, Finland - Eastern European Standard Time : (UTC+02:00)" }, |
| 2135 | { 174, "Hiroshima, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2136 | { 175, "Hobart, TAS, Australia - Australian Eastern Standard Time : (UTC+10:00)" }, |
| 2137 | { 176, "Hong Kong SAR, China - China Standard Time : (UTC+08:00)" }, |
| 2138 | { 177, "Honiara, Solomon Islands - Solomon Islands Time : (UTC+11:00)" }, |
| 2139 | { 178, "Honolulu, HI, USA - Hawaii-Aleutian Standard Time : (UTC-10:00)" }, |
| 2140 | { 179, "Houston, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2141 | { 180, "Hull, PQ, Canada - Eastern Standard Time : (UTC-05:00)" }, |
| 2142 | { 181, "Huntsville, AL, USA - Central Standard Time : (UTC-06:00)" }, |
| 2143 | { 182, "Indianapolis, IN, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2144 | { 183, "Irkutsk, Russia - Irkutsk Time : (UTC+08:00)" }, |
| 2145 | { 184, "Islamabad, Pakistan - Pakistan Standard Time : (UTC+05:00)" }, |
| 2146 | { 185, "Istanbul, Turkey - Eastern European Standard Time : (UTC+02:00)" }, |
| 2147 | { 186, "Jackson, MS, USA - Central Standard Time : (UTC-06:00)" }, |
| 2148 | { 187, "Jacksonville, FL, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2149 | { 188, "Jakarta, Indonesia - Western Indonesian Time : (UTC+07:00)" }, |
| 2150 | { 189, "Jerusalem, Israel - Israel Standard Time : (UTC+02:00)" }, |
| 2151 | { 190, "Kabul, Afghanistan - Afghanistan Standard Time : (UTC+04:30)" }, |
| 2152 | { 191, "Kampala, Uganda - Eastern Africa Standard Time : (UTC+03:00)" }, |
| 2153 | { 192, "Kanazawa, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2154 | { 193, "Kansas City, KS, USA - Central Standard Time : (UTC-06:00)" }, |
| 2155 | { 194, "Kansas City, MO, USA - Central Standard Time : (UTC-06:00)" }, |
| 2156 | { 195, "Karachi, Pakistan - Pakistan Standard Time : (UTC+05:00)" }, |
| 2157 | { 196, "Kathmandu, Nepal - Nepal Standard Time : (UTC+05:45)" }, |
| 2158 | { 197, "Kelowna, BC, Canada - Pacific Standard Time : (UTC-08:00)" }, |
| 2159 | { 198, "Khartoum, Sudan - Eastern Africa Standard Time : (UTC+03:00)" }, |
| 2160 | { 199, "Kiev, Ukraine - Eastern European Standard Time : (UTC+02:00)" }, |
| 2161 | { 200, "Kigali, Rwanda - Central Africa Time : (UTC+02:00)" }, |
| 2162 | { 201, "Kingston, Jamaica - Eastern Standard Time : (UTC-05:00)" }, |
| 2163 | { 202, "Kingston, Norfolk Island - Norfolk Time : (UTC+11:30)" }, |
| 2164 | { 203, "Kinshasa, Democratic Republic of the Congo - West Africa Time : (UTC+01:00)" }, |
| 2165 | { 204, "Kiritimati, Christmas Island, Kiribati - Line Islands Time : (UTC+14:00)" }, |
| 2166 | { 205, "Knoxville, TN, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2167 | { 206, "Kobe, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2168 | { 207, "Kochi, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2169 | { 208, "Kolkata (Calcutta), India - India Standard Time : (UTC+05:30)" }, |
| 2170 | { 209, "Krasnoyarsk, Russia - Krasnoyarsk Time : (UTC+07:00)" }, |
| 2171 | { 210, "Kuala Lumpur, Malaysia - Singapore Standard Time : (UTC+08:00)" }, |
| 2172 | { 211, "Kuwait, Kuwait - Arabia Standard Time : (UTC+03:00)" }, |
| 2173 | { 212, "Kwangju, Korea - Korea Standard Time : (UTC+09:00)" }, |
| 2174 | { 213, "Kyoto, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2175 | { 214, "La Paz, Bolivia - Bolivia Time : (UTC-04:00)" }, |
| 2176 | { 215, "Lansing, MI, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2177 | { 216, "Laredo, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2178 | { 217, "Las Vegas, NV, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2179 | { 218, "Leipzig, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2180 | { 219, "Lexington, KY, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2181 | { 220, "Lhasa, China - China Standard Time : (UTC+08:00)" }, |
| 2182 | { 221, "Libreville, Gabon - West Africa Time : (UTC+01:00)" }, |
| 2183 | { 222, "Lille, France - Central European Standard Time : (UTC+01:00)" }, |
| 2184 | { 223, "Lilongwe, Malawi - Central Africa Time : (UTC+02:00)" }, |
| 2185 | { 224, "Lima, Peru - Peru Time : (UTC-05:00)" }, |
| 2186 | { 225, "Limerick, Ireland - Greenwich Mean Time : (UTC)" }, |
| 2187 | { 226, "Limoges, France - Central European Standard Time : (UTC+01:00)" }, |
| 2188 | { 227, "Lincoln, NE, USA - Central Standard Time : (UTC-06:00)" }, |
| 2189 | { 228, "Lisbon, Portugal - Greenwich Mean Time : (UTC)" }, |
| 2190 | { 229, "Little Rock, AR, USA - Central Standard Time : (UTC-06:00)" }, |
| 2191 | { 230, "Liverpool, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2192 | { 231, "Ljubljana, Slovenia - Central European Standard Time : (UTC+01:00)" }, |
| 2193 | { 232, "London, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2194 | { 233, "Londonderry, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2195 | { 234, "Long Beach, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2196 | { 235, "Lord Howe Island, Lord Howe Island, Australia - Lord Howe Standard Time : (UTC+10:30)" }, |
| 2197 | { 236, "Los Angeles, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2198 | { 237, "Louisville, KY, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2199 | { 238, "Luanda, Angola - West Africa Time : (UTC+01:00)" }, |
| 2200 | { 239, "Lubbock, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2201 | { 240, "Lusaka, Zambia - Central Africa Time : (UTC+02:00)" }, |
| 2202 | { 241, "Luxembourg, Luxembourg - Central European Standard Time : (UTC+01:00)" }, |
| 2203 | { 242, "Lyon, France - Central European Standard Time : (UTC+01:00)" }, |
| 2204 | { 243, "Madison, WI, USA - Central Standard Time : (UTC-06:00)" }, |
| 2205 | { 244, "Madrid, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2206 | { 245, "Malabo, Equatorial Guinea - West Africa Time : (UTC+01:00)" }, |
| 2207 | { 246, "Malaga, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2208 | { 247, "Managua, Nicaragua - Central Standard Time : (UTC-06:00)" }, |
| 2209 | { 248, "Manama, Bahrain - Arabia Standard Time : (UTC+03:00)" }, |
| 2210 | { 249, "Manaus, Brazil - Amazon Time : (UTC-04:00)" }, |
| 2211 | { 250, "Manchester, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2212 | { 251, "Manila, Philippines - Philippine Time : (UTC+08:00)" }, |
| 2213 | { 252, "Maputo, Mozambique - Central Africa Time : (UTC+02:00)" }, |
| 2214 | { 253, "Maracaibo, Venezuela - Venezuelan Standard Time : (UTC-04:30)" }, |
| 2215 | { 254, "Marseille, France - Central European Standard Time : (UTC+01:00)" }, |
| 2216 | { 255, "Maseru, Lesotho - South Africa Standard Time : (UTC+02:00)" }, |
| 2217 | { 256, "Masqat, Oman - Gulf Standard Time : (UTC+04:00)" }, |
| 2218 | { 257, "Mbabane, Swaziland - South Africa Standard Time : (UTC+02:00)" }, |
| 2219 | { 258, "Medellin, Colombia - Colombia Time : (UTC-05:00)" }, |
| 2220 | { 259, "Melbourne, VIC, Australia - Australian Eastern Standard Time : (UTC+10:00)" }, |
| 2221 | { 260, "Memphis, TN, USA - Central Standard Time : (UTC-06:00)" }, |
| 2222 | { 261, "Metz, France - Central European Standard Time : (UTC+01:00)" }, |
| 2223 | { 262, "Mexico City, Mexico - Central Standard Time : (UTC-06:00)" }, |
| 2224 | { 263, "Miami, FL, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2225 | { 264, "Milan, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2226 | { 265, "Milwaukee, WI, USA - Central Standard Time : (UTC-06:00)" }, |
| 2227 | { 266, "Minneapolis, MN, USA - Central Standard Time : (UTC-06:00)" }, |
| 2228 | { 267, "Minsk, Belarus - Further-Eastern European Time : (UTC+03:00)" }, |
| 2229 | { 268, "Mobile, AL, USA - Central Standard Time : (UTC-06:00)" }, |
| 2230 | { 269, "Mogadishu, Somalia - Eastern Africa Standard Time : (UTC+03:00)" }, |
| 2231 | { 270, "Monaco, Monaco - Central European Standard Time : (UTC+01:00)" }, |
| 2232 | { 271, "Monrovia, Liberia - Greenwich Mean Time : (UTC)" }, |
| 2233 | { 272, "Monterrey, Mexico - Central Standard Time : (UTC-06:00)" }, |
| 2234 | { 273, "Montevideo, Uruguay - Uruguay Time : (UTC-03:00)" }, |
| 2235 | { 274, "Montreal, PQ, Canada - Eastern Standard Time : (UTC-05:00)" }, |
| 2236 | { 275, "Morioka, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2237 | { 276, "Moscow, Russia - Moscow Standard Time : (UTC+03:00)" }, |
| 2238 | { 277, "Mumbai, India - India Standard Time : (UTC+05:30)" }, |
| 2239 | { 278, "Munich, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2240 | { 279, "Murmansk, Russia - Moscow Standard Time : (UTC+03:00)" }, |
| 2241 | { 280, "N'Djamena, Chad - West Africa Time : (UTC+01:00)" }, |
| 2242 | { 281, "Nagano, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2243 | { 282, "Nagasaki, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2244 | { 283, "Nagoya, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2245 | { 284, "Nairobi, Kenya - Eastern Africa Standard Time : (UTC+03:00)" }, |
| 2246 | { 285, "Nanjing, China - China Standard Time : (UTC+08:00)" }, |
| 2247 | { 286, "Naples, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2248 | { 287, "Nashville, TN, USA - Central Standard Time : (UTC-06:00)" }, |
| 2249 | { 288, "Nassau, Bahamas - Eastern Standard Time : (UTC-05:00)" }, |
| 2250 | { 289, "New Orleans, LA, USA - Central Standard Time : (UTC-06:00)" }, |
| 2251 | { 290, "New York, NY, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2252 | { 291, "Newark, NJ, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2253 | { 292, "Niamey, Niger - West Africa Time : (UTC+01:00)" }, |
| 2254 | { 293, "Nicosia, Cyprus - Eastern European Standard Time : (UTC+02:00)" }, |
| 2255 | { 294, "Norwich, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2256 | { 295, "Nouakchott, Mauritania - Greenwich Mean Time : (UTC)" }, |
| 2257 | { 296, "Novosibirsk, Russia - Novosibirsk Time : (UTC+06:00)" }, |
| 2258 | { 297, "Nuku'alofa, Tonga - Tonga Standard Time : (UTC+13:00)" }, |
| 2259 | { 298, "Nuuk, Greenland - West Greenland Time : (UTC-03;00)" }, |
| 2260 | { 299, "Oakland, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2261 | { 300, "Oklahoma City, OK, USA - Central Standard Time : (UTC-06:00)" }, |
| 2262 | { 301, "Omaha, NE, USA - Central Standard Time : (UTC-06:00)" }, |
| 2263 | { 302, "Orlando, FL, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2264 | { 303, "Osaka, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2265 | { 304, "Oshawa, ON, Canada - Eastern Standard Time : (UTC-05:00)" }, |
| 2266 | { 305, "Oslo, Norway - Central European Standard Time : (UTC+01:00)" }, |
| 2267 | { 306, "Ottawa, ON, Canada - Eastern Standard Time : (UTC-05:00)" }, |
| 2268 | { 307, "Ouagadougou, Burkina Faso - Greenwich Mean Time : (UTC)" }, |
| 2269 | { 308, "Overland Park, KS, USA - Central Standard Time : (UTC-06:00)" }, |
| 2270 | { 309, "Oviedo, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2271 | { 310, "Palermo, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2272 | { 311, "Palma de Mallorca, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2273 | { 312, "Panama City, Panama - Eastern Standard Time : (UTC-05:00)" }, |
| 2274 | { 313, "Paramaribo, Surinam - Suriname Time : (UTC-03:00)" }, |
| 2275 | { 314, "Paris, France - Central European Standard Time : (UTC+01:00)" }, |
| 2276 | { 315, "Pasadena, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2277 | { 316, "Pasadena, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2278 | { 317, "Peoria, IL, USA - Central Standard Time : (UTC-06:00)" }, |
| 2279 | { 318, "Perth, WA, Australia - Australia Western Standard Time : (UTC+08:00)" }, |
| 2280 | { 319, "Perugia, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2281 | { 320, "Philadelphia, PA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2282 | { 321, "Phnom Penh, Cambodia - Indochina Time : (UTC+07:00)" }, |
| 2283 | { 322, "Phoenix, AZ, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 2284 | { 323, "Pisa, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2285 | { 324, "Pittsburgh, PA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2286 | { 325, "Plymouth, United Kingdom - Greenwich Mean Time : (UTC)" }, |
| 2287 | { 326, "Port Louis, Mauritius - Mauritius Time : (UTC+04:00)" }, |
| 2288 | { 327, "Port Moresby, Papua New Guinea - Papua New Guinea Time : (UTC+10:00)" }, |
| 2289 | { 328, "Port-au-Prince, Haiti - Eastern Standard Time : (UTC-05:00)" }, |
| 2290 | { 329, "Port-of-Spain, Trinidad and Tobago - Atlantic Standard Time : (UTC-04:00)" }, |
| 2291 | { 330, "Portland, OR, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2292 | { 331, "Porto Alegre, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2293 | { 332, "Porto, Portugal - Western European Time : (UTC)" }, |
| 2294 | { 333, "Porto-Novo, Benin - West Africa Time : (UTC+01:00)" }, |
| 2295 | { 334, "Prague, Czech Republic - Central European Standard Time : (UTC+01:00)" }, |
| 2296 | { 335, "Praia, Cape Verde - Cape Verde Time : (UTC-01:00)" }, |
| 2297 | { 336, "Pretoria, South Africa - South Africa Standard Time : (UTC+02:00)" }, |
| 2298 | { 337, "Providence, RI, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2299 | { 338, "Puebla de Zaragoza, Mexico - Eastern Standard Time : (UTC-05:00)" }, |
| 2300 | { 339, "Pusan, Korea - Korea Standard Time : (UTC+09:00)" }, |
| 2301 | { 340, "Pyongyang, North Korea - Korea Standard Time : (UTC+09:00)" }, |
| 2302 | { 341, "Quebec City, PQ, Canada - Eastern Standard Time : (UTC-05:00)" }, |
| 2303 | { 342, "Quito, Ecuador - Ecuador Time : (UTC-05:00)" }, |
| 2304 | { 343, "Rabat, Morocco - Western European Time : (UTC)" }, |
| 2305 | { 344, "Raleigh, NC, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2306 | { 345, "Recife, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2307 | { 346, "Redmond, WA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2308 | { 347, "Reggio Calabria, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2309 | { 348, "Regina, SK, Canada - Central Standard Time : (UTC-06:00)" }, |
| 2310 | { 349, "Richmond, VA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2311 | { 350, "Riga, Latvia - Eastern European Standard Time : (UTC+02:00)" }, |
| 2312 | { 351, "Rio de Janeiro, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2313 | { 352, "Riyadh, Saudi Arabia - Arabia Standard Time : (UTC+03:00)" }, |
| 2314 | { 353, "Rockford, IL, USA - Central Standard Time : (UTC-06:00)" }, |
| 2315 | { 354, "Rome, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2316 | { 355, "Roseau, Dominica - Atlantic Standard Time : (UTC-04:00)" }, |
| 2317 | { 356, "Roswell, NM, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 2318 | { 357, "Rouen, France - Central European Standard Time : (UTC+01:00)" }, |
| 2319 | { 358, "Sacramento, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2320 | { 359, "Saint John, NB, Canada - Atlantic Standard Time : (UTC-04:00)" }, |
| 2321 | { 360, "Saint Louis, MO, USA - Central Standard Time : (UTC-06:00)" }, |
| 2322 | { 361, "Saint Paul, MN, USA - Central Standard Time : (UTC-06:00)" }, |
| 2323 | { 362, "Salt Lake City, UT, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 2324 | { 363, "Salvador, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2325 | { 364, "Salzburg, Austria - Central European Standard Time : (UTC+01:00)" }, |
| 2326 | { 365, "San Antonio, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2327 | { 366, "San Bernardino, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2328 | { 367, "San Diego, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2329 | { 368, "San Francisco, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2330 | { 369, "San Jose, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2331 | { 370, "San Salvador, El Salvador - Central Standard Time : (UTC-06:00)" }, |
| 2332 | { 371, "Sana'a, Yemen - Arabia Standard Time : (UTC+03:00)" }, |
| 2333 | { 372, "Santa Ana, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2334 | { 373, "Santa Rosa, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2335 | { 374, "Santander, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2336 | { 375, "Santiago, Chile - Chile Standard Time : (UTC-04:00)" }, |
| 2337 | { 376, "Santo Domingo, Dominican Republic - Atlantic Standard Time : (UTC-04:00)" }, |
| 2338 | { 377, "Sao Paulo, Brazil - Brasilia Time : (UTC-03:00)" }, |
| 2339 | { 378, "Sapporo, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2340 | { 379, "Sarajevo, Bosnia and Herzegovina - Central European Standard Time : (UTC+01:00)" }, |
| 2341 | { 380, "Saskatoon, SK, Canada - Central Standard Time : (UTC-06:00)" }, |
| 2342 | { 381, "Savannah, GA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2343 | { 382, "Seattle, WA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2344 | { 383, "Sendai, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2345 | { 384, "Seoul, Korea - Korea Standard Time : (UTC+09:00)" }, |
| 2346 | { 385, "Sevilla, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2347 | { 386, "Shanghai, China - China Standard Time : (UTC+08:00)" }, |
| 2348 | { 387, "Shreveport, LA, USA - Central Standard Time : (UTC-06:00)" }, |
| 2349 | { 388, "Simi Valley, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2350 | { 389, "Singapore, Singapore - Singapore Standard Time : (UTC+08:00)" }, |
| 2351 | { 390, "Sioux Falls, SD, USA - Central Standard Time : (UTC-06:00)" }, |
| 2352 | { 391, "Skopje, F.Y.R.O. Macedonia - Central European Standard Time : (UTC+01:00)" }, |
| 2353 | { 392, "Sofia, Bulgaria - Eastern European Standard Time : (UTC+02:00)" }, |
| 2354 | { 393, "South Bend, IN, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2355 | { 394, "Spokane, WA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2356 | { 395, "Springfield, IL, USA - Central Standard Time : (UTC-06:00)" }, |
| 2357 | { 396, "Springfield, MA, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2358 | { 397, "Springfield, MO, USA - Central Standard Time : (UTC-06:00)" }, |
| 2359 | { 398, "Sri Jayawardenepura, Sri Lanka - India Standard Time : (UTC+05:30)" }, |
| 2360 | { 399, "St. Catharines, ON, Canada - Eastern Standard Time : (UTC-05:00)" }, |
| 2361 | { 400, "St. John's, NF, Canada - Newfoundland Standard Time : (UTC-03:30)" }, |
| 2362 | { 401, "St. Petersburg, FL, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2363 | { 402, "St. Petersburg, Russia - Moscow Standard Time : (UTC+03:00)" }, |
| 2364 | { 403, "Stockholm, Sweden - Central European Standard Time : (UTC+01:00)" }, |
| 2365 | { 404, "Stockton, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2366 | { 405, "Strasbourg, France - Central European Standard Time : (UTC+01:00)" }, |
| 2367 | { 406, "Stuttgart, Germany - Central European Standard Time : (UTC+01:00)" }, |
| 2368 | { 407, "Sucre, Bolivia - Bolivia Time : (UTC-04:00)" }, |
| 2369 | { 408, "Sunnyvale, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2370 | { 409, "Suva, Fiji Islands - Fiji Standard Time : (UTC+12:00)" }, |
| 2371 | { 410, "Sydney, NSW, Australia - Australian Eastern Standard Time : (UTC+10:00)" }, |
| 2372 | { 411, "Syracuse, NY, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2373 | { 412, "T'bilisi, Georgia - Georgia Standard Time : (UTC+04:00)" }, |
| 2374 | { 413, "Taejon, Korea - Korea Standard Time : (UTC+09:00)" }, |
| 2375 | { 414, "Taiohae, Marquesas Islands, French Polynesia - Marquesas Time : (UTC-9:30)" }, |
| 2376 | { 415, "Taipei, Taiwan - China Standard Time : (UTC+08:00)" }, |
| 2377 | { 416, "Tallinn, Estonia - Eastern European Standard Time : (UTC+02:00)" }, |
| 2378 | { 417, "Tampa, FL, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2379 | { 418, "Taranto, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2380 | { 419, "Tashkent, Uzbekistan - Uzbekistan Time : (UTC+05:00)" }, |
| 2381 | { 420, "Tegucigalpa, Honduras - Central Standard Time : (UTC-06:00)" }, |
| 2382 | { 421, "Tehran, Iran - Iran Standard Time : (UTC+03:30)" }, |
| 2383 | { 422, "Tel Aviv, Israel - Israel Standard Time : (UTC+02:00)" }, |
| 2384 | { 423, "The Hague, Netherlands - Central European Standard Time : (UTC+01:00)" }, |
| 2385 | { 424, "Thimphu, Bhutan - Bhutan Time : (UTC+06:00)" }, |
| 2386 | { 425, "Thunder Bay, ON, Canada - Eastern Standard Time : (UTC-05:00)" }, |
| 2387 | { 426, "Tirana, Albania - Central European Standard Time : (UTC+01:00)" }, |
| 2388 | { 427, "Tokyo, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2389 | { 428, "Toledo, OH, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2390 | { 429, "Torino, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2391 | { 430, "Toronto, ON, Canada - Eastern Standard Time : (UTC-05:00)" }, |
| 2392 | { 431, "Torrance, CA, USA - Pacific Standard Time : (UTC-08:00)" }, |
| 2393 | { 432, "Toulouse, France - Central European Standard Time : (UTC+01:00)" }, |
| 2394 | { 433, "Tripoli, Libya - Eastern European Standard Time : (UTC+02:00)" }, |
| 2395 | { 434, "Tucson, AZ, USA - Mountain Standard Time : (UTC-07:00)" }, |
| 2396 | { 435, "Tulsa, OK, USA - Central Standard Time : (UTC-06:00)" }, |
| 2397 | { 436, "Tunis, Tunisia - West Africa Time : (UTC+01:00)" }, |
| 2398 | { 437, "Ulaanbaatar, Mongolia - Ulaanbaatar Time : (UTC+08:00)" }, |
| 2399 | { 438, "Urumqi, China - China Standard Time : (UTC+08:00)" }, |
| 2400 | { 439, "Vaduz, Liechtenstein - Central European Standard Time : (UTC+01:00)" }, |
| 2401 | { 440, "Valencia, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2402 | { 441, "Valletta, Malta - Central European Standard Time : (UTC+01:00)" }, |
| 2403 | { 442, "Vancouver, BC, Canada - Pacific Standard Time : (UTC-08:00)" }, |
| 2404 | { 443, "Vatican City, Vatican City - Central European Standard Time : (UTC+01:00)" }, |
| 2405 | { 444, "Venice, Italy - Central European Standard Time : (UTC+01:00)" }, |
| 2406 | { 445, "Veracruz, Mexico - Central Standard Time : (UTC-06:00)" }, |
| 2407 | { 446, "Victoria, Seychelles - Seychelles Time : (UTC+04:00)" }, |
| 2408 | { 447, "Vienna, Austria - Central European Standard Time : (UTC+01:00)" }, |
| 2409 | { 448, "Vientiane, Laos - Indochina Time : (UTC+07:00)" }, |
| 2410 | { 449, "Vilnius, Lithuania - Eastern European Standard Time : (UTC+02:00)" }, |
| 2411 | { 450, "Vladivostok, Russia - Vladivostok Standard Time : (UTC+10:00)" }, |
| 2412 | { 451, "Volgograd, Russia - Moscow Standard Time : (UTC+03:00)" }, |
| 2413 | { 452, "Waco, TX, USA - Central Standard Time : (UTC-06:00)" }, |
| 2414 | { 453, "Warsaw, Poland - Central European Standard Time : (UTC+01:00)" }, |
| 2415 | { 454, "Washington, DC, USA - Eastern Standard Time : (UTC-05:00)" }, |
| 2416 | { 455, "Wellington, New Zealand - New Zealand Standard Time : (UTC+12:00)" }, |
| 2417 | { 456, "Whitehorse, YT, Canada - Pacific Standard Time : (UTC-08:00)" }, |
| 2418 | { 457, "Windhoek, Namibia - West Africa Time : (UTC+01:00)" }, |
| 2419 | { 458, "Winnipeg, MB, Canada - Central Standard Time : (UTC-06:00)" }, |
| 2420 | { 459, "Wuhan, China - China Standard Time : (UTC+08:00)" }, |
| 2421 | { 460, "Xian, China - China Standard Time : (UTC+08:00)" }, |
| 2422 | { 461, "Yakutsk, Russia - Yakutsk Standard Time : (UTC+09:00)" }, |
| 2423 | { 462, "Yangon, Myanmar - Myanmar Standard Time : (UTC+06:30)" }, |
| 2424 | { 463, "Yekaterinburg, Russia - Yekaterinburg Standard Time : (UTC+05:00)" }, |
| 2425 | { 464, "Yellowknife, NT, Canada - Mountain Standard Time : (UTC-07:00)" }, |
| 2426 | { 465, "Yerevan, Armenia - Armenia Time : (UTC+04:00)" }, |
| 2427 | { 466, "Yokohama, Japan - Japan Standard Time : (UTC+09:00)" }, |
| 2428 | { 467, "Zagreb, Croatia - Central European Standard Time : (UTC+01:00)" }, |
| 2429 | { 468, "Zaragoza, Spain - Central European Standard Time : (UTC+01:00)" }, |
| 2430 | { 469, "Zurich, Switzerland - Central European Standard Time : (UTC+01:00)" }, |
| 2431 | { 0, NULL((void*)0) } |
| 2432 | }; |
| 2433 | |
| 2434 | static const value_string acn_blob_time3_dst_vals[] = { |
| 2435 | { 0, "DST US" }, |
| 2436 | { 1, "DST Europe" }, |
| 2437 | { 2, "DST Funky" }, |
| 2438 | { 3, "DST None" }, |
| 2439 | { 0, NULL((void*)0) } |
| 2440 | }; |
| 2441 | |
| 2442 | static const value_string acn_blob_time3_month_vals[] = { |
| 2443 | { 0, "None" }, |
| 2444 | { 1, "January" }, |
| 2445 | { 2, "February" }, |
| 2446 | { 3, "March" }, |
| 2447 | { 4, "April" }, |
| 2448 | { 5, "May" }, |
| 2449 | { 6, "June" }, |
| 2450 | { 7, "July" }, |
| 2451 | { 8, "August" }, |
| 2452 | { 9, "September" }, |
| 2453 | { 10, "October" }, |
| 2454 | { 11, "November" }, |
| 2455 | { 12, "December" }, |
| 2456 | { 0, NULL((void*)0) } |
| 2457 | }; |
| 2458 | |
| 2459 | static const value_string acn_blob_time3_week_vals[] = { |
| 2460 | { 0, "None" }, |
| 2461 | { 1, "First" }, |
| 2462 | { 2, "Second" }, |
| 2463 | { 3, "Third" }, |
| 2464 | { 4, "Fourth" }, |
| 2465 | { 5, "Last" }, |
| 2466 | { 0, NULL((void*)0) } |
| 2467 | }; |
| 2468 | |
| 2469 | static const value_string acn_blob_time3_day_vals[] = { |
| 2470 | { 0, "Sunday" }, |
| 2471 | { 1, "Monday" }, |
| 2472 | { 2, "Tuesday" }, |
| 2473 | { 3, "Wednesday" }, |
| 2474 | { 4, "Thursday" }, |
| 2475 | { 5, "Friday" }, |
| 2476 | { 6, "Saturday" }, |
| 2477 | { 0, NULL((void*)0) } |
| 2478 | }; |
| 2479 | |
| 2480 | static const value_string acn_blob_time3_locality_vals[] = { |
| 2481 | { 0, "LOCAL" }, |
| 2482 | { 1, "UTC" }, |
| 2483 | { 0, NULL((void*)0) } |
| 2484 | }; |
| 2485 | |
| 2486 | static const value_string acn_blob_energy_cost_field_name[] = { |
| 2487 | { 1, "Month" }, |
| 2488 | { 2, "Day" }, |
| 2489 | { 3, "Cost per Hour" }, |
| 2490 | { 0, NULL((void*)0) } |
| 2491 | }; |
| 2492 | |
| 2493 | static const value_string acn_blob_sequence_operation_field_name[] = { |
| 2494 | { 1, "Operation Type" }, |
| 2495 | { 2, "Space" }, |
| 2496 | { 3, "Sequence Number" }, |
| 2497 | { 4, "Step Number" }, |
| 2498 | { 0, NULL((void*)0) } |
| 2499 | }; |
| 2500 | |
| 2501 | static const value_string acn_blob_sequence_step_properties_field_name[] = { |
| 2502 | { 1, "System" }, |
| 2503 | { 2, "Processor" }, |
| 2504 | { 3, "Rack" }, |
| 2505 | { 4, "Lug" }, |
| 2506 | { 5, "Module" }, |
| 2507 | { 6, "Station" }, |
| 2508 | { 7, "Port" }, |
| 2509 | { 8, "Subdevice" }, |
| 2510 | { 9, "Space" }, |
| 2511 | { 10, "UDN" }, |
| 2512 | { 11, "Reserved" }, |
| 2513 | { 12, "Sequence Number" }, |
| 2514 | { 13, "Step Number" }, |
| 2515 | { 14, "Fade Time" }, |
| 2516 | { 15, "Hold Time" }, |
| 2517 | { 16, "Level[0]" }, |
| 2518 | { 17, "Level[1]" }, |
| 2519 | { 18, "Level[2]" }, |
| 2520 | { 19, "Level[3]" }, |
| 2521 | { 20, "Level[4]" }, |
| 2522 | { 21, "Level[5]" }, |
| 2523 | { 22, "Level[6]" }, |
| 2524 | { 23, "Level[7]" }, |
| 2525 | { 24, "Level[8]" }, |
| 2526 | { 25, "Level[9]" }, |
| 2527 | { 26, "Level[10]" }, |
| 2528 | { 27, "Level[11]" }, |
| 2529 | { 28, "Level[12]" }, |
| 2530 | { 29, "Level[13]" }, |
| 2531 | { 30, "Level[14]" }, |
| 2532 | { 31, "Level[15]" }, |
| 2533 | { 32, "Level[16]" }, |
| 2534 | { 33, "Level[17]" }, |
| 2535 | { 34, "Level[18]" }, |
| 2536 | { 35, "Level[19]" }, |
| 2537 | { 36, "Level[20]" }, |
| 2538 | { 37, "Level[21]" }, |
| 2539 | { 38, "Level[22]" }, |
| 2540 | { 39, "Level[23]" }, |
| 2541 | { 40, "Level[24]" }, |
| 2542 | { 41, "Level[25]" }, |
| 2543 | { 42, "Level[26]" }, |
| 2544 | { 43, "Level[27]" }, |
| 2545 | { 44, "Level[28]" }, |
| 2546 | { 45, "Level[29]" }, |
| 2547 | { 46, "Level[30]" }, |
| 2548 | { 47, "Level[31]" }, |
| 2549 | { 48, "Level[32]" }, |
| 2550 | { 49, "Level[33]" }, |
| 2551 | { 50, "Level[34]" }, |
| 2552 | { 51, "Level[35]" }, |
| 2553 | { 52, "Level[36]" }, |
| 2554 | { 53, "Level[37]" }, |
| 2555 | { 54, "Level[38]" }, |
| 2556 | { 55, "Level[39]" }, |
| 2557 | { 56, "Level[40]" }, |
| 2558 | { 57, "Level[41]" }, |
| 2559 | { 58, "Level[42]" }, |
| 2560 | { 59, "Level[43]" }, |
| 2561 | { 60, "Level[44]" }, |
| 2562 | { 61, "Level[45]" }, |
| 2563 | { 62, "Level[46]" }, |
| 2564 | { 63, "Level[47]" }, |
| 2565 | { 64, "Level[48]" }, |
| 2566 | { 65, "Level[49]" }, |
| 2567 | { 66, "Level[50]" }, |
| 2568 | { 67, "Level[51]" }, |
| 2569 | { 68, "Level[52]" }, |
| 2570 | { 69, "Level[53]" }, |
| 2571 | { 70, "Level[54]" }, |
| 2572 | { 71, "Level[55]" }, |
| 2573 | { 72, "Level[56]" }, |
| 2574 | { 73, "Level[57]" }, |
| 2575 | { 74, "Level[58]" }, |
| 2576 | { 75, "Level[59]" }, |
| 2577 | { 76, "Level[60]" }, |
| 2578 | { 77, "Level[61]" }, |
| 2579 | { 78, "Level[62]" }, |
| 2580 | { 79, "Level[63]" }, |
| 2581 | { 80, "Level[64]" }, |
| 2582 | { 81, "Level[65]" }, |
| 2583 | { 82, "Level[66]" }, |
| 2584 | { 83, "Level[67]" }, |
| 2585 | { 84, "Level[68]" }, |
| 2586 | { 85, "Level[69]" }, |
| 2587 | { 86, "Level[70]" }, |
| 2588 | { 87, "Level[71]" }, |
| 2589 | { 88, "Level[72]" }, |
| 2590 | { 89, "Level[73]" }, |
| 2591 | { 90, "Level[74]" }, |
| 2592 | { 91, "Level[75]" }, |
| 2593 | { 92, "Level[76]" }, |
| 2594 | { 93, "Level[77]" }, |
| 2595 | { 94, "Level[78]" }, |
| 2596 | { 95, "Level[79]" }, |
| 2597 | { 96, "Level[80]" }, |
| 2598 | { 97, "Level[81]" }, |
| 2599 | { 98, "Level[82]" }, |
| 2600 | { 99, "Level[83]" }, |
| 2601 | { 100, "Level[84]" }, |
| 2602 | { 101, "Level[85]" }, |
| 2603 | { 102, "Level[86]" }, |
| 2604 | { 103, "Level[87]" }, |
| 2605 | { 104, "Level[88]" }, |
| 2606 | { 105, "Level[89]" }, |
| 2607 | { 106, "Level[90]" }, |
| 2608 | { 107, "Level[91]" }, |
| 2609 | { 108, "Level[92]" }, |
| 2610 | { 109, "Level[93]" }, |
| 2611 | { 110, "Level[94]" }, |
| 2612 | { 111, "Level[95]" }, |
| 2613 | { 112, "Level[96]" }, |
| 2614 | { 113, "Level[97]" }, |
| 2615 | { 114, "Level[98]" }, |
| 2616 | { 115, "Level[99]" }, |
| 2617 | { 116, "Level[100]" }, |
| 2618 | { 117, "Level[101]" }, |
| 2619 | { 118, "Level[102]" }, |
| 2620 | { 119, "Level[103]" }, |
| 2621 | { 120, "Level[104]" }, |
| 2622 | { 121, "Level[105]" }, |
| 2623 | { 122, "Level[106]" }, |
| 2624 | { 123, "Level[107]" }, |
| 2625 | { 124, "Level[108]" }, |
| 2626 | { 125, "Level[109]" }, |
| 2627 | { 126, "Level[110]" }, |
| 2628 | { 127, "Level[111]" }, |
| 2629 | { 128, "Level[112]" }, |
| 2630 | { 129, "Level[113]" }, |
| 2631 | { 130, "Level[114]" }, |
| 2632 | { 131, "Level[115]" }, |
| 2633 | { 132, "Level[116]" }, |
| 2634 | { 133, "Level[117]" }, |
| 2635 | { 134, "Level[118]" }, |
| 2636 | { 135, "Level[119]" }, |
| 2637 | { 136, "Level[120]" }, |
| 2638 | { 137, "Level[121]" }, |
| 2639 | { 138, "Level[122]" }, |
| 2640 | { 139, "Level[123]" }, |
| 2641 | { 140, "Level[124]" }, |
| 2642 | { 141, "Level[125]" }, |
| 2643 | { 142, "Level[126]" }, |
| 2644 | { 143, "Level[127]" }, |
| 2645 | { 144, "Level[128]" }, |
| 2646 | { 145, "Level[129]" }, |
| 2647 | { 146, "Level[130]" }, |
| 2648 | { 147, "Level[131]" }, |
| 2649 | { 148, "Level[132]" }, |
| 2650 | { 149, "Level[133]" }, |
| 2651 | { 150, "Level[134]" }, |
| 2652 | { 151, "Level[135]" }, |
| 2653 | { 152, "Level[136]" }, |
| 2654 | { 153, "Level[137]" }, |
| 2655 | { 154, "Level[138]" }, |
| 2656 | { 155, "Level[139]" }, |
| 2657 | { 156, "Level[140]" }, |
| 2658 | { 157, "Level[141]" }, |
| 2659 | { 158, "Level[142]" }, |
| 2660 | { 159, "Level[143]" }, |
| 2661 | { 160, "Level[144]" }, |
| 2662 | { 161, "Level[145]" }, |
| 2663 | { 162, "Level[146]" }, |
| 2664 | { 163, "Level[147]" }, |
| 2665 | { 164, "Level[148]" }, |
| 2666 | { 165, "Level[149]" }, |
| 2667 | { 166, "Level[150]" }, |
| 2668 | { 167, "Level[151]" }, |
| 2669 | { 168, "Level[152]" }, |
| 2670 | { 169, "Level[153]" }, |
| 2671 | { 170, "Level[154]" }, |
| 2672 | { 171, "Level[155]" }, |
| 2673 | { 172, "Level[156]" }, |
| 2674 | { 173, "Level[157]" }, |
| 2675 | { 174, "Level[158]" }, |
| 2676 | { 175, "Level[159]" }, |
| 2677 | { 176, "Level[160]" }, |
| 2678 | { 177, "Level[161]" }, |
| 2679 | { 178, "Level[162]" }, |
| 2680 | { 179, "Level[163]" }, |
| 2681 | { 180, "Level[164]" }, |
| 2682 | { 181, "Level[165]" }, |
| 2683 | { 182, "Level[166]" }, |
| 2684 | { 183, "Level[167]" }, |
| 2685 | { 184, "Level[168]" }, |
| 2686 | { 185, "Level[169]" }, |
| 2687 | { 186, "Level[170]" }, |
| 2688 | { 187, "Level[171]" }, |
| 2689 | { 188, "Level[172]" }, |
| 2690 | { 189, "Level[173]" }, |
| 2691 | { 190, "Level[174]" }, |
| 2692 | { 191, "Level[175]" }, |
| 2693 | { 192, "Level[176]" }, |
| 2694 | { 193, "Level[177]" }, |
| 2695 | { 194, "Level[178]" }, |
| 2696 | { 195, "Level[179]" }, |
| 2697 | { 196, "Level[180]" }, |
| 2698 | { 197, "Level[181]" }, |
| 2699 | { 198, "Level[182]" }, |
| 2700 | { 199, "Level[183]" }, |
| 2701 | { 200, "Level[184]" }, |
| 2702 | { 201, "Level[185]" }, |
| 2703 | { 202, "Level[186]" }, |
| 2704 | { 203, "Level[187]" }, |
| 2705 | { 204, "Level[188]" }, |
| 2706 | { 205, "Level[189]" }, |
| 2707 | { 206, "Level[190]" }, |
| 2708 | { 207, "Level[191]" }, |
| 2709 | { 0, NULL((void*)0) } |
| 2710 | }; |
| 2711 | static value_string_ext acn_blob_sequence_step_properties_field_name_ext = VALUE_STRING_EXT_INIT(acn_blob_sequence_step_properties_field_name){ _try_val_to_str_ext_init, 0, (sizeof (acn_blob_sequence_step_properties_field_name ) / sizeof ((acn_blob_sequence_step_properties_field_name)[0] ))-1, acn_blob_sequence_step_properties_field_name, "acn_blob_sequence_step_properties_field_name" , ((void*)0) }; |
| 2712 | |
| 2713 | static const value_string acn_blob_type_vals[] = { |
| 2714 | { ACN_BLOB_IPV41, "IPv4 Blob" }, |
| 2715 | { ACN_BLOB_IPV62, "IPv6 Blob" }, |
| 2716 | { ACN_BLOB_ERROR13, "Error Blob v1" }, |
| 2717 | { ACN_BLOB_ERROR24, "Error Blob v2" }, |
| 2718 | { ACN_BLOB_METADATA5, "Metadata" }, |
| 2719 | { ACN_BLOB_METADATA_DEVICES6, "Metadata Devices" }, |
| 2720 | { ACN_BLOB_METADATA_TYPES7, "Metadata Types" }, |
| 2721 | { ACN_BLOB_TIME18, "Time Blob (deprecated 1)" }, |
| 2722 | { ACN_BLOB_DIMMER_PROPERTIES9, "Dimmer Properties Blob v1" }, |
| 2723 | { ACN_BLOB_DIMMER_LOAD_PROPERTIES10, "Dimmer Load Properties Blob v1" }, |
| 2724 | { ACN_BLOB_DIMMING_RACK_PROPERTIES11, "Dimming Rack Properties Blob v1" }, |
| 2725 | { ACN_BLOB_DIMMING_RACK_STATUS_PROPERTIES12, "Dimming Rack Status Properties Blob v1" }, |
| 2726 | { ACN_BLOB_DIMMER_STATUS_PROPERTIES13, "Dimmer Status Properties Blob v1" }, |
| 2727 | { ACN_BLOB_SET_LEVELS_OPERATION14, "Set Levels Operation Blob" }, |
| 2728 | { ACN_BLOB_PRESET_OPERATION15, "Preset Operation Blob" }, |
| 2729 | { ACN_BLOB_ADVANCED_FEATURES_OPERATION16, "Advanced Features Operation Blob" }, |
| 2730 | { ACN_BLOB_DIRECT_CONTROL_OPERATION17, "Direct Control Operation Blob" }, |
| 2731 | { ACN_BLOB_GENERATE_CONFIG_OPERATION18, "Generate Config Operation Blob" }, |
| 2732 | { ACN_BLOB_ERROR319, "Error Blob v3" }, |
| 2733 | { ACN_BLOB_DIMMER_PROPERTIES220, "Dimmer Properties Blob v2" }, |
| 2734 | { ACN_BLOB_DIMMER_LOAD_PROPERTIES221, "Dimmer Load Properties Blob v2" }, |
| 2735 | { ACN_BLOB_DIMMER_RACK_PROPERTIES222, "Dimming Rack Properties Blob v2" }, |
| 2736 | { ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223, "Dimming Rack Status Properties Blob v2" }, |
| 2737 | { ACN_BLOB_DIMMER_STATUS_PROPERTIES224, "Dimmer Status Properties Blob v2" }, |
| 2738 | { ACN_BLOB_TIME225, "Time Blob (deprecated 2)" }, |
| 2739 | { ACN_BLOB_RPC26, "RPC Blob" }, |
| 2740 | { ACN_BLOB_DHCP_CONFIG_SUBNET27, "DHCP Config Subnet Blob" }, |
| 2741 | { ACN_BLOB_DHCP_CONFIG_STATIC_ROUTE28, "DHCP Config Static Route Blob" }, |
| 2742 | { ACN_BLOB_ENERGY_MANAGEMENT29, "Energy Management Blob" }, |
| 2743 | { ACN_BLOB_PRESET_PROPERTIES250, "Preset Properties Blob" }, |
| 2744 | { ACN_BLOB_TIME330, "Time Blob v2" }, |
| 2745 | { ACN_BLOB_ENERGY_COST31, "Energy Cost Blob" }, |
| 2746 | { ACN_BLOB_SEQUENCE_OPERATIONS32, "Sequence Operations Blob" }, |
| 2747 | { ACN_BLOB_SEQUENCE_STEP_PROPERTIES33, "Sequence Step Properties Blob" }, |
| 2748 | { 0, NULL((void*)0) } |
| 2749 | }; |
| 2750 | |
| 2751 | static const value_string acn_dmp_vector_vals[] = { |
| 2752 | { ACN_DMP_VECTOR_UNKNOWN0, "Unknown"}, |
| 2753 | { ACN_DMP_VECTOR_GET_PROPERTY1, "Get Property"}, |
| 2754 | { ACN_DMP_VECTOR_SET_PROPERTY2, "Set Property"}, |
| 2755 | { ACN_DMP_VECTOR_GET_PROPERTY_REPLY3, "Get property reply"}, |
| 2756 | { ACN_DMP_VECTOR_EVENT4, "Event"}, |
| 2757 | { ACN_DMP_VECTOR_MAP_PROPERTY5, "Map Property"}, |
| 2758 | { ACN_DMP_VECTOR_UNMAP_PROPERTY6, "Unmap Property"}, |
| 2759 | { ACN_DMP_VECTOR_SUBSCRIBE7, "Subscribe"}, |
| 2760 | { ACN_DMP_VECTOR_UNSUBSCRIBE8, "Unsubscribe"}, |
| 2761 | { ACN_DMP_VECTOR_GET_PROPERTY_FAIL9, "Get Property Fail"}, |
| 2762 | { ACN_DMP_VECTOR_SET_PROPERTY_FAIL10, "Set Property Fail"}, |
| 2763 | { ACN_DMP_VECTOR_MAP_PROPERTY_FAIL11, "Map Property Fail"}, |
| 2764 | { ACN_DMP_VECTOR_SUBSCRIBE_ACCEPT12, "Subscribe Accept"}, |
| 2765 | { ACN_DMP_VECTOR_SUBSCRIBE_REJECT13, "Subscribe Reject"}, |
| 2766 | { ACN_DMP_VECTOR_ALLOCATE_MAP14, "Allocate Map"}, |
| 2767 | { ACN_DMP_VECTOR_ALLOCATE_MAP_REPLY15, "Allocate Map Reply"}, |
| 2768 | { ACN_DMP_VECTOR_DEALLOCATE_MAP16, "Deallocate Map" }, |
| 2769 | { ACN_DMP_VECTOR_SYNC_EVENT17, "Sync Event" }, |
| 2770 | { 0, NULL((void*)0) }, |
| 2771 | }; |
| 2772 | |
| 2773 | static const value_string acn_ip_address_type_vals[] = { |
| 2774 | { ACN_ADDR_NULL0, "Null"}, |
| 2775 | { ACN_ADDR_IPV41, "IPv4"}, |
| 2776 | { ACN_ADDR_IPV62, "IPv6"}, |
| 2777 | { ACN_ADDR_IPPORT3, "Port"}, |
| 2778 | { 0, NULL((void*)0) }, |
| 2779 | }; |
| 2780 | |
| 2781 | static const value_string acn_refuse_code_vals[] = { |
| 2782 | { ACN_REFUSE_CODE_NONSPECIFIC1, "Nonspecific" }, |
| 2783 | { ACN_REFUSE_CODE_ILLEGAL_PARAMS2, "Illegal Parameters" }, |
| 2784 | { ACN_REFUSE_CODE_LOW_RESOURCES3, "Low Resources" }, |
| 2785 | { ACN_REFUSE_CODE_ALREADY_MEMBER4, "Already Member" }, |
| 2786 | { ACN_REFUSE_CODE_BAD_ADDR_TYPE5, "Bad Address Type" }, |
| 2787 | { ACN_REFUSE_CODE_NO_RECIP_CHAN6, "No Reciprocal Channel" }, |
| 2788 | { 0, NULL((void*)0) }, |
| 2789 | }; |
| 2790 | |
| 2791 | static const value_string acn_reason_code_vals[] = { |
| 2792 | { ACN_REASON_CODE_NONSPECIFIC1, "Nonspecific" }, |
| 2793 | { ACN_REASON_CODE_NO_RECIP_CHAN6, "No Reciprocal Channel" }, |
| 2794 | { ACN_REASON_CODE_CHANNEL_EXPIRED7, "Channel Expired" }, |
| 2795 | { ACN_REASON_CODE_LOST_SEQUENCE8, "Lost Sequence" }, |
| 2796 | { ACN_REASON_CODE_SATURATED9, "Saturated" }, |
| 2797 | { ACN_REASON_CODE_TRANS_ADDR_CHANGING10, "Transport Address Changing" }, |
| 2798 | { ACN_REASON_CODE_ASKED_TO_LEAVE11, "Asked to Leave" }, |
| 2799 | { ACN_REASON_CODE_NO_RECIPIENT12, "No Recipient"}, |
| 2800 | { 0, NULL((void*)0) }, |
| 2801 | }; |
| 2802 | |
| 2803 | static const value_string acn_dmp_reason_code_vals[] = { |
| 2804 | { ACN_DMP_REASON_CODE_NONSPECIFIC1, "Nonspecific" }, |
| 2805 | { ACN_DMP_REASON_CODE_NOT_A_PROPERTY2, "Not a Property" }, |
| 2806 | { ACN_DMP_REASON_CODE_WRITE_ONLY3, "Write Only" }, |
| 2807 | { ACN_DMP_REASON_CODE_NOT_WRITABLE4, "Not Writable" }, |
| 2808 | { ACN_DMP_REASON_CODE_DATA_ERROR5, "Data Error" }, |
| 2809 | { ACN_DMP_REASON_CODE_MAPS_NOT_SUPPORTED6, "Maps not Supported" }, |
| 2810 | { ACN_DMP_REASON_CODE_SPACE_NOT_AVAILABLE7, "Space not Available" }, |
| 2811 | { ACN_DMP_REASON_CODE_PROP_NOT_MAPPABLE8, "Property not Mappable"}, |
| 2812 | { ACN_DMP_REASON_CODE_MAP_NOT_ALLOCATED9, "Map not Allocated"}, |
| 2813 | { ACN_DMP_REASON_CODE_SUBSCRIPTION_NOT_SUPPORTED10, "Subscription not Supported"}, |
| 2814 | { ACN_DMP_REASON_CODE_NO_SUBSCRIPTIONS_SUPPORTED11, "No Subscriptions Supported"}, |
| 2815 | { 0, NULL((void*)0) }, |
| 2816 | }; |
| 2817 | |
| 2818 | static const enum_val_t dmx_display_view[] = { |
| 2819 | { "hex" , "Hex ", ACN_PREF_DMX_DISPLAY_HEX0 }, |
| 2820 | { "decimal", "Decimal", ACN_PREF_DMX_DISPLAY_DEC1 }, |
| 2821 | { "percent", "Percent", ACN_PREF_DMX_DISPLAY_PER2 }, |
| 2822 | { NULL((void*)0), NULL((void*)0), 0 } |
| 2823 | }; |
| 2824 | |
| 2825 | static const enum_val_t dmx_display_line_format[] = { |
| 2826 | { "20", "20 per line", ACN_PREF_DMX_DISPLAY_20PL0 }, |
| 2827 | { "16", "16 per line", ACN_PREF_DMX_DISPLAY_16PL1 }, |
| 2828 | { NULL((void*)0), NULL((void*)0), 0 } |
| 2829 | }; |
| 2830 | |
| 2831 | |
| 2832 | static const value_string magic_pdu_subtypes[] = { |
| 2833 | { MAGIC_V10, "V1" }, |
| 2834 | { MAGIC_COMMAND1, "V2 Command" }, |
| 2835 | { MAGIC_REPLY2, "V2 Reply" }, |
| 2836 | { MAGIC_REPLY_TYPE_33, "V2 Reply Type 3" }, |
| 2837 | { 0, NULL((void*)0) } |
| 2838 | }; |
| 2839 | |
| 2840 | static const value_string magic_v1command_vals[] = { |
| 2841 | { V1_SWITCH_TO_NET11, "Switch to Net1" }, |
| 2842 | { V1_SWITCH_TO_NET22, "Switch to Net2" }, |
| 2843 | { V1_BOOTP1114467, "bootp" }, |
| 2844 | { 0, NULL((void*)0) } |
| 2845 | }; |
| 2846 | |
| 2847 | static const value_string magic_command_vals[] = { |
| 2848 | { V2_CMD_SWITCH_TO_NET11, "Switch to Net1 mode" }, |
| 2849 | { V2_CMD_SWITCH_TO_NET22, "Switch to Net2 mode" }, |
| 2850 | { V2_CMD_DOWNLOAD3, "Code download" }, |
| 2851 | { V2_CMD_SOFTBOOT4, "Soft reboot" }, |
| 2852 | { V2_CMD_PHYSICAL_BEACON5, "Physical beacon" }, |
| 2853 | { V2_CMD_NETWORK_BEACON6, "Network beacon" }, |
| 2854 | { V2_CMD_SWITCH_TO_ACN7, "Switch to ACN mode" }, |
| 2855 | { V2_CMD_SWITCH_TO_DYNAMIC_IP8, "Switch to dynamic IP address configuration" }, |
| 2856 | { V2_CMD_EXTENDED_NETWORK_BEACON9, "Extended network beacon" }, |
| 2857 | { V2_CMD_IP_CONFIGURATION10, "IP configuration" }, |
| 2858 | { V2_CMD_RESTORE_FACTORY_DEFAULT11, "Restore factory default" }, |
| 2859 | { V2_CMD_PHYSICAL_BEACON_BY_CID12, "Physical beacon by CID" }, |
| 2860 | { V2_CMD_NET2_DOWNLOAD110163, "NET2 code download and reboot" }, |
| 2861 | { 0, NULL((void*)0) } |
| 2862 | }; |
| 2863 | |
| 2864 | static const value_string magic_reset_lease_vals[] = { |
| 2865 | { MAGIC_SWITCH_TO_DYNAMIC_MAINTAIN_LEASE0, "Maintain lease" }, |
| 2866 | { MAGIC_SWITCH_TO_DYNAMIC_RESET_LEASE1, "Reset lease" }, |
| 2867 | { 0, NULL((void*)0) } |
| 2868 | }; |
| 2869 | |
| 2870 | static const value_string magic_ip_configuration_vals[] = { |
| 2871 | { MAGIC_DYNAMIC_IP_MAINTAIN_LEASE0, "Dynamic IP, maintain lease" }, |
| 2872 | { MAGIC_DYNAMIC_IP_RESET_LEASE1, "Dynamic IP, reset lease" }, |
| 2873 | { MAGIC_STATIC_IP2, "Static IP" }, |
| 2874 | { 0, NULL((void*)0) } |
| 2875 | }; |
| 2876 | |
| 2877 | static const value_string security_seq_type_vals[] = { |
| 2878 | { 0, "Time (ms since epoch)" }, |
| 2879 | { 1, "Volatile" }, |
| 2880 | { 2, "Non-volatile" }, |
| 2881 | { 0, NULL((void*)0) } |
| 2882 | }; |
| 2883 | |
| 2884 | static const value_string rdmnet_llrp_vector_vals[] = { |
| 2885 | { RDMNET_LLRP_VECTOR_PROBE_REQUEST0x00000001, "LLRP probe request" }, |
| 2886 | { RDMNET_LLRP_VECTOR_PROBE_REPLY0x00000002, "LLRP probe reply" }, |
| 2887 | { RDMNET_LLRP_VECTOR_RDM_CMD0x00000003, "LLRP RDM command" }, |
| 2888 | { 0, NULL((void*)0) } |
| 2889 | }; |
| 2890 | |
| 2891 | static const value_string rdmnet_llrp_probe_request_vals[] = { |
| 2892 | { VECTOR_PROBE_REQUEST_DATA0x01, "Vector probe request data" }, |
| 2893 | { 0, NULL((void*)0) } |
| 2894 | }; |
| 2895 | |
| 2896 | static const value_string rdmnet_llrp_probe_reply_vals[] = { |
| 2897 | { VECTOR_PROBE_REPLY_DATA0x01, "Vector probe reply data" }, |
| 2898 | { 0, NULL((void*)0) } |
| 2899 | }; |
| 2900 | |
| 2901 | static const value_string rdmnet_llrp_probe_reply_component_type_vals[] = { |
| 2902 | { RDMNET_LLRP_COMPONENT_TYPE_RPT_DEVICE0x00, "Device target" }, |
| 2903 | { RDMNET_LLRP_COMPONENT_TYPE_RPT_CONTROLLER0x01, "Controller target" }, |
| 2904 | { RDMNET_LLRP_COMPONENT_TYPE_BROKER0x02, "Broker target" }, |
| 2905 | { RDMNET_LLRP_COMPONENT_TYPE_NON_RDMNET0xFF, "Non RDMnet target" }, |
| 2906 | { 0, NULL((void*)0) } |
| 2907 | }; |
| 2908 | |
| 2909 | static const value_string rdmnet_llrp_rdm_command_start_code_vals[] = { |
| 2910 | { RDMNET_LLRP_VECTOR_RDM_CMD_START_CODE0xCC, "RDM Start Code" }, |
| 2911 | { 0, NULL((void*)0) } |
| 2912 | }; |
| 2913 | |
| 2914 | static const value_string rdmnet_broker_disconnect_reason_vals[] = { |
| 2915 | { RDMNET_RPT_DISCONNECT_SHUTDOWN0x0000, "Component shut down" }, |
| 2916 | { RDMNET_RPT_DISCONNECT_CAPACITY_EXHAUSTED0x0001, "Component capacity exhausted" }, |
| 2917 | { RDMNET_RPT_DISCONNECT_HARDWARE_FAULT0x0002, "Component hardware fault" }, |
| 2918 | { RDMNET_RPT_DISCONNECT_SOFTWARE_FAULT0x0003, "Component software fault" }, |
| 2919 | { RDMNET_RPT_DISCONNECT_SOFTWARE_RESET0x0004, "Component software reset" }, |
| 2920 | { RDMNET_RPT_DISCONNECT_INCORRECT_SCOPE0x0005, "Broker incorrect scope" }, |
| 2921 | { RDMNET_RPT_DISCONNECT_LLRP_RECONFIGURE0x0007, "Component reconfigured by LLRP" }, |
| 2922 | { RDMNET_RPT_DISCONNECT_RPT_RECONFIGURE0x0006, "Component reconfigured by RPT" }, |
| 2923 | { RDMNET_RPT_DISCONNECT_USER_RECONFIGURE0x0008, "Component reconfigured by user" }, |
| 2924 | { 0, NULL((void*)0) } |
| 2925 | }; |
| 2926 | |
| 2927 | static const value_string rdmnet_rpt_vector_vals[] = { |
| 2928 | { RDMNET_RPT_VECTOR_REQUEST0x00000001, "Request" }, |
| 2929 | { RDMNET_RPT_VECTOR_STATUS0x00000002, "Status" }, |
| 2930 | { RDMNET_RPT_VECTOR_NOTIFICATION0x00000003, "Notification" }, |
| 2931 | { 0, NULL((void*)0) } |
| 2932 | }; |
| 2933 | |
| 2934 | static const value_string rdmnet_rpt_request_vals[] = { |
| 2935 | { RDMNET_RPT_VECTOR_REQUEST_RDM_CMD0x01, "RDM Command" }, |
| 2936 | { 0, NULL((void*)0) } |
| 2937 | }; |
| 2938 | |
| 2939 | static const value_string rdmnet_rpt_status_vector_vals[] = { |
| 2940 | { RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RPT_UID0x0001, "Unknown RPT UID" }, |
| 2941 | { RDMNET_RPT_VECTOR_STATUS_RDM_TIMEOUT0x0002, "RDM Timeout" }, |
| 2942 | { RDMNET_RPT_VECTOR_STATUS_RDM_INVALID_RESPONSE0x0003, "Invalid RDM Response" }, |
| 2943 | { RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RDM_UID0x0004, "Unknown RDM UID" }, |
| 2944 | { RDMNET_RPT_VECTOR_STATUS_UNKNOWN_ENDPOINT0x0005, "Unknown Endpoint" }, |
| 2945 | { RDMNET_RPT_VECTOR_STATUS_BROADCAST_COMPLETE0x0006, "Broadcast Complete" }, |
| 2946 | { RDMNET_RPT_VECTOR_STATUS_UNKNOWN_VECTOR0x0007, "Unknown Vector" }, |
| 2947 | { RDMNET_RPT_VECTOR_STATUS_INVALID_MESSAGE0x0008, "Invalid Message" }, |
| 2948 | { RDMNET_RPT_VECTOR_STATUS_INVALID_COMMAND_CLASS0x0009, "Invalid Command Class" }, |
| 2949 | { 0, NULL((void*)0) } |
| 2950 | }; |
| 2951 | |
| 2952 | static const value_string rdmnet_rpt_notification_vals[] = { |
| 2953 | { RDMNET_RPT_VECTOR_NOTIFICATION_RDM_CMD0x01, "RDM Command" }, |
| 2954 | { 0, NULL((void*)0) } |
| 2955 | }; |
| 2956 | |
| 2957 | static const value_string rdmnet_rpt_request_rdm_command_start_code_vals[] = { |
| 2958 | { RDMNET_RPT_VECTOR_RDM_CMD_RD_DATA0xCC, "RDM Start Code" }, |
| 2959 | { 0, NULL((void*)0) } |
| 2960 | }; |
| 2961 | |
| 2962 | static const value_string rdmnet_broker_vector_vals[] = { |
| 2963 | { RDMNET_BROKER_VECTOR_FETCH_CLIENT_LIST0x0006, "Fetch client list" }, |
| 2964 | { RDMNET_BROKER_VECTOR_CONNECTED_CLIENT_LIST0x0007, "Connected client list" }, |
| 2965 | { RDMNET_BROKER_VECTOR_CLIENT_ADD0x0008, "Add client" }, |
| 2966 | { RDMNET_BROKER_VECTOR_CLIENT_REMOVE0x0009, "Remove client" }, |
| 2967 | { RDMNET_BROKER_VECTOR_CLIENT_ENTRY_CHANGE0x000A, "Change client entry" }, |
| 2968 | { RDMNET_BROKER_VECTOR_CONNECT0x0001, "Connect" }, |
| 2969 | { RDMNET_BROKER_VECTOR_CONNECT_REPLY0x0002, "Connect reply" }, |
| 2970 | { RDMNET_BROKER_VECTOR_CLIENT_ENTRY_UPDATE0x0003, "Update client entry" }, |
| 2971 | { RDMNET_BROKER_VECTOR_REDIRECT_V40x0004, "Redirect IP v4" }, |
| 2972 | { RDMNET_BROKER_VECTOR_REDIRECT_V60x0005, "Redirect IP v6" }, |
| 2973 | { RDMNET_BROKER_VECTOR_DISCONNECT0x000E, "Disconnect" }, |
| 2974 | { RDMNET_BROKER_VECTOR_NULL0x000F, "Null" }, |
| 2975 | { RDMNET_BROKER_VECTOR_REQUEST_DYNAMIC_UIDS0x000B, "Request Dynamic UIDs" }, |
| 2976 | { RDMNET_BROKER_VECTOR_ASSIGNED_DYNAMIC_UIDS0x000C, "Assigned Dynamic UIDs" }, |
| 2977 | { RDMNET_BROKER_VECTOR_FETCH_DYNAMIC_UID_LIST0x000D, "Fetch dynamic UID List" }, |
| 2978 | { 0, NULL((void*)0) } |
| 2979 | }; |
| 2980 | |
| 2981 | static const value_string rdmnet_broker_status_code_vals[] = { |
| 2982 | { RDMNET_BROKER_CONNECT_OK0x0000, "Ok" }, |
| 2983 | { RDMNET_BROKER_CONNECT_SCOPE_MISMATCH0x0001, "Scope mismatch" }, |
| 2984 | { RDMNET_BROKER_CONNECT_CAPACITY_EXCEEDED0x0002, "Capacity exceeded" }, |
| 2985 | { RDMNET_BROKER_CONNECT_DUPLICATE_UID0x0003, "Duplicate UID" }, |
| 2986 | { RDMNET_BROKER_CONNECT_INVALID_CLIENT_ENTRY0x0004, "Invalid client entry" }, |
| 2987 | { RDMNET_BROKER_CONNECT_INVALID_UID0x0005, "Invalid UID" }, |
| 2988 | { 0, NULL((void*)0) } |
| 2989 | }; |
| 2990 | |
| 2991 | static const value_string dynamic_uid_mapping_status_code_vals[] = { |
| 2992 | { RDMNET_DYNAMIC_UID_STATUS_OK0x0000, "Dynamic UID Status Ok" }, |
| 2993 | { RDMNET_DYNAMIC_UID_STATUS_INVALID_REQUEST0x0001, "Dynamic UID Status Invalid Request" }, |
| 2994 | { RDMNET_DYNAMIC_UID_STATUS_UID_NOT_FOUND0x0002, "Dynamic UID Status UID Not Found" }, |
| 2995 | { RDMNET_DYNAMIC_UID_STATUS_DUPLICATE_RID0x0003, "Dynamic UID Status Duplicate RID" }, |
| 2996 | { RDMNET_DYNAMIC_UID_STATUS_CAPACITY_EXHAUSTED0x0004, "Dynamic UID Status Capacity Exhausted" }, |
| 2997 | { 0, NULL((void*)0) } |
| 2998 | }; |
| 2999 | |
| 3000 | static const value_string broker_client_protocol_vals[] = { |
| 3001 | { RDMNET_CLIENT_PROTOCOL_RPT0x00000005, "Client Protocol RPT" }, |
| 3002 | { RDMNET_CLIENT_PROTOCOL_EPT0x0000000B, "Client Protocol EPT" }, |
| 3003 | { 0, NULL((void*)0) } |
| 3004 | }; |
| 3005 | |
| 3006 | static const value_string broker_client_rpt_client_type_vals[] = { |
| 3007 | { RDMNET_RPT_CLIENT_TYPE_DEVICE0x00, "Device" }, |
| 3008 | { RDMNET_RPT_CLIENT_TYPE_CONTROLLER0x01, "Controller" }, |
| 3009 | { 0, NULL((void*)0) } |
| 3010 | }; |
| 3011 | |
| 3012 | static const value_string rdmnet_ept_vector_vals[] = { |
| 3013 | { RDMNET_EPT_VECTOR_DATA0x00000001, "Data" }, |
| 3014 | { RDMNET_EPT_VECTOR_STATUS0x00000002, "Status" }, |
| 3015 | { 0, NULL((void*)0) } |
| 3016 | }; |
| 3017 | |
| 3018 | static dissector_handle_t rdm_handle; |
| 3019 | |
| 3020 | /******************************************************************************/ |
| 3021 | /* Test to see if it is a Magic Bullet Packet */ |
| 3022 | static bool_Bool |
| 3023 | is_magic(tvbuff_t *tvb) |
| 3024 | { |
| 3025 | static const uint8_t magic_protocol_id = 15; |
| 3026 | |
| 3027 | if (tvb_get_uint8(tvb, 0) == magic_protocol_id) |
| 3028 | return true1; |
| 3029 | |
| 3030 | return false0; |
| 3031 | } |
| 3032 | |
| 3033 | /******************************************************************************/ |
| 3034 | /* Dissect Magic Bullet */ |
| 3035 | static int |
| 3036 | dissect_magic(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) |
| 3037 | { |
| 3038 | uint8_t pdu_subtype; |
| 3039 | int offset = 0; |
| 3040 | const char *pdu_subtype_string; |
| 3041 | proto_tree *ti, *subtype_item; |
| 3042 | proto_tree *magic_tree; |
| 3043 | uint32_t command; |
| 3044 | int32_t str_len; |
| 3045 | uint32_t major, minor, patch, aud, crit, build; |
| 3046 | char *buffer; |
| 3047 | |
| 3048 | /* Set the protocol column */ |
| 3049 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "MAGIC"); |
| 3050 | |
| 3051 | /* Create our tree */ |
| 3052 | ti = proto_tree_add_item(tree, proto_magic, tvb, offset, -1, ENC_NA0x00000000); |
| 3053 | magic_tree = proto_item_add_subtree(ti, ett_magic); |
| 3054 | |
| 3055 | /* Protocol ID */ |
| 3056 | proto_tree_add_item(magic_tree, hf_magic_protocol_id, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3057 | offset++; |
| 3058 | |
| 3059 | /* PDU Type */ |
| 3060 | pdu_subtype = tvb_get_uint8(tvb, offset); |
| 3061 | pdu_subtype_string = val_to_str(pinfo->pool, pdu_subtype, magic_pdu_subtypes, "Unknown (0x%02x)"); |
| 3062 | |
| 3063 | /* Adjust info column */ |
| 3064 | col_clear(pinfo->cinfo, COL_INFO); |
| 3065 | col_add_fstr(pinfo->cinfo, COL_INFO, "MAGIC - %s", pdu_subtype_string); |
| 3066 | |
| 3067 | /* Append subtype description */ |
| 3068 | proto_item_append_text(ti, ": %s", pdu_subtype_string); |
| 3069 | |
| 3070 | subtype_item = proto_tree_add_item(magic_tree, hf_magic_pdu_subtype, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3071 | offset++; |
| 3072 | proto_tree_add_item(magic_tree, hf_magic_major_version, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3073 | offset++; |
| 3074 | proto_tree_add_item(magic_tree, hf_magic_minor_version, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3075 | offset++; |
| 3076 | |
| 3077 | switch (pdu_subtype) { |
| 3078 | case MAGIC_V10: |
| 3079 | proto_tree_add_item(magic_tree, hf_magic_v1command_vals, tvb, offset, 4, ENC_LITTLE_ENDIAN0x80000000); |
| 3080 | offset += 4; |
| 3081 | break; |
| 3082 | |
| 3083 | case MAGIC_COMMAND1: |
| 3084 | /* note, v2 is big-endian */ |
| 3085 | proto_tree_add_item_ret_uint(magic_tree, hf_magic_command_vals, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &command); |
| 3086 | offset += 4; |
| 3087 | /* deal with variable parameter */ |
| 3088 | switch (command) { |
| 3089 | case V2_CMD_DOWNLOAD3: |
| 3090 | proto_tree_add_item(magic_tree, hf_magic_command_tftp, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3091 | offset += 4; |
| 3092 | break; |
| 3093 | case V2_CMD_PHYSICAL_BEACON5: |
| 3094 | proto_tree_add_item(magic_tree, hf_magic_command_beacon_duration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3095 | offset += 4; |
| 3096 | break; |
| 3097 | case V2_CMD_NETWORK_BEACON6: |
| 3098 | proto_tree_add_item(magic_tree, hf_magic_command_beacon_duration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3099 | offset += 4; |
| 3100 | break; |
| 3101 | case V2_CMD_SWITCH_TO_DYNAMIC_IP8: |
| 3102 | proto_tree_add_item(magic_tree, hf_magic_command_reset_lease, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3103 | offset += 4; |
| 3104 | break; |
| 3105 | case V2_CMD_EXTENDED_NETWORK_BEACON9: |
| 3106 | proto_tree_add_item(magic_tree, hf_magic_command_beacon_duration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3107 | offset += 4; |
| 3108 | break; |
| 3109 | case V2_CMD_IP_CONFIGURATION10: |
| 3110 | proto_tree_add_item(magic_tree, hf_magic_command_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 3111 | offset += 16; |
| 3112 | proto_tree_add_item(magic_tree, hf_magic_command_ip_configuration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3113 | offset += 4; |
| 3114 | proto_tree_add_item(magic_tree, hf_magic_command_ip_address, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3115 | offset += 4; |
| 3116 | proto_tree_add_item(magic_tree, hf_magic_command_subnet_mask, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3117 | offset += 4; |
| 3118 | proto_tree_add_item(magic_tree, hf_magic_command_gateway, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3119 | offset += 4; |
| 3120 | break; |
| 3121 | case V2_CMD_RESTORE_FACTORY_DEFAULT11: |
| 3122 | proto_tree_add_item(magic_tree, hf_magic_command_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 3123 | offset += 16; |
| 3124 | break; |
| 3125 | case V2_CMD_PHYSICAL_BEACON_BY_CID12: |
| 3126 | proto_tree_add_item(magic_tree, hf_magic_command_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 3127 | offset += 16; |
| 3128 | proto_tree_add_item(magic_tree, hf_magic_command_beacon_duration, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3129 | offset += 4; |
| 3130 | break; |
| 3131 | /* case V2_CMD_SOFTBOOT: */ |
| 3132 | /* case V2_CMD_SWITCH_TO_NET1: */ |
| 3133 | /* case V2_CMD_SWITCH_TO_NET2: */ |
| 3134 | /* case V2_CMD_SWITCH_TO_ACN: */ |
| 3135 | /* case V2_CMD_NET2_DOWNLOAD: */ |
| 3136 | } |
| 3137 | break; |
| 3138 | |
| 3139 | case MAGIC_REPLY2: |
| 3140 | /* note, v2 is big-endian */ |
| 3141 | proto_tree_add_item(magic_tree, hf_magic_reply_ip_address, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3142 | offset += 4; |
| 3143 | proto_tree_add_item(magic_tree, hf_magic_reply_subnet_mask, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3144 | offset += 4; |
| 3145 | proto_tree_add_item(magic_tree, hf_magic_reply_gateway, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3146 | offset += 4; |
| 3147 | proto_tree_add_item(magic_tree, hf_magic_reply_tftp, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3148 | offset += 4; |
| 3149 | |
| 3150 | /* encoded and display version */ |
| 3151 | major = tvb_get_uint8(tvb, offset++); |
| 3152 | minor = tvb_get_uint8(tvb, offset++); |
| 3153 | patch = tvb_get_uint8(tvb, offset++); |
| 3154 | aud = tvb_get_uint8(tvb, offset++); |
| 3155 | crit = tvb_get_uint8(tvb, offset++); |
| 3156 | build = tvb_get_ntohs(tvb, offset); |
| 3157 | offset += 2; |
| 3158 | |
| 3159 | offset -= 7; |
| 3160 | buffer = wmem_strdup_printf(pinfo->pool, "%d.%d.%d.%d.%d.%d", major, minor, patch, aud, crit, build); |
| 3161 | proto_tree_add_string(magic_tree, hf_magic_reply_version, tvb, offset, 7, buffer); |
| 3162 | offset += 7; |
| 3163 | |
| 3164 | /* Device Type Name string */ |
| 3165 | proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_device_type_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len); |
| 3166 | offset += str_len; |
| 3167 | |
| 3168 | /* Default Name string */ |
| 3169 | proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_default_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len); |
| 3170 | offset += str_len; |
| 3171 | |
| 3172 | /* User Name string */ |
| 3173 | proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_user_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len); |
| 3174 | offset += str_len; |
| 3175 | break; |
| 3176 | |
| 3177 | case MAGIC_REPLY_TYPE_33: |
| 3178 | command = tvb_get_ntohl(tvb, offset); |
| 3179 | proto_tree_add_item(magic_tree, hf_magic_command_vals, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3180 | offset += 4; |
| 3181 | proto_tree_add_item(magic_tree, hf_magic_reply_ip_address, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3182 | offset += 4; |
| 3183 | proto_tree_add_item(magic_tree, hf_magic_reply_subnet_mask, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3184 | offset += 4; |
| 3185 | proto_tree_add_item(magic_tree, hf_magic_reply_gateway, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3186 | offset += 4; |
| 3187 | proto_tree_add_item(magic_tree, hf_magic_reply_tftp, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3188 | offset += 4; |
| 3189 | proto_tree_add_item(magic_tree, hf_magic_reply_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 3190 | offset += 16; |
| 3191 | proto_tree_add_item(magic_tree, hf_magic_reply_dcid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 3192 | offset += 16; |
| 3193 | |
| 3194 | /* encoded and display version */ |
| 3195 | major = tvb_get_uint8(tvb, offset++); |
| 3196 | minor = tvb_get_uint8(tvb, offset++); |
| 3197 | patch = tvb_get_uint8(tvb, offset++); |
| 3198 | aud = tvb_get_uint8(tvb, offset++); |
| 3199 | crit = tvb_get_uint8(tvb, offset++); |
| 3200 | build = tvb_get_ntohs(tvb, offset); |
| 3201 | offset += 2; |
| 3202 | |
| 3203 | offset -= 7; |
| 3204 | buffer = wmem_strdup_printf(pinfo->pool, "%d.%d.%d.%d.%d.%d", major, minor, patch, aud, crit, build); |
| 3205 | proto_tree_add_string(magic_tree, hf_magic_reply_version, tvb, offset, 7, buffer); |
| 3206 | offset += 7; |
| 3207 | |
| 3208 | /* Device Type Name string */ |
| 3209 | proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_device_type_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len); |
| 3210 | offset += str_len; |
| 3211 | |
| 3212 | /* Default Name string */ |
| 3213 | proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_default_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len); |
| 3214 | offset += str_len; |
| 3215 | |
| 3216 | /* User Name string */ |
| 3217 | proto_tree_add_item_ret_length(magic_tree, hf_magic_reply_user_name, tvb, offset, 1, ENC_NA0x00000000|ENC_ASCII0x00000000, &str_len); |
| 3218 | offset += str_len; |
| 3219 | break; |
| 3220 | |
| 3221 | default: |
| 3222 | expert_add_info(pinfo, subtype_item, &ei_magic_reply_invalid_type); |
| 3223 | offset = tvb_captured_length(tvb); |
| 3224 | } |
| 3225 | return offset; |
| 3226 | } |
| 3227 | |
| 3228 | /******************************************************************************/ |
| 3229 | /* Test to see if it is an ACN or an RDMnet Packet over UDP */ |
| 3230 | static bool_Bool |
| 3231 | is_acn_or_rdmnet_over_udp(tvbuff_t *tvb, uint32_t *protocol_id) |
| 3232 | { |
| 3233 | static const char acn_packet_id[] = "ASC-E1.17\0\0\0"; /* must be 12 bytes */ |
| 3234 | uint32_t offset; |
| 3235 | uint8_t pdu_flags; |
| 3236 | |
| 3237 | if (tvb_captured_length(tvb) < (4+sizeof(acn_packet_id) + 6)) |
| 3238 | return false0; |
| 3239 | |
| 3240 | /* Check the bytes in octets 4 - 16 */ |
| 3241 | if (tvb_memeql(tvb, 4, (const uint8_t*)acn_packet_id, sizeof(acn_packet_id)-1) != 0) |
| 3242 | return false0; |
| 3243 | |
| 3244 | offset = 16; |
| 3245 | pdu_flags = tvb_get_uint8(tvb, offset) & 0xf0; |
| 3246 | if (pdu_flags & ACN_PDU_FLAG_L0x80) { |
| 3247 | /* length bit is set: there are three length bytes */ |
| 3248 | offset += 3; |
| 3249 | } |
| 3250 | else { |
| 3251 | /* length bit is clear: there are two length bytes */ |
| 3252 | offset += 2; |
| 3253 | } |
| 3254 | |
| 3255 | *protocol_id = tvb_get_ntohl(tvb, offset); |
| 3256 | return true1; |
| 3257 | } |
| 3258 | |
| 3259 | /******************************************************************************/ |
| 3260 | /* Test to see if it is an RDMnet Packet over TCP */ |
| 3261 | static bool_Bool |
| 3262 | is_rdmnet_over_tcp(tvbuff_t *tvb) |
| 3263 | { |
| 3264 | static const char acn_packet_id[] = "ASC-E1.17\0\0\0"; /* must be 12 bytes */ |
| 3265 | uint32_t offset; |
| 3266 | uint32_t protocol_id; |
| 3267 | uint8_t pdu_flags; |
| 3268 | |
| 3269 | if (tvb_captured_length(tvb) < (4+sizeof(acn_packet_id))) { |
| 3270 | return false0; |
| 3271 | } |
| 3272 | |
| 3273 | /* Check the bytes in octets 0 - 12 */ |
| 3274 | if (tvb_memeql(tvb, 0, (const uint8_t*)acn_packet_id, sizeof(acn_packet_id)-1) != 0) { |
| 3275 | return false0; |
| 3276 | } |
| 3277 | |
| 3278 | offset = 16; |
| 3279 | pdu_flags = tvb_get_uint8(tvb, offset) & 0xf0; |
| 3280 | if (pdu_flags & ACN_PDU_FLAG_L0x80) { |
| 3281 | /* length bit is set: there are three length bytes */ |
| 3282 | offset += 3; |
| 3283 | } else { |
| 3284 | /* length bit is clear: there are two length bytes */ |
| 3285 | offset += 2; |
| 3286 | } |
| 3287 | |
| 3288 | protocol_id = tvb_get_ntohl(tvb, offset); |
| 3289 | if ((protocol_id == ACN_PROTOCOL_ID_BROKER0x00000009) || |
| 3290 | (protocol_id == ACN_PROTOCOL_ID_RPT0x00000005) || |
| 3291 | (protocol_id == ACN_PROTOCOL_ID_EPT0x0000000B)) { |
| 3292 | return true1; |
| 3293 | } |
| 3294 | |
| 3295 | return false0; |
| 3296 | } |
| 3297 | |
| 3298 | /******************************************************************************/ |
| 3299 | /* Test to see if it is an ACN Packet */ |
| 3300 | static bool_Bool |
| 3301 | is_acn(tvbuff_t *tvb) |
| 3302 | { |
| 3303 | uint32_t protocol_id; |
| 3304 | |
| 3305 | if (is_acn_or_rdmnet_over_udp(tvb, &protocol_id)) { |
| 3306 | if ((protocol_id == ACN_PROTOCOL_ID_DMX0x00000003) || |
| 3307 | (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004) || |
| 3308 | (protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) || |
| 3309 | (protocol_id == ACN_PROTOCOL_ID_SDT0x00000001) || |
| 3310 | (protocol_id == ACN_PROTOCOL_ID_EXTENDED0x00000008)) |
| 3311 | return true1; |
| 3312 | } |
| 3313 | |
| 3314 | return false0; |
| 3315 | } |
| 3316 | |
| 3317 | /******************************************************************************/ |
| 3318 | /* Test to see if it is an ACN Packet */ |
| 3319 | static bool_Bool |
| 3320 | is_rdmnet_over_udp(tvbuff_t *tvb) |
| 3321 | { |
| 3322 | uint32_t protocol_id; |
| 3323 | |
| 3324 | if (is_acn_or_rdmnet_over_udp(tvb, &protocol_id) && (protocol_id == ACN_PROTOCOL_ID_LLRP0x0000000A)) { |
| 3325 | return true1; |
| 3326 | } |
| 3327 | |
| 3328 | return false0; |
| 3329 | } |
| 3330 | |
| 3331 | |
| 3332 | /******************************************************************************/ |
| 3333 | /* Heuristic dissector */ |
| 3334 | static bool_Bool |
| 3335 | dissect_acn_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) |
| 3336 | { |
| 3337 | /* This is a heuristic dissector, which means we get all the UDP |
| 3338 | * traffic not sent to a known dissector and not claimed by |
| 3339 | * a heuristic dissector called before us! |
| 3340 | */ |
| 3341 | |
| 3342 | if (is_acn(tvb)) { |
| 3343 | dissect_acn(tvb, pinfo, tree, data); |
| 3344 | return true1; |
| 3345 | } |
| 3346 | |
| 3347 | if (is_magic(tvb)) { |
| 3348 | dissect_magic(tvb, pinfo, tree); |
| 3349 | return true1; |
| 3350 | } |
| 3351 | |
| 3352 | /* abort if it is NOT an ACN or Magic Bullet packet */ |
| 3353 | return false0; |
| 3354 | } |
| 3355 | |
| 3356 | |
| 3357 | /******************************************************************************/ |
| 3358 | /* Heuristic dissector */ |
| 3359 | static bool_Bool |
| 3360 | dissect_rdmnet_over_udp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U___attribute__((unused))) |
| 3361 | { |
| 3362 | if (!is_rdmnet_over_udp(tvb)) { |
| 3363 | return false0; |
| 3364 | } |
| 3365 | |
| 3366 | dissect_rdmnet(tvb, pinfo, tree, 0, 1); |
| 3367 | return true1; |
| 3368 | } |
| 3369 | |
| 3370 | #define RDMNET_TCP_FRAME_HEADER_LENGTH16 16 |
| 3371 | |
| 3372 | static int |
| 3373 | dissect_one_rdmnet_over_tcp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U___attribute__((unused))) |
| 3374 | { |
| 3375 | if (!is_rdmnet_over_tcp(tvb)) { |
| 3376 | return 0; |
| 3377 | } |
| 3378 | |
| 3379 | dissect_rdmnet(tvb, pinfo, tree, 0, 0); |
| 3380 | return tvb_captured_length(tvb); |
| 3381 | } |
| 3382 | |
| 3383 | |
| 3384 | static unsigned |
| 3385 | get_rdmnet_tcp_message_length(packet_info *pinfo _U___attribute__((unused)), tvbuff_t *tvb, int offset, void *data _U___attribute__((unused))) |
| 3386 | { |
| 3387 | return (unsigned)tvb_get_ntohl(tvb, offset + 12) + 16; |
| 3388 | } |
| 3389 | |
| 3390 | static int |
| 3391 | dissect_rdmnet_over_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) |
| 3392 | { |
| 3393 | tcp_dissect_pdus(tvb, pinfo, tree, true1, RDMNET_TCP_FRAME_HEADER_LENGTH16, |
| 3394 | get_rdmnet_tcp_message_length, dissect_one_rdmnet_over_tcp_message, data); |
| 3395 | return tvb_captured_length(tvb); |
| 3396 | } |
| 3397 | |
| 3398 | |
| 3399 | /******************************************************************************/ |
| 3400 | /* Heuristic dissector */ |
| 3401 | static bool_Bool |
| 3402 | dissect_rdmnet_over_tcp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) |
| 3403 | { |
| 3404 | if (!is_rdmnet_over_tcp(tvb)) { |
| 3405 | return false0; |
| 3406 | } |
| 3407 | |
| 3408 | dissect_rdmnet_over_tcp(tvb, pinfo, tree, data); |
| 3409 | return true1; |
| 3410 | } |
| 3411 | |
| 3412 | |
| 3413 | /******************************************************************************/ |
| 3414 | /* Adds tree branch for channel owner info block */ |
| 3415 | static uint32_t |
| 3416 | acn_add_channel_owner_info_block(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3417 | { |
| 3418 | proto_item *pi; |
| 3419 | proto_tree *this_tree; |
| 3420 | uint32_t session_count; |
| 3421 | uint32_t x; |
| 3422 | |
| 3423 | this_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_acn_channel_owner_info_block, NULL((void*)0), |
| 3424 | "Channel Owner Info Block"); |
| 3425 | |
| 3426 | proto_tree_add_item(this_tree, hf_acn_member_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3427 | offset += 2; |
| 3428 | proto_tree_add_item(this_tree, hf_acn_channel_number, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3429 | offset += 2; |
| 3430 | offset = acn_add_address(tvb, pinfo, this_tree, offset, "Destination Address:"); |
| 3431 | offset = acn_add_address(tvb, pinfo, this_tree, offset, "Source Address:"); |
| 3432 | |
| 3433 | session_count = tvb_get_ntohs(tvb, offset); |
| 3434 | for (x=0; x<session_count; x++) { |
| 3435 | pi = proto_tree_add_item(this_tree, hf_acn_protocol_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3436 | proto_item_append_text(pi, " #%d", x+1); |
| 3437 | offset += 4; |
| 3438 | } |
| 3439 | return offset; |
| 3440 | } |
| 3441 | |
| 3442 | /******************************************************************************/ |
| 3443 | /* Adds tree branch for channel member info block */ |
| 3444 | static uint32_t |
| 3445 | acn_add_channel_member_info_block(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) |
| 3446 | { |
| 3447 | proto_item *pi; |
| 3448 | proto_tree *this_tree; |
| 3449 | uint32_t session_count; |
| 3450 | uint32_t x; |
| 3451 | |
| 3452 | this_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_acn_channel_member_info_block, |
| 3453 | NULL((void*)0), "Channel Member Info Block"); |
| 3454 | |
| 3455 | proto_tree_add_item(this_tree, hf_acn_member_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3456 | offset += 2; |
| 3457 | proto_tree_add_item(this_tree, hf_acn_cid, tvb, offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 3458 | offset += 16; |
| 3459 | proto_tree_add_item(this_tree, hf_acn_channel_number, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3460 | offset += 2; |
| 3461 | offset = acn_add_address(tvb, pinfo, this_tree, offset, "Destination Address:"); |
| 3462 | offset = acn_add_address(tvb, pinfo, this_tree, offset, "Source Address:"); |
| 3463 | proto_tree_add_item(this_tree, hf_acn_reciprocal_channel, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3464 | offset += 2; |
| 3465 | |
| 3466 | session_count = tvb_get_ntohs(tvb, offset); |
| 3467 | for (x=0; x<session_count; x++) { |
| 3468 | pi = proto_tree_add_item(this_tree, hf_acn_protocol_id, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3469 | proto_item_append_text(pi, " #%d", x+1); |
| 3470 | offset += 4; |
| 3471 | } |
| 3472 | return offset; |
| 3473 | } |
| 3474 | |
| 3475 | |
| 3476 | /******************************************************************************/ |
| 3477 | /* Add labeled expiry */ |
| 3478 | static uint32_t |
| 3479 | acn_add_expiry(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, int hf) |
| 3480 | { |
| 3481 | proto_tree_add_item(tree, hf, tvb, offset, 1, ENC_NA0x00000000); |
| 3482 | offset += 1; |
| 3483 | return offset; |
| 3484 | } |
| 3485 | |
| 3486 | |
| 3487 | /******************************************************************************/ |
| 3488 | /* Adds tree branch for channel parameters */ |
| 3489 | static uint32_t |
| 3490 | acn_add_channel_parameter(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset) |
| 3491 | { |
| 3492 | proto_tree *param_tree; |
| 3493 | |
| 3494 | param_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_acn_channel_parameter, |
| 3495 | NULL((void*)0), "Channel Parameter Block"); |
| 3496 | proto_tree_add_item(param_tree, hf_acn_expiry, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3497 | offset += 1; |
| 3498 | proto_tree_add_item(param_tree, hf_acn_nak_outbound_flag, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3499 | offset += 1; |
| 3500 | proto_tree_add_item(param_tree, hf_acn_nak_holdoff, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3501 | offset += 2; |
| 3502 | proto_tree_add_item(param_tree, hf_acn_nak_modulus, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3503 | offset += 2; |
| 3504 | proto_tree_add_item(param_tree, hf_acn_nak_max_wait, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3505 | offset += 2; |
| 3506 | return offset; /* bytes used */ |
| 3507 | } |
| 3508 | |
| 3509 | |
| 3510 | /******************************************************************************/ |
| 3511 | /* Add an address tree */ |
| 3512 | static uint32_t |
| 3513 | acn_add_address(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, const char *label) |
| 3514 | { |
| 3515 | proto_item *pi; |
| 3516 | proto_tree *addr_tree = NULL((void*)0); |
| 3517 | uint8_t ip_address_type; |
| 3518 | uint32_t port; |
| 3519 | |
| 3520 | /* Get type */ |
| 3521 | ip_address_type = tvb_get_uint8(tvb, offset); |
| 3522 | |
| 3523 | switch (ip_address_type) { |
| 3524 | case ACN_ADDR_NULL0: |
| 3525 | proto_tree_add_item(tree, hf_acn_ip_address_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3526 | offset += 1; |
| 3527 | break; |
| 3528 | case ACN_ADDR_IPV41: |
| 3529 | /* Build tree and add type*/ |
| 3530 | addr_tree = proto_tree_add_subtree(tree, tvb, offset, 7, ett_acn_address, &pi, label); |
| 3531 | proto_tree_add_item(addr_tree, hf_acn_ip_address_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3532 | offset += 1; |
| 3533 | /* Add port */ |
| 3534 | port = tvb_get_ntohs(tvb, offset); |
| 3535 | proto_tree_add_item(addr_tree, hf_acn_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3536 | offset += 2; |
| 3537 | /* Add Address */ |
| 3538 | proto_tree_add_item(addr_tree, hf_acn_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 3539 | /* Append port and address to tree item */ |
| 3540 | proto_item_append_text(pi, " %s, Port %d", tvb_address_to_str(pinfo->pool, tvb, AT_IPv4, offset), port); |
| 3541 | offset += 4; |
| 3542 | break; |
| 3543 | case ACN_ADDR_IPV62: |
| 3544 | /* Build tree and add type*/ |
| 3545 | addr_tree = proto_tree_add_subtree(tree, tvb, offset, 19, ett_acn_address, &pi, label); |
| 3546 | proto_tree_add_item(addr_tree, hf_acn_ip_address_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3547 | offset += 1; |
| 3548 | /* Add port */ |
| 3549 | port = tvb_get_ntohs(tvb, offset); |
| 3550 | proto_tree_add_item(addr_tree, hf_acn_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3551 | offset += 2; |
| 3552 | /* Add Address */ |
| 3553 | proto_tree_add_item(addr_tree, hf_acn_ipv6, tvb, offset, 16, ENC_NA0x00000000); |
| 3554 | /* Append port and address to tree item */ |
| 3555 | proto_item_append_text(pi, " %s, Port %d", tvb_address_to_str(pinfo->pool, tvb, AT_IPv6, offset), port); |
| 3556 | offset += 16; |
| 3557 | break; |
| 3558 | case ACN_ADDR_IPPORT3: |
| 3559 | /* Build tree and add type*/ |
| 3560 | addr_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_acn_address, &pi, label); |
| 3561 | proto_tree_add_item(addr_tree, hf_acn_ip_address_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 3562 | offset += 1; |
| 3563 | /* Add port */ |
| 3564 | port = tvb_get_ntohs(tvb, offset); |
| 3565 | proto_tree_add_item(addr_tree, hf_acn_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 3566 | /* Append port to tree item */ |
| 3567 | proto_item_append_text(pi, " Port %d", port); |
| 3568 | offset += 2; |
| 3569 | break; |
| 3570 | } |
| 3571 | return offset; |
| 3572 | } |
| 3573 | |
| 3574 | /******************************************************************************/ |
| 3575 | /* Adds tree branch for address type */ |
| 3576 | static uint32_t |
| 3577 | acn_add_dmp_address_type(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, acn_dmp_adt_type *adt) |
| 3578 | { |
| 3579 | proto_tree *this_tree; |
| 3580 | uint8_t D; |
| 3581 | const char *name; |
| 3582 | |
| 3583 | /* header contains address and data type */ |
| 3584 | adt->flags = tvb_get_uint8(tvb, offset); |
| 3585 | |
| 3586 | D = ACN_DMP_ADT_EXTRACT_D(adt->flags)(((adt->flags) & 0x30) >> 4); |
| 3587 | name = val_to_str(pinfo->pool, D, acn_dmp_adt_d_vals, "not valid (%d)"); |
| 3588 | this_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1, ett_acn_address_type, |
| 3589 | NULL((void*)0), "Address and Data Type: %s", name); |
| 3590 | |
| 3591 | proto_tree_add_uint(this_tree, hf_acn_dmp_adt_v, tvb, offset, 1, adt->flags); |
| 3592 | proto_tree_add_uint(this_tree, hf_acn_dmp_adt_r, tvb, offset, 1, adt->flags); |
| 3593 | proto_tree_add_uint(this_tree, hf_acn_dmp_adt_d, tvb, offset, 1, adt->flags); |
| 3594 | proto_tree_add_uint(this_tree, hf_acn_dmp_adt_x, tvb, offset, 1, adt->flags); |
| 3595 | proto_tree_add_uint(this_tree, hf_acn_dmp_adt_a, tvb, offset, 1, adt->flags); |
| 3596 | offset += 1; |
| 3597 | |
| 3598 | return offset; /* bytes used */ |
| 3599 | } |
| 3600 | |
| 3601 | /******************************************************************************/ |
| 3602 | /* Add an dmp address */ |
| 3603 | static uint32_t |
| 3604 | acn_add_dmp_address(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, acn_dmp_adt_type *adt) |
| 3605 | { |
| 3606 | int32_t start_offset; |
| 3607 | int32_t bytes_used; |
| 3608 | uint8_t D, A; |
| 3609 | |
| 3610 | start_offset = offset; |
| 3611 | |
| 3612 | D = ACN_DMP_ADT_EXTRACT_D(adt->flags)(((adt->flags) & 0x30) >> 4); |
| 3613 | A = ACN_DMP_ADT_EXTRACT_A(adt->flags)((adt->flags) & 0x03); |
| 3614 | |
| 3615 | switch (D) { |
| 3616 | case ACN_DMP_ADT_D_NS0: /* Non-range address, Single data item */ |
| 3617 | adt->increment = 1; |
| 3618 | adt->count = 1; |
| 3619 | switch (A) { /* address */ |
| 3620 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 3621 | adt->address = tvb_get_uint8(tvb, offset); |
| 3622 | offset += 1; |
| 3623 | bytes_used = 1; |
| 3624 | break; |
| 3625 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 3626 | adt->address = tvb_get_ntohs(tvb, offset); |
| 3627 | offset += 2; |
| 3628 | bytes_used = 2; |
| 3629 | break; |
| 3630 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: one octet address, increment, and count). */ |
| 3631 | adt->address = tvb_get_ntohl(tvb, offset); |
| 3632 | offset += 4; |
| 3633 | bytes_used = 4; |
| 3634 | break; |
| 3635 | default: /* and ACN_DMP_ADT_A_R (Four octet address, (range: four octet address, increment, and count)*/ |
| 3636 | return offset; |
| 3637 | } /* of switch (A) */ |
| 3638 | |
| 3639 | if (adt->flags & ACN_DMP_ADT_FLAG_V0x80) { |
| 3640 | proto_tree_add_uint(tree, hf_acn_dmp_virtual_address, tvb, start_offset, bytes_used, adt->address); |
| 3641 | } else { |
| 3642 | proto_tree_add_uint(tree, hf_acn_dmp_actual_address, tvb, start_offset, bytes_used, adt->address); |
| 3643 | } |
| 3644 | break; |
| 3645 | |
| 3646 | case ACN_DMP_ADT_D_RS1: /* Range address, Single data item */ |
| 3647 | switch (A) { |
| 3648 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 3649 | adt->address = tvb_get_uint8(tvb, offset); |
| 3650 | offset += 1; |
| 3651 | adt->increment = tvb_get_uint8(tvb, offset); |
| 3652 | offset += 1; |
| 3653 | adt->count = tvb_get_uint8(tvb, offset); |
| 3654 | offset += 1; |
| 3655 | bytes_used = 3; |
| 3656 | break; |
| 3657 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 3658 | adt->address = tvb_get_ntohs(tvb, offset); |
| 3659 | offset += 2; |
| 3660 | adt->increment = tvb_get_ntohs(tvb, offset); |
| 3661 | offset += 2; |
| 3662 | adt->count = tvb_get_ntohs(tvb, offset); |
| 3663 | offset += 2; |
| 3664 | bytes_used = 6; |
| 3665 | break; |
| 3666 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */ |
| 3667 | adt->address = tvb_get_ntohl(tvb, offset); |
| 3668 | offset += 4; |
| 3669 | adt->increment = tvb_get_ntohl(tvb, offset); |
| 3670 | offset += 4; |
| 3671 | adt->count = tvb_get_ntohl(tvb, offset); |
| 3672 | offset += 4; |
| 3673 | bytes_used = 12; |
| 3674 | break; |
| 3675 | default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */ |
| 3676 | return offset; |
| 3677 | } /* of switch (A) */ |
| 3678 | |
| 3679 | if (adt->flags & ACN_DMP_ADT_FLAG_V0x80) { |
| 3680 | proto_tree_add_uint_format_value(tree, hf_acn_dmp_virtual_address_first, tvb, start_offset, bytes_used, |
| 3681 | adt->address, "0x%X, inc: %d, count: %d", |
| 3682 | adt->address, adt->increment, adt->count); |
| 3683 | } else { |
| 3684 | proto_tree_add_uint_format_value(tree, hf_acn_dmp_actual_address_first, tvb, start_offset, bytes_used, |
| 3685 | adt->address, "0x%X, inc: %d, count: %d", |
| 3686 | adt->address, adt->increment, adt->count); |
| 3687 | } |
| 3688 | break; |
| 3689 | |
| 3690 | case ACN_DMP_ADT_D_RE2: /* Range address, Array of equal size data items */ |
| 3691 | switch (A) { |
| 3692 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 3693 | adt->address = tvb_get_uint8(tvb, offset); |
| 3694 | offset += 1; |
| 3695 | adt->increment = tvb_get_uint8(tvb, offset); |
| 3696 | offset += 1; |
| 3697 | adt->count = tvb_get_uint8(tvb, offset); |
| 3698 | offset += 1; |
| 3699 | bytes_used = 3; |
| 3700 | break; |
| 3701 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 3702 | adt->address = tvb_get_ntohs(tvb, offset); |
| 3703 | offset += 2; |
| 3704 | adt->increment = tvb_get_ntohs(tvb, offset); |
| 3705 | offset += 2; |
| 3706 | adt->count = tvb_get_ntohs(tvb, offset); |
| 3707 | offset += 2; |
| 3708 | bytes_used = 6; |
| 3709 | break; |
| 3710 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */ |
| 3711 | adt->address = tvb_get_ntohl(tvb, offset); |
| 3712 | offset += 4; |
| 3713 | adt->increment = tvb_get_ntohl(tvb, offset); |
| 3714 | offset += 4; |
| 3715 | adt->count = tvb_get_ntohl(tvb, offset); |
| 3716 | offset += 4; |
| 3717 | bytes_used = 12; |
| 3718 | break; |
| 3719 | default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */ |
| 3720 | return offset; |
| 3721 | } /* of switch (A) */ |
| 3722 | |
| 3723 | if (adt->flags & ACN_DMP_ADT_FLAG_V0x80) { |
| 3724 | proto_tree_add_uint_format_value(tree, hf_acn_dmp_virtual_address_first, tvb, start_offset, bytes_used, |
| 3725 | adt->address, "0x%X, inc: %d, count: %d", |
| 3726 | adt->address, adt->increment, adt->count); |
| 3727 | } else { |
| 3728 | proto_tree_add_uint_format_value(tree, hf_acn_dmp_actual_address_first, tvb, start_offset, bytes_used, |
| 3729 | adt->address, "0x%X, inc: %d, count: %d", |
| 3730 | adt->address, adt->increment, adt->count); |
| 3731 | } |
| 3732 | break; |
| 3733 | |
| 3734 | case ACN_DMP_ADT_D_RM3: /* Range address, Series of mixed size data items */ |
| 3735 | switch (A) { |
| 3736 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 3737 | adt->address = tvb_get_uint8(tvb, offset); |
| 3738 | offset += 1; |
| 3739 | adt->increment = tvb_get_uint8(tvb, offset); |
| 3740 | offset += 1; |
| 3741 | adt->count = tvb_get_uint8(tvb, offset); |
| 3742 | offset += 1; |
| 3743 | bytes_used = 3; |
| 3744 | break; |
| 3745 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 3746 | adt->address = tvb_get_ntohs(tvb, offset); |
| 3747 | offset += 2; |
| 3748 | adt->increment = tvb_get_ntohs(tvb, offset); |
| 3749 | offset += 2; |
| 3750 | adt->count = tvb_get_ntohs(tvb, offset); |
| 3751 | offset += 2; |
| 3752 | bytes_used = 6; |
| 3753 | break; |
| 3754 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */ |
| 3755 | adt->address = tvb_get_ntohl(tvb, offset); |
| 3756 | offset += 4; |
| 3757 | adt->increment = tvb_get_ntohl(tvb, offset); |
| 3758 | offset += 4; |
| 3759 | adt->count = tvb_get_ntohl(tvb, offset); |
| 3760 | offset += 4; |
| 3761 | bytes_used = 12; |
| 3762 | break; |
| 3763 | default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */ |
| 3764 | return offset; |
| 3765 | } /* of switch (A) */ |
| 3766 | |
| 3767 | if (adt->flags & ACN_DMP_ADT_FLAG_V0x80) { |
| 3768 | proto_tree_add_uint_format_value(tree, hf_acn_dmp_virtual_address_first, tvb, start_offset, bytes_used, |
| 3769 | adt->address, "0x%X, inc: %d, count: %d", |
| 3770 | adt->address, adt->increment, adt->count); |
| 3771 | } else { |
| 3772 | proto_tree_add_uint_format_value(tree, hf_acn_dmp_actual_address_first, tvb, start_offset, bytes_used, |
| 3773 | adt->address, "0x%X, inc: %d, count: %d", |
| 3774 | adt->address, adt->increment, adt->count); |
| 3775 | } |
| 3776 | break; |
| 3777 | } /* of switch (D) */ |
| 3778 | |
| 3779 | return offset; |
| 3780 | } |
| 3781 | |
| 3782 | |
| 3783 | /*******************************************************************************/ |
| 3784 | /* Display DMP Data */ |
| 3785 | static uint32_t |
| 3786 | acn_add_dmp_data(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, acn_dmp_adt_type *adt) |
| 3787 | { |
| 3788 | uint8_t D, A; |
| 3789 | uint32_t data_size; |
| 3790 | uint32_t data_value; |
| 3791 | uint32_t data_address; |
| 3792 | uint32_t x,y; |
| 3793 | char *buffer; |
| 3794 | wmem_strbuf_t *default_buffer; |
| 3795 | proto_item *ti; |
| 3796 | uint32_t ok_to_process = false0; |
| 3797 | |
| 3798 | /* We would like to rip through Property Address-Data pairs */ |
| 3799 | /* but since we don't now how many there are nor how big the data size is, */ |
| 3800 | /* it not possible. So, we just show the whole thing as a block of date! */ |
| 3801 | /* */ |
| 3802 | /* There are a few exceptions however */ |
| 3803 | /* 1) if the address type is ACN_DMP_ADT_D_NS or ACN_DMP_ADT_D_RS and */ |
| 3804 | /* or ACN_DMP_ADT_D_RE */ |
| 3805 | /* then number of bytes is <= count + 4. Each value is at least one byte */ |
| 3806 | /* and another address/data pair is at least 4 bytes so if the remaining */ |
| 3807 | /* bytes is less than the count plus 4 then the remaining data */ |
| 3808 | /* must be all data */ |
| 3809 | /* */ |
| 3810 | /* 2) if the address type is ACN_DMP_ADT_D_RE and the number of bytes */ |
| 3811 | /* equals the number of bytes in remaining in the pdu then there is */ |
| 3812 | /* a 1 to one match */ |
| 3813 | |
| 3814 | D = ACN_DMP_ADT_EXTRACT_D(adt->flags)(((adt->flags) & 0x30) >> 4); |
| 3815 | switch (D) { |
| 3816 | case ACN_DMP_ADT_D_NS0: |
| 3817 | case ACN_DMP_ADT_D_RS1: |
| 3818 | if (adt->data_length <= adt->count + 4) { |
| 3819 | ok_to_process = true1; |
| 3820 | } |
| 3821 | break; |
| 3822 | case ACN_DMP_ADT_D_RE2: |
| 3823 | if (adt->count == 0) { |
| 3824 | break; |
| 3825 | } |
| 3826 | if (adt->data_length <= adt->count + 4) { |
| 3827 | ok_to_process = true1; |
| 3828 | } |
| 3829 | break; |
| 3830 | } |
| 3831 | |
| 3832 | if (!ok_to_process) { |
| 3833 | data_size = adt->data_length; |
| 3834 | ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000); |
| 3835 | offset += data_size; |
| 3836 | proto_item_set_text(ti, "Data and more Address-Data Pairs (further dissection not possible)"); |
| 3837 | return offset; |
| 3838 | } |
| 3839 | |
| 3840 | A = ACN_DMP_ADT_EXTRACT_A(adt->flags)((adt->flags) & 0x03); |
| 3841 | |
| 3842 | switch (D) { |
| 3843 | case ACN_DMP_ADT_D_NS0: /* Non-range address, Single data item */ |
| 3844 | /* calculate data size */ |
| 3845 | data_size = adt->data_length; |
| 3846 | data_address = adt->address; |
| 3847 | |
| 3848 | switch (A) { |
| 3849 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 3850 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address); |
| 3851 | break; |
| 3852 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 3853 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address); |
| 3854 | break; |
| 3855 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */ |
| 3856 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address); |
| 3857 | break; |
| 3858 | default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */ |
| 3859 | offset += data_size; |
| 3860 | return offset; |
| 3861 | } |
| 3862 | |
| 3863 | switch (data_size) { |
| 3864 | case 1: |
| 3865 | data_value = tvb_get_uint8(tvb, offset); |
| 3866 | proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %2.2X", buffer, data_value); |
| 3867 | break; |
| 3868 | case 2: |
| 3869 | data_value = tvb_get_ntohs(tvb, offset); |
| 3870 | proto_tree_add_uint_format(tree, hf_acn_data16, tvb, offset, 2, data_value, "%s %4.4X", buffer, data_value); |
| 3871 | break; |
| 3872 | case 3: |
| 3873 | data_value = tvb_get_ntoh24(tvb, offset); |
| 3874 | proto_tree_add_uint_format(tree, hf_acn_data24, tvb, offset, 3, data_value, "%s %6.6X", buffer, data_value); |
| 3875 | break; |
| 3876 | case 4: |
| 3877 | data_value = tvb_get_ntohl(tvb, offset); |
| 3878 | proto_tree_add_uint_format(tree, hf_acn_data32, tvb, offset, 4, data_value, "%s %8.8X", buffer, data_value); |
| 3879 | break; |
| 3880 | default: |
| 3881 | default_buffer = wmem_strbuf_new(pinfo->pool, ""); |
| 3882 | /* build string of values */ |
| 3883 | for (y=0; y<20 && y<data_size; y++) { |
| 3884 | data_value = tvb_get_uint8(tvb, offset+y); |
| 3885 | wmem_strbuf_append_printf(default_buffer, " %2.2X", data_value); |
| 3886 | } |
| 3887 | /* add the item */ |
| 3888 | ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000); |
| 3889 | offset += data_size; |
| 3890 | /* change the text */ |
| 3891 | proto_item_set_text(ti, "%s", wmem_strbuf_get_str(default_buffer)); |
| 3892 | break; |
| 3893 | } /* of switch (data_size) */ |
| 3894 | offset += data_size; |
| 3895 | break; |
| 3896 | |
| 3897 | case ACN_DMP_ADT_D_RS1: /* Range address, Single data item */ |
| 3898 | /* calculate data size */ |
| 3899 | data_size = adt->data_length; |
| 3900 | data_address = adt->address; |
| 3901 | |
| 3902 | for (x=0; x<adt->count; x++) { |
| 3903 | switch (A) { |
| 3904 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 3905 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address); |
| 3906 | break; |
| 3907 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 3908 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address); |
| 3909 | break; |
| 3910 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */ |
| 3911 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address); |
| 3912 | break; |
| 3913 | default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */ |
| 3914 | return offset; |
| 3915 | } |
| 3916 | |
| 3917 | switch (data_size) { |
| 3918 | case 1: |
| 3919 | data_value = tvb_get_uint8(tvb, offset); |
| 3920 | proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %2.2X", buffer, data_value); |
| 3921 | break; |
| 3922 | case 2: |
| 3923 | data_value = tvb_get_ntohs(tvb, offset); |
| 3924 | proto_tree_add_uint_format(tree, hf_acn_data16, tvb, offset, 2, data_value, "%s %4.4X", buffer, data_value); |
| 3925 | break; |
| 3926 | case 3: |
| 3927 | data_value = tvb_get_ntoh24(tvb, offset); |
| 3928 | proto_tree_add_uint_format(tree, hf_acn_data24, tvb, offset, 3, data_value, "%s %6.6X", buffer, data_value); |
| 3929 | break; |
| 3930 | case 4: |
| 3931 | data_value = tvb_get_ntohl(tvb, offset); |
| 3932 | proto_tree_add_uint_format(tree, hf_acn_data32, tvb, offset, 4, data_value, "%s %8.8X", buffer, data_value); |
| 3933 | break; |
| 3934 | default: |
| 3935 | /* build string of values */ |
| 3936 | default_buffer = wmem_strbuf_new(pinfo->pool, ""); |
| 3937 | for (y=0; y<20 && y<data_size; y++) { |
| 3938 | data_value = tvb_get_uint8(tvb, offset+y); |
| 3939 | wmem_strbuf_append_printf(default_buffer, " %2.2X", data_value); |
| 3940 | } |
| 3941 | /* add the item */ |
| 3942 | ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000); |
| 3943 | /* change the text */ |
| 3944 | proto_item_set_text(ti, "%s", wmem_strbuf_get_str(default_buffer)); |
| 3945 | break; |
| 3946 | } /* of switch (data_size) */ |
| 3947 | data_address += adt->increment; |
| 3948 | } /* of (x=0;x<adt->count;x++) */ |
| 3949 | offset += data_size; |
| 3950 | break; |
| 3951 | |
| 3952 | case ACN_DMP_ADT_D_RE2: /* Range address, Array of equal size data items */ |
| 3953 | /* calculate data size */ |
| 3954 | data_size = adt->data_length / adt->count; |
| 3955 | data_address = adt->address; |
| 3956 | |
| 3957 | for (x=0; x<adt->count; x++) { |
| 3958 | switch (A) { |
| 3959 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 3960 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address); |
| 3961 | break; |
| 3962 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 3963 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address); |
| 3964 | break; |
| 3965 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */ |
| 3966 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address); |
| 3967 | break; |
| 3968 | default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */ |
| 3969 | return offset; |
| 3970 | } |
| 3971 | |
| 3972 | switch (data_size) { |
| 3973 | case 1: |
| 3974 | data_value = tvb_get_uint8(tvb, offset); |
| 3975 | proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %2.2X", buffer, data_value); |
| 3976 | break; |
| 3977 | case 2: |
| 3978 | data_value = tvb_get_ntohs(tvb, offset); |
| 3979 | proto_tree_add_uint_format(tree, hf_acn_data16, tvb, offset, 2, data_value, "%s %4.4X", buffer, data_value); |
| 3980 | break; |
| 3981 | case 3: |
| 3982 | data_value = tvb_get_ntoh24(tvb, offset); |
| 3983 | proto_tree_add_uint_format(tree, hf_acn_data24, tvb, offset, 3, data_value, "%s %6.6X", buffer, data_value); |
| 3984 | break; |
| 3985 | case 4: |
| 3986 | data_value = tvb_get_ntohl(tvb, offset); |
| 3987 | proto_tree_add_uint_format(tree, hf_acn_data32, tvb, offset, 4, data_value, "%s %8.8X", buffer, data_value); |
| 3988 | break; |
| 3989 | default: |
| 3990 | /* build string of values */ |
| 3991 | default_buffer = wmem_strbuf_new(pinfo->pool, ""); |
| 3992 | for (y=0; y<20 && y<data_size; y++) { |
| 3993 | data_value = tvb_get_uint8(tvb, offset+y); |
| 3994 | wmem_strbuf_append_printf(default_buffer, " %2.2X", data_value); |
| 3995 | } |
| 3996 | /* add the item */ |
| 3997 | ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000); |
| 3998 | /* change the text */ |
| 3999 | proto_item_set_text(ti, "%s", wmem_strbuf_get_str(default_buffer)); |
| 4000 | break; |
| 4001 | } /* of switch (data_size) */ |
| 4002 | |
| 4003 | offset += data_size; |
| 4004 | data_address += adt->increment; |
| 4005 | } /* of (x=0;x<adt->count;x++) */ |
| 4006 | break; |
| 4007 | |
| 4008 | case ACN_DMP_ADT_D_RM3: /* Range address, Series of mixed size data items */ |
| 4009 | data_size = adt->data_length; |
| 4010 | ti = proto_tree_add_item(tree, hf_acn_data, tvb, offset, data_size, ENC_NA0x00000000); |
| 4011 | offset += data_size; |
| 4012 | /* change the text */ |
| 4013 | proto_item_set_text(ti, "Mixed size data items"); |
| 4014 | break; |
| 4015 | } /* of switch (D) */ |
| 4016 | return offset; |
| 4017 | } |
| 4018 | |
| 4019 | /*******************************************************************************/ |
| 4020 | /* Display DMP Reason codes */ |
| 4021 | static uint32_t |
| 4022 | acn_add_dmp_reason_codes(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, int offset, acn_dmp_adt_type *adt) |
| 4023 | { |
| 4024 | uint8_t D, A; |
| 4025 | uint32_t data_value; |
| 4026 | uint32_t data_address; |
| 4027 | uint32_t x; |
| 4028 | |
| 4029 | char *buffer; |
| 4030 | const char *name; |
| 4031 | |
| 4032 | D = ACN_DMP_ADT_EXTRACT_D(adt->flags)(((adt->flags) & 0x30) >> 4); |
| 4033 | A = ACN_DMP_ADT_EXTRACT_A(adt->flags)((adt->flags) & 0x03); |
| 4034 | switch (D) { |
| 4035 | case ACN_DMP_ADT_D_NS0: /* Non-range address, Single data item */ |
| 4036 | data_address = adt->address; |
| 4037 | switch (A) { |
| 4038 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 4039 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address); |
| 4040 | break; |
| 4041 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 4042 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address); |
| 4043 | break; |
| 4044 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */ |
| 4045 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address); |
| 4046 | break; |
| 4047 | default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */ |
| 4048 | return offset; |
| 4049 | } |
| 4050 | |
| 4051 | /* Get reason */ |
| 4052 | data_value = tvb_get_uint8(tvb, offset); |
| 4053 | name = val_to_str(pinfo->pool, data_value, acn_dmp_reason_code_vals, "reason not valid (%d)"); |
| 4054 | proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %s", buffer, name); |
| 4055 | offset += 1; |
| 4056 | break; |
| 4057 | |
| 4058 | case ACN_DMP_ADT_D_RS1: /* Range address, Single data item */ |
| 4059 | data_address = adt->address; |
| 4060 | for (x=0; x<adt->count; x++) { |
| 4061 | switch (A) { |
| 4062 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 4063 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address); |
| 4064 | break; |
| 4065 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 4066 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address); |
| 4067 | break; |
| 4068 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */ |
| 4069 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address); |
| 4070 | break; |
| 4071 | default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */ |
| 4072 | return offset; |
| 4073 | } |
| 4074 | |
| 4075 | /* Get reason */ |
| 4076 | data_value = tvb_get_uint8(tvb, offset); |
| 4077 | name = val_to_str(pinfo->pool, data_value, acn_dmp_reason_code_vals, "reason not valid (%d)"); |
| 4078 | proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %s", buffer, name); |
| 4079 | |
| 4080 | data_address += adt->increment; |
| 4081 | } /* of (x=0;x<adt->count;x++) */ |
| 4082 | offset += 1; |
| 4083 | break; |
| 4084 | |
| 4085 | case ACN_DMP_ADT_D_RE2: /* Range address, Array of equal size data items */ |
| 4086 | case ACN_DMP_ADT_D_RM3: /* Range address, Series of mixed size data items */ |
| 4087 | data_address = adt->address; |
| 4088 | for (x=0; x<adt->count; x++) { |
| 4089 | switch (A) { |
| 4090 | case ACN_DMP_ADT_A_10: /* One octet address, (range: one octet address, increment, and count). */ |
| 4091 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%2.2X ->", data_address); |
| 4092 | break; |
| 4093 | case ACN_DMP_ADT_A_21: /* Two octet address, (range: two octet address, increment, and count). */ |
| 4094 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%4.4X ->", data_address); |
| 4095 | break; |
| 4096 | case ACN_DMP_ADT_A_42: /* Four octet address, (range: four octet address, increment, and count). */ |
| 4097 | buffer = wmem_strdup_printf(pinfo->pool, "Addr 0x%8.8X ->", data_address); |
| 4098 | break; |
| 4099 | default: /* and ACN_DMP_ADT_A_R, this reserved....so it has no meaning yet */ |
| 4100 | return offset; |
| 4101 | } |
| 4102 | /* Get reason */ |
| 4103 | data_value = tvb_get_uint8(tvb, offset); |
| 4104 | name = val_to_str(pinfo->pool, data_value, acn_dmp_reason_code_vals, "reason not valid (%d)"); |
| 4105 | proto_tree_add_uint_format(tree, hf_acn_data8, tvb, offset, 1, data_value, "%s %s", buffer, name); |
| 4106 | data_address += adt->increment; |
| 4107 | offset += 1; |
| 4108 | } /* of (x=0;x<adt->count;x++) */ |
| 4109 | break; |
| 4110 | } /* of switch (D) */ |
| 4111 | return offset; |
| 4112 | } |
| 4113 | |
| 4114 | /******************************************************************************/ |
| 4115 | /* Get Field Type Parameters */ |
| 4116 | static void |
| 4117 | get_field_type_parameters(tvbuff_t *tvb, int blob_offset, uint8_t field_type, uint8_t *field_length, uint8_t *blob_offset1, uint8_t *blob_offset2, uint8_t *blob_offset3) |
| 4118 | { |
| 4119 | /* Switch Over Field Type to Determine Data */ |
| 4120 | switch (field_type) { |
| 4121 | case ACN_BLOB_FIELD_TYPE11: |
| 4122 | case ACN_BLOB_FIELD_TYPE55: |
| 4123 | /* Set field length and blob_offsets to use */ |
| 4124 | *field_length = 1; |
| 4125 | *blob_offset1 = 0; |
| 4126 | *blob_offset2 = 1; |
| 4127 | *blob_offset3 = *field_length; |
| 4128 | break; |
| 4129 | case ACN_BLOB_FIELD_TYPE22: |
| 4130 | case ACN_BLOB_FIELD_TYPE66: |
| 4131 | /* Set field length and blob_offsets to use */ |
| 4132 | *field_length = 2; |
| 4133 | *blob_offset1 = 0; |
| 4134 | *blob_offset2 = 1; |
| 4135 | *blob_offset3 = *field_length; |
| 4136 | break; |
| 4137 | case ACN_BLOB_FIELD_TYPE33: |
| 4138 | case ACN_BLOB_FIELD_TYPE77: |
| 4139 | /* Set field length and blob_offsets to use */ |
| 4140 | *field_length = 4; |
| 4141 | *blob_offset1 = 0; |
| 4142 | *blob_offset2 = 1; |
| 4143 | *blob_offset3 = *field_length; |
| 4144 | break; |
| 4145 | case ACN_BLOB_FIELD_TYPE44: |
| 4146 | case ACN_BLOB_FIELD_TYPE88: |
| 4147 | /* Set field length and blob_offsets to use */ |
| 4148 | *field_length = 8; |
| 4149 | *blob_offset1 = 0; |
| 4150 | *blob_offset2 = 1; |
| 4151 | *blob_offset3 = *field_length; |
| 4152 | break; |
| 4153 | case ACN_BLOB_FIELD_TYPE99: |
| 4154 | /* float */ |
| 4155 | /* Set field length and blob_offsets to use */ |
| 4156 | *field_length = 4; |
| 4157 | *blob_offset1 = 0; |
| 4158 | *blob_offset2 = 1; |
| 4159 | *blob_offset3 = *field_length; |
| 4160 | break; |
| 4161 | case ACN_BLOB_FIELD_TYPE1010: |
| 4162 | /* double */ |
| 4163 | /* Set field length and blob_offsets to use */ |
| 4164 | *field_length = 8; |
| 4165 | *blob_offset1 = 0; |
| 4166 | *blob_offset2 = 1; |
| 4167 | *blob_offset3 = *field_length; |
| 4168 | break; |
| 4169 | case ACN_BLOB_FIELD_TYPE1111: |
| 4170 | /* Set field length and blob_offsets to use */ |
| 4171 | *field_length = tvb_get_uint8(tvb, blob_offset + 2); |
| 4172 | *blob_offset1 = 2; |
| 4173 | *blob_offset2 = 1; |
| 4174 | *blob_offset3 = (*field_length) - 2; |
| 4175 | break; |
| 4176 | case ACN_BLOB_FIELD_TYPE1212: |
| 4177 | /* Set field length and blob_offsets to use for ignores */ |
| 4178 | *field_length = 0; |
| 4179 | *blob_offset1 = 0; |
| 4180 | *blob_offset2 = 0; |
| 4181 | *blob_offset3 = 1; |
| 4182 | break; |
| 4183 | default: |
| 4184 | /* Set field length and blob_offsets to use for unknowns */ |
| 4185 | *field_length = 0; |
| 4186 | *blob_offset1 = 0; |
| 4187 | *blob_offset2 = 0; |
| 4188 | *blob_offset3 = 1; |
| 4189 | } |
| 4190 | } |
| 4191 | |
| 4192 | /******************************************************************************/ |
| 4193 | /* Get Field Name */ |
| 4194 | static const char * |
| 4195 | get_field_name(wmem_allocator_t* scope, uint8_t blob_type, uint16_t field_number) |
| 4196 | { |
| 4197 | uint16_t temp_field_number; |
| 4198 | const char *field_name; |
| 4199 | |
| 4200 | /*Find the field sub tree name depending on the blob type.*/ |
| 4201 | switch (blob_type) { |
| 4202 | case ACN_BLOB_IPV41: |
| 4203 | case ACN_BLOB_IPV62: |
| 4204 | field_name = val_to_str(scope, field_number, acn_blob_ip_field_name, "not valid (%d)"); |
| 4205 | break; |
| 4206 | case ACN_BLOB_ERROR13: |
| 4207 | field_name = val_to_str(scope, field_number, acn_blob_error1_field_name, "not valid (%d)"); |
| 4208 | break; |
| 4209 | case ACN_BLOB_ERROR24: |
| 4210 | field_name = val_to_str(scope, field_number, acn_blob_error2_field_name, "not valid (%d)"); |
| 4211 | break; |
| 4212 | case ACN_BLOB_METADATA5: |
| 4213 | field_name = val_to_str(scope, field_number, acn_blob_metadata_field_name, "not valid (%d)"); |
| 4214 | break; |
| 4215 | case ACN_BLOB_METADATA_DEVICES6: |
| 4216 | field_name = val_to_str(scope, field_number, acn_blob_metadata_devices_field_name, "not valid (%d)"); |
| 4217 | break; |
| 4218 | case ACN_BLOB_METADATA_TYPES7: |
| 4219 | field_name = val_to_str(scope, field_number, acn_blob_metadata_types_field_name, "not valid (%d)"); |
| 4220 | break; |
| 4221 | case ACN_BLOB_TIME18: |
| 4222 | field_name = val_to_str(scope, field_number, acn_blob_time1_field_name, "not valid (%d)"); |
| 4223 | break; |
| 4224 | case ACN_BLOB_DIMMER_PROPERTIES9: |
| 4225 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_properties1_field_name_ext, "not valid (%d)"); |
| 4226 | break; |
| 4227 | case ACN_BLOB_DIMMER_LOAD_PROPERTIES10: |
| 4228 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_load_properties1_field_name_ext, "not valid (%d)"); |
| 4229 | break; |
| 4230 | case ACN_BLOB_DIMMING_RACK_PROPERTIES11: |
| 4231 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_rack_properties1_field_name_ext, "not valid (%d)"); |
| 4232 | break; |
| 4233 | case ACN_BLOB_DIMMING_RACK_STATUS_PROPERTIES12: |
| 4234 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_rack_status_properties1_field_name_ext, "not valid (%d)"); |
| 4235 | break; |
| 4236 | case ACN_BLOB_DIMMER_STATUS_PROPERTIES13: |
| 4237 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_status_properties1_field_name_ext, "not valid (%d)"); |
| 4238 | break; |
| 4239 | case ACN_BLOB_SET_LEVELS_OPERATION14: |
| 4240 | field_name = val_to_str(scope, field_number, acn_blob_set_levels_operation_field_name, "not valid (%d)"); |
| 4241 | break; |
| 4242 | case ACN_BLOB_PRESET_OPERATION15: |
| 4243 | field_name = val_to_str(scope, field_number, acn_blob_preset_operation_field_name, "not valid (%d)"); |
| 4244 | break; |
| 4245 | case ACN_BLOB_ADVANCED_FEATURES_OPERATION16: |
| 4246 | field_name = val_to_str(scope, field_number, acn_blob_advanced_features_operation_field_name, "not valid (%d)"); |
| 4247 | break; |
| 4248 | case ACN_BLOB_DIRECT_CONTROL_OPERATION17: |
| 4249 | field_name = val_to_str(scope, field_number, acn_blob_direct_control_operation_field_name, "not valid (%d)"); |
| 4250 | break; |
| 4251 | case ACN_BLOB_GENERATE_CONFIG_OPERATION18: |
| 4252 | field_name = val_to_str(scope, field_number, acn_blob_generate_config_operation_field_name, "not valid (%d)"); |
| 4253 | break; |
| 4254 | case ACN_BLOB_ERROR319: |
| 4255 | field_name = val_to_str(scope, field_number, acn_blob_error3_field_name, "not valid (%d)"); |
| 4256 | break; |
| 4257 | case ACN_BLOB_DIMMER_PROPERTIES220: |
| 4258 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_properties2_field_name_ext, "not valid (%d)"); |
| 4259 | break; |
| 4260 | case ACN_BLOB_DIMMER_LOAD_PROPERTIES221: |
| 4261 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_load_properties2_field_name_ext, "not valid (%d)"); |
| 4262 | break; |
| 4263 | case ACN_BLOB_DIMMER_RACK_PROPERTIES222: |
| 4264 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_rack_properties2_field_name_ext, "not valid (%d)"); |
| 4265 | break; |
| 4266 | case ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223: |
| 4267 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_rack_status_properties2_field_name_ext, "not valid (%d)"); |
| 4268 | break; |
| 4269 | case ACN_BLOB_DIMMER_STATUS_PROPERTIES224: |
| 4270 | field_name = val_to_str_ext(scope, field_number, &acn_blob_dimmer_status_properties2_field_name_ext, "not valid (%d)"); |
| 4271 | break; |
| 4272 | case ACN_BLOB_TIME225: |
| 4273 | field_name = val_to_str(scope, field_number, acn_blob_time2_field_name, "not valid (%d)"); |
| 4274 | break; |
| 4275 | case ACN_BLOB_RPC26: |
| 4276 | { |
| 4277 | temp_field_number = field_number; |
| 4278 | /* field names 4 repeats: 1, 2, 3, 4, 4, 4, ... */ |
| 4279 | if (temp_field_number > 3) |
| 4280 | temp_field_number = 4; |
| 4281 | field_name = val_to_str(scope, temp_field_number, acn_blob_rpc_field_name, "not valid (%d)"); |
| 4282 | } |
| 4283 | break; |
| 4284 | case ACN_BLOB_DHCP_CONFIG_SUBNET27: |
| 4285 | field_name = val_to_str(scope, field_number, acn_blob_dhcp_config_subnet_field_name, "not valid (%d)"); |
| 4286 | break; |
| 4287 | case ACN_BLOB_DHCP_CONFIG_STATIC_ROUTE28: |
| 4288 | field_name = val_to_str(scope, field_number, acn_blob_dhcp_config_static_route_field_name, "not valid (%d)"); |
| 4289 | break; |
| 4290 | case ACN_BLOB_ENERGY_MANAGEMENT29: |
| 4291 | { |
| 4292 | temp_field_number = field_number; |
| 4293 | /* field names 4 through 7 repeat: 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, ... */ |
| 4294 | if (temp_field_number > 3) |
| 4295 | temp_field_number = (field_number % 4) + 4; |
| 4296 | field_name = val_to_str(scope, temp_field_number, acn_blob_energy_management_field_name, "not valid (%d)"); |
| 4297 | } |
| 4298 | break; |
| 4299 | case ACN_BLOB_PRESET_PROPERTIES250: |
| 4300 | field_name = val_to_str_ext(scope, field_number, &acn_blob_preset_properties_field_name_ext, "not valid (%d)"); |
| 4301 | break; |
| 4302 | case ACN_BLOB_TIME330: |
| 4303 | field_name = val_to_str(scope, field_number, acn_blob_time3_field_name, "not valid (%d)"); |
| 4304 | break; |
| 4305 | case ACN_BLOB_ENERGY_COST31: |
| 4306 | field_name = val_to_str(scope, field_number, acn_blob_energy_cost_field_name, "not valid (%d)"); |
| 4307 | break; |
| 4308 | case ACN_BLOB_SEQUENCE_OPERATIONS32: |
| 4309 | field_name = val_to_str(scope, field_number, acn_blob_sequence_operation_field_name, "not valid (%d)"); |
| 4310 | break; |
| 4311 | case ACN_BLOB_SEQUENCE_STEP_PROPERTIES33: |
| 4312 | field_name = val_to_str_ext(scope, field_number, &acn_blob_sequence_step_properties_field_name_ext, "not valid (%d)"); |
| 4313 | break; |
| 4314 | default: |
| 4315 | field_name = "Unknown field"; |
| 4316 | break; |
| 4317 | } |
| 4318 | |
| 4319 | return field_name; |
| 4320 | } |
| 4321 | |
| 4322 | /******************************************************************************/ |
| 4323 | /* Display Blob Field Value */ |
| 4324 | static void |
| 4325 | display_blob_field_value(tvbuff_t *tvb, packet_info* pinfo, proto_tree *field_tree, uint16_t field_number, uint8_t blob_type, uint8_t field_type, uint8_t field_length, int blob_offset, uint8_t blob_offset3, int display_variblob_as_CID) |
| 4326 | { |
| 4327 | int8_t field_value8; |
| 4328 | int32_t field_value32; |
| 4329 | const char *field_string; |
| 4330 | proto_item *ti; |
| 4331 | |
| 4332 | /* Add field value to field sub tree */ |
| 4333 | if (field_type == ACN_BLOB_FIELD_TYPE1212) { |
| 4334 | /* "ignore" always takes priority */ |
| 4335 | proto_tree_add_string(field_tree, hf_acn_blob_field_value_string, tvb, blob_offset, field_length, "Ignore"); |
| 4336 | } |
| 4337 | else if (blob_type == ACN_BLOB_IPV41) { |
| 4338 | proto_tree_add_item(field_tree, hf_acn_blob_field_value_ipv4, tvb, blob_offset, field_length-2, ENC_BIG_ENDIAN0x00000000); |
| 4339 | } |
| 4340 | else if (blob_type == ACN_BLOB_IPV62) { |
| 4341 | proto_tree_add_item(field_tree, hf_acn_blob_field_value_ipv6, tvb, blob_offset, field_length-2, ENC_NA0x00000000); |
| 4342 | } |
| 4343 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 2)) { |
| 4344 | /* time zone index */ |
| 4345 | field_value32 = (int32_t)(tvb_get_ntohl(tvb, blob_offset)); |
| 4346 | if (field_value32 == -1) { |
| 4347 | field_string = "Field Value: Custom"; |
| 4348 | } |
| 4349 | else { |
| 4350 | field_string = val_to_str(pinfo->pool, field_value32, acn_blob_time3_time_zone_vals, "not valid (%d)"); |
| 4351 | } |
| 4352 | proto_tree_add_int_format(field_tree, hf_acn_blob_time_zone, tvb, blob_offset, 4, field_value32, "%s", field_string); |
| 4353 | } |
| 4354 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 10)) { |
| 4355 | /* DST type */ |
| 4356 | field_value8 = tvb_get_uint8(tvb, blob_offset); |
| 4357 | field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_dst_vals, "not valid (%d)"); |
| 4358 | proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string); |
| 4359 | } |
| 4360 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 11)) { |
| 4361 | /* DST on month */ |
| 4362 | field_value8 = tvb_get_uint8(tvb, blob_offset); |
| 4363 | field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_month_vals, "not valid (%d)"); |
| 4364 | proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string); |
| 4365 | } |
| 4366 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 12)) { |
| 4367 | /* DST on week */ |
| 4368 | field_value8 = tvb_get_uint8(tvb, blob_offset); |
| 4369 | field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_week_vals, "not valid (%d)"); |
| 4370 | proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string); |
| 4371 | } |
| 4372 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 13)) { |
| 4373 | /* DST start day */ |
| 4374 | field_value8 = tvb_get_uint8(tvb, blob_offset); |
| 4375 | field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_day_vals, "not valid (%d)"); |
| 4376 | proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_start_day, tvb, blob_offset, 1, field_value8, "%s", field_string); |
| 4377 | } |
| 4378 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 16)) { |
| 4379 | /* DST start locality */ |
| 4380 | field_value8 = tvb_get_uint8(tvb, blob_offset); |
| 4381 | field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_locality_vals, "not valid (%d)"); |
| 4382 | proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_start_locality, tvb, blob_offset, 1, field_value8, "%s", field_string); |
| 4383 | } |
| 4384 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 17)) { |
| 4385 | /* DST off month */ |
| 4386 | field_value8 = tvb_get_uint8(tvb, blob_offset); |
| 4387 | field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_month_vals, "not valid (%d)"); |
| 4388 | proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string); |
| 4389 | } |
| 4390 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 18)) { |
| 4391 | /* DST off week */ |
| 4392 | field_value8 = tvb_get_uint8(tvb, blob_offset); |
| 4393 | field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_week_vals, "not valid (%d)"); |
| 4394 | proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_type, tvb, blob_offset, 1, field_value8, "%s", field_string); |
| 4395 | } |
| 4396 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 19)) { |
| 4397 | /* DST stop day */ |
| 4398 | field_value8 = tvb_get_uint8(tvb, blob_offset); |
| 4399 | field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_day_vals, "not valid (%d)"); |
| 4400 | proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_stop_day, tvb, blob_offset, 1, field_value8, "%s", field_string); |
| 4401 | } |
| 4402 | else if ((blob_type == ACN_BLOB_TIME330) && (field_number == 22)) { |
| 4403 | /* DST stop locality */ |
| 4404 | field_value8 = tvb_get_uint8(tvb, blob_offset); |
| 4405 | field_string = val_to_str(pinfo->pool, field_value8, acn_blob_time3_locality_vals, "not valid (%d)"); |
| 4406 | proto_tree_add_uint_format(field_tree, hf_acn_blob_dst_stop_locality, tvb, blob_offset, 1, field_value8, "%s", field_string); |
| 4407 | } |
| 4408 | else { |
| 4409 | switch (field_type) { |
| 4410 | case ACN_BLOB_FIELD_TYPE11: |
| 4411 | /* Need special code to display signed data */ |
| 4412 | ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, blob_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 4413 | proto_item_set_len(ti, blob_offset3); |
| 4414 | break; |
| 4415 | case ACN_BLOB_FIELD_TYPE22: |
| 4416 | /* Need special code to display signed data */ |
| 4417 | ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, blob_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 4418 | proto_item_set_len(ti, blob_offset3); |
| 4419 | break; |
| 4420 | case ACN_BLOB_FIELD_TYPE33: |
| 4421 | /* Need special code to display signed data */ |
| 4422 | ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, blob_offset, 3, ENC_BIG_ENDIAN0x00000000); |
| 4423 | proto_item_set_len(ti, blob_offset3); |
| 4424 | break; |
| 4425 | case ACN_BLOB_FIELD_TYPE44: |
| 4426 | /* Need special code to display signed data */ |
| 4427 | ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number64, tvb, blob_offset, 8, ENC_BIG_ENDIAN0x00000000); |
| 4428 | proto_item_set_len(ti, blob_offset3); |
| 4429 | break; |
| 4430 | case ACN_BLOB_FIELD_TYPE99: |
| 4431 | /* float */ |
| 4432 | proto_tree_add_item(field_tree, hf_acn_blob_field_value_float, tvb, blob_offset, field_length, ENC_BIG_ENDIAN0x00000000); |
| 4433 | break; |
| 4434 | case ACN_BLOB_FIELD_TYPE1010: |
| 4435 | /* double */ |
| 4436 | proto_tree_add_item(field_tree, hf_acn_blob_field_value_double, tvb, blob_offset, field_length, ENC_BIG_ENDIAN0x00000000); |
| 4437 | break; |
| 4438 | case ACN_BLOB_FIELD_TYPE1111: |
| 4439 | if (blob_offset3 == 0) { |
| 4440 | proto_tree_add_string(field_tree, hf_acn_blob_field_value_string, tvb, blob_offset, 0, "<none>"); |
| 4441 | } |
| 4442 | else if (display_variblob_as_CID) { |
| 4443 | proto_tree_add_item(field_tree, hf_acn_blob_field_value_guid, tvb, blob_offset, field_length, ENC_BIG_ENDIAN0x00000000); |
| 4444 | } |
| 4445 | else { |
| 4446 | proto_tree_add_item(field_tree, hf_acn_blob_field_value_string, tvb, blob_offset, blob_offset3, ENC_UTF_80x00000002); |
| 4447 | } |
| 4448 | break; |
| 4449 | /* "ignore", handled above */ |
| 4450 | /* case ACN_BLOB_FIELD_TYPE12: */ |
| 4451 | /* proto_tree_add_string(field_tree, hf_acn_blob_field_value_string, tvb, blob_offset, field_length, "Field Value: Ignore"); */ |
| 4452 | /* break; */ |
| 4453 | default: |
| 4454 | proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, blob_offset, blob_offset3, ENC_BIG_ENDIAN0x00000000); |
| 4455 | break; |
| 4456 | } |
| 4457 | } |
| 4458 | } |
| 4459 | |
| 4460 | /******************************************************************************/ |
| 4461 | /* Display Blob Field */ |
| 4462 | static void |
| 4463 | display_blob_field(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, uint8_t blob_type, int *blob_offset, uint16_t *field_number, int display_variblob_as_CID) |
| 4464 | { |
| 4465 | uint8_t field_type; |
| 4466 | uint8_t field_length; |
| 4467 | uint8_t blob_offset1; |
| 4468 | uint8_t blob_offset2; |
| 4469 | uint8_t blob_offset3; |
| 4470 | uint16_t temp_field_number; |
| 4471 | |
| 4472 | proto_item *fi; |
| 4473 | proto_tree *field_tree = NULL((void*)0); |
| 4474 | proto_item *ti; |
| 4475 | |
| 4476 | const char *field_name; |
| 4477 | |
| 4478 | if ((blob_type == ACN_BLOB_ENERGY_MANAGEMENT29) && (*field_number > 3)) { |
| 4479 | /* an exception to blob field rules: no "type" subfield, no "length" subfield */ |
| 4480 | |
| 4481 | /* field names 4 through 7 repeat: 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, ... */ |
| 4482 | temp_field_number = (*field_number % 4) + 4; |
| 4483 | |
| 4484 | switch (temp_field_number) { |
| 4485 | case 4: |
| 4486 | /* uint2 */ |
| 4487 | field_length = 2; |
| 4488 | blob_offset3 = 2; |
| 4489 | field_name = get_field_name(pinfo->pool, blob_type, temp_field_number); |
| 4490 | |
| 4491 | /* Create Sub Tree for Field Type*/ |
| 4492 | fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, *blob_offset, field_length, ENC_NA0x00000000); |
| 4493 | field_tree = proto_item_add_subtree(fi, ett_acn_blob); |
| 4494 | |
| 4495 | /* Add the Field Name Found to Sub Tree */ |
| 4496 | proto_item_append_text(fi, ": %s", field_name); |
| 4497 | |
| 4498 | ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, *blob_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 4499 | proto_item_set_len(ti, blob_offset3); |
| 4500 | break; |
| 4501 | case 5: |
| 4502 | case 6: |
| 4503 | case 7: |
| 4504 | /* uint4 */ |
| 4505 | field_length = 4; |
| 4506 | blob_offset3 = 4; |
| 4507 | field_name = get_field_name(pinfo->pool, blob_type, temp_field_number); |
| 4508 | |
| 4509 | /* Create Sub Tree for Field Type*/ |
| 4510 | fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, *blob_offset, field_length, ENC_NA0x00000000); |
| 4511 | field_tree = proto_item_add_subtree(fi, ett_acn_blob); |
| 4512 | |
| 4513 | /* Add the Field Name Found to Sub Tree */ |
| 4514 | proto_item_append_text(fi, ": %s", field_name); |
| 4515 | ti = proto_tree_add_item(field_tree, hf_acn_blob_field_value_number, tvb, *blob_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 4516 | proto_item_set_len(ti, blob_offset3); |
| 4517 | break; |
| 4518 | } |
| 4519 | } |
| 4520 | else { |
| 4521 | /* Get field type*/ |
| 4522 | field_type = tvb_get_uint8(tvb, *blob_offset); |
| 4523 | get_field_type_parameters(tvb, *blob_offset, field_type, &field_length, &blob_offset1, &blob_offset2, &blob_offset3); |
| 4524 | field_name = get_field_name(pinfo->pool, blob_type, *field_number); |
| 4525 | |
| 4526 | /* Create Sub Tree for Field Type*/ |
| 4527 | fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, *blob_offset, field_length + 1, ENC_NA0x00000000); |
| 4528 | field_tree = proto_item_add_subtree(fi, ett_acn_blob); |
| 4529 | |
| 4530 | /* Add the Field Name Found to Sub Tree */ |
| 4531 | proto_item_append_text(fi, ": %s", field_name); |
| 4532 | |
| 4533 | /* Add field type to field sub tree */ |
| 4534 | proto_tree_add_uint(field_tree, hf_acn_blob_field_type, tvb, *blob_offset, 1, field_type); |
| 4535 | *blob_offset += blob_offset1; |
| 4536 | |
| 4537 | /* Add field length to field sub tree */ |
| 4538 | proto_tree_add_uint(field_tree, hf_acn_blob_field_length, tvb, *blob_offset, 1, field_length); |
| 4539 | *blob_offset += blob_offset2; |
| 4540 | |
| 4541 | display_blob_field_value(tvb, pinfo, field_tree, *field_number, blob_type, field_type, field_length, *blob_offset, blob_offset3, display_variblob_as_CID); |
| 4542 | } |
| 4543 | |
| 4544 | *blob_offset += blob_offset3; |
| 4545 | *field_number += 1; |
| 4546 | } |
| 4547 | |
| 4548 | /******************************************************************************/ |
| 4549 | /* Dissect Blob Metadata */ |
| 4550 | static uint32_t |
| 4551 | dissect_acn_blob_metadata(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, int blob_offset, int end_offset) |
| 4552 | { |
| 4553 | uint8_t blob_type = ACN_BLOB_METADATA5; |
| 4554 | uint16_t field_number = 1; |
| 4555 | bool_Bool display_variblob_as_CID; |
| 4556 | |
| 4557 | /* Loop though dissecting fields until the end is reached */ |
| 4558 | while (blob_offset < end_offset) { |
| 4559 | if (field_number == 15) { |
| 4560 | |
| 4561 | display_variblob_as_CID = 1; |
| 4562 | } |
| 4563 | else { |
| 4564 | display_variblob_as_CID = 0; |
| 4565 | |
| 4566 | } |
| 4567 | |
| 4568 | display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, display_variblob_as_CID); |
| 4569 | } |
| 4570 | return 0; |
| 4571 | } |
| 4572 | |
| 4573 | /******************************************************************************/ |
| 4574 | /* Dissect Blob Preset Properties */ |
| 4575 | static uint32_t |
| 4576 | dissect_acn_blob_preset_properties(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, int blob_offset, int end_offset) |
| 4577 | { |
| 4578 | uint8_t blob_type = ACN_BLOB_PRESET_PROPERTIES250; |
| 4579 | uint8_t field_type; |
| 4580 | uint8_t field_length; |
| 4581 | uint8_t blob_offset1; |
| 4582 | uint8_t blob_offset2; |
| 4583 | uint8_t blob_offset3; |
| 4584 | uint8_t sub_blob_index; |
| 4585 | uint16_t field_number = 1; |
| 4586 | uint8_t max_sub_blobs = 192; |
| 4587 | proto_item *fi; |
| 4588 | proto_tree *sub_blob_tree = NULL((void*)0); |
| 4589 | const char *field_name; |
| 4590 | |
| 4591 | /* Loop though dissecting fields until the end is reached */ |
| 4592 | while (blob_offset < end_offset) { |
| 4593 | if (field_number == 17) { |
| 4594 | /* Create subtree for "Levels" */ |
| 4595 | field_type = tvb_get_uint8(tvb, blob_offset); |
| 4596 | get_field_type_parameters(tvb, blob_offset, field_type, &field_length, &blob_offset1, &blob_offset2, &blob_offset3); |
| 4597 | |
| 4598 | field_name = get_field_name(pinfo->pool, blob_type, field_number); |
| 4599 | field_number += 1; |
| 4600 | |
| 4601 | /* Create Sub Tree for Field Type */ |
| 4602 | fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, blob_offset, (field_length + 1) * max_sub_blobs, ENC_NA0x00000000); |
| 4603 | sub_blob_tree = proto_item_add_subtree(fi, ett_acn_blob); |
| 4604 | |
| 4605 | proto_item_append_text(fi, ": %s", field_name); |
| 4606 | sub_blob_index = 0; |
| 4607 | |
| 4608 | while ((sub_blob_index < max_sub_blobs) && (blob_offset < end_offset)) { |
| 4609 | display_blob_field(tvb, pinfo, sub_blob_tree, blob_type, &blob_offset, &field_number, 0); |
| 4610 | |
| 4611 | sub_blob_index += 1; |
| 4612 | } |
| 4613 | |
| 4614 | } |
| 4615 | |
| 4616 | else { |
| 4617 | display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, 0); |
| 4618 | } |
| 4619 | |
| 4620 | } |
| 4621 | return 0; |
| 4622 | } |
| 4623 | |
| 4624 | /******************************************************************************/ |
| 4625 | /* Dissect Blob Dimming Rack Properties v2 */ |
| 4626 | static uint32_t |
| 4627 | dissect_acn_blob_dimming_rack_properties_v2(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, int blob_offset, int end_offset) |
| 4628 | { |
| 4629 | uint8_t blob_type = ACN_BLOB_DIMMER_RACK_PROPERTIES222; |
| 4630 | uint16_t field_number = 1; |
| 4631 | bool_Bool display_variblob_as_CID; |
| 4632 | |
| 4633 | /* Loop though dissecting fields until the end is reached */ |
| 4634 | while (blob_offset < end_offset) { |
| 4635 | if (field_number == 12) { |
| 4636 | |
| 4637 | display_variblob_as_CID = 1; |
| 4638 | |
| 4639 | } |
| 4640 | else { |
| 4641 | |
| 4642 | display_variblob_as_CID = 0; |
| 4643 | |
| 4644 | } |
| 4645 | |
| 4646 | display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, display_variblob_as_CID); |
| 4647 | } |
| 4648 | return 0; |
| 4649 | } |
| 4650 | |
| 4651 | /******************************************************************************/ |
| 4652 | /* Dissect Blob Dimming Rack Status Properties v2 */ |
| 4653 | static uint32_t |
| 4654 | dissect_acn_blob_dimming_rack_status_properties_v2(tvbuff_t *tvb, packet_info* pinfo, proto_tree *blob_tree, int blob_offset, int end_offset) |
| 4655 | { |
| 4656 | uint8_t blob_type; |
| 4657 | uint8_t field_type; |
| 4658 | uint8_t field_length; |
| 4659 | uint8_t blob_offset1; |
| 4660 | uint8_t blob_offset2; |
| 4661 | uint8_t blob_offset3; |
| 4662 | uint8_t sub_blob_index; |
| 4663 | uint16_t field_number; |
| 4664 | |
| 4665 | int number_of_sub_blobs; |
| 4666 | |
| 4667 | proto_item *fi; |
| 4668 | proto_tree *sub_blob_tree = NULL((void*)0); |
| 4669 | |
| 4670 | const char *field_name; |
| 4671 | |
| 4672 | /*First Assignments*/ |
| 4673 | blob_type = ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223; |
| 4674 | field_number = 1; |
| 4675 | number_of_sub_blobs = 64; |
| 4676 | |
| 4677 | /* Loop though dissecting fields until the end is reached */ |
| 4678 | while (blob_offset < end_offset) { |
| 4679 | if (field_number == 22) { |
| 4680 | /* Create subtree for "Active Preset Group IDs" */ |
| 4681 | field_type = tvb_get_uint8(tvb, blob_offset); |
| 4682 | get_field_type_parameters(tvb, blob_offset, field_type, &field_length, &blob_offset1, &blob_offset2, &blob_offset3); |
| 4683 | |
| 4684 | field_name = get_field_name(pinfo->pool, blob_type, field_number); |
| 4685 | field_number += 1; |
| 4686 | |
| 4687 | /* Create Sub Tree for Field Type */ |
| 4688 | fi = proto_tree_add_item(blob_tree, hf_acn_blob_tree_field_type, tvb, blob_offset, (field_length + 1) * number_of_sub_blobs, ENC_NA0x00000000); |
| 4689 | sub_blob_tree = proto_item_add_subtree(fi, ett_acn_blob); |
| 4690 | |
| 4691 | proto_item_append_text(fi, ": %s", field_name); |
| 4692 | |
| 4693 | sub_blob_index = 0; |
| 4694 | |
| 4695 | while ((sub_blob_index < number_of_sub_blobs) && (blob_offset < end_offset)) { |
| 4696 | display_blob_field(tvb, pinfo, sub_blob_tree, blob_type, &blob_offset, &field_number, 0); |
| 4697 | |
| 4698 | sub_blob_index += 1; |
| 4699 | |
| 4700 | } |
| 4701 | |
| 4702 | } |
| 4703 | |
| 4704 | else { |
| 4705 | display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, 0); |
| 4706 | } |
| 4707 | |
| 4708 | } |
| 4709 | return 0; |
| 4710 | } |
| 4711 | |
| 4712 | /******************************************************************************/ |
| 4713 | /* Get Blob Type From Fields |
| 4714 | Both "Dimmer Properties v2" and "Preset Properties" ended up with blob type 20 */ |
| 4715 | static uint8_t |
| 4716 | get_blob_type_from_fields(tvbuff_t *tvb, int blob_offset, int end_offset) |
| 4717 | { |
| 4718 | uint8_t field_type; |
| 4719 | uint8_t field_length; |
| 4720 | uint8_t blob_offset1; |
| 4721 | uint8_t blob_offset2; |
| 4722 | uint8_t blob_offset3; |
| 4723 | uint16_t field_number = 1; |
| 4724 | |
| 4725 | while (blob_offset < end_offset) { |
| 4726 | field_type = tvb_get_uint8(tvb, blob_offset); |
| 4727 | if (field_number == 12) { |
| 4728 | if (field_type == ACN_BLOB_FIELD_TYPE1111) { |
| 4729 | /* string: dimmer name field */ |
| 4730 | return ACN_BLOB_DIMMER_PROPERTIES220; |
| 4731 | } |
| 4732 | /* number: preset number field */ |
| 4733 | return ACN_BLOB_PRESET_PROPERTIES250; |
| 4734 | } |
| 4735 | get_field_type_parameters(tvb, blob_offset, field_type, &field_length, &blob_offset1, &blob_offset2, &blob_offset3); |
| 4736 | blob_offset += blob_offset2 + blob_offset3; |
| 4737 | field_number += 1; |
| 4738 | } |
| 4739 | |
| 4740 | return ACN_BLOB_DIMMER_PROPERTIES220; |
| 4741 | } |
| 4742 | |
| 4743 | /******************************************************************************/ |
| 4744 | /* Dissect Blob */ |
| 4745 | static uint32_t |
| 4746 | dissect_acn_blob(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pdu_tree, int blob_offset, int end_offset) |
| 4747 | { |
| 4748 | /* Declarations for blobs*/ |
| 4749 | uint8_t blob_type; |
| 4750 | uint16_t field_number = 1; |
| 4751 | proto_item *bi; |
| 4752 | proto_tree *blob_tree = NULL((void*)0); |
| 4753 | const char *blob_name; |
| 4754 | /* const char *range_type; */ |
| 4755 | |
| 4756 | /* Add blob to tree */ |
| 4757 | bi = proto_tree_add_item(pdu_tree, hf_acn_blob, tvb, blob_offset, end_offset, ENC_NA0x00000000); |
| 4758 | blob_tree = proto_item_add_subtree(bi, 0); |
| 4759 | end_offset = blob_offset + end_offset; |
| 4760 | blob_offset += 4; |
| 4761 | |
| 4762 | /* Add Blob version item to tree */ |
| 4763 | proto_tree_add_item(blob_tree, hf_acn_blob_version, tvb, blob_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 4764 | blob_offset += 1; |
| 4765 | |
| 4766 | /* Add Blob Start and End Range Info */ |
| 4767 | proto_tree_add_item(blob_tree, hf_acn_blob_range_type, tvb, blob_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 4768 | /* range_type = val_to_str(pinfo->pool, range, acn_blob_range_type_vals, "not valid (%d)"); */ |
| 4769 | blob_offset += 1; |
| 4770 | |
| 4771 | /* Add Blob Range Number */ |
| 4772 | proto_tree_add_item(blob_tree, hf_acn_blob_range_number, tvb, blob_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 4773 | blob_offset += 1; |
| 4774 | |
| 4775 | /* Add Blob Meta-Type */ |
| 4776 | blob_type = tvb_get_uint8(tvb, blob_offset); |
| 4777 | if (blob_type == ACN_BLOB_DIMMER_PROPERTIES220) { |
| 4778 | /* Dimmer Properties v2 and Preset Properties have the same 'type' value (20) */ |
| 4779 | blob_type = get_blob_type_from_fields(tvb, blob_offset + 1, end_offset); |
| 4780 | } |
| 4781 | |
| 4782 | proto_tree_add_uint(blob_tree, hf_acn_blob_type, tvb, blob_offset, 1, blob_type); |
| 4783 | |
| 4784 | blob_name = val_to_str(pinfo->pool, blob_type, acn_blob_type_vals, "not valid (%d)"); |
| 4785 | proto_item_append_text(bi, ": %s", blob_name); |
| 4786 | blob_offset += 1; |
| 4787 | |
| 4788 | if (blob_type == ACN_BLOB_METADATA5) { |
| 4789 | return dissect_acn_blob_metadata(tvb, pinfo, blob_tree, blob_offset, end_offset); |
| 4790 | } |
| 4791 | if (blob_type == ACN_BLOB_PRESET_PROPERTIES250) { |
| 4792 | return dissect_acn_blob_preset_properties(tvb, pinfo, blob_tree, blob_offset, end_offset); |
| 4793 | } |
| 4794 | if (blob_type == ACN_BLOB_DIMMER_RACK_PROPERTIES222) { |
| 4795 | return dissect_acn_blob_dimming_rack_properties_v2(tvb, pinfo, blob_tree, blob_offset, end_offset); |
| 4796 | } |
| 4797 | if (blob_type == ACN_BLOB_DIMMER_RACK_STATUS_PROPERTIES223) { |
| 4798 | return dissect_acn_blob_dimming_rack_status_properties_v2(tvb, pinfo, blob_tree, blob_offset, end_offset); |
| 4799 | } |
| 4800 | |
| 4801 | /* Loop though dissecting fields until the end is reached */ |
| 4802 | while (blob_offset < end_offset) { |
| 4803 | display_blob_field(tvb, pinfo, blob_tree, blob_type, &blob_offset, &field_number, 0); |
| 4804 | } |
| 4805 | return 0; |
| 4806 | } |
| 4807 | |
| 4808 | /******************************************************************************/ |
| 4809 | /* Dissect PDU L bit flag */ |
| 4810 | static void |
| 4811 | dissect_pdu_bit_flag_l(tvbuff_t *tvb, int *offset, uint8_t *pdu_flags, uint32_t *pdu_length, uint32_t *pdu_flvh_length) |
| 4812 | { |
| 4813 | uint8_t octet; |
| 4814 | uint32_t length1; |
| 4815 | uint32_t length2; |
| 4816 | uint32_t length3; |
| 4817 | |
| 4818 | /* get PDU flags and length flag */ |
| 4819 | octet = tvb_get_uint8(tvb, (*offset)++); |
| 4820 | *pdu_flags = octet & 0xf0; |
| 4821 | length1 = octet & 0x0f; /* bottom 4 bits only */ |
| 4822 | length2 = tvb_get_uint8(tvb, (*offset)++); |
| 4823 | |
| 4824 | /* if length flag is set, then we have a 20 bit length else we have a 12 bit */ |
| 4825 | /* flvh = flags, length, vector, header */ |
| 4826 | if (*pdu_flags & ACN_PDU_FLAG_L0x80) { |
| 4827 | length3 = tvb_get_uint8(tvb, *offset); |
| 4828 | *offset += 1; |
| 4829 | *pdu_length = length3 | (length2 << 8) | (length1 << 16); |
| 4830 | *pdu_flvh_length = 3; |
| 4831 | } else { |
| 4832 | *pdu_length = length2 | (length1 << 8); |
| 4833 | *pdu_flvh_length = 2; |
| 4834 | } |
| 4835 | } |
| 4836 | |
| 4837 | /******************************************************************************/ |
| 4838 | /* Dissect PDU V bit flag */ |
| 4839 | static void |
| 4840 | dissect_pdu_bit_flag_v(int *offset, uint8_t pdu_flags, uint32_t *vector_offset, acn_pdu_offsets *last_pdu_offsets, uint32_t *pdu_flvh_length, uint8_t increment) |
| 4841 | { |
| 4842 | /* Set vector offset */ |
| 4843 | if (pdu_flags & ACN_PDU_FLAG_V0x40) { |
| 4844 | /* use new values */ |
| 4845 | *vector_offset = *offset; |
| 4846 | last_pdu_offsets->vector = *offset; |
| 4847 | *offset += increment; |
| 4848 | *pdu_flvh_length += increment; |
| 4849 | } else { |
| 4850 | /* use last values */ |
| 4851 | *vector_offset = last_pdu_offsets->vector; |
| 4852 | } |
| 4853 | } |
| 4854 | |
| 4855 | /******************************************************************************/ |
| 4856 | /* Dissect PDU H bit flag */ |
| 4857 | static void |
| 4858 | dissect_pdu_bit_flag_h(int *offset, uint8_t pdu_flags, uint32_t *header_offset, acn_pdu_offsets *last_pdu_offsets, uint32_t *pdu_flvh_length, uint8_t increment) |
| 4859 | { |
| 4860 | /* Set header offset */ |
| 4861 | if (pdu_flags & ACN_PDU_FLAG_H0x20) { |
| 4862 | /* use new values */ |
| 4863 | *header_offset = *offset; |
| 4864 | last_pdu_offsets->header = *offset; |
| 4865 | *offset += increment; |
| 4866 | *pdu_flvh_length += increment; |
| 4867 | } else { |
| 4868 | /* use last values */ |
| 4869 | *header_offset = last_pdu_offsets->header; |
| 4870 | } |
| 4871 | } |
| 4872 | |
| 4873 | /******************************************************************************/ |
| 4874 | /* Dissect PDU D bit flag */ |
| 4875 | static void |
| 4876 | dissect_pdu_bit_flag_d(int offset, uint8_t pdu_flags, uint32_t pdu_length, uint32_t *data_offset, uint32_t *data_length, acn_pdu_offsets *last_pdu_offsets, uint32_t pdu_flvh_length, bool_Bool set_last_value_length) |
| 4877 | { |
| 4878 | /* Adjust data */ |
| 4879 | if (pdu_flags & ACN_PDU_FLAG_D0x10) { |
| 4880 | /* use new values */ |
| 4881 | *data_offset = offset; |
| 4882 | *data_length = pdu_length - pdu_flvh_length; |
| 4883 | last_pdu_offsets->data = offset; |
| 4884 | last_pdu_offsets->data_length = *data_length; |
| 4885 | } else { |
| 4886 | /* use last values */ |
| 4887 | *data_offset = last_pdu_offsets->data; |
| 4888 | if (set_last_value_length) { |
| 4889 | *data_length = last_pdu_offsets->data_length; |
| 4890 | } |
| 4891 | } |
| 4892 | } |
| 4893 | |
| 4894 | /******************************************************************************/ |
| 4895 | /* Add flag and flag tree */ |
| 4896 | static void |
| 4897 | begin_dissect_acn_pdu(proto_tree **pdu_tree, tvbuff_t *tvb, proto_item **ti, proto_tree *tree, uint32_t *pdu_start, int *offset, uint8_t *pdu_flags, uint32_t *pdu_length, uint32_t *pdu_flvh_length, int ett_base_pdu, bool_Bool is_acn) |
| 4898 | { |
| 4899 | proto_item *pi; |
| 4900 | proto_tree *flag_tree; |
| 4901 | |
| 4902 | /* save start of pdu block */ |
| 4903 | *pdu_start = *offset; |
| 4904 | |
| 4905 | dissect_pdu_bit_flag_l(tvb, offset, pdu_flags, pdu_length, pdu_flvh_length); |
| 4906 | /* offset should now be pointing to vector (if one exists) */ |
| 4907 | |
| 4908 | /* add pdu item and tree */ |
| 4909 | if (is_acn) { |
| 4910 | *ti = proto_tree_add_item(tree, hf_acn_pdu, tvb, *pdu_start, *pdu_length, ENC_NA0x00000000); |
| 4911 | } else { |
| 4912 | *ti = proto_tree_add_item(tree, hf_rdmnet_pdu, tvb, *pdu_start, *pdu_length, ENC_NA0x00000000); |
| 4913 | } |
| 4914 | *pdu_tree = proto_item_add_subtree(*ti, ett_base_pdu); |
| 4915 | |
| 4916 | /* add flag item and tree */ |
| 4917 | if (is_acn) { |
| 4918 | pi = proto_tree_add_uint(*pdu_tree, hf_acn_pdu_flags, tvb, *pdu_start, 1, *pdu_flags); |
| 4919 | flag_tree = proto_item_add_subtree(pi, ett_acn_pdu_flags); |
| 4920 | proto_tree_add_item(flag_tree, hf_acn_pdu_flag_l, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000); |
| 4921 | proto_tree_add_item(flag_tree, hf_acn_pdu_flag_v, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000); |
| 4922 | proto_tree_add_item(flag_tree, hf_acn_pdu_flag_h, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000); |
| 4923 | proto_tree_add_item(flag_tree, hf_acn_pdu_flag_d, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000); |
| 4924 | } |
| 4925 | else { |
| 4926 | pi = proto_tree_add_uint(*pdu_tree, hf_rdmnet_pdu_flags, tvb, *pdu_start, 1, *pdu_flags); |
| 4927 | flag_tree = proto_item_add_subtree(pi, ett_rdmnet_pdu_flags); |
| 4928 | proto_tree_add_item(flag_tree, hf_rdmnet_pdu_flag_l, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000); |
| 4929 | proto_tree_add_item(flag_tree, hf_rdmnet_pdu_flag_v, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000); |
| 4930 | proto_tree_add_item(flag_tree, hf_rdmnet_pdu_flag_h, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000); |
| 4931 | proto_tree_add_item(flag_tree, hf_rdmnet_pdu_flag_d, tvb, *pdu_start, 1, ENC_BIG_ENDIAN0x00000000); |
| 4932 | } |
| 4933 | } |
| 4934 | |
| 4935 | /******************************************************************************/ |
| 4936 | /* Dissect wrapped SDT PDU */ |
| 4937 | static uint32_t |
| 4938 | dissect_acn_dmp_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 4939 | { |
| 4940 | /* common to all pdu */ |
| 4941 | bool_Bool blob_exists = 0; |
| 4942 | uint8_t pdu_flags; |
| 4943 | uint32_t pdu_start; |
| 4944 | uint32_t pdu_length; |
| 4945 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 4946 | uint8_t D; |
| 4947 | uint32_t vector_offset; |
| 4948 | uint32_t header_offset; |
| 4949 | uint32_t data_offset; |
| 4950 | uint32_t old_offset; |
| 4951 | uint32_t end_offset; |
| 4952 | uint32_t data_length; |
| 4953 | uint32_t address_count; |
| 4954 | uint32_t blob_offset; |
| 4955 | uint32_t blob_end_offset = 0; |
| 4956 | |
| 4957 | proto_item *ti; |
| 4958 | proto_tree *pdu_tree = NULL((void*)0); |
| 4959 | |
| 4960 | /* this pdu */ |
| 4961 | const char *name; |
| 4962 | acn_dmp_adt_type adt = {0,0,0,0,0,0}; |
| 4963 | acn_dmp_adt_type adt2 = {0,0,0,0,0,0}; |
| 4964 | uint32_t vector; |
| 4965 | |
| 4966 | begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_dmp_pdu, 1); |
| 4967 | |
| 4968 | /* Add PDU Length item */ |
| 4969 | proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 4970 | |
| 4971 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 1); |
| 4972 | /* offset should now be pointing to header (if one exists) */ |
| 4973 | |
| 4974 | /* Add Vector item */ |
| 4975 | vector = tvb_get_uint8(tvb, vector_offset); |
| 4976 | proto_tree_add_uint(pdu_tree, hf_acn_dmp_vector, tvb, vector_offset, 1, vector); |
| 4977 | |
| 4978 | /* Add Vector item to tree*/ |
| 4979 | name = val_to_str(pinfo->pool, vector, acn_dmp_vector_vals, "not valid (%d)"); |
| 4980 | proto_item_append_text(ti, ": "); |
| 4981 | proto_item_append_text(ti, "%s", name); |
| 4982 | |
| 4983 | dissect_pdu_bit_flag_h(&offset, pdu_flags, &header_offset, last_pdu_offsets, &pdu_flvh_length, 1); |
| 4984 | /* offset should now be pointing to data (if one exists) */ |
| 4985 | |
| 4986 | /* header contains address and data type */ |
| 4987 | acn_add_dmp_address_type(tvb, pinfo, pdu_tree, header_offset, &adt); |
| 4988 | |
| 4989 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 1); |
| 4990 | end_offset = data_offset + data_length; |
| 4991 | |
| 4992 | /* Check if blob exists, find beginning offset */ |
| 4993 | blob_offset = data_offset; |
| 4994 | blob_exists = 0; |
| 4995 | while ((blob_offset < (end_offset - 4)) && (blob_exists != 1)) { |
| 4996 | if (tvb_get_ntohl(tvb, blob_offset) == 0x426c6f62) { |
| 4997 | /* 0x426c6f62 == "Blob" */ |
| 4998 | blob_exists = 1; |
| 4999 | break; |
| 5000 | } |
| 5001 | blob_offset += 1; |
| 5002 | } |
| 5003 | |
| 5004 | /* Fix the end_offset for finding Address-Data pair if blob exists*/ |
| 5005 | if (blob_exists == 1) { |
| 5006 | blob_end_offset = end_offset - blob_offset; |
| 5007 | end_offset = blob_offset; |
| 5008 | data_length = blob_offset - data_offset; |
| 5009 | } |
| 5010 | |
| 5011 | switch (vector) { |
| 5012 | case ACN_DMP_VECTOR_UNKNOWN0: |
| 5013 | break; |
| 5014 | case ACN_DMP_VECTOR_GET_PROPERTY1: |
| 5015 | /* Rip through property address */ |
| 5016 | while (data_offset < end_offset) { |
| 5017 | old_offset = data_offset; |
| 5018 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5019 | if (old_offset == data_offset) break; |
| 5020 | } |
| 5021 | break; |
| 5022 | case ACN_DMP_VECTOR_SET_PROPERTY2: |
| 5023 | /* Rip through Property Address-Data pairs */ |
| 5024 | /* But, in reality, this generally won't work as we have know way of */ |
| 5025 | /* calculating the next Address-Data pair */ |
| 5026 | while (data_offset < end_offset) { |
| 5027 | old_offset = data_offset; |
| 5028 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5029 | if (old_offset == data_offset) break; |
| 5030 | |
| 5031 | adt.data_length = data_length - (data_offset - old_offset); |
| 5032 | old_offset = data_offset; |
| 5033 | data_offset = acn_add_dmp_data(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5034 | if (old_offset == data_offset) break; |
| 5035 | } |
| 5036 | break; |
| 5037 | case ACN_DMP_VECTOR_GET_PROPERTY_REPLY3: |
| 5038 | /* Rip through Property Address-Data pairs */ |
| 5039 | /* But, in reality, this generally won't work as we have know way of */ |
| 5040 | /* calculating the next Address-Data pair */ |
| 5041 | while (data_offset < end_offset) { |
| 5042 | old_offset = data_offset; |
| 5043 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5044 | if (old_offset == data_offset) break; |
| 5045 | |
| 5046 | adt.data_length = data_length - (data_offset - old_offset); |
| 5047 | old_offset = data_offset; |
| 5048 | data_offset = acn_add_dmp_data(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5049 | if (old_offset == data_offset) break; |
| 5050 | } |
| 5051 | break; |
| 5052 | case ACN_DMP_VECTOR_EVENT4: |
| 5053 | case ACN_DMP_VECTOR_SYNC_EVENT17: |
| 5054 | /* Rip through Property Address-Data pairs */ |
| 5055 | /* But, in reality, this generally won't work as we have know way of */ |
| 5056 | /* calculating the next Address-Data pair */ |
| 5057 | while (data_offset < end_offset) { |
| 5058 | old_offset = data_offset; |
| 5059 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5060 | if (old_offset == data_offset) break; |
| 5061 | |
| 5062 | adt.data_length = data_length - (data_offset - old_offset); |
| 5063 | old_offset = data_offset; |
| 5064 | data_offset = acn_add_dmp_data(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5065 | if (old_offset == data_offset) break; |
| 5066 | } |
| 5067 | break; |
| 5068 | case ACN_DMP_VECTOR_MAP_PROPERTY5: |
| 5069 | /* Virtual Address type */ |
| 5070 | data_offset = acn_add_dmp_address_type(tvb, pinfo, pdu_tree, data_offset, &adt2); |
| 5071 | /* Rip through Actual-Virtual Address Pairs */ |
| 5072 | while (data_offset < end_offset) { |
| 5073 | /* actual */ |
| 5074 | old_offset = data_offset; |
| 5075 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5076 | if (old_offset == data_offset) break; |
| 5077 | D = ACN_DMP_ADT_EXTRACT_D(adt.flags)(((adt.flags) & 0x30) >> 4); |
| 5078 | switch (D) { |
| 5079 | case ACN_DMP_ADT_D_NS0: |
| 5080 | address_count = 1; |
| 5081 | break; |
| 5082 | case ACN_DMP_ADT_D_RS1: |
| 5083 | address_count = 1; |
| 5084 | break; |
| 5085 | case ACN_DMP_ADT_D_RE2: |
| 5086 | address_count = adt.count; |
| 5087 | break; |
| 5088 | /*case ACN_DMP_ADT_D_RM: */ |
| 5089 | default: |
| 5090 | /* OUCH */ |
| 5091 | return pdu_start + pdu_length; |
| 5092 | } |
| 5093 | |
| 5094 | /* virtual */ |
| 5095 | while (address_count > 0) { |
| 5096 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt2); |
| 5097 | address_count--; |
| 5098 | } |
| 5099 | } |
| 5100 | break; |
| 5101 | case ACN_DMP_VECTOR_UNMAP_PROPERTY6: |
| 5102 | /* Rip through Actual Property Address */ |
| 5103 | while (data_offset < end_offset) { |
| 5104 | old_offset = data_offset; |
| 5105 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5106 | if (old_offset == data_offset) break; |
| 5107 | } |
| 5108 | break; |
| 5109 | case ACN_DMP_VECTOR_SUBSCRIBE7: |
| 5110 | /* Rip through Property Address */ |
| 5111 | while (data_offset < end_offset) { |
| 5112 | old_offset = data_offset; |
| 5113 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5114 | if (old_offset == data_offset) break; |
| 5115 | } |
| 5116 | break; |
| 5117 | case ACN_DMP_VECTOR_UNSUBSCRIBE8: |
| 5118 | /* Rip through Property Address */ |
| 5119 | while (data_offset < end_offset) { |
| 5120 | old_offset = data_offset; |
| 5121 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5122 | if (old_offset == data_offset) break; |
| 5123 | } |
| 5124 | break; |
| 5125 | case ACN_DMP_VECTOR_GET_PROPERTY_FAIL9: |
| 5126 | /* Rip through Address-Reason Code Pairs */ |
| 5127 | while (data_offset < end_offset) { |
| 5128 | old_offset = data_offset; |
| 5129 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5130 | if (old_offset == data_offset) break; |
| 5131 | |
| 5132 | adt.data_length = data_length - (data_offset - old_offset); |
| 5133 | old_offset = data_offset; |
| 5134 | data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5135 | if (old_offset == data_offset) break; |
| 5136 | } |
| 5137 | break; |
| 5138 | case ACN_DMP_VECTOR_SET_PROPERTY_FAIL10: |
| 5139 | /* Rip through Address-Reason Code Pairs */ |
| 5140 | while (data_offset < end_offset) { |
| 5141 | old_offset = data_offset; |
| 5142 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5143 | if (old_offset == data_offset) break; |
| 5144 | |
| 5145 | adt.data_length = data_length - (data_offset - old_offset); |
| 5146 | old_offset = data_offset; |
| 5147 | data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5148 | if (old_offset == data_offset) break; |
| 5149 | } |
| 5150 | break; |
| 5151 | case ACN_DMP_VECTOR_MAP_PROPERTY_FAIL11: |
| 5152 | /* Rip through Address-Reason Code Pairs */ |
| 5153 | while (data_offset < end_offset) { |
| 5154 | old_offset = data_offset; |
| 5155 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5156 | if (old_offset == data_offset) break; |
| 5157 | |
| 5158 | adt.data_length = data_length - (data_offset - old_offset); |
| 5159 | old_offset = data_offset; |
| 5160 | data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5161 | if (old_offset == data_offset) break; |
| 5162 | } |
| 5163 | break; |
| 5164 | case ACN_DMP_VECTOR_SUBSCRIBE_ACCEPT12: |
| 5165 | /* Rip through Property Addresses */ |
| 5166 | while (data_offset < end_offset) { |
| 5167 | old_offset = data_offset; |
| 5168 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5169 | if (old_offset == data_offset) break; |
| 5170 | } |
| 5171 | break; |
| 5172 | case ACN_DMP_VECTOR_SUBSCRIBE_REJECT13: |
| 5173 | /* Rip through Address-Reason Code Pairs */ |
| 5174 | while (data_offset < end_offset) { |
| 5175 | old_offset = data_offset; |
| 5176 | data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5177 | if (old_offset == data_offset) break; |
| 5178 | |
| 5179 | adt.data_length = data_length - (data_offset - old_offset); |
| 5180 | old_offset = data_offset; |
| 5181 | data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt); |
| 5182 | if (old_offset == data_offset) break; |
| 5183 | } |
| 5184 | break; |
| 5185 | case ACN_DMP_VECTOR_ALLOCATE_MAP14: |
| 5186 | /* No data for this */ |
| 5187 | break; |
| 5188 | case ACN_DMP_VECTOR_ALLOCATE_MAP_REPLY15: |
| 5189 | /* Single reason code */ |
| 5190 | proto_tree_add_item(pdu_tree, hf_acn_dmp_reason_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5191 | /* data_offset += 1; */ |
| 5192 | case ACN_DMP_VECTOR_DEALLOCATE_MAP16: |
| 5193 | /* No data for this */ |
| 5194 | break; |
| 5195 | } |
| 5196 | |
| 5197 | /* If blob exists, call function to dissect blob*/ |
| 5198 | if (blob_exists == 1) { |
| 5199 | dissect_acn_blob(tvb, pinfo, pdu_tree, blob_offset, blob_end_offset); |
| 5200 | } |
| 5201 | |
| 5202 | return pdu_start + pdu_length; |
| 5203 | } |
| 5204 | |
| 5205 | |
| 5206 | /******************************************************************************/ |
| 5207 | /* Dissect wrapped SDT PDU */ |
| 5208 | static uint32_t |
| 5209 | dissect_acn_sdt_wrapped_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 5210 | { |
| 5211 | /* common to all pdu */ |
| 5212 | uint8_t pdu_flags; |
| 5213 | uint32_t pdu_start; |
| 5214 | uint32_t pdu_length; |
| 5215 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 5216 | uint32_t vector_offset; |
| 5217 | uint32_t data_offset; |
| 5218 | uint32_t data_length; |
| 5219 | |
| 5220 | proto_item *ti; |
| 5221 | proto_tree *pdu_tree = NULL((void*)0); |
| 5222 | |
| 5223 | /* this pdu */ |
| 5224 | const char *name; |
| 5225 | uint32_t vector; |
| 5226 | |
| 5227 | begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_sdt_pdu, 1); |
| 5228 | |
| 5229 | /* Add PDU Length item */ |
| 5230 | proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 5231 | |
| 5232 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 1); |
| 5233 | /* offset should now be pointing to header (if one exists) */ |
| 5234 | |
| 5235 | /* Add Vector item */ |
| 5236 | vector = tvb_get_uint8(tvb, vector_offset); |
| 5237 | proto_tree_add_uint(pdu_tree, hf_acn_sdt_vector, tvb, vector_offset, 1, vector); |
| 5238 | |
| 5239 | /* Add Vector item to tree*/ |
| 5240 | name = val_to_str(pinfo->pool, vector, acn_sdt_vector_vals, "not valid (%d)"); |
| 5241 | proto_item_append_text(ti, ": "); |
| 5242 | proto_item_append_text(ti, "%s", name); |
| 5243 | |
| 5244 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 5245 | |
| 5246 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 5247 | |
| 5248 | switch (vector) { |
| 5249 | case ACN_SDT_VECTOR_ACK14: |
| 5250 | proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5251 | /*data_offset += 4;*/ |
| 5252 | break; |
| 5253 | case ACN_SDT_VECTOR_CHANNEL_PARAMS3: |
| 5254 | data_offset = acn_add_channel_parameter(tvb, pinfo, pdu_tree, data_offset); |
| 5255 | data_offset = acn_add_address(tvb, pinfo, pdu_tree, data_offset, "Ad-hoc Address:"); |
| 5256 | /*data_offset =*/ acn_add_expiry(tvb, pinfo, pdu_tree, data_offset, hf_acn_adhoc_expiry); |
| 5257 | break; |
| 5258 | case ACN_SDT_VECTOR_LEAVE7: |
| 5259 | /* nothing more */ |
| 5260 | break; |
| 5261 | case ACN_SDT_VECTOR_CONNECT9: |
| 5262 | /* Protocol ID item */ |
| 5263 | proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5264 | /*data_offset += 4;*/ |
| 5265 | break; |
| 5266 | case ACN_SDT_VECTOR_CONNECT_ACCEPT10: |
| 5267 | /* Protocol ID item */ |
| 5268 | proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5269 | /*data_offset += 4;*/ |
| 5270 | break; |
| 5271 | case ACN_SDT_VECTOR_CONNECT_REFUSE11: |
| 5272 | /* Protocol ID item */ |
| 5273 | proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5274 | data_offset += 4; |
| 5275 | proto_tree_add_item(pdu_tree, hf_acn_refuse_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5276 | /*data_offset += 1;*/ |
| 5277 | break; |
| 5278 | case ACN_SDT_VECTOR_DISCONNECT12: |
| 5279 | /* Protocol ID item */ |
| 5280 | proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5281 | /*data_offset += 4;*/ |
| 5282 | break; |
| 5283 | case ACN_SDT_VECTOR_DISCONNECTING13: |
| 5284 | /* Protocol ID item */ |
| 5285 | proto_tree_add_item(pdu_tree, hf_acn_protocol_id, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5286 | data_offset += 4; |
| 5287 | proto_tree_add_item(pdu_tree, hf_acn_reason_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5288 | /*data_offset += 1;*/ |
| 5289 | break; |
| 5290 | |
| 5291 | } |
| 5292 | |
| 5293 | return pdu_start + pdu_length; |
| 5294 | } |
| 5295 | |
| 5296 | |
| 5297 | /******************************************************************************/ |
| 5298 | /* Dissect SDT Client PDU */ |
| 5299 | static uint32_t |
| 5300 | dissect_acn_sdt_client_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 5301 | { |
| 5302 | /* common to all pdu */ |
| 5303 | uint8_t pdu_flags; |
| 5304 | uint32_t pdu_start; |
| 5305 | uint32_t pdu_length; |
| 5306 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 5307 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 5308 | uint32_t vector_offset; |
| 5309 | uint32_t header_offset; |
| 5310 | uint32_t data_offset; |
| 5311 | uint32_t data_length; |
| 5312 | uint32_t old_offset; |
| 5313 | uint32_t end_offset; |
| 5314 | |
| 5315 | proto_item *ti; |
| 5316 | proto_tree *pdu_tree = NULL((void*)0); |
| 5317 | |
| 5318 | /* this pdu */ |
| 5319 | const char *name; |
| 5320 | uint32_t member_id; |
| 5321 | uint32_t protocol_id; |
| 5322 | uint16_t association; |
| 5323 | |
| 5324 | begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_sdt_client_pdu, 1); |
| 5325 | |
| 5326 | /* Add PDU Length item */ |
| 5327 | proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 5328 | |
| 5329 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 2); |
| 5330 | /* offset should now be pointing to header (if one exists) */ |
| 5331 | |
| 5332 | /* add Member ID item */ |
| 5333 | member_id = tvb_get_ntohs(tvb, vector_offset); |
| 5334 | proto_tree_add_uint(pdu_tree, hf_acn_member_id, tvb, vector_offset, 2, member_id); |
| 5335 | |
| 5336 | dissect_pdu_bit_flag_h(&offset, pdu_flags, &header_offset, last_pdu_offsets, &pdu_flvh_length, 6); |
| 5337 | /* offset should now be pointing to data (if one exists) */ |
| 5338 | |
| 5339 | /* add Protocol ID item (Header)*/ |
| 5340 | protocol_id = tvb_get_ntohl(tvb, header_offset); |
| 5341 | proto_tree_add_uint(pdu_tree, hf_acn_protocol_id, tvb, header_offset, 4, protocol_id); |
| 5342 | header_offset += 4; |
| 5343 | |
| 5344 | /* Add protocol to tree*/ |
| 5345 | name = val_to_str(pinfo->pool, protocol_id, acn_protocol_id_vals, "id not valid (%d)"); |
| 5346 | proto_item_append_text(ti, ": "); |
| 5347 | proto_item_append_text(ti, "%s", name); |
| 5348 | |
| 5349 | /* add association item */ |
| 5350 | association = tvb_get_ntohs(tvb, header_offset); |
| 5351 | proto_tree_add_uint(pdu_tree, hf_acn_association, tvb, header_offset, 2, association); |
| 5352 | /*header_offset += 2;*/ |
| 5353 | |
| 5354 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 1); |
| 5355 | end_offset = data_offset + data_length; |
| 5356 | |
| 5357 | switch (protocol_id) { |
| 5358 | case ACN_PROTOCOL_ID_SDT0x00000001: |
| 5359 | while (data_offset < end_offset) { |
| 5360 | old_offset = data_offset; |
| 5361 | data_offset = dissect_acn_sdt_wrapped_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 5362 | if (old_offset == data_offset) break; |
| 5363 | } |
| 5364 | break; |
| 5365 | case ACN_PROTOCOL_ID_DMP0x00000002: |
| 5366 | while (data_offset < end_offset) { |
| 5367 | old_offset = data_offset; |
| 5368 | data_offset = dissect_acn_dmp_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 5369 | if (data_offset == old_offset) break; |
| 5370 | } |
| 5371 | break; |
| 5372 | } |
| 5373 | return pdu_start + pdu_length; |
| 5374 | } |
| 5375 | |
| 5376 | |
| 5377 | /******************************************************************************/ |
| 5378 | /* level to string (ascii) */ |
| 5379 | /* level : 8 bit value */ |
| 5380 | /* string : pointer to buffer to fill */ |
| 5381 | /* leading_char: character to buffer left of digits */ |
| 5382 | /* min_char : minimum number of characters (for filling, not including space)*/ |
| 5383 | /* show_zero: show zeros or dots */ |
| 5384 | /* also adds a space to right end */ |
| 5385 | /* */ |
| 5386 | /* returns end of string */ |
| 5387 | /* faster than printf() */ |
| 5388 | static char * |
| 5389 | ltos(uint8_t level, char *string, uint8_t base, char leading_char, uint8_t min_chars, bool_Bool show_zero) |
| 5390 | { |
| 5391 | uint8_t i; |
| 5392 | /* verify base */ |
| 5393 | if (base < 2 || base > 16) { |
| 5394 | *string = '\0'; |
| 5395 | return string; |
| 5396 | } |
| 5397 | /* deal with zeros */ |
| 5398 | if ((level == 0) && (!show_zero)) { |
| 5399 | for (i=0; i<min_chars; i++) { |
| 5400 | string[i] = '.'; |
| 5401 | } |
| 5402 | string[i++] = ' '; |
| 5403 | string[i] = '\0'; |
| 5404 | return string+i; |
| 5405 | } |
| 5406 | |
| 5407 | i = 0; |
| 5408 | /* do our convert, comes out backwards! */ |
| 5409 | do { |
| 5410 | string[i++] = "0123456789ABCDEF"[level % base]; |
| 5411 | } while ((level /= base) > 0); |
| 5412 | |
| 5413 | /* expand to needed character */ |
| 5414 | for (; i<min_chars; i++) { |
| 5415 | string[i] = leading_char; |
| 5416 | } |
| 5417 | /* terminate */ |
| 5418 | string[i] = '\0'; |
| 5419 | |
| 5420 | /* now reverse (and correct) the order */ |
| 5421 | g_strreverse(string); |
| 5422 | |
| 5423 | /* add a space at the end (ok it's at the start but it will be at the end)*/ |
| 5424 | string[i++] = ' '; |
| 5425 | string[i] = '\0'; |
| 5426 | return string+i; |
| 5427 | } |
| 5428 | |
| 5429 | |
| 5430 | /******************************************************************************/ |
| 5431 | /* Dissect DMX data PDU */ |
| 5432 | #define BUFFER_SIZE128 128 |
| 5433 | static uint32_t |
| 5434 | dissect_acn_dmx_data_pdu(uint32_t protocol_id, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 5435 | { |
| 5436 | /* common to all pdu */ |
| 5437 | uint8_t pdu_flags; |
| 5438 | uint32_t pdu_start; |
| 5439 | uint32_t pdu_length; |
| 5440 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 5441 | uint32_t vector_offset; |
| 5442 | uint32_t data_offset; |
| 5443 | uint32_t end_offset; |
| 5444 | uint32_t data_length; |
| 5445 | uint32_t header_offset; |
| 5446 | uint32_t total_cnt; |
| 5447 | uint32_t item_cnt; |
| 5448 | |
| 5449 | proto_item *ti; |
| 5450 | proto_tree *pdu_tree; |
| 5451 | |
| 5452 | /* this pdu */ |
| 5453 | acn_dmp_adt_type adt = {0,0,0,0,0,0}; |
| 5454 | const char *name; |
| 5455 | uint32_t vector; |
| 5456 | char *buffer; |
| 5457 | char *buf_ptr; |
| 5458 | unsigned x; |
| 5459 | uint8_t level; |
| 5460 | uint8_t min_char; |
| 5461 | uint8_t base; |
| 5462 | char leading_char; |
| 5463 | unsigned perline; |
| 5464 | unsigned halfline; |
| 5465 | uint16_t dmx_count; |
| 5466 | uint16_t dmx_start_code; |
| 5467 | uint16_t info_start_code; |
| 5468 | uint8_t dmx_2_start_code; |
| 5469 | |
| 5470 | buffer = (char*)wmem_alloc(pinfo->pool, BUFFER_SIZE128); |
| 5471 | buffer[0] = '\0'; |
| 5472 | |
| 5473 | begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_dmx_data_pdu, 1); |
| 5474 | |
| 5475 | /* Add PDU Length item */ |
| 5476 | proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 5477 | |
| 5478 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 1); |
| 5479 | /* offset should now be pointing to header (if one exists) */ |
| 5480 | |
| 5481 | /* Add Vector item */ |
| 5482 | vector = tvb_get_uint8(tvb, vector_offset); |
| 5483 | proto_tree_add_uint(pdu_tree, hf_acn_dmp_vector, tvb, vector_offset, 1, vector); |
| 5484 | |
| 5485 | /* Add Vector item to tree*/ |
| 5486 | name = val_to_str(pinfo->pool, vector, acn_dmp_vector_vals, "not valid (%d)"); |
| 5487 | proto_item_append_text(ti, ": "); |
| 5488 | proto_item_append_text(ti, "%s", name); |
| 5489 | |
| 5490 | dissect_pdu_bit_flag_h(&offset, pdu_flags, &header_offset, last_pdu_offsets, &pdu_flvh_length, 1); |
| 5491 | /* offset should now be pointing to data (if one exists) */ |
| 5492 | |
| 5493 | /* process based on vector */ |
| 5494 | acn_add_dmp_address_type(tvb, pinfo, pdu_tree, header_offset, &adt); |
| 5495 | |
| 5496 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 1); |
| 5497 | end_offset = data_offset + data_length; |
| 5498 | |
| 5499 | switch (vector) { |
| 5500 | case ACN_DMP_VECTOR_SET_PROPERTY2: |
| 5501 | dmx_start_code = tvb_get_ntohs(tvb, data_offset); |
| 5502 | if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) { |
| 5503 | proto_tree_add_item(pdu_tree, hf_acn_dmx_2_first_property_address, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5504 | } else { |
| 5505 | proto_tree_add_item(pdu_tree, hf_acn_dmx_start_code, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5506 | } |
| 5507 | data_offset += 2; |
| 5508 | proto_tree_add_item(pdu_tree, hf_acn_dmx_increment, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5509 | data_offset += 2; |
| 5510 | dmx_count = tvb_get_ntohs(tvb, data_offset); |
| 5511 | proto_tree_add_item(pdu_tree, hf_acn_dmx_count, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5512 | data_offset += 2; |
| 5513 | |
| 5514 | if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) { |
| 5515 | dmx_2_start_code = (uint8_t)tvb_get_ntohs(tvb, data_offset - 1); |
| 5516 | proto_tree_add_item(pdu_tree, hf_acn_dmx_2_start_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5517 | data_offset += 1; |
| 5518 | dmx_count -= 1; |
| 5519 | } |
| 5520 | |
| 5521 | buf_ptr = buffer; |
| 5522 | |
| 5523 | switch (global_acn_dmx_display_line_format) { |
| 5524 | case ACN_PREF_DMX_DISPLAY_16PL1: |
| 5525 | perline = 16; |
| 5526 | halfline = 8; |
| 5527 | break; |
| 5528 | default: |
| 5529 | perline = 20; |
| 5530 | halfline = 10; |
| 5531 | } |
| 5532 | |
| 5533 | /* values base on display mode */ |
| 5534 | switch ((unsigned)global_acn_dmx_display_view) { |
| 5535 | case ACN_PREF_DMX_DISPLAY_HEX0: |
| 5536 | min_char = 2; |
| 5537 | base = 16; |
| 5538 | break; |
| 5539 | /* case ACN_PREF_DMX_DISPLAY_PER: */ |
| 5540 | default: |
| 5541 | min_char = 3; |
| 5542 | base = 10; |
| 5543 | } |
| 5544 | |
| 5545 | /* do we display leading zeros */ |
| 5546 | if (global_acn_dmx_display_leading_zeros) { |
| 5547 | leading_char = '0'; |
| 5548 | } else { |
| 5549 | leading_char = ' '; |
| 5550 | } |
| 5551 | /* add a snippet to info (this may be slow) */ |
| 5552 | if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) { |
| 5553 | info_start_code = dmx_2_start_code; |
| 5554 | } |
| 5555 | else { |
| 5556 | info_start_code = dmx_start_code; |
| 5557 | } |
| 5558 | col_append_fstr(pinfo->cinfo,COL_INFO, ", Sc %02x, [%02x %02x %02x %02x %02x %02x...]", |
| 5559 | info_start_code, |
| 5560 | tvb_get_uint8(tvb, data_offset), |
| 5561 | tvb_get_uint8(tvb, data_offset+1), |
| 5562 | tvb_get_uint8(tvb, data_offset+2), |
| 5563 | tvb_get_uint8(tvb, data_offset+3), |
| 5564 | tvb_get_uint8(tvb, data_offset+4), |
| 5565 | tvb_get_uint8(tvb, data_offset+5)); |
| 5566 | |
| 5567 | /* add a header line */ |
| 5568 | *buf_ptr++ = ' '; |
| 5569 | *buf_ptr++ = ' '; |
| 5570 | *buf_ptr++ = ' '; |
| 5571 | for (x=0; x<perline; x++) { |
| 5572 | buf_ptr = ltos((uint8_t)(x+1), buf_ptr, 10, ' ', min_char, false0); |
| 5573 | if ((x+1)==halfline) { |
| 5574 | *buf_ptr++ = '|'; |
| 5575 | *buf_ptr++ = ' '; |
| 5576 | } |
| 5577 | } |
| 5578 | *buf_ptr = '\0'; |
| 5579 | proto_tree_add_string(pdu_tree, hf_acn_dmx_data, tvb, data_offset, dmx_count, buffer); |
| 5580 | |
| 5581 | /* start our line */ |
| 5582 | snprintf(buffer, BUFFER_SIZE128, "001-%03d: ", perline); |
| 5583 | buf_ptr = buffer + 9; |
| 5584 | |
| 5585 | total_cnt = 0; |
| 5586 | item_cnt = 0; |
| 5587 | for (x=data_offset; x<end_offset; x++) { |
| 5588 | level = tvb_get_uint8(tvb, x); |
| 5589 | if (global_acn_dmx_display_view == ACN_PREF_DMX_DISPLAY_PER2) { |
| 5590 | if ((level > 0) && (level < 3)) { |
| 5591 | level = 1; |
| 5592 | } else { |
| 5593 | level = level * 100 / 255; |
| 5594 | } |
| 5595 | } |
| 5596 | buf_ptr = ltos(level, buf_ptr, base, leading_char, min_char, global_acn_dmx_display_zeros); |
| 5597 | total_cnt++; |
| 5598 | item_cnt++; |
| 5599 | |
| 5600 | if (item_cnt == perline || x == (end_offset-1)) { |
| 5601 | /* add leader... */ |
| 5602 | proto_tree_add_string_format(pdu_tree, hf_acn_dmx_data, tvb, data_offset, item_cnt, buffer, "%s", buffer); |
| 5603 | data_offset += perline; |
| 5604 | snprintf(buffer, BUFFER_SIZE128, "%03d-%03d: ",total_cnt, total_cnt+perline); |
| 5605 | buf_ptr = buffer + 9; |
| 5606 | item_cnt = 0; |
| 5607 | } else { |
| 5608 | /* add separator character */ |
| 5609 | if (item_cnt == halfline) { |
| 5610 | *buf_ptr++ = '|'; |
| 5611 | *buf_ptr++ = ' '; |
| 5612 | *buf_ptr = '\0'; |
| 5613 | } |
| 5614 | } |
| 5615 | } |
| 5616 | /* NOTE: |
| 5617 | address data type (fixed at 0xA2) |
| 5618 | start code - 1 byte, reserved (should be 0) |
| 5619 | - 1 byte, start code (0x255) |
| 5620 | - 2 bytes, packet offset (should be 0000) |
| 5621 | address increment - 4 bytes (ignore) |
| 5622 | number of dmx values - 4 bytes (0-512) |
| 5623 | dmx values 0-512 bytes (data) |
| 5624 | */ |
| 5625 | |
| 5626 | break; |
| 5627 | } |
| 5628 | return pdu_start + pdu_length; |
| 5629 | } |
| 5630 | |
| 5631 | /******************************************************************************/ |
| 5632 | /* Dissect Common Base PDU */ |
| 5633 | static void |
| 5634 | dissect_acn_common_base_pdu(tvbuff_t *tvb, proto_tree *tree, int *offset, acn_pdu_offsets *last_pdu_offsets, uint8_t *pdu_flags, uint32_t *pdu_start, uint32_t *pdu_length, uint32_t *pdu_flvh_length, uint32_t *vector_offset, proto_item **ti, proto_tree **pdu_tree, int ett_base_pdu, uint8_t v_flag_increment, bool_Bool is_acn) |
| 5635 | { |
| 5636 | begin_dissect_acn_pdu(pdu_tree, tvb, ti, tree, pdu_start, offset, pdu_flags, pdu_length, pdu_flvh_length, ett_base_pdu, is_acn); |
| 5637 | |
| 5638 | /* Add PDU Length item */ |
| 5639 | if (is_acn) { |
| 5640 | proto_tree_add_uint(*pdu_tree, hf_acn_pdu_length, tvb, *pdu_start, *pdu_flvh_length, *pdu_length); |
| 5641 | } else { |
| 5642 | proto_tree_add_uint(*pdu_tree, hf_rdmnet_pdu_length, tvb, *pdu_start, *pdu_flvh_length, *pdu_length); |
| 5643 | } |
| 5644 | |
| 5645 | dissect_pdu_bit_flag_v(offset, *pdu_flags, vector_offset, last_pdu_offsets, pdu_flvh_length, v_flag_increment); |
| 5646 | /* offset should now be pointing to header (if one exists) */ |
| 5647 | } |
| 5648 | |
| 5649 | /******************************************************************************/ |
| 5650 | /* Dissect sACN Discovery PDU*/ |
| 5651 | #define DMX_UNIV_LIST_MAX_DIGITS5 5 |
| 5652 | #define DMX_UNIV_LIST_MAX_ITEMS_PER_LINE16 16 |
| 5653 | #define DMX_UNIV_LIST_BUF_SIZE(5 + 1) * 16 + 1 (DMX_UNIV_LIST_MAX_DIGITS5 + 1) * DMX_UNIV_LIST_MAX_ITEMS_PER_LINE16 + 1 |
| 5654 | static uint32_t |
| 5655 | dissect_acn_dmx_discovery_pdu(uint32_t protocol_id, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 5656 | { |
| 5657 | /* common to all pdu */ |
| 5658 | uint8_t pdu_flags; |
| 5659 | uint32_t pdu_start; |
| 5660 | uint32_t pdu_length; |
| 5661 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 5662 | uint32_t vector_offset; |
| 5663 | uint32_t data_offset; |
| 5664 | uint32_t end_offset; |
| 5665 | uint32_t data_length; |
| 5666 | uint32_t item_cnt; |
| 5667 | |
| 5668 | proto_item *ti; |
| 5669 | proto_tree *pdu_tree; |
| 5670 | |
| 5671 | /* this pdu */ |
| 5672 | const char *name; |
| 5673 | uint32_t vector; |
| 5674 | char *buffer; |
| 5675 | char *buf_ptr; |
| 5676 | unsigned x; |
| 5677 | uint16_t universe; |
| 5678 | uint16_t last_universe; |
| 5679 | |
| 5680 | uint32_t page; |
| 5681 | uint32_t lastpage; |
| 5682 | uint32_t current_universe_idx; |
| 5683 | uint32_t bytes_printed; |
| 5684 | bool_Bool warned_unorder_once; |
| 5685 | |
| 5686 | (void)protocol_id; |
| 5687 | warned_unorder_once = false0; |
| 5688 | |
| 5689 | buffer = (char*)wmem_alloc(pinfo->pool, DMX_UNIV_LIST_BUF_SIZE(5 + 1) * 16 + 1); |
| 5690 | buffer[0] = '\0'; |
| 5691 | |
| 5692 | data_length = 0; |
| 5693 | |
| 5694 | //discovery pdu |
| 5695 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_acn_dmx_pdu, 4, 1); |
| 5696 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 5697 | end_offset = data_offset + data_length; |
| 5698 | |
| 5699 | /* Add Vector item */ |
| 5700 | vector = tvb_get_ntohl(tvb, vector_offset); |
| 5701 | proto_tree_add_item(ti, hf_acn_dmx_discovery_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5702 | |
| 5703 | /* Add Vector item to tree*/ |
| 5704 | name = val_to_str(pinfo->pool, vector, acn_dmx_discovery_vector_vals, "not valid (%d)"); |
| 5705 | proto_item_append_text(ti, ": %s", name); |
| 5706 | |
| 5707 | page = tvb_get_uint8(tvb, data_offset); |
| 5708 | proto_tree_add_item(ti, hf_acn_dmx_discovery_page, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5709 | data_offset += 1; |
| 5710 | |
| 5711 | lastpage = tvb_get_uint8(tvb, data_offset); |
| 5712 | proto_tree_add_item(ti, hf_acn_dmx_discovery_last_page, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5713 | data_offset += 1; |
| 5714 | |
| 5715 | switch (vector) { |
| 5716 | case ACN_DMX_DISCOVERY_UNIVERSE_LIST_VECTOR1: |
| 5717 | buf_ptr = buffer; |
| 5718 | |
| 5719 | /* add a snippet to info (this may be slow) */ |
| 5720 | col_append_fstr(pinfo->cinfo,COL_INFO, ",[Universe Page %u/%u: ", page+1, lastpage+1); |
| 5721 | current_universe_idx = 0; |
| 5722 | while(data_offset + (sizeof(uint16_t)*current_universe_idx) != end_offset && current_universe_idx < 6) |
| 5723 | { |
| 5724 | col_append_fstr(pinfo->cinfo,COL_INFO, "%u ", tvb_get_uint16(tvb, data_offset + (sizeof(uint16_t)*current_universe_idx), ENC_BIG_ENDIAN0x00000000)); |
| 5725 | ++current_universe_idx; |
| 5726 | } |
| 5727 | if(data_offset + (sizeof(uint16_t)*current_universe_idx) != end_offset) |
| 5728 | col_append_str(pinfo->cinfo,COL_INFO, "..."); |
| 5729 | else if(current_universe_idx == 0) |
| 5730 | col_append_str(pinfo->cinfo,COL_INFO, "none"); |
| 5731 | |
| 5732 | col_append_str(pinfo->cinfo,COL_INFO, "]"); |
| 5733 | |
| 5734 | proto_tree_add_string(pdu_tree, hf_acn_dmx_discovery_universe_list, tvb, data_offset, end_offset-data_offset, ""); |
| 5735 | |
| 5736 | item_cnt = 0; |
| 5737 | last_universe = 0; |
| 5738 | for (x=data_offset; x<end_offset; x+=2) { |
| 5739 | universe = tvb_get_uint16(tvb, x, ENC_BIG_ENDIAN0x00000000); |
| 5740 | |
| 5741 | if(!warned_unorder_once && last_universe > universe) |
| 5742 | { |
| 5743 | expert_add_info(pinfo, pdu_tree, &ei_acn_dmx_discovery_outofseq); |
| 5744 | warned_unorder_once = true1; |
| 5745 | } |
| 5746 | bytes_printed = snprintf(buf_ptr, DMX_UNIV_LIST_BUF_SIZE(5 + 1) * 16 + 1, "%*u ", DMX_UNIV_LIST_MAX_DIGITS5 /*max 5 digits (1-63999), align right*/, universe); |
| 5747 | if(bytes_printed > 0) |
| 5748 | buf_ptr += bytes_printed; |
| 5749 | |
| 5750 | item_cnt++; |
| 5751 | if((item_cnt % DMX_UNIV_LIST_MAX_ITEMS_PER_LINE16) == 0 || x+2 >= end_offset) |
| 5752 | { |
| 5753 | proto_tree_add_string_format(pdu_tree, hf_acn_dmx_discovery_universe_list, tvb, data_offset, item_cnt*2, buffer, "%s", buffer); |
| 5754 | data_offset += item_cnt * 2; |
| 5755 | item_cnt = 0; |
| 5756 | |
| 5757 | buf_ptr = buffer; |
| 5758 | } |
| 5759 | |
| 5760 | last_universe = universe; |
| 5761 | } |
| 5762 | |
| 5763 | break; |
| 5764 | } |
| 5765 | return pdu_start + pdu_length; |
| 5766 | } |
| 5767 | |
| 5768 | /******************************************************************************/ |
| 5769 | /* Dissect DMX Base PDU */ |
| 5770 | static uint32_t |
| 5771 | dissect_acn_dmx_extension_base_pdu(uint32_t protocol_id, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 5772 | { |
| 5773 | (void)protocol_id; |
| 5774 | (void)pinfo; |
| 5775 | /* common to all pdu */ |
| 5776 | uint8_t pdu_flags; |
| 5777 | uint32_t pdu_start; |
| 5778 | uint32_t pdu_length; |
| 5779 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 5780 | uint32_t vector_offset; |
| 5781 | uint32_t data_offset; |
| 5782 | uint32_t data_length; |
| 5783 | |
| 5784 | proto_item *ti; |
| 5785 | proto_tree *pdu_tree; |
| 5786 | |
| 5787 | /* this pdu */ |
| 5788 | const char *name; |
| 5789 | uint32_t vector; |
| 5790 | |
| 5791 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_acn_dmx_pdu, 4, 1); |
| 5792 | |
| 5793 | /* Add Vector item */ |
| 5794 | vector = tvb_get_ntohl(tvb, vector_offset); |
| 5795 | proto_tree_add_item(pdu_tree, hf_acn_dmx_extension_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5796 | |
| 5797 | /* Add Vector item to tree*/ |
| 5798 | name = val_to_str(pinfo->pool, vector, acn_dmx_extension_vector_vals, "not valid (%d)"); |
| 5799 | proto_item_append_text(ti, ": %s", name); |
| 5800 | |
| 5801 | ///* NO HEADER DATA ON THESE* (at least so far) */ |
| 5802 | |
| 5803 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 5804 | |
| 5805 | ///* process based on vector */ |
| 5806 | switch (vector) { |
| 5807 | case ACN_DMX_EXT_DISCOVERY_VECTOR2: |
| 5808 | proto_tree_add_item(pdu_tree, hf_acn_dmx_source_name, tvb, data_offset, 64, ENC_UTF_80x00000002); |
| 5809 | data_offset += 64; |
| 5810 | |
| 5811 | proto_tree_add_item(pdu_tree, hf_acn_dmx_discovery_framing_reserved, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5812 | data_offset += 4; |
| 5813 | |
| 5814 | dissect_acn_dmx_discovery_pdu(protocol_id, tvb, pinfo, pdu_tree, data_offset, last_pdu_offsets); |
| 5815 | |
| 5816 | break; |
| 5817 | |
| 5818 | case ACN_DMX_EXT_SYNC_VECTOR1: |
| 5819 | proto_tree_add_item(ti, hf_acn_dmx_sequence_number, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5820 | data_offset += 1; |
| 5821 | |
| 5822 | proto_tree_add_item(ti, hf_acn_dmx_sync_universe, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5823 | data_offset += 2; |
| 5824 | |
| 5825 | proto_tree_add_item(ti, hf_acn_dmx_sync_reserved, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5826 | data_offset += 2; |
| 5827 | break; |
| 5828 | |
| 5829 | default: |
| 5830 | break; |
| 5831 | } |
| 5832 | return pdu_start + pdu_length; |
| 5833 | } |
| 5834 | |
| 5835 | /******************************************************************************/ |
| 5836 | /* Dissect DMX Base PDU */ |
| 5837 | static uint32_t |
| 5838 | dissect_acn_dmx_base_pdu(uint32_t protocol_id, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 5839 | { |
| 5840 | /* common to all pdu */ |
| 5841 | uint8_t pdu_flags; |
| 5842 | uint32_t pdu_start; |
| 5843 | uint32_t pdu_length; |
| 5844 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 5845 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 5846 | uint8_t option_flags; |
| 5847 | uint32_t vector_offset; |
| 5848 | uint32_t data_offset; |
| 5849 | uint32_t data_length; |
| 5850 | |
| 5851 | proto_item *ti, *pi; |
| 5852 | proto_tree *pdu_tree; |
| 5853 | proto_tree *flag_tree; |
| 5854 | |
| 5855 | /* this pdu */ |
| 5856 | const char *name; |
| 5857 | uint32_t vector; |
| 5858 | |
| 5859 | uint32_t universe; |
| 5860 | uint32_t priority; |
| 5861 | uint32_t sequence; |
| 5862 | |
| 5863 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_acn_dmx_pdu, 4, 1); |
| 5864 | |
| 5865 | /* Add Vector item */ |
| 5866 | vector = tvb_get_ntohl(tvb, vector_offset); |
| 5867 | proto_tree_add_item(pdu_tree, hf_acn_dmx_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5868 | /* vector_offset +=4; */ |
| 5869 | |
| 5870 | /* Add Vector item to tree*/ |
| 5871 | name = val_to_str(pinfo->pool, vector, acn_dmx_vector_vals, "not valid (%d)"); |
| 5872 | proto_item_append_text(ti, ": %s", name); |
| 5873 | |
| 5874 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 5875 | |
| 5876 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 5877 | |
| 5878 | /* process based on vector */ |
| 5879 | switch (vector) { |
| 5880 | case ACN_DMP_VECTOR_SET_PROPERTY2: |
| 5881 | if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) { |
| 5882 | proto_tree_add_item(pdu_tree, hf_acn_dmx_source_name, tvb, data_offset, 64, ENC_UTF_80x00000002); |
| 5883 | data_offset += 64; |
| 5884 | } else { |
| 5885 | proto_tree_add_item(pdu_tree, hf_acn_dmx_source_name, tvb, data_offset, 32, ENC_UTF_80x00000002); |
| 5886 | data_offset += 32; |
| 5887 | } |
| 5888 | |
| 5889 | priority = tvb_get_uint8(tvb, data_offset); |
| 5890 | proto_tree_add_item(pdu_tree, hf_acn_dmx_priority, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5891 | data_offset += 1; |
| 5892 | |
| 5893 | if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004) { |
| 5894 | proto_tree_add_item(pdu_tree, hf_acn_dmx_2_sync_universe, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5895 | data_offset += 2; |
| 5896 | } |
| 5897 | else if (protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) { |
| 5898 | //it is not clear if ssacn uses sync universes or not, leaving this as reserved (previous behavior) |
| 5899 | proto_tree_add_item(pdu_tree, hf_acn_dmx_3_reserved, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5900 | data_offset += 2; |
| 5901 | } |
| 5902 | |
| 5903 | sequence = tvb_get_uint8(tvb, data_offset); |
| 5904 | proto_tree_add_item(pdu_tree, hf_acn_dmx_sequence_number, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5905 | data_offset += 1; |
| 5906 | |
| 5907 | if (protocol_id == ACN_PROTOCOL_ID_DMX_20x00000004 || protocol_id == ACN_PROTOCOL_ID_DMX_30x50430001) { |
| 5908 | option_flags = tvb_get_uint8(tvb, data_offset); |
| 5909 | pi = proto_tree_add_uint(pdu_tree, hf_acn_dmx_2_options, tvb, data_offset, 1, option_flags); |
| 5910 | flag_tree = proto_item_add_subtree(pi, ett_acn_dmx_2_options); |
| 5911 | proto_tree_add_item(flag_tree, hf_acn_dmx_2_option_p, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5912 | proto_tree_add_item(flag_tree, hf_acn_dmx_2_option_s, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5913 | proto_tree_add_item(flag_tree, hf_acn_dmx_2_option_f, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 5914 | data_offset += 1; |
| 5915 | } |
| 5916 | |
| 5917 | universe = tvb_get_ntohs(tvb, data_offset); |
| 5918 | proto_tree_add_item(pdu_tree, hf_acn_dmx_universe, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5919 | data_offset += 2; |
| 5920 | |
| 5921 | /* add universe to info */ |
| 5922 | col_append_fstr(pinfo->cinfo,COL_INFO, ", Universe %d, Seq %3d", universe, sequence ); |
| 5923 | proto_item_append_text(ti, ", Universe: %d, Priority: %d", universe, priority); |
| 5924 | |
| 5925 | /*data_offset =*/ dissect_acn_dmx_data_pdu(protocol_id, tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 5926 | |
| 5927 | break; |
| 5928 | } |
| 5929 | return pdu_start + pdu_length; |
| 5930 | } |
| 5931 | |
| 5932 | /******************************************************************************/ |
| 5933 | /* Dissect SDT Base PDU */ |
| 5934 | static uint32_t |
| 5935 | dissect_acn_sdt_base_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 5936 | { |
| 5937 | /* common to all pdu */ |
| 5938 | uint8_t pdu_flags; |
| 5939 | uint32_t pdu_start; |
| 5940 | uint32_t pdu_length; |
| 5941 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 5942 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 5943 | uint32_t vector_offset; |
| 5944 | uint32_t data_offset; |
| 5945 | uint32_t end_offset; |
| 5946 | uint32_t old_offset; |
| 5947 | uint32_t data_length; |
| 5948 | |
| 5949 | proto_item *ti, *pi; |
| 5950 | proto_tree *pdu_tree; |
| 5951 | |
| 5952 | /* this pdu */ |
| 5953 | const char *name; |
| 5954 | uint32_t vector; |
| 5955 | uint32_t member_id; |
| 5956 | |
| 5957 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_acn_sdt_base_pdu, 1, 1); |
| 5958 | |
| 5959 | /* Add Vector item */ |
| 5960 | vector = tvb_get_uint8(tvb, vector_offset); |
| 5961 | proto_tree_add_uint(pdu_tree, hf_acn_sdt_vector, tvb, vector_offset, 1, vector); |
| 5962 | |
| 5963 | /* Add Vector item to tree*/ |
| 5964 | name = val_to_str(pinfo->pool, vector, acn_sdt_vector_vals, "not valid (%d)"); |
| 5965 | proto_item_append_text(ti, ": %s", name); |
| 5966 | /* proto_item_append_text(ti, "%s", name); */ |
| 5967 | |
| 5968 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 5969 | |
| 5970 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 1); |
| 5971 | end_offset = data_offset + data_length; |
| 5972 | |
| 5973 | /* process based on vector */ |
| 5974 | switch (vector) { |
| 5975 | case ACN_SDT_VECTOR_UNKNOWN0: |
| 5976 | break; |
| 5977 | case ACN_SDT_VECTOR_REL_WRAP1: |
| 5978 | case ACN_SDT_VECTOR_UNREL_WRAP2: |
| 5979 | proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5980 | data_offset += 2; |
| 5981 | proto_tree_add_item(pdu_tree, hf_acn_total_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5982 | data_offset += 4; |
| 5983 | proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5984 | data_offset += 4; |
| 5985 | proto_tree_add_item(pdu_tree, hf_acn_oldest_available_wrapper, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 5986 | data_offset += 4; |
| 5987 | proto_tree_add_item(pdu_tree, hf_acn_first_member_to_ack, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5988 | data_offset += 2; |
| 5989 | proto_tree_add_item(pdu_tree, hf_acn_last_member_to_ack, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5990 | data_offset += 2; |
| 5991 | proto_tree_add_item(pdu_tree, hf_acn_mak_threshold, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 5992 | data_offset += 2; |
| 5993 | |
| 5994 | while (data_offset < end_offset) { |
| 5995 | old_offset = data_offset; |
| 5996 | data_offset = dissect_acn_sdt_client_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 5997 | if (data_offset == old_offset) break; |
| 5998 | } |
| 5999 | break; |
| 6000 | case ACN_SDT_VECTOR_CHANNEL_PARAMS3: |
| 6001 | break; |
| 6002 | case ACN_SDT_VECTOR_JOIN4: |
| 6003 | proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 6004 | data_offset += 16; |
| 6005 | proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6006 | data_offset += 2; |
| 6007 | proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6008 | data_offset += 2; |
| 6009 | proto_tree_add_item(pdu_tree, hf_acn_reciprocal_channel, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6010 | data_offset += 2; |
| 6011 | proto_tree_add_item(pdu_tree, hf_acn_total_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6012 | data_offset += 4; |
| 6013 | proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6014 | data_offset += 4; |
| 6015 | data_offset = acn_add_address(tvb, pinfo, pdu_tree, data_offset, "Destination Address:"); |
| 6016 | data_offset = acn_add_channel_parameter(tvb, pinfo, pdu_tree, data_offset); |
| 6017 | /*data_offset =*/ acn_add_expiry(tvb, pinfo, pdu_tree, data_offset, hf_acn_adhoc_expiry); |
| 6018 | break; |
| 6019 | case ACN_SDT_VECTOR_JOIN_REFUSE5: |
| 6020 | pi = proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 6021 | data_offset += 16; |
| 6022 | proto_item_append_text(pi, "(Leader)"); |
| 6023 | proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6024 | data_offset += 2; |
| 6025 | proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6026 | data_offset += 2; |
| 6027 | proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6028 | data_offset += 4; |
| 6029 | proto_tree_add_item(pdu_tree, hf_acn_refuse_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 6030 | /*data_offset ++;*/ |
| 6031 | break; |
| 6032 | case ACN_SDT_VECTOR_JOIN_ACCEPT6: |
| 6033 | pi = proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 6034 | data_offset += 16; |
| 6035 | proto_item_append_text(pi, "(Leader)"); |
| 6036 | proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6037 | data_offset += 2; |
| 6038 | proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6039 | data_offset += 2; |
| 6040 | proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6041 | data_offset += 4; |
| 6042 | proto_tree_add_item(pdu_tree, hf_acn_reciprocal_channel, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6043 | /*data_offset += 2;*/ |
| 6044 | break; |
| 6045 | case ACN_SDT_VECTOR_LEAVE7: |
| 6046 | break; |
| 6047 | case ACN_SDT_VECTOR_LEAVING8: |
| 6048 | pi = proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 6049 | data_offset += 16; |
| 6050 | proto_item_append_text(pi, "(Leader)"); |
| 6051 | proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6052 | data_offset += 2; |
| 6053 | proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6054 | data_offset += 2; |
| 6055 | proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6056 | data_offset += 4; |
| 6057 | proto_tree_add_item(pdu_tree, hf_acn_reason_code, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 6058 | /* offset += 1; */ |
| 6059 | break; |
| 6060 | case ACN_SDT_VECTOR_CONNECT9: |
| 6061 | break; |
| 6062 | case ACN_SDT_VECTOR_CONNECT_ACCEPT10: |
| 6063 | break; |
| 6064 | case ACN_SDT_VECTOR_CONNECT_REFUSE11: |
| 6065 | break; |
| 6066 | case ACN_SDT_VECTOR_DISCONNECT12: |
| 6067 | break; |
| 6068 | case ACN_SDT_VECTOR_DISCONNECTING13: |
| 6069 | break; |
| 6070 | case ACN_SDT_VECTOR_ACK14: |
| 6071 | break; |
| 6072 | case ACN_SDT_VECTOR_NAK15: |
| 6073 | pi = proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 6074 | data_offset += 16; |
| 6075 | proto_item_append_text(pi, "(Leader)"); |
| 6076 | proto_tree_add_item(pdu_tree, hf_acn_channel_number, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6077 | data_offset += 2; |
| 6078 | proto_tree_add_item(pdu_tree, hf_acn_member_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6079 | data_offset += 2; |
| 6080 | proto_tree_add_item(pdu_tree, hf_acn_reliable_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6081 | data_offset += 4; |
| 6082 | proto_tree_add_item(pdu_tree, hf_acn_first_missed_sequence, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6083 | data_offset += 4; |
| 6084 | proto_tree_add_item(pdu_tree, hf_acn_last_missed_sequence, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6085 | /*data_offset += 4;*/ |
| 6086 | break; |
| 6087 | case ACN_SDT_VECTOR_GET_SESSION16: |
| 6088 | proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 6089 | /*data_offset += 16;*/ |
| 6090 | break; |
| 6091 | case ACN_SDT_VECTOR_SESSIONS17: |
| 6092 | member_id = tvb_get_ntohs(tvb, data_offset); |
| 6093 | switch (member_id) { |
| 6094 | case 0: |
| 6095 | /*data_offset =*/ acn_add_channel_owner_info_block(tvb, pinfo, pdu_tree, data_offset); |
| 6096 | break; |
| 6097 | case 1: |
| 6098 | /*data_offset =*/ acn_add_channel_member_info_block(tvb, pinfo, pdu_tree, data_offset); |
| 6099 | break; |
| 6100 | } |
| 6101 | break; |
| 6102 | } |
| 6103 | |
| 6104 | return pdu_start + pdu_length; |
| 6105 | } |
| 6106 | |
| 6107 | |
| 6108 | /******************************************************************************/ |
| 6109 | /* Add tree for RDM UID */ |
| 6110 | static uint32_t |
| 6111 | rdmnet_add_uid(tvbuff_t *tvb, proto_tree *tree, int offset, int hf_uid, int hf_uid_manf, int hf_uid_dev) |
| 6112 | { |
| 6113 | proto_item *ti; |
| 6114 | proto_tree *uid_tree; |
| 6115 | |
| 6116 | ti = proto_tree_add_item(tree, hf_uid, tvb, offset, 6, ENC_NA0x00000000); |
| 6117 | uid_tree = proto_item_add_subtree(ti, ett_rdmnet_uid); |
| 6118 | proto_tree_add_item(uid_tree, hf_uid_manf, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6119 | offset += 2; |
| 6120 | proto_tree_add_item(uid_tree, hf_uid_dev, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6121 | offset += 4; |
| 6122 | |
| 6123 | return offset; |
| 6124 | } |
| 6125 | |
| 6126 | /******************************************************************************/ |
| 6127 | /* Dissect LLRP Probe Request PDU */ |
| 6128 | static uint32_t |
| 6129 | dissect_llrp_probe_request_pdu(tvbuff_t *tvb, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6130 | { |
| 6131 | /* common to all pdu */ |
| 6132 | uint8_t pdu_flags; |
| 6133 | uint8_t vector; |
| 6134 | uint8_t filter_flags; |
| 6135 | uint32_t pdu_start; |
| 6136 | uint32_t pdu_length; |
| 6137 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6138 | uint32_t data_offset; |
| 6139 | uint32_t end_offset; |
| 6140 | |
| 6141 | proto_item *ti, *pi; |
| 6142 | proto_tree *flag_tree; |
| 6143 | proto_tree *pdu_tree; |
| 6144 | |
| 6145 | begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_rdmnet_llrp_probe_request_pdu, 0); |
| 6146 | |
| 6147 | /* Add PDU Length item */ |
| 6148 | proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 6149 | |
| 6150 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2); |
| 6151 | /* offset should now be pointing to header (if one exists) */ |
| 6152 | |
| 6153 | /* add vector item */ |
| 6154 | vector = tvb_get_uint8(tvb, data_offset); |
| 6155 | proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_vector, tvb, data_offset, 1, vector); |
| 6156 | |
| 6157 | dissect_pdu_bit_flag_h(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 6); |
| 6158 | data_offset -= 1; |
| 6159 | /* offset should now be pointing to data (if one exists) */ |
| 6160 | |
| 6161 | /* lower uid */ |
| 6162 | proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_probe_request_lower_uid, tvb, data_offset, 6, ENC_NA0x00000000); |
| 6163 | data_offset += 6; |
| 6164 | |
| 6165 | /* upper uid */ |
| 6166 | proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_probe_request_upper_uid, tvb, data_offset, 6, ENC_NA0x00000000); |
| 6167 | data_offset += 6; |
| 6168 | |
| 6169 | /* filter */ |
| 6170 | filter_flags = tvb_get_uint8(tvb, data_offset); |
| 6171 | filter_flags = filter_flags & 0x03; |
| 6172 | pi = proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_filter, tvb, data_offset, 1, filter_flags); |
| 6173 | flag_tree = proto_item_add_subtree(pi, ett_rdmnet_llrp_probe_request_filter_flags); |
| 6174 | proto_tree_add_item(flag_tree, hf_rdmnet_llrp_probe_request_filter_brokers_only, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 6175 | proto_tree_add_item(flag_tree, hf_rdmnet_llrp_probe_request_filter_client_tcp_inactive, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6176 | data_offset += 2; |
| 6177 | |
| 6178 | /* known uids */ |
| 6179 | end_offset = pdu_start + pdu_length; |
| 6180 | while (data_offset + 6 <= end_offset) { |
| 6181 | data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_llrp_probe_request_known_uid, |
| 6182 | hf_rdmnet_llrp_probe_request_known_uid_manf, hf_rdmnet_llrp_probe_request_known_uid_dev); |
| 6183 | } |
| 6184 | |
| 6185 | return pdu_start + pdu_length; |
| 6186 | } |
| 6187 | |
| 6188 | |
| 6189 | /******************************************************************************/ |
| 6190 | /* Dissect LLRP Probe Reply PDU */ |
| 6191 | static uint32_t |
| 6192 | dissect_llrp_probe_reply_pdu(tvbuff_t *tvb, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6193 | { |
| 6194 | /* common to all pdu */ |
| 6195 | uint8_t pdu_flags; |
| 6196 | uint8_t vector; |
| 6197 | uint32_t pdu_start; |
| 6198 | uint32_t pdu_length; |
| 6199 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6200 | uint32_t data_offset; |
| 6201 | |
| 6202 | proto_item *ti; |
| 6203 | proto_tree *pdu_tree; |
| 6204 | |
| 6205 | begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_rdmnet_llrp_probe_reply_pdu, 0); |
| 6206 | |
| 6207 | /* Add PDU Length item */ |
| 6208 | proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 6209 | |
| 6210 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2); |
| 6211 | /* offset should now be pointing to header (if one exists) */ |
| 6212 | |
| 6213 | /* add vector item */ |
| 6214 | vector = tvb_get_uint8(tvb, data_offset); |
| 6215 | proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_reply_vector, tvb, data_offset, 1, vector); |
| 6216 | |
| 6217 | dissect_pdu_bit_flag_h(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 6); |
| 6218 | data_offset -= 1; |
| 6219 | /* offset should now be pointing to data (if one exists) */ |
| 6220 | |
| 6221 | /* uid */ |
| 6222 | data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_llrp_probe_reply_uid, |
| 6223 | hf_rdmnet_llrp_probe_reply_uid_manf, hf_rdmnet_llrp_probe_reply_uid_dev); |
| 6224 | |
| 6225 | /* hardware address */ |
| 6226 | proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_probe_reply_hardware_address, tvb, data_offset, 6, ENC_NA0x00000000); |
| 6227 | data_offset += 6; |
| 6228 | |
| 6229 | /* component type */ |
| 6230 | proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_probe_reply_component_type, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 6231 | |
| 6232 | return pdu_start + pdu_length; |
| 6233 | } |
| 6234 | |
| 6235 | |
| 6236 | /******************************************************************************/ |
| 6237 | /* Dissect RDM Command */ |
| 6238 | static uint32_t |
| 6239 | dissect_rdm_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pdu_tree, uint32_t data_offset, uint32_t length) |
| 6240 | { |
| 6241 | bool_Bool save_info; |
| 6242 | bool_Bool save_protocol; |
| 6243 | uint32_t data_end; |
| 6244 | tvbuff_t *next_tvb; |
| 6245 | |
| 6246 | save_info = col_get_writable(pinfo->cinfo, COL_INFO); |
| 6247 | save_protocol = col_get_writable(pinfo->cinfo, COL_PROTOCOL); |
| 6248 | col_set_writable(pinfo->cinfo, COL_INFO, false0); |
| 6249 | col_set_writable(pinfo->cinfo, COL_PROTOCOL, false0); |
| 6250 | |
| 6251 | data_end = data_offset + length; |
| 6252 | next_tvb = tvb_new_subset_length(tvb, data_offset, length); |
| 6253 | call_dissector(rdm_handle, next_tvb, pinfo, pdu_tree); |
| 6254 | |
| 6255 | col_set_writable(pinfo->cinfo, COL_INFO, save_info); |
| 6256 | col_set_writable(pinfo->cinfo, COL_PROTOCOL, save_protocol); |
| 6257 | |
| 6258 | return data_end; |
| 6259 | } |
| 6260 | |
| 6261 | |
| 6262 | /******************************************************************************/ |
| 6263 | /* Dissect LLRP RDM Command PDU */ |
| 6264 | static uint32_t |
| 6265 | dissect_llrp_rdm_command_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6266 | { |
| 6267 | /* common to all pdu */ |
| 6268 | uint8_t pdu_flags; |
| 6269 | uint8_t vector; |
| 6270 | uint32_t pdu_start; |
| 6271 | uint32_t pdu_length; |
| 6272 | uint32_t pdu_end; |
| 6273 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6274 | uint32_t data_offset; |
| 6275 | |
| 6276 | proto_item *ti; |
| 6277 | proto_tree *pdu_tree; |
| 6278 | |
| 6279 | /* this pdu */ |
| 6280 | const char *name; |
| 6281 | |
| 6282 | begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_rdmnet_llrp_rdm_command_pdu, 0); |
| 6283 | |
| 6284 | /* Add PDU Length item */ |
| 6285 | proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_probe_request_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 6286 | |
| 6287 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2); |
| 6288 | /* offset should now be pointing to header (if one exists) */ |
| 6289 | |
| 6290 | /* add vector item */ |
| 6291 | vector = tvb_get_uint8(tvb, data_offset); |
| 6292 | proto_tree_add_uint(pdu_tree, hf_rdmnet_llrp_rdm_command_start_code, tvb, data_offset, 1, vector); |
| 6293 | |
| 6294 | /* Add Vector item to tree */ |
| 6295 | name = val_to_str(pinfo->pool, vector, rdmnet_llrp_rdm_command_start_code_vals, "unknown (%d)"); |
| 6296 | proto_item_append_text(ti, ": %s", name); |
| 6297 | |
| 6298 | dissect_pdu_bit_flag_h(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 6); |
| 6299 | data_offset -= 1; |
| 6300 | /* offset should now be pointing to data (if one exists) */ |
| 6301 | |
| 6302 | pdu_end = pdu_start + pdu_length; |
| 6303 | dissect_rdm_command(tvb, pinfo, pdu_tree, data_offset, (pdu_length-4)); |
| 6304 | |
| 6305 | return pdu_end; |
| 6306 | } |
| 6307 | |
| 6308 | |
| 6309 | /******************************************************************************/ |
| 6310 | /* Dissect LLRP Base PDU */ |
| 6311 | static uint32_t |
| 6312 | dissect_acn_llrp_base_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6313 | { |
| 6314 | uint8_t pdu_flags; |
| 6315 | uint32_t pdu_start; |
| 6316 | uint32_t pdu_length; |
| 6317 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6318 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 6319 | uint32_t vector_offset; |
| 6320 | uint32_t data_offset; |
| 6321 | uint32_t data_length; |
| 6322 | e_guid_t guid; |
| 6323 | |
| 6324 | proto_item *ti; |
| 6325 | proto_tree *pdu_tree; |
| 6326 | |
| 6327 | /* this pdu */ |
| 6328 | const char *name; |
| 6329 | uint32_t vector; |
| 6330 | |
| 6331 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_llrp_base_pdu, 1, 0); |
| 6332 | |
| 6333 | /* Add Vector item */ |
| 6334 | vector = tvb_get_ntohl(tvb, vector_offset); |
| 6335 | proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6336 | |
| 6337 | /* Add Vector item to tree */ |
| 6338 | name = val_to_str(pinfo->pool, vector, rdmnet_llrp_vector_vals, "unknown (%d)"); |
| 6339 | proto_item_append_text(ti, ": %s", name); |
| 6340 | |
| 6341 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 6342 | |
| 6343 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 6344 | data_offset += 3; |
| 6345 | |
| 6346 | /* get destination (CID) 16 bytes */ |
| 6347 | proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_destination_cid, tvb, data_offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 6348 | tvb_get_guid(tvb, data_offset, &guid, ENC_BIG_ENDIAN0x00000000); |
| 6349 | proto_item_append_text(ti, ", Dest: %s", guid_to_str(pinfo->pool, &guid)); |
| 6350 | data_offset += 16; |
| 6351 | |
| 6352 | /* transaction number (4 bytes) */ |
| 6353 | proto_tree_add_item(pdu_tree, hf_rdmnet_llrp_transaction_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6354 | data_offset += 4; |
| 6355 | |
| 6356 | /* process based on vector */ |
| 6357 | switch (vector) { |
| 6358 | case RDMNET_LLRP_VECTOR_PROBE_REQUEST0x00000001: |
| 6359 | dissect_llrp_probe_request_pdu(tvb, pdu_tree, data_offset, &pdu_offsets); |
| 6360 | break; |
| 6361 | case RDMNET_LLRP_VECTOR_PROBE_REPLY0x00000002: |
| 6362 | dissect_llrp_probe_reply_pdu(tvb, pdu_tree, data_offset, &pdu_offsets); |
| 6363 | break; |
| 6364 | case RDMNET_LLRP_VECTOR_RDM_CMD0x00000003: |
| 6365 | dissect_llrp_rdm_command_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 6366 | break; |
| 6367 | } |
| 6368 | |
| 6369 | return pdu_start + pdu_length; |
| 6370 | } |
| 6371 | |
| 6372 | |
| 6373 | /******************************************************************************/ |
| 6374 | /* Dissect Broker Client Entry PDU */ |
| 6375 | static uint32_t |
| 6376 | dissect_broker_client_entry_pdu(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6377 | { |
| 6378 | uint8_t pdu_flags; |
| 6379 | uint32_t pdu_start; |
| 6380 | uint32_t pdu_length; |
| 6381 | uint32_t pdu_end; |
| 6382 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6383 | uint32_t vector_offset; |
| 6384 | uint32_t data_offset; |
| 6385 | uint32_t data_length; |
| 6386 | |
| 6387 | proto_item *ti; |
| 6388 | proto_item *ti2; |
| 6389 | proto_tree *pdu_tree; |
| 6390 | proto_tree *pdu_tree2; |
| 6391 | |
| 6392 | /* this pdu */ |
| 6393 | const char *name; |
| 6394 | uint32_t vector; |
| 6395 | |
| 6396 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_broker_client_entry_pdu, 1, 0); |
| 6397 | pdu_end = pdu_start + pdu_length; |
| 6398 | |
| 6399 | /* Add Vector item */ |
| 6400 | vector = tvb_get_ntohl(tvb, vector_offset); |
| 6401 | proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_protocol_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6402 | |
| 6403 | /* Add Vector item to tree */ |
| 6404 | name = val_to_str(pinfo->pool, vector, broker_client_protocol_vals, "unknown (%d)"); |
| 6405 | proto_item_append_text(ti, ": %s", name); |
| 6406 | |
| 6407 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 6408 | |
| 6409 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 6410 | data_offset += 3; |
| 6411 | |
| 6412 | /* client protocol cid */ |
| 6413 | proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_protocol_cid, tvb, data_offset, 16, ENC_NA0x00000000); |
| 6414 | data_offset += 16; |
| 6415 | |
| 6416 | /* process based on vector */ |
| 6417 | switch (vector) { |
| 6418 | case RDMNET_CLIENT_PROTOCOL_RPT0x00000005: |
| 6419 | /* client uid */ |
| 6420 | data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_broker_client_rpt_client_uid, |
| 6421 | hf_rdmnet_broker_client_rpt_client_uid_manf, hf_rdmnet_broker_client_rpt_client_uid_dev); |
| 6422 | |
| 6423 | /* client type */ |
| 6424 | proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_rpt_client_type, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 6425 | data_offset += 1; |
| 6426 | |
| 6427 | /* binding cid */ |
| 6428 | proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_rpt_binding_cid, tvb, data_offset, 16, ENC_NA0x00000000); |
| 6429 | data_offset += 16; |
| 6430 | break; |
| 6431 | case RDMNET_CLIENT_PROTOCOL_EPT0x0000000B: |
| 6432 | while ((unsigned)offset + 36 < pdu_end) { |
| 6433 | /* protocol vector (manufacturer id + protocol id) */ |
| 6434 | ti2 = proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_ept_protocol_vector, tvb, data_offset, 4, ENC_NA0x00000000); |
| 6435 | pdu_tree2 = proto_item_add_subtree(ti2, ett_rdmnet_broker_client_entry_manufacturer_protocol_ids); |
| 6436 | proto_tree_add_item(pdu_tree2, hf_rdmnet_broker_client_ept_protocol_manufacturer_id, tvb, 0, 2, ENC_BIG_ENDIAN0x00000000); |
| 6437 | proto_tree_add_item(pdu_tree2, hf_rdmnet_broker_client_ept_protocol_protocol_id, tvb, 2, 2, ENC_BIG_ENDIAN0x00000000); |
| 6438 | offset += 4; |
| 6439 | |
| 6440 | /* protocol string */ |
| 6441 | proto_tree_add_item(pdu_tree, hf_rdmnet_broker_client_ept_protocol_string, tvb, data_offset, 32, ENC_ASCII0x00000000); |
| 6442 | data_offset += 32; |
| 6443 | } |
| 6444 | break; |
| 6445 | } |
| 6446 | |
| 6447 | return pdu_end; |
| 6448 | } |
| 6449 | |
| 6450 | |
| 6451 | /******************************************************************************/ |
| 6452 | /* Dissect Broker Connect */ |
| 6453 | static uint32_t |
| 6454 | dissect_broker_connect(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets, uint32_t pdu_end) |
| 6455 | { |
| 6456 | uint8_t connection_flags; |
| 6457 | proto_item *pi; |
| 6458 | proto_tree *flag_tree; |
| 6459 | |
| 6460 | /* client scope */ |
| 6461 | proto_tree_add_item(tree, hf_rdmnet_broker_connect_client_scope, tvb, offset, 63, ENC_ASCII0x00000000); |
| 6462 | offset += 63; |
| 6463 | |
| 6464 | /* e133 version */ |
| 6465 | proto_tree_add_item(tree, hf_rdmnet_broker_connect_e133_version, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6466 | offset += 2; |
| 6467 | |
| 6468 | /* search domain */ |
| 6469 | proto_tree_add_item(tree, hf_rdmnet_broker_connect_search_domain, tvb, offset, 231, ENC_ASCII0x00000000); |
| 6470 | offset += 231; |
| 6471 | |
| 6472 | /* connection flags */ |
| 6473 | connection_flags = tvb_get_uint8(tvb, offset); |
| 6474 | connection_flags = connection_flags & 0x01; |
| 6475 | pi = proto_tree_add_uint(tree, hf_rdmnet_broker_connect_connection_flags, tvb, offset, 1, connection_flags); |
| 6476 | flag_tree = proto_item_add_subtree(pi, ett_rdmnet_broker_connect_connection_flags); |
| 6477 | proto_tree_add_item(flag_tree, hf_rdmnet_broker_connect_connection_flags_incremental_updates, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 6478 | offset += 1; |
| 6479 | |
| 6480 | /* client_entry_pdu */ |
| 6481 | dissect_broker_client_entry_pdu(tvb, pinfo, tree, offset, last_pdu_offsets); |
| 6482 | |
| 6483 | return pdu_end; |
| 6484 | } |
| 6485 | |
| 6486 | |
| 6487 | /******************************************************************************/ |
| 6488 | /* Dissect Broker Connect Reply */ |
| 6489 | static uint32_t |
| 6490 | dissect_broker_connect_reply(tvbuff_t *tvb, proto_tree *tree, int offset) |
| 6491 | { |
| 6492 | /* connection code */ |
| 6493 | proto_tree_add_item(tree, hf_rdmnet_broker_connect_reply_connection_code, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6494 | offset += 2; |
| 6495 | |
| 6496 | /* e133 version */ |
| 6497 | proto_tree_add_item(tree, hf_rdmnet_broker_connect_reply_e133_version, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6498 | offset += 2; |
| 6499 | |
| 6500 | /* broker uid */ |
| 6501 | offset = rdmnet_add_uid(tvb, tree, offset, hf_rdmnet_broker_connect_reply_broker_uid, |
| 6502 | hf_rdmnet_broker_connect_reply_broker_uid_manf, hf_rdmnet_broker_connect_reply_broker_uid_dev); |
| 6503 | |
| 6504 | /* client uid */ |
| 6505 | offset = rdmnet_add_uid(tvb, tree, offset, hf_rdmnet_broker_connect_reply_client_uid, |
Value stored to 'offset' is never read | |
| 6506 | hf_rdmnet_broker_connect_reply_client_uid_manf, hf_rdmnet_broker_connect_reply_client_uid_dev); |
| 6507 | |
| 6508 | return 0; |
| 6509 | } |
| 6510 | |
| 6511 | |
| 6512 | /******************************************************************************/ |
| 6513 | /* Dissect Broker Client Entry Update */ |
| 6514 | static uint32_t |
| 6515 | dissect_broker_client_entry_update(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets, uint32_t pdu_end) |
| 6516 | { |
| 6517 | uint8_t connection_flags; |
| 6518 | |
| 6519 | proto_item *pi; |
| 6520 | proto_tree *flag_tree; |
| 6521 | |
| 6522 | /* connection flags */ |
| 6523 | connection_flags = tvb_get_uint8(tvb, offset); |
| 6524 | connection_flags = connection_flags & 0x01; |
| 6525 | pi = proto_tree_add_uint(tree, hf_rdmnet_broker_client_entry_update_connection_flags, tvb, offset, 1, connection_flags); |
| 6526 | flag_tree = proto_item_add_subtree(pi, ett_rdmnet_broker_client_entry_update_connection_flags); |
| 6527 | proto_tree_add_item(flag_tree, hf_rdmnet_broker_client_entry_update_connection_flags_incremental_updates, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 6528 | offset += 1; |
| 6529 | |
| 6530 | /* client_entry_pdu */ |
| 6531 | dissect_broker_client_entry_pdu(tvb, pinfo, tree, offset, last_pdu_offsets); |
| 6532 | |
| 6533 | return pdu_end; |
| 6534 | } |
| 6535 | |
| 6536 | |
| 6537 | /******************************************************************************/ |
| 6538 | /* Dissect Broker Redirect V4 */ |
| 6539 | static uint32_t |
| 6540 | dissect_broker_redirect_v4(tvbuff_t *tvb, proto_tree *tree, int offset) |
| 6541 | { |
| 6542 | /* ipv4 address */ |
| 6543 | proto_tree_add_item(tree, hf_rdmnet_broker_redirect_ipv4_address, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6544 | offset += 4; |
| 6545 | |
| 6546 | /* tcp port */ |
| 6547 | proto_tree_add_item(tree, hf_rdmnet_broker_redirect_ipv4_tcp_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6548 | |
| 6549 | return 0; |
| 6550 | } |
| 6551 | |
| 6552 | |
| 6553 | /******************************************************************************/ |
| 6554 | /* Dissect Broker Redirect V6 */ |
| 6555 | static uint32_t |
| 6556 | dissect_broker_redirect_v6(tvbuff_t *tvb, proto_tree *tree, int offset) |
| 6557 | { |
| 6558 | /* ipv6 address */ |
| 6559 | proto_tree_add_item(tree, hf_rdmnet_broker_redirect_ipv6_address, tvb, offset, 16, ENC_NA0x00000000); |
| 6560 | offset += 16; |
| 6561 | |
| 6562 | /* tcp port */ |
| 6563 | proto_tree_add_item(tree, hf_rdmnet_broker_redirect_ipv6_tcp_port, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6564 | |
| 6565 | return 0; |
| 6566 | } |
| 6567 | |
| 6568 | |
| 6569 | /******************************************************************************/ |
| 6570 | /* Dissect Broker Disconnect */ |
| 6571 | static uint32_t |
| 6572 | dissect_broker_disconnect(tvbuff_t *tvb, proto_tree *tree, int offset) |
| 6573 | { |
| 6574 | /* disconnect reason */ |
| 6575 | proto_tree_add_item(tree, hf_rdmnet_broker_disconnect_reason, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6576 | |
| 6577 | return 0; |
| 6578 | } |
| 6579 | |
| 6580 | |
| 6581 | /******************************************************************************/ |
| 6582 | /* Dissect Broker Request Dynamic UIDs */ |
| 6583 | static uint32_t |
| 6584 | dissect_broker_request_dynamic_uids(tvbuff_t *tvb, proto_tree *tree, uint32_t offset, uint32_t pdu_end) |
| 6585 | { |
| 6586 | /* packed list of dynamic uid request (6 bytes) and rid (16 bytes) */ |
| 6587 | while (offset + 22 < pdu_end) { |
| 6588 | /* dynamic uid request (6 bytes) */ |
| 6589 | proto_tree_add_item(tree, hf_rdmnet_broker_dynamic_uid_request, tvb, offset, 6, ENC_NA0x00000000); |
| 6590 | offset += 6; |
| 6591 | |
| 6592 | /* rid (16 bytes) */ |
| 6593 | proto_tree_add_item(tree, hf_rdmnet_broker_rid, tvb, offset, 16, ENC_NA0x00000000); |
| 6594 | offset += 16; |
| 6595 | } |
| 6596 | |
| 6597 | return 0; |
| 6598 | } |
| 6599 | |
| 6600 | |
| 6601 | /******************************************************************************/ |
| 6602 | /* Dissect Broker Assigned Dynamic UIDs */ |
| 6603 | static uint32_t |
| 6604 | dissect_broker_assigned_dynamic_uids(tvbuff_t *tvb, proto_tree *tree, uint32_t offset, uint32_t pdu_end) |
| 6605 | { |
| 6606 | /* packed list of dynamic uid request (6 bytes), rid (16 bytes), and status_code (2 bytes) */ |
| 6607 | while (offset + 24 < pdu_end) { |
| 6608 | /* dynamic uid request (6 bytes) */ |
| 6609 | proto_tree_add_item(tree, hf_rdmnet_broker_assigned_dynamic_uid, tvb, offset, 6, ENC_NA0x00000000); |
| 6610 | offset += 6; |
| 6611 | |
| 6612 | /* rid (16 bytes) */ |
| 6613 | proto_tree_add_item(tree, hf_rdmnet_broker_assigned_rid, tvb, offset, 16, ENC_NA0x00000000); |
| 6614 | offset += 16; |
| 6615 | |
| 6616 | /* status code (2 bytes) */ |
| 6617 | proto_tree_add_item(tree, hf_rdmnet_broker_assigned_status_code, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6618 | offset += 2; |
| 6619 | } |
| 6620 | |
| 6621 | return 0; |
| 6622 | } |
| 6623 | |
| 6624 | |
| 6625 | /******************************************************************************/ |
| 6626 | /* Dissect Broker Fetch Dynamic UIDs */ |
| 6627 | static uint32_t |
| 6628 | dissect_broker_fetch_dynamic_uids(tvbuff_t *tvb, proto_tree *tree, uint32_t offset, uint32_t pdu_end) |
| 6629 | { |
| 6630 | /* packed list of dynamic uid request (6 bytes) */ |
| 6631 | while (offset + 6 < pdu_end) { |
| 6632 | /* dynamic uid request (6 bytes) */ |
| 6633 | proto_tree_add_item(tree, hf_rdmnet_broker_fetch_dynamic_uid, tvb, offset, 6, ENC_NA0x00000000); |
| 6634 | offset += 6; |
| 6635 | } |
| 6636 | |
| 6637 | return 0; |
| 6638 | } |
| 6639 | |
| 6640 | |
| 6641 | /******************************************************************************/ |
| 6642 | /* Dissect Broker Base PDU */ |
| 6643 | static uint32_t |
| 6644 | dissect_acn_broker_base_pdu(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6645 | { |
| 6646 | uint8_t pdu_flags; |
| 6647 | uint32_t pdu_start; |
| 6648 | uint32_t pdu_length; |
| 6649 | uint32_t pdu_end; |
| 6650 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6651 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 6652 | uint32_t vector_offset; |
| 6653 | uint32_t data_offset; |
| 6654 | uint32_t old_offset; |
| 6655 | uint32_t end_offset; |
| 6656 | uint32_t data_length; |
| 6657 | |
| 6658 | proto_item *ti; |
| 6659 | proto_tree *pdu_tree; |
| 6660 | |
| 6661 | /* this pdu */ |
| 6662 | const char *name; |
| 6663 | uint16_t vector; |
| 6664 | |
| 6665 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_broker_base_pdu, 1, 0); |
| 6666 | pdu_end = pdu_start + pdu_length; |
| 6667 | |
| 6668 | /* Add Vector item */ |
| 6669 | vector = tvb_get_ntohs(tvb, vector_offset); |
| 6670 | proto_tree_add_item(pdu_tree, hf_rdmnet_broker_vector, tvb, vector_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6671 | |
| 6672 | /* Add Vector item to tree */ |
| 6673 | name = val_to_str(pinfo->pool, vector, rdmnet_broker_vector_vals, "unknown (%d)"); |
| 6674 | proto_item_append_text(ti, ": %s", name); |
| 6675 | |
| 6676 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 6677 | |
| 6678 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 6679 | data_offset += 1; |
| 6680 | |
| 6681 | /* process based on vector */ |
| 6682 | switch (vector) { |
| 6683 | case RDMNET_BROKER_VECTOR_FETCH_CLIENT_LIST0x0006: |
| 6684 | case RDMNET_BROKER_VECTOR_NULL0x000F: |
| 6685 | /* no data */ |
| 6686 | break; |
| 6687 | case RDMNET_BROKER_VECTOR_CONNECTED_CLIENT_LIST0x0007: |
| 6688 | case RDMNET_BROKER_VECTOR_CLIENT_ADD0x0008: |
| 6689 | case RDMNET_BROKER_VECTOR_CLIENT_REMOVE0x0009: |
| 6690 | case RDMNET_BROKER_VECTOR_CLIENT_ENTRY_CHANGE0x000A: |
| 6691 | end_offset = pdu_start + pdu_length; |
| 6692 | while (data_offset < end_offset) { |
| 6693 | old_offset = data_offset; |
| 6694 | data_offset = dissect_broker_client_entry_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 6695 | if (data_offset == old_offset) break; |
| 6696 | } |
| 6697 | break; |
| 6698 | case RDMNET_BROKER_VECTOR_CONNECT0x0001: |
| 6699 | dissect_broker_connect(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets, pdu_end); |
| 6700 | break; |
| 6701 | case RDMNET_BROKER_VECTOR_CONNECT_REPLY0x0002: |
| 6702 | dissect_broker_connect_reply(tvb, pdu_tree, data_offset); |
| 6703 | break; |
| 6704 | case RDMNET_BROKER_VECTOR_CLIENT_ENTRY_UPDATE0x0003: |
| 6705 | dissect_broker_client_entry_update(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets, pdu_end); |
| 6706 | break; |
| 6707 | case RDMNET_BROKER_VECTOR_REDIRECT_V40x0004: |
| 6708 | dissect_broker_redirect_v4(tvb, pdu_tree, data_offset); |
| 6709 | break; |
| 6710 | case RDMNET_BROKER_VECTOR_REDIRECT_V60x0005: |
| 6711 | dissect_broker_redirect_v6(tvb, pdu_tree, data_offset); |
| 6712 | break; |
| 6713 | case RDMNET_BROKER_VECTOR_DISCONNECT0x000E: |
| 6714 | dissect_broker_disconnect(tvb, pdu_tree, data_offset); |
| 6715 | break; |
| 6716 | case RDMNET_BROKER_VECTOR_REQUEST_DYNAMIC_UIDS0x000B: |
| 6717 | dissect_broker_request_dynamic_uids(tvb, pdu_tree, data_offset, pdu_end); |
| 6718 | break; |
| 6719 | case RDMNET_BROKER_VECTOR_ASSIGNED_DYNAMIC_UIDS0x000C: |
| 6720 | dissect_broker_assigned_dynamic_uids(tvb, pdu_tree, data_offset, pdu_end); |
| 6721 | break; |
| 6722 | case RDMNET_BROKER_VECTOR_FETCH_DYNAMIC_UID_LIST0x000D: |
| 6723 | dissect_broker_fetch_dynamic_uids(tvb, pdu_tree, data_offset, pdu_end); |
| 6724 | break; |
| 6725 | } |
| 6726 | |
| 6727 | return pdu_start + pdu_length; |
| 6728 | } |
| 6729 | |
| 6730 | |
| 6731 | /******************************************************************************/ |
| 6732 | /* Dissect RPT Request RDM Command */ |
| 6733 | static uint32_t |
| 6734 | dissect_rpt_request_rdm_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6735 | { |
| 6736 | uint8_t pdu_flags; |
| 6737 | uint32_t pdu_start; |
| 6738 | uint32_t pdu_length; |
| 6739 | uint32_t pdu_end; |
| 6740 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6741 | uint32_t vector_offset; |
| 6742 | uint32_t data_offset; |
| 6743 | uint32_t data_length; |
| 6744 | |
| 6745 | proto_item *ti; |
| 6746 | proto_tree *pdu_tree; |
| 6747 | |
| 6748 | /* this pdu */ |
| 6749 | const char *name; |
| 6750 | uint8_t vector; |
| 6751 | |
| 6752 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_request_pdu, 1, 0); |
| 6753 | |
| 6754 | /* Add Vector item */ |
| 6755 | vector = tvb_get_uint8(tvb, vector_offset); |
| 6756 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_request_rdm_command, tvb, vector_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 6757 | |
| 6758 | /* Add Vector item to tree */ |
| 6759 | name = val_to_str(pinfo->pool, vector, rdmnet_rpt_request_rdm_command_start_code_vals, "unknown (%d)"); |
| 6760 | proto_item_append_text(ti, ": %s", name); |
| 6761 | |
| 6762 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 6763 | |
| 6764 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 6765 | /* data_offset += 3; */ |
| 6766 | |
| 6767 | pdu_end = pdu_start + pdu_length; |
| 6768 | dissect_rdm_command(tvb, pinfo, pdu_tree, data_offset, (pdu_length-4)); |
| 6769 | |
| 6770 | return pdu_end; |
| 6771 | } |
| 6772 | |
| 6773 | |
| 6774 | /******************************************************************************/ |
| 6775 | /* Dissect RPT Request */ |
| 6776 | static uint32_t |
| 6777 | dissect_rpt_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6778 | { |
| 6779 | uint8_t pdu_flags; |
| 6780 | uint32_t pdu_start; |
| 6781 | uint32_t pdu_length; |
| 6782 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6783 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 6784 | uint32_t vector_offset; |
| 6785 | uint32_t data_offset; |
| 6786 | uint32_t data_length; |
| 6787 | |
| 6788 | proto_item *ti; |
| 6789 | proto_tree *pdu_tree; |
| 6790 | |
| 6791 | /* this pdu */ |
| 6792 | const char *name; |
| 6793 | uint32_t vector; |
| 6794 | |
| 6795 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_request_pdu, 1, 0); |
| 6796 | |
| 6797 | /* Add Vector item */ |
| 6798 | vector = tvb_get_ntohl(tvb, vector_offset); |
| 6799 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_request_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6800 | |
| 6801 | /* Add Vector item to tree */ |
| 6802 | name = val_to_str(pinfo->pool, vector, rdmnet_rpt_request_vals, "unknown (%d)"); |
| 6803 | proto_item_append_text(ti, ": %s", name); |
| 6804 | |
| 6805 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 6806 | |
| 6807 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 6808 | data_offset += 3; |
| 6809 | |
| 6810 | /* rdm command */ |
| 6811 | dissect_rpt_request_rdm_command(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 6812 | |
| 6813 | return 0; |
| 6814 | } |
| 6815 | |
| 6816 | |
| 6817 | /******************************************************************************/ |
| 6818 | /* Dissect RPT Status */ |
| 6819 | static uint32_t |
| 6820 | dissect_rpt_status(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6821 | { |
| 6822 | uint8_t pdu_flags; |
| 6823 | uint32_t pdu_start; |
| 6824 | uint32_t pdu_length; |
| 6825 | uint32_t pdu_end; |
| 6826 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6827 | uint32_t vector_offset; |
| 6828 | uint32_t data_offset; |
| 6829 | uint32_t data_length; |
| 6830 | |
| 6831 | proto_item *ti; |
| 6832 | proto_tree *pdu_tree; |
| 6833 | |
| 6834 | /* this pdu */ |
| 6835 | const char *name; |
| 6836 | uint16_t vector; |
| 6837 | |
| 6838 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_status_pdu, 1, 0); |
| 6839 | |
| 6840 | /* Add Vector item */ |
| 6841 | vector = tvb_get_ntohs(tvb, vector_offset); |
| 6842 | proto_item_append_text(ti, ", vector = %u", vector); |
| 6843 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_vector, tvb, vector_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 6844 | |
| 6845 | /* Add Vector item to tree */ |
| 6846 | name = val_to_str(pinfo->pool, vector, rdmnet_rpt_status_vector_vals, "unknown (%d)"); |
| 6847 | proto_item_append_text(ti, ": %s", name); |
| 6848 | |
| 6849 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 6850 | |
| 6851 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 6852 | data_offset += 3; |
| 6853 | |
| 6854 | pdu_end = pdu_start + pdu_length; |
| 6855 | switch (vector) { |
| 6856 | case RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RPT_UID0x0001: |
| 6857 | if (pdu_end > data_offset) { |
| 6858 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_unknown_rpt_uid_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000); |
| 6859 | } |
| 6860 | break; |
| 6861 | case RDMNET_RPT_VECTOR_STATUS_RDM_TIMEOUT0x0002: |
| 6862 | if (pdu_end > data_offset) { |
| 6863 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_rdm_timeout_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000); |
| 6864 | } |
| 6865 | break; |
| 6866 | case RDMNET_RPT_VECTOR_STATUS_RDM_INVALID_RESPONSE0x0003: |
| 6867 | if (pdu_end > data_offset) { |
| 6868 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_rdm_invalid_response_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000); |
| 6869 | } |
| 6870 | break; |
| 6871 | case RDMNET_RPT_VECTOR_STATUS_UNKNOWN_RDM_UID0x0004: |
| 6872 | if (pdu_end > data_offset) { |
| 6873 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_unknown_rdm_uid_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000); |
| 6874 | } |
| 6875 | break; |
| 6876 | case RDMNET_RPT_VECTOR_STATUS_UNKNOWN_ENDPOINT0x0005: |
| 6877 | if (pdu_end > data_offset) { |
| 6878 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_unknown_endpoint_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000); |
| 6879 | } |
| 6880 | break; |
| 6881 | case RDMNET_RPT_VECTOR_STATUS_BROADCAST_COMPLETE0x0006: |
| 6882 | if (pdu_end > data_offset) { |
| 6883 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_broadcast_complete_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000); |
| 6884 | } |
| 6885 | break; |
| 6886 | case RDMNET_RPT_VECTOR_STATUS_UNKNOWN_VECTOR0x0007: |
| 6887 | if (pdu_end > data_offset) { |
| 6888 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_status_unknown_vector_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000); |
| 6889 | } |
| 6890 | break; |
| 6891 | case RDMNET_RPT_VECTOR_STATUS_INVALID_MESSAGE0x0008: |
| 6892 | case RDMNET_RPT_VECTOR_STATUS_INVALID_COMMAND_CLASS0x0009: |
| 6893 | /* no data */ |
| 6894 | break; |
| 6895 | } |
| 6896 | |
| 6897 | return pdu_start + pdu_length; |
| 6898 | } |
| 6899 | |
| 6900 | |
| 6901 | /******************************************************************************/ |
| 6902 | /* Dissect RPT Notification RDM Command */ |
| 6903 | static uint32_t |
| 6904 | dissect_rpt_notification_rdm_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6905 | { |
| 6906 | uint8_t pdu_flags; |
| 6907 | uint32_t pdu_start; |
| 6908 | uint32_t pdu_length; |
| 6909 | uint32_t pdu_end; |
| 6910 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6911 | uint32_t vector_offset; |
| 6912 | uint32_t data_offset; |
| 6913 | uint32_t data_length; |
| 6914 | |
| 6915 | proto_item *ti; |
| 6916 | proto_tree *pdu_tree; |
| 6917 | |
| 6918 | /* this pdu */ |
| 6919 | const char *name; |
| 6920 | uint8_t vector; |
| 6921 | |
| 6922 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_request_pdu, 1, 0); |
| 6923 | |
| 6924 | /* Add Vector item */ |
| 6925 | vector = tvb_get_uint8(tvb, vector_offset); |
| 6926 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_notification_rdm_command, tvb, vector_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 6927 | |
| 6928 | /* Add Vector item to tree */ |
| 6929 | name = val_to_str(pinfo->pool, vector, rdmnet_rpt_request_rdm_command_start_code_vals, "unknown (%d)"); |
| 6930 | proto_item_append_text(ti, ": %s", name); |
| 6931 | |
| 6932 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 6933 | |
| 6934 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 6935 | /* data_offset += 3; */ |
| 6936 | |
| 6937 | pdu_end = pdu_start + pdu_length; |
| 6938 | dissect_rdm_command(tvb, pinfo, pdu_tree, data_offset, (pdu_length-4)); |
| 6939 | |
| 6940 | return pdu_end; |
| 6941 | } |
| 6942 | |
| 6943 | |
| 6944 | /******************************************************************************/ |
| 6945 | /* Dissect RPT Notification */ |
| 6946 | static uint32_t |
| 6947 | dissect_rpt_notification(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6948 | { |
| 6949 | uint8_t pdu_flags; |
| 6950 | uint32_t pdu_start; |
| 6951 | uint32_t pdu_length; |
| 6952 | uint32_t pdu_end; |
| 6953 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 6954 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 6955 | uint32_t vector_offset; |
| 6956 | uint32_t data_offset; |
| 6957 | uint32_t data_length; |
| 6958 | uint32_t old_offset; |
| 6959 | |
| 6960 | proto_item *ti; |
| 6961 | proto_tree *pdu_tree; |
| 6962 | |
| 6963 | /* this pdu */ |
| 6964 | const char *name; |
| 6965 | uint32_t vector; |
| 6966 | |
| 6967 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_notification_pdu, 1, 0); |
| 6968 | |
| 6969 | /* Add Vector item */ |
| 6970 | vector = tvb_get_ntohl(tvb, vector_offset); |
| 6971 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_notification_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 6972 | |
| 6973 | /* Add Vector item to tree "RDM Command" */ |
| 6974 | name = val_to_str(pinfo->pool, vector, rdmnet_rpt_notification_vals, "unknown (%d)"); |
| 6975 | proto_item_append_text(ti, ": %s", name); |
| 6976 | |
| 6977 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 6978 | |
| 6979 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 6980 | data_offset += 3; |
| 6981 | |
| 6982 | /* rdm command */ |
| 6983 | pdu_end = pdu_start + pdu_length; |
| 6984 | while (data_offset < pdu_end) { |
| 6985 | old_offset = data_offset; |
| 6986 | data_offset = dissect_rpt_notification_rdm_command(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 6987 | if (data_offset == old_offset) break; |
| 6988 | } |
| 6989 | |
| 6990 | return pdu_end; |
| 6991 | } |
| 6992 | |
| 6993 | |
| 6994 | /******************************************************************************/ |
| 6995 | /* Dissect RPT Base PDU */ |
| 6996 | static uint32_t |
| 6997 | dissect_acn_rpt_base_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 6998 | { |
| 6999 | uint8_t pdu_flags; |
| 7000 | uint32_t pdu_start; |
| 7001 | uint32_t pdu_length; |
| 7002 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 7003 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 7004 | uint32_t vector_offset; |
| 7005 | uint32_t data_offset; |
| 7006 | uint32_t data_length; |
| 7007 | |
| 7008 | proto_item *ti; |
| 7009 | proto_tree *pdu_tree; |
| 7010 | |
| 7011 | /* this pdu */ |
| 7012 | const char *name; |
| 7013 | uint32_t vector; |
| 7014 | |
| 7015 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_rpt_base_pdu, 1, 0); |
| 7016 | |
| 7017 | /* Add Vector item */ |
| 7018 | vector = tvb_get_ntohl(tvb, vector_offset); |
| 7019 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 7020 | |
| 7021 | /* Add Vector item to tree */ |
| 7022 | name = val_to_str(pinfo->pool, vector, rdmnet_rpt_vector_vals, "unknown (%d)"); |
| 7023 | proto_item_append_text(ti, ": %s", name); |
| 7024 | |
| 7025 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 7026 | |
| 7027 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 7028 | data_offset += 3; |
| 7029 | |
| 7030 | /* source uid (6 bytes) */ |
| 7031 | data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_rpt_source_uid, |
| 7032 | hf_rdmnet_rpt_source_uid_manf, hf_rdmnet_rpt_source_uid_dev); |
| 7033 | |
| 7034 | /* source endpoint id (2 bytes) */ |
| 7035 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_source_endpoint_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 7036 | data_offset += 2; |
| 7037 | |
| 7038 | /* destination uid (6 bytes) */ |
| 7039 | data_offset = rdmnet_add_uid(tvb, pdu_tree, data_offset, hf_rdmnet_rpt_destination_uid, |
| 7040 | hf_rdmnet_rpt_destination_uid_manf, hf_rdmnet_rpt_destination_uid_dev); |
| 7041 | |
| 7042 | /* destination endpoint id (2 bytes) */ |
| 7043 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_destination_endpoint_id, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 7044 | data_offset += 2; |
| 7045 | |
| 7046 | /* sequence number (4 bytes) */ |
| 7047 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_sequence_number, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 7048 | data_offset += 4; |
| 7049 | |
| 7050 | /* reserved (1 byte) */ |
| 7051 | proto_tree_add_item(pdu_tree, hf_rdmnet_rpt_reserved, tvb, data_offset, 1, ENC_BIG_ENDIAN0x00000000); |
| 7052 | data_offset += 1; |
| 7053 | |
| 7054 | /* process based on vector */ |
| 7055 | switch (vector) { |
| 7056 | case RDMNET_RPT_VECTOR_REQUEST0x00000001: |
| 7057 | dissect_rpt_request(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7058 | break; |
| 7059 | case RDMNET_RPT_VECTOR_STATUS0x00000002: |
| 7060 | dissect_rpt_status(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7061 | break; |
| 7062 | case RDMNET_RPT_VECTOR_NOTIFICATION0x00000003: |
| 7063 | dissect_rpt_notification(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7064 | break; |
| 7065 | } |
| 7066 | |
| 7067 | return pdu_start + pdu_length; |
| 7068 | } |
| 7069 | |
| 7070 | |
| 7071 | /******************************************************************************/ |
| 7072 | /* Dissect EPT Data */ |
| 7073 | static uint32_t |
| 7074 | dissect_ept_data(tvbuff_t *tvb, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 7075 | { |
| 7076 | uint8_t pdu_flags; |
| 7077 | uint32_t pdu_start; |
| 7078 | uint32_t pdu_length; |
| 7079 | uint32_t pdu_end; |
| 7080 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 7081 | uint32_t vector_offset; |
| 7082 | uint32_t data_offset; |
| 7083 | |
| 7084 | proto_item *ti; |
| 7085 | proto_item *ti2; |
| 7086 | proto_tree *pdu_tree; |
| 7087 | proto_tree *pdu_tree2; |
| 7088 | |
| 7089 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_ept_data_pdu, 1, 0); |
| 7090 | |
| 7091 | /* Add PDU Length item */ |
| 7092 | proto_tree_add_uint(pdu_tree, hf_rdmnet_ept_data_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 7093 | |
| 7094 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2); |
| 7095 | /* offset should now be pointing to header (if one exists) */ |
| 7096 | |
| 7097 | /* esta manufacturer id + protocol id (4 bytes) */ |
| 7098 | ti2 = proto_tree_add_item(pdu_tree, hf_rdmnet_ept_data_vector, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 7099 | pdu_tree2 = proto_item_add_subtree(ti2, ett_rdmnet_ept_data_vector_pdu); |
| 7100 | proto_tree_add_item(pdu_tree2, hf_rdmnet_ept_data_vector_manufacturer_id, tvb, 0, 2, ENC_BIG_ENDIAN0x00000000); |
| 7101 | proto_tree_add_item(pdu_tree2, hf_rdmnet_ept_data_vector_protocol_id, tvb, 2, 2, ENC_BIG_ENDIAN0x00000000); |
| 7102 | data_offset += 4; |
| 7103 | |
| 7104 | /* opaque data */ |
| 7105 | pdu_end = pdu_start + pdu_length; |
| 7106 | proto_tree_add_item(pdu_tree, hf_rdmnet_ept_data_opaque_data, tvb, data_offset, (pdu_end - data_offset), ENC_NA0x00000000); |
| 7107 | |
| 7108 | return pdu_start + pdu_length; |
| 7109 | } |
| 7110 | |
| 7111 | |
| 7112 | /******************************************************************************/ |
| 7113 | /* Dissect EPT Status */ |
| 7114 | static uint32_t |
| 7115 | dissect_ept_status(tvbuff_t *tvb, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 7116 | { |
| 7117 | uint8_t pdu_flags; |
| 7118 | uint16_t vector; |
| 7119 | uint32_t pdu_start; |
| 7120 | uint32_t pdu_length; |
| 7121 | uint32_t pdu_end; |
| 7122 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 7123 | uint32_t vector_offset; |
| 7124 | uint32_t data_offset; |
| 7125 | |
| 7126 | proto_item *ti; |
| 7127 | proto_tree *pdu_tree; |
| 7128 | |
| 7129 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_ept_status_pdu, 1, 0); |
| 7130 | |
| 7131 | /* Add PDU Length item */ |
| 7132 | proto_tree_add_uint(pdu_tree, hf_rdmnet_ept_status_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 7133 | |
| 7134 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &data_offset, last_pdu_offsets, &pdu_flvh_length, 2); |
| 7135 | /* offset should now be pointing to header (if one exists) */ |
| 7136 | |
| 7137 | vector = tvb_get_ntohs(tvb, data_offset); |
| 7138 | proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_vector, tvb, data_offset, 2, ENC_NA0x00000000); |
| 7139 | data_offset += 2; |
| 7140 | |
| 7141 | /* process based on vector */ |
| 7142 | switch (vector) { |
| 7143 | case RDMNET_EPT_VECTOR_UNKNOWN_CID0x0001: |
| 7144 | /* unknown cid (16 bytes) */ |
| 7145 | proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_unknown_cid, tvb, data_offset, 16, ENC_NA0x00000000); |
| 7146 | data_offset += 16; |
| 7147 | |
| 7148 | /* status string */ |
| 7149 | pdu_end = pdu_start + pdu_length; |
| 7150 | proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_status_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000); |
| 7151 | break; |
| 7152 | case RDMNET_EPT_VECTOR_UNKNOWN_VECTOR0x0002: |
| 7153 | /* unknown cid (4 bytes) */ |
| 7154 | proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_unknown_vector, tvb, data_offset, 4, ENC_NA0x00000000); |
| 7155 | data_offset += 4; |
| 7156 | |
| 7157 | /* vector string */ |
| 7158 | pdu_end = pdu_start + pdu_length; |
| 7159 | proto_tree_add_item(pdu_tree, hf_rdmnet_ept_status_vector_string, tvb, data_offset, (pdu_end - data_offset), ENC_ASCII0x00000000); |
| 7160 | break; |
| 7161 | } |
| 7162 | |
| 7163 | return pdu_start + pdu_length; |
| 7164 | } |
| 7165 | |
| 7166 | |
| 7167 | /******************************************************************************/ |
| 7168 | /* Dissect EPT Base PDU */ |
| 7169 | static uint32_t |
| 7170 | dissect_acn_ept_base_pdu(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets) |
| 7171 | { |
| 7172 | uint8_t pdu_flags; |
| 7173 | uint32_t pdu_start; |
| 7174 | uint32_t pdu_length; |
| 7175 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 7176 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 7177 | uint32_t vector_offset; |
| 7178 | uint32_t data_offset; |
| 7179 | uint32_t data_length; |
| 7180 | |
| 7181 | proto_item *ti; |
| 7182 | proto_tree *pdu_tree; |
| 7183 | |
| 7184 | /* this pdu */ |
| 7185 | const char *name; |
| 7186 | uint32_t vector; |
| 7187 | |
| 7188 | dissect_acn_common_base_pdu(tvb, tree, &offset, last_pdu_offsets, &pdu_flags, &pdu_start, &pdu_length, &pdu_flvh_length, &vector_offset, &ti, &pdu_tree, ett_rdmnet_ept_base_pdu, 1, 0); |
| 7189 | |
| 7190 | /* Add Vector item */ |
| 7191 | vector = tvb_get_ntohl(tvb, vector_offset); |
| 7192 | proto_tree_add_item(pdu_tree, hf_rdmnet_ept_vector, tvb, vector_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 7193 | |
| 7194 | /* Add Vector item to tree */ |
| 7195 | name = val_to_str(pinfo->pool, vector, rdmnet_ept_vector_vals, "unknown (%d)"); |
| 7196 | proto_item_append_text(ti, ": %s", name); |
| 7197 | |
| 7198 | /* NO HEADER DATA ON THESE* (at least so far) */ |
| 7199 | |
| 7200 | dissect_pdu_bit_flag_d(offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, pdu_flvh_length, 0); |
| 7201 | data_offset += 3; |
| 7202 | |
| 7203 | /* destination cid (16 bytes) */ |
| 7204 | proto_tree_add_item(pdu_tree, hf_rdmnet_ept_destination_cid, tvb, data_offset, 16, ENC_NA0x00000000); |
| 7205 | data_offset += 16; |
| 7206 | |
| 7207 | /* process based on vector */ |
| 7208 | switch (vector) { |
| 7209 | case RDMNET_EPT_VECTOR_DATA0x00000001: |
| 7210 | dissect_ept_data(tvb, pdu_tree, data_offset, &pdu_offsets); |
| 7211 | break; |
| 7212 | case RDMNET_EPT_VECTOR_STATUS0x00000002: |
| 7213 | dissect_ept_status(tvb, pdu_tree, data_offset, &pdu_offsets); |
| 7214 | break; |
| 7215 | } |
| 7216 | |
| 7217 | return pdu_start + pdu_length; |
| 7218 | } |
| 7219 | |
| 7220 | /******************************************************************************/ |
| 7221 | /* Dissect Root PDU */ |
| 7222 | static uint32_t |
| 7223 | dissect_acn_root_pdu_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pdu_tree, proto_item *ti, const char *title, int *offset, uint8_t pdu_flags, uint32_t pdu_length, uint32_t *data_offset, uint32_t *data_length, acn_pdu_offsets *last_pdu_offsets, bool_Bool add_cid_to_info, uint32_t *pdu_flvh_length, bool_Bool is_acn) |
| 7224 | { |
| 7225 | uint32_t header_offset; |
| 7226 | e_guid_t guid; |
| 7227 | |
| 7228 | /* Adjust header */ |
| 7229 | proto_item_append_text(ti, "%s", title); |
| 7230 | |
| 7231 | dissect_pdu_bit_flag_h(offset, pdu_flags, &header_offset, last_pdu_offsets, pdu_flvh_length, 16); |
| 7232 | /* offset should now be pointing to data (if one exists) */ |
| 7233 | |
| 7234 | /* get Header (CID) 16 bytes */ |
| 7235 | tvb_get_guid(tvb, header_offset, &guid, ENC_BIG_ENDIAN0x00000000); |
| 7236 | proto_item_append_text(ti, ", Src: %s", guid_to_str(pinfo->pool, &guid)); |
| 7237 | |
| 7238 | if (add_cid_to_info) { |
| 7239 | /* add cid to info */ |
| 7240 | col_add_fstr(pinfo->cinfo, COL_INFO, "CID %s", guid_to_str(pinfo->pool, &guid)); |
| 7241 | } |
| 7242 | |
| 7243 | if (is_acn) { |
| 7244 | proto_tree_add_item(pdu_tree, hf_acn_cid, tvb, header_offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 7245 | } else { |
| 7246 | proto_tree_add_item(pdu_tree, hf_rdmnet_cid, tvb, header_offset, 16, ENC_BIG_ENDIAN0x00000000); |
| 7247 | } |
| 7248 | /* header_offset += 16; */ |
| 7249 | |
| 7250 | dissect_pdu_bit_flag_d(*offset, pdu_flags, pdu_length, data_offset, data_length, last_pdu_offsets, *pdu_flvh_length, 1); |
| 7251 | |
| 7252 | return (*data_offset) + (*data_length); |
| 7253 | } |
| 7254 | |
| 7255 | /******************************************************************************/ |
| 7256 | /* Dissect Root PDU */ |
| 7257 | static uint32_t |
| 7258 | dissect_acn_root_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets, bool_Bool is_acn) |
| 7259 | { |
| 7260 | /* common to all pdu */ |
| 7261 | uint8_t pdu_flags; |
| 7262 | uint32_t pdu_start; |
| 7263 | uint32_t pdu_length; |
| 7264 | uint32_t pdu_flvh_length; /* flags, length, vector, header */ |
| 7265 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 7266 | uint32_t vector_offset; |
| 7267 | uint32_t data_offset; |
| 7268 | uint32_t end_offset; |
| 7269 | uint32_t old_offset; |
| 7270 | uint32_t data_length; |
| 7271 | |
| 7272 | proto_item *ti; |
| 7273 | proto_tree *pdu_tree; |
| 7274 | |
| 7275 | /* this pdu */ |
| 7276 | uint32_t protocol_id; |
| 7277 | |
| 7278 | begin_dissect_acn_pdu(&pdu_tree, tvb, &ti, tree, &pdu_start, &offset, &pdu_flags, &pdu_length, &pdu_flvh_length, ett_acn_root_pdu, is_acn); |
| 7279 | |
| 7280 | /* Add PDU Length item */ |
| 7281 | if (is_acn) { |
| 7282 | proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 7283 | } else { |
| 7284 | proto_tree_add_uint(pdu_tree, hf_rdmnet_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length); |
| 7285 | } |
| 7286 | |
| 7287 | dissect_pdu_bit_flag_v(&offset, pdu_flags, &vector_offset, last_pdu_offsets, &pdu_flvh_length, 4); |
| 7288 | /* offset should now be pointing to header (if one exists) */ |
| 7289 | |
| 7290 | /* Get Protocol ID (vector) */ |
| 7291 | protocol_id = tvb_get_ntohl(tvb, vector_offset); |
| 7292 | if (is_acn) { |
| 7293 | proto_tree_add_uint(pdu_tree, hf_acn_protocol_id, tvb, vector_offset, 4, protocol_id); |
| 7294 | } else { |
| 7295 | proto_tree_add_uint(pdu_tree, hf_rdmnet_protocol_id, tvb, vector_offset, 4, protocol_id); |
| 7296 | } |
| 7297 | |
| 7298 | /* process based on protocol_id */ |
| 7299 | switch (protocol_id) { |
| 7300 | case ACN_PROTOCOL_ID_DMX0x00000003: |
| 7301 | case ACN_PROTOCOL_ID_DMX_20x00000004: |
| 7302 | case ACN_PROTOCOL_ID_DMX_30x50430001: |
| 7303 | if (global_acn_dmx_enable) { |
| 7304 | end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root DMX", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 1, &pdu_flvh_length, 1); |
| 7305 | |
| 7306 | /* adjust for what we used */ |
| 7307 | while (data_offset < end_offset) { |
| 7308 | old_offset = data_offset; |
| 7309 | data_offset = dissect_acn_dmx_base_pdu(protocol_id, tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7310 | if (data_offset == old_offset) break; |
| 7311 | } |
| 7312 | } |
| 7313 | break; |
| 7314 | case ACN_PROTOCOL_ID_EXTENDED0x00000008: |
| 7315 | end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root DMX Extension", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 1, &pdu_flvh_length, 1); |
| 7316 | |
| 7317 | /* adjust for what we used */ |
| 7318 | while (data_offset < end_offset) { |
| 7319 | old_offset = data_offset; |
| 7320 | data_offset = dissect_acn_dmx_extension_base_pdu(protocol_id, tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7321 | if (data_offset == old_offset) break; |
| 7322 | } |
| 7323 | break; |
| 7324 | case ACN_PROTOCOL_ID_SDT0x00000001: |
| 7325 | end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root SDT", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 1); |
| 7326 | |
| 7327 | /* adjust for what we used */ |
| 7328 | while (data_offset < end_offset) { |
| 7329 | old_offset = data_offset; |
| 7330 | data_offset = dissect_acn_sdt_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7331 | if (data_offset == old_offset) break; |
| 7332 | } |
| 7333 | break; |
| 7334 | case ACN_PROTOCOL_ID_RPT0x00000005: |
| 7335 | end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root RPT", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 0); |
| 7336 | |
| 7337 | /* adjust for what we used */ |
| 7338 | while (data_offset < end_offset) { |
| 7339 | old_offset = data_offset; |
| 7340 | data_offset = dissect_acn_rpt_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7341 | if (data_offset == old_offset) break; |
| 7342 | } |
| 7343 | break; |
| 7344 | case ACN_PROTOCOL_ID_BROKER0x00000009: |
| 7345 | end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root Broker", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 0); |
| 7346 | |
| 7347 | /* adjust for what we used */ |
| 7348 | while (data_offset < end_offset) { |
| 7349 | old_offset = data_offset; |
| 7350 | data_offset = dissect_acn_broker_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7351 | if (data_offset == old_offset) break; |
| 7352 | } |
| 7353 | break; |
| 7354 | case ACN_PROTOCOL_ID_LLRP0x0000000A: |
| 7355 | end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root LLRP", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 0); |
| 7356 | |
| 7357 | /* adjust for what we used */ |
| 7358 | while (data_offset < end_offset) { |
| 7359 | old_offset = data_offset; |
| 7360 | data_offset = dissect_acn_llrp_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7361 | if (data_offset == old_offset) break; |
| 7362 | } |
| 7363 | break; |
| 7364 | case ACN_PROTOCOL_ID_EPT0x0000000B: |
| 7365 | end_offset = dissect_acn_root_pdu_header(tvb, pinfo, pdu_tree, ti, ": Root EPT", &offset, pdu_flags, pdu_length, &data_offset, &data_length, last_pdu_offsets, 0, &pdu_flvh_length, 0); |
| 7366 | |
| 7367 | /* adjust for what we used */ |
| 7368 | while (data_offset < end_offset) { |
| 7369 | old_offset = data_offset; |
| 7370 | data_offset = dissect_acn_ept_base_pdu(tvb, pinfo, pdu_tree, data_offset, &pdu_offsets); |
| 7371 | if (data_offset == old_offset) break; |
| 7372 | } |
| 7373 | break; |
| 7374 | } |
| 7375 | |
| 7376 | return pdu_start + pdu_length; |
| 7377 | } |
| 7378 | |
| 7379 | /******************************************************************************/ |
| 7380 | /* Dissect ACN */ |
| 7381 | static int |
| 7382 | dissect_acn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U___attribute__((unused))) |
| 7383 | { |
| 7384 | proto_item *ti; |
| 7385 | proto_tree *acn_tree; |
| 7386 | uint32_t data_offset = 0; |
| 7387 | uint32_t old_offset; |
| 7388 | uint32_t end_offset; |
| 7389 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 7390 | uint16_t postamble_size; |
| 7391 | |
| 7392 | /* if (!is_acn(tvb)) { */ |
| 7393 | /* return 0; */ |
| 7394 | /* } */ |
| 7395 | |
| 7396 | /* Set the protocol column */ |
| 7397 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "ACN"); |
| 7398 | col_add_fstr(pinfo->cinfo, COL_INFO, "ACN [Src Port: %d, Dst Port: %d]", pinfo->srcport, pinfo->destport ); |
| 7399 | |
| 7400 | ti = proto_tree_add_item(tree, proto_acn, tvb, 0, -1, ENC_NA0x00000000); |
| 7401 | acn_tree = proto_item_add_subtree(ti, ett_acn); |
| 7402 | |
| 7403 | /* add preamble, postamble and ACN Packet ID */ |
| 7404 | proto_tree_add_item(acn_tree, hf_acn_preamble_size, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 7405 | data_offset += 2; |
| 7406 | postamble_size = tvb_get_uint16(tvb, data_offset, ENC_BIG_ENDIAN0x00000000); |
| 7407 | proto_tree_add_item(acn_tree, hf_acn_postamble_size, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 7408 | data_offset += 2; |
| 7409 | proto_tree_add_item(acn_tree, hf_acn_packet_identifier, tvb, data_offset, 12, ENC_UTF_80x00000002); |
| 7410 | data_offset += 12; |
| 7411 | |
| 7412 | /* one past the last data byte, not including the postamble */ |
| 7413 | end_offset = data_offset + tvb_reported_length_remaining(tvb, data_offset); |
| 7414 | while (data_offset < end_offset - postamble_size) { |
| 7415 | old_offset = data_offset; |
| 7416 | data_offset = dissect_acn_root_pdu(tvb, pinfo, acn_tree, data_offset, &pdu_offsets, 1); |
| 7417 | if (data_offset == old_offset) return tvb_reported_length(tvb); |
| 7418 | } |
| 7419 | /* one past the last postamble byte */ |
| 7420 | while (data_offset < end_offset) { |
| 7421 | proto_tree_add_item(acn_tree, hf_acn_postamble_key_fingerprint, tvb, data_offset, 4, ENC_NA0x00000000); |
| 7422 | data_offset += 4; |
| 7423 | proto_tree_add_item(acn_tree, hf_acn_postamble_seq_type, tvb, data_offset, 1, ENC_NA0x00000000); |
| 7424 | data_offset += 1; |
| 7425 | proto_tree_add_item(acn_tree, hf_acn_postamble_seq_hi, tvb, data_offset, 3, ENC_BIG_ENDIAN0x00000000); |
| 7426 | data_offset += 3; |
| 7427 | proto_tree_add_item(acn_tree, hf_acn_postamble_seq_low, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 7428 | data_offset += 4; |
| 7429 | proto_tree_add_item(acn_tree, hf_acn_postamble_message_digest, tvb, data_offset, 16, ENC_NA0x00000000); |
| 7430 | data_offset += 16; |
| 7431 | } |
| 7432 | return tvb_reported_length(tvb); |
| 7433 | } |
| 7434 | |
| 7435 | /******************************************************************************/ |
| 7436 | /* Dissect RDMnet */ |
| 7437 | static int |
| 7438 | dissect_rdmnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t data_offset, bool_Bool is_udp) |
| 7439 | { |
| 7440 | proto_item *ti; |
| 7441 | proto_tree *rdmnet_tree; |
| 7442 | /* uint32_t data_offset = 0; */ |
| 7443 | uint32_t old_offset; |
| 7444 | uint32_t end_offset; |
| 7445 | uint32_t pdu_length; |
| 7446 | acn_pdu_offsets pdu_offsets = {0,0,0,0,0}; |
| 7447 | |
| 7448 | /* Set the protocol column */ |
| 7449 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "RDMnet"); |
| 7450 | col_add_fstr(pinfo->cinfo, COL_INFO, "RDMnet [Src Port: %d, Dst Port: %d]", pinfo->srcport, pinfo->destport ); |
| 7451 | |
| 7452 | if (is_udp) { |
| 7453 | ti = proto_tree_add_item(tree, proto_rdmnet, tvb, data_offset, -1, ENC_NA0x00000000); |
| 7454 | } else { |
| 7455 | pdu_length = tvb_get_ntohl(tvb, 12) + 16; |
| 7456 | ti = proto_tree_add_item(tree, proto_rdmnet, tvb, data_offset, pdu_length, ENC_NA0x00000000); |
| 7457 | } |
| 7458 | rdmnet_tree = proto_item_add_subtree(ti, ett_rdmnet); |
| 7459 | |
| 7460 | if (is_udp) { |
| 7461 | /* UDP only: preamble and postamble */ |
| 7462 | proto_tree_add_item(rdmnet_tree, hf_rdmnet_preamble_size, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 7463 | data_offset += 2; |
| 7464 | proto_tree_add_item(rdmnet_tree, hf_rdmnet_postamble_size, tvb, data_offset, 2, ENC_BIG_ENDIAN0x00000000); |
| 7465 | data_offset += 2; |
| 7466 | } |
| 7467 | /* add ACN Packet ID */ |
| 7468 | proto_tree_add_item(rdmnet_tree, hf_rdmnet_packet_identifier, tvb, data_offset, 12, ENC_UTF_80x00000002); |
| 7469 | data_offset += 12; |
| 7470 | |
| 7471 | pdu_length = 0; |
| 7472 | if (!is_udp) { |
| 7473 | /* TCP only: data length (may be less than packet length) */ |
| 7474 | proto_tree_add_item(rdmnet_tree, hf_rdmnet_tcp_length, tvb, data_offset, 4, ENC_BIG_ENDIAN0x00000000); |
| 7475 | pdu_length = tvb_get_ntohl(tvb, data_offset); |
| 7476 | data_offset += 4; |
| 7477 | } |
| 7478 | |
| 7479 | /* one past the last byte */ |
| 7480 | if (is_udp) { |
| 7481 | end_offset = data_offset + tvb_reported_length_remaining(tvb, data_offset); |
| 7482 | } else { |
| 7483 | end_offset = data_offset + pdu_length; |
| 7484 | } |
| 7485 | while (data_offset < end_offset) { |
| 7486 | old_offset = data_offset; |
| 7487 | data_offset = dissect_acn_root_pdu(tvb, pinfo, rdmnet_tree, data_offset, &pdu_offsets, 0); |
| 7488 | if (data_offset == old_offset) break; |
| 7489 | } |
| 7490 | |
| 7491 | return end_offset; |
| 7492 | } |
| 7493 | |
| 7494 | /******************************************************************************/ |
| 7495 | /* Register protocol */ |
| 7496 | void |
| 7497 | proto_register_acn(void) |
| 7498 | { |
| 7499 | static hf_register_info hf[] = { |
| 7500 | /**************************************************************************/ |
| 7501 | /* In alphabetical order */ |
| 7502 | /* Address Type */ |
| 7503 | /* PDU flags*/ |
| 7504 | { &hf_acn_ip_address_type, |
| 7505 | { "Addr Type", "acn.ip_address_type", |
| 7506 | FT_UINT8, BASE_DEC, VALS(acn_ip_address_type_vals)((0 ? (const struct _value_string*)0 : ((acn_ip_address_type_vals )))), 0x0, |
| 7507 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7508 | }, |
| 7509 | /* Association */ |
| 7510 | { &hf_acn_association, |
| 7511 | { "Association", "acn.association", |
| 7512 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7513 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7514 | }, |
| 7515 | /* Blob */ |
| 7516 | { &hf_acn_blob, |
| 7517 | { "Blob", "acn.blob", |
| 7518 | FT_NONE, BASE_NONE, NULL((void*)0), 0x0, |
| 7519 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7520 | }, |
| 7521 | #if 0 |
| 7522 | /* Blob Dimmer Load Properties 2 Type */ |
| 7523 | { &hf_acn_blob_dimmer_load_properties2_type, |
| 7524 | { "Blob Field", "acn.blob_dimmer_load_properties2_type", |
| 7525 | FT_NONE, BASE_NONE, NULL((void*)0), 0x0, |
| 7526 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7527 | }, |
| 7528 | #endif |
| 7529 | /* Blob Field Length */ |
| 7530 | { &hf_acn_blob_field_length, |
| 7531 | { "Field Length", "acn.blob_field_length", |
| 7532 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7533 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7534 | }, |
| 7535 | /* Blob Field Type */ |
| 7536 | { &hf_acn_blob_field_type, |
| 7537 | { "Field Type", "acn.blob_field_type", |
| 7538 | FT_UINT8, BASE_DEC, VALS(acn_blob_field_type_vals)((0 ? (const struct _value_string*)0 : ((acn_blob_field_type_vals )))), 0x0, |
| 7539 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7540 | }, |
| 7541 | /* Blob Field Value Number */ |
| 7542 | { &hf_acn_blob_field_value_number, |
| 7543 | { "Field Value", "acn.blob_field_value_number", |
| 7544 | FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7545 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7546 | }, |
| 7547 | { &hf_acn_blob_field_value_number64, |
| 7548 | { "Field Value", "acn.blob_field_value_number64", |
| 7549 | FT_UINT64, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7550 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7551 | }, |
| 7552 | { &hf_acn_blob_field_value_float, |
| 7553 | { "Field Value", "acn.blob_field_value_float", |
| 7554 | FT_FLOAT, BASE_NONE, NULL((void*)0), 0x0, |
| 7555 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7556 | }, |
| 7557 | { &hf_acn_blob_field_value_double, |
| 7558 | { "Field Value", "acn.blob_field_value_double", |
| 7559 | FT_DOUBLE, BASE_NONE, NULL((void*)0), 0x0, |
| 7560 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7561 | }, |
| 7562 | { &hf_acn_blob_field_value_guid, |
| 7563 | { "Field Value", "acn.blob_field_value_guid", |
| 7564 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 7565 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7566 | }, |
| 7567 | |
| 7568 | /* Blob Field Value String*/ |
| 7569 | { &hf_acn_blob_field_value_string, |
| 7570 | { "Field Value", "acn.blob_field_value_string", |
| 7571 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7572 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7573 | }, |
| 7574 | /* Blob Field Value IPV4 */ |
| 7575 | { &hf_acn_blob_field_value_ipv4, |
| 7576 | { "Field Value", "acn.blob_field_value_ipv4", |
| 7577 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 7578 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7579 | }, |
| 7580 | /* Blob Field Value IPV6 */ |
| 7581 | { &hf_acn_blob_field_value_ipv6, |
| 7582 | { "Field Value", "acn.blob_field_value_ipv6", |
| 7583 | FT_IPv6, BASE_NONE, NULL((void*)0), 0x0, |
| 7584 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7585 | }, |
| 7586 | /* Blob Metadata Device Type */ |
| 7587 | { &hf_acn_blob_tree_field_type, |
| 7588 | { "Blob Field", "acn.blob_tree_field_type", |
| 7589 | FT_NONE, BASE_NONE, NULL((void*)0), 0x0, |
| 7590 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7591 | }, |
| 7592 | #if 0 |
| 7593 | /* Blob Metadata Types Type */ |
| 7594 | { &hf_acn_blob_metadata_types_type, |
| 7595 | { "Blob Field", "acn.blob_metadata_types_type", |
| 7596 | FT_NONE, BASE_NONE, NULL((void*)0), 0x0, |
| 7597 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7598 | }, |
| 7599 | #endif |
| 7600 | /* Blob Range Number */ |
| 7601 | { &hf_acn_blob_range_number, |
| 7602 | { "Blob Range Number", "acn.blob_range_number", |
| 7603 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7604 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7605 | }, |
| 7606 | /* Blob Range Type */ |
| 7607 | { &hf_acn_blob_range_type, |
| 7608 | { "Blob Range Type", "acn.blob_range_type", |
| 7609 | FT_UINT8, BASE_HEX, VALS(acn_blob_range_type_vals)((0 ? (const struct _value_string*)0 : ((acn_blob_range_type_vals )))), 0x0, |
| 7610 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7611 | }, |
| 7612 | #if 0 |
| 7613 | /* Blob Range Start */ |
| 7614 | { &hf_acn_blob_range_start, |
| 7615 | { "Blob Range Start", "acn.blob_range_start", |
| 7616 | FT_UINT8, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7617 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7618 | }, |
| 7619 | #endif |
| 7620 | /* Blob Type */ |
| 7621 | { &hf_acn_blob_type, |
| 7622 | { "Blob Type", "acn.blob_type", |
| 7623 | FT_UINT8, BASE_DEC, VALS(acn_blob_type_vals)((0 ? (const struct _value_string*)0 : ((acn_blob_type_vals)) )), 0x0, |
| 7624 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7625 | }, |
| 7626 | /* Blob Version */ |
| 7627 | { &hf_acn_blob_version, |
| 7628 | { "Blob Version", "acn.blob_version", |
| 7629 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7630 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7631 | }, |
| 7632 | { &hf_acn_blob_time_zone, |
| 7633 | { "Time Zone", "acn.blob_time_zone", |
| 7634 | FT_INT32, BASE_DEC, NULL((void*)0), 0x0, |
| 7635 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7636 | }, |
| 7637 | { &hf_acn_blob_dst_type, |
| 7638 | { "DST Type", "acn.blob_dst_type", |
| 7639 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7640 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7641 | }, |
| 7642 | { &hf_acn_blob_dst_start_day, |
| 7643 | { "DST Start Day", "acn.blob_dst_start_day", |
| 7644 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7645 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7646 | }, |
| 7647 | { &hf_acn_blob_dst_stop_day, |
| 7648 | { "DST Stop Day", "acn.blob_dst_stop_day", |
| 7649 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7650 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7651 | }, |
| 7652 | { &hf_acn_blob_dst_start_locality, |
| 7653 | { "DST Start Locality", "acn.blob_dst_start_locality", |
| 7654 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7655 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7656 | }, |
| 7657 | { &hf_acn_blob_dst_stop_locality, |
| 7658 | { "DST Stop Locality", "acn.blob_dst_stop_locality", |
| 7659 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7660 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7661 | }, |
| 7662 | /* Channel Number */ |
| 7663 | { &hf_acn_channel_number, |
| 7664 | { "Channel Number", "acn.channel_number", |
| 7665 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7666 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7667 | }, |
| 7668 | /* CID */ |
| 7669 | { &hf_acn_cid, |
| 7670 | { "CID", "acn.cid", |
| 7671 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 7672 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7673 | }, |
| 7674 | /* Client Protocol ID */ |
| 7675 | #if 0 |
| 7676 | { &hf_acn_client_protocol_id, |
| 7677 | { "Client Protocol ID", "acn.client_protocol_id", |
| 7678 | FT_UINT32, BASE_DEC, VALS(acn_protocol_id_vals)((0 ? (const struct _value_string*)0 : ((acn_protocol_id_vals )))), 0x0, |
| 7679 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7680 | }, |
| 7681 | #endif |
| 7682 | /* DMP data */ |
| 7683 | { &hf_acn_data, |
| 7684 | { "Data", "acn.dmp_data", |
| 7685 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 7686 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7687 | }, |
| 7688 | { &hf_acn_data8, |
| 7689 | { "Addr", "acn.dmp_data8", |
| 7690 | FT_UINT8, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7691 | "Data8", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7692 | }, |
| 7693 | { &hf_acn_data16, |
| 7694 | { "Addr", "acn.dmp_data16", |
| 7695 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7696 | "Data16", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7697 | }, |
| 7698 | { &hf_acn_data24, |
| 7699 | { "Addr", "acn.dmp_data24", |
| 7700 | FT_UINT24, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7701 | "Data24", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7702 | }, |
| 7703 | { &hf_acn_data32, |
| 7704 | { "Addr", "acn.dmp_data32", |
| 7705 | FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7706 | "Data32", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7707 | }, |
| 7708 | |
| 7709 | /* DMP Address type*/ |
| 7710 | #if 0 |
| 7711 | { &hf_acn_dmp_adt, |
| 7712 | { "Address and Data Type", "acn.dmp_adt", |
| 7713 | FT_UINT8, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7714 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7715 | }, |
| 7716 | #endif |
| 7717 | { &hf_acn_dmp_adt_a, |
| 7718 | { "Size", "acn.dmp_adt_a", |
| 7719 | FT_UINT8, BASE_DEC, VALS(acn_dmp_adt_a_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_adt_a_vals)) )), 0x03, |
| 7720 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7721 | }, |
| 7722 | { &hf_acn_dmp_adt_d, |
| 7723 | { "Data Type", "acn.dmp_adt_d", |
| 7724 | FT_UINT8, BASE_DEC, VALS(acn_dmp_adt_d_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_adt_d_vals)) )), 0x30, |
| 7725 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7726 | }, |
| 7727 | { &hf_acn_dmp_adt_r, |
| 7728 | { "Relative", "acn.dmp_adt_r", |
| 7729 | FT_UINT8, BASE_DEC, VALS(acn_dmp_adt_r_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_adt_r_vals)) )), 0x40, |
| 7730 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7731 | }, |
| 7732 | { &hf_acn_dmp_adt_v, |
| 7733 | { "Virtual", "acn.dmp_adt_v", |
| 7734 | FT_UINT8, BASE_DEC, VALS(acn_dmp_adt_v_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_adt_v_vals)) )), 0x80, |
| 7735 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7736 | }, |
| 7737 | { &hf_acn_dmp_adt_x, |
| 7738 | { "Reserved", "acn.dmp_adt_x", |
| 7739 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0c, |
| 7740 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7741 | }, |
| 7742 | |
| 7743 | /* DMP Reason Code */ |
| 7744 | { &hf_acn_dmp_reason_code, |
| 7745 | { "Reason Code", "acn.dmp_reason_code", |
| 7746 | FT_UINT8, BASE_DEC, VALS(acn_dmp_reason_code_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_reason_code_vals )))), 0x0, |
| 7747 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7748 | }, |
| 7749 | |
| 7750 | /* DMP Vector */ |
| 7751 | { &hf_acn_dmp_vector, |
| 7752 | { "DMP Vector", "acn.dmp_vector", |
| 7753 | FT_UINT8, BASE_DEC, VALS(acn_dmp_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_dmp_vector_vals) ))), 0x0, |
| 7754 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7755 | }, |
| 7756 | |
| 7757 | { &hf_acn_dmp_actual_address, |
| 7758 | { "Actual Address", "acn.dmp_actual_address", |
| 7759 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 7760 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7761 | }, |
| 7762 | |
| 7763 | { &hf_acn_dmp_virtual_address, |
| 7764 | { "Virtual Address", "acn.dmp_virtual_address", |
| 7765 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 7766 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7767 | }, |
| 7768 | |
| 7769 | { &hf_acn_dmp_actual_address_first, |
| 7770 | { "Actual Address First", "acn.dmp_actual_address_first", |
| 7771 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 7772 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7773 | }, |
| 7774 | |
| 7775 | { &hf_acn_dmp_virtual_address_first, |
| 7776 | { "Virtual Address First", "acn.dmp_virtual_address_first", |
| 7777 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 7778 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7779 | }, |
| 7780 | |
| 7781 | /* Expiry */ |
| 7782 | { &hf_acn_expiry, |
| 7783 | { "Expiry", "acn.expiry", |
| 7784 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7785 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7786 | }, |
| 7787 | /* First Member to ACK */ |
| 7788 | { &hf_acn_first_member_to_ack, |
| 7789 | { "First Member to ACK", "acn.first_member_to_ack", |
| 7790 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7791 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7792 | }, |
| 7793 | /* First Missed Sequence */ |
| 7794 | { &hf_acn_first_missed_sequence, |
| 7795 | { "First Missed Sequence", "acn.first_missed_sequence", |
| 7796 | FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7797 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7798 | }, |
| 7799 | /* IPV4 */ |
| 7800 | { &hf_acn_ipv4, |
| 7801 | { "IPV4", "acn.ipv4", |
| 7802 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 7803 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7804 | }, |
| 7805 | /* IPV6 */ |
| 7806 | { &hf_acn_ipv6, |
| 7807 | { "IPV6", "acn.ipv6", |
| 7808 | FT_IPv6, BASE_NONE, NULL((void*)0), 0x0, |
| 7809 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7810 | }, |
| 7811 | /* Last Member to ACK */ |
| 7812 | { &hf_acn_last_member_to_ack, |
| 7813 | { "Last Member to ACK", "acn.last_member_to_ack", |
| 7814 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7815 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7816 | }, |
| 7817 | /* Last Missed Sequence */ |
| 7818 | { &hf_acn_last_missed_sequence, |
| 7819 | { "Last Missed Sequence", "acn.last_missed_sequence", |
| 7820 | FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7821 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7822 | }, |
| 7823 | /* MAK threshold */ |
| 7824 | { &hf_acn_mak_threshold, |
| 7825 | { "MAK Threshold", "acn.mak_threshold", |
| 7826 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7827 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7828 | }, |
| 7829 | /* Member ID */ |
| 7830 | { &hf_acn_member_id, |
| 7831 | { "Member ID", "acn.member_id", |
| 7832 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7833 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7834 | }, |
| 7835 | /* NAK Holdoff */ |
| 7836 | { &hf_acn_nak_holdoff, |
| 7837 | { "NAK holdoff (ms)", "acn.nak_holdoff", |
| 7838 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7839 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7840 | }, |
| 7841 | /* NAK Max Wait */ |
| 7842 | { &hf_acn_nak_max_wait, |
| 7843 | { "NAK Max Wait (ms)", "acn.nak_max_wait", |
| 7844 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7845 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7846 | }, |
| 7847 | /* NAK Modulus */ |
| 7848 | { &hf_acn_nak_modulus, |
| 7849 | { "NAK Modulus", "acn.nak_modulus", |
| 7850 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7851 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7852 | }, |
| 7853 | /* NAK Outbound Flag */ |
| 7854 | { &hf_acn_nak_outbound_flag, |
| 7855 | { "NAK Outbound Flag", "acn.nak_outbound_flag", |
| 7856 | FT_BOOLEAN, 8, NULL((void*)0), 0x80, |
| 7857 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7858 | }, |
| 7859 | /* Oldest Available Wrapper */ |
| 7860 | { &hf_acn_oldest_available_wrapper, |
| 7861 | { "Oldest Available Wrapper", "acn.oldest_available_wrapper", |
| 7862 | FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7863 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7864 | }, |
| 7865 | /* Preamble Size */ |
| 7866 | { &hf_acn_preamble_size, |
| 7867 | { "Size of preamble", "acn.preamble_size", |
| 7868 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 7869 | "Preamble size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7870 | }, |
| 7871 | /* Packet Identifier */ |
| 7872 | { &hf_acn_packet_identifier, |
| 7873 | { "Packet Identifier", "acn.packet_identifier", |
| 7874 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7875 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7876 | }, |
| 7877 | /* PDU */ |
| 7878 | { &hf_acn_pdu, |
| 7879 | { "PDU", "acn.pdu", |
| 7880 | FT_NONE, BASE_NONE, NULL((void*)0), 0x0, |
| 7881 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7882 | }, |
| 7883 | /* PDU flags*/ |
| 7884 | { &hf_acn_pdu_flags, |
| 7885 | { "Flags", "acn.pdu.flags", |
| 7886 | FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, |
| 7887 | "PDU Flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7888 | }, |
| 7889 | { &hf_acn_pdu_flag_d, |
| 7890 | { "Data", "acn.pdu.flag_d", |
| 7891 | FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_D0x10, |
| 7892 | "Data flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7893 | }, |
| 7894 | { &hf_acn_pdu_flag_h, |
| 7895 | { "Header", "acn.pdu.flag_h", |
| 7896 | FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_H0x20, |
| 7897 | "Header flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7898 | }, |
| 7899 | { &hf_acn_pdu_flag_l, |
| 7900 | { "Length", "acn.pdu.flag_l", |
| 7901 | FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_L0x80, |
| 7902 | "Length flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7903 | }, |
| 7904 | { &hf_acn_pdu_flag_v, |
| 7905 | { "Vector", "acn.pdu.flag_v", |
| 7906 | FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_V0x40, |
| 7907 | "Vector flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7908 | }, |
| 7909 | /* PDU Length */ |
| 7910 | { &hf_acn_pdu_length, |
| 7911 | { "Length", "acn.pdu.length", |
| 7912 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 7913 | "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7914 | }, |
| 7915 | /* Port */ |
| 7916 | { &hf_acn_port, |
| 7917 | { "Port", "acn.port", |
| 7918 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7919 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7920 | }, |
| 7921 | /* Postamble Size */ |
| 7922 | { &hf_acn_postamble_size, |
| 7923 | { "Size of postamble", "acn.postamble_size", |
| 7924 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 7925 | "Postamble size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7926 | }, |
| 7927 | /* Protocol ID */ |
| 7928 | { &hf_acn_protocol_id, |
| 7929 | { "Protocol ID", "acn.protocol_id", |
| 7930 | FT_UINT32, BASE_DEC, VALS(acn_protocol_id_vals)((0 ? (const struct _value_string*)0 : ((acn_protocol_id_vals )))), 0x0, |
| 7931 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7932 | }, |
| 7933 | /* Reason Code */ |
| 7934 | { &hf_acn_reason_code, |
| 7935 | { "Reason Code", "acn.reason_code", |
| 7936 | FT_UINT8, BASE_DEC, VALS(acn_reason_code_vals)((0 ? (const struct _value_string*)0 : ((acn_reason_code_vals )))), 0x0, |
| 7937 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7938 | }, |
| 7939 | /* Reciprocal Channel */ |
| 7940 | { &hf_acn_reciprocal_channel, |
| 7941 | { "Reciprocal Channel Number", "acn.reciprocal_channel", |
| 7942 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7943 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7944 | }, |
| 7945 | /* Refuse Code */ |
| 7946 | { &hf_acn_refuse_code, |
| 7947 | { "Refuse Code", "acn.refuse_code", |
| 7948 | FT_UINT8, BASE_DEC, VALS(acn_refuse_code_vals)((0 ? (const struct _value_string*)0 : ((acn_refuse_code_vals )))), 0x0, |
| 7949 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7950 | }, |
| 7951 | /* Reliable Sequence Number */ |
| 7952 | { &hf_acn_reliable_sequence_number, |
| 7953 | { "Reliable Sequence Number", "acn.reliable_sequence_number", |
| 7954 | FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 7955 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7956 | }, |
| 7957 | /* Ad-hoc Expiry */ |
| 7958 | { &hf_acn_adhoc_expiry, |
| 7959 | { "Ad-hoc Expiry", "acn.adhoc_expiry", |
| 7960 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7961 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7962 | }, |
| 7963 | /* SDT Vector */ |
| 7964 | { &hf_acn_sdt_vector, |
| 7965 | { "SDT Vector", "acn.sdt_vector", |
| 7966 | FT_UINT8, BASE_DEC, VALS(acn_sdt_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_sdt_vector_vals) ))), 0x0, |
| 7967 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7968 | }, |
| 7969 | |
| 7970 | /* DMX Vector */ |
| 7971 | { &hf_acn_dmx_vector, |
| 7972 | { "Vector", "acn.dmx_vector", |
| 7973 | FT_UINT32, BASE_DEC, VALS(acn_dmx_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_dmx_vector_vals) ))), 0x0, |
| 7974 | "DMX Vector", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7975 | }, |
| 7976 | /* DMX Source Name */ |
| 7977 | { &hf_acn_dmx_source_name, |
| 7978 | { "Source", "acn.dmx.source_name", |
| 7979 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 7980 | "DMX Source Name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7981 | }, |
| 7982 | |
| 7983 | /* DMX priority */ |
| 7984 | { &hf_acn_dmx_priority, |
| 7985 | { "Priority", "acn.dmx.priority", |
| 7986 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 7987 | "DMX Priority", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7988 | }, |
| 7989 | |
| 7990 | /* DMX 2 sync universe*/ |
| 7991 | { &hf_acn_dmx_2_sync_universe, |
| 7992 | { "Sync Universe", "acn.dmx.sync", |
| 7993 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 7994 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 7995 | }, |
| 7996 | |
| 7997 | /* DMX 3 reserved */ |
| 7998 | { &hf_acn_dmx_3_reserved, |
| 7999 | { "Reserved", "acn.dmx.reserved", |
| 8000 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8001 | "DMX Reserved", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8002 | }, |
| 8003 | |
| 8004 | /* DMX Sequence number */ |
| 8005 | { &hf_acn_dmx_sequence_number, |
| 8006 | { "Seq No", "acn.dmx.seq_number", |
| 8007 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 8008 | "DMX Sequence Number", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8009 | }, |
| 8010 | |
| 8011 | /* DMX 2 options */ |
| 8012 | { &hf_acn_dmx_2_options, |
| 8013 | { "Options", "acn.dmx.options", |
| 8014 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 8015 | "DMX Options", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8016 | }, |
| 8017 | |
| 8018 | { &hf_acn_dmx_2_option_p, |
| 8019 | { "Preview Data", "acn.dmx.option_p", |
| 8020 | FT_BOOLEAN, 8, NULL((void*)0), ACN_DMX_OPTION_P0x80, |
| 8021 | "Preview Data flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8022 | }, |
| 8023 | |
| 8024 | { &hf_acn_dmx_2_option_s, |
| 8025 | { "Stream Terminated", "acn.dmx.option_s", |
| 8026 | FT_BOOLEAN, 8, NULL((void*)0), ACN_DMX_OPTION_S0x40, |
| 8027 | "Stream Terminated flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8028 | }, |
| 8029 | |
| 8030 | { &hf_acn_dmx_2_option_f, |
| 8031 | { "Force Synchronization", "acn.dmx.option_sync", |
| 8032 | FT_BOOLEAN, 8, NULL((void*)0), ACN_DMX_OPTION_F0x20, |
| 8033 | "Force Synchronization flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8034 | }, |
| 8035 | |
| 8036 | /* DMX Universe */ |
| 8037 | { &hf_acn_dmx_universe, |
| 8038 | { "Universe", "acn.dmx.universe", |
| 8039 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8040 | "DMX Universe", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8041 | }, |
| 8042 | |
| 8043 | /* DMX Start Code */ |
| 8044 | { &hf_acn_dmx_start_code, |
| 8045 | { "Start Code", "acn.dmx.start_code", |
| 8046 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 8047 | "DMX Start Code", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8048 | }, |
| 8049 | |
| 8050 | /* DMX 2 First Property Address */ |
| 8051 | { &hf_acn_dmx_2_first_property_address, |
| 8052 | { "First Property Address", "acn.dmx.first_property_address", |
| 8053 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 8054 | "DMX First Property Address", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8055 | }, |
| 8056 | |
| 8057 | /* DMX Address Increment */ |
| 8058 | { &hf_acn_dmx_increment, |
| 8059 | { "Increment", "acn.dmx.increment", |
| 8060 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8061 | "DMX Increment", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8062 | }, |
| 8063 | |
| 8064 | /* DMX Packet Count */ |
| 8065 | { &hf_acn_dmx_count, |
| 8066 | { "Count", "acn.dmx.count", |
| 8067 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8068 | "DMX Count", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8069 | }, |
| 8070 | |
| 8071 | /* DMX 2 Start Code */ |
| 8072 | { &hf_acn_dmx_2_start_code, |
| 8073 | { "Start Code", "acn.dmx.start_code2", |
| 8074 | FT_UINT8, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 8075 | "DMX Start Code", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8076 | }, |
| 8077 | |
| 8078 | /* DMX Extension Vector */ |
| 8079 | { &hf_acn_dmx_extension_vector, |
| 8080 | { "Vector", "acn.dmx.extension.vector", |
| 8081 | FT_UINT32, BASE_DEC, VALS(acn_dmx_extension_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_dmx_extension_vector_vals )))), 0x0, |
| 8082 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8083 | }, |
| 8084 | { &hf_acn_dmx_discovery_vector, |
| 8085 | { "Vector", "acn.dmx.discovery.vector", |
| 8086 | FT_UINT32, BASE_DEC, VALS(acn_dmx_discovery_vector_vals)((0 ? (const struct _value_string*)0 : ((acn_dmx_discovery_vector_vals )))), 0x0, |
| 8087 | "DMX Extension Discovery Vector", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8088 | }, |
| 8089 | { &hf_acn_dmx_discovery_universe_list, |
| 8090 | { "Universe List", "acn.dmx.discovery.list", |
| 8091 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8092 | "DMX Extension Discovery Universe List", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8093 | }, |
| 8094 | |
| 8095 | /* DMX Discovery Pages */ |
| 8096 | { &hf_acn_dmx_discovery_page, |
| 8097 | { "Page", "acn.dmx.discovery.page", |
| 8098 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 8099 | "DMX Extension Discovery Page", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8100 | }, |
| 8101 | |
| 8102 | { &hf_acn_dmx_discovery_last_page, |
| 8103 | { "Last Page", "acn.dmx.discovery.last_page", |
| 8104 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 8105 | "DMX Extension Discovery Last Page", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8106 | }, |
| 8107 | |
| 8108 | { &hf_acn_dmx_discovery_framing_reserved, |
| 8109 | { "Reserved", "acn.dmx.discovery.reserved", |
| 8110 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 8111 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8112 | }, |
| 8113 | |
| 8114 | { &hf_acn_dmx_sync_universe, |
| 8115 | { "Sync Universe", "acn.dmx.sync.universe", |
| 8116 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8117 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8118 | }, |
| 8119 | |
| 8120 | { &hf_acn_dmx_sync_reserved, |
| 8121 | { "Reserved", "acn.dmx.sync.reserved", |
| 8122 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8123 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8124 | }, |
| 8125 | |
| 8126 | /* |
| 8127 | * If you want the pretty-printed data in the field, for filtering |
| 8128 | * purposes, you have to make it an FT_STRING. |
| 8129 | * |
| 8130 | * If you want the raw data in the field, for filtering purposes, |
| 8131 | * you have to make it an FT_BYTES *AND* use "proto_tree_add_bytes_format()" |
| 8132 | * to put the pretty-printed data into the display but not the field. |
| 8133 | */ |
| 8134 | { &hf_acn_dmx_data, |
| 8135 | { "Data", "acn.dmx.data", |
| 8136 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8137 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8138 | }, |
| 8139 | |
| 8140 | /* Session Count */ |
| 8141 | #if 0 |
| 8142 | { &hf_acn_session_count, |
| 8143 | { "Session Count", "acn.session_count", |
| 8144 | FT_UINT16, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 8145 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8146 | }, |
| 8147 | #endif |
| 8148 | /* Total Sequence Number */ |
| 8149 | { &hf_acn_total_sequence_number, |
| 8150 | { "Total Sequence Number", "acn.total_sequence_number", |
| 8151 | FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 8152 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8153 | } |
| 8154 | }; |
| 8155 | |
| 8156 | static hf_register_info magic_hf[] = { |
| 8157 | /* Protocol ID */ |
| 8158 | { &hf_magic_protocol_id, |
| 8159 | { "Protocol ID", "magic.protocol_id", |
| 8160 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 8161 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8162 | }, |
| 8163 | |
| 8164 | /* PDU Type */ |
| 8165 | { &hf_magic_pdu_subtype, |
| 8166 | { "PDU type", "magic.type", |
| 8167 | FT_UINT8, BASE_DEC, VALS(magic_pdu_subtypes)((0 ? (const struct _value_string*)0 : ((magic_pdu_subtypes)) )), 0x0, |
| 8168 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }, |
| 8169 | }, |
| 8170 | |
| 8171 | /* Major Version */ |
| 8172 | { &hf_magic_major_version, |
| 8173 | { "Major Version", "magic.major_version", |
| 8174 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 8175 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8176 | }, |
| 8177 | |
| 8178 | /* Minor Version */ |
| 8179 | { &hf_magic_minor_version, |
| 8180 | { "Minor Version", "magic.minor_version", |
| 8181 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 8182 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8183 | }, |
| 8184 | |
| 8185 | /* V1 Command */ |
| 8186 | { &hf_magic_v1command_vals, |
| 8187 | { "Command", "magic.v1_command", |
| 8188 | FT_UINT32, BASE_DEC, VALS(magic_v1command_vals)((0 ? (const struct _value_string*)0 : ((magic_v1command_vals )))), 0x0, |
| 8189 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8190 | }, |
| 8191 | |
| 8192 | /* V2 Command */ |
| 8193 | { &hf_magic_command_vals, |
| 8194 | { "Command", "magic.command", |
| 8195 | FT_UINT32, BASE_DEC, VALS(magic_command_vals)((0 ? (const struct _value_string*)0 : ((magic_command_vals)) )), 0x0, |
| 8196 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8197 | }, |
| 8198 | |
| 8199 | /* Beacon Duration */ |
| 8200 | { &hf_magic_command_beacon_duration, |
| 8201 | { "Duration", "magic.beacon_duration", |
| 8202 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 8203 | "Beacon Duration", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8204 | }, |
| 8205 | |
| 8206 | /* TFTP */ |
| 8207 | { &hf_magic_command_tftp, |
| 8208 | { "TFTP IP", "magic.tftp", |
| 8209 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 8210 | "IP of TFTP server", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8211 | }, |
| 8212 | |
| 8213 | /* Reset Lease */ |
| 8214 | { &hf_magic_command_reset_lease, |
| 8215 | { "Reset Lease", "magic.reset_lease", |
| 8216 | FT_UINT32, BASE_DEC, VALS(magic_reset_lease_vals)((0 ? (const struct _value_string*)0 : ((magic_reset_lease_vals )))), 0x0, |
| 8217 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8218 | }, |
| 8219 | |
| 8220 | /* CID */ |
| 8221 | { &hf_magic_command_cid, |
| 8222 | { "CID", "magic.cid", |
| 8223 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 8224 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8225 | }, |
| 8226 | |
| 8227 | /* Command IP Configuration */ |
| 8228 | { &hf_magic_command_ip_configuration, |
| 8229 | { "IP Configuration", "magic.ip_configuration", |
| 8230 | FT_UINT32, BASE_DEC, VALS(magic_ip_configuration_vals)((0 ? (const struct _value_string*)0 : ((magic_ip_configuration_vals )))), 0x0, |
| 8231 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8232 | }, |
| 8233 | |
| 8234 | /* Command IP Address */ |
| 8235 | { &hf_magic_command_ip_address, |
| 8236 | { "IP Address", "magic.ip_address", |
| 8237 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 8238 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8239 | }, |
| 8240 | |
| 8241 | /* Command Subnet Mask */ |
| 8242 | { &hf_magic_command_subnet_mask, |
| 8243 | { "Subnet Mask", "magic.subnet_mask", |
| 8244 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 8245 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8246 | }, |
| 8247 | |
| 8248 | /* Command Gateway */ |
| 8249 | { &hf_magic_command_gateway, |
| 8250 | { "Gateway", "magic.gateway", |
| 8251 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 8252 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8253 | }, |
| 8254 | |
| 8255 | /* Reply IP Address */ |
| 8256 | { &hf_magic_reply_ip_address, |
| 8257 | { "IP", "magic.reply.ip_address", |
| 8258 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 8259 | "Local IP Address", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8260 | }, |
| 8261 | |
| 8262 | /* Reply Subnet Mask */ |
| 8263 | { &hf_magic_reply_subnet_mask, |
| 8264 | { "Subnet Mask", "magic.reply.subnet_mask", |
| 8265 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 8266 | "Local Subnet Mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8267 | }, |
| 8268 | |
| 8269 | /* Reply Gateway */ |
| 8270 | { &hf_magic_reply_gateway, |
| 8271 | { "Gateway", "magic.reply.gateway", |
| 8272 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 8273 | "Local Gateway", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8274 | }, |
| 8275 | |
| 8276 | /* Reply TFTP */ |
| 8277 | { &hf_magic_reply_tftp, |
| 8278 | { "TFTP IP", "magic.reply.tftp", |
| 8279 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 8280 | "IP of TFTP server", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8281 | }, |
| 8282 | |
| 8283 | /* Reply Version */ |
| 8284 | { &hf_magic_reply_version, |
| 8285 | { "Reply Version", "magic.reply.version", |
| 8286 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8287 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8288 | }, |
| 8289 | |
| 8290 | /* Reply Device Type Name */ |
| 8291 | { &hf_magic_reply_device_type_name, |
| 8292 | { "Device Type Name", "magic.reply.device_type_name", |
| 8293 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8294 | "Reply Device Type Name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8295 | }, |
| 8296 | |
| 8297 | /* Reply Default Name */ |
| 8298 | { &hf_magic_reply_default_name, |
| 8299 | { "Default Name", "magic.reply.default_name", |
| 8300 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8301 | "Reply Default Name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8302 | }, |
| 8303 | |
| 8304 | /* Reply User Name */ |
| 8305 | { &hf_magic_reply_user_name, |
| 8306 | { "User Name", "magic.reply.user_name", |
| 8307 | FT_UINT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8308 | "Reply User Name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8309 | }, |
| 8310 | |
| 8311 | /* CID */ |
| 8312 | { &hf_magic_reply_cid, |
| 8313 | { "CID", "magic.reply.cid", |
| 8314 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 8315 | "Reply CID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8316 | }, |
| 8317 | |
| 8318 | /* DCID */ |
| 8319 | { &hf_magic_reply_dcid, |
| 8320 | { "DCID", "magic.reply.dcid", |
| 8321 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 8322 | "Reply DCID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8323 | }, |
| 8324 | |
| 8325 | /* Key Fingerprint */ |
| 8326 | { &hf_acn_postamble_key_fingerprint, |
| 8327 | { "Key Fingerprint", "acn.security.key_fingerprint", |
| 8328 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 8329 | "Security Key Fingerprint", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8330 | }, |
| 8331 | |
| 8332 | /* Sequence type */ |
| 8333 | { &hf_acn_postamble_seq_type, |
| 8334 | { "Sequence Type", "acn.security.seq_type", |
| 8335 | FT_UINT8, BASE_DEC, VALS(security_seq_type_vals)((0 ? (const struct _value_string*)0 : ((security_seq_type_vals )))), 0x0, |
| 8336 | "Security Sequence Type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8337 | }, |
| 8338 | |
| 8339 | /* Sequence High */ |
| 8340 | { &hf_acn_postamble_seq_hi, |
| 8341 | { "Sequence High", "acn.security.seq_hi", |
| 8342 | FT_UINT24, BASE_HEX, NULL((void*)0), 0x0, |
| 8343 | "Security Sequence High", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8344 | }, |
| 8345 | |
| 8346 | /* Sequence Low */ |
| 8347 | { &hf_acn_postamble_seq_low, |
| 8348 | { "Sequence Low", "acn.security.seq_low", |
| 8349 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 8350 | "Security Sequence Low", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8351 | }, |
| 8352 | |
| 8353 | /* Message Digest */ |
| 8354 | { &hf_acn_postamble_message_digest, |
| 8355 | { "Message Digest", "acn.security.digest", |
| 8356 | FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, |
| 8357 | "Security Message Digest", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8358 | }, |
| 8359 | }; |
| 8360 | |
| 8361 | static hf_register_info rdmnet_hf[] = { |
| 8362 | /* CID */ |
| 8363 | { &hf_rdmnet_cid, |
| 8364 | { "CID", "rdmnet.cid", |
| 8365 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 8366 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8367 | }, |
| 8368 | /* Packet Identifier */ |
| 8369 | { &hf_rdmnet_packet_identifier, |
| 8370 | { "Packet Identifier", "rdmnet.packet_identifier", |
| 8371 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8372 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8373 | }, |
| 8374 | /* PDU */ |
| 8375 | { &hf_rdmnet_pdu, |
| 8376 | { "PDU", "rdmnet.pdu", |
| 8377 | FT_NONE, BASE_NONE, NULL((void*)0), 0x0, |
| 8378 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8379 | }, |
| 8380 | /* PDU flags*/ |
| 8381 | { &hf_rdmnet_pdu_flags, |
| 8382 | { "Flags", "rdmnet.pdu.flags", |
| 8383 | FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, |
| 8384 | "PDU Flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8385 | }, |
| 8386 | { &hf_rdmnet_pdu_flag_d, |
| 8387 | { "Data", "rdmnet.pdu.flag_d", |
| 8388 | FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_D0x10, |
| 8389 | "Data flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8390 | }, |
| 8391 | { &hf_rdmnet_pdu_flag_h, |
| 8392 | { "Header", "rdmnet.pdu.flag_h", |
| 8393 | FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_H0x20, |
| 8394 | "Header flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8395 | }, |
| 8396 | { &hf_rdmnet_pdu_flag_l, |
| 8397 | { "Length", "rdmnet.pdu.flag_l", |
| 8398 | FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_L0x80, |
| 8399 | "Length flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8400 | }, |
| 8401 | { &hf_rdmnet_pdu_flag_v, |
| 8402 | { "Vector", "rdmnet.pdu.flag_v", |
| 8403 | FT_BOOLEAN, 8, NULL((void*)0), ACN_PDU_FLAG_V0x40, |
| 8404 | "Vector flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8405 | }, |
| 8406 | /* PDU Length */ |
| 8407 | { &hf_rdmnet_pdu_length, |
| 8408 | { "Length", "rdmnet.pdu.length", |
| 8409 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 8410 | "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8411 | }, |
| 8412 | /* Postamble Size */ |
| 8413 | { &hf_rdmnet_postamble_size, |
| 8414 | { "Size of postamble", "rdmnet.postamble_size", |
| 8415 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8416 | "Postamble size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8417 | }, |
| 8418 | /* Preamble Size */ |
| 8419 | { &hf_rdmnet_preamble_size, |
| 8420 | { "Size of preamble", "rdmnet.preamble_size", |
| 8421 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8422 | "Preamble size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8423 | }, |
| 8424 | /* Protocol ID */ |
| 8425 | { &hf_rdmnet_protocol_id, |
| 8426 | { "Protocol ID", "rdmnet.protocol_id", |
| 8427 | FT_UINT32, BASE_DEC, VALS(acn_protocol_id_vals)((0 ? (const struct _value_string*)0 : ((acn_protocol_id_vals )))), 0x0, |
| 8428 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8429 | }, |
| 8430 | /* Postamble Size */ |
| 8431 | { &hf_rdmnet_tcp_length, |
| 8432 | { "Data length", "rdmnet.tcp_length", |
| 8433 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 8434 | "TCP data size in bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8435 | }, |
| 8436 | /* LLRP Vector */ |
| 8437 | { &hf_rdmnet_llrp_vector, |
| 8438 | { "LLRP Vector", "rdmnet.llrp_vector", |
| 8439 | FT_UINT32, BASE_DEC, VALS(rdmnet_llrp_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_vector_vals )))), 0x0, |
| 8440 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8441 | }, |
| 8442 | /* LLRP Destination CID */ |
| 8443 | { &hf_rdmnet_llrp_destination_cid, |
| 8444 | { "CID", "rdmnet.llrp.destination_cid", |
| 8445 | FT_GUID, BASE_NONE, NULL((void*)0), 0x0, |
| 8446 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8447 | }, |
| 8448 | /* LLRP Transaction Number */ |
| 8449 | { &hf_rdmnet_llrp_transaction_number, |
| 8450 | { "Transaction Number", "rdmnet.llrp.transaction_number", |
| 8451 | FT_UINT32, BASE_DEC_HEX, NULL((void*)0), 0x0, |
| 8452 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8453 | }, |
| 8454 | /* LLRP Probe Request PDU Length */ |
| 8455 | { &hf_rdmnet_llrp_probe_request_pdu_length, |
| 8456 | { "Length", "rdmnet.llrp.probe_request.pdu.length", |
| 8457 | FT_UINT24, BASE_DEC, NULL((void*)0), 0x0, |
| 8458 | "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8459 | }, |
| 8460 | /* LLRP Probe Request Vector */ |
| 8461 | { &hf_rdmnet_llrp_probe_request_vector, |
| 8462 | { "LLRP Vector", "rdmnet.llrp.probe_request_vector", |
| 8463 | FT_UINT8, BASE_DEC, VALS(rdmnet_llrp_probe_request_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_probe_request_vals )))), 0x0, |
| 8464 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8465 | }, |
| 8466 | /* LLRP Probe Request Lower UID */ |
| 8467 | { &hf_rdmnet_llrp_probe_request_lower_uid, |
| 8468 | { "Lower UID", "rdmnet.llrp.probe_request.lower_uid", |
| 8469 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8470 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8471 | }, |
| 8472 | /* LLRP Probe Request Upper UID */ |
| 8473 | { &hf_rdmnet_llrp_probe_request_upper_uid, |
| 8474 | { "Upper UID", "rdmnet.llrp.probe_request.upper_uid", |
| 8475 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8476 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8477 | }, |
| 8478 | /* LLRP Probe Request Filter */ |
| 8479 | { &hf_rdmnet_llrp_probe_request_filter, |
| 8480 | { "Filter", "rdmnet.llrp.probe_request.filter", |
| 8481 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 8482 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8483 | }, |
| 8484 | { &hf_rdmnet_llrp_probe_request_filter_brokers_only, |
| 8485 | { "Brokers Only", "rdmnet.llrp.probe_request.filter_brokers_only", |
| 8486 | FT_BOOLEAN, 8, NULL((void*)0), RDMNET_LLRP_VECTOR_PROBE_REQUEST_BROKERS_ONLY0x02, |
| 8487 | "Brokers only flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8488 | }, |
| 8489 | { &hf_rdmnet_llrp_probe_request_filter_client_tcp_inactive, |
| 8490 | { "Client TCP Inactive", "rdmnet.llrp.probe_request.filter_client_tcp_inactive", |
| 8491 | FT_BOOLEAN, 8, NULL((void*)0), RDMNET_LLRP_VECTOR_PROBE_REQUEST_CLIENT_TCP_INACTIVE0x01, |
| 8492 | "Client TCP inactive flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8493 | }, |
| 8494 | /* LLRP Probe Request Unknown UID */ |
| 8495 | { &hf_rdmnet_llrp_probe_request_known_uid, |
| 8496 | { "Known UID", "rdmnet.llrp.probe_request.known_uid", |
| 8497 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8498 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8499 | }, |
| 8500 | { &hf_rdmnet_llrp_probe_request_known_uid_manf, |
| 8501 | { "Manufacturer ID", "rdmnet.llrp.probe_request.known_uid.manf", |
| 8502 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0, |
| 8503 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8504 | }, |
| 8505 | { &hf_rdmnet_llrp_probe_request_known_uid_dev, |
| 8506 | { "Device ID", "rdmnet.llrp.probe_request.known_uid.dev", |
| 8507 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 8508 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8509 | }, |
| 8510 | /* LLRP Probe Reply Vector */ |
| 8511 | { &hf_rdmnet_llrp_probe_reply_vector, |
| 8512 | { "LLRP Vector", "rdmnet.llrp.probe_reply_vector", |
| 8513 | FT_UINT8, BASE_DEC, VALS(rdmnet_llrp_probe_reply_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_probe_reply_vals )))), 0x0, |
| 8514 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8515 | }, |
| 8516 | /* LLRP Probe Reply UID */ |
| 8517 | { &hf_rdmnet_llrp_probe_reply_uid, |
| 8518 | { "UID", "rdmnet.llrp.probe_reply.uid", |
| 8519 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8520 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8521 | }, |
| 8522 | { &hf_rdmnet_llrp_probe_reply_uid_manf, |
| 8523 | { "Manufacturer ID", "rdmnet.llrp.probe_reply.uid.manf", |
| 8524 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0, |
| 8525 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8526 | }, |
| 8527 | { &hf_rdmnet_llrp_probe_reply_uid_dev, |
| 8528 | { "Device ID", "rdmnet.llrp.probe_reply.uid.dev", |
| 8529 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 8530 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8531 | }, |
| 8532 | /* LLRP Probe Reply Hardware Address */ |
| 8533 | { &hf_rdmnet_llrp_probe_reply_hardware_address, |
| 8534 | { "Hardware Address", "rdmnet.llrp.probe_reply.hardware_address", |
| 8535 | FT_BYTES, SEP_COLON, NULL((void*)0), 0x0, |
| 8536 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8537 | }, |
| 8538 | /* LLRP Probe Reply Component Type */ |
| 8539 | { &hf_rdmnet_llrp_probe_reply_component_type, |
| 8540 | { "Component Type", "rdmnet.llrp.probe_reply.component_type", |
| 8541 | FT_UINT8, BASE_DEC, VALS(rdmnet_llrp_probe_reply_component_type_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_probe_reply_component_type_vals )))), 0x0, |
| 8542 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8543 | }, |
| 8544 | /* LLRP RDM Command Start Code */ |
| 8545 | { &hf_rdmnet_llrp_rdm_command_start_code, |
| 8546 | { "RDM Command", "rdmnet.llrp.rdm_command.start_code", |
| 8547 | FT_UINT8, BASE_DEC, VALS(rdmnet_llrp_rdm_command_start_code_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_llrp_rdm_command_start_code_vals )))), 0x0, |
| 8548 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8549 | }, |
| 8550 | /* RPT Vector */ |
| 8551 | { &hf_rdmnet_rpt_vector, |
| 8552 | { "RPT Vector", "rdmnet.rpt_vector", |
| 8553 | FT_UINT32, BASE_DEC, VALS(rdmnet_rpt_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_vector_vals )))), 0x0, |
| 8554 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8555 | }, |
| 8556 | /* RPT Source UID */ |
| 8557 | { &hf_rdmnet_rpt_source_uid, |
| 8558 | { "Source UID", "rdmnet.rpt.source_uid", |
| 8559 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8560 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8561 | }, |
| 8562 | { &hf_rdmnet_rpt_source_uid_manf, |
| 8563 | { "Manufacturer ID", "rdmnet.rpt.source_uid.manf", |
| 8564 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0, |
| 8565 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8566 | }, |
| 8567 | { &hf_rdmnet_rpt_source_uid_dev, |
| 8568 | { "Device ID", "rdmnet.rpt.source_uid.dev", |
| 8569 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 8570 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8571 | }, |
| 8572 | /* RPT Source Endpoint ID */ |
| 8573 | { &hf_rdmnet_rpt_source_endpoint_id, |
| 8574 | { "Source Endpoint ID", "rdmnet.rpt.source_endpoint_id", |
| 8575 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8576 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8577 | }, |
| 8578 | /* RPT Destination UID */ |
| 8579 | { &hf_rdmnet_rpt_destination_uid, |
| 8580 | { "Destination UID", "rdmnet.rpt.destination_uid", |
| 8581 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8582 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8583 | }, |
| 8584 | { &hf_rdmnet_rpt_destination_uid_manf, |
| 8585 | { "Manufacturer ID", "rdmnet.rpt.destination_uid.manf", |
| 8586 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0, |
| 8587 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8588 | }, |
| 8589 | { &hf_rdmnet_rpt_destination_uid_dev, |
| 8590 | { "Device ID", "rdmnet.rpt.destination_uid.dev", |
| 8591 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 8592 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8593 | }, |
| 8594 | /* RPT Destination Endpoint ID */ |
| 8595 | { &hf_rdmnet_rpt_destination_endpoint_id, |
| 8596 | { "Destination Endpoint ID", "rdmnet.rpt.destination_endpoint_id", |
| 8597 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8598 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8599 | }, |
| 8600 | /* RPT Sequence Number */ |
| 8601 | { &hf_rdmnet_rpt_sequence_number, |
| 8602 | { "Sequence Number", "rdmnet.rpt.sequence_number", |
| 8603 | FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, |
| 8604 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8605 | }, |
| 8606 | /* RPT Reserved */ |
| 8607 | { &hf_rdmnet_rpt_reserved, |
| 8608 | { "Reserved", "rdmnet.rpt.reserved", |
| 8609 | FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, |
| 8610 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8611 | }, |
| 8612 | /* RPT Request Vector */ |
| 8613 | { &hf_rdmnet_rpt_request_vector, |
| 8614 | { "RPT Request Vector", "rdmnet.rpt.request_vector", |
| 8615 | FT_UINT32, BASE_DEC, VALS(rdmnet_rpt_request_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_request_vals )))), 0x0, |
| 8616 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8617 | }, |
| 8618 | /* RPT Request RDM Command */ |
| 8619 | { &hf_rdmnet_rpt_request_rdm_command, |
| 8620 | { "RDM Command", "rdmnet.rpt.request.rdm_command", |
| 8621 | FT_UINT8, BASE_DEC, VALS(rdmnet_rpt_request_rdm_command_start_code_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_request_rdm_command_start_code_vals )))), 0x0, |
| 8622 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8623 | }, |
| 8624 | /* RPT Status Vector */ |
| 8625 | { &hf_rdmnet_rpt_status_vector, |
| 8626 | { "Status Vector", "rdmnet.rpt.status.vector", |
| 8627 | FT_UINT16, BASE_DEC, VALS(rdmnet_rpt_status_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_status_vector_vals )))), 0x0, |
| 8628 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8629 | }, |
| 8630 | /* RPT Status Unknown RPT UID String */ |
| 8631 | { &hf_rdmnet_rpt_status_unknown_rpt_uid_string, |
| 8632 | { "Status", "rdmnet.rpt.status.unknown_rpt_uid_string", |
| 8633 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8634 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8635 | }, |
| 8636 | /* RPT Status RDM Timeout String */ |
| 8637 | { &hf_rdmnet_rpt_status_rdm_timeout_string, |
| 8638 | { "Status", "rdmnet.rpt.status.rdm_timeout_string", |
| 8639 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8640 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8641 | }, |
| 8642 | /* RPT Status Invalid RDM Response String */ |
| 8643 | { &hf_rdmnet_rpt_status_rdm_invalid_response_string, |
| 8644 | { "Status", "rdmnet.rpt.status.invalid_rdm_response_string", |
| 8645 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8646 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8647 | }, |
| 8648 | /* RPT Status Unknown RDM UID String */ |
| 8649 | { &hf_rdmnet_rpt_status_unknown_rdm_uid_string, |
| 8650 | { "Status", "rdmnet.rpt.status.unknown_rdm_uid_string", |
| 8651 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8652 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8653 | }, |
| 8654 | /* RPT Status Unknown Endpoint String */ |
| 8655 | { &hf_rdmnet_rpt_status_unknown_endpoint_string, |
| 8656 | { "Status", "rdmnet.rpt.status.unknown_endpoint_string", |
| 8657 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8658 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8659 | }, |
| 8660 | /* RPT Status Broadcast Complete String */ |
| 8661 | { &hf_rdmnet_rpt_status_broadcast_complete_string, |
| 8662 | { "Status", "rdmnet.rpt.status.broadcast_complete_string", |
| 8663 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8664 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8665 | }, |
| 8666 | /* RPT Status Unknown Vector String */ |
| 8667 | { &hf_rdmnet_rpt_status_unknown_vector_string, |
| 8668 | { "Status", "rdmnet.rpt.status.unknown_vector_string", |
| 8669 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8670 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8671 | }, |
| 8672 | /* RPT Notification Vector */ |
| 8673 | { &hf_rdmnet_rpt_notification_vector, |
| 8674 | { "RPT Notification Vector", "rdmnet.rpt.notification_vector", |
| 8675 | FT_UINT32, BASE_DEC, VALS(rdmnet_rpt_notification_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_notification_vals )))), 0x0, |
| 8676 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8677 | }, |
| 8678 | /* RPT Notification RDM Command */ |
| 8679 | { &hf_rdmnet_rpt_notification_rdm_command, |
| 8680 | { "RDM Command", "rdmnet.rpt.notification.rdm_command", |
| 8681 | FT_UINT8, BASE_DEC, VALS(rdmnet_rpt_request_rdm_command_start_code_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_rpt_request_rdm_command_start_code_vals )))), 0x0, |
| 8682 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8683 | }, |
| 8684 | /* Broker Vector */ |
| 8685 | { &hf_rdmnet_broker_vector, |
| 8686 | { "Broker Vector", "rdmnet.broker_vector", |
| 8687 | FT_UINT16, BASE_DEC, VALS(rdmnet_broker_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_broker_vector_vals )))), 0x0, |
| 8688 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8689 | }, |
| 8690 | /* Broker Client Protocol Vector */ |
| 8691 | { &hf_rdmnet_broker_client_protocol_vector, |
| 8692 | { "Client Protocol", "rdmnet.broker_client_protocol_vector", |
| 8693 | FT_UINT32, BASE_DEC, VALS(broker_client_protocol_vals)((0 ? (const struct _value_string*)0 : ((broker_client_protocol_vals )))), 0x0, |
| 8694 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8695 | }, |
| 8696 | /* Broker Client Protocol CID */ |
| 8697 | { &hf_rdmnet_broker_client_protocol_cid, |
| 8698 | { "Client CID", "rdmnet.broker_client_cid", |
| 8699 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8700 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8701 | }, |
| 8702 | /* Broker Client RPT Client UID */ |
| 8703 | { &hf_rdmnet_broker_client_rpt_client_uid, |
| 8704 | { "Client UID", "rdmnet.broker_client_rpt_client_uid", |
| 8705 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8706 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8707 | }, |
| 8708 | { &hf_rdmnet_broker_client_rpt_client_uid_manf, |
| 8709 | { "Manufacturer ID", "rdmnet.broker_client_rpt_client_uid.manf", |
| 8710 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0, |
| 8711 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8712 | }, |
| 8713 | { &hf_rdmnet_broker_client_rpt_client_uid_dev, |
| 8714 | { "Device ID", "rdmnet.broker_client_rpt_client_uid.dev", |
| 8715 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 8716 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8717 | }, |
| 8718 | /* Broker Client RPT Client Type */ |
| 8719 | { &hf_rdmnet_broker_client_rpt_client_type, |
| 8720 | { "RPT client type", "rdmnet.broker_client_rpt_client_type", |
| 8721 | FT_UINT8, BASE_DEC, VALS(broker_client_rpt_client_type_vals)((0 ? (const struct _value_string*)0 : ((broker_client_rpt_client_type_vals )))), 0x0, |
| 8722 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8723 | }, |
| 8724 | /* Broker Client RPT Binding CID */ |
| 8725 | { &hf_rdmnet_broker_client_rpt_binding_cid, |
| 8726 | { "Binding CID", "rdmnet.broker_client_rpt_binding_cid", |
| 8727 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8728 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8729 | }, |
| 8730 | /* Broker Client EPT Protocol Vector */ |
| 8731 | { &hf_rdmnet_broker_client_ept_protocol_vector, |
| 8732 | { "Protocol Vector", "rdmnet.broker_client_ept_vector", |
| 8733 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8734 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8735 | }, |
| 8736 | /* Broker Client EPT Manufacturer ID */ |
| 8737 | { &hf_rdmnet_broker_client_ept_protocol_manufacturer_id, |
| 8738 | { "Manufacturer ID", "rdmnet.broker_client_ept_manufacturer_id", |
| 8739 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0, |
| 8740 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8741 | }, |
| 8742 | /* Broker Client EPT Protocol ID */ |
| 8743 | { &hf_rdmnet_broker_client_ept_protocol_protocol_id, |
| 8744 | { "Protocol ID", "rdmnet.broker_client_ept_protocol_id", |
| 8745 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 8746 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8747 | }, |
| 8748 | /* Broker Client EPT Protocol String */ |
| 8749 | { &hf_rdmnet_broker_client_ept_protocol_string, |
| 8750 | { "Protocol String", "rdmnet.broker_client_ept_protocol_string", |
| 8751 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8752 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8753 | }, |
| 8754 | /* Broker Connect Scope */ |
| 8755 | { &hf_rdmnet_broker_connect_client_scope, |
| 8756 | { "Client Scope", "rdmnet.broker.connect.client_scope", |
| 8757 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8758 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8759 | }, |
| 8760 | /* Broker Connect E1.33 Version */ |
| 8761 | { &hf_rdmnet_broker_connect_e133_version, |
| 8762 | { "E1.33 Version", "rdmnet.broker.connect.e133_version", |
| 8763 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8764 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8765 | }, |
| 8766 | /* Broker Connect Search Domain */ |
| 8767 | { &hf_rdmnet_broker_connect_search_domain, |
| 8768 | { "Search Domain", "rdmnet.broker.connect.search_domain", |
| 8769 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8770 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8771 | }, |
| 8772 | /* Broker Connect Connection Flags */ |
| 8773 | { &hf_rdmnet_broker_connect_connection_flags, |
| 8774 | { "Flags", "rdmnet.broker.connect.flags", |
| 8775 | FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, |
| 8776 | "Connection Flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8777 | }, |
| 8778 | { &hf_rdmnet_broker_connect_connection_flags_incremental_updates, |
| 8779 | { "Incremental Updates", "rdmnet.broker.connect.flags_incremental_updates", |
| 8780 | FT_BOOLEAN, 8, NULL((void*)0), RDMNET_BROKER_VECTOR_CONNECT_INCREMENTAL_UPDATES0x01, |
| 8781 | "Incremental updates flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8782 | }, |
| 8783 | /* Broker Connect Reply Connection Code */ |
| 8784 | { &hf_rdmnet_broker_connect_reply_connection_code, |
| 8785 | { "Connection Code", "rdmnet.broker.connect_reply.connection_code", |
| 8786 | FT_UINT16, BASE_DEC, VALS(rdmnet_broker_status_code_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_broker_status_code_vals )))), 0x0, |
| 8787 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8788 | }, |
| 8789 | /* Broker Connect Reply E1.33 Version */ |
| 8790 | { &hf_rdmnet_broker_connect_reply_e133_version, |
| 8791 | { "E1.33 Version", "rdmnet.broker.connect_reply.e133_version", |
| 8792 | FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, |
| 8793 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8794 | }, |
| 8795 | /* Broker Connect Reply Broker UID */ |
| 8796 | { &hf_rdmnet_broker_connect_reply_broker_uid, |
| 8797 | { "Broker UID", "rdmnet.broker.connect_reply.broker_uid", |
| 8798 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8799 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8800 | }, |
| 8801 | { &hf_rdmnet_broker_connect_reply_broker_uid_manf, |
| 8802 | { "Manufacturer ID", "rdmnet.broker.connect_reply.broker_uid.manf", |
| 8803 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0, |
| 8804 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8805 | }, |
| 8806 | { &hf_rdmnet_broker_connect_reply_broker_uid_dev, |
| 8807 | { "Device ID", "rdmnet.broker.connect_reply.broker_uid.dev", |
| 8808 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 8809 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8810 | }, |
| 8811 | /* Broker Connect Reply Client UID */ |
| 8812 | { &hf_rdmnet_broker_connect_reply_client_uid, |
| 8813 | { "Client UID", "rdmnet.broker.connect_reply.client_uid", |
| 8814 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8815 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8816 | }, |
| 8817 | { &hf_rdmnet_broker_connect_reply_client_uid_manf, |
| 8818 | { "Manufacturer ID", "rdmnet.broker.connect_reply.client_uid.manf", |
| 8819 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0, |
| 8820 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8821 | }, |
| 8822 | { &hf_rdmnet_broker_connect_reply_client_uid_dev, |
| 8823 | { "Device ID", "rdmnet.broker.connect_reply.client_uid.dev", |
| 8824 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 8825 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8826 | }, |
| 8827 | /* Broker Client Entry Update Connection Flags */ |
| 8828 | { &hf_rdmnet_broker_client_entry_update_connection_flags, |
| 8829 | { "Flags", "rdmnet.broker.client_entry_update.flags", |
| 8830 | FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, |
| 8831 | "Connection Flags", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8832 | }, |
| 8833 | { &hf_rdmnet_broker_client_entry_update_connection_flags_incremental_updates, |
| 8834 | { "Incremental Updates", "rdmnet.broker.client_entry_update.flags_incremental_updates", |
| 8835 | FT_BOOLEAN, 8, NULL((void*)0), RDMNET_BROKER_VECTOR_CONNECT_INCREMENTAL_UPDATES0x01, |
| 8836 | "Incremental updates flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8837 | }, |
| 8838 | /* Broker Redirect IPv4 Address */ |
| 8839 | { &hf_rdmnet_broker_redirect_ipv4_address, |
| 8840 | { "IPv4 Address", "rdmnet.broker.redirect_ipv4.ipv4_address", |
| 8841 | FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, |
| 8842 | "Redirect IPv4 address", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8843 | }, |
| 8844 | /* Broker Redirect IPv4 TCP Port */ |
| 8845 | { &hf_rdmnet_broker_redirect_ipv4_tcp_port, |
| 8846 | { "IPv4 TCP Port", "rdmnet.broker.redirect_ipv4.tcp_port", |
| 8847 | FT_UINT16, BASE_PT_TCP, NULL((void*)0), 0x0, |
| 8848 | "Redirect IPv4 TCP port", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8849 | }, |
| 8850 | /* Broker Redirect IPv6 Address. TODO: is filter correct here? */ |
| 8851 | { &hf_rdmnet_broker_redirect_ipv6_address, |
| 8852 | { "IPv6 Address", "rdmnet.broker.redirect_ipv6.ipv4_address", |
| 8853 | FT_IPv6, BASE_NONE, NULL((void*)0), 0x0, |
| 8854 | "Redirect IPv6 address", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8855 | }, |
| 8856 | /* Broker Redirect IPv6 TCP Port */ |
| 8857 | { &hf_rdmnet_broker_redirect_ipv6_tcp_port, |
| 8858 | { "TCP Port", "rdmnet.broker.redirect_ipv6.tcp_port", |
| 8859 | FT_UINT16, BASE_PT_TCP, NULL((void*)0), 0x0, |
| 8860 | "Redirect IPv6 TCP port", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8861 | }, |
| 8862 | /* Broker Disconnect Reason */ |
| 8863 | { &hf_rdmnet_broker_disconnect_reason, |
| 8864 | { "Reason", "rdmnet.broker.disconnect.reason", |
| 8865 | FT_UINT16, BASE_DEC, VALS(rdmnet_broker_disconnect_reason_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_broker_disconnect_reason_vals )))), 0x0, |
| 8866 | "Disconnect reason", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8867 | }, |
| 8868 | /* Broker Dynamic UID Request */ |
| 8869 | { &hf_rdmnet_broker_dynamic_uid_request, |
| 8870 | { "Dynamic UID Request", "rdmnet.broker.request_dynamic_uids.dynamic_uid_request", |
| 8871 | FT_BYTES, SEP_DOT, NULL((void*)0), 0x0, |
| 8872 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8873 | }, |
| 8874 | /* Broker RID */ |
| 8875 | { &hf_rdmnet_broker_rid, |
| 8876 | { "RID", "rdmnet.broker.request_dynamic_uids.rid", |
| 8877 | FT_BYTES, SEP_DOT, NULL((void*)0), 0x0, |
| 8878 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8879 | }, |
| 8880 | /* Broker Assigned Dynamic UID */ |
| 8881 | { &hf_rdmnet_broker_assigned_dynamic_uid, |
| 8882 | { "Dynamic UID Request", "rdmnet.broker.assigned_dynamic_uids.dynamic_uid", |
| 8883 | FT_BYTES, SEP_DOT, NULL((void*)0), 0x0, |
| 8884 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8885 | }, |
| 8886 | /* Broker Assigned RID */ |
| 8887 | { &hf_rdmnet_broker_assigned_rid, |
| 8888 | { "RID", "rdmnet.broker.assigned_dynamic_uids.rid", |
| 8889 | FT_BYTES, SEP_DOT, NULL((void*)0), 0x0, |
| 8890 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8891 | }, |
| 8892 | /* Broker_Assigned Status Code */ |
| 8893 | { &hf_rdmnet_broker_assigned_status_code, |
| 8894 | { "Status Code", "rdmnet.broker.assigned_dynamic_uids.status_code", |
| 8895 | FT_UINT16, BASE_DEC, VALS(dynamic_uid_mapping_status_code_vals)((0 ? (const struct _value_string*)0 : ((dynamic_uid_mapping_status_code_vals )))), 0x0, |
| 8896 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8897 | }, |
| 8898 | /* Broker Fetch Dynamic UID */ |
| 8899 | { &hf_rdmnet_broker_fetch_dynamic_uid, |
| 8900 | { "Dynamic UID", "rdmnet.broker.fetch_dynamic_uids.dynamic_uid", |
| 8901 | FT_BYTES, SEP_DOT, NULL((void*)0), 0x0, |
| 8902 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8903 | }, |
| 8904 | /* EPT Vector */ |
| 8905 | { &hf_rdmnet_ept_vector, |
| 8906 | { "EPT Vector", "rdmnet.ept_vector", |
| 8907 | FT_UINT32, BASE_DEC, VALS(rdmnet_ept_vector_vals)((0 ? (const struct _value_string*)0 : ((rdmnet_ept_vector_vals )))), 0x0, |
| 8908 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8909 | }, |
| 8910 | /* EPT Destination CID */ |
| 8911 | { &hf_rdmnet_ept_destination_cid, |
| 8912 | { "Destination CID", "rdmnet.ept.destination_cid", |
| 8913 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8914 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8915 | }, |
| 8916 | /* EPT Data PDU Length */ |
| 8917 | { &hf_rdmnet_ept_data_pdu_length, |
| 8918 | { "Length", "rdmnet.ept.data.pdu.length", |
| 8919 | FT_UINT24, BASE_DEC, NULL((void*)0), 0x0, |
| 8920 | "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8921 | }, |
| 8922 | /* EPT Data Vector */ |
| 8923 | { &hf_rdmnet_ept_data_vector, |
| 8924 | { "Vector", "rdmnet.ept.data.vector", |
| 8925 | FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, |
| 8926 | "Data vector", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8927 | }, |
| 8928 | /* EPT Data Vector Manufacturer ID */ |
| 8929 | { &hf_rdmnet_ept_data_vector_manufacturer_id, |
| 8930 | { "Manufac. ID", "rdmnet.ept.data.vector.manufacturer_id", |
| 8931 | FT_UINT16, BASE_HEX|BASE_EXT_STRING0x00000200, &dmx_esta_manfid_vals_ext, 0x0, |
| 8932 | "Manufacturer id", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8933 | }, |
| 8934 | /* EPT Data Vector Protocol ID */ |
| 8935 | { &hf_rdmnet_ept_data_vector_protocol_id, |
| 8936 | { "Protocol", "rdmnet.ept.data.vector.protocol_id", |
| 8937 | FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, |
| 8938 | "Protocol id", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8939 | }, |
| 8940 | /* EPT Data Opaque Data */ |
| 8941 | { &hf_rdmnet_ept_data_opaque_data, |
| 8942 | { "Data", "rdmnet.ept.data.opaque_data", |
| 8943 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8944 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8945 | }, |
| 8946 | /* EPT Status PDU Length */ |
| 8947 | { &hf_rdmnet_ept_status_pdu_length, |
| 8948 | { "Length", "rdmnet.ept.status.pdu.length", |
| 8949 | FT_UINT24, BASE_DEC, NULL((void*)0), 0x0, |
| 8950 | "PDU Length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8951 | }, |
| 8952 | /* EPT Status Unknown CID */ |
| 8953 | { &hf_rdmnet_ept_status_unknown_cid, |
| 8954 | { "Unknown CID", "rdmnet.ept.status.unknown_cid", |
| 8955 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8956 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8957 | }, |
| 8958 | /* EPT Status Status String */ |
| 8959 | { &hf_rdmnet_ept_status_status_string, |
| 8960 | { "Status String", "rdmnet.ept.status.status_string", |
| 8961 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8962 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8963 | }, |
| 8964 | /* EPT Status Vector */ |
| 8965 | { &hf_rdmnet_ept_status_vector, |
| 8966 | { "Unknown Vector", "rdmnet.ept.status.vector", |
| 8967 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8968 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8969 | }, |
| 8970 | /* EPT Status Unknown Vector */ |
| 8971 | { &hf_rdmnet_ept_status_unknown_vector, |
| 8972 | { "Unknown Vector", "rdmnet.ept.status.unknown_vector", |
| 8973 | FT_BYTES, SEP_SPACE, NULL((void*)0), 0x0, |
| 8974 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8975 | }, |
| 8976 | /* EPT Status Vector String */ |
| 8977 | { &hf_rdmnet_ept_status_vector_string, |
| 8978 | { "Vector String", "rdmnet.ept.status.vector_string", |
| 8979 | FT_STRING, BASE_NONE, NULL((void*)0), 0x0, |
| 8980 | NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } |
| 8981 | } |
| 8982 | }; |
| 8983 | |
| 8984 | /* Setup protocol subtree array */ |
| 8985 | static int *ett[] = { |
| 8986 | &ett_acn, |
| 8987 | &ett_acn_channel_owner_info_block, |
| 8988 | &ett_acn_channel_member_info_block, |
| 8989 | &ett_acn_channel_parameter, |
| 8990 | &ett_acn_address, |
| 8991 | &ett_acn_address_type, |
| 8992 | &ett_acn_pdu_flags, |
| 8993 | &ett_acn_dmp_pdu, |
| 8994 | &ett_acn_sdt_pdu, |
| 8995 | &ett_acn_sdt_client_pdu, |
| 8996 | &ett_acn_sdt_base_pdu, |
| 8997 | &ett_acn_root_pdu, |
| 8998 | &ett_acn_dmx_address, |
| 8999 | &ett_acn_dmx_2_options, |
| 9000 | &ett_acn_dmx_data_pdu, |
| 9001 | &ett_acn_dmx_pdu, |
| 9002 | &ett_acn_blob |
| 9003 | }; |
| 9004 | |
| 9005 | /* Setup protocol subtree array */ |
| 9006 | static int *magic_ett[] = { |
| 9007 | &ett_magic |
| 9008 | }; |
| 9009 | |
| 9010 | /* Setup protocol subtree array */ |
| 9011 | static int *rdmnet_ett[] = { |
| 9012 | &ett_rdmnet, |
| 9013 | &ett_rdmnet_pdu_flags, |
| 9014 | &ett_rdmnet_llrp_base_pdu, |
| 9015 | &ett_rdmnet_llrp_probe_request_pdu, |
| 9016 | &ett_rdmnet_llrp_probe_request_filter_flags, |
| 9017 | &ett_rdmnet_llrp_probe_reply_pdu, |
| 9018 | &ett_rdmnet_llrp_rdm_command_pdu, |
| 9019 | &ett_rdmnet_rpt_base_pdu, |
| 9020 | &ett_rdmnet_rpt_request_pdu, |
| 9021 | &ett_rdmnet_rpt_status_pdu, |
| 9022 | &ett_rdmnet_rpt_notification_pdu, |
| 9023 | &ett_rdmnet_broker_base_pdu, |
| 9024 | &ett_rdmnet_broker_client_entry_pdu, |
| 9025 | &ett_rdmnet_broker_client_entry_manufacturer_protocol_ids, |
| 9026 | &ett_rdmnet_broker_connect_connection_flags, |
| 9027 | &ett_rdmnet_broker_client_entry_update_connection_flags, |
| 9028 | &ett_rdmnet_ept_base_pdu, |
| 9029 | &ett_rdmnet_ept_data_pdu, |
| 9030 | &ett_rdmnet_ept_data_vector_pdu, |
| 9031 | &ett_rdmnet_ept_status_pdu, |
| 9032 | &ett_rdmnet_uid |
| 9033 | }; |
| 9034 | |
| 9035 | static ei_register_info ei[] = { |
| 9036 | { &ei_magic_reply_invalid_type, { "magic.reply.invalid_type", PI_PROTOCOL0x09000000, PI_WARN0x00600000, "Invalid type", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE , BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE , -1, ((void*)0)}} }}, |
| 9037 | { &ei_acn_dmx_discovery_outofseq, { "acn.dmx.discovery.out_of_order_universes", PI_PROTOCOL0x09000000, PI_WARN0x00600000, "Universe list is unordered, E1.31 Sec. 8.5 requires sorted lists", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE , BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE , -1, ((void*)0)}} }}, |
| 9038 | }; |
| 9039 | |
| 9040 | module_t *acn_module; |
| 9041 | expert_module_t* expert_acn; |
| 9042 | |
| 9043 | proto_acn = proto_register_protocol("Architecture for Control Networks", "ACN", "acn"); |
| 9044 | |
| 9045 | proto_magic = proto_register_protocol("Magic Bullet", "MAGIC", "magic"); |
| 9046 | |
| 9047 | proto_rdmnet = proto_register_protocol("RDMnet", "RDMnet", "rdmnet"); |
| 9048 | |
| 9049 | proto_register_field_array(proto_acn, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0])); |
| 9050 | proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0])); |
| 9051 | |
| 9052 | acn_module = prefs_register_protocol(proto_acn, NULL((void*)0)); |
| 9053 | prefs_register_obsolete_preference(acn_module, "heuristic_acn"); |
| 9054 | |
| 9055 | prefs_register_bool_preference(acn_module, "dmx_enable", |
| 9056 | "Streaming DMX", |
| 9057 | "Enable Streaming DMX extension dissector (ANSI BSR E1.31)", |
| 9058 | &global_acn_dmx_enable); |
| 9059 | |
| 9060 | prefs_register_enum_preference(acn_module, "dmx_display_view", |
| 9061 | "DMX, display format", |
| 9062 | "Display format", |
| 9063 | &global_acn_dmx_display_view, |
| 9064 | dmx_display_view, |
| 9065 | true1); |
| 9066 | |
| 9067 | prefs_register_bool_preference(acn_module, "dmx_display_zeros", |
| 9068 | "DMX, display zeros", |
| 9069 | "Display zeros instead of dots", |
| 9070 | &global_acn_dmx_display_zeros); |
| 9071 | |
| 9072 | prefs_register_bool_preference(acn_module, "dmx_display_leading_zeros", |
| 9073 | "DMX, display leading zeros", |
| 9074 | "Display leading zeros on levels", |
| 9075 | &global_acn_dmx_display_leading_zeros); |
| 9076 | |
| 9077 | prefs_register_enum_preference(acn_module, "dmx_display_line_format", |
| 9078 | "DMX, display line format", |
| 9079 | "Display line format", |
| 9080 | &global_acn_dmx_display_line_format, |
| 9081 | dmx_display_line_format, |
| 9082 | true1); |
| 9083 | |
| 9084 | proto_register_field_array(proto_magic, magic_hf, array_length(magic_hf)(sizeof (magic_hf) / sizeof (magic_hf)[0])); |
| 9085 | proto_register_subtree_array(magic_ett, array_length(magic_ett)(sizeof (magic_ett) / sizeof (magic_ett)[0])); |
| 9086 | expert_acn = expert_register_protocol(proto_magic); |
| 9087 | expert_register_field_array(expert_acn, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0])); |
| 9088 | |
| 9089 | proto_register_field_array(proto_rdmnet, rdmnet_hf, array_length(rdmnet_hf)(sizeof (rdmnet_hf) / sizeof (rdmnet_hf)[0])); |
| 9090 | proto_register_subtree_array(rdmnet_ett, array_length(rdmnet_ett)(sizeof (rdmnet_ett) / sizeof (rdmnet_ett)[0])); |
| 9091 | |
| 9092 | acn_handle = register_dissector("acn", dissect_acn, proto_acn); |
| 9093 | } |
| 9094 | |
| 9095 | |
| 9096 | /******************************************************************************/ |
| 9097 | /* Register handoff */ |
| 9098 | void |
| 9099 | proto_reg_handoff_acn(void) |
| 9100 | { |
| 9101 | dissector_add_for_decode_as_with_preference("udp.port", acn_handle); |
| 9102 | |
| 9103 | rdm_handle = find_dissector_add_dependency("rdm", proto_acn); |
| 9104 | |
| 9105 | heur_dissector_add("udp", dissect_acn_heur, "ACN over UDP", "acn", proto_acn, HEURISTIC_DISABLE); |
| 9106 | heur_dissector_add("udp", dissect_rdmnet_over_udp_heur, "RDMnet over UDP (LLRP)", "rdmnet_udp", proto_acn, HEURISTIC_DISABLE); |
| 9107 | heur_dissector_add("tcp", dissect_rdmnet_over_tcp_heur, "RDMnet over TCP (Broker, RPT, EPT)", "rdmnet_tcp", proto_acn, HEURISTIC_DISABLE); |
| 9108 | } |
| 9109 | |
| 9110 | /* |
| 9111 | * Editor modelines |
| 9112 | * |
| 9113 | * Local Variables: |
| 9114 | * c-basic-offset: 2 |
| 9115 | * tab-width: 8 |
| 9116 | * indent-tabs-mode: nil |
| 9117 | * End: |
| 9118 | * |
| 9119 | * ex: set shiftwidth=2 tabstop=8 expandtab: |
| 9120 | * :indentSize=2:tabSize=8:noTabs=true: |
| 9121 | */ |