2 * Routines for Art-Net packet disassembly
6 * Copyright (c) 2003 by Erwin Rol <erwin@erwinrol.com>
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <gerald@wireshark.org>
10 * Copyright 1999 Gerald Combs
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
38 #include <epan/packet.h>
39 #include <epan/addr_resolv.h>
40 #include <epan/prefs.h>
41 #include <epan/strutil.h>
46 * http://www.artisticlicence.com/art-net.pdf
49 /* Define udp_port for ArtNET */
51 #define UDP_PORT_ARTNET 0x1936
53 #define ARTNET_HEADER_LENGTH 10
54 #define ARTNET_POLL_LENGTH 4
55 #define ARTNET_POLL_REPLY_LENGTH 197
56 #define ARTNET_POLL_REPLY_PORT_INFO_LENGTH 22
57 #define ARTNET_POLL_REPLY_PORT_TYPES_LENGTH 4
58 #define ARTNET_POLL_REPLY_GOOD_INPUT_LENGTH 4
59 #define ARTNET_POLL_REPLY_GOOD_OUTPUT_LENGTH 4
60 #define ARTNET_POLL_REPLY_SWIN_LENGTH 4
61 #define ARTNET_POLL_REPLY_SWOUT_LENGTH 4
62 #define ARTNET_ADDRESS_LENGTH 97
63 #define ARTNET_ADDRESS_SWIN_LENGTH 4
64 #define ARTNET_ADDRESS_SWOUT_LENGTH 4
65 #define ARTNET_OUTPUT_LENGTH 1
66 #define ARTNET_INPUT_LENGTH 10
67 #define ARTNET_INPUT_INPUT_LENGTH 4
68 #define ARTNET_FIRMWARE_MASTER_LENGTH 1035
69 #define ARTNET_FIRMWARE_REPLY_LENGTH 26
70 #define ARTNET_VIDEO_SETUP_LENGTH 74
71 #define ARTNET_VIDEO_PALETTE_LENGTH 55
72 #define ARTNET_VIDEO_DATA_LENGTH 8
75 #define ARTNET_OP_POLL 0x2000
76 #define ARTNET_OP_POLL_REPLY 0x2100
77 #define ARTNET_OP_POLL_SERVER_REPLY 0x2200
78 #define ARTNET_OP_OUTPUT 0x5000
79 #define ARTNET_OP_ADDRESS 0x6000
80 #define ARTNET_OP_INPUT 0x7000
81 #define ARTNET_OP_VIDEO_SETUP 0xa010
82 #define ARTNET_OP_VIDEO_PALETTE 0xa020
83 #define ARTNET_OP_VIDEO_DATA 0xa040
85 #define ARTNET_OP_TOD_REQUEST 0x8000
86 #define ARTNET_OP_TOD_DATA 0x8100
87 #define ARTNET_OP_TOD_CONTROL 0x8200
88 #define ARTNET_OP_RDM 0x8300
90 #define ARTNET_OP_MAC_MASTER 0xf000
91 #define ARTNET_OP_MAC_SLAVE 0xf100
92 #define ARTNET_OP_FIRMWARE_MASTER 0xf200
93 #define ARTNET_OP_FIRMWARE_REPLY 0xf300
95 #define ARTNET_OP_IP_PROG 0xf800
96 #define ARTNET_OP_IP_PROG_REPLY 0xf900
98 static const value_string artnet_opcode_vals[] = {
99 { ARTNET_OP_POLL, "ArtPoll packet" },
100 { ARTNET_OP_POLL_REPLY, "ArtPollReply packet" },
101 { ARTNET_OP_POLL_SERVER_REPLY, "ArtPollServerReply packet" },
102 { ARTNET_OP_OUTPUT, "ArtDMX data packet" },
103 { ARTNET_OP_ADDRESS, "ArtAddress packet" },
104 { ARTNET_OP_INPUT, "ArtInput packet" },
105 { ARTNET_OP_VIDEO_SETUP, "ArtVideoSetup packet" },
106 { ARTNET_OP_VIDEO_PALETTE, "ArtVideoPalette packet" },
107 { ARTNET_OP_VIDEO_DATA, "ArtVideoData packet" },
108 { ARTNET_OP_TOD_REQUEST, "ArtTodRequest packet" },
109 { ARTNET_OP_TOD_DATA, "ArtTodData packet" },
110 { ARTNET_OP_TOD_CONTROL, "ArtTodControl packet" },
111 { ARTNET_OP_RDM, "ArtRdm packet" },
112 { ARTNET_OP_MAC_MASTER, "ArtMacMaster packet" },
113 { ARTNET_OP_MAC_SLAVE, "ArtMacSlave packet" },
114 { ARTNET_OP_FIRMWARE_MASTER, "ArtFirmwareMaster packet" },
115 { ARTNET_OP_FIRMWARE_REPLY, "ArtFirmwareReply packet" },
116 { ARTNET_OP_IP_PROG, "ArtIpProg packet" },
117 { ARTNET_OP_IP_PROG_REPLY, "ArtIpProgReply packet" },
121 static const value_string artnet_oem_code_vals[] = {
122 { 0x0000, "Artistic Licence:DMX-Hub:4x DMX in,4x DMX out" },
123 { 0x0001, "ADB:Netgate:4x DMX in,4x DMX out" },
124 { 0x0002, "MA Lighting:TBA:4x DMX in,4x DMX out" },
125 { 0x0003, "Artistic Licence:Ether-Lynx:2x DMX in,4x DMX out" },
126 { 0x0004, "LewLight:Capture v2:TBA" },
127 { 0x0005, "High End:TBA:TBA" },
128 { 0x0006, "Avolites:TBA:TBA" },
129 { 0x0010, "Artistic Licence:Down-Lynx:2x DMX out. Wall Panel." },
130 { 0x0011, "Artistic Licence:Up-Lynx:2x DMX in. Wall Panel" },
131 { 0x0014, "Artistic Licence:Net-Lynx O/P:2x DMX out. Boxed Product" },
132 { 0x0015, "Artistic Licence:Net-Lynx I/P:2x DMX in. Boxed Product" },
133 { 0x0030, "Doug Fleenor Design:TBA:2x DMX out" },
134 { 0x0031, "Doug Fleenor Design:TBA:2x DMX in" },
135 { 0x0050, "Goddard Design:DMX-Link (tm) O/P:2x DMX out" },
136 { 0x0051, "Goddard Design:DMX-Link (tm) I/P:2x DMX in" },
137 { 0x0070, "ADB:Net-Port O/P:2x DMX out" },
138 { 0x0071, "ADB:Net-Port I/P:2x DMX in" },
139 { 0x0072, "ADB:Reserved:" },
140 { 0x0073, "ADB:Reserved:" },
141 { 0x0074, "ADB:Reserved:" },
142 { 0x0075, "ADB:Reserved:" },
143 { 0x0076, "ADB:Reserved:" },
144 { 0x0077, "ADB:Reserved:" },
145 { 0x0078, "ADB:Reserved:" },
146 { 0x0079, "ADB:Reserved:" },
147 { 0x007A, "ADB:Reserved:" },
148 { 0x007B, "ADB:Reserved:" },
149 { 0x007C, "ADB:Reserved:" },
150 { 0x007D, "ADB:Reserved:" },
151 { 0x007E, "ADB:Reserved:" },
152 { 0x007F, "ADB:Reserved:" },
153 { 0x008C, "Zero 88:TBA:2x DMX out" },
154 { 0x008D, "Zero 88:TBA:2x DMX in" },
155 { 0x008E, "Flying Pig:TBA:2x DMX out" },
156 { 0x008F, "Flying Pig:TBA:2x DMX in" },
157 { 0x0090, "ELC:ELC 2:2x DMX out" },
158 { 0x0091, "ELC:ELC 4:4x DMX in. 4x DMX out" },
159 { 0x0180, "Martin:Maxxyz:4x DMX in. 4x DMX out" },
160 { 0x0190, "Enttec:Reserved:" },
161 { 0x0191, "Enttec:Reserved:" },
162 { 0x0192, "Enttec:Reserved:" },
163 { 0x0193, "Enttec:Reserved:" },
164 { 0x0194, "Enttec:Reserved:" },
165 { 0x0195, "Enttec:Reserved:" },
166 { 0x0196, "Enttec:Reserved:" },
167 { 0x0197, "Enttec:Reserved:" },
168 { 0x0198, "Enttec:Reserved:" },
169 { 0x0199, "Enttec:Reserved:" },
170 { 0x019A, "Enttec:Reserved:" },
171 { 0x019B, "Enttec:Reserved:" },
172 { 0x019C, "Enttec:Reserved:" },
173 { 0x019D, "Enttec:Reserved:" },
174 { 0x019E, "Enttec:Reserved:" },
175 { 0x019F, "Enttec:Reserved:" },
176 { 0x8000, "ADB:Netgate XT:Video output and trigger inputs" },
177 { 0x8001, "Artistic Licence:Net-Patch:TBA" },
178 { 0x8002, "Artistic Licence:DMX-Hub XT:Video output and trigger inputs" },
179 { 0x8003, "Artistic Licence:No-Worries XT:Real time data record - playback" },
183 static const value_string artnet_esta_man_vals[] = {
184 { 0x414C, "Artistic Licence" },
188 #define ARTNET_AC_NONE 0x00
189 #define ARTNET_AC_CANCEL_MERGE 0x01
190 #define ARTNET_AC_LED_NORMAL 0x02
191 #define ARTNET_AC_LED_MUTE 0x03
192 #define ARTNET_AC_LED_LOCATE 0x04
193 #define ARTNET_AC_RESET_RX_FLAGS 0x05
194 #define ARTNET_AC_MERGE_LTP0 0x10
195 #define ARTNET_AC_MERGE_LTP1 0x11
196 #define ARTNET_AC_MERGE_LTP2 0x12
197 #define ARTNET_AC_MERGE_LTP3 0x13
198 #define ARTNET_AC_MERGE_HTP0 0x50
199 #define ARTNET_AC_MERGE_HTP1 0x51
200 #define ARTNET_AC_MERGE_HTP2 0x52
201 #define ARTNET_AC_MERGE_HTP3 0x53
202 #define ARTNET_AC_CLEAR_OP0 0x90
203 #define ARTNET_AC_CLEAR_OP1 0x91
204 #define ARTNET_AC_CLEAR_OP2 0x92
205 #define ARTNET_AC_CLEAR_OP3 0x93
207 static const value_string artnet_address_command_vals[] = {
208 { ARTNET_AC_NONE, "No Action" },
209 { ARTNET_AC_CANCEL_MERGE, "Cancel merge" },
210 { ARTNET_AC_LED_NORMAL, "LED Normal" },
211 { ARTNET_AC_LED_MUTE, "LED Mute" },
212 { ARTNET_AC_LED_LOCATE, "LED Locate" },
213 { ARTNET_AC_RESET_RX_FLAGS, "Reset SIP text" },
214 { ARTNET_AC_MERGE_LTP0, "DMX port 1 LTP" },
215 { ARTNET_AC_MERGE_LTP1, "DMX port 2 LTP" },
216 { ARTNET_AC_MERGE_LTP2, "DXM port 3 LTP" },
217 { ARTNET_AC_MERGE_LTP3, "DMX port 4 LTP" },
218 { ARTNET_AC_MERGE_HTP0, "DMX port 1 HTP" },
219 { ARTNET_AC_MERGE_HTP1, "DMX port 2 HTP" },
220 { ARTNET_AC_MERGE_HTP2, "DXM port 3 HTP" },
221 { ARTNET_AC_MERGE_HTP3, "DMX port 4 HTP" },
222 { ARTNET_AC_CLEAR_OP0, "Clear DMX port 1" },
223 { ARTNET_AC_CLEAR_OP1, "Clear DMX port 2" },
224 { ARTNET_AC_CLEAR_OP2, "Clear DXM port 3" },
225 { ARTNET_AC_CLEAR_OP3, "Clear DMX port 4" },
229 #define ARTNET_FT_FIRM_FIRST 0x00
230 #define ARTNET_FT_FIRM_CONT 0x01
231 #define ARTNET_FT_FIRM_LAST 0x02
232 #define ARTNET_FT_UBEA_FIRST 0x03
233 #define ARTNET_FT_UBEA_CONT 0x04
234 #define ARTNET_FT_UBEA_LAST 0x05
236 static const value_string artnet_firmware_master_type_vals[] = {
237 { ARTNET_FT_FIRM_FIRST, "FirmFirst" },
238 { ARTNET_FT_FIRM_CONT, "FirmCont" },
239 { ARTNET_FT_FIRM_LAST, "FirmLast" },
240 { ARTNET_FT_UBEA_FIRST, "UbeaFirst" },
241 { ARTNET_FT_UBEA_CONT, "UbeaCont" },
242 { ARTNET_FT_UBEA_LAST, "UbeaLast" },
246 #define ARTNET_FRT_FIRM_BLOCK_GOOD 0x00
247 #define ARTNET_FRT_FIRM_ALL_GOOD 0x01
248 #define ARTNET_FRT_FIRM_FAIL 0xff
250 static const value_string artnet_firmware_reply_type_vals[] = {
251 { ARTNET_FRT_FIRM_BLOCK_GOOD, "FirmBlockGood" },
252 { ARTNET_FRT_FIRM_ALL_GOOD, "FirmAllGood" },
253 { ARTNET_FRT_FIRM_FAIL, "FirmFail" },
257 static const value_string artnet_tod_request_command_vals[] = {
261 #define ARTNET_TDC_TOD_FULL 0x00
262 #define ARTNET_TDC_TOD_NAK 0xFF
264 static const value_string artnet_tod_data_command_vals[] = {
265 { ARTNET_TDC_TOD_FULL, "TodFull" },
266 { ARTNET_TDC_TOD_NAK, "TodNak" },
270 #define ARTNET_TCC_ATC_NONE 0x00
271 #define ARTNET_TCC_ATC_FLUSH 0x01
273 static const value_string artnet_tod_control_command_vals[] = {
274 { ARTNET_TCC_ATC_NONE, "AtcNone" },
275 { ARTNET_TCC_ATC_FLUSH, "AtcFlush" },
279 #define ARTNET_RC_AR_PROCESS 0x00
281 static const value_string artnet_rdm_command_vals[] = {
282 { ARTNET_RC_AR_PROCESS, "ArProcess" },
286 void proto_reg_handoff_artnet(void);
288 /* Define the artnet proto */
289 static int proto_artnet = -1;
293 static int hf_artnet_filler = -1;
294 static int hf_artnet_spare = -1;
297 static int hf_artnet_header = -1;
298 static int hf_artnet_header_id = -1;
299 static int hf_artnet_header_opcode = -1;
300 static int hf_artnet_header_protver = -1;
303 static int hf_artnet_poll = -1;
304 static int hf_artnet_poll_talktome = -1;
305 static int hf_artnet_poll_talktome_reply_dest = -1;
306 static int hf_artnet_poll_talktome_reply_type = -1;
307 static int hf_artnet_poll_talktome_unused = -1;
310 static int hf_artnet_poll_reply = -1;
311 static int hf_artnet_poll_reply_ip_address = -1;
312 static int hf_artnet_poll_reply_port_nr = -1;
313 static int hf_artnet_poll_reply_versinfo = -1;
314 static int hf_artnet_poll_reply_subswitch = -1;
315 static int hf_artnet_poll_reply_oem = -1;
316 static int hf_artnet_poll_reply_ubea_version = -1;
317 static int hf_artnet_poll_reply_status = -1;
318 static int hf_artnet_poll_reply_esta_man = -1;
319 static int hf_artnet_poll_reply_short_name = -1;
320 static int hf_artnet_poll_reply_long_name = -1;
321 static int hf_artnet_poll_reply_node_report = -1;
322 static int hf_artnet_poll_reply_port_info = -1;
323 static int hf_artnet_poll_reply_num_ports = -1;
324 static int hf_artnet_poll_reply_port_types = -1;
325 static int hf_artnet_poll_reply_port_types_1 = -1;
326 static int hf_artnet_poll_reply_port_types_2 = -1;
327 static int hf_artnet_poll_reply_port_types_3 = -1;
328 static int hf_artnet_poll_reply_port_types_4 = -1;
329 static int hf_artnet_poll_reply_good_input = -1;
330 static int hf_artnet_poll_reply_good_input_1 = -1;
331 static int hf_artnet_poll_reply_good_input_2 = -1;
332 static int hf_artnet_poll_reply_good_input_3 = -1;
333 static int hf_artnet_poll_reply_good_input_4 = -1;
334 static int hf_artnet_poll_reply_good_output = -1;
335 static int hf_artnet_poll_reply_good_output_1 = -1;
336 static int hf_artnet_poll_reply_good_output_2 = -1;
337 static int hf_artnet_poll_reply_good_output_3 = -1;
338 static int hf_artnet_poll_reply_good_output_4 = -1;
339 static int hf_artnet_poll_reply_swin = -1;
340 static int hf_artnet_poll_reply_swin_1 = -1;
341 static int hf_artnet_poll_reply_swin_2 = -1;
342 static int hf_artnet_poll_reply_swin_3 = -1;
343 static int hf_artnet_poll_reply_swin_4 = -1;
344 static int hf_artnet_poll_reply_swout = -1;
345 static int hf_artnet_poll_reply_swout_1 = -1;
346 static int hf_artnet_poll_reply_swout_2 = -1;
347 static int hf_artnet_poll_reply_swout_3 = -1;
348 static int hf_artnet_poll_reply_swout_4 = -1;
349 static int hf_artnet_poll_reply_swvideo = -1;
350 static int hf_artnet_poll_reply_swmacro = -1;
351 static int hf_artnet_poll_reply_swremote = -1;
352 static int hf_artnet_poll_reply_mac = -1;
355 static int hf_artnet_output = -1;
356 static int hf_artnet_output_sequence = -1;
357 static int hf_artnet_output_physical = -1;
358 static int hf_artnet_output_universe = -1;
359 static int hf_artnet_output_length = -1;
360 static int hf_artnet_output_data = -1;
361 static int hf_artnet_output_dmx_data = -1;
362 static int hf_artnet_output_data_filter = -1;
365 static int hf_artnet_address = -1;
366 static int hf_artnet_address_short_name = -1;
367 static int hf_artnet_address_long_name = -1;
368 static int hf_artnet_address_swin = -1;
369 static int hf_artnet_address_swin_1 = -1;
370 static int hf_artnet_address_swin_2 = -1;
371 static int hf_artnet_address_swin_3 = -1;
372 static int hf_artnet_address_swin_4 = -1;
373 static int hf_artnet_address_swout = -1;
374 static int hf_artnet_address_swout_1 = -1;
375 static int hf_artnet_address_swout_2 = -1;
376 static int hf_artnet_address_swout_3 = -1;
377 static int hf_artnet_address_swout_4 = -1;
378 static int hf_artnet_address_subswitch = -1;
379 static int hf_artnet_address_swvideo = -1;
380 static int hf_artnet_address_command = -1;
383 static int hf_artnet_input = -1;
384 static int hf_artnet_input_num_ports = -1;
385 static int hf_artnet_input_input = -1;
386 static int hf_artnet_input_input_1 = -1;
387 static int hf_artnet_input_input_2 = -1;
388 static int hf_artnet_input_input_3 = -1;
389 static int hf_artnet_input_input_4 = -1;
391 /* ArtFirmwareMaster */
392 static int hf_artnet_firmware_master = -1;
393 static int hf_artnet_firmware_master_type = -1;
394 static int hf_artnet_firmware_master_block_id = -1;
395 static int hf_artnet_firmware_master_length = -1;
396 static int hf_artnet_firmware_master_data = -1;
398 /* ArtFirmwareReply */
399 static int hf_artnet_firmware_reply = -1;
400 static int hf_artnet_firmware_reply_type = -1;
403 static int hf_artnet_video_setup = -1;
404 static int hf_artnet_video_setup_control = -1;
405 static int hf_artnet_video_setup_font_height = -1;
406 static int hf_artnet_video_setup_first_font = -1;
407 static int hf_artnet_video_setup_last_font = -1;
408 static int hf_artnet_video_setup_win_font_name = -1;
409 static int hf_artnet_video_setup_font_data = -1;
411 /* ArtVideoPalette */
412 static int hf_artnet_video_palette = -1;
413 static int hf_artnet_video_palette_colour_red = -1;
414 static int hf_artnet_video_palette_colour_green = -1;
415 static int hf_artnet_video_palette_colour_blue = -1;
418 static int hf_artnet_video_data = -1;
419 static int hf_artnet_video_data_pos_x = -1;
420 static int hf_artnet_video_data_pos_y = -1;
421 static int hf_artnet_video_data_len_x = -1;
422 static int hf_artnet_video_data_len_y = -1;
423 static int hf_artnet_video_data_data = -1;
425 /* ArtPollServerReply */
426 static int hf_artnet_poll_server_reply = -1;
429 static int hf_artnet_tod_request = -1;
430 static int hf_artnet_tod_request_command = -1;
431 static int hf_artnet_tod_request_ad_count = -1;
432 static int hf_artnet_tod_request_address = -1;
435 static int hf_artnet_tod_data = -1;
436 static int hf_artnet_tod_data_port = -1;
437 static int hf_artnet_tod_data_command_response = -1;
438 static int hf_artnet_tod_data_address = -1;
439 static int hf_artnet_tod_data_uid_total = -1;
440 static int hf_artnet_tod_data_block_count = -1;
441 static int hf_artnet_tod_data_uid_count = -1;
442 static int hf_artnet_tod_data_tod = -1;
445 static int hf_artnet_tod_control = -1;
446 static int hf_artnet_tod_control_command = -1;
447 static int hf_artnet_tod_control_address = -1;
450 static int hf_artnet_rdm = -1;
451 static int hf_artnet_rdm_command = -1;
452 static int hf_artnet_rdm_address = -1;
455 static int hf_artnet_ip_prog = -1;
456 static int hf_artnet_ip_prog_command = -1;
457 static int hf_artnet_ip_prog_command_prog_port = -1;
458 static int hf_artnet_ip_prog_command_prog_sm = -1;
459 static int hf_artnet_ip_prog_command_prog_ip = -1;
460 static int hf_artnet_ip_prog_command_reset = -1;
461 static int hf_artnet_ip_prog_command_unused = -1;
462 static int hf_artnet_ip_prog_command_prog_enable = -1;
463 static int hf_artnet_ip_prog_ip = -1;
464 static int hf_artnet_ip_prog_sm = -1;
465 static int hf_artnet_ip_prog_port = -1;
468 static int hf_artnet_ip_prog_reply = -1;
469 static int hf_artnet_ip_prog_reply_ip = -1;
470 static int hf_artnet_ip_prog_reply_sm = -1;
471 static int hf_artnet_ip_prog_reply_port = -1;
473 /* Define the tree for artnet */
474 static int ett_artnet = -1;
477 * Here are the global variables associated with the preferences
481 static guint global_udp_port_artnet = UDP_PORT_ARTNET;
482 static gint global_disp_chan_val_type = 0;
483 static gint global_disp_col_count = 16;
484 static gint global_disp_chan_nr_type = 0;
486 /* A static handle for the rdm dissector */
487 static dissector_handle_t rdm_handle;
490 dissect_artnet_poll(tvbuff_t *tvb, guint offset, proto_tree *tree)
493 proto_tree *flags_tree, *flags_item;
495 talktome = tvb_get_guint8(tvb, offset);
496 flags_item = proto_tree_add_uint(tree, hf_artnet_poll_talktome, tvb,
497 offset, 1, talktome);
499 flags_tree=proto_item_add_subtree(flags_item, ett_artnet);
500 proto_tree_add_item(flags_tree, hf_artnet_poll_talktome_reply_dest, tvb, offset, 1, FALSE);
501 proto_tree_add_item(flags_tree, hf_artnet_poll_talktome_reply_type, tvb, offset, 1, FALSE);
502 proto_tree_add_item(flags_tree, hf_artnet_poll_talktome_unused, tvb, offset, 1, FALSE);
506 proto_tree_add_item(tree, hf_artnet_filler, tvb,
514 dissect_artnet_poll_reply(tvbuff_t *tvb, guint offset, proto_tree *tree)
516 proto_tree *hi,*si,*ti;
517 guint8 swin,swout,swvideo,swmacro,swremote;
518 guint8 port_types,good_input,good_output;
521 proto_tree_add_item(tree, hf_artnet_poll_reply_ip_address, tvb,
525 proto_tree_add_item(tree, hf_artnet_poll_reply_port_nr, tvb,
529 proto_tree_add_item(tree, hf_artnet_poll_reply_versinfo, tvb,
533 proto_tree_add_item(tree, hf_artnet_poll_reply_subswitch, tvb,
537 proto_tree_add_item(tree, hf_artnet_poll_reply_oem, tvb,
541 proto_tree_add_item(tree, hf_artnet_poll_reply_ubea_version, tvb,
545 proto_tree_add_item(tree, hf_artnet_poll_reply_status, tvb,
549 proto_tree_add_item(tree, hf_artnet_poll_reply_esta_man, tvb,
553 proto_tree_add_item(tree, hf_artnet_poll_reply_short_name,
554 tvb, offset, 18, FALSE);
557 proto_tree_add_item(tree, hf_artnet_poll_reply_long_name,
558 tvb, offset, 64, FALSE);
561 proto_tree_add_item(tree, hf_artnet_poll_reply_node_report,
562 tvb, offset, 64, FALSE);
566 hi = proto_tree_add_item(tree,
567 hf_artnet_poll_reply_port_info,
570 ARTNET_POLL_REPLY_PORT_INFO_LENGTH,
573 si = proto_item_add_subtree(hi, ett_artnet);
575 num_ports = tvb_get_ntohs(tvb, offset);
576 proto_tree_add_uint(si, hf_artnet_poll_reply_num_ports, tvb,
577 offset, 2, num_ports);
580 hi = proto_tree_add_item(si,
581 hf_artnet_poll_reply_port_types,
584 ARTNET_POLL_REPLY_PORT_TYPES_LENGTH,
587 ti = proto_item_add_subtree(hi, ett_artnet);
589 port_types = tvb_get_guint8(tvb, offset);
590 proto_tree_add_uint(ti, hf_artnet_poll_reply_port_types_1, tvb,
591 offset, 1, port_types);
594 port_types = tvb_get_guint8(tvb, offset);
595 proto_tree_add_uint(ti, hf_artnet_poll_reply_port_types_2, tvb,
596 offset, 1, port_types);
599 port_types = tvb_get_guint8(tvb, offset);
600 proto_tree_add_uint(ti, hf_artnet_poll_reply_port_types_3, tvb,
601 offset, 1, port_types);
604 port_types = tvb_get_guint8(tvb, offset);
605 proto_tree_add_uint(ti, hf_artnet_poll_reply_port_types_4, tvb,
606 offset, 1, port_types);
609 hi = proto_tree_add_item(si,
610 hf_artnet_poll_reply_good_input,
613 ARTNET_POLL_REPLY_GOOD_INPUT_LENGTH,
616 ti = proto_item_add_subtree(hi, ett_artnet);
618 good_input = tvb_get_guint8(tvb, offset);
619 proto_tree_add_uint(ti, hf_artnet_poll_reply_good_input_1, tvb,
620 offset, 1, good_input);
623 good_input = tvb_get_guint8(tvb, offset);
624 proto_tree_add_uint(ti, hf_artnet_poll_reply_good_input_2, tvb,
625 offset, 1, good_input);
628 good_input = tvb_get_guint8(tvb, offset);
629 proto_tree_add_uint(ti, hf_artnet_poll_reply_good_input_3, tvb,
630 offset, 1, good_input);
633 good_input = tvb_get_guint8(tvb, offset);
634 proto_tree_add_uint(ti, hf_artnet_poll_reply_good_input_4, tvb,
635 offset, 1, good_input);
638 hi = proto_tree_add_item(si,
639 hf_artnet_poll_reply_good_output,
642 ARTNET_POLL_REPLY_GOOD_OUTPUT_LENGTH,
645 ti = proto_item_add_subtree(hi, ett_artnet);
647 good_output = tvb_get_guint8(tvb, offset);
648 proto_tree_add_uint(ti, hf_artnet_poll_reply_good_output_1, tvb,
649 offset, 1, good_output);
652 good_output = tvb_get_guint8(tvb, offset);
653 proto_tree_add_uint(ti, hf_artnet_poll_reply_good_output_2, tvb,
654 offset, 1, good_output);
657 good_output = tvb_get_guint8(tvb, offset);
658 proto_tree_add_uint(ti, hf_artnet_poll_reply_good_output_3, tvb,
659 offset, 1, good_output);
662 good_output = tvb_get_guint8(tvb, offset);
663 proto_tree_add_uint(ti, hf_artnet_poll_reply_good_output_4, tvb,
664 offset, 1, good_output);
667 hi = proto_tree_add_item(si,
668 hf_artnet_poll_reply_swin,
671 ARTNET_POLL_REPLY_SWIN_LENGTH,
674 ti = proto_item_add_subtree(hi, ett_artnet);
676 swin = tvb_get_guint8(tvb, offset);
677 proto_tree_add_uint(ti, hf_artnet_poll_reply_swin_1, tvb,
681 swin = tvb_get_guint8(tvb, offset);
682 proto_tree_add_uint(ti, hf_artnet_poll_reply_swin_2, tvb,
686 swin = tvb_get_guint8(tvb, offset);
687 proto_tree_add_uint(ti, hf_artnet_poll_reply_swin_3, tvb,
691 swin = tvb_get_guint8(tvb, offset);
692 proto_tree_add_uint(ti, hf_artnet_poll_reply_swin_4, tvb,
696 hi = proto_tree_add_item(si,
697 hf_artnet_poll_reply_swout,
700 ARTNET_POLL_REPLY_SWOUT_LENGTH,
703 ti = proto_item_add_subtree(hi, ett_artnet);
705 swout = tvb_get_guint8(tvb, offset);
706 proto_tree_add_uint(ti, hf_artnet_poll_reply_swout_1, tvb,
710 swout = tvb_get_guint8(tvb, offset);
711 proto_tree_add_uint(ti, hf_artnet_poll_reply_swout_2, tvb,
715 swout = tvb_get_guint8(tvb, offset);
716 proto_tree_add_uint(ti, hf_artnet_poll_reply_swout_3, tvb,
720 swout = tvb_get_guint8(tvb, offset);
721 proto_tree_add_uint(ti, hf_artnet_poll_reply_swout_4, tvb,
725 swvideo = tvb_get_guint8(tvb, offset);
726 proto_tree_add_uint(tree, hf_artnet_poll_reply_swvideo, tvb,
730 swmacro = tvb_get_guint8(tvb, offset);
731 proto_tree_add_uint(tree, hf_artnet_poll_reply_swmacro, tvb,
735 swremote = tvb_get_guint8(tvb, offset);
736 proto_tree_add_uint(tree, hf_artnet_poll_reply_swremote, tvb,
737 offset, 1, swremote);
740 proto_tree_add_item(tree, hf_artnet_spare, tvb,
744 proto_tree_add_item(tree, hf_artnet_poll_reply_mac,
745 tvb, offset, 6, FALSE);
753 dissect_artnet_output(tvbuff_t *tvb, guint offset, proto_tree *tree)
757 guint16 length,r,c,row_count;
759 static char string[255];
761 const char* chan_format[] = {
766 const char* string_format[] = {
771 proto_tree_add_item(tree, hf_artnet_output_sequence, tvb,
775 proto_tree_add_item(tree, hf_artnet_output_physical, tvb,
779 proto_tree_add_item(tree, hf_artnet_output_universe, tvb,
783 length = tvb_get_ntohs(tvb, offset);
784 proto_tree_add_uint(tree, hf_artnet_output_length, tvb,
788 hi = proto_tree_add_item(tree,
789 hf_artnet_output_data,
795 si = proto_item_add_subtree(hi, ett_artnet);
797 row_count = (length/global_disp_col_count) + ((length%global_disp_col_count) == 0 ? 0 : 1);
799 for (r=0; r < row_count;r++) {
800 for (c=0;(c < global_disp_col_count) && (((r*global_disp_col_count)+c) < length);c++) {
801 if ((c % (global_disp_col_count/2)) == 0) {
802 ptr += g_snprintf(ptr, sizeof string - strlen(string), " ");
805 v = tvb_get_guint8(tvb, (offset+(r*global_disp_col_count)+c));
806 if (global_disp_chan_val_type == 0) {
809 ptr += g_snprintf(ptr, sizeof string - strlen(string), "FL ");
811 ptr += g_snprintf(ptr, sizeof string - strlen(string), chan_format[global_disp_chan_val_type], v);
814 ptr += g_snprintf(ptr, sizeof string - strlen(string), chan_format[global_disp_chan_val_type], v);
818 proto_tree_add_none_format(si,hf_artnet_output_dmx_data, tvb,
819 offset+(r*global_disp_col_count), c,
820 string_format[global_disp_chan_nr_type], (r*global_disp_col_count)+1, string);
824 /* Add the real type hidden */
825 item = proto_tree_add_item(si, hf_artnet_output_data_filter, tvb,
826 offset, length, FALSE );
827 PROTO_ITEM_SET_HIDDEN(item);
834 dissect_artnet_address(tvbuff_t *tvb, guint offset, proto_tree *tree) {
835 proto_tree *hi,*si,*ti;
836 guint8 swin,swout,swvideo,command;
838 proto_tree_add_item(tree, hf_artnet_filler, tvb,
842 proto_tree_add_item(tree, hf_artnet_address_short_name,
843 tvb, offset, 18, FALSE);
846 proto_tree_add_item(tree, hf_artnet_address_long_name,
847 tvb, offset, 64, FALSE);
850 hi = proto_tree_add_item(tree,
851 hf_artnet_address_swin,
854 ARTNET_ADDRESS_SWIN_LENGTH,
857 ti = proto_item_add_subtree(hi, ett_artnet);
859 swin = tvb_get_guint8(tvb, offset);
860 proto_tree_add_uint(ti, hf_artnet_address_swin_1, tvb,
864 swin = tvb_get_guint8(tvb, offset);
865 proto_tree_add_uint(ti, hf_artnet_address_swin_2, tvb,
869 swin = tvb_get_guint8(tvb, offset);
870 proto_tree_add_uint(ti, hf_artnet_address_swin_3, tvb,
874 swin = tvb_get_guint8(tvb, offset);
875 proto_tree_add_uint(ti, hf_artnet_address_swin_4, tvb,
879 hi = proto_tree_add_item(tree,
880 hf_artnet_address_swout,
883 ARTNET_ADDRESS_SWOUT_LENGTH,
886 si = proto_item_add_subtree(hi, ett_artnet);
888 swout = tvb_get_guint8(tvb, offset);
889 proto_tree_add_uint(si, hf_artnet_address_swout_1, tvb,
893 swout = tvb_get_guint8(tvb, offset);
894 proto_tree_add_uint(si, hf_artnet_address_swout_2, tvb,
898 swout = tvb_get_guint8(tvb, offset);
899 proto_tree_add_uint(si, hf_artnet_address_swout_3, tvb,
903 swout = tvb_get_guint8(tvb, offset);
904 proto_tree_add_uint(si, hf_artnet_address_swout_4, tvb,
908 swvideo = tvb_get_guint8(tvb, offset);
909 proto_tree_add_uint(tree, hf_artnet_address_swvideo, tvb,
913 command = tvb_get_guint8(tvb, offset);
914 proto_tree_add_uint(tree, hf_artnet_address_command, tvb,
923 dissect_artnet_input(tvbuff_t *tvb, guint offset, proto_tree *tree) {
928 proto_tree_add_item(tree, hf_artnet_filler, tvb,
932 num_ports = tvb_get_letohs(tvb, offset);
933 proto_tree_add_uint(tree, hf_artnet_input_num_ports, tvb,
934 offset, 2, num_ports);
937 hi = proto_tree_add_item(tree,
938 hf_artnet_input_input,
941 ARTNET_INPUT_INPUT_LENGTH,
944 si = proto_item_add_subtree(hi, ett_artnet);
946 input = tvb_get_guint8(tvb, offset);
947 proto_tree_add_uint(si, hf_artnet_input_input_1, tvb,
951 input = tvb_get_guint8(tvb, offset);
952 proto_tree_add_uint(si, hf_artnet_input_input_2, tvb,
956 input = tvb_get_guint8(tvb, offset);
957 proto_tree_add_uint(si, hf_artnet_input_input_3, tvb,
961 input = tvb_get_guint8(tvb, offset);
962 proto_tree_add_uint(si, hf_artnet_input_input_4, tvb,
970 dissect_artnet_video_setup(tvbuff_t *tvb, guint offset, proto_tree *tree ) {
972 guint8 control,font_height, last_font,first_font;
974 proto_tree_add_item(tree, hf_artnet_filler, tvb,
978 control = tvb_get_guint8(tvb, offset);
979 proto_tree_add_uint(tree, hf_artnet_video_setup_control, tvb,
983 font_height = tvb_get_guint8(tvb, offset);
984 proto_tree_add_uint(tree, hf_artnet_video_setup_font_height, tvb,
985 offset, 1, font_height);
988 first_font = tvb_get_guint8(tvb, offset);
989 proto_tree_add_uint(tree, hf_artnet_video_setup_first_font, tvb,
990 offset, 1, first_font);
993 last_font = tvb_get_guint8(tvb, offset);
994 proto_tree_add_uint(tree, hf_artnet_video_setup_last_font, tvb,
995 offset, 1, last_font);
998 proto_tree_add_item(tree, hf_artnet_video_setup_win_font_name,
999 tvb, offset, 64, FALSE);
1002 size = last_font * font_height;
1004 proto_tree_add_item(tree, hf_artnet_video_setup_font_data, tvb,
1005 offset, size, FALSE );
1013 dissect_artnet_video_palette(tvbuff_t *tvb, guint offset, proto_tree *tree)
1015 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1019 proto_tree_add_item(tree, hf_artnet_video_palette_colour_red, tvb,
1020 offset, 17, FALSE );
1023 proto_tree_add_item(tree, hf_artnet_video_palette_colour_green, tvb,
1024 offset, 17, FALSE );
1027 proto_tree_add_item(tree, hf_artnet_video_palette_colour_blue, tvb,
1028 offset, 17, FALSE );
1035 dissect_artnet_video_data(tvbuff_t *tvb, guint offset, proto_tree *tree) {
1036 guint8 len_x, len_y;
1039 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1043 proto_tree_add_item(tree, hf_artnet_video_data_pos_x, tvb,
1047 proto_tree_add_item(tree, hf_artnet_video_data_pos_y, tvb,
1051 len_x = tvb_get_guint8(tvb, offset);
1052 proto_tree_add_uint(tree, hf_artnet_video_data_len_x, tvb,
1056 len_y = tvb_get_guint8(tvb, offset);
1057 proto_tree_add_uint(tree, hf_artnet_video_data_len_y, tvb,
1061 size = len_x * len_y * 2;
1063 proto_tree_add_item(tree, hf_artnet_video_data_data, tvb,
1064 offset, size, FALSE );
1072 dissect_artnet_firmware_master(tvbuff_t *tvb, guint offset, proto_tree *tree ) {
1073 guint8 type,block_id;
1076 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1080 type = tvb_get_guint8(tvb, offset);
1081 proto_tree_add_uint(tree, hf_artnet_firmware_master_type, tvb,
1085 block_id = tvb_get_guint8(tvb, offset);
1086 proto_tree_add_uint(tree, hf_artnet_firmware_master_block_id, tvb,
1087 offset, 1, block_id);
1090 length = tvb_get_ntohl(tvb, offset);
1091 proto_tree_add_uint(tree, hf_artnet_firmware_master_length, tvb,
1095 proto_tree_add_item(tree, hf_artnet_spare, tvb,
1096 offset, 20, FALSE );
1100 proto_tree_add_item(tree, hf_artnet_firmware_master_data, tvb,
1101 offset, 1024, FALSE );
1109 dissect_artnet_firmware_reply(tvbuff_t *tvb, guint offset, proto_tree *tree) {
1112 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1116 type = tvb_get_guint8(tvb, offset);
1117 proto_tree_add_uint(tree, hf_artnet_firmware_reply_type, tvb,
1121 proto_tree_add_item(tree, hf_artnet_spare, tvb,
1122 offset, 21, FALSE );
1130 dissect_artnet_tod_request(tvbuff_t *tvb, guint offset, proto_tree *tree)
1134 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1138 proto_tree_add_item(tree, hf_artnet_spare, tvb,
1142 proto_tree_add_item(tree, hf_artnet_tod_request_command, tvb,
1146 ad_count = tvb_get_guint8(tvb, offset);
1147 proto_tree_add_uint(tree, hf_artnet_tod_request_ad_count, tvb,
1148 offset, 1, ad_count);
1151 proto_tree_add_item(tree, hf_artnet_tod_request_address, tvb,
1152 offset, ad_count, FALSE);
1159 dissect_artnet_tod_data(tvbuff_t *tvb, guint offset, proto_tree *tree)
1163 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1167 proto_tree_add_item(tree, hf_artnet_tod_data_port, tvb,
1171 proto_tree_add_item(tree, hf_artnet_spare, tvb,
1175 proto_tree_add_item(tree, hf_artnet_tod_data_command_response, tvb,
1179 proto_tree_add_item(tree, hf_artnet_tod_data_address, tvb,
1183 proto_tree_add_item(tree, hf_artnet_tod_data_uid_total, tvb,
1187 proto_tree_add_item(tree, hf_artnet_tod_data_block_count, tvb,
1191 uid_count = tvb_get_guint8(tvb, offset);
1192 proto_tree_add_uint(tree, hf_artnet_tod_data_uid_count, tvb,
1193 offset, 1, uid_count);
1196 for( i = 0; i < uid_count; i++)
1198 proto_tree_add_item(tree, hf_artnet_tod_data_tod, tvb,
1207 dissect_artnet_tod_control(tvbuff_t *tvb, guint offset, proto_tree *tree)
1209 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1213 proto_tree_add_item(tree, hf_artnet_spare, tvb,
1217 proto_tree_add_item(tree, hf_artnet_tod_control_command, tvb,
1221 proto_tree_add_item(tree, hf_artnet_tod_control_address, tvb,
1229 dissect_artnet_rdm(tvbuff_t *tvb, guint offset, proto_tree *tree, packet_info *pinfo)
1233 tvbuff_t *next_tvb = NULL;
1235 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1239 proto_tree_add_item(tree, hf_artnet_spare, tvb,
1243 proto_tree_add_item(tree, hf_artnet_rdm_command, tvb,
1247 proto_tree_add_item(tree, hf_artnet_rdm_address, tvb,
1251 size = tvb_reported_length_remaining(tvb, offset);
1253 save_info=col_get_writable(pinfo->cinfo);
1254 col_set_writable(pinfo->cinfo, FALSE);
1257 next_tvb = tvb_new_subset(tvb, offset, -1, -1);
1259 call_dissector(rdm_handle, next_tvb, pinfo, tree);
1261 col_set_writable(pinfo->cinfo, save_info);
1263 size = tvb_reported_length_remaining(tvb, offset) - size;
1265 return offset + size;
1269 dissect_artnet_ip_prog(tvbuff_t *tvb, guint offset, proto_tree *tree) {
1271 proto_tree *flags_tree,*flags_item;
1273 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1277 command = tvb_get_guint8(tvb, offset);
1278 flags_item = proto_tree_add_uint(tree, hf_artnet_ip_prog_command, tvb,
1279 offset, 1, command);
1281 flags_tree=proto_item_add_subtree(flags_item, ett_artnet);
1282 proto_tree_add_item(flags_tree, hf_artnet_ip_prog_command_prog_port, tvb, offset, 1, FALSE);
1283 proto_tree_add_item(flags_tree, hf_artnet_ip_prog_command_prog_sm, tvb, offset, 1, FALSE);
1284 proto_tree_add_item(flags_tree, hf_artnet_ip_prog_command_prog_ip, tvb, offset, 1, FALSE);
1285 proto_tree_add_item(flags_tree, hf_artnet_ip_prog_command_reset, tvb, offset, 1, FALSE);
1286 proto_tree_add_item(flags_tree, hf_artnet_ip_prog_command_unused, tvb, offset, 1, FALSE);
1287 proto_tree_add_item(flags_tree, hf_artnet_ip_prog_command_prog_enable, tvb, offset, 1, FALSE);
1291 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1295 proto_tree_add_item(tree, hf_artnet_ip_prog_ip, tvb,
1299 proto_tree_add_item(tree, hf_artnet_ip_prog_sm, tvb,
1303 proto_tree_add_item(tree, hf_artnet_ip_prog_port, tvb,
1307 proto_tree_add_item(tree, hf_artnet_spare, tvb,
1315 dissect_artnet_ip_prog_reply(tvbuff_t *tvb, guint offset, proto_tree *tree)
1317 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1321 proto_tree_add_item(tree, hf_artnet_ip_prog_reply_ip, tvb,
1325 proto_tree_add_item(tree, hf_artnet_ip_prog_reply_sm, tvb,
1329 proto_tree_add_item(tree, hf_artnet_ip_prog_reply_port, tvb,
1333 proto_tree_add_item(tree, hf_artnet_spare, tvb,
1341 dissect_artnet_poll_server_reply(tvbuff_t *tvb, guint offset, proto_tree *tree)
1343 /* no spec released for this packet at the moment */
1344 proto_tree_add_item(tree, hf_artnet_filler, tvb,
1345 offset, 182, FALSE);
1353 dissect_artnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
1357 proto_tree *ti,*hi,*si,*artnet_tree=NULL,*artnet_header_tree=NULL;
1359 /* Set the protocol column */
1360 if(check_col(pinfo->cinfo,COL_PROTOCOL)){
1361 col_set_str(pinfo->cinfo,COL_PROTOCOL,"ARTNET");
1364 /* Clear out stuff in the info column */
1365 if(check_col(pinfo->cinfo,COL_INFO)){
1366 col_clear(pinfo->cinfo,COL_INFO);
1370 ti = proto_tree_add_item(tree, proto_artnet, tvb, offset, -1, FALSE);
1371 artnet_tree = proto_item_add_subtree(ti, ett_artnet);
1373 hi = proto_tree_add_item(artnet_tree,
1377 ARTNET_HEADER_LENGTH ,
1380 artnet_header_tree = proto_item_add_subtree(hi, ett_artnet);
1383 if (check_col(pinfo->cinfo, COL_INFO)) {
1384 col_append_fstr(pinfo->cinfo, COL_INFO, "%s",
1385 tvb_get_ptr(tvb, offset, 8));
1388 proto_tree_add_item(artnet_header_tree, hf_artnet_header_id,
1389 tvb, offset, 8, FALSE);
1393 opcode = tvb_get_letohs(tvb, offset);
1394 /* set the info column */
1395 if (check_col(pinfo->cinfo, COL_INFO)) {
1396 col_add_fstr(pinfo->cinfo, COL_INFO, "%s",
1397 val_to_str(opcode, artnet_opcode_vals, "Unknown (0x%04x)"));
1401 proto_tree_add_uint(artnet_header_tree, hf_artnet_header_opcode, tvb,
1406 if( opcode != ARTNET_OP_POLL_REPLY && opcode != ARTNET_OP_POLL_SERVER_REPLY ) {
1408 proto_tree_add_item(artnet_header_tree, hf_artnet_header_protver, tvb,
1411 proto_item_set_len(artnet_header_tree, ARTNET_HEADER_LENGTH+2 );
1417 case ARTNET_OP_POLL:
1419 hi = proto_tree_add_item(artnet_tree,
1426 si = proto_item_add_subtree(hi, ett_artnet);
1428 size = dissect_artnet_poll( tvb, offset, si );
1431 proto_item_set_len(si, size);
1435 case ARTNET_OP_POLL_REPLY:
1437 hi = proto_tree_add_item(artnet_tree,
1438 hf_artnet_poll_reply,
1441 ARTNET_POLL_REPLY_LENGTH,
1444 si = proto_item_add_subtree(hi, ett_artnet);
1446 size = dissect_artnet_poll_reply( tvb, offset, si);
1449 proto_item_set_len(si, size);
1453 case ARTNET_OP_OUTPUT:
1455 hi = proto_tree_add_item(artnet_tree,
1459 ARTNET_OUTPUT_LENGTH,
1462 si = proto_item_add_subtree(hi, ett_artnet);
1464 size = dissect_artnet_output( tvb, offset, si );
1467 proto_item_set_len(si, size);
1471 case ARTNET_OP_ADDRESS:
1473 hi = proto_tree_add_item(artnet_tree,
1477 ARTNET_POLL_REPLY_LENGTH,
1480 si = proto_item_add_subtree(hi, ett_artnet);
1482 size = dissect_artnet_address( tvb, offset, si );
1485 proto_item_set_len(si, size);
1489 case ARTNET_OP_INPUT:
1491 hi = proto_tree_add_item(artnet_tree,
1495 ARTNET_INPUT_LENGTH,
1498 si = proto_item_add_subtree(hi, ett_artnet);
1500 size = dissect_artnet_input( tvb, offset, si );
1503 proto_item_set_len(si, size);
1507 case ARTNET_OP_VIDEO_SETUP:
1509 hi = proto_tree_add_item(artnet_tree,
1513 ARTNET_VIDEO_SETUP_LENGTH,
1516 si = proto_item_add_subtree(hi, ett_artnet);
1518 size = dissect_artnet_video_setup( tvb, offset, si );
1521 proto_item_set_len(si, size);
1525 case ARTNET_OP_VIDEO_PALETTE:
1527 hi = proto_tree_add_item(artnet_tree,
1531 ARTNET_VIDEO_PALETTE_LENGTH,
1534 si = proto_item_add_subtree(hi, ett_artnet);
1536 size = dissect_artnet_video_palette( tvb, offset, si );
1539 proto_item_set_len(si, size);
1543 case ARTNET_OP_VIDEO_DATA:
1545 hi = proto_tree_add_item(artnet_tree,
1549 ARTNET_VIDEO_DATA_LENGTH,
1552 si = proto_item_add_subtree(hi, ett_artnet);
1554 size = dissect_artnet_video_data( tvb, offset, si );
1557 proto_item_set_len(si, size);
1561 case ARTNET_OP_FIRMWARE_MASTER:
1563 hi = proto_tree_add_item(artnet_tree,
1564 hf_artnet_firmware_master,
1567 ARTNET_FIRMWARE_MASTER_LENGTH,
1570 si = proto_item_add_subtree(hi, ett_artnet);
1572 size = dissect_artnet_firmware_master( tvb, offset, si );
1575 proto_item_set_len(si, size);
1579 case ARTNET_OP_FIRMWARE_REPLY:
1581 hi = proto_tree_add_item(artnet_tree,
1582 hf_artnet_firmware_reply,
1585 ARTNET_FIRMWARE_REPLY_LENGTH,
1588 si = proto_item_add_subtree(hi, ett_artnet);
1590 size = dissect_artnet_firmware_reply( tvb, offset, si );
1593 proto_item_set_len(si, size);
1597 case ARTNET_OP_TOD_REQUEST:
1599 hi = proto_tree_add_item(artnet_tree,
1600 hf_artnet_tod_request,
1606 si = proto_item_add_subtree(hi, ett_artnet);
1608 size = dissect_artnet_tod_request( tvb, offset, si );
1611 proto_item_set_len(si, size);
1615 case ARTNET_OP_TOD_DATA:
1617 hi = proto_tree_add_item(artnet_tree,
1624 si = proto_item_add_subtree(hi, ett_artnet );
1626 size = dissect_artnet_tod_data( tvb, offset, si );
1629 proto_item_set_len(si, size );
1633 case ARTNET_OP_TOD_CONTROL:
1635 hi = proto_tree_add_item(artnet_tree,
1636 hf_artnet_tod_control,
1641 si = proto_item_add_subtree(hi, ett_artnet );
1643 size = dissect_artnet_tod_control( tvb, offset, si );
1646 proto_item_set_len(si, size );
1652 hi = proto_tree_add_item(artnet_tree,
1658 si = proto_item_add_subtree(hi,ett_artnet);
1660 size = dissect_artnet_rdm( tvb, offset, si, pinfo );
1663 proto_item_set_len( si, size );
1667 case ARTNET_OP_IP_PROG:
1669 hi = proto_tree_add_item(artnet_tree,
1675 si = proto_item_add_subtree(hi, ett_artnet );
1677 size = dissect_artnet_ip_prog( tvb, offset, si);
1680 proto_item_set_len(si, size );
1684 case ARTNET_OP_IP_PROG_REPLY:
1686 hi = proto_tree_add_item(artnet_tree,
1687 hf_artnet_ip_prog_reply,
1692 si = proto_item_add_subtree(hi, ett_artnet );
1694 size = dissect_artnet_ip_prog_reply( tvb, offset, si );
1697 proto_item_set_len(si, size );
1701 case ARTNET_OP_POLL_SERVER_REPLY:
1703 hi = proto_tree_add_item(artnet_tree,
1704 hf_artnet_poll_server_reply,
1709 si = proto_item_add_subtree(hi, ett_artnet );
1711 size = dissect_artnet_poll_server_reply( tvb, offset, si );
1714 proto_item_set_len(si, size );
1720 proto_tree_add_text(artnet_tree, tvb, offset, -1,
1721 "Data (%d bytes)", tvb_reported_length_remaining(tvb, offset));
1731 proto_register_artnet(void) {
1732 static hf_register_info hf[] = {
1736 { &hf_artnet_filler,
1739 FT_BYTES, BASE_HEX, NULL, 0x0,
1745 FT_BYTES, BASE_HEX, NULL, 0x0,
1750 { &hf_artnet_header,
1751 { "Descriptor Header",
1753 FT_NONE, BASE_NONE, NULL, 0,
1754 "Art-Net Descriptor Header", HFILL }},
1756 { &hf_artnet_header_id,
1759 FT_STRING, BASE_DEC, NULL, 0x0,
1760 "ArtNET ID", HFILL }},
1762 { &hf_artnet_header_opcode,
1764 "artnet.header.opcode",
1765 FT_UINT16, BASE_HEX, VALS(artnet_opcode_vals), 0x0,
1766 "Art-Net message type", HFILL }},
1768 { &hf_artnet_header_protver,
1770 "artnet.header.protver",
1771 FT_UINT16, BASE_DEC, NULL, 0x0,
1772 "Protcol revision number", HFILL }},
1779 FT_NONE, BASE_NONE, NULL, 0,
1780 "Art-Net ArtPoll packet", HFILL }},
1782 { &hf_artnet_poll_talktome,
1784 "artnet.poll.talktome",
1785 FT_UINT8, BASE_HEX, NULL, 0x0,
1786 "TalkToMe", HFILL }},
1788 { &hf_artnet_poll_talktome_reply_dest,
1789 { "Reply destination",
1790 "artnet.poll.talktome_reply_dest",
1791 FT_UINT8, BASE_HEX, NULL, 0x01,
1792 "Reply destination", HFILL }},
1794 { &hf_artnet_poll_talktome_reply_type,
1796 "artnet.poll.talktome_reply_type",
1797 FT_UINT8, BASE_HEX, NULL, 0x02,
1798 "Reply type", HFILL }},
1800 { &hf_artnet_poll_talktome_unused,
1802 "artnet.poll.talktome_unused",
1803 FT_UINT8, BASE_HEX, NULL, 0xfc,
1808 { &hf_artnet_poll_reply,
1809 { "ArtPollReply packet",
1810 "artnet.poll_reply",
1811 FT_NONE, BASE_NONE, NULL, 0,
1812 "Art-Net ArtPollReply packet", HFILL }},
1814 { &hf_artnet_poll_reply_ip_address,
1816 "artnet.poll_reply.ip_address",
1817 FT_IPv4, BASE_DEC, NULL, 0x0,
1818 "IP Address", HFILL }},
1820 { &hf_artnet_poll_reply_port_nr,
1822 "artnet.poll_reply.port_nr",
1823 FT_UINT16, BASE_DEC, NULL, 0x0,
1824 "Port Number", HFILL }},
1826 { &hf_artnet_poll_reply_versinfo,
1828 "artnet.poll_reply.versinfo",
1829 FT_UINT16, BASE_HEX, NULL, 0x0,
1830 "Version info", HFILL }},
1832 { &hf_artnet_poll_reply_subswitch,
1834 "artnet.poll_reply.subswitch",
1835 FT_UINT16, BASE_HEX, NULL, 0x0,
1836 "Subswitch version", HFILL }},
1838 { &hf_artnet_poll_reply_oem,
1840 "artnet.poll_reply.oem",
1841 FT_UINT16, BASE_HEX, VALS(artnet_oem_code_vals), 0x0,
1844 { &hf_artnet_poll_reply_ubea_version,
1846 "artnet.poll_reply.ubea_version",
1847 FT_UINT8, BASE_DEC, NULL, 0x0,
1848 "UBEA version number", HFILL }},
1850 { &hf_artnet_poll_reply_status,
1852 "artnet.poll_reply.status",
1853 FT_UINT8, BASE_HEX, NULL, 0x0,
1856 { &hf_artnet_poll_reply_esta_man,
1858 "artnet.poll_reply.esta_man",
1859 FT_UINT16, BASE_HEX, VALS(artnet_esta_man_vals), 0x0,
1860 "ESTA Code", HFILL }},
1862 { &hf_artnet_poll_reply_short_name,
1864 "artnet.poll_reply.short_name",
1865 FT_STRING, BASE_DEC, NULL, 0x0,
1866 "Short Name", HFILL }},
1868 { &hf_artnet_poll_reply_long_name,
1870 "artnet.poll_reply.long_name",
1871 FT_STRING, BASE_DEC, NULL, 0x0,
1872 "Long Name", HFILL }},
1874 { &hf_artnet_poll_reply_node_report,
1876 "artnet.poll_reply.node_report",
1877 FT_STRING, BASE_DEC, NULL, 0x0,
1878 "Node Report", HFILL }},
1880 { &hf_artnet_poll_reply_port_info,
1882 "artnet.poll_reply.port_info",
1883 FT_NONE, BASE_NONE, NULL, 0,
1884 "Port Info", HFILL }},
1886 { &hf_artnet_poll_reply_num_ports,
1887 { "Number of Ports",
1888 "artnet.poll_reply.num_ports",
1889 FT_UINT16, BASE_DEC, NULL, 0x0,
1890 "Number of Ports", HFILL }},
1892 { &hf_artnet_poll_reply_port_types,
1894 "artnet.poll_reply.port_types",
1895 FT_NONE, BASE_NONE, NULL, 0,
1896 "Port Types", HFILL }},
1898 { &hf_artnet_poll_reply_port_types_1,
1900 "artnet.poll_reply.port_types_1",
1901 FT_UINT8, BASE_HEX, NULL, 0x0,
1902 "Type of Port 1", HFILL }},
1904 { &hf_artnet_poll_reply_port_types_2,
1906 "artnet.poll_reply.port_types_2",
1907 FT_UINT8, BASE_HEX, NULL, 0x0,
1908 "Type of Port 2", HFILL }},
1910 { &hf_artnet_poll_reply_port_types_3,
1912 "artnet.poll_reply.port_types_3",
1913 FT_UINT8, BASE_HEX, NULL, 0x0,
1914 "Type of Port 3", HFILL }},
1916 { &hf_artnet_poll_reply_port_types_4,
1918 "artnet.poll_reply.port_types_4",
1919 FT_UINT8, BASE_HEX, NULL, 0x0,
1920 "Type of Port 4", HFILL }},
1922 { &hf_artnet_poll_reply_good_input,
1924 "artnet.poll_reply.good_input",
1925 FT_NONE, BASE_NONE, NULL, 0,
1926 "Input Status", HFILL }},
1928 { &hf_artnet_poll_reply_good_input_1,
1929 { "Input status of Port 1",
1930 "artnet.poll_reply.good_input_1",
1931 FT_UINT8, BASE_HEX, NULL, 0x0,
1932 "Input status of Port 1", HFILL }},
1934 { &hf_artnet_poll_reply_good_input_2,
1935 { "Input status of Port 2",
1936 "artnet.poll_reply.good_input_2",
1937 FT_UINT8, BASE_HEX, NULL, 0x0,
1938 "Input status of Port 2", HFILL }},
1940 { &hf_artnet_poll_reply_good_input_3,
1941 { "Input status of Port 3",
1942 "artnet.poll_reply.good_input_3",
1943 FT_UINT8, BASE_HEX, NULL, 0x0,
1944 "Input status of Port 3", HFILL }},
1946 { &hf_artnet_poll_reply_good_input_4,
1947 { "Input status of Port 4",
1948 "artnet.poll_reply.good_input_4",
1949 FT_UINT8, BASE_HEX, NULL, 0x0,
1950 "Input status of Port 4", HFILL }},
1952 { &hf_artnet_poll_reply_good_output,
1954 "artnet.poll_reply.good_output",
1955 FT_NONE, BASE_NONE, NULL, 0,
1956 "Port output status", HFILL }},
1958 { &hf_artnet_poll_reply_good_output_1,
1959 { "Output status of Port 1",
1960 "artnet.poll_reply.good_output_1",
1961 FT_UINT8, BASE_HEX, NULL, 0x0,
1962 "Output status of Port 1", HFILL }},
1964 { &hf_artnet_poll_reply_good_output_2,
1965 { "Output status of Port 2",
1966 "artnet.poll_reply.good_output_2",
1967 FT_UINT8, BASE_HEX, NULL, 0x0,
1968 "Output status of Port 2", HFILL }},
1970 { &hf_artnet_poll_reply_good_output_3,
1971 { "Output status of Port 3",
1972 "artnet.poll_reply.good_output_3",
1973 FT_UINT8, BASE_HEX, NULL, 0x0,
1974 "Output status of Port 3", HFILL }},
1976 { &hf_artnet_poll_reply_good_output_4,
1977 { "Output status of Port 4",
1978 "artnet.poll_reply.good_output_4",
1979 FT_UINT8, BASE_HEX, NULL, 0x0,
1980 "Outpus status of Port 4", HFILL }},
1982 { &hf_artnet_poll_reply_swin,
1983 { "Input Subswitch",
1984 "artnet.poll_reply.swin",
1985 FT_NONE, BASE_NONE, NULL, 0,
1986 "Input Subswitch", HFILL }},
1988 { &hf_artnet_poll_reply_swin_1,
1989 { "Input Subswitch of Port 1",
1990 "artnet.poll_reply.swin_1",
1991 FT_UINT8, BASE_HEX, NULL, 0x0,
1992 "Input Subswitch of Port 1", HFILL }},
1994 { &hf_artnet_poll_reply_swin_2,
1995 { "Input Subswitch of Port 2",
1996 "artnet.poll_reply.swin_2",
1997 FT_UINT8, BASE_HEX, NULL, 0x0,
1998 "Input Subswitch of Port 2", HFILL }},
2000 { &hf_artnet_poll_reply_swin_3,
2001 { "Input Subswitch of Port 3",
2002 "artnet.poll_reply.swin_3",
2003 FT_UINT8, BASE_HEX, NULL, 0x0,
2004 "Input Subswitch of Port 3", HFILL }},
2006 { &hf_artnet_poll_reply_swin_4,
2007 { "Input Subswitch of Port 4",
2008 "artnet.poll_reply.swin_4",
2009 FT_UINT8, BASE_HEX, NULL, 0x0,
2010 "Input Subswitch of Port 4", HFILL }},
2012 { &hf_artnet_poll_reply_swout,
2013 { "Output Subswitch",
2014 "artnet.poll_reply.swout",
2015 FT_NONE, BASE_NONE, NULL, 0,
2016 "Output Subswitch", HFILL }},
2018 { &hf_artnet_poll_reply_swout_1,
2019 { "Output Subswitch of Port 1",
2020 "artnet.poll_reply.swout_1",
2021 FT_UINT8, BASE_HEX, NULL, 0x0,
2022 "Output Subswitch of Port 1", HFILL }},
2024 { &hf_artnet_poll_reply_swout_2,
2025 { "Output Subswitch of Port 2",
2026 "artnet.poll_reply.swout_2",
2027 FT_UINT8, BASE_HEX, NULL, 0x0,
2028 "Output Subswitch of Port 2", HFILL }},
2030 { &hf_artnet_poll_reply_swout_3,
2031 { "Output Subswitch of Port 3",
2032 "artnet.poll_reply.swout_3",
2033 FT_UINT8, BASE_HEX, NULL, 0x0,
2034 "Output Subswitch of Port 3", HFILL }},
2036 { &hf_artnet_poll_reply_swout_4,
2037 { "Output Subswitch of Port 4",
2038 "artnet.poll_reply.swout_4",
2039 FT_UINT8, BASE_HEX, NULL, 0x0,
2040 "Ouput Subswitch of Port 4", HFILL }},
2042 { &hf_artnet_poll_reply_swvideo,
2044 "artnet.poll_reply.swvideo",
2045 FT_UINT8, BASE_HEX, NULL, 0x0,
2046 "SwVideo", HFILL }},
2048 { &hf_artnet_poll_reply_swmacro,
2050 "artnet.poll_reply.swmacro",
2051 FT_UINT8, BASE_HEX, NULL, 0x0,
2052 "SwMacro", HFILL }},
2054 { &hf_artnet_poll_reply_swremote,
2056 "artnet.poll_reply.swremote",
2057 FT_UINT8, BASE_HEX, NULL, 0x0,
2058 "SwRemote", HFILL }},
2060 { &hf_artnet_poll_reply_mac,
2062 "artnet.poll_reply.mac",
2063 FT_ETHER, BASE_HEX, NULL, 0x0,
2068 { &hf_artnet_output,
2071 FT_NONE, BASE_NONE, NULL, 0,
2072 "Art-Net ArtDMX packet", HFILL }},
2074 { &hf_artnet_output_sequence,
2076 "artnet.output.sequence",
2077 FT_UINT8, BASE_DEC, NULL, 0x0,
2078 "Sequence", HFILL }},
2080 { &hf_artnet_output_physical,
2082 "artnet.output.physical",
2083 FT_UINT8, BASE_DEC, NULL, 0x0,
2084 "Physical", HFILL }},
2086 { &hf_artnet_output_universe,
2088 "artnet.output.universe",
2089 FT_UINT16, BASE_DEC, NULL, 0x0,
2090 "Universe", HFILL }},
2092 { &hf_artnet_output_length,
2094 "artnet.output.length",
2095 FT_UINT16, BASE_DEC, NULL, 0x0,
2098 { &hf_artnet_output_data,
2100 "artnet.output.data",
2101 FT_NONE, BASE_DEC, NULL, 0x0,
2102 "DMX Data", HFILL }},
2104 { &hf_artnet_output_data_filter,
2105 { "DMX data filter",
2106 "artnet.output.data_filter",
2107 FT_BYTES, BASE_DEC, NULL, 0x0,
2108 "DMX Data Filter", HFILL }},
2110 { &hf_artnet_output_dmx_data,
2112 "artnet.output.dmx_data",
2113 FT_NONE, BASE_DEC, NULL, 0x0,
2114 "DMX Data", HFILL }},
2118 { &hf_artnet_address,
2119 { "ArtAddress packet",
2121 FT_NONE, BASE_NONE, NULL, 0,
2122 "Art-Net ArtAddress packet", HFILL }},
2124 { &hf_artnet_address_short_name,
2126 "artnet.address.short_name",
2127 FT_STRING, BASE_DEC, NULL, 0x0,
2128 "Short Name", HFILL }},
2130 { &hf_artnet_address_long_name,
2132 "artnet.address.long_name",
2133 FT_STRING, BASE_DEC, NULL, 0x0,
2134 "Long Name", HFILL }},
2136 { &hf_artnet_address_swin,
2137 { "Input Subswitch",
2138 "artnet.address.swin",
2139 FT_NONE, BASE_NONE, NULL, 0,
2140 "Input Subswitch", HFILL }},
2142 { &hf_artnet_address_swin_1,
2143 { "Input Subswitch of Port 1",
2144 "artnet.address.swin_1",
2145 FT_UINT8, BASE_HEX, NULL, 0x0,
2146 "Input Subswitch of Port 1", HFILL }},
2148 { &hf_artnet_address_swin_2,
2149 { "Input Subswitch of Port 2",
2150 "artnet.address.swin_2",
2151 FT_UINT8, BASE_HEX, NULL, 0x0,
2152 "Input Subswitch of Port 2", HFILL }},
2154 { &hf_artnet_address_swin_3,
2155 { "Input Subswitch of Port 3",
2156 "artnet.address.swin_3",
2157 FT_UINT8, BASE_HEX, NULL, 0x0,
2158 "Input Subswitch of Port 3", HFILL }},
2160 { &hf_artnet_address_swin_4,
2161 { "Input Subswitch of Port 4",
2162 "artnet.address.swin_4",
2163 FT_UINT8, BASE_HEX, NULL, 0x0,
2164 "Input Subswitch of Port 4", HFILL }},
2166 { &hf_artnet_address_swout,
2167 { "Output Subswitch",
2168 "artnet.address.swout",
2169 FT_NONE, BASE_NONE, NULL, 0,
2170 "Output Subswitch", HFILL }},
2172 { &hf_artnet_address_swout_1,
2173 { "Output Subswitch of Port 1",
2174 "artnet.address.swout_1",
2175 FT_UINT8, BASE_HEX, NULL, 0x0,
2176 "Output Subswitch of Port 1", HFILL }},
2178 { &hf_artnet_address_swout_2,
2179 { "Output Subswitch of Port 2",
2180 "artnet.address.swout_2",
2181 FT_UINT8, BASE_HEX, NULL, 0x0,
2182 "Output Subswitch of Port 2", HFILL }},
2184 { &hf_artnet_address_swout_3,
2185 { "Output Subswitch of Port 3",
2186 "artnet.address.swout_3",
2187 FT_UINT8, BASE_HEX, NULL, 0x0,
2188 "Output Subswitch of Port 3", HFILL }},
2190 { &hf_artnet_address_swout_4,
2191 { "Output Subswitch of Port 4",
2192 "artnet.address.swout_4",
2193 FT_UINT8, BASE_HEX, NULL, 0x0,
2194 "Ouput Subswitch of Port 4", HFILL }},
2196 { &hf_artnet_address_subswitch,
2198 "artnet.address.subswitch",
2199 FT_UINT8, BASE_HEX, NULL, 0x0,
2200 "Subswitch", HFILL }},
2202 { &hf_artnet_address_swvideo,
2204 "artnet.address.swvideo",
2205 FT_UINT8, BASE_HEX, NULL, 0x0,
2206 "SwVideo", HFILL }},
2208 { &hf_artnet_address_command,
2210 "artnet.address.command",
2211 FT_UINT8, BASE_HEX, VALS(artnet_address_command_vals), 0x0,
2212 "Command", HFILL }},
2217 { "ArtInput packet",
2219 FT_NONE, BASE_NONE, NULL, 0,
2220 "Art-Net ArtInput packet", HFILL }},
2222 { &hf_artnet_input_num_ports,
2223 { "Number of Ports",
2224 "artnet.input.num_ports",
2225 FT_UINT16, BASE_DEC, NULL, 0x0,
2226 "Number of Ports", HFILL }},
2228 { &hf_artnet_input_input,
2230 "artnet.input.input",
2231 FT_NONE, BASE_NONE, NULL, 0,
2232 "Port Status", HFILL }},
2234 { &hf_artnet_input_input_1,
2235 { "Status of Port 1",
2236 "artnet.input.input_1",
2237 FT_UINT8, BASE_HEX, NULL, 0x0,
2238 "Status of Port 1", HFILL }},
2240 { &hf_artnet_input_input_2,
2241 { "Status of Port 2",
2242 "artnet.input.input_2",
2243 FT_UINT8, BASE_HEX, NULL, 0x0,
2244 "Status of Port 2", HFILL }},
2246 { &hf_artnet_input_input_3,
2247 { "Status of Port 3",
2248 "artnet.input.input_3",
2249 FT_UINT8, BASE_HEX, NULL, 0x0,
2250 "Status of Port 3", HFILL }},
2252 { &hf_artnet_input_input_4,
2253 { "Status of Port 4",
2254 "artnet.input.input_4",
2255 FT_UINT8, BASE_HEX, NULL, 0x0,
2256 "Status of Port 4", HFILL }},
2258 /* ArtFirmwareMaster */
2260 { &hf_artnet_firmware_master,
2261 { "ArtFirmwareMaster packet",
2262 "artnet.firmware_master",
2263 FT_NONE, BASE_NONE, NULL, 0,
2264 "Art-Net ArtFirmwareMaster packet", HFILL }},
2266 { &hf_artnet_firmware_master_type,
2268 "artnet.firmware_master.type",
2269 FT_UINT8, BASE_HEX, VALS(artnet_firmware_master_type_vals), 0x0,
2270 "Number of Ports", HFILL }},
2272 { &hf_artnet_firmware_master_block_id,
2274 "artnet.firmware_master.block_id",
2275 FT_UINT8, BASE_DEC, NULL, 0x0,
2276 "Block ID", HFILL }},
2278 { &hf_artnet_firmware_master_length,
2280 "artnet.firmware_master.length",
2281 FT_UINT32, BASE_DEC, NULL, 0x0,
2284 { &hf_artnet_firmware_master_data,
2286 "artnet.firmware_master.data",
2287 FT_BYTES, BASE_HEX, NULL, 0x0,
2290 /* ArtFirmwareReply */
2292 { &hf_artnet_firmware_reply,
2293 { "ArtFirmwareReply packet",
2294 "artnet.firmware_reply",
2295 FT_NONE, BASE_NONE, NULL, 0,
2296 "Art-Net ArtFirmwareReply packet", HFILL }},
2298 { &hf_artnet_firmware_reply_type,
2300 "artnet.firmware_reply.type",
2301 FT_UINT8, BASE_HEX, VALS(artnet_firmware_reply_type_vals), 0x0,
2302 "Number of Ports", HFILL }},
2306 { &hf_artnet_video_setup,
2307 { "ArtVideoSetup packet",
2308 "artnet.video_setup",
2309 FT_NONE, BASE_NONE, NULL, 0,
2310 "ArtNET ArtVideoSetup packet", HFILL }},
2312 { &hf_artnet_video_setup_control,
2314 "artnet.video_setup.control",
2315 FT_UINT8, BASE_HEX, NULL, 0x0,
2316 "control", HFILL }},
2318 { &hf_artnet_video_setup_font_height,
2320 "artnet.video_setup.font_height",
2321 FT_UINT8, BASE_DEC, NULL, 0x0,
2322 "Font Height", HFILL }},
2324 { &hf_artnet_video_setup_first_font,
2326 "artnet.video_setup.first_font",
2327 FT_UINT8, BASE_DEC, NULL, 0x0,
2328 "First Font", HFILL }},
2330 { &hf_artnet_video_setup_last_font,
2332 "artnet.video_setup.last_font",
2333 FT_UINT8, BASE_DEC, NULL, 0x0,
2334 "Last Font", HFILL }},
2336 { &hf_artnet_video_setup_win_font_name,
2337 { "Windows Font Name",
2338 "artnet.video_setup.win_font_name",
2339 FT_STRING, BASE_DEC, NULL, 0x0,
2340 "Windows Font Name", HFILL }},
2342 { &hf_artnet_video_setup_font_data,
2344 "artnet.video_setup.font_data",
2345 FT_BYTES, BASE_HEX, NULL, 0x0,
2346 "Font Date", HFILL }},
2348 /* ArtVideoPalette */
2350 { &hf_artnet_video_palette,
2351 { "ArtVideoPalette packet",
2352 "artnet.video_palette",
2353 FT_NONE, BASE_NONE, NULL, 0,
2354 "Art-Net ArtVideoPalette packet", HFILL }},
2356 { &hf_artnet_video_palette_colour_red,
2358 "artnet.video_palette.colour_red",
2359 FT_BYTES, BASE_HEX, NULL, 0x0,
2360 "Colour Red", HFILL }},
2362 { &hf_artnet_video_palette_colour_green,
2364 "artnet.video_palette.colour_green",
2365 FT_BYTES, BASE_HEX, NULL, 0x0,
2366 "Colour Green", HFILL }},
2368 { &hf_artnet_video_palette_colour_blue,
2370 "artnet.video_palette.colour_blue",
2371 FT_BYTES, BASE_HEX, NULL, 0x0,
2372 "Colour Blue", HFILL }},
2376 { &hf_artnet_video_data,
2377 { "ArtVideoData packet",
2378 "artnet.video_data",
2379 FT_NONE, BASE_NONE, NULL, 0,
2380 "Art-Net ArtVideoData packet", HFILL }},
2382 { &hf_artnet_video_data_pos_x,
2384 "artnet.video_data.pos_x",
2385 FT_UINT8, BASE_DEC, NULL, 0x0,
2388 { &hf_artnet_video_data_pos_y,
2390 "artnet.video_data.pos_y",
2391 FT_UINT8, BASE_DEC, NULL, 0x0,
2394 { &hf_artnet_video_data_len_x,
2396 "artnet.video_data.len_x",
2397 FT_UINT8, BASE_DEC, NULL, 0x0,
2400 { &hf_artnet_video_data_len_y,
2402 "artnet.video_data.len_y",
2403 FT_UINT8, BASE_DEC, NULL, 0x0,
2406 { &hf_artnet_video_data_data,
2408 "artnet.video_data.data",
2409 FT_BYTES, BASE_HEX, NULL, 0x0,
2410 "Video Data", HFILL }},
2413 { &hf_artnet_tod_request,
2414 { "ArtTodRequest packet",
2415 "artnet.tod_request",
2416 FT_NONE, BASE_NONE, NULL, 0,
2417 "Art-Net ArtTodRequest packet", HFILL }},
2419 { &hf_artnet_tod_request_command,
2421 "artnet.tod_request.command",
2422 FT_UINT8, BASE_HEX, VALS(artnet_tod_request_command_vals), 0x0,
2423 "Command", HFILL }},
2425 { &hf_artnet_tod_request_ad_count,
2427 "artnet.tod_request.ad_count",
2428 FT_UINT8, BASE_DEC, NULL, 0x0,
2429 "Address Count", HFILL }},
2431 { &hf_artnet_tod_request_address,
2433 "artnet.tod_request.address",
2434 FT_BYTES, BASE_HEX, NULL, 0x0,
2435 "Address", HFILL }},
2438 { &hf_artnet_tod_data,
2439 { "ArtTodData packet",
2441 FT_NONE, BASE_NONE, NULL, 0,
2442 "Art-Net ArtTodData packet", HFILL }},
2444 { &hf_artnet_tod_data_port,
2446 "artnet.tod_data.port",
2447 FT_UINT8, BASE_DEC, NULL, 0x0,
2450 { &hf_artnet_tod_data_command_response,
2451 { "Command Response",
2452 "artnet.tod_data.command_response",
2453 FT_UINT8, BASE_HEX, VALS(artnet_tod_data_command_vals), 0x0,
2454 "Command Response", HFILL }},
2456 { &hf_artnet_tod_data_address,
2458 "artnet.tod_data.address",
2459 FT_UINT8, BASE_HEX, NULL, 0x0,
2460 "Address", HFILL }},
2462 { &hf_artnet_tod_data_uid_total,
2464 "artnet.tod_data.uid_total",
2465 FT_UINT16, BASE_DEC, NULL, 0x0,
2466 "UID Total", HFILL }},
2468 { &hf_artnet_tod_data_block_count,
2470 "artnet.tod_data.block_count",
2471 FT_UINT8, BASE_DEC, NULL, 0x0,
2472 "Block Count", HFILL }},
2474 { &hf_artnet_tod_data_uid_count,
2476 "artnet.tod_data.uid_count",
2477 FT_UINT8, BASE_DEC, NULL, 0x0,
2478 "UID Count", HFILL }},
2480 { &hf_artnet_tod_data_tod,
2482 "artnet.tod_data.tod",
2483 FT_BYTES, BASE_HEX, NULL, 0x0,
2487 { &hf_artnet_tod_control,
2488 { "ArtTodControl packet",
2489 "artner.tod_control",
2490 FT_NONE, BASE_NONE, NULL, 0,
2491 "Art-Net ArtTodControl packet", HFILL }},
2493 { &hf_artnet_tod_control_command,
2495 "artnet.tod_control.command",
2496 FT_UINT8, BASE_HEX, VALS(artnet_tod_control_command_vals), 0x0,
2497 "Command", HFILL }},
2499 { &hf_artnet_tod_control_address,
2501 "artnet.tod_request.address",
2502 FT_UINT8, BASE_HEX, NULL, 0x0,
2503 "Address", HFILL }},
2509 FT_NONE, BASE_NONE, NULL, 0,
2510 "Art-Net ArtRdm packet", HFILL }},
2512 { &hf_artnet_rdm_command,
2514 "artnet.rdm.command",
2515 FT_UINT8, BASE_HEX, VALS(artnet_rdm_command_vals), 0x0,
2516 "Command", HFILL }},
2518 { &hf_artnet_rdm_address,
2520 "artnet.rdm.address",
2521 FT_UINT8, BASE_HEX, NULL, 0x0,
2522 "Address", HFILL }},
2525 { &hf_artnet_ip_prog,
2526 { "ArtIpProg packet",
2528 FT_NONE, BASE_NONE, NULL, 0,
2529 "ArtNET ArtIpProg packet", HFILL }},
2531 { &hf_artnet_ip_prog_command,
2533 "artnet.ip_prog.command",
2534 FT_UINT8, BASE_HEX, NULL, 0x0,
2535 "Command", HFILL }},
2537 { &hf_artnet_ip_prog_command_prog_port,
2539 "artnet.ip_prog.command_prog_port",
2540 FT_UINT8, BASE_HEX, NULL, 0x01,
2541 "Program Port", HFILL }},
2543 { &hf_artnet_ip_prog_command_prog_sm,
2544 { "Program Subnet Mask",
2545 "artnet.ip_prog.command_prog_sm",
2546 FT_UINT8, BASE_HEX, NULL, 0x02,
2547 "Program Subnet Mask", HFILL }},
2549 { &hf_artnet_ip_prog_command_prog_ip,
2551 "artnet.ip_prog.command_prog_ip",
2552 FT_UINT8, BASE_HEX, NULL, 0x04,
2553 "Program IP", HFILL }},
2555 { &hf_artnet_ip_prog_command_reset,
2556 { "Reset parameters",
2557 "artnet.ip_prog.command_reset",
2558 FT_UINT8, BASE_HEX, NULL, 0x08,
2559 "Reset parameters", HFILL }},
2561 { &hf_artnet_ip_prog_command_unused,
2563 "artnet.ip_prog.command_unused",
2564 FT_UINT8, BASE_HEX, NULL, 0x70,
2567 { &hf_artnet_ip_prog_command_prog_enable,
2568 { "Enable Programming",
2569 "artnet.ip_prog.command_prog_enable",
2570 FT_UINT8, BASE_HEX, NULL, 0x80,
2571 "Enable Programming", HFILL }},
2573 { &hf_artnet_ip_prog_ip,
2575 "artnet.ip_prog.ip",
2576 FT_IPv4, BASE_DEC, NULL, 0x0,
2577 "IP Address", HFILL }},
2579 { &hf_artnet_ip_prog_sm,
2581 "artnet.ip_prog.sm",
2582 FT_IPv4, BASE_DEC, NULL, 0x0,
2583 "IP Subnet mask", HFILL }},
2585 { &hf_artnet_ip_prog_port,
2587 "artnet.ip_prog.port",
2588 FT_UINT16, BASE_DEC, NULL, 0x0,
2591 /* ArtIpProgReply */
2592 { &hf_artnet_ip_prog_reply,
2593 { "ArtIpProgReplay packet",
2594 "artnet.ip_prog_reply",
2595 FT_NONE, BASE_NONE, NULL, 0,
2596 "Art-Net ArtIpProgReply packet", HFILL }},
2598 { &hf_artnet_ip_prog_reply_ip,
2600 "artnet.ip_prog_reply.ip",
2601 FT_IPv4, BASE_DEC, NULL, 0x0,
2602 "IP Address", HFILL }},
2604 { &hf_artnet_ip_prog_reply_sm,
2606 "artnet.ip_prog_reply.sm",
2607 FT_IPv4, BASE_DEC, NULL, 0x0,
2608 "IP Subnet mask", HFILL }},
2610 { &hf_artnet_ip_prog_reply_port,
2612 "artnet.ip_prog_reply.port",
2613 FT_UINT16, BASE_DEC, NULL, 0x0,
2616 /* ArtPollServerReply */
2617 { &hf_artnet_poll_server_reply,
2618 { "ArtPollServerReply packet",
2619 "artnet.poll_server_reply",
2620 FT_NONE, BASE_NONE, NULL, 0,
2621 "Art-Net ArtPollServerReply packet", HFILL }}
2625 static gint *ett[] = {
2629 module_t *artnet_module;
2631 static enum_val_t disp_chan_val_types[] = {
2632 { "pro", "Percent", 0 },
2633 { "hex", "Hexadecimal", 1 },
2634 { "dec", "Decimal", 2 },
2638 static enum_val_t disp_chan_nr_types[] = {
2639 { "hex", "Hexadecimal", 0 },
2640 { "dec", "Decimal", 1 },
2644 static enum_val_t col_count[] = {
2653 proto_artnet = proto_register_protocol("Art-Net",
2655 proto_register_field_array(proto_artnet,hf,array_length(hf));
2656 proto_register_subtree_array(ett,array_length(ett));
2658 artnet_module = prefs_register_protocol(proto_artnet,
2659 proto_reg_handoff_artnet);
2660 prefs_register_uint_preference(artnet_module, "udp_port",
2662 "The UDP port on which "
2664 "packets will be sent",
2665 10,&global_udp_port_artnet);
2667 prefs_register_enum_preference(artnet_module, "dmx_disp_chan_val_type",
2668 "DMX Display channel value type",
2669 "The way DMX values are displayed",
2670 &global_disp_chan_val_type,
2671 disp_chan_val_types, FALSE);
2673 prefs_register_enum_preference(artnet_module, "dmx_disp_chan_nr_type",
2674 "DMX Display channel nr. type",
2675 "The way DMX channel numbers are displayed",
2676 &global_disp_chan_nr_type,
2677 disp_chan_nr_types, FALSE);
2679 prefs_register_enum_preference(artnet_module, "dmx_disp_col_count",
2680 "DMX Display Column Count",
2681 "The number of columns for the DMX display",
2682 &global_disp_col_count,
2686 /* The registration hand-off routing */
2689 proto_reg_handoff_artnet(void) {
2690 static gboolean artnet_initialized = FALSE;
2691 static dissector_handle_t artnet_handle;
2692 static guint udp_port_artnet;
2694 if(!artnet_initialized) {
2695 artnet_handle = create_dissector_handle(dissect_artnet,proto_artnet);
2696 rdm_handle = find_dissector("rdm");
2697 artnet_initialized = TRUE;
2699 dissector_delete("udp.port",udp_port_artnet,artnet_handle);
2702 udp_port_artnet = global_udp_port_artnet;
2704 dissector_add("udp.port",global_udp_port_artnet,artnet_handle);