Coverage Report

Created: 2026-07-12 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-citp.c
Line
Count
Source
1
/* packet-citp.c
2
 * Routines for CITP packet disassembly
3
 *
4
 * Copyright (c) 2025 by Matt Morris <mattm.dev.1[AT]gmail.com>
5
 *
6
 * Wireshark - Network traffic analyzer
7
 * By Gerald Combs <gerald@wireshark.org>
8
 * Copyright 1999 Gerald Combs
9
 *
10
 * Specification:
11
 * https://bitbucket.org/lars_wernlund/citp/src/master/
12
 * https://www.capture.se/Portals/0/Downloads/CITP%20CAEX%20Specification%20F.pdf?ver=2020-07-03-093027-283
13
 * http://www.techref.info/web/prod/cap/data/citp.pdf
14
 *
15
 *
16
 * SPDX-License-Identifier: GPL-2.0-or-later
17
 */
18
19
20
/* Include files */
21
#include "config.h"
22
#include <epan/packet.h>
23
#include <epan/tfs.h>
24
#include <epan/conversation.h>
25
#include <epan/expert.h>
26
#include "packet-tcp.h"
27
28
29
482
#define MAKE_TYPE_VAL(a, b, c, d)   ((a)<<24 | (b)<<16 | (c)<<8 | (d))
30
31
15
#define CITP_PORTS "4809-4810" /* Not IANA registered */
32
33
/* constants */
34
2.82k
#define CITP_COOKIE ((const uint8_t*)"CITP")
35
2.85k
#define CITP_COOKIE_LEN 4
36
37
38
44
#define CITP_PINF MAKE_TYPE_VAL('P', 'I', 'N', 'F')
39
44
#define CITP_SDMX MAKE_TYPE_VAL('S', 'D', 'M', 'X')
40
44
#define CITP_FPTC MAKE_TYPE_VAL('F', 'P', 'T', 'C')
41
44
#define CITP_FSEL MAKE_TYPE_VAL('F', 'S', 'E', 'L')
42
44
#define CITP_FINF MAKE_TYPE_VAL('F', 'I', 'N', 'F')
43
44
#define CITP_CAEX MAKE_TYPE_VAL('C', 'A', 'E', 'X')
44
44
#define CITP_MSEX MAKE_TYPE_VAL('M', 'S', 'E', 'X')
45
46
47
0
#define CITP_PINF_PNAM MAKE_TYPE_VAL('P', 'N', 'a', 'm')
48
0
#define CITP_PINF_PLOC MAKE_TYPE_VAL('P', 'L', 'o', 'c')
49
50
0
#define CITP_SDMX_CAPA MAKE_TYPE_VAL('C', 'a', 'p', 'a')
51
0
#define CITP_SDMX_UNAM MAKE_TYPE_VAL('U', 'N', 'a', 'm')
52
0
#define CITP_SDMX_ENID MAKE_TYPE_VAL('E', 'n', 'I', 'd')
53
0
#define CITP_SDMX_CHBK MAKE_TYPE_VAL('C', 'h', 'B', 'k')
54
0
#define CITP_SDMX_CHLS MAKE_TYPE_VAL('C', 'h', 'L', 's')
55
0
#define CITP_SDMX_SXSR MAKE_TYPE_VAL('S', 'X', 'S', 'r')
56
0
#define CITP_SDMX_SXUS MAKE_TYPE_VAL('S', 'X', 'U', 'S')
57
58
0
#define CITP_FPTC_PTCH MAKE_TYPE_VAL('P', 't', 'c', 'h')
59
0
#define CITP_FPTC_UPTC MAKE_TYPE_VAL('U', 'P', 't', 'c')
60
0
#define CITP_FPTC_SPTC MAKE_TYPE_VAL('S', 'P', 't', 'c')
61
62
0
#define CITP_FSEL_SELE MAKE_TYPE_VAL('S', 'e', 'l', 'e')
63
0
#define CITP_FSEL_DESE MAKE_TYPE_VAL('D', 'e', 'S', 'e')
64
65
0
#define CITP_FINF_SFRA MAKE_TYPE_VAL('S', 'F', 'r', 'a')
66
0
#define CITP_FINF_FRAM MAKE_TYPE_VAL('F', 'r', 'a', 'm')
67
68
0
#define CITP_MSEX_CINF MAKE_TYPE_VAL('C', 'I', 'n', 'f')
69
0
#define CITP_MSEX_SINF MAKE_TYPE_VAL('S', 'I', 'n', 'f')
70
0
#define CITP_MSEX_NACK MAKE_TYPE_VAL('N', 'a', 'c', 'k')
71
0
#define CITP_MSEX_LSTA MAKE_TYPE_VAL('L', 'S', 't', 'a')
72
0
#define CITP_MSEX_GELI MAKE_TYPE_VAL('G', 'E', 'L', 'I')
73
0
#define CITP_MSEX_ELIN MAKE_TYPE_VAL('E', 'L', 'I', 'n')
74
0
#define CITP_MSEX_ELUP MAKE_TYPE_VAL('E', 'L', 'U', 'p')
75
0
#define CITP_MSEX_GEIN MAKE_TYPE_VAL('G', 'E', 'I', 'n')
76
0
#define CITP_MSEX_MEIN MAKE_TYPE_VAL('M', 'E', 'I', 'n')
77
0
#define CITP_MSEX_EEIN MAKE_TYPE_VAL('E', 'E', 'I', 'n')
78
0
#define CITP_MSEX_GLEI MAKE_TYPE_VAL('G', 'L', 'I', 'n')
79
0
#define CITP_MSEX_GELT MAKE_TYPE_VAL('G', 'E', 'L', 'T')
80
0
#define CITP_MSEX_ELTH MAKE_TYPE_VAL('E', 'L', 'T', 'h')
81
0
#define CITP_MSEX_GETH MAKE_TYPE_VAL('G', 'E', 'T', 'h')
82
0
#define CITP_MSEX_ETHN MAKE_TYPE_VAL('E', 'T', 'h', 'n')
83
0
#define CITP_MSEX_GVSR MAKE_TYPE_VAL('G', 'V', 'S', 'r')
84
0
#define CITP_MSEX_VSRC MAKE_TYPE_VAL('V', 'S', 'r', 'c')
85
0
#define CITP_MSEX_RQST MAKE_TYPE_VAL('R', 'q', 'S', 't')
86
0
#define CITP_MSEX_STFR MAKE_TYPE_VAL('S', 't', 'F', 'r')
87
88
89
0
#define CITP_CAEX_NACK 0xFFFFFFFF
90
0
#define CITP_CAEX_LIVE_VIEW_GET_STATUS 0x00000100
91
0
#define CITP_CAEX_LIVE_VIEW_STATUS     0x00000101
92
0
#define CITP_CAEX_LIVE_VIEW_GET_IMAGE  0x00000200
93
0
#define CITP_CAEX_LIVE_VIEW_IMAGE      0x00000201
94
0
#define CITP_CAEX_CUE_RECORD_CAPA      0x00010100
95
0
#define CITP_CAEX_CUE_RECORD           0x00010200
96
0
#define CITP_CAEX_CUE_CLEAR_CAPA       0x00010300
97
0
#define CITP_CAEX_CUE_CLEAR            0x00010400
98
0
#define CITP_CAEX_SHOW_ENTER           0x00020100
99
0
#define CITP_CAEX_SHOW_LEAVE           0x00020101
100
0
#define CITP_CAEX_SET_TRANS_SPACE      0x00020150
101
0
#define CITP_CAEX_FIXTURE_LIST_REQ     0x00020200
102
0
#define CITP_CAEX_FIXTURE_LIST         0x00020201
103
0
#define CITP_CAEX_FIXTURE_MODIFY       0x00020202
104
0
#define CITP_CAEX_FIXTURE_REMOVE       0x00020203
105
0
#define CITP_CAEX_FIXTURE_ID           0x00020204
106
0
#define CITP_CAEX_FIXTURE_SELECT       0x00020300
107
0
#define CITP_CAEX_FIXTURE_STATUS       0x00020400
108
0
#define CITP_CAEX_LASER_GET_LIST       0x00030100
109
0
#define CITP_CAEX_LASER_LIST           0x00030101
110
0
#define CITP_CAEX_LASER_CONTROL        0x00030102
111
0
#define CITP_CAEX_LASER_FRAME          0x00030200
112
113
114
#define CITP_SDMX_CAPABILITY_CHLS   1
115
#define CITP_SDMX_CAPABILITY_SXSR   2
116
#define CITP_SDMX_CAPABILITY_SXUS   3
117
#define CITP_SDMX_CAPABILITY_ARTNET 101
118
#define CITP_SDMX_CAPABILITY_E131   102
119
#define CITP_SDMX_CAPABILITY_NET2   103
120
#define CITP_SDMX_CAPABILITY_MANET  104
121
#define CITP_SDMX_CAPABILITY_COMPVC 105
122
123
0
#define CITP_CAEX_IDENTIFIER_RDM_MANF         5
124
0
#define CITP_CAEX_IDENTIFIER_RDM_MODEL        0
125
0
#define CITP_CAEX_IDENTIFIER_RDM_PERSON       1
126
0
#define CITP_CAEX_IDENTIFIER_ALTA_FIXT        2
127
0
#define CITP_CAEX_IDENTIFIER_ALTA_MODEL       3
128
0
#define CITP_CAEX_IDENTIFIER_CAPTURE_INSTANCE 4
129
130
0
#define CITP_MSEX_V10 0x0100
131
0
#define CITP_MSEX_V11 0x0101
132
0
#define CITP_MSEX_V12 0x0102
133
134
0
#define CITP_MSEX_FORMAT_RGB8 MAKE_TYPE_VAL('R', 'G', 'B', '8')
135
0
#define CITP_MSEX_FORMAT_JPEG MAKE_TYPE_VAL('J', 'P', 'E', 'G')
136
0
#define CITP_MSEX_FORMAT_PNG  MAKE_TYPE_VAL('P', 'N', 'G', ' ')
137
0
#define CITP_MSEX_FORMAT_FJPG MAKE_TYPE_VAL('f', 'J', 'P', 'G')
138
0
#define CITP_MSEX_FORMAT_FPNG MAKE_TYPE_VAL('f', 'P', 'N', 'G')
139
140
static int proto_citp;
141
static int proto_citp_pinf;
142
static int proto_citp_sdmx;
143
static int proto_citp_fptc;
144
static int proto_citp_fsel;
145
static int proto_citp_finf;
146
static int proto_citp_caex;
147
static int proto_citp_msex;
148
149
static dissector_handle_t citp_handle;
150
static dissector_handle_t citp_tcp_handle;
151
152
static dissector_table_t content_type_table;
153
static dissector_table_t encryption_id_table;
154
155
156
static dissector_handle_t dmx_chan_handle;
157
static dissector_handle_t jpeg_handle;
158
static dissector_handle_t png_handle;
159
160
/*  Open/Close trees */
161
static int ett_citp;
162
static int ett_citp_pinf;
163
static int ett_citp_sdmx;
164
static int ett_citp_fptc;
165
static int ett_citp_fsel;
166
static int ett_citp_finf;
167
static int ett_citp_caex;
168
static int ett_citp_msex;
169
170
static int ett_citp_sdmx_capabilities;
171
static int ett_citp_fptc_fixture_identifiers;
172
static int ett_citp_fptc_content_hint;
173
static int ett_citp_fsel_fixture_identifiers;
174
static int ett_citp_finf_fixture_identifiers;
175
static int ett_citp_caex_view_pos;
176
static int ett_citp_caex_view_focus;
177
static int ett_citp_caex_cue_option;
178
static int ett_citp_caex_laser_point;
179
static int ett_citp_caex_laser_point_colour;
180
static int ett_citp_caex_show_fixtures;
181
static int ett_citp_caex_show_fixture;
182
static int ett_citp_caex_show_fixture_identifier;
183
static int ett_citp_caex_show_fixture_pos;
184
static int ett_citp_caex_show_fixture_angles;
185
static int ett_citp_caex_show_fixture_changed_fields;
186
187
static int ett_citp_msex_supported_versions;
188
static int ett_citp_msex_supported_version;
189
static int ett_citp_msex_supported_library_types;
190
static int ett_citp_msex_libraries;
191
static int ett_citp_msex_library;
192
static int ett_citp_msex_elements;
193
static int ett_citp_msex_element;
194
static int ett_citp_msex_element_parameter_names;
195
static int ett_citp_msex_sources;
196
static int ett_citp_msex_source;
197
static int ett_citp_msex_layers;
198
static int ett_citp_msex_layer;
199
static int ett_citp_msex_layer_status_flags;
200
static int ett_citp_msex_thumbnail_formats;
201
static int ett_citp_msex_stream_formats;
202
static int ett_citp_msex_library_update_flags;
203
static int ett_citp_msex_thumbnail_flags;
204
static int ett_citp_msex_source_flags;
205
static int ett_citp_msex_library_id;
206
static int ett_citp_msex_library_parent_id;
207
static int ett_citp_msex_frame_fragment;
208
static int ett_citp_msex_library_affected_elements;
209
static int ett_citp_msex_library_affected_subs;
210
211
/* Expert Info */
212
static expert_field ei_citp_content_type;
213
static expert_field ei_citp_message_size;
214
215
static expert_field ei_citp_pinf_content_type;
216
static expert_field ei_citp_sdmx_content_type;
217
static expert_field ei_citp_fptc_content_type;
218
static expert_field ei_citp_fsel_content_type;
219
static expert_field ei_citp_finf_content_type;
220
221
static expert_field ei_citp_caex_content_code;
222
static expert_field ei_citp_caex_fixture_ident;
223
static expert_field ei_citp_caex_view_format;
224
static expert_field ei_citp_msex_content_type;
225
static expert_field ei_citp_msex_version;
226
static expert_field ei_citp_msex_thumb_format;
227
static expert_field ei_citp_msex_stream_format;
228
229
/*  Register fields */
230
static int hf_citp_cookie;
231
static int hf_citp_version_major;
232
static int hf_citp_version_minor;
233
static int hf_citp_message_index;
234
static int hf_citp_message_size;
235
static int hf_citp_message_part_count;
236
static int hf_citp_message_part_index;
237
static int hf_citp_content_type;
238
239
static int hf_citp_pinf_content_type;
240
static int hf_citp_pinf_listening_port;
241
static int hf_citp_pinf_name;
242
static int hf_citp_pinf_type;
243
static int hf_citp_pinf_state;
244
245
static int hf_citp_sdmx_content_type;
246
static int hf_citp_sdmx_capability_count;
247
static int hf_citp_sdmx_capabilities;
248
static int hf_citp_sdmx_capability;
249
static int hf_citp_sdmx_universe_index;
250
static int hf_citp_sdmx_universe_name;
251
static int hf_citp_sdmx_encryption_identifier;
252
static int hf_citp_sdmx_blind;
253
static int hf_citp_sdmx_first_channel;
254
static int hf_citp_sdmx_channel_count;
255
static int hf_citp_sdmx_channel_levels;
256
static int hf_citp_sdmx_encrypted_channel_data;
257
static int hf_citp_sdmx_channel_level_block;
258
static int hf_citp_sdmx_channel;
259
static int hf_citp_sdmx_channel_level;
260
static int hf_citp_sdmx_connection_string;
261
262
static int hf_citp_fptc_content_type;
263
static int hf_citp_fptc_content_hint;
264
static int hf_citp_fptc_content_hint_in_sequence;
265
static int hf_citp_fptc_content_hint_end_sequence;
266
static int hf_citp_fptc_fixture_identifier;
267
static int hf_citp_fptc_universe;
268
static int hf_citp_fptc_channel;
269
static int hf_citp_fptc_channel_count;
270
static int hf_citp_fptc_fixture_make;
271
static int hf_citp_fptc_fixture_name;
272
static int hf_citp_fptc_fixture_count;
273
static int hf_citp_fptc_fixture_identifiers;
274
275
static int hf_citp_fsel_content_type;
276
static int hf_citp_fsel_complete;
277
static int hf_citp_fsel_fixture_count;
278
static int hf_citp_fsel_fixture_identifiers;
279
static int hf_citp_fsel_fixture_identifier;
280
281
static int hf_citp_finf_content_type;
282
static int hf_citp_finf_fixture_count;
283
static int hf_citp_finf_fixture_identifiers;
284
static int hf_citp_finf_fixture_identifier;
285
static int hf_citp_finf_frame_filter_count;
286
static int hf_citp_finf_frame_gobo_count;
287
static int hf_citp_finf_frame_names;
288
static int hf_citp_finf_filter_name;
289
static int hf_citp_finf_gobo_name;
290
291
292
293
static int hf_citp_caex_content_code;
294
static int hf_citp_caex_nack_reason;
295
static int hf_citp_caex_view_availability;
296
static int hf_citp_caex_view_size;
297
static int hf_citp_caex_view_width;
298
static int hf_citp_caex_view_height;
299
static int hf_citp_caex_view_position;
300
static int hf_citp_caex_view_position_x;
301
static int hf_citp_caex_view_position_y;
302
static int hf_citp_caex_view_position_z;
303
static int hf_citp_caex_view_focus;
304
static int hf_citp_caex_view_focus_x;
305
static int hf_citp_caex_view_focus_y;
306
static int hf_citp_caex_view_focus_z;
307
static int hf_citp_caex_view_format;
308
static int hf_citp_caex_view_data_size;
309
static int hf_citp_caex_view_data;
310
311
static int hf_citp_caex_cue_availability;
312
static int hf_citp_caex_cue_option_count;
313
static int hf_citp_caex_cue_option;
314
static int hf_citp_caex_cue_option_name;
315
static int hf_citp_caex_cue_option_value;
316
static int hf_citp_caex_cue_option_choices;
317
static int hf_citp_caex_cue_option_help;
318
static int hf_citp_caex_cue_clear_availability;
319
320
static int hf_citp_caex_show_name;
321
static int hf_citp_caex_show_transformation_space;
322
static int hf_citp_caex_show_fixture_list_type;
323
static int hf_citp_caex_show_fixture_count;
324
static int hf_citp_caex_show_fixtures;
325
static int hf_citp_caex_show_fixture;
326
static int hf_citp_caex_show_fixture_console_identifier;
327
static int hf_citp_caex_show_fixture_manufacturer_name;
328
static int hf_citp_caex_show_fixture_model_name;
329
static int hf_citp_caex_show_fixture_mode_name;
330
static int hf_citp_caex_show_fixture_channel_count;
331
static int hf_citp_caex_show_fixture_is_dimmer;
332
static int hf_citp_caex_show_fixture_identifier_count;
333
static int hf_citp_caex_show_fixture_identifier;
334
static int hf_citp_caex_show_fixture_identifier_type;
335
static int hf_citp_caex_show_fixture_identifier_data_size;
336
static int hf_citp_caex_show_fixture_identifier_data;
337
static int hf_citp_caex_show_fixture_identifier_rdm_manufacturer_id;
338
static int hf_citp_caex_show_fixture_identifier_rdm_device_model_id;
339
static int hf_citp_caex_show_fixture_identifier_rdm_personality_id;
340
static int hf_citp_caex_show_fixture_identifier_altabase_fixture_id;
341
static int hf_citp_caex_show_fixture_identifier_altabase_mode_id;
342
static int hf_citp_caex_show_fixture_identifier_capture_instance_id;
343
static int hf_citp_caex_show_fixture_patched;
344
static int hf_citp_caex_show_fixture_universe;
345
static int hf_citp_caex_show_fixture_universe_channel;
346
static int hf_citp_caex_show_fixture_unit;
347
static int hf_citp_caex_show_fixture_channel;
348
static int hf_citp_caex_show_fixture_circuit;
349
static int hf_citp_caex_show_fixture_note;
350
static int hf_citp_caex_show_fixture_position;
351
static int hf_citp_caex_show_fixture_position_x;
352
static int hf_citp_caex_show_fixture_position_y;
353
static int hf_citp_caex_show_fixture_position_z;
354
static int hf_citp_caex_show_fixture_angles;
355
static int hf_citp_caex_show_fixture_angles_x;
356
static int hf_citp_caex_show_fixture_angles_y;
357
static int hf_citp_caex_show_fixture_angles_z;
358
static int hf_citp_caex_show_fixture_locked;
359
static int hf_citp_caex_show_fixture_clearable;
360
static int hf_citp_caex_show_fixture_changed_fields;
361
static int hf_citp_caex_show_fixture_changed_fields_patch;
362
static int hf_citp_caex_show_fixture_changed_fields_unit;
363
static int hf_citp_caex_show_fixture_changed_fields_channel;
364
static int hf_citp_caex_show_fixture_changed_fields_circuit;
365
static int hf_citp_caex_show_fixture_changed_fields_note;
366
static int hf_citp_caex_show_fixture_changed_fields_position;
367
368
static int hf_citp_caex_laser_source_key;
369
static int hf_citp_caex_laser_feed_count;
370
static int hf_citp_caex_laser_feed_name;
371
static int hf_citp_caex_laser_feed_index;
372
static int hf_citp_caex_laser_frame_rate;
373
static int hf_citp_caex_laser_frame_sequence_number;
374
static int hf_citp_caex_laser_point_count;
375
static int hf_citp_caex_laser_points;
376
static int hf_citp_caex_laser_point;
377
static int hf_citp_caex_laser_point_x_low;
378
static int hf_citp_caex_laser_point_y_low;
379
static int hf_citp_caex_laser_point_xy_high;
380
static int hf_citp_caex_laser_point_x;
381
static int hf_citp_caex_laser_point_y;
382
static int hf_citp_caex_laser_point_colour;
383
static int hf_citp_caex_laser_point_colour_r;
384
static int hf_citp_caex_laser_point_colour_g;
385
static int hf_citp_caex_laser_point_colour_b;
386
387
388
389
static int hf_citp_msex_version_major;
390
static int hf_citp_msex_version_minor;
391
static int hf_citp_msex_content_type;
392
static int hf_citp_msex_supported_version_count;
393
static int hf_citp_msex_supported_versions;
394
static int hf_citp_msex_supported_version;
395
static int hf_citp_msex_uuid;
396
static int hf_citp_msex_product_name;
397
static int hf_citp_msex_product_version_major;
398
static int hf_citp_msex_product_version_minor;
399
static int hf_citp_msex_product_version_bugfix;
400
static int hf_citp_msex_supported_library_types;
401
static int hf_citp_msex_supported_library_types_media;
402
static int hf_citp_msex_supported_library_types_effects;
403
static int hf_citp_msex_supported_library_types_cues;
404
static int hf_citp_msex_supported_library_types_crossfades;
405
static int hf_citp_msex_supported_library_types_masks;
406
static int hf_citp_msex_supported_library_types_blend_presets;
407
static int hf_citp_msex_supported_library_types_effect_presets;
408
static int hf_citp_msex_supported_library_types_image_presets;
409
static int hf_citp_msex_supported_library_types_3d_meshes;
410
static int hf_citp_msex_received_content_type;
411
412
static int hf_citp_msex_layer_count;
413
static int hf_citp_msex_layers;
414
static int hf_citp_msex_layer;
415
static int hf_citp_msex_layer_dmx_source;
416
static int hf_citp_msex_layer_number;
417
static int hf_citp_msex_layer_physical_output;
418
static int hf_citp_msex_layer_status_flags;
419
static int hf_citp_msex_layer_status_flags_playing;
420
static int hf_citp_msex_layer_status_flags_reverse;
421
static int hf_citp_msex_layer_status_flags_looping;
422
static int hf_citp_msex_layer_status_flags_bouncing;
423
static int hf_citp_msex_layer_status_flags_random;
424
static int hf_citp_msex_layer_status_flags_paused;
425
426
static int hf_citp_msex_library_count;
427
static int hf_citp_msex_libraries;
428
static int hf_citp_msex_library;
429
static int hf_citp_msex_library_type;
430
static int hf_citp_msex_library_number;
431
static int hf_citp_msex_library_id;
432
static int hf_citp_msex_library_id_level;
433
static int hf_citp_msex_library_id_level_1;
434
static int hf_citp_msex_library_id_level_2;
435
static int hf_citp_msex_library_id_level_3;
436
static int hf_citp_msex_library_parent_id;
437
static int hf_citp_msex_library_serial_number;
438
static int hf_citp_msex_library_dmx_min;
439
static int hf_citp_msex_library_dmx_max;
440
static int hf_citp_msex_library_name;
441
static int hf_citp_msex_library_sub_count;
442
static int hf_citp_msex_library_element_count;
443
static int hf_citp_msex_library_update_flags;
444
static int hf_citp_msex_library_update_flags_elements_updated;
445
static int hf_citp_msex_library_update_flags_elements_added_removed;
446
static int hf_citp_msex_library_update_flags_subs_updated;
447
static int hf_citp_msex_library_update_flags_subs_added_removed;
448
static int hf_citp_msex_library_update_flags_all_elements;
449
static int hf_citp_msex_library_update_flags_all_subs;
450
static int hf_citp_msex_library_affected_elements;
451
static int hf_citp_msex_library_affected_subs;
452
static int hf_citp_msex_library_affected_element;
453
static int hf_citp_msex_library_affected_sub;
454
455
static int hf_citp_msex_element_count;
456
static int hf_citp_msex_elements;
457
static int hf_citp_msex_element;
458
static int hf_citp_msex_element_number;
459
static int hf_citp_msex_element_serial_number;
460
static int hf_citp_msex_element_dmx_min;
461
static int hf_citp_msex_element_dmx_max;
462
static int hf_citp_msex_element_name;
463
static int hf_citp_msex_element_version_timestamp;
464
static int hf_citp_msex_element_position;
465
static int hf_citp_msex_element_width;
466
static int hf_citp_msex_element_height;
467
static int hf_citp_msex_element_length;
468
static int hf_citp_msex_element_fps;
469
static int hf_citp_msex_element_parameter_count;
470
static int hf_citp_msex_element_parameter_names;
471
static int hf_citp_msex_element_parameter_name;
472
473
static int hf_citp_msex_thumbnail_format_count;
474
static int hf_citp_msex_thumbnail_formats;
475
static int hf_citp_msex_thumbnail_format;
476
static int hf_citp_msex_thumbnail_width;
477
static int hf_citp_msex_thumbnail_height;
478
static int hf_citp_msex_thumbnail_flags;
479
static int hf_citp_msex_thumbnail_flags_preserve_aspect;
480
static int hf_citp_msex_thumbnail_buffer_size;
481
static int hf_citp_msex_thumbnail_buffer;
482
483
static int hf_citp_msex_source_count;
484
static int hf_citp_msex_sources;
485
static int hf_citp_msex_source;
486
static int hf_citp_msex_source_server_uuid;
487
static int hf_citp_msex_source_id;
488
static int hf_citp_msex_source_name;
489
static int hf_citp_msex_source_physical_output;
490
static int hf_citp_msex_source_layer_number;
491
static int hf_citp_msex_source_flags;
492
static int hf_citp_msex_source_flags_without_effects;
493
static int hf_citp_msex_source_width;
494
static int hf_citp_msex_source_height;
495
496
static int hf_citp_msex_stream_format_count;
497
static int hf_citp_msex_stream_formats;
498
static int hf_citp_msex_stream_format;
499
static int hf_citp_msex_stream_width;
500
static int hf_citp_msex_stream_height;
501
static int hf_citp_msex_stream_fps;
502
static int hf_citp_msex_stream_timeout;
503
504
static int hf_citp_msex_frame_buffer_size;
505
static int hf_citp_msex_frame_buffer;
506
static int hf_citp_msex_frame_index;
507
static int hf_citp_msex_frame_fragment;
508
static int hf_citp_msex_frame_fragment_count;
509
static int hf_citp_msex_frame_fragment_index;
510
static int hf_citp_msex_frame_fragment_byte_offset;
511
512
static const true_false_string tfs_live_blind = {
513
    "Blind",
514
    "Live",
515
};
516
517
static const value_string citp_content_type_names[] = {
518
    { CITP_PINF, "PINF : Peer INFormation" },
519
    { CITP_SDMX, "SDMX : Send DMX" },
520
    { CITP_FPTC, "FPTC : Fixture PATch" },
521
    { CITP_FSEL, "FSEL : Fixture SELection" },
522
    { CITP_FINF, "FINF : Fixture INFormation" },
523
    { CITP_CAEX, "CAEX : CApture EXtensions" },
524
    { CITP_MSEX, "MSEX : Media Server EXtensions" },
525
    { 0,         NULL },
526
};
527
static const value_string citp_pinf_content_type_names[] = {
528
    { CITP_PINF_PNAM, "PNam : Peer Name" },
529
    { CITP_PINF_PLOC, "PLoc : Peer Location" },
530
    { 0,              NULL },
531
};
532
static const value_string citp_sdmx_content_type_names[] = {
533
    { CITP_SDMX_CAPA, "Capa : Capabilities" },
534
    { CITP_SDMX_UNAM, "UNam : Universe Name" },
535
    { CITP_SDMX_ENID, "EnId : Encryption Identifier" },
536
    { CITP_SDMX_CHBK, "ChBk : Channel Block" },
537
    { CITP_SDMX_CHLS, "ChLs : Channel List" },
538
    { CITP_SDMX_SXSR, "SXSr : Set External Source" },
539
    { CITP_SDMX_SXUS, "SXUS : Set External Universe Source" },
540
    { 0,              NULL },
541
};
542
static const value_string citp_fptc_content_type_names[] = {
543
    { CITP_FPTC_PTCH, "Ptch : Patch" },
544
    { CITP_FPTC_UPTC, "UPtc : UnPatch" },
545
    { CITP_FPTC_SPTC, "SPtc : Send Patch" },
546
    { 0,              NULL },
547
};
548
static const value_string citp_fsel_content_type_names[] = {
549
    { CITP_FSEL_SELE, "Sele : Select" },
550
    { CITP_FSEL_DESE, "DeSe : Deselect" },
551
    { 0,              NULL },
552
};
553
static const value_string citp_finf_content_type_names[] = {
554
    { CITP_FINF_SFRA, "SFra : Send Frames" },
555
    { CITP_FINF_FRAM, "Fram : Frames" },
556
    { 0,              NULL },
557
};
558
static const value_string citp_msex_content_type_names[] = {
559
    { CITP_MSEX_CINF, "CInf : Client Information" },
560
    { CITP_MSEX_SINF, "SInf : Server Information" },
561
    { CITP_MSEX_NACK, "Nack : Negative Acknowledgement" },
562
    { CITP_MSEX_LSTA, "LSta : Layer Status" },
563
    { CITP_MSEX_GELI, "GELI : Get Element Library Information" },
564
    { CITP_MSEX_ELIN, "ELIn : Element Library Information" },
565
    { CITP_MSEX_ELUP, "ELUp : Element Library Updated" },
566
    { CITP_MSEX_GEIN, "GEIn : Get Element Information" },
567
    { CITP_MSEX_MEIN, "MEIn : Media Element Information" },
568
    { CITP_MSEX_EEIN, "EEIn : Effect Element Information" },
569
    { CITP_MSEX_GLEI, "GLIn : Generic Element Information" },
570
    { CITP_MSEX_GELT, "GELT : Get Element Library Thumbnail" },
571
    { CITP_MSEX_ELTH, "ELTh : Element Library Thumbnail" },
572
    { CITP_MSEX_GETH, "GETh : Get Element Thumbnail" },
573
    { CITP_MSEX_ETHN, "EThn : Element Thumbnail" },
574
    { CITP_MSEX_GVSR, "GVSr : Get Video Sources" },
575
    { CITP_MSEX_VSRC, "VSrc : Video Sources" },
576
    { CITP_MSEX_RQST, "RqSt : Request Stream" },
577
    { CITP_MSEX_STFR, "StFr : Stream Frame" },
578
    { 0,              NULL },
579
};
580
static const value_string citp_msex_content_type_short_names[] = {
581
    { CITP_MSEX_CINF, "CInf" },
582
    { CITP_MSEX_SINF, "SInf" },
583
    { CITP_MSEX_NACK, "Nack" },
584
    { CITP_MSEX_LSTA, "LSta" },
585
    { CITP_MSEX_GELI, "GELI" },
586
    { CITP_MSEX_ELIN, "ELIn" },
587
    { CITP_MSEX_ELUP, "ELUp" },
588
    { CITP_MSEX_GEIN, "GEIn" },
589
    { CITP_MSEX_MEIN, "MEIn" },
590
    { CITP_MSEX_EEIN, "EEIn" },
591
    { CITP_MSEX_GLEI, "GLIn" },
592
    { CITP_MSEX_GELT, "GELT" },
593
    { CITP_MSEX_ELTH, "ELTh" },
594
    { CITP_MSEX_GETH, "GETh" },
595
    { CITP_MSEX_ETHN, "EThn" },
596
    { CITP_MSEX_GVSR, "GVSr" },
597
    { CITP_MSEX_VSRC, "VSrc" },
598
    { CITP_MSEX_RQST, "RqSt" },
599
    { CITP_MSEX_STFR, "StFr" },
600
    { 0,              NULL },
601
};
602
603
/* Use these with BASE_SPECIAL_VALS */
604
static const value_string citp_all_fixtures_val_str[] = {
605
    { 0, "All Fixtures" },
606
    { 0, NULL}
607
};
608
static const value_string citp_all_libraries_val_str[] = {
609
    { 0, "All Libraries" },
610
    { 0, NULL}
611
};
612
static const value_string citp_all_elements_val_str[] = {
613
    { 0, "All Elements" },
614
    { 0, NULL}
615
};
616
617
static const value_string citp_sdmx_capability_names[] = {
618
    { CITP_SDMX_CAPABILITY_CHLS,   "ChLs channel list" },
619
    { CITP_SDMX_CAPABILITY_SXSR,   "SXSr external source" },
620
    { CITP_SDMX_CAPABILITY_SXUS,   "SXUS per-universe external sources" },
621
    { CITP_SDMX_CAPABILITY_ARTNET, "Art-Net external sources" },
622
    { CITP_SDMX_CAPABILITY_E131,   "BSR E1.31 external sources" },
623
    { CITP_SDMX_CAPABILITY_NET2,   "ETC Net2 external sources" },
624
    { CITP_SDMX_CAPABILITY_MANET,  "MA-Net external sources" },
625
    { CITP_SDMX_CAPABILITY_COMPVC, "Compulite VC external sources" },
626
    { 0,                           NULL },
627
};
628
629
static const value_string citp_caex_content_code_names[] = {
630
    { CITP_CAEX_LIVE_VIEW_GET_IMAGE,  "Get Live View Image" },
631
    { CITP_CAEX_LIVE_VIEW_IMAGE,      "Live View Image" },
632
    { CITP_CAEX_LIVE_VIEW_GET_STATUS, "Get Live View Status" },
633
    { CITP_CAEX_LIVE_VIEW_STATUS,     "Live View Status" },
634
    { CITP_CAEX_CUE_RECORD_CAPA,      "Set Cue Recording Capabilities" },
635
    { CITP_CAEX_CUE_RECORD,           "Record Cue" },
636
    { CITP_CAEX_CUE_CLEAR_CAPA,       "Set Recorder Clearing Capabilities" },
637
    { CITP_CAEX_CUE_CLEAR,            "Clear Recorder" },
638
    { CITP_CAEX_SHOW_ENTER,           "Enter Show" },
639
    { CITP_CAEX_SHOW_LEAVE,           "Leave Show" },
640
    { CITP_CAEX_SET_TRANS_SPACE,      "Set Fixture Transformation Space" },
641
    { CITP_CAEX_FIXTURE_LIST_REQ,     "Fixture List Request" },
642
    { CITP_CAEX_FIXTURE_LIST,         "Fixture List" },
643
    { CITP_CAEX_FIXTURE_MODIFY,       "Fixture Modify" },
644
    { CITP_CAEX_FIXTURE_REMOVE,       "Fixture Remove" },
645
    { CITP_CAEX_FIXTURE_ID,           "Fixture Identify" },
646
    { CITP_CAEX_FIXTURE_SELECT,       "Fixture Selection" },
647
    { CITP_CAEX_FIXTURE_STATUS,       "Fixture Console Status" },
648
    { CITP_CAEX_LASER_GET_LIST,       "Get Laser Feed List" },
649
    { CITP_CAEX_LASER_LIST,           "Laser Feed List" },
650
    { CITP_CAEX_LASER_CONTROL,        "Laser Feed Control" },
651
    { CITP_CAEX_LASER_FRAME,          "Laser Feed Frame" },
652
    { CITP_CAEX_NACK,                 "NAck" },
653
    { 0,                              NULL },
654
};
655
656
static const value_string citp_caex_nack_reason[] = {
657
    { 0, "Unknown Request" },
658
    { 1, "Incorrect or Malformed Request" },
659
    { 2, "Internal Error" },
660
    { 3, "Request Refused" },
661
    { 0, NULL },
662
};
663
static const value_string citp_caex_view_availability[] = {
664
    { 0, "Not available" },
665
    { 1, "Alpha view available" },
666
    { 2, "Beta view available" },
667
    { 3, "Gamma view available" },
668
    { 0, NULL },
669
};
670
static const value_string citp_caex_cue_record_availability[] = {
671
    { 0, "Not available" },
672
    { 1, "Available" },
673
    { 0, NULL },
674
};
675
static const value_string citp_caex_cue_clear_availability[] = {
676
    { 0, "Unsupported" },
677
    { 1, "Currently unavailable" },
678
    { 2, "Available" },
679
    { 0, NULL },
680
};
681
static const value_string citp_caex_show_transformation_spaces[] = {
682
    { 0, "Native" },
683
    { 1, "PanHome" },
684
    { 0, NULL },
685
};
686
static const value_string citp_caex_show_fixture_list_types[] = {
687
    { 0, "Existing patch list" },
688
    { 1, "New fixture(s)" },
689
    { 2, "Exchanged fixture(s)" },
690
    { 0, NULL },
691
};
692
static const value_string citp_caex_show_identifier_types[] = {
693
    { CITP_CAEX_IDENTIFIER_RDM_MODEL,        "RDM Model Id" },
694
    { CITP_CAEX_IDENTIFIER_RDM_PERSON,       "RDM Personality Id" },
695
    { CITP_CAEX_IDENTIFIER_ALTA_FIXT,        "AltaBase Fixture Id" },
696
    { CITP_CAEX_IDENTIFIER_ALTA_MODEL,       "AltaBase Model Id" },
697
    { CITP_CAEX_IDENTIFIER_CAPTURE_INSTANCE, "Capture Instance Id" },
698
    { CITP_CAEX_IDENTIFIER_RDM_MANF,         "RDM Manufacturer Id" },
699
    { 0,                                     NULL },
700
};
701
static const value_string citp_msex_library_types[] = {
702
    { 1, "Media" },
703
    { 2, "Effects" },
704
    { 3, "Cues" },
705
    { 4, "Crossfades" },
706
    { 5, "Masks" },
707
    { 6, "Blend Presets" },
708
    { 7, "Effect Presets" },
709
    { 8, "Image Presets" },
710
    { 9, "3D Meshes" },
711
    { 0, NULL },
712
};
713
714
715
static int * const citp_fptc_content_hint[] = {
716
    &hf_citp_fptc_content_hint_in_sequence,
717
    &hf_citp_fptc_content_hint_end_sequence,
718
    NULL
719
};
720
721
static int * const citp_caex_laser_point_colour_fields[] = {
722
    &hf_citp_caex_laser_point_colour_r,
723
    &hf_citp_caex_laser_point_colour_g,
724
    &hf_citp_caex_laser_point_colour_b,
725
    NULL
726
};
727
728
static int * const citp_caex_show_fixture_changed_fields[] = {
729
    &hf_citp_caex_show_fixture_changed_fields_patch,
730
    &hf_citp_caex_show_fixture_changed_fields_unit,
731
    &hf_citp_caex_show_fixture_changed_fields_channel,
732
    &hf_citp_caex_show_fixture_changed_fields_circuit,
733
    &hf_citp_caex_show_fixture_changed_fields_note,
734
    &hf_citp_caex_show_fixture_changed_fields_position,
735
    NULL
736
};
737
738
static int * const citp_msex_supported_library_types[] = {
739
    &hf_citp_msex_supported_library_types_media,
740
    &hf_citp_msex_supported_library_types_effects,
741
    &hf_citp_msex_supported_library_types_cues,
742
    &hf_citp_msex_supported_library_types_crossfades,
743
    &hf_citp_msex_supported_library_types_masks,
744
    &hf_citp_msex_supported_library_types_blend_presets,
745
    &hf_citp_msex_supported_library_types_effect_presets,
746
    &hf_citp_msex_supported_library_types_image_presets,
747
    &hf_citp_msex_supported_library_types_3d_meshes,
748
    NULL
749
};
750
751
static int * const citp_msex_layer_status_flags[] = {
752
    &hf_citp_msex_layer_status_flags_playing,
753
    &hf_citp_msex_layer_status_flags_reverse,
754
    &hf_citp_msex_layer_status_flags_looping,
755
    &hf_citp_msex_layer_status_flags_bouncing,
756
    &hf_citp_msex_layer_status_flags_random,
757
    &hf_citp_msex_layer_status_flags_paused,
758
    NULL
759
};
760
761
static int * const citp_msex_library_update_flags[] = {
762
    &hf_citp_msex_library_update_flags_elements_updated,
763
    &hf_citp_msex_library_update_flags_elements_added_removed,
764
    &hf_citp_msex_library_update_flags_subs_updated,
765
    &hf_citp_msex_library_update_flags_subs_added_removed,
766
    &hf_citp_msex_library_update_flags_all_elements,
767
    &hf_citp_msex_library_update_flags_all_subs,
768
    NULL
769
};
770
771
static int * const citp_msex_thumbnail_flags[] = {
772
    &hf_citp_msex_thumbnail_flags_preserve_aspect,
773
    NULL
774
};
775
776
static int * const citp_msex_source_flags[] = {
777
    &hf_citp_msex_source_flags_without_effects,
778
    NULL
779
};
780
781
782
/******************************************************************************/
783
/* Dissect protocol                                                           */
784
785
typedef struct sdmx_enc_info {
786
    char *id;
787
} sdmx_enc_info;
788
789
/** enid should have been allocated with wmem_file_scope() */
790
0
static void set_conversation_encryption(packet_info *pinfo, char* enid) {
791
0
    conversation_t *conv = find_or_create_conversation(pinfo);
792
0
    sdmx_enc_info * info = conversation_get_proto_data(conv, proto_citp_sdmx);
793
0
    if (info == NULL) {
794
0
        info = wmem_alloc0(wmem_file_scope(), sizeof(sdmx_enc_info));
795
0
        info->id = enid;
796
0
        conversation_add_proto_data(conv, proto_citp_sdmx, (void*)info);
797
0
    } else {
798
0
        if (strcmp(info->id, enid) == 0) {
799
            /* free unused enid */
800
0
            wmem_free(wmem_file_scope(), enid);
801
0
        } else {
802
            /* free old enid, is copied wherever it's used in proto tree, so no use-after-free */
803
0
            wmem_free(wmem_file_scope(), info->id);
804
0
            info->id = enid;
805
0
        }
806
0
    }
807
0
}
808
809
0
static char* get_conversation_encryption(packet_info *pinfo) {
810
0
    conversation_t *conv = find_or_create_conversation(pinfo);
811
0
    sdmx_enc_info * info = conversation_get_proto_data(conv, proto_citp_sdmx);
812
0
    if (info == NULL) return NULL;
813
0
    return info->id;
814
0
}
815
816
static int
817
0
dissect_u16_list(tvbuff_t *tvb, proto_tree *tree, int offset, uint32_t count, int hf_list, int ett_list, int hf_list_element) {
818
0
    if (count != 0) {
819
0
        proto_item *ti = proto_tree_add_item(tree, hf_list, tvb, offset, count * 2, ENC_NA);
820
0
        proto_tree *list_tree = proto_item_add_subtree(ti, ett_list);
821
0
        for (unsigned int i = 0; i < count; i++) {
822
0
            proto_tree_add_item(list_tree, hf_list_element, tvb, offset, 2, ENC_LITTLE_ENDIAN);
823
0
            offset += 2;
824
0
        }
825
0
    }
826
0
    return offset;
827
0
}
828
829
static int
830
dissect_pinf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
831
0
{
832
0
    unsigned str_len;
833
0
    const uint8_t *name;
834
0
    unsigned offset = 0;
835
0
    col_append_str(pinfo->cinfo, COL_PROTOCOL, "/PINF");
836
    /* Clear the info column */
837
0
    col_clear(pinfo->cinfo, COL_INFO);
838
839
0
    proto_item *ti = proto_tree_add_item(tree, proto_citp_pinf, tvb, offset, -1, ENC_NA);
840
0
    proto_tree *pinf_tree = proto_item_add_subtree(ti, ett_citp_pinf);
841
842
0
    uint32_t content_type;
843
0
    proto_tree_add_item_ret_uint(pinf_tree, hf_citp_pinf_content_type, tvb, offset, 4, ENC_BIG_ENDIAN, &content_type);
844
0
    offset += 4;
845
846
0
    switch (content_type) {
847
0
        case CITP_PINF_PNAM:
848
0
            proto_tree_add_item_ret_string_and_length(pinf_tree, hf_citp_pinf_name, tvb, offset, -1, ENC_UTF_8, pinfo->pool, &name, &str_len);
849
0
            offset += str_len;
850
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "PNam, %s", name);
851
0
            break;
852
0
        case CITP_PINF_PLOC: {
853
0
            uint32_t port;
854
0
            proto_tree_add_item_ret_uint(pinf_tree, hf_citp_pinf_listening_port, tvb, offset, 2, ENC_LITTLE_ENDIAN, &port);
855
0
            offset += 2;
856
0
            proto_tree_add_item_ret_length(pinf_tree, hf_citp_pinf_type, tvb, offset, -1, ENC_UTF_8, &str_len);
857
0
            offset += str_len;
858
0
            proto_tree_add_item_ret_string_and_length(pinf_tree, hf_citp_pinf_name, tvb, offset, -1, ENC_UTF_8, pinfo->pool, &name, &str_len);
859
0
            offset += str_len;
860
0
            proto_tree_add_item_ret_length(pinf_tree, hf_citp_pinf_state, tvb, offset, -1, ENC_UTF_8, &str_len);
861
0
            offset += str_len;
862
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "PLoc, Port %d, %s", port, name);
863
0
            break;
864
0
        }
865
0
        default:
866
0
            expert_add_info(pinfo, tree, &ei_citp_pinf_content_type);
867
0
            break;
868
0
    }
869
0
    return offset;
870
0
}
871
872
static int
873
dissect_sdmx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
874
0
{
875
0
    unsigned str_len;
876
0
    uint32_t count;
877
0
    uint32_t univ_num; const uint8_t *name;
878
0
    unsigned offset = 0;
879
0
    col_append_str(pinfo->cinfo, COL_PROTOCOL, "/SDMX");
880
    /* Clear the info column */
881
0
    col_clear(pinfo->cinfo, COL_INFO);
882
883
0
    proto_item *ti = proto_tree_add_item(tree, proto_citp_sdmx, tvb, offset, -1, ENC_NA);
884
0
    proto_tree *sdmx_tree = proto_item_add_subtree(ti, ett_citp_sdmx);
885
886
0
    uint32_t content_type;
887
0
    proto_tree_add_item_ret_uint(sdmx_tree, hf_citp_sdmx_content_type, tvb, offset, 4, ENC_BIG_ENDIAN, &content_type);
888
0
    offset += 4;
889
890
0
    switch (content_type) {
891
0
        case CITP_SDMX_CAPA:
892
0
            proto_tree_add_item_ret_uint(sdmx_tree, hf_citp_sdmx_capability_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &count);
893
0
            offset += 2;
894
0
            offset = dissect_u16_list(tvb, sdmx_tree, offset, count, hf_citp_sdmx_capabilities, ett_citp_sdmx_capabilities, hf_citp_sdmx_capability);
895
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "Capa, Count %d", count);
896
0
            break;
897
0
        case CITP_SDMX_UNAM:
898
0
            proto_tree_add_item_ret_uint(sdmx_tree, hf_citp_sdmx_universe_index, tvb, offset, 1, ENC_LITTLE_ENDIAN, &univ_num);
899
0
            offset += 1;
900
0
            proto_tree_add_item_ret_string_and_length(sdmx_tree, hf_citp_sdmx_universe_name, tvb, offset, -1, ENC_UTF_8, pinfo->pool, &name, &str_len);
901
0
            offset += str_len;
902
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "UNam, Universe %d: %s", univ_num, name);
903
0
            break;
904
0
        case CITP_SDMX_ENID: {
905
0
            str_len = tvb_strsize(tvb, offset);
906
0
            char* enid = (char*)tvb_get_string_enc(wmem_file_scope(), tvb, offset, str_len, ENC_UTF_8);
907
0
            proto_tree_add_item(sdmx_tree, hf_citp_sdmx_encryption_identifier, tvb, offset, str_len, ENC_UTF_8);
908
0
            offset += str_len;
909
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "EnId, %s", enid);
910
911
            /* add encryption info to conversation */
912
0
            set_conversation_encryption(pinfo, enid);
913
0
            break;
914
0
        }
915
0
        case CITP_SDMX_CHBK: {
916
0
            bool blind;
917
0
            proto_tree_add_item_ret_boolean(sdmx_tree, hf_citp_sdmx_blind, tvb, offset, 1, ENC_LITTLE_ENDIAN, &blind);
918
0
            offset += 1;
919
0
            proto_tree_add_item_ret_uint(sdmx_tree, hf_citp_sdmx_universe_index, tvb, offset, 1, ENC_LITTLE_ENDIAN, &univ_num);
920
0
            offset += 1;
921
0
            uint32_t start_chan;
922
0
            proto_tree_add_item_ret_uint(sdmx_tree, hf_citp_sdmx_first_channel, tvb, offset, 2, ENC_LITTLE_ENDIAN, &start_chan);
923
0
            offset += 2;
924
0
            proto_tree_add_item_ret_uint(sdmx_tree, hf_citp_sdmx_channel_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &count);
925
0
            offset += 2;
926
927
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "ChBk, %s, Universe %d, Channels %d-%d", tfs_get_string(blind, &tfs_live_blind), univ_num, start_chan+1, start_chan+count);
928
929
0
            char* enc_info = get_conversation_encryption(pinfo);
930
0
            if (enc_info != NULL) {
931
0
                proto_tree_add_item(sdmx_tree, hf_citp_sdmx_encrypted_channel_data, tvb, offset, count, ENC_NA);
932
0
                proto_item_set_generated(
933
0
                    proto_tree_add_string(sdmx_tree, hf_citp_sdmx_encryption_identifier, tvb, offset, 0, enc_info));
934
935
                /* call into encryption sub-dissector */
936
0
                col_set_fence(pinfo->cinfo, COL_INFO);
937
0
                dissector_try_string_with_data(encryption_id_table, enc_info, tvb_new_subset_length(tvb, offset, count), pinfo, tree, true, NULL);
938
0
                col_clear_fence(pinfo->cinfo, COL_INFO);
939
0
                offset += count;
940
0
            } else {
941
0
                tvbuff_t* dmx_tvb = tvb_new_subset_length(tvb, offset, count);
942
0
                proto_tree_add_item(sdmx_tree, hf_citp_sdmx_channel_levels, tvb, offset, count, ENC_NA);
943
0
                offset += count;
944
945
                /* Set info writable,
946
                 * otherwise dmx-chan will clear the column then not add anything, this keeps some useful info
947
                 */
948
0
                bool saved_write = col_get_writable(pinfo->cinfo, COL_INFO);
949
0
                col_set_writable(pinfo->cinfo, COL_INFO, false);
950
0
                call_dissector(dmx_chan_handle, dmx_tvb, pinfo, tree);
951
0
                col_set_writable(pinfo->cinfo, COL_INFO, saved_write);
952
0
            }
953
0
            break;
954
0
        }
955
0
        case CITP_SDMX_CHLS:
956
0
            proto_tree_add_item_ret_uint(sdmx_tree, hf_citp_sdmx_channel_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &count);
957
0
            offset += 2;
958
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "ChLs, %d channels", count);
959
960
0
            for (unsigned int i = 0; i < count; i++) {
961
0
                proto_item* chan = proto_tree_add_item(sdmx_tree, hf_citp_sdmx_channel_level_block, tvb, offset, 4, ENC_NA);
962
0
                proto_tree* chan_tree = proto_item_add_subtree(chan, hf_citp_sdmx_channel_level_block);
963
964
0
                proto_tree_add_item(chan_tree, hf_citp_sdmx_universe_index, tvb, offset, 1, ENC_LITTLE_ENDIAN);
965
0
                offset+=1;
966
0
                uint32_t chan_idx, chan_level;
967
0
                proto_tree_add_item_ret_uint(chan_tree, hf_citp_sdmx_channel, tvb, offset, 2, ENC_LITTLE_ENDIAN, &chan_idx);
968
0
                offset+=2;
969
0
                proto_tree_add_item_ret_uint(chan_tree, hf_citp_sdmx_channel_level, tvb, offset, 1, ENC_LITTLE_ENDIAN, &chan_level);
970
0
                offset+=1;
971
0
                proto_item_append_text(chan, ", %u @ %u", chan_idx, chan_level);
972
0
            }
973
0
            break;
974
0
        case CITP_SDMX_SXSR:
975
0
            proto_tree_add_item_ret_string_and_length(sdmx_tree, hf_citp_sdmx_connection_string, tvb, offset, -1, ENC_UTF_8, pinfo->pool, &name, &str_len);
976
0
            offset += str_len;
977
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "SXSr, %s", name);
978
0
            break;
979
0
        case CITP_SDMX_SXUS:
980
0
            proto_tree_add_item_ret_uint(sdmx_tree, hf_citp_sdmx_universe_index, tvb, offset, 1, ENC_LITTLE_ENDIAN, &univ_num);
981
0
            offset += 1;
982
0
            proto_tree_add_item_ret_string_and_length(sdmx_tree, hf_citp_sdmx_connection_string, tvb, offset, -1, ENC_UTF_8, pinfo->pool, &name, &str_len);
983
0
            offset += str_len;
984
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "SXUS, Universe %d, %s", univ_num, name);
985
0
            break;
986
0
        default:
987
0
            expert_add_info(pinfo, tree, &ei_citp_sdmx_content_type);
988
0
            break;
989
0
    }
990
991
0
    proto_item_set_len(ti, offset);
992
0
    return offset;
993
0
}
994
995
static int
996
dissect_fptc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
997
0
{
998
0
    unsigned str_len;
999
0
    unsigned offset = 0;
1000
0
    col_append_str(pinfo->cinfo, COL_PROTOCOL, "/FPTC");
1001
    /* Clear the info column */
1002
0
    col_clear(pinfo->cinfo, COL_INFO);
1003
1004
0
    proto_item *ti = proto_tree_add_item(tree, proto_citp_fptc, tvb, offset, -1, ENC_NA);
1005
0
    proto_tree *fptc_tree = proto_item_add_subtree(ti, ett_citp_fptc);
1006
1007
0
    uint32_t content_type;
1008
0
    proto_tree_add_item_ret_uint(fptc_tree, hf_citp_fptc_content_type, tvb, offset, 4, ENC_BIG_ENDIAN, &content_type);
1009
0
    offset += 4;
1010
0
    proto_tree_add_bitmask(fptc_tree, tvb, offset, hf_citp_fptc_content_hint, ett_citp_fptc_content_hint, citp_fptc_content_hint, ENC_LITTLE_ENDIAN);
1011
0
    offset += 4;
1012
1013
0
    switch (content_type) {
1014
0
        case CITP_FPTC_PTCH: {
1015
0
            uint32_t fixt_id, univ_num, chan_s, chan_cnt;
1016
0
            proto_tree_add_item_ret_uint(fptc_tree, hf_citp_fptc_fixture_identifier, tvb, offset, 2, ENC_LITTLE_ENDIAN, &fixt_id);
1017
0
            offset += 2;
1018
0
            proto_tree_add_item_ret_uint(fptc_tree, hf_citp_fptc_universe, tvb, offset, 1, ENC_LITTLE_ENDIAN, &univ_num);
1019
0
            offset += 1;
1020
0
            offset += 1; /* RESERVED */
1021
0
            proto_tree_add_item_ret_uint(fptc_tree, hf_citp_fptc_channel, tvb, offset, 2, ENC_LITTLE_ENDIAN, &chan_s);
1022
0
            offset += 2;
1023
0
            proto_tree_add_item_ret_uint(fptc_tree, hf_citp_fptc_channel_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &chan_cnt);
1024
0
            offset += 2;
1025
0
            proto_tree_add_item_ret_length(fptc_tree, hf_citp_fptc_fixture_make, tvb, offset, -1, ENC_UTF_8, &str_len);
1026
0
            offset += str_len;
1027
0
            proto_tree_add_item_ret_length(fptc_tree, hf_citp_fptc_fixture_name, tvb, offset, -1, ENC_UTF_8, &str_len);
1028
0
            offset += str_len;
1029
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "Ptch, ID %d, Universe %d, Channels %d-%d", fixt_id, univ_num, chan_s+1, chan_s+chan_cnt);
1030
0
            break;
1031
0
        }
1032
0
        case CITP_FPTC_SPTC:
1033
0
        case CITP_FPTC_UPTC: {
1034
0
            uint32_t count;
1035
0
            proto_tree_add_item_ret_uint(fptc_tree, hf_citp_fptc_fixture_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &count);
1036
0
            offset += 2;
1037
0
            offset = dissect_u16_list(tvb, fptc_tree, offset, count, hf_citp_fptc_fixture_identifiers, ett_citp_fptc_fixture_identifiers, hf_citp_fptc_fixture_identifier);
1038
0
            col_add_fstr(pinfo->cinfo, COL_INFO, content_type == CITP_FPTC_SPTC ? "SPtc, %s" : "UPtc, %s",
1039
0
                val_to_str(pinfo->pool, count, citp_all_fixtures_val_str, "%d fixtures"));
1040
0
            break;
1041
0
        }
1042
0
        default:
1043
0
            expert_add_info(pinfo, tree, &ei_citp_fptc_content_type);
1044
0
            break;
1045
0
    }
1046
1047
0
    return offset;
1048
0
}
1049
1050
static int
1051
dissect_fsel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1052
0
{
1053
0
    unsigned offset = 0;
1054
0
    col_append_str(pinfo->cinfo, COL_PROTOCOL, "/FSEL");
1055
    /* Clear the info column */
1056
0
    col_clear(pinfo->cinfo, COL_INFO);
1057
1058
0
    proto_item *ti = proto_tree_add_item(tree, proto_citp_fsel, tvb, offset, -1, ENC_NA);
1059
0
    proto_tree *fsel_tree = proto_item_add_subtree(ti, ett_citp_fsel);
1060
1061
0
    uint32_t content_type;
1062
0
    proto_tree_add_item_ret_uint(fsel_tree, hf_citp_fsel_content_type, tvb, offset, 4, ENC_BIG_ENDIAN, &content_type);
1063
0
    offset += 4;
1064
1065
0
    if (content_type != CITP_FSEL_SELE && content_type != CITP_FSEL_DESE) {
1066
0
        expert_add_info(pinfo, tree, &ei_citp_fsel_content_type);
1067
0
        return offset;
1068
0
    }
1069
1070
0
    if (content_type == CITP_FSEL_SELE) {
1071
0
        bool complete;
1072
0
        proto_tree_add_item_ret_boolean(fsel_tree, hf_citp_fsel_complete, tvb, offset, 1, ENC_LITTLE_ENDIAN, &complete);
1073
0
        offset += 1;
1074
0
        offset += 1; /* RESERVED */
1075
0
        col_add_str(pinfo->cinfo, COL_INFO, complete ? "Sele, complete" : "Sele, ");
1076
0
    } else {
1077
0
        col_set_str(pinfo->cinfo, COL_INFO, "DeSe, ");
1078
0
    }
1079
0
    uint32_t count;
1080
0
    proto_tree_add_item_ret_uint(fsel_tree, hf_citp_fsel_fixture_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &count);
1081
0
    offset += 2;
1082
1083
0
    offset = dissect_u16_list(tvb, fsel_tree, offset, count, hf_citp_fsel_fixture_identifiers, ett_citp_fsel_fixture_identifiers, hf_citp_fsel_fixture_identifier);
1084
0
    col_append_str(pinfo->cinfo, COL_INFO, val_to_str(pinfo->pool, count, citp_all_fixtures_val_str, "%d fixtures"));
1085
1086
0
    return offset;
1087
0
}
1088
1089
static int
1090
dissect_finf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1091
0
{
1092
0
    unsigned offset = 0;
1093
0
    col_append_str(pinfo->cinfo, COL_PROTOCOL, "/FINF");
1094
    /* Clear the info column */
1095
0
    col_clear(pinfo->cinfo, COL_INFO);
1096
1097
0
    proto_item *ti = proto_tree_add_item(tree, proto_citp_finf, tvb, offset, -1, ENC_NA);
1098
0
    proto_tree *finf_tree = proto_item_add_subtree(ti, ett_citp_finf);
1099
1100
0
    uint32_t content_type;
1101
0
    proto_tree_add_item_ret_uint(finf_tree, hf_citp_finf_content_type, tvb, offset, 4, ENC_BIG_ENDIAN, &content_type);
1102
0
    offset += 4;
1103
1104
0
    switch (content_type) {
1105
0
        case CITP_FINF_SFRA: {
1106
0
            uint32_t count;
1107
0
            proto_tree_add_item_ret_uint(finf_tree, hf_citp_finf_fixture_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &count);
1108
0
            offset += 2;
1109
0
            offset = dissect_u16_list(tvb, finf_tree, offset, count, hf_citp_finf_fixture_identifiers, ett_citp_finf_fixture_identifiers, hf_citp_finf_fixture_identifier);
1110
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "SFra, %s", val_to_str(pinfo->pool, count, citp_all_fixtures_val_str, "%d fixtures"));
1111
0
            break;
1112
0
        }
1113
0
        case CITP_FINF_FRAM: {
1114
0
            uint32_t fixt_id, filter_count, gobo_count;
1115
0
            proto_tree_add_item_ret_uint(finf_tree, hf_citp_finf_fixture_identifier, tvb, offset, 2, ENC_LITTLE_ENDIAN, &fixt_id);
1116
0
            offset += 2;
1117
0
            proto_tree_add_item_ret_uint(finf_tree, hf_citp_finf_frame_filter_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &filter_count);
1118
0
            offset += 1;
1119
0
            proto_tree_add_item_ret_uint(finf_tree, hf_citp_finf_frame_gobo_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &gobo_count);
1120
0
            offset += 1;
1121
0
            col_add_fstr(pinfo->cinfo, COL_INFO, "Fram, Fixture %d, %d filters, %d gobos", fixt_id, filter_count, gobo_count);
1122
1123
0
            unsigned str_len;
1124
0
            proto_tree_add_item_ret_length(finf_tree, hf_citp_finf_frame_names, tvb, offset, -1, ENC_UTF_8, &str_len);
1125
0
            uint8_t* start = tvb_get_string_enc(pinfo->pool, tvb, offset, str_len, ENC_UTF_8);
1126
            /* based on SrvLoc attribute list parser */
1127
0
            unsigned int filt_idx = 0;
1128
0
            uint32_t x = 0;
1129
0
            uint8_t c = start[x];
1130
0
            while (c) {
1131
0
                if  (c == '\n') {
1132
0
                    if (filt_idx<filter_count)
1133
0
                        proto_tree_add_item(finf_tree, hf_citp_finf_filter_name, tvb, offset, x, ENC_UTF_8);
1134
0
                    else
1135
0
                        proto_tree_add_item(finf_tree, hf_citp_finf_gobo_name, tvb, offset, x, ENC_UTF_8);
1136
0
                    offset += x+1;
1137
0
                    start += x+1;
1138
0
                    filt_idx++;
1139
                    /* reset string length */
1140
0
                    x = 0;
1141
0
                    c = start[x];
1142
0
                } else {
1143
                    /* increment and get next */
1144
0
                    x++;
1145
0
                    c = start[x];
1146
0
                }
1147
0
            }
1148
            /* add final filter name */
1149
0
            if (x > 0) {
1150
0
                if (filt_idx<filter_count)
1151
0
                    proto_tree_add_item(finf_tree, hf_citp_finf_filter_name, tvb, offset, x, ENC_UTF_8);
1152
0
                else
1153
0
                    proto_tree_add_item(finf_tree, hf_citp_finf_gobo_name, tvb, offset, x, ENC_UTF_8);
1154
0
                offset += x+1;
1155
0
            }
1156
0
            break;
1157
0
        }
1158
0
        default:
1159
0
            expert_add_info(pinfo, tree, &ei_citp_finf_content_type);
1160
0
            break;
1161
0
    }
1162
1163
0
    return offset;
1164
0
}
1165
1166
1167
static int
1168
0
dissect_caex_view_inner(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree) {
1169
0
    proto_tree_add_item(tree, hf_citp_caex_view_width, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1170
0
    offset+=2;
1171
0
    proto_tree_add_item(tree, hf_citp_caex_view_height, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1172
0
    offset+=2;
1173
1174
0
    proto_item *pos = proto_tree_add_item(tree, hf_citp_caex_view_position, tvb, offset, 12, ENC_NA);
1175
0
    proto_tree *pos_tree = proto_item_add_subtree(pos, ett_citp_caex_view_pos);
1176
0
    proto_tree_add_item(pos_tree, hf_citp_caex_view_position_x, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1177
0
    offset+=4;
1178
0
    proto_tree_add_item(pos_tree, hf_citp_caex_view_position_y, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1179
0
    offset+=4;
1180
0
    proto_tree_add_item(pos_tree, hf_citp_caex_view_position_z, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1181
0
    offset+=4;
1182
1183
0
    proto_item *focus = proto_tree_add_item(tree, hf_citp_caex_view_focus, tvb, offset, 12, ENC_NA);
1184
0
    proto_tree *focus_tree = proto_item_add_subtree(focus, ett_citp_caex_view_focus);
1185
0
    proto_tree_add_item(focus_tree, hf_citp_caex_view_focus_x, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1186
0
    offset+=4;
1187
0
    proto_tree_add_item(focus_tree, hf_citp_caex_view_focus_y, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1188
0
    offset+=4;
1189
0
    proto_tree_add_item(focus_tree, hf_citp_caex_view_focus_z, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1190
0
    offset+=4;
1191
0
    return offset;
1192
0
}
1193
1194
static int
1195
0
dissect_caex_cue_inner(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, uint32_t content_code) {
1196
0
    uint32_t option_count;
1197
0
    unsigned str_len, prev_offset;
1198
0
    proto_tree_add_item_ret_uint(tree, hf_citp_caex_cue_option_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &option_count);
1199
0
    offset+=1;
1200
0
    for (unsigned int i = 0; i < option_count; i++) {
1201
0
        prev_offset = offset;
1202
0
        proto_item *option = proto_tree_add_item(tree, hf_citp_caex_cue_option, tvb, offset, -1, ENC_NA);
1203
0
        proto_tree *option_tree = proto_item_add_subtree(option, ett_citp_caex_cue_option);
1204
1205
0
        const uint8_t* option_name;
1206
0
        proto_tree_add_item_ret_string_and_length(option_tree, hf_citp_caex_cue_option_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, pinfo->pool, &option_name, &str_len);
1207
0
        offset+=str_len;
1208
0
        if (content_code == CITP_CAEX_CUE_RECORD_CAPA) {
1209
0
            proto_tree_add_item_ret_length(option_tree, hf_citp_caex_cue_option_choices, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1210
0
            offset+=str_len;
1211
0
            proto_tree_add_item_ret_length(option_tree, hf_citp_caex_cue_option_help, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1212
0
            offset+=str_len;
1213
0
        } else if (content_code == CITP_CAEX_CUE_RECORD) {
1214
0
            proto_tree_add_item_ret_length(option_tree, hf_citp_caex_cue_option_value, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1215
0
            offset+=str_len;
1216
0
        }
1217
1218
0
        proto_item_append_text(option, ": %s", option_name);
1219
0
        proto_item_set_len(option, offset-prev_offset);
1220
0
    }
1221
0
    return offset;
1222
0
}
1223
1224
static int
1225
0
dissect_caex_fixture(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, uint32_t content_code) {
1226
0
    const uint8_t* str;
1227
0
    unsigned str_len;
1228
0
    uint32_t fixture_id;
1229
0
    if (content_code == CITP_CAEX_FIXTURE_LIST) {
1230
0
        proto_tree_add_item(tree, hf_citp_caex_show_fixture_list_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1231
0
        offset+=1;
1232
0
    }
1233
1234
0
    uint32_t fixture_count;
1235
0
    proto_tree_add_item_ret_uint(tree, hf_citp_caex_show_fixture_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &fixture_count);
1236
0
    offset+=2;
1237
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", %d fixtures", fixture_count);
1238
0
    if (fixture_count == 0)
1239
0
        return offset;
1240
1241
0
    proto_item *list_item = proto_tree_add_item(tree, hf_citp_caex_show_fixtures, tvb, offset, -1, ENC_NA);
1242
0
    proto_tree *list_tree = proto_item_add_subtree(list_item, ett_citp_caex_show_fixtures);
1243
1244
0
    if (content_code == CITP_CAEX_FIXTURE_REMOVE || content_code == CITP_CAEX_FIXTURE_SELECT) {
1245
0
        for (unsigned int i = 0; i < fixture_count; i++) {
1246
0
            proto_tree_add_item(list_tree, hf_citp_caex_show_fixture_console_identifier, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1247
0
            offset+=4;
1248
0
        }
1249
0
    }
1250
0
    else if (content_code == CITP_CAEX_FIXTURE_STATUS || content_code == CITP_CAEX_FIXTURE_ID) {
1251
0
        for (unsigned int i = 0; i < fixture_count; i++) {
1252
0
            proto_item *fixture = proto_tree_add_item(list_tree, hf_citp_caex_show_fixture, tvb, offset, -1, ENC_NA);
1253
0
            proto_tree *fixt_tree = proto_item_add_subtree(fixture, ett_citp_caex_show_fixture);
1254
1255
0
            if (content_code == CITP_CAEX_FIXTURE_ID) {
1256
0
                proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_identifier_capture_instance_id, tvb, offset, 16, ENC_LITTLE_ENDIAN);
1257
0
                offset+=16;
1258
0
                proto_item_set_len(fixture, 20);
1259
0
            }
1260
1261
0
            proto_tree_add_item_ret_uint(fixt_tree, hf_citp_caex_show_fixture_console_identifier, tvb, offset, 4, ENC_LITTLE_ENDIAN, &fixture_id);
1262
0
            offset+=4;
1263
0
            proto_item_append_text(fixture, ", ID: %u", fixture_id);
1264
1265
0
            if (content_code == CITP_CAEX_FIXTURE_STATUS) {
1266
0
                proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_locked, tvb, offset, 1, ENC_NA);
1267
0
                offset+=1;
1268
0
                proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_clearable, tvb, offset, 1, ENC_NA);
1269
0
                offset+=1;
1270
0
                proto_item_set_len(fixture, 6);
1271
0
            }
1272
0
        }
1273
0
    }
1274
0
    else if (content_code == CITP_CAEX_FIXTURE_LIST || content_code == CITP_CAEX_FIXTURE_MODIFY) {
1275
0
        for (unsigned int i = 0; i < fixture_count; i++) {
1276
0
            proto_item *fixture = proto_tree_add_item(list_tree, hf_citp_caex_show_fixture, tvb, offset, -1, ENC_NA);
1277
0
            proto_tree *fixt_tree = proto_item_add_subtree(fixture, ett_citp_caex_show_fixture);
1278
0
            int s_offset = offset;
1279
0
            proto_tree_add_item_ret_uint(fixt_tree, hf_citp_caex_show_fixture_console_identifier, tvb, offset, 4, ENC_LITTLE_ENDIAN, &fixture_id);
1280
0
            offset+=4;
1281
0
            proto_item_append_text(fixture, ", ID: %u", fixture_id);
1282
1283
0
            uint32_t changed_fields = 0xFF;
1284
0
            if (content_code == CITP_CAEX_FIXTURE_LIST) {
1285
0
                proto_tree_add_item_ret_string_and_length(fixt_tree, hf_citp_caex_show_fixture_manufacturer_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, pinfo->pool, &str, &str_len);
1286
0
                proto_item_append_text(fixture, ", %s", str);
1287
0
                offset+=str_len;
1288
0
                proto_tree_add_item_ret_string_and_length(fixt_tree, hf_citp_caex_show_fixture_model_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, pinfo->pool, &str, &str_len);
1289
0
                proto_item_append_text(fixture, ", %s", str);
1290
0
                offset+=str_len;
1291
0
                proto_tree_add_item_ret_length(fixt_tree, hf_citp_caex_show_fixture_mode_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1292
0
                offset+=str_len;
1293
0
                proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_channel_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1294
0
                offset+=2;
1295
0
                proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_is_dimmer, tvb, offset, 1, ENC_NA);
1296
0
                offset+=1;
1297
1298
0
                uint32_t identifier_count;
1299
0
                proto_tree_add_item_ret_uint(fixt_tree, hf_citp_caex_show_fixture_identifier_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &identifier_count);
1300
0
                offset+=1;
1301
0
                for (unsigned int j = 0; j < identifier_count; j++) {
1302
0
                    proto_item *ident = proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_identifier, tvb, offset, -1, ENC_NA);
1303
0
                    proto_tree *ident_tree = proto_item_add_subtree(ident, ett_citp_caex_show_fixture_identifier);
1304
1305
0
                    uint32_t ident_type, ident_data_size;
1306
0
                    proto_tree_add_item_ret_uint(ident_tree, hf_citp_caex_show_fixture_identifier_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &ident_type);
1307
0
                    offset+=1;
1308
0
                    proto_tree_add_item_ret_uint(ident_tree, hf_citp_caex_show_fixture_identifier_data_size, tvb, offset, 2, ENC_LITTLE_ENDIAN, &ident_data_size);
1309
0
                    proto_item_set_len(ident, 3+ident_data_size);
1310
0
                    offset+=2;
1311
0
                    proto_tree_add_item(ident_tree, hf_citp_caex_show_fixture_identifier_data, tvb, offset, ident_data_size, ENC_NA);
1312
1313
0
                    switch (ident_type) {
1314
0
                        case CITP_CAEX_IDENTIFIER_RDM_MANF:
1315
0
                            proto_tree_add_item(ident_tree, hf_citp_caex_show_fixture_identifier_rdm_manufacturer_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1316
0
                            break;
1317
0
                        case CITP_CAEX_IDENTIFIER_RDM_MODEL:
1318
0
                            proto_tree_add_item(ident_tree, hf_citp_caex_show_fixture_identifier_rdm_device_model_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1319
0
                            break;
1320
0
                        case CITP_CAEX_IDENTIFIER_RDM_PERSON:
1321
0
                            proto_tree_add_item(ident_tree, hf_citp_caex_show_fixture_identifier_rdm_personality_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
1322
0
                            break;
1323
0
                        case CITP_CAEX_IDENTIFIER_ALTA_FIXT:
1324
0
                            proto_tree_add_item(ident_tree, hf_citp_caex_show_fixture_identifier_altabase_fixture_id, tvb, offset, 16, ENC_LITTLE_ENDIAN);
1325
0
                            break;
1326
0
                        case CITP_CAEX_IDENTIFIER_ALTA_MODEL:
1327
0
                            proto_tree_add_item(ident_tree, hf_citp_caex_show_fixture_identifier_altabase_mode_id, tvb, offset, 16, ENC_LITTLE_ENDIAN);
1328
0
                            break;
1329
0
                        case CITP_CAEX_IDENTIFIER_CAPTURE_INSTANCE:
1330
0
                            proto_tree_add_item(ident_tree, hf_citp_caex_show_fixture_identifier_capture_instance_id, tvb, offset, 16, ENC_LITTLE_ENDIAN);
1331
0
                            break;
1332
0
                        default:
1333
0
                            expert_add_info(pinfo, tree, &ei_citp_caex_fixture_ident);
1334
0
                            break;
1335
0
                    }
1336
1337
0
                    offset+=ident_data_size;
1338
0
                }
1339
0
            }
1340
0
            else if (content_code == CITP_CAEX_FIXTURE_MODIFY) {
1341
0
                changed_fields = tvb_get_uint8(tvb, offset);
1342
0
                proto_tree_add_bitmask(fixt_tree, tvb, offset, hf_citp_caex_show_fixture_changed_fields, ett_citp_caex_show_fixture_changed_fields, citp_caex_show_fixture_changed_fields, ENC_LITTLE_ENDIAN);
1343
0
                offset+=1;
1344
0
            }
1345
1346
0
            if (changed_fields & 0x01) {
1347
0
                proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_patched, tvb, offset, 1, ENC_NA);
1348
0
                offset+=1;
1349
0
                uint32_t univ, chan;
1350
0
                proto_tree_add_item_ret_uint(fixt_tree, hf_citp_caex_show_fixture_universe, tvb, offset, 1, ENC_LITTLE_ENDIAN, &univ);
1351
0
                offset+=1;
1352
0
                proto_tree_add_item_ret_uint(fixt_tree, hf_citp_caex_show_fixture_universe_channel, tvb, offset, 2, ENC_LITTLE_ENDIAN, &chan);
1353
0
                offset+=2;
1354
0
                proto_item_append_text(fixture, ", Universe: %u, Channel: %u", univ, chan);
1355
0
            }
1356
0
            if (changed_fields & 0x02) {
1357
0
                proto_tree_add_item_ret_length(fixt_tree, hf_citp_caex_show_fixture_unit, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1358
0
                offset+=str_len;
1359
0
            }
1360
0
            if (changed_fields & 0x04) {
1361
0
                proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_channel, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1362
0
                offset+=2;
1363
0
            }
1364
0
            if (changed_fields & 0x08) {
1365
0
                proto_tree_add_item_ret_length(fixt_tree, hf_citp_caex_show_fixture_circuit, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1366
0
                offset+=str_len;
1367
0
            }
1368
0
            if (changed_fields & 0x10) {
1369
0
                proto_tree_add_item_ret_length(fixt_tree, hf_citp_caex_show_fixture_note, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1370
0
                offset+=str_len;
1371
0
            }
1372
0
            if (changed_fields & 0x20) {
1373
0
                proto_item *pos = proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_position, tvb, offset, 12, ENC_NA);
1374
0
                proto_tree *pos_tree = proto_item_add_subtree(pos, ett_citp_caex_show_fixture_pos);
1375
0
                proto_tree_add_item(pos_tree, hf_citp_caex_show_fixture_position_x, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1376
0
                offset+=4;
1377
0
                proto_tree_add_item(pos_tree, hf_citp_caex_show_fixture_position_y, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1378
0
                offset+=4;
1379
0
                proto_tree_add_item(pos_tree, hf_citp_caex_show_fixture_position_z, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1380
0
                offset+=4;
1381
1382
0
                proto_item *focus = proto_tree_add_item(fixt_tree, hf_citp_caex_show_fixture_angles, tvb, offset, 12, ENC_NA);
1383
0
                proto_tree *focus_tree = proto_item_add_subtree(focus, ett_citp_caex_show_fixture_angles);
1384
0
                proto_tree_add_item(focus_tree, hf_citp_caex_show_fixture_angles_x, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1385
0
                offset+=4;
1386
0
                proto_tree_add_item(focus_tree, hf_citp_caex_show_fixture_angles_y, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1387
0
                offset+=4;
1388
0
                proto_tree_add_item(focus_tree, hf_citp_caex_show_fixture_angles_z, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1389
0
                offset+=4;
1390
0
            }
1391
1392
0
            proto_item_set_len(fixture, offset - s_offset);
1393
0
        }
1394
0
    }
1395
1396
1397
0
    return offset;
1398
0
}
1399
1400
static int
1401
0
dissect_caex_laser_frame(tvbuff_t *tvb, int offset, packet_info *pinfo  _U_, proto_tree *tree) {
1402
0
    proto_tree_add_item(tree, hf_citp_caex_laser_source_key, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1403
0
    offset+=4;
1404
0
    proto_tree_add_item(tree, hf_citp_caex_laser_feed_index, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1405
0
    offset+=1;
1406
0
    proto_tree_add_item(tree, hf_citp_caex_laser_frame_sequence_number, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1407
0
    offset+=4;
1408
1409
0
    uint32_t point_count;
1410
0
    proto_tree_add_item_ret_uint(tree, hf_citp_caex_laser_point_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &point_count);
1411
0
    offset+=2;
1412
0
    for (unsigned int i = 0; i < point_count; i++) {
1413
0
        proto_item *point = proto_tree_add_item(tree, hf_citp_caex_laser_point, tvb, offset, 5, ENC_NA);
1414
0
        proto_tree *point_tree = proto_item_add_subtree(point, ett_citp_caex_laser_point);
1415
1416
0
        uint32_t x, y, xy;
1417
0
        proto_tree_add_item_ret_uint(point_tree, hf_citp_caex_laser_point_x_low, tvb, offset, 1, ENC_LITTLE_ENDIAN, &x);
1418
0
        offset+=1;
1419
0
        proto_tree_add_item_ret_uint(point_tree, hf_citp_caex_laser_point_y_low, tvb, offset, 1, ENC_LITTLE_ENDIAN, &y);
1420
0
        offset+=1;
1421
0
        proto_tree_add_item_ret_uint(point_tree, hf_citp_caex_laser_point_xy_high, tvb, offset, 1, ENC_LITTLE_ENDIAN, &xy);
1422
0
        offset+=1;
1423
1424
0
        proto_item_set_generated(
1425
0
            proto_tree_add_uint(point_tree, hf_citp_caex_laser_point_x, tvb, offset, 0, x + ((xy&0x0F)<<8)));
1426
0
        proto_item_set_generated(
1427
0
            proto_tree_add_uint(point_tree, hf_citp_caex_laser_point_y, tvb, offset, 0, y + ((xy&0xF0)<<4)));
1428
1429
0
        proto_tree_add_bitmask(point_tree, tvb, offset, hf_citp_caex_laser_point_colour, ett_citp_caex_laser_point_colour, citp_caex_laser_point_colour_fields, ENC_LITTLE_ENDIAN);
1430
0
        offset+=2;
1431
0
    }
1432
1433
0
    return offset;
1434
0
}
1435
1436
static int
1437
dissect_caex(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1438
0
{
1439
0
    unsigned offset = 0;
1440
0
    const uint8_t *str;
1441
0
    unsigned str_len;
1442
0
    col_append_str(pinfo->cinfo, COL_PROTOCOL, "/CAEX");
1443
    /* Clear the info column */
1444
0
    col_clear(pinfo->cinfo, COL_INFO);
1445
1446
0
    proto_item *ti = proto_tree_add_item(tree, proto_citp_caex, tvb, offset, -1, ENC_NA);
1447
0
    proto_tree *caex_tree = proto_item_add_subtree(ti, ett_citp_caex);
1448
1449
0
    uint32_t content_code;
1450
0
    proto_tree_add_item_ret_uint(caex_tree, hf_citp_caex_content_code, tvb, offset, 4, ENC_LITTLE_ENDIAN, &content_code);
1451
0
    offset += 4;
1452
1453
0
    col_set_str(pinfo->cinfo, COL_INFO, val_to_str_const(content_code, citp_caex_content_code_names, "Unknown Message Type"));
1454
1455
0
    switch (content_code) {
1456
0
        case CITP_CAEX_NACK:
1457
0
            proto_tree_add_item(caex_tree, hf_citp_caex_nack_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1458
0
            offset+=1;
1459
0
            break;
1460
1461
0
        case CITP_CAEX_LIVE_VIEW_GET_STATUS: break;
1462
0
        case CITP_CAEX_LIVE_VIEW_STATUS:
1463
0
            proto_tree_add_item(caex_tree, hf_citp_caex_view_availability, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1464
0
            offset+=1;
1465
0
            offset = dissect_caex_view_inner(tvb, offset, pinfo, caex_tree);
1466
0
            break;
1467
0
        case CITP_CAEX_LIVE_VIEW_GET_IMAGE: {
1468
0
            uint32_t format;
1469
0
            proto_tree_add_item_ret_uint(caex_tree, hf_citp_caex_view_format, tvb, offset, 1, ENC_LITTLE_ENDIAN, &format);
1470
0
            if (format != 1)
1471
0
                expert_add_info(pinfo, tree, &ei_citp_caex_view_format);
1472
0
            offset+=1;
1473
0
            offset = dissect_caex_view_inner(tvb, offset, pinfo, caex_tree);
1474
0
            break;
1475
0
        }
1476
0
        case CITP_CAEX_LIVE_VIEW_IMAGE: {
1477
0
            uint32_t format, data_size;
1478
0
            proto_tree_add_item_ret_uint(caex_tree, hf_citp_caex_view_format, tvb, offset, 1, ENC_LITTLE_ENDIAN, &format);
1479
0
            offset+=1;
1480
0
            proto_tree_add_item_ret_uint(caex_tree, hf_citp_caex_view_data_size, tvb, offset, 4, ENC_LITTLE_ENDIAN, &data_size);
1481
0
            offset+=4;
1482
0
            if (format == 1) {
1483
                /* call out to JPEG dissector */
1484
0
                tvbuff_t* jpeg_tvb = tvb_new_subset_length(tvb, offset, data_size);
1485
0
                call_dissector(jpeg_handle, jpeg_tvb, pinfo, tree);
1486
0
            } else {
1487
                /* No other formats currently defined */
1488
0
                expert_add_info(pinfo, tree, &ei_citp_caex_view_format);
1489
0
                proto_tree_add_item(tree, hf_citp_caex_view_data, tvb, offset, data_size, ENC_NA);
1490
0
                offset+=data_size;
1491
0
            }
1492
0
            break;
1493
0
        }
1494
1495
0
        case CITP_CAEX_CUE_RECORD_CAPA:
1496
0
            proto_tree_add_item(caex_tree, hf_citp_caex_cue_availability, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1497
0
            offset+=1;
1498
0
            offset = dissect_caex_cue_inner(tvb, offset, pinfo, caex_tree, content_code);
1499
0
            break;
1500
0
        case CITP_CAEX_CUE_RECORD:
1501
0
            offset = dissect_caex_cue_inner(tvb, offset, pinfo, caex_tree, content_code);
1502
0
            break;
1503
0
        case CITP_CAEX_CUE_CLEAR_CAPA:
1504
0
            proto_tree_add_item(caex_tree, hf_citp_caex_cue_clear_availability, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1505
0
            offset+=1;
1506
0
            break;
1507
0
        case CITP_CAEX_CUE_CLEAR: break;
1508
1509
0
        case CITP_CAEX_SHOW_ENTER:
1510
0
            proto_tree_add_item_ret_string_and_length(caex_tree, hf_citp_caex_show_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, pinfo->pool, &str, &str_len);
1511
0
            offset+=str_len;
1512
0
            col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", str);
1513
0
            break;
1514
0
        case CITP_CAEX_SHOW_LEAVE: break;
1515
0
        case CITP_CAEX_SET_TRANS_SPACE:
1516
0
            proto_tree_add_item(caex_tree, hf_citp_caex_show_transformation_space, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1517
0
            offset+=1;
1518
0
            break;
1519
0
        case CITP_CAEX_FIXTURE_LIST_REQ: break;
1520
0
        case CITP_CAEX_FIXTURE_LIST:
1521
0
        case CITP_CAEX_FIXTURE_ID:
1522
0
        case CITP_CAEX_FIXTURE_MODIFY:
1523
0
        case CITP_CAEX_FIXTURE_REMOVE:
1524
0
        case CITP_CAEX_FIXTURE_SELECT:
1525
0
        case CITP_CAEX_FIXTURE_STATUS:
1526
0
            offset = dissect_caex_fixture(tvb, offset, pinfo, caex_tree, content_code);
1527
0
            break;
1528
1529
0
        case CITP_CAEX_LASER_GET_LIST: break;
1530
0
        case CITP_CAEX_LASER_LIST: {
1531
0
            proto_tree_add_item(caex_tree, hf_citp_caex_laser_source_key, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1532
0
            offset+=4;
1533
0
            uint32_t feed_count;
1534
0
            proto_tree_add_item_ret_uint(caex_tree, hf_citp_caex_laser_feed_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &feed_count);
1535
0
            offset+=1;
1536
0
            for (unsigned int i = 0; i < feed_count; i++) {
1537
0
                proto_tree_add_item_ret_length(caex_tree, hf_citp_caex_laser_feed_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1538
0
                offset+=str_len;
1539
0
            }
1540
0
            break;
1541
0
        }
1542
0
        case CITP_CAEX_LASER_CONTROL:
1543
0
            proto_tree_add_item(caex_tree, hf_citp_caex_laser_feed_index, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1544
0
            offset+=1;
1545
0
            proto_tree_add_item(caex_tree, hf_citp_caex_laser_frame_rate, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1546
0
            offset+=1;
1547
0
            break;
1548
0
        case CITP_CAEX_LASER_FRAME:
1549
0
            offset = dissect_caex_laser_frame(tvb, offset, pinfo, caex_tree);
1550
0
            break;
1551
0
        default:
1552
0
            expert_add_info(pinfo, tree, &ei_citp_caex_content_code);
1553
0
            break;
1554
0
    }
1555
1556
0
    return offset;
1557
0
}
1558
1559
1560
1561
static uint32_t
1562
0
dissect_msex_count(tvbuff_t *tvb, proto_tree *tree, int *offset, uint16_t version, int hf) {
1563
0
    uint32_t ret;
1564
0
    if (version >= CITP_MSEX_V12) {
1565
0
        proto_tree_add_item_ret_uint(tree, hf, tvb, *offset, 2, ENC_LITTLE_ENDIAN, &ret);
1566
0
        *offset += 2;
1567
0
    } else {
1568
0
        proto_tree_add_item_ret_uint(tree, hf, tvb, *offset, 1, ENC_LITTLE_ENDIAN, &ret);
1569
0
        *offset += 1;
1570
0
    }
1571
0
    return ret;
1572
0
}
1573
1574
static int
1575
0
dissect_msex_library_num_or_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, bool do_id, const char **str_out) {
1576
0
    if (do_id) {
1577
0
        proto_item* id = proto_tree_add_item(tree, hf_citp_msex_library_id, tvb, offset, 4, ENC_NA);
1578
0
        proto_tree* id_tree = proto_item_add_subtree(id, ett_citp_msex_library_id);
1579
1580
0
        uint32_t l, l1, l2, l3;
1581
0
        proto_tree_add_item_ret_uint(id_tree, hf_citp_msex_library_id_level, tvb, offset, 1, ENC_LITTLE_ENDIAN, &l);
1582
0
        offset+=1;
1583
0
        proto_tree_add_item_ret_uint(id_tree, hf_citp_msex_library_id_level_1, tvb, offset, 1, ENC_LITTLE_ENDIAN, &l1);
1584
0
        offset+=1;
1585
0
        proto_tree_add_item_ret_uint(id_tree, hf_citp_msex_library_id_level_2, tvb, offset, 1, ENC_LITTLE_ENDIAN, &l2);
1586
0
        offset+=1;
1587
0
        proto_tree_add_item_ret_uint(id_tree, hf_citp_msex_library_id_level_3, tvb, offset, 1, ENC_LITTLE_ENDIAN, &l3);
1588
0
        offset+=1;
1589
1590
0
        if (l == 0) {
1591
0
            proto_item_append_text(id, ": Root");
1592
0
        } else if (l == 1) {
1593
0
            proto_item_append_text(id, ": %u", l1);
1594
0
        } else if (l == 2) {
1595
0
            proto_item_append_text(id, ": %u.%u", l1, l2);
1596
0
        } else {
1597
0
            proto_item_append_text(id, ": %u.%u.%u", l1, l2, l3);
1598
0
        }
1599
0
        if (str_out != NULL) {
1600
0
            wmem_strbuf_t *strbuf = wmem_strbuf_new(pinfo->pool, "");
1601
0
            if (l == 0) {
1602
0
                wmem_strbuf_append_printf(strbuf, "root");
1603
0
            } else if (l == 1) {
1604
0
                wmem_strbuf_append_printf(strbuf, "%u", l1);
1605
0
            } else if (l == 2) {
1606
0
                wmem_strbuf_append_printf(strbuf, "%u.%u", l1, l2);
1607
0
            } else {
1608
0
                wmem_strbuf_append_printf(strbuf, "%u.%u.%u", l1, l2, l3);
1609
0
            }
1610
0
            *str_out = wmem_strbuf_get_str(strbuf);
1611
0
        }
1612
0
    } else {
1613
0
        uint32_t library_number;
1614
0
        proto_tree_add_item_ret_uint(tree, hf_citp_msex_library_number, tvb, offset, 1, ENC_LITTLE_ENDIAN, &library_number);
1615
0
        offset+=1;
1616
0
        if (str_out != NULL) {
1617
0
            wmem_strbuf_t *strbuf = wmem_strbuf_new(pinfo->pool, "");
1618
0
            wmem_strbuf_append_printf(strbuf, "%d", library_number);
1619
0
            *str_out = wmem_strbuf_get_str(strbuf);
1620
0
        }
1621
0
    }
1622
0
    return offset;
1623
0
}
1624
1625
static int
1626
0
dissect_msex_supported_versions(tvbuff_t *tvb, proto_tree *tree, int offset) {
1627
0
    uint32_t count;
1628
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_supported_version_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &count);
1629
0
    offset+=1;
1630
0
    if (count > 0) {
1631
0
        proto_item *supv = proto_tree_add_item(tree, hf_citp_msex_supported_versions, tvb, offset, count*2, ENC_NA);
1632
0
        proto_tree *supv_tree = proto_item_add_subtree(supv, ett_citp_msex_supported_versions);
1633
1634
0
        for (unsigned int i = 0; i < count; i++) {
1635
0
            proto_item *ver = proto_tree_add_item(supv_tree, hf_citp_msex_supported_version, tvb, offset, 2, ENC_NA);
1636
0
            proto_tree *ver_tree = proto_item_add_subtree(ver, ett_citp_msex_supported_version);
1637
1638
0
            uint32_t major, minor;
1639
0
            proto_tree_add_item_ret_uint(ver_tree, hf_citp_msex_version_major, tvb, offset, 1, ENC_LITTLE_ENDIAN, &major);
1640
0
            offset+=1;
1641
0
            proto_tree_add_item_ret_uint(ver_tree, hf_citp_msex_version_minor, tvb, offset, 1, ENC_LITTLE_ENDIAN, &minor);
1642
0
            offset+=1;
1643
1644
0
            proto_item_append_text(ver, ": v%u.%u", major, minor);
1645
0
            proto_item_append_text(supv, i == 0 ? ": v%u.%u" : ", v%u.%u", major, minor);
1646
0
        }
1647
0
    }
1648
0
    return offset;
1649
0
}
1650
1651
static int
1652
0
dissect_msex_affected_array(tvbuff_t *tvb, proto_tree *tree, int offset, int hf_all, int ett_all, int hf_single) {
1653
0
    proto_item* ti = proto_tree_add_item(tree, hf_all, tvb, offset, 32, ENC_NA);
1654
0
    proto_tree* aff = proto_item_add_subtree(ti, ett_all);
1655
0
    bool first = true;
1656
1657
0
    for (int i = 0; i < 32; i++) {
1658
0
        uint8_t dat = tvb_get_uint8(tvb, offset);
1659
0
        for (int j = 0; j < 8; j++) {
1660
0
            if ((1<<j) & dat) {
1661
0
                proto_item_set_generated(proto_tree_add_uint(aff, hf_single, tvb, offset, 1, i*8 + j));
1662
1663
0
                proto_item_append_text(ti, first ? ": %u" : ", %u", i*8 + j);
1664
0
                first = false;
1665
0
            }
1666
0
        }
1667
0
        offset+=1;
1668
0
    }
1669
0
    return offset;
1670
0
}
1671
1672
1673
/**SInf
1674
 * - Server Information
1675
 */
1676
static int
1677
0
dissect_msex_sinf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint16_t version) {
1678
0
    unsigned str_len;
1679
0
    uint32_t count;
1680
1681
0
    if (version >= CITP_MSEX_V12) {
1682
0
        proto_tree_add_item_ret_length(tree, hf_citp_msex_uuid, tvb, offset, -1, ENC_UTF_8, &str_len);
1683
0
        offset+=str_len;
1684
0
    }
1685
0
    proto_tree_add_item_ret_length(tree, hf_citp_msex_product_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1686
0
    offset+=str_len;
1687
0
    proto_tree_add_item(tree, hf_citp_msex_product_version_major, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1688
0
    offset+=1;
1689
0
    proto_tree_add_item(tree, hf_citp_msex_product_version_minor, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1690
0
    offset+=1;
1691
1692
0
    if (version >= CITP_MSEX_V12) {
1693
0
        proto_tree_add_item(tree, hf_citp_msex_product_version_bugfix, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1694
0
        offset+=1;
1695
0
        offset = dissect_msex_supported_versions(tvb, tree, offset);
1696
0
        proto_tree_add_bitmask(tree, tvb, offset, hf_citp_msex_supported_library_types, ett_citp_msex_supported_library_types, citp_msex_supported_library_types, ENC_LITTLE_ENDIAN);
1697
0
        offset+=2;
1698
1699
0
        proto_tree_add_item_ret_uint(tree, hf_citp_msex_thumbnail_format_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &count);
1700
0
        offset+=1;
1701
0
        proto_item *thumb = proto_tree_add_item(tree, hf_citp_msex_thumbnail_formats, tvb, offset, count*4, ENC_NA);
1702
0
        proto_tree *thumb_tree = proto_item_add_subtree(thumb, ett_citp_msex_thumbnail_formats);
1703
0
        for (unsigned int i = 0; i < count; i++) {
1704
0
            proto_tree_add_item(thumb_tree, hf_citp_msex_thumbnail_format, tvb, offset, 4, ENC_ASCII);
1705
0
            offset+=4;
1706
0
        }
1707
1708
0
        proto_tree_add_item_ret_uint(tree, hf_citp_msex_stream_format_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &count);
1709
0
        offset+=1;
1710
0
        proto_item *stream = proto_tree_add_item(tree, hf_citp_msex_stream_formats, tvb, offset, count*4, ENC_NA);
1711
0
        proto_tree *stream_tree = proto_item_add_subtree(stream, ett_citp_msex_stream_formats);
1712
0
        for (unsigned int i = 0; i < count; i++) {
1713
0
            proto_tree_add_item(stream_tree, hf_citp_msex_stream_format, tvb, offset, 4, ENC_ASCII);
1714
0
            offset+=4;
1715
0
        }
1716
0
    }
1717
1718
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_layer_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &count);
1719
0
    offset+=1;
1720
0
    proto_item* layer = proto_tree_add_item(tree, hf_citp_msex_layers, tvb, offset, -1, ENC_NA);
1721
0
    proto_tree* layer_tree = proto_item_add_subtree(layer, ett_citp_msex_layers);
1722
0
    int s_offset = offset;
1723
0
    for (unsigned int i = 0; i < count; i++) {
1724
0
        proto_tree_add_item_ret_length(layer_tree, hf_citp_msex_layer_dmx_source, tvb, offset, -1, ENC_UTF_8, &str_len);
1725
0
        offset+=str_len;
1726
0
    }
1727
0
    proto_item_set_len(layer, offset-s_offset);
1728
1729
0
    return offset;
1730
0
}
1731
1732
/**LSta
1733
 * - Layer Status
1734
 */
1735
static int
1736
0
dissect_msex_lsta(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, uint16_t version) {
1737
0
    unsigned str_len;
1738
0
    uint32_t count;
1739
1740
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_layer_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &count);
1741
0
    offset+=1;
1742
1743
0
    proto_item *layers = proto_tree_add_item(tree, hf_citp_msex_layers, tvb, offset, -1, ENC_NA);
1744
0
    proto_tree *layers_tree = proto_item_add_subtree(layers, ett_citp_msex_layers);
1745
0
    int list_offset = offset;
1746
0
    for (unsigned int i = 0; i < count; i++) {
1747
0
        proto_item* layer = proto_tree_add_item(layers_tree, hf_citp_msex_layer, tvb, offset, -1, ENC_NA);
1748
0
        proto_tree* layer_tree = proto_item_add_subtree(layer, ett_citp_msex_layer);
1749
0
        int layer_offset = offset;
1750
1751
0
        proto_tree_add_item(layer_tree, hf_citp_msex_layer_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1752
0
        offset+=1;
1753
0
        proto_tree_add_item(layer_tree, hf_citp_msex_layer_physical_output, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1754
0
        offset+=1;
1755
0
        if (version >= CITP_MSEX_V12) {
1756
0
            proto_tree_add_item(layer_tree, hf_citp_msex_library_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1757
0
            offset+=1;
1758
0
        }
1759
0
        offset = dissect_msex_library_num_or_id(tvb, pinfo, layer_tree, offset, version >= CITP_MSEX_V12, NULL);
1760
0
        proto_tree_add_item(layer_tree, hf_citp_msex_element_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1761
0
        offset+=1;
1762
0
        proto_tree_add_item_ret_length(layer_tree, hf_citp_msex_element_name, tvb, offset, -1, ENC_LITTLE_ENDIAN, &str_len);
1763
0
        offset+=str_len;
1764
0
        proto_tree_add_item(layer_tree, hf_citp_msex_element_position, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1765
0
        offset+=4;
1766
0
        proto_tree_add_item(layer_tree, hf_citp_msex_element_length, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1767
0
        offset+=4;
1768
0
        proto_tree_add_item(layer_tree, hf_citp_msex_element_fps, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1769
0
        offset+=1;
1770
0
        proto_tree_add_bitmask(layer_tree, tvb, offset, hf_citp_msex_layer_status_flags, ett_citp_msex_layer_status_flags, citp_msex_layer_status_flags, ENC_LITTLE_ENDIAN);
1771
0
        offset+=4;
1772
1773
0
        proto_item_set_len(layer, offset-layer_offset);
1774
0
    }
1775
0
    proto_item_set_len(layers, offset-list_offset);
1776
1777
0
    return offset;
1778
0
}
1779
1780
/**GELI, ELIn
1781
 * - Get Element Library Information
1782
 * - Element Library Information
1783
 */
1784
static int
1785
0
dissect_msex_library(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, uint16_t version, uint32_t content_type) {
1786
0
    uint32_t library_type;
1787
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_library_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &library_type);
1788
0
    offset+=1;
1789
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", Type: %s", val_to_str_const(library_type, citp_msex_library_types, "Unknown"));
1790
1791
0
    if (version >= CITP_MSEX_V11 && content_type == CITP_MSEX_GELI) {
1792
0
        const char* parent_s;
1793
0
        offset = dissect_msex_library_num_or_id(tvb, pinfo, tree, offset, true, &parent_s);
1794
0
        col_append_fstr(pinfo->cinfo, COL_INFO, ", Parent: %s", parent_s);
1795
0
    }
1796
1797
0
    uint32_t library_count = dissect_msex_count(tvb, tree, &offset, version, hf_citp_msex_library_count);
1798
0
    if (library_count == 0) {
1799
0
        if (content_type == CITP_MSEX_GELI) {
1800
0
            col_append_str(pinfo->cinfo, COL_INFO, ", All libraries");
1801
0
        }
1802
0
        return offset;
1803
0
    }
1804
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", %d libraries", library_count);
1805
1806
0
    proto_item *libs = proto_tree_add_item(tree, hf_citp_msex_libraries, tvb, offset, -1, ENC_NA);
1807
0
    proto_tree *libs_tree = proto_item_add_subtree(libs, ett_citp_msex_libraries);
1808
1809
0
    if (content_type == CITP_MSEX_GELI) {
1810
0
        proto_item_set_len(libs, library_count);
1811
0
        for (unsigned int i = 0; i < library_count; i++) {
1812
0
            proto_tree_add_item(libs_tree, hf_citp_msex_library_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1813
0
            offset+=1;
1814
0
        }
1815
0
        return offset;
1816
0
    }
1817
1818
0
    int s_offset = offset;
1819
0
    for (unsigned int i = 0; i < library_count; i++) {
1820
0
        proto_item *lib = proto_tree_add_item(libs_tree, hf_citp_msex_library, tvb, offset, -1, ENC_NA);
1821
0
        proto_tree *lib_tree = proto_item_add_subtree(lib, ett_citp_msex_library);
1822
0
        int l_offset = offset;
1823
1824
0
        const char* lib_num;
1825
0
        const uint8_t* lib_name;
1826
0
        unsigned lib_name_len;
1827
0
        uint32_t elem_count;
1828
0
        offset = dissect_msex_library_num_or_id(tvb, pinfo, lib_tree, offset, version >= CITP_MSEX_V11, &lib_num);
1829
0
        if (version >= CITP_MSEX_V12) {
1830
0
            proto_tree_add_item(lib_tree, hf_citp_msex_library_serial_number, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1831
0
            offset+=4;
1832
0
        }
1833
0
        proto_tree_add_item(lib_tree, hf_citp_msex_library_dmx_min, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1834
0
        offset+=1;
1835
0
        proto_tree_add_item(lib_tree, hf_citp_msex_library_dmx_max, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1836
0
        offset+=1;
1837
0
        proto_tree_add_item_ret_string_and_length(lib_tree, hf_citp_msex_library_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, pinfo->pool, &lib_name, &lib_name_len);
1838
0
        offset+=lib_name_len;
1839
        /* These fields can be either 8 or 16 bits */
1840
0
        if (version >= CITP_MSEX_V11) {
1841
0
            dissect_msex_count(tvb, lib_tree, &offset, version, hf_citp_msex_library_sub_count);
1842
0
        }
1843
0
        elem_count = dissect_msex_count(tvb, lib_tree, &offset, version, hf_citp_msex_library_element_count);
1844
1845
0
        proto_item_set_len(lib, offset-l_offset);
1846
0
        if (lib_name_len > 2) { /* UCS_2, so 2 bytes for null terminator */
1847
0
            proto_item_append_text(lib, ", %s: %s, %d elements", lib_num, lib_name, elem_count);
1848
0
        } else {
1849
0
            proto_item_append_text(lib, ", %s, %d elements", lib_num, elem_count);
1850
0
        }
1851
0
    }
1852
0
    proto_item_set_len(libs, offset-s_offset);
1853
1854
0
    return offset;
1855
0
}
1856
1857
/** GEIn, MEIn, EEIn, GLIn
1858
 * - Get Element Information
1859
 * - Media Element Information
1860
 * - Effect Element Information
1861
 * - Generic Element Information
1862
 */
1863
static int
1864
0
dissect_msex_element(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, uint16_t version, uint32_t content_type) {
1865
0
    unsigned str_len;
1866
1867
0
    uint32_t library_type;
1868
0
    if (content_type == CITP_MSEX_GEIN || (content_type == CITP_MSEX_GLEI && version >= CITP_MSEX_V12)) {
1869
0
        proto_tree_add_item_ret_uint(tree, hf_citp_msex_library_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &library_type);
1870
0
        offset+=1;
1871
0
    } else if (content_type == CITP_MSEX_MEIN) {
1872
0
        library_type = 1;
1873
0
    } else { /* EEIn */
1874
0
        library_type = 2;
1875
0
    }
1876
0
    const char* lib_str;
1877
0
    offset = dissect_msex_library_num_or_id(tvb, pinfo, tree, offset, version >= CITP_MSEX_V11, &lib_str);
1878
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", Library: %s (%s)", lib_str,
1879
0
        val_to_str_const(library_type, citp_msex_library_types, "Unknown"));
1880
1881
0
    uint32_t element_count = dissect_msex_count(tvb, tree, &offset, version, hf_citp_msex_element_count);
1882
0
    if (element_count == 0) {
1883
0
        if (content_type == CITP_MSEX_GEIN) {
1884
0
            col_append_str(pinfo->cinfo, COL_INFO, ", All elements");
1885
0
        }
1886
0
        return offset;
1887
0
    }
1888
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", %d elements", element_count);
1889
1890
0
    proto_item *elems = proto_tree_add_item(tree, hf_citp_msex_elements, tvb, offset, -1, ENC_NA);
1891
0
    proto_tree *elems_tree = proto_item_add_subtree(elems, ett_citp_msex_elements);
1892
1893
0
    if (content_type == CITP_MSEX_GEIN) {
1894
0
        proto_item_set_len(elems, element_count);
1895
0
        for (unsigned int i = 0; i < element_count; i++) {
1896
0
            proto_tree_add_item(tree, hf_citp_msex_element_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1897
0
            offset+=1;
1898
0
        }
1899
0
        return offset;
1900
0
    }
1901
1902
0
    int s_offset = offset;
1903
0
    for (unsigned int i = 0; i < element_count; i++) {
1904
0
        proto_item *elem = proto_tree_add_item(elems_tree, hf_citp_msex_element, tvb, offset, -1, ENC_NA);
1905
0
        proto_tree *elem_tree = proto_item_add_subtree(elem, ett_citp_msex_element);
1906
0
        int e_offset = offset;
1907
1908
0
        uint32_t elem_num;
1909
0
        proto_tree_add_item_ret_uint(elem_tree, hf_citp_msex_element_number, tvb, offset, 1, ENC_LITTLE_ENDIAN, &elem_num);
1910
0
        offset+=1;
1911
0
        if (version >= CITP_MSEX_V12) {
1912
0
            proto_tree_add_item(elem_tree, hf_citp_msex_element_serial_number, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1913
0
            offset+=4;
1914
0
        }
1915
0
        proto_tree_add_item(elem_tree, hf_citp_msex_element_dmx_min, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1916
0
        offset+=1;
1917
0
        proto_tree_add_item(elem_tree, hf_citp_msex_element_dmx_max, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1918
0
        offset+=1;
1919
0
        const uint8_t* elem_name;
1920
0
        proto_tree_add_item_ret_string_and_length(elem_tree, hf_citp_msex_element_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, pinfo->pool, &elem_name, &str_len);
1921
0
        offset+=str_len;
1922
1923
0
        proto_item_append_text(elem, ", %u: %s", elem_num, elem_name);
1924
1925
0
        if (content_type == CITP_MSEX_MEIN || content_type == CITP_MSEX_GLEI) {
1926
0
            proto_tree_add_item(elem_tree, hf_citp_msex_element_version_timestamp, tvb, offset, 8, ENC_LITTLE_ENDIAN);
1927
0
            offset+=8;
1928
0
        }
1929
1930
0
        if (content_type == CITP_MSEX_MEIN) {
1931
0
            proto_tree_add_item(elem_tree, hf_citp_msex_element_width, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1932
0
            offset+=2;
1933
0
            proto_tree_add_item(elem_tree, hf_citp_msex_element_height, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1934
0
            offset+=2;
1935
0
            proto_tree_add_item(elem_tree, hf_citp_msex_element_length, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1936
0
            offset+=4;
1937
0
            proto_tree_add_item(elem_tree, hf_citp_msex_element_fps, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1938
0
            offset+=1;
1939
0
        } else if (content_type == CITP_MSEX_EEIN) {
1940
0
            uint32_t param_count;
1941
0
            proto_tree_add_item_ret_uint(elem_tree, hf_citp_msex_element_parameter_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &param_count);
1942
0
            offset+=1;
1943
0
            if (param_count > 0) {
1944
0
                proto_item *params = proto_tree_add_item(elems_tree, hf_citp_msex_element_parameter_names, tvb, offset, -1, ENC_NA);
1945
0
                proto_tree *params_tree = proto_item_add_subtree(elem, ett_citp_msex_element_parameter_names);
1946
0
                int p_offset = offset;
1947
1948
0
                for (unsigned int j = 0; j < param_count; j++) {
1949
0
                    proto_tree_add_item_ret_length(params_tree, hf_citp_msex_element_parameter_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, &str_len);
1950
0
                    offset+=str_len;
1951
0
                }
1952
0
                proto_item_set_len(params, offset-p_offset);
1953
0
            }
1954
0
        }
1955
1956
0
        proto_item_set_len(elem, offset-e_offset);
1957
0
    }
1958
0
    proto_item_set_len(elems, offset-s_offset);
1959
1960
0
    return offset;
1961
0
}
1962
1963
/** GELT, GETh
1964
 * - Get Element Library Thumbnail
1965
 * - Get Element Thumbnail
1966
*/
1967
static int
1968
0
dissect_msex_thumbnail_get(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, uint16_t version, uint32_t content_type) {
1969
0
    const uint8_t* thumb_format_str;
1970
0
    uint32_t thumbnail_format = tvb_get_uint32(tvb, offset, ENC_BIG_ENDIAN);
1971
0
    proto_tree_add_item_ret_string(tree, hf_citp_msex_thumbnail_format, tvb, offset, 4, ENC_ASCII, pinfo->pool, &thumb_format_str);
1972
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", Format: %s", thumb_format_str);
1973
0
    offset+=4;
1974
0
    if (thumbnail_format != CITP_MSEX_FORMAT_RGB8 && thumbnail_format != CITP_MSEX_FORMAT_JPEG && thumbnail_format != CITP_MSEX_FORMAT_PNG) {
1975
0
        expert_add_info(pinfo, tree, &ei_citp_msex_thumb_format);
1976
0
    }
1977
1978
0
    proto_tree_add_item(tree, hf_citp_msex_thumbnail_width, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1979
0
    offset+=2;
1980
0
    proto_tree_add_item(tree, hf_citp_msex_thumbnail_height, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1981
0
    offset+=2;
1982
0
    proto_tree_add_bitmask(tree, tvb, offset, hf_citp_msex_thumbnail_flags, ett_citp_msex_thumbnail_flags, citp_msex_thumbnail_flags, ENC_LITTLE_ENDIAN);
1983
0
    offset+=1;
1984
0
    uint32_t library_type;
1985
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_library_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &library_type);
1986
0
    offset+=1;
1987
1988
0
    uint32_t count;
1989
0
    if (content_type == CITP_MSEX_GELT) { /* Library thumbnails */
1990
0
        count = dissect_msex_count(tvb, tree, &offset, version, hf_citp_msex_library_count);
1991
0
        if (count == 0) {
1992
0
            col_append_str(pinfo->cinfo, COL_INFO, ", All libraries");
1993
0
            return offset;
1994
0
        }
1995
0
        col_append_fstr(pinfo->cinfo, COL_INFO, ", %d libraries", count);
1996
1997
0
        proto_item *libs = proto_tree_add_item(tree, hf_citp_msex_libraries, tvb, offset, -1, ENC_NA);
1998
0
        proto_tree *libs_tree = proto_item_add_subtree(libs, ett_citp_msex_libraries);
1999
2000
0
        if (version >= CITP_MSEX_V11) {
2001
0
            proto_item_set_len(libs, count);
2002
0
        } else {
2003
0
            proto_item_set_len(libs, count*4);
2004
0
        }
2005
0
        for (unsigned int i = 0; i < count; i++) {
2006
0
            offset = dissect_msex_library_num_or_id(tvb, pinfo, libs_tree, offset, version >= CITP_MSEX_V11, NULL);
2007
0
        }
2008
0
    } else { /* Element thumbnails CITP_MSEX_GETH */
2009
0
        const char *lib_str;
2010
0
        offset = dissect_msex_library_num_or_id(tvb, pinfo, tree, offset, version >= CITP_MSEX_V11, &lib_str);
2011
0
        col_append_fstr(pinfo->cinfo, COL_INFO, ", Library: %s (%s)", lib_str,
2012
0
            val_to_str_const(library_type, citp_msex_library_types, "Unknown"));
2013
2014
0
        count = dissect_msex_count(tvb, tree, &offset, version, hf_citp_msex_element_count);
2015
0
        if (count == 0) {
2016
0
            col_append_str(pinfo->cinfo, COL_INFO, ", All elements");
2017
0
            return offset;
2018
0
        }
2019
0
        col_append_fstr(pinfo->cinfo, COL_INFO, ", %d elements", count);
2020
2021
0
        proto_item *elems = proto_tree_add_item(tree, hf_citp_msex_elements, tvb, offset, -1, ENC_NA);
2022
0
        proto_tree *elems_tree = proto_item_add_subtree(elems, ett_citp_msex_elements);
2023
0
        for (unsigned int i = 0; i < count; i++) {
2024
0
            proto_tree_add_item(elems_tree, hf_citp_msex_element_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2025
0
            offset+=1;
2026
0
        }
2027
0
    }
2028
0
    return offset;
2029
0
}
2030
2031
/** ELTh, EThn
2032
 * - Element Library Thumbnail
2033
 * - Element Thumbnail
2034
*/
2035
static int
2036
0
dissect_msex_thumbnail(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, uint16_t version, uint32_t content_type, proto_tree* root_tree) {
2037
0
    uint32_t library_type;
2038
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_library_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &library_type);
2039
0
    offset+=1;
2040
2041
0
    const char* library_num;
2042
0
    offset = dissect_msex_library_num_or_id(tvb, pinfo, tree, offset, version >= CITP_MSEX_V11, &library_num);
2043
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", Library: %s (%s)", library_num,
2044
0
        val_to_str_const(library_type, citp_msex_library_types, "Unknown"));
2045
2046
0
    if (content_type == CITP_MSEX_ETHN) {
2047
0
        uint32_t element_number;
2048
0
        proto_tree_add_item_ret_uint(tree, hf_citp_msex_element_number, tvb, offset, 1, ENC_LITTLE_ENDIAN, &element_number);
2049
0
        offset+=1;
2050
0
        col_append_fstr(pinfo->cinfo, COL_INFO, ", Element: %d", element_number);
2051
0
    }
2052
2053
0
    const uint8_t* thumb_format_str;
2054
0
    uint32_t thumbnail_format = tvb_get_uint32(tvb, offset, ENC_BIG_ENDIAN);
2055
0
    proto_tree_add_item_ret_string(tree, hf_citp_msex_thumbnail_format, tvb, offset, 4, ENC_ASCII, pinfo->pool, &thumb_format_str);
2056
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", Format: %s", thumb_format_str);
2057
0
    offset+=4;
2058
0
    if (thumbnail_format != CITP_MSEX_FORMAT_RGB8 && thumbnail_format != CITP_MSEX_FORMAT_JPEG && thumbnail_format != CITP_MSEX_FORMAT_PNG) {
2059
0
        expert_add_info(pinfo, tree, &ei_citp_msex_thumb_format);
2060
0
    }
2061
2062
0
    proto_tree_add_item(tree, hf_citp_msex_thumbnail_width, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2063
0
    offset+=2;
2064
0
    proto_tree_add_item(tree, hf_citp_msex_thumbnail_height, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2065
0
    offset+=2;
2066
2067
0
    uint32_t buff_size;
2068
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_thumbnail_buffer_size, tvb, offset, 2, ENC_LITTLE_ENDIAN, &buff_size);
2069
0
    offset+=2;
2070
0
    proto_tree_add_item(tree, hf_citp_msex_thumbnail_buffer, tvb, offset, buff_size, ENC_NA);
2071
0
    tvbuff_t* thumbnail_tvb = tvb_new_subset_length(tvb, offset, buff_size);
2072
0
    offset+=buff_size;
2073
2074
0
    if (thumbnail_format == CITP_MSEX_FORMAT_RGB8) {
2075
        /* nothing to do, don't bother dissecting this */
2076
0
    } else if (thumbnail_format == CITP_MSEX_FORMAT_JPEG) {
2077
0
        call_dissector(jpeg_handle, thumbnail_tvb, pinfo, root_tree);
2078
0
    } else if (thumbnail_format == CITP_MSEX_FORMAT_PNG) {
2079
0
        call_dissector(png_handle, thumbnail_tvb, pinfo, root_tree);
2080
0
    }
2081
2082
0
    return offset;
2083
0
}
2084
2085
/**VSrc
2086
 * - Video Sources
2087
 */
2088
static int
2089
0
dissect_msex_vsrc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, uint16_t version _U_) {
2090
0
    uint32_t count;
2091
0
    const uint8_t* str;
2092
0
    unsigned str_len;
2093
2094
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_source_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &count);
2095
0
    offset+=2;
2096
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", %d sources", count);
2097
2098
0
    proto_item *sources = proto_tree_add_item(tree, hf_citp_msex_sources, tvb, offset, -1, ENC_NA);
2099
0
    proto_tree *sources_tree = proto_item_add_subtree(sources, ett_citp_msex_sources);
2100
0
    int list_offset = offset;
2101
0
    for (unsigned int i = 0; i < count; i++) {
2102
0
        proto_item *source = proto_tree_add_item(sources_tree, hf_citp_msex_source, tvb, offset, -1, ENC_NA);
2103
0
        proto_tree *source_tree = proto_item_add_subtree(source, ett_citp_msex_source);
2104
0
        int src_offset = offset;
2105
2106
0
        uint32_t src_id;
2107
0
        proto_tree_add_item_ret_uint(source_tree, hf_citp_msex_source_id, tvb, offset, 2, ENC_LITTLE_ENDIAN, &src_id);
2108
0
        offset+=2;
2109
0
        proto_tree_add_item_ret_string_and_length(source_tree, hf_citp_msex_source_name, tvb, offset, -1, ENC_UCS_2|ENC_LITTLE_ENDIAN, pinfo->pool, &str, &str_len);
2110
0
        offset+=str_len;
2111
0
        proto_tree_add_item(source_tree, hf_citp_msex_source_physical_output, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2112
0
        offset+=1;
2113
0
        proto_tree_add_item(source_tree, hf_citp_msex_source_layer_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2114
0
        offset+=1;
2115
0
        proto_tree_add_bitmask(source_tree, tvb, offset, hf_citp_msex_source_flags, ett_citp_msex_source_flags, citp_msex_source_flags, ENC_LITTLE_ENDIAN);
2116
0
        offset+=2;
2117
0
        proto_tree_add_item(source_tree, hf_citp_msex_source_width, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2118
0
        offset+=2;
2119
0
        proto_tree_add_item(source_tree, hf_citp_msex_source_height, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2120
0
        offset+=2;
2121
2122
0
        proto_item_set_len(source, offset-src_offset);
2123
0
        proto_item_append_text(source, ", %u: %s", src_id, str);
2124
0
    }
2125
0
    proto_item_set_len(sources, offset-list_offset);
2126
2127
0
    return offset;
2128
0
}
2129
2130
/**StFr
2131
 * - Stream Frame
2132
 */
2133
static int
2134
0
dissect_msex_stfr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, uint16_t version, proto_tree* root_tree) {
2135
0
    if (version >= CITP_MSEX_V12) {
2136
0
        proto_tree_add_item(tree, hf_citp_msex_source_server_uuid, tvb, offset, 36, ENC_UTF_8);
2137
0
        offset+=36;
2138
0
    }
2139
0
    uint32_t source_id;
2140
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_source_id, tvb, offset, 2, ENC_LITTLE_ENDIAN, &source_id);
2141
0
    offset+=2;
2142
2143
0
    const uint8_t* frame_format_str;
2144
0
    uint32_t frame_format = tvb_get_uint32(tvb, offset, ENC_BIG_ENDIAN);
2145
0
    proto_tree_add_item_ret_string(tree, hf_citp_msex_stream_format, tvb, offset, 4, ENC_ASCII, pinfo->pool, &frame_format_str);
2146
0
    offset+=4;
2147
0
    if (frame_format != CITP_MSEX_FORMAT_RGB8 && frame_format != CITP_MSEX_FORMAT_JPEG &&
2148
0
        frame_format != CITP_MSEX_FORMAT_PNG &&
2149
0
        frame_format != CITP_MSEX_FORMAT_FJPG && frame_format != CITP_MSEX_FORMAT_FPNG) {
2150
0
        expert_add_info(pinfo, tree, &ei_citp_msex_stream_format);
2151
0
    }
2152
2153
0
    col_append_fstr(pinfo->cinfo, COL_INFO, ", Source: %d, Format: %s", source_id, frame_format_str);
2154
2155
0
    proto_tree_add_item(tree, hf_citp_msex_stream_width, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2156
0
    offset+=2;
2157
0
    proto_tree_add_item(tree, hf_citp_msex_stream_height, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2158
0
    offset+=2;
2159
0
    uint32_t buff_size;
2160
0
    proto_tree_add_item_ret_uint(tree, hf_citp_msex_frame_buffer_size, tvb, offset, 2, ENC_LITTLE_ENDIAN, &buff_size);
2161
0
    offset+=2;
2162
0
    tvbuff_t* frame_tvb = tvb_new_subset_length(tvb, offset, buff_size);
2163
0
    proto_tree_add_item(tree, hf_citp_msex_frame_buffer, tvb, offset, buff_size, ENC_NA);
2164
0
    offset+=buff_size;
2165
2166
0
    if (frame_format == CITP_MSEX_FORMAT_RGB8) {
2167
        /* nothing to do, don't bother dissecting this */
2168
0
    } else if (frame_format == CITP_MSEX_FORMAT_JPEG) {
2169
0
        call_dissector(jpeg_handle, frame_tvb, pinfo, root_tree);
2170
0
    } else if (frame_format == CITP_MSEX_FORMAT_PNG) {
2171
0
        call_dissector(png_handle, frame_tvb, pinfo, root_tree);
2172
0
    } else if (frame_format == CITP_MSEX_FORMAT_FJPG || frame_format == CITP_MSEX_FORMAT_FPNG) {
2173
0
        int frame_offset = 0;
2174
0
        proto_item* frag = proto_tree_add_item(tree, hf_citp_msex_frame_fragment, frame_tvb, frame_offset, 12, ENC_NA);
2175
0
        proto_tree* frag_tree = proto_item_add_subtree(frag, ett_citp_msex_frame_fragment);
2176
2177
0
        proto_tree_add_item(frag_tree, hf_citp_msex_frame_index, tvb, frame_offset, 4, ENC_LITTLE_ENDIAN);
2178
0
        frame_offset+=4;
2179
0
        proto_tree_add_item(frag_tree, hf_citp_msex_frame_fragment_count, tvb, frame_offset, 2, ENC_LITTLE_ENDIAN);
2180
0
        frame_offset+=2;
2181
0
        proto_tree_add_item(frag_tree, hf_citp_msex_frame_fragment_index, tvb, frame_offset, 2, ENC_LITTLE_ENDIAN);
2182
0
        frame_offset+=2;
2183
0
        proto_tree_add_item(frag_tree, hf_citp_msex_frame_fragment_byte_offset, tvb, frame_offset, 4, ENC_LITTLE_ENDIAN);
2184
0
        frame_offset+=4;
2185
2186
0
        tvbuff_t* frag_tvb = tvb_new_subset_remaining(tvb, frame_offset);
2187
0
        if (frame_format == CITP_MSEX_FORMAT_FJPG) {
2188
0
            call_dissector(jpeg_handle, frag_tvb, pinfo, root_tree);
2189
0
        } else if (frame_format == CITP_MSEX_FORMAT_FPNG) {
2190
0
            call_dissector(png_handle, frag_tvb, pinfo, root_tree);
2191
0
        }
2192
0
    }
2193
2194
0
    return offset;
2195
0
}
2196
2197
static int
2198
dissect_msex(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
2199
0
{
2200
0
    unsigned offset = 0;
2201
0
    col_append_str(pinfo->cinfo, COL_PROTOCOL, "/MSEX");
2202
    /* Clear the info column */
2203
0
    col_clear(pinfo->cinfo, COL_INFO);
2204
2205
0
    proto_item *ti = proto_tree_add_item(tree, proto_citp_msex, tvb, offset, -1, ENC_NA);
2206
0
    proto_tree *msex_tree = proto_item_add_subtree(ti, ett_citp_msex);
2207
2208
0
    uint16_t version = tvb_get_uint16(tvb, offset, ENC_BIG_ENDIAN);
2209
0
    proto_tree_add_item(msex_tree, hf_citp_msex_version_major, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2210
0
    offset+=1;
2211
0
    proto_tree_add_item(msex_tree, hf_citp_msex_version_minor, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2212
0
    offset+=1;
2213
0
    if (version < CITP_MSEX_V10 || version > CITP_MSEX_V12) {
2214
0
        expert_add_info(pinfo, msex_tree, &ei_citp_msex_version);
2215
0
    }
2216
2217
0
    uint32_t content_type;
2218
0
    proto_tree_add_item_ret_uint(msex_tree, hf_citp_msex_content_type, tvb, offset, 4, ENC_BIG_ENDIAN, &content_type);
2219
0
    offset += 4;
2220
2221
0
    col_set_str(pinfo->cinfo, COL_INFO, val_to_str_const(content_type, citp_msex_content_type_short_names, "Unknown Message Type"));
2222
2223
0
    switch (content_type) {
2224
0
        case CITP_MSEX_CINF:
2225
0
            offset = dissect_msex_supported_versions(tvb, msex_tree, offset);
2226
0
            break;
2227
0
        case CITP_MSEX_SINF:
2228
0
            offset = dissect_msex_sinf(tvb, pinfo, msex_tree, offset, version);
2229
0
            break;
2230
0
        case CITP_MSEX_NACK:
2231
0
            proto_tree_add_item(msex_tree, hf_citp_msex_received_content_type, tvb, offset, 4, ENC_BIG_ENDIAN);
2232
0
            offset += 4;
2233
0
            break;
2234
0
        case CITP_MSEX_LSTA:
2235
0
            offset = dissect_msex_lsta(tvb, pinfo, msex_tree, offset, version);
2236
0
            break;
2237
0
        case CITP_MSEX_GELI:
2238
0
        case CITP_MSEX_ELIN:
2239
0
            offset = dissect_msex_library(tvb, pinfo, msex_tree, offset, version, content_type);
2240
0
            break;
2241
0
        case CITP_MSEX_ELUP:
2242
0
            proto_tree_add_item(msex_tree, hf_citp_msex_library_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2243
0
            offset+=1;
2244
0
            offset = dissect_msex_library_num_or_id(tvb, pinfo, msex_tree, offset, version >= CITP_MSEX_V11, NULL);
2245
0
            proto_tree_add_bitmask(msex_tree, tvb, offset, hf_citp_msex_library_update_flags, ett_citp_msex_library_update_flags, citp_msex_library_update_flags, ENC_LITTLE_ENDIAN);
2246
0
            offset+=1;
2247
0
            if (version >= CITP_MSEX_V12) {
2248
0
                offset = dissect_msex_affected_array(tvb, msex_tree, offset, hf_citp_msex_library_affected_elements, ett_citp_msex_library_affected_elements, hf_citp_msex_library_affected_element);
2249
0
                offset = dissect_msex_affected_array(tvb, msex_tree, offset, hf_citp_msex_library_affected_subs, ett_citp_msex_library_affected_subs, hf_citp_msex_library_affected_sub);
2250
0
            }
2251
0
            break;
2252
0
        case CITP_MSEX_GEIN:
2253
0
        case CITP_MSEX_MEIN:
2254
0
        case CITP_MSEX_EEIN:
2255
0
        case CITP_MSEX_GLEI:
2256
0
            offset = dissect_msex_element(tvb, pinfo, msex_tree, offset, version, content_type);
2257
0
            break;
2258
0
        case CITP_MSEX_GELT:
2259
0
        case CITP_MSEX_GETH:
2260
0
            offset = dissect_msex_thumbnail_get(tvb, pinfo, msex_tree, offset, version, content_type);
2261
0
            break;
2262
0
        case CITP_MSEX_ELTH:
2263
0
        case CITP_MSEX_ETHN:
2264
0
            offset = dissect_msex_thumbnail(tvb, pinfo, msex_tree, offset, version, content_type, tree);
2265
0
            break;
2266
0
        case CITP_MSEX_GVSR: break;
2267
0
        case CITP_MSEX_VSRC:
2268
0
            offset = dissect_msex_vsrc(tvb, pinfo, msex_tree, offset, version);
2269
0
            break;
2270
0
        case CITP_MSEX_RQST: {
2271
0
            uint32_t source_id;
2272
0
            proto_tree_add_item_ret_uint(msex_tree, hf_citp_msex_source_id, tvb, offset, 2, ENC_LITTLE_ENDIAN, &source_id);
2273
0
            offset+=2;
2274
2275
0
            const uint8_t* format;
2276
0
            uint32_t frame_format = tvb_get_uint32(tvb, offset, ENC_BIG_ENDIAN);
2277
0
            proto_tree_add_item_ret_string(msex_tree, hf_citp_msex_stream_format, tvb, offset, 4, ENC_ASCII, pinfo->pool, &format);
2278
0
            offset+=4;
2279
0
            if (frame_format != CITP_MSEX_FORMAT_RGB8 && frame_format != CITP_MSEX_FORMAT_JPEG &&
2280
0
                frame_format != CITP_MSEX_FORMAT_PNG &&
2281
0
                frame_format != CITP_MSEX_FORMAT_FJPG && frame_format != CITP_MSEX_FORMAT_FPNG) {
2282
0
                expert_add_info(pinfo, tree, &ei_citp_msex_stream_format);
2283
0
            }
2284
2285
0
            proto_tree_add_item(msex_tree, hf_citp_msex_stream_width, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2286
0
            offset+=2;
2287
0
            proto_tree_add_item(msex_tree, hf_citp_msex_stream_height, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2288
0
            offset+=2;
2289
0
            proto_tree_add_item(msex_tree, hf_citp_msex_stream_fps, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2290
0
            offset+=1;
2291
0
            proto_tree_add_item(msex_tree, hf_citp_msex_stream_timeout, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2292
0
            offset+=1;
2293
0
            col_append_fstr(pinfo->cinfo, COL_INFO, ", Source: %d, Format: %s", source_id, format);
2294
0
            break;
2295
0
        }
2296
0
        case CITP_MSEX_STFR:
2297
0
            offset = dissect_msex_stfr(tvb, pinfo, msex_tree, offset, version, tree);
2298
0
            break;
2299
0
        default:
2300
0
            expert_add_info(pinfo, tree, &ei_citp_msex_content_type);
2301
0
            break;
2302
0
    }
2303
2304
0
    return offset;
2305
0
}
2306
2307
2308
2309
static int
2310
dissect_citp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
2311
32
{
2312
32
    if (tvb_reported_length(tvb) < CITP_COOKIE_LEN) {
2313
1
        return 0;
2314
1
    }
2315
2316
31
    if (tvb_memeql(tvb, 0, CITP_COOKIE, CITP_COOKIE_LEN) != 0) {
2317
2
        return 0;
2318
2
    }
2319
2320
29
    unsigned offset = 0;
2321
29
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "CITP");
2322
    /* Clear the info column */
2323
29
    col_clear(pinfo->cinfo, COL_INFO);
2324
2325
29
    proto_item *ti = proto_tree_add_item(tree, proto_citp, tvb, offset, -1, ENC_NA);
2326
29
    proto_tree *citp_tree = proto_item_add_subtree(ti, ett_citp);
2327
2328
29
    proto_tree_add_item(citp_tree, hf_citp_cookie, tvb, offset, 4, ENC_ASCII);
2329
29
    offset += 4;
2330
2331
29
    proto_tree_add_item(citp_tree, hf_citp_version_major, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2332
29
    offset += 1;
2333
29
    proto_tree_add_item(citp_tree, hf_citp_version_minor, tvb, offset, 1, ENC_LITTLE_ENDIAN);
2334
29
    offset += 1;
2335
2336
29
    proto_tree_add_item(citp_tree, hf_citp_message_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2337
29
    offset += 2;
2338
2339
29
    uint32_t message_size;
2340
29
    proto_tree_add_item_ret_uint(citp_tree, hf_citp_message_size, tvb, offset, 4, ENC_LITTLE_ENDIAN, &message_size);
2341
29
    proto_item_set_len(ti, message_size);
2342
29
    offset += 4;
2343
2344
29
    proto_tree_add_item(citp_tree, hf_citp_message_part_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2345
29
    offset += 2;
2346
29
    proto_tree_add_item(citp_tree, hf_citp_message_part_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
2347
29
    offset += 2;
2348
2349
29
    uint32_t content_type;
2350
29
    proto_tree_add_item_ret_uint(citp_tree, hf_citp_content_type, tvb, offset, 4, ENC_BIG_ENDIAN, &content_type);
2351
29
    offset += 4;
2352
2353
    /* Message doesn't include any data, no dissection */
2354
29
    if (message_size <= 20) {
2355
0
        return offset;
2356
0
    }
2357
2358
29
    unsigned int consumed = dissector_try_uint_with_data(content_type_table, content_type, tvb_new_subset_length(tvb, offset, message_size-20), pinfo, tree, true, NULL);
2359
29
    if (consumed != 0) {
2360
0
        if (consumed + 20 != message_size) {
2361
0
            expert_add_info(pinfo, citp_tree, &ei_citp_message_size);
2362
0
        }
2363
29
    } else {
2364
        /* We also do a manual check here in case the protocols have been disabled */
2365
29
        if (content_type != CITP_PINF && content_type != CITP_SDMX &&
2366
29
            content_type != CITP_FPTC && content_type != CITP_FSEL &&
2367
29
            content_type != CITP_FINF && content_type != CITP_CAEX &&
2368
29
            content_type != CITP_MSEX) {
2369
29
            expert_add_info(pinfo, citp_tree, &ei_citp_content_type);
2370
29
        }
2371
29
    }
2372
29
    return offset;
2373
29
}
2374
2375
2376
static bool
2377
test_citp(tvbuff_t *tvb)
2378
3.69k
{
2379
    /* Check we have enough bytes */
2380
3.69k
    if (tvb_captured_length(tvb) < 20)
2381
955
        return false;
2382
2383
    /* Make sure we have the COOKIE */
2384
2.74k
    if (tvb_memeql(tvb, 0, CITP_COOKIE, CITP_COOKIE_LEN) == -1)
2385
2.71k
        return false;
2386
2387
27
    return true;
2388
2.74k
}
2389
2390
static unsigned
2391
get_citp_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_)
2392
48
{
2393
    /* Return 1 here so we keep making progress in the event of a malformed packet */
2394
48
    if (tvb_memeql(tvb, offset, CITP_COOKIE, CITP_COOKIE_LEN) == -1) {
2395
19
        return 1;
2396
19
    }
2397
2398
29
    return (unsigned)tvb_get_uint32(tvb, offset+8, ENC_LITTLE_ENDIAN);
2399
48
}
2400
2401
static int
2402
dissect_citp_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
2403
44
{
2404
44
    tcp_dissect_pdus(tvb, pinfo, tree, true, 11, get_citp_len, dissect_citp, data);
2405
44
    return tvb_reported_length(tvb);
2406
44
}
2407
2408
static bool
2409
dissect_citp_heur_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
2410
3.69k
{
2411
3.69k
    if (!test_citp(tvb))
2412
3.67k
        return false;
2413
2414
    /* specify that dissect_citp is to be called directly from now on for
2415
     * packets for this "connection" ... but only do this if your heuristic sits directly
2416
     * on top of (was called by) a dissector which established a conversation for the
2417
     * protocol "port type". In other words: only directly over TCP, UDP, DCCP, ...
2418
     * otherwise you'll be overriding the dissector that called your heuristic dissector.
2419
     */
2420
27
    conversation_t* conversation = find_or_create_conversation(pinfo);
2421
27
    conversation_set_dissector(conversation, citp_tcp_handle);
2422
2423
    /* and do the dissection */
2424
27
    dissect_citp_tcp(tvb, pinfo, tree, data);
2425
2426
27
    return true;
2427
3.69k
}
2428
2429
2430
/******************************************************************************/
2431
/* Register protocol                                                          */
2432
void
2433
15
proto_register_citp(void) {
2434
15
    static hf_register_info hf[] = {
2435
15
        { &hf_citp_cookie,
2436
15
            { "Cookie", "citp.cookie",
2437
15
            FT_STRING, BASE_NONE,
2438
15
            NULL, 0x0,
2439
15
            NULL, HFILL }
2440
15
        },
2441
15
        { &hf_citp_version_major,
2442
15
            { "Major Version", "citp.version_major",
2443
15
            FT_UINT8, BASE_DEC,
2444
15
            NULL, 0x0,
2445
15
            NULL, HFILL }
2446
15
        },
2447
15
        { &hf_citp_version_minor,
2448
15
            { "Minor Version", "citp.version_minor",
2449
15
            FT_UINT8, BASE_DEC,
2450
15
            NULL, 0x0,
2451
15
            NULL, HFILL }
2452
15
        },
2453
15
        { &hf_citp_message_index,
2454
15
            { "Message Index", "citp.index",
2455
15
            FT_UINT16, BASE_DEC,
2456
15
            NULL, 0x0,
2457
15
            NULL, HFILL }
2458
15
        },
2459
15
        { &hf_citp_message_size,
2460
15
            { "Message Size", "citp.message_size",
2461
15
            FT_UINT32, BASE_DEC,
2462
15
            NULL, 0x0,
2463
15
            NULL, HFILL }
2464
15
        },
2465
15
        { &hf_citp_message_part_count,
2466
15
            { "Message Part Count", "citp.message_part_count",
2467
15
            FT_UINT16, BASE_DEC,
2468
15
            NULL, 0x0,
2469
15
            NULL, HFILL }
2470
15
        },
2471
15
        { &hf_citp_message_part_index,
2472
15
            { "Message Part Index", "citp.message_part",
2473
15
            FT_UINT16, BASE_DEC,
2474
15
            NULL, 0x0,
2475
15
            NULL, HFILL }
2476
15
        },
2477
15
        { &hf_citp_content_type,
2478
15
            { "Content Type", "citp.content_type",
2479
15
            FT_UINT32, BASE_HEX,
2480
15
            VALS(citp_content_type_names), 0x0,
2481
15
            NULL, HFILL }
2482
15
        },
2483
15
    };
2484
2485
15
    static hf_register_info hf_pinf[] = {
2486
15
        { &hf_citp_pinf_content_type,
2487
15
            { "Content Type", "citp.pinf.content_type",
2488
15
            FT_UINT32, BASE_HEX,
2489
15
            VALS(citp_pinf_content_type_names), 0x0,
2490
15
            NULL, HFILL }
2491
15
        },
2492
15
        { &hf_citp_pinf_name,
2493
15
            { "Name", "citp.pinf.name",
2494
15
            FT_STRINGZ, BASE_NONE,
2495
15
            NULL, 0x0,
2496
15
            NULL, HFILL }
2497
15
        },
2498
15
        { &hf_citp_pinf_listening_port,
2499
15
            { "Listening TCP Port", "citp.pinf.listening_port",
2500
15
            FT_UINT16, BASE_DEC,
2501
15
            NULL, 0x0,
2502
15
            NULL, HFILL }
2503
15
        },
2504
15
        { &hf_citp_pinf_type,
2505
15
            { "Type", "citp.pinf.type",
2506
15
            FT_STRINGZ, BASE_NONE,
2507
15
            NULL, 0x0,
2508
15
            NULL, HFILL }
2509
15
        },
2510
15
        { &hf_citp_pinf_state,
2511
15
            { "State", "citp.pinf.state",
2512
15
            FT_STRINGZ, BASE_NONE,
2513
15
            NULL, 0x0,
2514
15
            NULL, HFILL }
2515
15
        },
2516
15
    };
2517
2518
15
    static hf_register_info hf_sdmx[] = {
2519
15
        { &hf_citp_sdmx_content_type,
2520
15
            { "Content Type", "citp.sdmx.content_type",
2521
15
            FT_UINT32, BASE_HEX,
2522
15
            VALS(citp_sdmx_content_type_names), 0x0,
2523
15
            NULL, HFILL }
2524
15
        },
2525
15
        { &hf_citp_sdmx_capability_count,
2526
15
            { "Capability Count", "citp.sdmx.capability_count",
2527
15
            FT_UINT16, BASE_DEC,
2528
15
            NULL, 0x0,
2529
15
            NULL, HFILL }
2530
15
        },
2531
15
        { &hf_citp_sdmx_capabilities,
2532
15
            { "Capabilities", "citp.sdmx.capabilities",
2533
15
            FT_NONE, BASE_NONE,
2534
15
            NULL, 0x0,
2535
15
            NULL, HFILL }
2536
15
        },
2537
15
        { &hf_citp_sdmx_capability,
2538
15
            { "Capability", "citp.sdmx.capability",
2539
15
            FT_UINT16, BASE_DEC,
2540
15
            VALS(citp_sdmx_capability_names), 0x0,
2541
15
            NULL, HFILL }
2542
15
        },
2543
15
        { &hf_citp_sdmx_universe_index,
2544
15
            { "Universe Index", "citp.sdmx.universe_index",
2545
15
            FT_UINT8, BASE_DEC,
2546
15
            NULL, 0x0,
2547
15
            NULL, HFILL }
2548
15
        },
2549
15
        { &hf_citp_sdmx_universe_name,
2550
15
            { "Universe Name", "citp.sdmx.universe_name",
2551
15
            FT_STRING, BASE_NONE,
2552
15
            NULL, 0x0,
2553
15
            NULL, HFILL }
2554
15
        },
2555
15
        { &hf_citp_sdmx_encryption_identifier,
2556
15
            { "Encryption scheme identifier", "citp.sdmx.encryption_identifier",
2557
15
            FT_STRINGZ, BASE_NONE,
2558
15
            NULL, 0x0,
2559
15
            NULL, HFILL }
2560
15
        },
2561
15
        { &hf_citp_sdmx_blind,
2562
15
            { "Blind", "citp.sdmx.blind",
2563
15
            FT_BOOLEAN, BASE_NONE,
2564
15
            TFS(&tfs_live_blind), 0x0,
2565
15
            NULL, HFILL }
2566
15
        },
2567
15
        { &hf_citp_sdmx_first_channel,
2568
15
            { "First Channel", "citp.sdmx.first_channel",
2569
15
            FT_UINT16, BASE_DEC,
2570
15
            NULL, 0x0,
2571
15
            NULL, HFILL }
2572
15
        },
2573
15
        { &hf_citp_sdmx_channel_count,
2574
15
            { "Channel Count", "citp.sdmx.channel_count",
2575
15
            FT_UINT16, BASE_DEC,
2576
15
            NULL, 0x0,
2577
15
            NULL, HFILL }
2578
15
        },
2579
15
        { &hf_citp_sdmx_channel_levels,
2580
15
            { "Channel Levels", "citp.sdmx.channel_levels",
2581
15
            FT_BYTES, BASE_NONE,
2582
15
            NULL, 0x0,
2583
15
            NULL, HFILL }
2584
15
        },
2585
15
        { &hf_citp_sdmx_encrypted_channel_data,
2586
15
            { "Encrypted Channel Data", "citp.sdmx.encrypted_channel_data",
2587
15
            FT_BYTES, BASE_NONE,
2588
15
            NULL, 0x0,
2589
15
            NULL, HFILL }
2590
15
        },
2591
15
        { &hf_citp_sdmx_channel_level_block,
2592
15
            { "Channel Level Block", "citp.sdmx.channel_level_block",
2593
15
            FT_NONE, BASE_NONE,
2594
15
            NULL, 0x0,
2595
15
            NULL, HFILL }
2596
15
        },
2597
15
        { &hf_citp_sdmx_channel,
2598
15
            { "Channel", "citp.sdmx.channel",
2599
15
            FT_UINT16, BASE_DEC,
2600
15
            NULL, 0x0,
2601
15
            NULL, HFILL }
2602
15
        },
2603
15
        { &hf_citp_sdmx_channel_level,
2604
15
            { "Channel Level", "citp.sdmx.channel_level",
2605
15
            FT_UINT8, BASE_DEC,
2606
15
            NULL, 0x0,
2607
15
            NULL, HFILL }
2608
15
        },
2609
15
        { &hf_citp_sdmx_connection_string,
2610
15
            { "Connection String", "citp.sdmx.connection_string",
2611
15
            FT_STRINGZ, BASE_NONE,
2612
15
            NULL, 0x0,
2613
15
            NULL, HFILL }
2614
15
        },
2615
15
    };
2616
2617
15
    static hf_register_info hf_fptc[] = {
2618
15
        { &hf_citp_fptc_content_type,
2619
15
            { "Content Type", "citp.fptc.content_type",
2620
15
            FT_UINT32, BASE_HEX,
2621
15
            VALS(citp_fptc_content_type_names), 0x0,
2622
15
            NULL, HFILL }
2623
15
        },
2624
15
        { &hf_citp_fptc_content_hint,
2625
15
            { "Content Hint", "citp.fptc.content_hint",
2626
15
            FT_UINT32, BASE_HEX,
2627
15
            NULL, 0x0,
2628
15
            NULL, HFILL }
2629
15
        },
2630
15
        { &hf_citp_fptc_content_hint_in_sequence,
2631
15
            { "In Sequence", "citp.fptc.content_hint.in_sequence",
2632
15
            FT_UINT32, BASE_HEX,
2633
15
            NULL, 0x00000001,
2634
15
            NULL, HFILL }
2635
15
        },
2636
15
        { &hf_citp_fptc_content_hint_end_sequence,
2637
15
            { "End Of Sequence", "citp.fptc.content_hint.end_sequence",
2638
15
            FT_UINT32, BASE_HEX,
2639
15
            NULL, 0x00000002,
2640
15
            NULL, HFILL }
2641
15
        },
2642
15
        { &hf_citp_fptc_fixture_identifier,
2643
15
            { "Fixture Identifier", "citp.fptc.fixture_id",
2644
15
            FT_UINT16, BASE_DEC,
2645
15
            NULL, 0x0,
2646
15
            NULL, HFILL }
2647
15
        },
2648
15
        { &hf_citp_fptc_universe,
2649
15
            { "Universe", "citp.fptc.universe",
2650
15
            FT_UINT8, BASE_DEC,
2651
15
            NULL, 0x0,
2652
15
            NULL, HFILL }
2653
15
        },
2654
15
        { &hf_citp_fptc_channel,
2655
15
            { "Channel", "citp.fptc.channel",
2656
15
            FT_UINT16, BASE_DEC,
2657
15
            NULL, 0x0,
2658
15
            NULL, HFILL }
2659
15
        },
2660
15
        { &hf_citp_fptc_channel_count,
2661
15
            { "Channel Count", "citp.fptc.channel_count",
2662
15
            FT_UINT16, BASE_DEC,
2663
15
            NULL, 0x0,
2664
15
            NULL, HFILL }
2665
15
        },
2666
15
        { &hf_citp_fptc_fixture_make,
2667
15
            { "Fixture Make", "citp.fptc.fixture_make",
2668
15
            FT_STRINGZ, BASE_NONE,
2669
15
            NULL, 0x0,
2670
15
            NULL, HFILL }
2671
15
        },
2672
15
        { &hf_citp_fptc_fixture_name,
2673
15
            { "Fixture Name", "citp.fptc.fixture_name",
2674
15
            FT_STRINGZ, BASE_NONE,
2675
15
            NULL, 0x0,
2676
15
            NULL, HFILL }
2677
15
        },
2678
15
        { &hf_citp_fptc_fixture_count,
2679
15
            { "Fixture Count", "citp.fptc.fixture_count",
2680
15
            FT_UINT16, BASE_DEC | BASE_SPECIAL_VALS,
2681
15
            VALS(citp_all_fixtures_val_str), 0x0,
2682
15
            NULL, HFILL }
2683
15
        },
2684
15
        { &hf_citp_fptc_fixture_identifiers,
2685
15
            { "Fixture Identifiers", "citp.fptc.fixture_identifiers",
2686
15
            FT_NONE, BASE_NONE,
2687
15
            NULL, 0x0,
2688
15
            NULL, HFILL }
2689
15
        },
2690
15
    };
2691
2692
15
    static hf_register_info hf_fsel[] = {
2693
15
        { &hf_citp_fsel_content_type,
2694
15
            { "Content Type", "citp.fsel.content_type",
2695
15
            FT_UINT32, BASE_HEX,
2696
15
            VALS(citp_fsel_content_type_names), 0x0,
2697
15
            NULL, HFILL }
2698
15
        },
2699
15
        { &hf_citp_fsel_complete,
2700
15
            { "Complete", "citp.fsel.complete",
2701
15
            FT_BOOLEAN, BASE_NONE,
2702
15
            NULL, 0x0,
2703
15
            NULL, HFILL }
2704
15
        },
2705
15
        { &hf_citp_fsel_fixture_count,
2706
15
            { "Fixture Count", "citp.fsel.fixture_count",
2707
15
            FT_UINT16, BASE_DEC,
2708
15
            NULL, 0x0,
2709
15
            NULL, HFILL }
2710
15
        },
2711
15
        { &hf_citp_fsel_fixture_identifiers,
2712
15
            { "Fixture Identifiers", "citp.fsel.fixture_identifiers",
2713
15
            FT_NONE, BASE_NONE,
2714
15
            NULL, 0x0,
2715
15
            NULL, HFILL }
2716
15
        },
2717
15
        { &hf_citp_fsel_fixture_identifier,
2718
15
            { "Fixture Identifier", "citp.fsel.fixture_identifier",
2719
15
            FT_UINT16, BASE_DEC,
2720
15
            NULL, 0x0,
2721
15
            NULL, HFILL }
2722
15
        },
2723
15
    };
2724
2725
15
    static hf_register_info hf_finf[] = {
2726
15
        { &hf_citp_finf_content_type,
2727
15
            { "Content Type", "citp.finf.content_type",
2728
15
            FT_UINT32, BASE_HEX,
2729
15
            VALS(citp_finf_content_type_names), 0x0,
2730
15
            NULL, HFILL }
2731
15
        },
2732
15
        { &hf_citp_finf_fixture_count,
2733
15
            { "Fixture Count", "citp.finf.fixture_count",
2734
15
            FT_UINT16, BASE_DEC | BASE_SPECIAL_VALS,
2735
15
            VALS(citp_all_fixtures_val_str), 0x0,
2736
15
            NULL, HFILL }
2737
15
        },
2738
15
        { &hf_citp_finf_fixture_identifiers,
2739
15
            { "Fixture Identifiers", "citp.finf.fixture_identifiers",
2740
15
            FT_NONE, BASE_NONE,
2741
15
            NULL, 0x0,
2742
15
            NULL, HFILL }
2743
15
        },
2744
15
        { &hf_citp_finf_fixture_identifier,
2745
15
            { "Fixture Identifier", "citp.finf.fixture_identifier",
2746
15
            FT_UINT16, BASE_DEC,
2747
15
            NULL, 0x0,
2748
15
            NULL, HFILL }
2749
15
        },
2750
15
        { &hf_citp_finf_frame_filter_count,
2751
15
            { "Frame Filter Count", "citp.finf.frame_filter_count",
2752
15
            FT_UINT8, BASE_DEC,
2753
15
            NULL, 0x0,
2754
15
            NULL, HFILL }
2755
15
        },
2756
15
        { &hf_citp_finf_frame_gobo_count,
2757
15
            { "Frame Gobo Count", "citp.finf.frame_gobo_count",
2758
15
            FT_UINT8, BASE_DEC,
2759
15
            NULL, 0x0,
2760
15
            NULL, HFILL }
2761
15
        },
2762
15
        { &hf_citp_finf_frame_names,
2763
15
            { "Frame Names", "citp.finf.frame_names",
2764
15
            FT_NONE, BASE_NONE,
2765
15
            NULL, 0x0,
2766
15
            NULL, HFILL }
2767
15
        },
2768
15
        { &hf_citp_finf_filter_name,
2769
15
            { "Filter Name", "citp.finf.filter_name",
2770
15
            FT_STRINGZ, BASE_NONE,
2771
15
            NULL, 0x0,
2772
15
            NULL, HFILL }
2773
15
        },
2774
15
        { &hf_citp_finf_gobo_name,
2775
15
            { "Gobo Name", "citp.finf.gobo_name",
2776
15
            FT_STRINGZ, BASE_NONE,
2777
15
            NULL, 0x0,
2778
15
            NULL, HFILL }
2779
15
        },
2780
15
    };
2781
2782
15
    static hf_register_info hf_caex[] = {
2783
15
        { &hf_citp_caex_content_code,
2784
15
            { "Content Code", "citp.caex.content_code",
2785
15
            FT_UINT32, BASE_HEX,
2786
15
            VALS(citp_caex_content_code_names), 0x0,
2787
15
            NULL, HFILL }
2788
15
        },
2789
15
        { &hf_citp_caex_nack_reason,
2790
15
            { "NAck Reason", "citp.caex.nack_reason",
2791
15
            FT_UINT8, BASE_HEX,
2792
15
            VALS(citp_caex_nack_reason), 0x0,
2793
15
            NULL, HFILL }
2794
15
        },
2795
2796
15
        { &hf_citp_caex_view_availability,
2797
15
            { "Availability", "citp.caex.live_view.availability",
2798
15
            FT_UINT8, BASE_HEX,
2799
15
            VALS(citp_caex_view_availability), 0x0,
2800
15
            NULL, HFILL }
2801
15
        },
2802
15
        { &hf_citp_caex_view_size,
2803
15
            { "View Size", "citp.caex.live_view.size",
2804
15
            FT_NONE, BASE_NONE,
2805
15
            NULL, 0x0,
2806
15
            NULL, HFILL }
2807
15
        },
2808
15
        { &hf_citp_caex_view_width,
2809
15
            { "Width", "citp.caex.live_view.size.width",
2810
15
            FT_UINT16, BASE_DEC,
2811
15
            NULL, 0x0,
2812
15
            NULL, HFILL }
2813
15
        },
2814
15
        { &hf_citp_caex_view_height,
2815
15
            { "Height", "citp.caex.live_view.size.height",
2816
15
            FT_UINT16, BASE_DEC,
2817
15
            NULL, 0x0,
2818
15
            NULL, HFILL }
2819
15
        },
2820
15
        { &hf_citp_caex_view_position,
2821
15
            { "Camera Position", "citp.caex.live_view.position",
2822
15
            FT_NONE, BASE_NONE,
2823
15
            NULL, 0x0,
2824
15
            NULL, HFILL }
2825
15
        },
2826
15
        { &hf_citp_caex_view_position_x,
2827
15
            { "X", "citp.caex.live_view.position.x",
2828
15
            FT_FLOAT, BASE_NONE,
2829
15
            NULL, 0x0,
2830
15
            NULL, HFILL }
2831
15
        },
2832
15
        { &hf_citp_caex_view_position_y,
2833
15
            { "Y", "citp.caex.live_view.position.y",
2834
15
            FT_FLOAT, BASE_NONE,
2835
15
            NULL, 0x0,
2836
15
            NULL, HFILL }
2837
15
        },
2838
15
        { &hf_citp_caex_view_position_z,
2839
15
            { "Z", "citp.caex.live_view.position.z",
2840
15
            FT_FLOAT, BASE_NONE,
2841
15
            NULL, 0x0,
2842
15
            NULL, HFILL }
2843
15
        },
2844
15
        { &hf_citp_caex_view_focus,
2845
15
            { "Camera Focus", "citp.caex.live_view.focus",
2846
15
            FT_NONE, BASE_NONE,
2847
15
            NULL, 0x0,
2848
15
            NULL, HFILL }
2849
15
        },
2850
15
        { &hf_citp_caex_view_focus_x,
2851
15
            { "X", "citp.caex.live_view.focus.x",
2852
15
            FT_FLOAT, BASE_NONE,
2853
15
            NULL, 0x0,
2854
15
            NULL, HFILL }
2855
15
        },
2856
15
        { &hf_citp_caex_view_focus_y,
2857
15
            { "Y", "citp.caex.live_view.focus.y",
2858
15
            FT_FLOAT, BASE_NONE,
2859
15
            NULL, 0x0,
2860
15
            NULL, HFILL }
2861
15
        },
2862
15
        { &hf_citp_caex_view_focus_z,
2863
15
            { "Z", "citp.caex.live_view.focus.z",
2864
15
            FT_FLOAT, BASE_NONE,
2865
15
            NULL, 0x0,
2866
15
            NULL, HFILL }
2867
15
        },
2868
15
        { &hf_citp_caex_view_format,
2869
15
            { "Format", "citp.caex.live_view.format",
2870
15
            FT_UINT8, BASE_HEX,
2871
15
            NULL, 0x0,
2872
15
            NULL, HFILL }
2873
15
        },
2874
15
        { &hf_citp_caex_view_data_size,
2875
15
            { "Data Size", "citp.caex.live_view.data_size",
2876
15
            FT_UINT32, BASE_DEC,
2877
15
            NULL, 0x0,
2878
15
            NULL, HFILL }
2879
15
        },
2880
15
        { &hf_citp_caex_view_data,
2881
15
            { "Data", "citp.caex.live_view.data",
2882
15
            FT_BYTES, BASE_NONE,
2883
15
            NULL, 0x0,
2884
15
            NULL, HFILL }
2885
15
        },
2886
2887
15
        { &hf_citp_caex_cue_availability,
2888
15
            { "Availability", "citp.caex.cue_record.availability",
2889
15
            FT_UINT8, BASE_HEX,
2890
15
            VALS(citp_caex_cue_record_availability), 0x0,
2891
15
            NULL, HFILL }
2892
15
        },
2893
15
        { &hf_citp_caex_cue_option_count,
2894
15
            { "Option Count", "citp.caex.cue_record.option_count",
2895
15
            FT_UINT8, BASE_DEC,
2896
15
            NULL, 0x0,
2897
15
            NULL, HFILL }
2898
15
        },
2899
15
        { &hf_citp_caex_cue_option,
2900
15
            { "Option", "citp.caex.cue_record.option",
2901
15
            FT_NONE, BASE_NONE,
2902
15
            NULL, 0x0,
2903
15
            NULL, HFILL }
2904
15
        },
2905
15
        { &hf_citp_caex_cue_option_name,
2906
15
            { "Name", "citp.caex.cue_record.option.name",
2907
15
            FT_STRINGZ, BASE_NONE,
2908
15
            NULL, 0x0,
2909
15
            NULL, HFILL }
2910
15
        },
2911
15
        { &hf_citp_caex_cue_option_value,
2912
15
            { "Value", "citp.caex.cue_record.option.value",
2913
15
            FT_STRINGZ, BASE_NONE,
2914
15
            NULL, 0x0,
2915
15
            NULL, HFILL }
2916
15
        },
2917
15
        { &hf_citp_caex_cue_option_choices,
2918
15
            { "Choices", "citp.caex.cue_record.option.choices",
2919
15
            FT_STRINGZ, BASE_NONE,
2920
15
            NULL, 0x0,
2921
15
            NULL, HFILL }
2922
15
        },
2923
15
        { &hf_citp_caex_cue_option_help,
2924
15
            { "Help", "citp.caex.cue_record.option.help",
2925
15
            FT_STRINGZ, BASE_NONE,
2926
15
            NULL, 0x0,
2927
15
            NULL, HFILL }
2928
15
        },
2929
15
        { &hf_citp_caex_cue_clear_availability,
2930
15
            { "Availability", "citp.caex.cue_record.clear_availability",
2931
15
            FT_UINT8, BASE_HEX,
2932
15
            VALS(citp_caex_cue_clear_availability), 0x0,
2933
15
            NULL, HFILL }
2934
15
        },
2935
2936
15
        { &hf_citp_caex_show_name,
2937
15
            { "Name", "citp.caex.show.name",
2938
15
            FT_STRINGZ, BASE_NONE,
2939
15
            NULL, 0x0,
2940
15
            NULL, HFILL }
2941
15
        },
2942
15
        { &hf_citp_caex_show_transformation_space,
2943
15
            { "Transformation Space", "citp.caex.show.transformation_space",
2944
15
            FT_UINT8, BASE_HEX,
2945
15
            VALS(citp_caex_show_transformation_spaces), 0x0,
2946
15
            NULL, HFILL }
2947
15
        },
2948
15
        { &hf_citp_caex_show_fixture_list_type,
2949
15
            { "List Type", "citp.caex.show.fixture_list_type",
2950
15
            FT_UINT8, BASE_HEX,
2951
15
            VALS(citp_caex_show_fixture_list_types), 0x0,
2952
15
            NULL, HFILL }
2953
15
        },
2954
15
        { &hf_citp_caex_show_fixture_count,
2955
15
            { "Fixture Count", "citp.caex.show.fixture_count",
2956
15
            FT_UINT16, BASE_DEC,
2957
15
            NULL, 0x0,
2958
15
            NULL, HFILL }
2959
15
        },
2960
15
        { &hf_citp_caex_show_fixtures,
2961
15
            { "Fixtures", "citp.caex.show.fixtures",
2962
15
            FT_NONE, BASE_NONE,
2963
15
            NULL, 0x0,
2964
15
            NULL, HFILL }
2965
15
        },
2966
15
        { &hf_citp_caex_show_fixture,
2967
15
            { "Fixture", "citp.caex.show.fixture",
2968
15
            FT_NONE, BASE_NONE,
2969
15
            NULL, 0x0,
2970
15
            NULL, HFILL }
2971
15
        },
2972
15
        { &hf_citp_caex_show_fixture_console_identifier,
2973
15
            { "Console Identifier", "citp.caex.show.fixture.console_identifier",
2974
15
            FT_UINT32, BASE_HEX,
2975
15
            NULL, 0x0,
2976
15
            NULL, HFILL }
2977
15
        },
2978
15
        { &hf_citp_caex_show_fixture_manufacturer_name,
2979
15
            { "Manufacturer Name", "citp.caex.show.fixture.manufacturer_name",
2980
15
            FT_STRINGZ, BASE_NONE,
2981
15
            NULL, 0x0,
2982
15
            NULL, HFILL }
2983
15
        },
2984
15
        { &hf_citp_caex_show_fixture_model_name,
2985
15
            { "Model Name", "citp.caex.show.fixture.model_name",
2986
15
            FT_STRINGZ, BASE_NONE,
2987
15
            NULL, 0x0,
2988
15
            NULL, HFILL }
2989
15
        },
2990
15
        { &hf_citp_caex_show_fixture_mode_name,
2991
15
            { "DMX Mode Name", "citp.caex.show.fixture.mode_name",
2992
15
            FT_STRINGZ, BASE_NONE,
2993
15
            NULL, 0x0,
2994
15
            NULL, HFILL }
2995
15
        },
2996
15
        { &hf_citp_caex_show_fixture_channel_count,
2997
15
            { "Channel Count", "citp.caex.show.fixture.channel_count",
2998
15
            FT_UINT16, BASE_DEC,
2999
15
            NULL, 0x0,
3000
15
            NULL, HFILL }
3001
15
        },
3002
15
        { &hf_citp_caex_show_fixture_is_dimmer,
3003
15
            { "Is Dimmer", "citp.caex.show.fixture.is_dimmer",
3004
15
            FT_BOOLEAN, BASE_NONE,
3005
15
            NULL, 0x0,
3006
15
            NULL, HFILL }
3007
15
        },
3008
15
        { &hf_citp_caex_show_fixture_identifier_count,
3009
15
            { "Identifier Count", "citp.caex.show.fixture.identifier_count",
3010
15
            FT_UINT8, BASE_DEC,
3011
15
            NULL, 0x0,
3012
15
            NULL, HFILL }
3013
15
        },
3014
15
        { &hf_citp_caex_show_fixture_identifier,
3015
15
            { "Identifier", "citp.caex.show.fixture.identifier",
3016
15
            FT_NONE, BASE_NONE,
3017
15
            NULL, 0x0,
3018
15
            NULL, HFILL }
3019
15
        },
3020
15
        { &hf_citp_caex_show_fixture_identifier_type,
3021
15
            { "Type", "citp.caex.show.fixture.identifier.type",
3022
15
            FT_UINT8, BASE_NONE,
3023
15
            VALS(citp_caex_show_identifier_types), 0x0,
3024
15
            NULL, HFILL }
3025
15
        },
3026
15
        { &hf_citp_caex_show_fixture_identifier_data_size,
3027
15
            { "Data Size", "citp.caex.show.fixture.identifier.data_size",
3028
15
            FT_UINT16, BASE_DEC,
3029
15
            NULL, 0x0,
3030
15
            NULL, HFILL }
3031
15
        },
3032
15
        { &hf_citp_caex_show_fixture_identifier_data,
3033
15
            { "Data", "citp.caex.show.fixture.identifier.data",
3034
15
            FT_BYTES, BASE_NONE,
3035
15
            NULL, 0x0,
3036
15
            NULL, HFILL }
3037
15
        },
3038
15
        { &hf_citp_caex_show_fixture_identifier_rdm_manufacturer_id,
3039
15
            { "RDM Manufacturer Id", "citp.caex.show.fixture.identifier.rdm_manf_id",
3040
15
            FT_UINT16, BASE_HEX,
3041
15
            NULL, 0x0,
3042
15
            NULL, HFILL }
3043
15
        },
3044
15
        { &hf_citp_caex_show_fixture_identifier_rdm_device_model_id,
3045
15
            { "RDM Device Model Id", "citp.caex.show.fixture.identifier.rdm_model_id",
3046
15
            FT_UINT16, BASE_HEX,
3047
15
            NULL, 0x0,
3048
15
            NULL, HFILL }
3049
15
        },
3050
15
        { &hf_citp_caex_show_fixture_identifier_rdm_personality_id,
3051
15
            { "RDM Personality Id", "citp.caex.show.fixture.identifier.rdm_personality_id",
3052
15
            FT_UINT64, BASE_HEX,
3053
15
            NULL, 0x0,
3054
15
            NULL, HFILL }
3055
15
        },
3056
15
        { &hf_citp_caex_show_fixture_identifier_altabase_fixture_id,
3057
15
            { "AltaBase Fixture Id", "citp.caex.show.fixture.identifier.altabase_fixture_id",
3058
15
            FT_GUID, BASE_NONE,
3059
15
            NULL, 0x0,
3060
15
            NULL, HFILL }
3061
15
        },
3062
15
        { &hf_citp_caex_show_fixture_identifier_altabase_mode_id,
3063
15
            { "AltaBase Mode Id", "citp.caex.show.fixture.identifier.altabase_mode_id",
3064
15
            FT_GUID, BASE_NONE,
3065
15
            NULL, 0x0,
3066
15
            NULL, HFILL }
3067
15
        },
3068
15
        { &hf_citp_caex_show_fixture_identifier_capture_instance_id,
3069
15
            { "Capture Instance Id", "citp.caex.show.fixture.identifier.capture_instance_id",
3070
15
            FT_GUID, BASE_NONE,
3071
15
            NULL, 0x0,
3072
15
            NULL, HFILL }
3073
15
        },
3074
15
        { &hf_citp_caex_show_fixture_patched,
3075
15
            { "Patched", "citp.caex.show.fixture.patched",
3076
15
            FT_BOOLEAN, BASE_NONE,
3077
15
            NULL, 0x0,
3078
15
            NULL, HFILL }
3079
15
        },
3080
15
        { &hf_citp_caex_show_fixture_universe,
3081
15
            { "Universe", "citp.caex.show.fixture.universe",
3082
15
            FT_UINT8, BASE_DEC,
3083
15
            NULL, 0x0,
3084
15
            NULL, HFILL }
3085
15
        },
3086
15
        { &hf_citp_caex_show_fixture_universe_channel,
3087
15
            { "Universe Channel", "citp.caex.show.fixture.universe_channel",
3088
15
            FT_UINT16, BASE_DEC,
3089
15
            NULL, 0x0,
3090
15
            NULL, HFILL }
3091
15
        },
3092
15
        { &hf_citp_caex_show_fixture_unit,
3093
15
            { "Unit", "citp.caex.show.fixture.unit",
3094
15
            FT_STRINGZ, BASE_NONE,
3095
15
            NULL, 0x0,
3096
15
            NULL, HFILL }
3097
15
        },
3098
15
        { &hf_citp_caex_show_fixture_channel,
3099
15
            { "Channel", "citp.caex.show.fixture.channel",
3100
15
            FT_UINT16, BASE_DEC,
3101
15
            NULL, 0x0,
3102
15
            NULL, HFILL }
3103
15
        },
3104
15
        { &hf_citp_caex_show_fixture_circuit,
3105
15
            { "Circuit", "citp.caex.show.fixture.circuit",
3106
15
            FT_STRINGZ, BASE_NONE,
3107
15
            NULL, 0x0,
3108
15
            NULL, HFILL }
3109
15
        },
3110
15
        { &hf_citp_caex_show_fixture_note,
3111
15
            { "Note", "citp.caex.show.fixture.note",
3112
15
            FT_STRINGZ, BASE_NONE,
3113
15
            NULL, 0x0,
3114
15
            NULL, HFILL }
3115
15
        },
3116
15
        { &hf_citp_caex_show_fixture_position,
3117
15
            { "Position", "citp.caex.show.fixture.position",
3118
15
            FT_NONE, BASE_NONE,
3119
15
            NULL, 0x0,
3120
15
            NULL, HFILL }
3121
15
        },
3122
15
        { &hf_citp_caex_show_fixture_position_x,
3123
15
            { "X", "citp.caex.show.fixture.position.x",
3124
15
            FT_FLOAT, BASE_NONE,
3125
15
            NULL, 0x0,
3126
15
            NULL, HFILL }
3127
15
        },
3128
15
        { &hf_citp_caex_show_fixture_position_y,
3129
15
            { "Y", "citp.caex.show.fixture.position.y",
3130
15
            FT_FLOAT, BASE_NONE,
3131
15
            NULL, 0x0,
3132
15
            NULL, HFILL }
3133
15
        },
3134
15
        { &hf_citp_caex_show_fixture_position_z,
3135
15
            { "Z", "citp.caex.show.fixture.position.z",
3136
15
            FT_FLOAT, BASE_NONE,
3137
15
            NULL, 0x0,
3138
15
            NULL, HFILL }
3139
15
        },
3140
15
        { &hf_citp_caex_show_fixture_angles,
3141
15
            { "Angles", "citp.caex.show.fixture.angles",
3142
15
            FT_NONE, BASE_NONE,
3143
15
            NULL, 0x0,
3144
15
            NULL, HFILL }
3145
15
        },
3146
15
        { &hf_citp_caex_show_fixture_angles_x,
3147
15
            { "X", "citp.caex.show.fixture.angles.x",
3148
15
            FT_FLOAT, BASE_NONE,
3149
15
            NULL, 0x0,
3150
15
            NULL, HFILL }
3151
15
        },
3152
15
        { &hf_citp_caex_show_fixture_angles_y,
3153
15
            { "Y", "citp.caex.show.fixture.angles.y",
3154
15
            FT_FLOAT, BASE_NONE,
3155
15
            NULL, 0x0,
3156
15
            NULL, HFILL }
3157
15
        },
3158
15
        { &hf_citp_caex_show_fixture_angles_z,
3159
15
            { "Z", "citp.caex.show.fixture.angles.z",
3160
15
            FT_FLOAT, BASE_NONE,
3161
15
            NULL, 0x0,
3162
15
            NULL, HFILL }
3163
15
        },
3164
15
        { &hf_citp_caex_show_fixture_locked,
3165
15
            { "Locked", "citp.caex.show.fixture.locked",
3166
15
            FT_BOOLEAN, BASE_NONE,
3167
15
            NULL, 0x0,
3168
15
            NULL, HFILL }
3169
15
        },
3170
15
        { &hf_citp_caex_show_fixture_clearable,
3171
15
            { "Clearable", "citp.caex.show.fixture.clearable",
3172
15
            FT_BOOLEAN, BASE_NONE,
3173
15
            NULL, 0x0,
3174
15
            NULL, HFILL }
3175
15
        },
3176
15
        { &hf_citp_caex_show_fixture_changed_fields,
3177
15
            { "Changed Fields", "citp.caex.show.fixture.changed_fields",
3178
15
            FT_UINT8, BASE_HEX,
3179
15
            NULL, 0x0,
3180
15
            NULL, HFILL }
3181
15
        },
3182
15
        { &hf_citp_caex_show_fixture_changed_fields_patch,
3183
15
            { "Patch", "citp.caex.show.fixture.changed_fields.patch",
3184
15
            FT_BOOLEAN, 8,
3185
15
            NULL, 0x01,
3186
15
            NULL, HFILL }
3187
15
        },
3188
15
        { &hf_citp_caex_show_fixture_changed_fields_unit,
3189
15
            { "Unit", "citp.caex.show.fixture.changed_fields.unit",
3190
15
            FT_BOOLEAN, 8,
3191
15
            NULL, 0x02,
3192
15
            NULL, HFILL }
3193
15
        },
3194
15
        { &hf_citp_caex_show_fixture_changed_fields_channel,
3195
15
            { "Channel", "citp.caex.show.fixture.changed_fields.channel",
3196
15
            FT_BOOLEAN, 8,
3197
15
            NULL, 0x04,
3198
15
            NULL, HFILL }
3199
15
        },
3200
15
        { &hf_citp_caex_show_fixture_changed_fields_circuit,
3201
15
            { "Circuit", "citp.caex.show.fixture.changed_fields.circuit",
3202
15
            FT_BOOLEAN, 8,
3203
15
            NULL, 0x08,
3204
15
            NULL, HFILL }
3205
15
        },
3206
15
        { &hf_citp_caex_show_fixture_changed_fields_note,
3207
15
            { "Note", "citp.caex.show.fixture.changed_fields.note",
3208
15
            FT_BOOLEAN, 8,
3209
15
            NULL, 0x10,
3210
15
            NULL, HFILL }
3211
15
        },
3212
15
        { &hf_citp_caex_show_fixture_changed_fields_position,
3213
15
            { "Position", "citp.caex.show.fixture.changed_fields.position",
3214
15
            FT_BOOLEAN, 8,
3215
15
            NULL, 0x20,
3216
15
            NULL, HFILL }
3217
15
        },
3218
3219
15
        { &hf_citp_caex_laser_source_key,
3220
15
            { "Source Key", "citp.caex.laser.source_key",
3221
15
            FT_UINT32, BASE_HEX,
3222
15
            NULL, 0x0,
3223
15
            NULL, HFILL }
3224
15
        },
3225
15
        { &hf_citp_caex_laser_feed_count,
3226
15
            { "Feed Count", "citp.caex.laser.feed_count",
3227
15
            FT_UINT8, BASE_DEC,
3228
15
            NULL, 0x0,
3229
15
            NULL, HFILL }
3230
15
        },
3231
15
        { &hf_citp_caex_laser_feed_name,
3232
15
            { "Feed Name", "citp.caex.laser.feed_name",
3233
15
            FT_STRINGZ, BASE_NONE,
3234
15
            NULL, 0x0,
3235
15
            NULL, HFILL }
3236
15
        },
3237
15
        { &hf_citp_caex_laser_feed_index,
3238
15
            { "Feed Index", "citp.caex.laser.feed_index",
3239
15
            FT_UINT8, BASE_DEC,
3240
15
            NULL, 0x0,
3241
15
            NULL, HFILL }
3242
15
        },
3243
15
        { &hf_citp_caex_laser_frame_rate,
3244
15
            { "Frame Rate", "citp.caex.laser.frame_rate",
3245
15
            FT_UINT8, BASE_DEC,
3246
15
            NULL, 0x0,
3247
15
            NULL, HFILL }
3248
15
        },
3249
15
        { &hf_citp_caex_laser_frame_sequence_number,
3250
15
            { "Sequence Number", "citp.caex.laser.frame_sequence",
3251
15
            FT_UINT32, BASE_DEC,
3252
15
            NULL, 0x0,
3253
15
            NULL, HFILL }
3254
15
        },
3255
15
        { &hf_citp_caex_laser_point_count,
3256
15
            { "Point Count", "citp.caex.laser.point_count",
3257
15
            FT_UINT16, BASE_DEC,
3258
15
            NULL, 0x0,
3259
15
            NULL, HFILL }
3260
15
        },
3261
15
        { &hf_citp_caex_laser_points,
3262
15
            { "Points", "citp.caex.laser.points",
3263
15
            FT_NONE, BASE_NONE,
3264
15
            NULL, 0x0,
3265
15
            NULL, HFILL }
3266
15
        },
3267
15
        { &hf_citp_caex_laser_point,
3268
15
            { "Point", "citp.caex.laser.point",
3269
15
            FT_NONE, BASE_NONE,
3270
15
            NULL, 0x0,
3271
15
            NULL, HFILL }
3272
15
        },
3273
15
        { &hf_citp_caex_laser_point_x_low,
3274
15
            { "X Low Byte", "citp.caex.laser.point.x_low",
3275
15
            FT_UINT8, BASE_HEX,
3276
15
            NULL, 0x0,
3277
15
            NULL, HFILL }
3278
15
        },
3279
15
        { &hf_citp_caex_laser_point_y_low,
3280
15
            { "Y Low Byte", "citp.caex.laser.point.y_low",
3281
15
            FT_UINT8, BASE_HEX,
3282
15
            NULL, 0x0,
3283
15
            NULL, HFILL }
3284
15
        },
3285
15
        { &hf_citp_caex_laser_point_xy_high,
3286
15
            { "XY High Nibbles", "citp.caex.laser.point.xy_high",
3287
15
            FT_UINT8, BASE_HEX,
3288
15
            NULL, 0x0,
3289
15
            NULL, HFILL }
3290
15
        },
3291
15
        { &hf_citp_caex_laser_point_x,
3292
15
            { "X [0, 4093]", "citp.caex.laser.point.x",
3293
15
            FT_UINT16, BASE_DEC,
3294
15
            NULL, 0x0,
3295
15
            NULL, HFILL }
3296
15
        },
3297
15
        { &hf_citp_caex_laser_point_y,
3298
15
            { "Y [0, 4093]", "citp.caex.laser.point.y",
3299
15
            FT_UINT16, BASE_DEC,
3300
15
            NULL, 0x0,
3301
15
            NULL, HFILL }
3302
15
        },
3303
15
        { &hf_citp_caex_laser_point_colour,
3304
15
            { "Colour", "citp.caex.laser.point.colour",
3305
15
            FT_UINT16, BASE_HEX,
3306
15
            NULL, 0x0,
3307
15
            NULL, HFILL }
3308
15
        },
3309
15
        { &hf_citp_caex_laser_point_colour_r,
3310
15
            { "R [0, 31]", "citp.caex.laser.point.colour.r",
3311
15
            FT_UINT16, BASE_DEC,
3312
15
            NULL, 0b1111100000000000,
3313
15
            NULL, HFILL }
3314
15
        },
3315
15
        { &hf_citp_caex_laser_point_colour_g,
3316
15
            { "G [0, 63]", "citp.caex.laser.point.colour.g",
3317
15
            FT_UINT16, BASE_DEC,
3318
15
            NULL, 0b0000011111100000,
3319
15
            NULL, HFILL }
3320
15
        },
3321
15
        { &hf_citp_caex_laser_point_colour_b,
3322
15
            { "B [0, 31]", "citp.caex.laser.point.colour.b",
3323
15
            FT_UINT16, BASE_DEC,
3324
15
            NULL, 0b0000000000011111,
3325
15
            NULL, HFILL }
3326
15
        },
3327
15
    };
3328
3329
15
    static hf_register_info hf_msex[] = {
3330
15
        { &hf_citp_msex_version_major,
3331
15
            { "Major Version", "citp.msex.version_major",
3332
15
            FT_UINT8, BASE_DEC,
3333
15
            NULL, 0x0,
3334
15
            NULL, HFILL }
3335
15
        },
3336
15
        { &hf_citp_msex_version_minor,
3337
15
            { "Minor Version", "citp.msex.version_minor",
3338
15
            FT_UINT8, BASE_DEC,
3339
15
            NULL, 0x0,
3340
15
            NULL, HFILL }
3341
15
        },
3342
15
        { &hf_citp_msex_content_type,
3343
15
            { "Content Type", "citp.msex.content_type",
3344
15
            FT_UINT32, BASE_HEX,
3345
15
            VALS(citp_msex_content_type_names), 0x0,
3346
15
            NULL, HFILL }
3347
15
        },
3348
15
        { &hf_citp_msex_supported_version_count,
3349
15
            { "Supported Version Count", "citp.msex.supported_version_count",
3350
15
            FT_UINT8, BASE_DEC,
3351
15
            NULL, 0x0,
3352
15
            NULL, HFILL }
3353
15
        },
3354
15
        { &hf_citp_msex_supported_versions,
3355
15
            { "Supported Versions", "citp.msex.supported_versions",
3356
15
            FT_NONE, BASE_NONE,
3357
15
            NULL, 0x0,
3358
15
            NULL, HFILL }
3359
15
        },
3360
15
        { &hf_citp_msex_supported_version,
3361
15
            { "Supported Version", "citp.msex.supported_version",
3362
15
            FT_NONE, BASE_NONE,
3363
15
            NULL, 0x0,
3364
15
            NULL, HFILL }
3365
15
        },
3366
15
        { &hf_citp_msex_uuid,
3367
15
            { "UUID", "citp.msex.uuid",
3368
15
            FT_STRINGZ, BASE_NONE,
3369
15
            NULL, 0x0,
3370
15
            NULL, HFILL }
3371
15
        },
3372
15
        { &hf_citp_msex_product_name,
3373
15
            { "Product Name", "citp.msex.product.name",
3374
15
            FT_STRINGZ, BASE_NONE,
3375
15
            NULL, 0x0,
3376
15
            NULL, HFILL }
3377
15
        },
3378
15
        { &hf_citp_msex_product_version_major,
3379
15
            { "Product Major Version", "citp.msex.product.version_major",
3380
15
            FT_UINT8, BASE_DEC,
3381
15
            NULL, 0x0,
3382
15
            NULL, HFILL }
3383
15
        },
3384
15
        { &hf_citp_msex_product_version_minor,
3385
15
            { "Product Minor Version", "citp.msex.product.version_minor",
3386
15
            FT_UINT8, BASE_DEC,
3387
15
            NULL, 0x0,
3388
15
            NULL, HFILL }
3389
15
        },
3390
15
        { &hf_citp_msex_product_version_bugfix,
3391
15
            { "Product Bugfix Version", "citp.msex.product.version_bugfix",
3392
15
            FT_UINT8, BASE_DEC,
3393
15
            NULL, 0x0,
3394
15
            NULL, HFILL }
3395
15
        },
3396
15
        { &hf_citp_msex_supported_library_types,
3397
15
            { "Supported Library Types", "citp.msex.supported_library_types",
3398
15
            FT_UINT16, BASE_HEX,
3399
15
            NULL, 0x0,
3400
15
            NULL, HFILL }
3401
15
        },
3402
15
        { &hf_citp_msex_supported_library_types_media,
3403
15
            { "Media", "citp.msex.supported_library_types.media",
3404
15
            FT_BOOLEAN, 16,
3405
15
            NULL, 0x0001,
3406
15
            NULL, HFILL }
3407
15
        },
3408
15
        { &hf_citp_msex_supported_library_types_effects,
3409
15
            { "Effects", "citp.msex.supported_library_types.effects",
3410
15
            FT_BOOLEAN, 16,
3411
15
            NULL, 0x0002,
3412
15
            NULL, HFILL }
3413
15
        },
3414
15
        { &hf_citp_msex_supported_library_types_cues,
3415
15
            { "Cues", "citp.msex.supported_library_types.cues",
3416
15
            FT_BOOLEAN, 16,
3417
15
            NULL, 0x0004,
3418
15
            NULL, HFILL }
3419
15
        },
3420
15
        { &hf_citp_msex_supported_library_types_crossfades,
3421
15
            { "Crossfades", "citp.msex.supported_library_types.crossfades",
3422
15
            FT_BOOLEAN, 16,
3423
15
            NULL, 0x0008,
3424
15
            NULL, HFILL }
3425
15
        },
3426
15
        { &hf_citp_msex_supported_library_types_masks,
3427
15
            { "Masks", "citp.msex.supported_library_types.masks",
3428
15
            FT_BOOLEAN, 16,
3429
15
            NULL, 0x0010,
3430
15
            NULL, HFILL }
3431
15
        },
3432
15
        { &hf_citp_msex_supported_library_types_blend_presets,
3433
15
            { "Blend Presets", "citp.msex.supported_library_types.blend_presets",
3434
15
            FT_BOOLEAN, 16,
3435
15
            NULL, 0x0020,
3436
15
            NULL, HFILL }
3437
15
        },
3438
15
        { &hf_citp_msex_supported_library_types_effect_presets,
3439
15
            { "Effect Presets", "citp.msex.supported_library_types.effect_presets",
3440
15
            FT_BOOLEAN, 16,
3441
15
            NULL, 0x0040,
3442
15
            NULL, HFILL }
3443
15
        },
3444
15
        { &hf_citp_msex_supported_library_types_image_presets,
3445
15
            { "Image Presets", "citp.msex.supported_library_types.image_presets",
3446
15
            FT_BOOLEAN, 16,
3447
15
            NULL, 0x0080,
3448
15
            NULL, HFILL }
3449
15
        },
3450
15
        { &hf_citp_msex_supported_library_types_3d_meshes,
3451
15
            { "3D Meshes", "citp.msex.supported_library_types.3d_meshes",
3452
15
            FT_BOOLEAN, 16,
3453
15
            NULL, 0x0100,
3454
15
            NULL, HFILL }
3455
15
        },
3456
15
        { &hf_citp_msex_received_content_type,
3457
15
            { "Received Content Type", "citp.msex.received_content_type",
3458
15
            FT_UINT32, BASE_HEX,
3459
15
            VALS(citp_msex_content_type_names), 0x0,
3460
15
            NULL, HFILL }
3461
15
        },
3462
3463
15
        { &hf_citp_msex_layer_count,
3464
15
            { "Layer Count", "citp.msex.layer_count",
3465
15
            FT_UINT8, BASE_DEC,
3466
15
            NULL, 0x0,
3467
15
            NULL, HFILL }
3468
15
        },
3469
15
        { &hf_citp_msex_layers,
3470
15
            { "Layers", "citp.msex.layers",
3471
15
            FT_UINT8, BASE_DEC,
3472
15
            NULL, 0x0,
3473
15
            NULL, HFILL }
3474
15
        },
3475
15
        { &hf_citp_msex_layer_dmx_source,
3476
15
            { "Dmx Source", "citp.msex.layer.dmx_source",
3477
15
            FT_STRINGZ, BASE_NONE,
3478
15
            NULL, 0x0,
3479
15
            NULL, HFILL }
3480
15
        },
3481
15
        { &hf_citp_msex_layer,
3482
15
            { "Layer", "citp.msex.layer",
3483
15
            FT_NONE, BASE_NONE,
3484
15
            NULL, 0x0,
3485
15
            NULL, HFILL }
3486
15
        },
3487
15
        { &hf_citp_msex_layer_number,
3488
15
            { "Number", "citp.msex.layer.number",
3489
15
            FT_UINT8, BASE_DEC,
3490
15
            NULL, 0x0,
3491
15
            NULL, HFILL }
3492
15
        },
3493
15
        { &hf_citp_msex_layer_physical_output,
3494
15
            { "Physical Output", "citp.msex.layer.physical_output",
3495
15
            FT_UINT8, BASE_DEC,
3496
15
            NULL, 0x0,
3497
15
            NULL, HFILL }
3498
15
        },
3499
15
        { &hf_citp_msex_layer_status_flags,
3500
15
            { "Status Flags", "citp.msex.layer.status",
3501
15
            FT_UINT32, BASE_HEX,
3502
15
            NULL, 0x0,
3503
15
            NULL, HFILL }
3504
15
        },
3505
15
        { &hf_citp_msex_layer_status_flags_playing,
3506
15
            { "Playing", "citp.msex.layer.status.playing",
3507
15
            FT_BOOLEAN, 32,
3508
15
            NULL, 0x00000001,
3509
15
            NULL, HFILL }
3510
15
        },
3511
15
        { &hf_citp_msex_layer_status_flags_reverse,
3512
15
            { "Playber Reverse", "citp.msex.layer.status.reverse",
3513
15
            FT_BOOLEAN, 32,
3514
15
            NULL, 0x00000002,
3515
15
            NULL, HFILL }
3516
15
        },
3517
15
        { &hf_citp_msex_layer_status_flags_looping,
3518
15
            { "Playback Looping", "citp.msex.layer.status.looping",
3519
15
            FT_BOOLEAN, 32,
3520
15
            NULL, 0x00000004,
3521
15
            NULL, HFILL }
3522
15
        },
3523
15
        { &hf_citp_msex_layer_status_flags_bouncing,
3524
15
            { "Playback Bouncing", "citp.msex.layer.status.bouncing",
3525
15
            FT_BOOLEAN, 32,
3526
15
            NULL, 0x00000008,
3527
15
            NULL, HFILL }
3528
15
        },
3529
15
        { &hf_citp_msex_layer_status_flags_random,
3530
15
            { "Playback Random", "citp.msex.layer.status.random",
3531
15
            FT_BOOLEAN, 32,
3532
15
            NULL, 0x00000010,
3533
15
            NULL, HFILL }
3534
15
        },
3535
15
        { &hf_citp_msex_layer_status_flags_paused,
3536
15
            { "Paused", "citp.msex.layer.status.paused",
3537
15
            FT_BOOLEAN, 32,
3538
15
            NULL, 0x00000020,
3539
15
            NULL, HFILL }
3540
15
        },
3541
3542
15
        { &hf_citp_msex_library_count,
3543
15
            { "Library Count", "citp.msex.library_count",
3544
15
            FT_UINT8, BASE_DEC | BASE_SPECIAL_VALS,
3545
15
            VALS(citp_all_libraries_val_str), 0x0,
3546
15
            NULL, HFILL }
3547
15
        },
3548
15
        { &hf_citp_msex_libraries,
3549
15
            { "Libraries", "citp.msex.libraries",
3550
15
            FT_NONE, BASE_NONE,
3551
15
            NULL, 0x0,
3552
15
            NULL, HFILL }
3553
15
        },
3554
15
        { &hf_citp_msex_library,
3555
15
            { "Library", "citp.msex.library",
3556
15
            FT_NONE, BASE_NONE,
3557
15
            NULL, 0x0,
3558
15
            NULL, HFILL }
3559
15
        },
3560
15
        { &hf_citp_msex_library_type,
3561
15
            { "Library Type", "citp.msex.library.type",
3562
15
            FT_UINT8, BASE_DEC,
3563
15
            VALS(citp_msex_library_types), 0x0,
3564
15
            NULL, HFILL }
3565
15
        },
3566
15
        { &hf_citp_msex_library_number,
3567
15
            { "Library Number", "citp.msex.library.number",
3568
15
            FT_UINT8, BASE_DEC,
3569
15
            NULL, 0x0,
3570
15
            NULL, HFILL }
3571
15
        },
3572
15
        { &hf_citp_msex_library_id,
3573
15
            { "Library Id", "citp.msex.library.id",
3574
15
            FT_NONE, BASE_NONE,
3575
15
            NULL, 0x0,
3576
15
            NULL, HFILL }
3577
15
        },
3578
15
        { &hf_citp_msex_library_id_level,
3579
15
            { "Level", "citp.msex.library.id.level",
3580
15
            FT_UINT8, BASE_DEC,
3581
15
            NULL, 0x0,
3582
15
            NULL, HFILL }
3583
15
        },
3584
15
        { &hf_citp_msex_library_id_level_1,
3585
15
            { "Level 1 Index", "citp.msex.library.id.level_1",
3586
15
            FT_UINT8, BASE_DEC,
3587
15
            NULL, 0x0,
3588
15
            NULL, HFILL }
3589
15
        },
3590
15
        { &hf_citp_msex_library_id_level_2,
3591
15
            { "Level 2 Index", "citp.msex.library.id.level_2",
3592
15
            FT_UINT8, BASE_DEC,
3593
15
            NULL, 0x0,
3594
15
            NULL, HFILL }
3595
15
        },
3596
15
        { &hf_citp_msex_library_id_level_3,
3597
15
            { "Level 3 Index", "citp.msex.library.id.level_3",
3598
15
            FT_UINT8, BASE_DEC,
3599
15
            NULL, 0x0,
3600
15
            NULL, HFILL }
3601
15
        },
3602
15
        { &hf_citp_msex_library_parent_id,
3603
15
            { "Parent Library Id", "citp.msex.library.parent_id",
3604
15
            FT_NONE, BASE_NONE,
3605
15
            NULL, 0x0,
3606
15
            NULL, HFILL }
3607
15
        },
3608
15
        { &hf_citp_msex_library_serial_number,
3609
15
            { "Serial Number", "citp.msex.library.serial_number",
3610
15
            FT_UINT32, BASE_DEC,
3611
15
            NULL, 0x0,
3612
15
            NULL, HFILL }
3613
15
        },
3614
15
        { &hf_citp_msex_library_dmx_min,
3615
15
            { "DMX Rage Min", "citp.msex.library.dmx_min",
3616
15
            FT_UINT8, BASE_DEC,
3617
15
            NULL, 0x0,
3618
15
            NULL, HFILL }
3619
15
        },
3620
15
        { &hf_citp_msex_library_dmx_max,
3621
15
            { "DMX Rage Max", "citp.msex.library.dmx_max",
3622
15
            FT_UINT8, BASE_DEC,
3623
15
            NULL, 0x0,
3624
15
            NULL, HFILL }
3625
15
        },
3626
15
        { &hf_citp_msex_library_name,
3627
15
            { "Name", "citp.msex.library.name",
3628
15
            FT_STRINGZ, BASE_NONE,
3629
15
            NULL, 0x0,
3630
15
            NULL, HFILL }
3631
15
        },
3632
15
        { &hf_citp_msex_library_sub_count,
3633
15
            { "Sub-Library Count", "citp.msex.library.sub_count",
3634
15
            FT_UINT16, BASE_DEC,
3635
15
            NULL, 0x0,
3636
15
            NULL, HFILL }
3637
15
        },
3638
15
        { &hf_citp_msex_library_element_count,
3639
15
            { "Element Count", "citp.msex.library.element_count",
3640
15
            FT_UINT16, BASE_DEC,
3641
15
            NULL, 0x0,
3642
15
            NULL, HFILL }
3643
15
        },
3644
15
        { &hf_citp_msex_library_update_flags,
3645
15
            { "Updates", "citp.msex.library.update_flags",
3646
15
            FT_UINT8, BASE_HEX,
3647
15
            NULL, 0x0,
3648
15
            NULL, HFILL }
3649
15
        },
3650
15
        { &hf_citp_msex_library_update_flags_elements_updated,
3651
15
            { "Elements Updated", "citp.msex.library.update_flags.elements_updated",
3652
15
            FT_BOOLEAN, 8,
3653
15
            NULL, 0x01,
3654
15
            NULL, HFILL }
3655
15
        },
3656
15
        { &hf_citp_msex_library_update_flags_elements_added_removed,
3657
15
            { "Elements Added/Removed", "citp.msex.library.update_flags.elements_added_removed",
3658
15
            FT_BOOLEAN, 8,
3659
15
            NULL, 0x02,
3660
15
            NULL, HFILL }
3661
15
        },
3662
15
        { &hf_citp_msex_library_update_flags_subs_updated,
3663
15
            { "Sub-Libraries Updated", "citp.msex.library.update_flags.subs_updated",
3664
15
            FT_BOOLEAN, 8,
3665
15
            NULL, 0x04,
3666
15
            NULL, HFILL }
3667
15
        },
3668
15
        { &hf_citp_msex_library_update_flags_subs_added_removed,
3669
15
            { "Sub-Libraries Added/Removed", "citp.msex.library.update_flags.subs_removed",
3670
15
            FT_BOOLEAN, 8,
3671
15
            NULL, 0x08,
3672
15
            NULL, HFILL }
3673
15
        },
3674
15
        { &hf_citp_msex_library_update_flags_all_elements,
3675
15
            { "All Elements Affected", "citp.msex.library.update_flags.all_elements",
3676
15
            FT_BOOLEAN, 8,
3677
15
            NULL, 0x10,
3678
15
            NULL, HFILL }
3679
15
        },
3680
15
        { &hf_citp_msex_library_update_flags_all_subs,
3681
15
            { "All Sub-Libraries Affected", "citp.msex.library.update_flags.all_subs",
3682
15
            FT_BOOLEAN, 8,
3683
15
            NULL, 0x20,
3684
15
            NULL, HFILL }
3685
15
        },
3686
15
        { &hf_citp_msex_library_affected_elements,
3687
15
            { "Affected Elements", "citp.msex.library.affected_elements",
3688
15
            FT_BYTES, BASE_NONE,
3689
15
            NULL, 0x0,
3690
15
            NULL, HFILL }
3691
15
        },
3692
15
        { &hf_citp_msex_library_affected_subs,
3693
15
            { "Affected Sub-Libraries", "citp.msex.library.affected_subs",
3694
15
            FT_BYTES, BASE_NONE,
3695
15
            NULL, 0x0,
3696
15
            NULL, HFILL }
3697
15
        },
3698
15
        { &hf_citp_msex_library_affected_element,
3699
15
            { "Element", "citp.msex.library.affected_elements.element",
3700
15
            FT_UINT8, BASE_DEC,
3701
15
            NULL, 0x0,
3702
15
            NULL, HFILL }
3703
15
        },
3704
15
        { &hf_citp_msex_library_affected_sub,
3705
15
            { "Sub-Library", "citp.msex.library.affected_subs.sub",
3706
15
            FT_UINT8, BASE_DEC,
3707
15
            NULL, 0x0,
3708
15
            NULL, HFILL }
3709
15
        },
3710
3711
15
        { &hf_citp_msex_element_count,
3712
15
            { "Element Count", "citp.msex.element_count",
3713
15
            FT_UINT8, BASE_DEC | BASE_SPECIAL_VALS,
3714
15
            VALS(citp_all_elements_val_str), 0x0,
3715
15
            NULL, HFILL }
3716
15
        },
3717
15
        { &hf_citp_msex_elements,
3718
15
            { "Elements", "citp.msex.elements",
3719
15
            FT_NONE, BASE_NONE,
3720
15
            NULL, 0x0,
3721
15
            NULL, HFILL }
3722
15
        },
3723
15
        { &hf_citp_msex_element,
3724
15
            { "Element", "citp.msex.element",
3725
15
            FT_NONE, BASE_NONE,
3726
15
            NULL, 0x0,
3727
15
            NULL, HFILL }
3728
15
        },
3729
15
        { &hf_citp_msex_element_number,
3730
15
            { "Element Number", "citp.msex.element.number",
3731
15
            FT_UINT8, BASE_DEC,
3732
15
            NULL, 0x0,
3733
15
            NULL, HFILL }
3734
15
        },
3735
15
        { &hf_citp_msex_element_serial_number,
3736
15
            { "Serial Number", "citp.msex.element.serial_number",
3737
15
            FT_UINT32, BASE_DEC,
3738
15
            NULL, 0x0,
3739
15
            NULL, HFILL }
3740
15
        },
3741
15
        { &hf_citp_msex_element_dmx_min,
3742
15
            { "DMX Rage Min", "citp.msex.element.dmx_min",
3743
15
            FT_UINT8, BASE_DEC,
3744
15
            NULL, 0x0,
3745
15
            NULL, HFILL }
3746
15
        },
3747
15
        { &hf_citp_msex_element_dmx_max,
3748
15
            { "DMX Rage Max", "citp.msex.element.dmx_max",
3749
15
            FT_UINT8, BASE_DEC,
3750
15
            NULL, 0x0,
3751
15
            NULL, HFILL }
3752
15
        },
3753
15
        { &hf_citp_msex_element_name,
3754
15
            { "Name", "citp.msex.element.name",
3755
15
            FT_STRINGZ, BASE_NONE,
3756
15
            NULL, 0x0,
3757
15
            NULL, HFILL }
3758
15
        },
3759
15
        { &hf_citp_msex_element_version_timestamp,
3760
15
            { "Version Timestamp", "citp.msex.element.version_timestamp",
3761
15
            FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC,
3762
15
            NULL, 0x0,
3763
15
            NULL, HFILL }
3764
15
        },
3765
15
        { &hf_citp_msex_element_position,
3766
15
            { "Position", "citp.msex.element.position",
3767
15
            FT_UINT32, BASE_DEC,
3768
15
            NULL, 0x0,
3769
15
            NULL, HFILL }
3770
15
        },
3771
15
        { &hf_citp_msex_element_width,
3772
15
            { "Width", "citp.msex.element.width",
3773
15
            FT_UINT16, BASE_DEC,
3774
15
            NULL, 0x0,
3775
15
            NULL, HFILL }
3776
15
        },
3777
15
        { &hf_citp_msex_element_height,
3778
15
            { "Height", "citp.msex.element.height",
3779
15
            FT_UINT16, BASE_DEC,
3780
15
            NULL, 0x0,
3781
15
            NULL, HFILL }
3782
15
        },
3783
15
        { &hf_citp_msex_element_length,
3784
15
            { "Length", "citp.msex.element.length",
3785
15
            FT_UINT32, BASE_DEC,
3786
15
            NULL, 0x0,
3787
15
            NULL, HFILL }
3788
15
        },
3789
15
        { &hf_citp_msex_element_fps,
3790
15
            { "FPS", "citp.msex.element.fps",
3791
15
            FT_UINT8, BASE_DEC,
3792
15
            NULL, 0x0,
3793
15
            NULL, HFILL }
3794
15
        },
3795
15
        { &hf_citp_msex_element_parameter_count,
3796
15
            { "Parameter Count", "citp.msex.element.parameter_count",
3797
15
            FT_UINT8, BASE_DEC,
3798
15
            NULL, 0x0,
3799
15
            NULL, HFILL }
3800
15
        },
3801
15
        { &hf_citp_msex_element_parameter_names,
3802
15
            { "Parameter Names", "citp.msex.element.parameter_names",
3803
15
            FT_NONE, BASE_NONE,
3804
15
            NULL, 0x0,
3805
15
            NULL, HFILL }
3806
15
        },
3807
15
        { &hf_citp_msex_element_parameter_name,
3808
15
            { "Parameter", "citp.msex.element.parameter",
3809
15
            FT_STRINGZ, BASE_NONE,
3810
15
            NULL, 0x0,
3811
15
            NULL, HFILL }
3812
15
        },
3813
3814
15
        { &hf_citp_msex_thumbnail_format_count,
3815
15
            { "Thumbnail Format Count", "citp.msex.thumbnail_format_count",
3816
15
            FT_UINT8, BASE_DEC,
3817
15
            NULL, 0x0,
3818
15
            NULL, HFILL }
3819
15
        },
3820
15
        { &hf_citp_msex_thumbnail_formats,
3821
15
            { "Thumbnail Formats", "citp.msex.thumbnail_formats",
3822
15
            FT_NONE, BASE_NONE,
3823
15
            NULL, 0x0,
3824
15
            NULL, HFILL }
3825
15
        },
3826
15
        { &hf_citp_msex_thumbnail_format,
3827
15
            { "Thumbnail Format", "citp.msex.thumbnail.format",
3828
15
            FT_STRING, BASE_NONE,
3829
15
            NULL, 0x0,
3830
15
            NULL, HFILL }
3831
15
        },
3832
15
        { &hf_citp_msex_thumbnail_width,
3833
15
            { "Thumbnail Width", "citp.msex.thumbnail.width",
3834
15
            FT_UINT16, BASE_DEC,
3835
15
            NULL, 0x0,
3836
15
            NULL, HFILL }
3837
15
        },
3838
15
        { &hf_citp_msex_thumbnail_height,
3839
15
            { "Thumbnail Height", "citp.msex.thumbnail.height",
3840
15
            FT_UINT16, BASE_DEC,
3841
15
            NULL, 0x0,
3842
15
            NULL, HFILL }
3843
15
        },
3844
15
        { &hf_citp_msex_thumbnail_flags,
3845
15
            { "Thumbnail Flags", "citp.msex.thumbnail.flags",
3846
15
            FT_UINT8, BASE_HEX,
3847
15
            NULL, 0x0,
3848
15
            NULL, HFILL }
3849
15
        },
3850
15
        { &hf_citp_msex_thumbnail_flags_preserve_aspect,
3851
15
            { "Preserve Aspect Ratio", "citp.msex.thumbnail.flags.preserve_aspect",
3852
15
            FT_BOOLEAN, 8,
3853
15
            NULL, 0x01,
3854
15
            NULL, HFILL }
3855
15
        },
3856
15
        { &hf_citp_msex_thumbnail_buffer_size,
3857
15
            { "Thumbnail Buffer Size", "citp.msex.thumbnail.buffer_size",
3858
15
            FT_UINT16, BASE_DEC,
3859
15
            NULL, 0x0,
3860
15
            NULL, HFILL }
3861
15
        },
3862
15
        { &hf_citp_msex_thumbnail_buffer,
3863
15
            { "Thumbnail Buffer", "citp.msex.thumbnail.buffer",
3864
15
            FT_BYTES, BASE_NONE,
3865
15
            NULL, 0x0,
3866
15
            NULL, HFILL }
3867
15
        },
3868
3869
15
        { &hf_citp_msex_source_count,
3870
15
            { "Source Count", "citp.msex.source_count",
3871
15
            FT_UINT16, BASE_DEC,
3872
15
            NULL, 0x0,
3873
15
            NULL, HFILL }
3874
15
        },
3875
15
        { &hf_citp_msex_sources,
3876
15
            { "Sources", "citp.msex.sources",
3877
15
            FT_NONE, BASE_NONE,
3878
15
            NULL, 0x0,
3879
15
            NULL, HFILL }
3880
15
        },
3881
15
        { &hf_citp_msex_source,
3882
15
            { "Source", "citp.msex.source",
3883
15
            FT_NONE, BASE_NONE,
3884
15
            NULL, 0x0,
3885
15
            NULL, HFILL }
3886
15
        },
3887
15
        { &hf_citp_msex_source_server_uuid,
3888
15
            { "Media Server UUID", "citp.msex.source.uuid",
3889
15
            FT_STRING, BASE_NONE,
3890
15
            NULL, 0x0,
3891
15
            NULL, HFILL }
3892
15
        },
3893
15
        { &hf_citp_msex_source_id,
3894
15
            { "Source Id", "citp.msex.source.id",
3895
15
            FT_UINT16, BASE_DEC,
3896
15
            NULL, 0x0,
3897
15
            NULL, HFILL }
3898
15
        },
3899
15
        { &hf_citp_msex_source_name,
3900
15
            { "Source Name", "citp.msex.source.name",
3901
15
            FT_STRINGZ, BASE_NONE,
3902
15
            NULL, 0x0,
3903
15
            NULL, HFILL }
3904
15
        },
3905
15
        { &hf_citp_msex_source_physical_output,
3906
15
            { "Physical Output", "citp.msex.source.physical_output",
3907
15
            FT_UINT8, BASE_DEC,
3908
15
            NULL, 0x0,
3909
15
            NULL, HFILL }
3910
15
        },
3911
15
        { &hf_citp_msex_source_layer_number,
3912
15
            { "Layer Number", "citp.msex.source.layer_number",
3913
15
            FT_UINT8, BASE_DEC,
3914
15
            NULL, 0x0,
3915
15
            NULL, HFILL }
3916
15
        },
3917
15
        { &hf_citp_msex_source_flags,
3918
15
            { "Flags", "citp.msex.source.flags",
3919
15
            FT_UINT16, BASE_HEX,
3920
15
            NULL, 0x0,
3921
15
            NULL, HFILL }
3922
15
        },
3923
15
        { &hf_citp_msex_source_flags_without_effects,
3924
15
            { "Without Effects", "citp.msex.source.flags.without_effects",
3925
15
            FT_BOOLEAN, 16,
3926
15
            NULL, 0x0001,
3927
15
            NULL, HFILL }
3928
15
        },
3929
15
        { &hf_citp_msex_source_width,
3930
15
            { "Width", "citp.msex.source.width",
3931
15
            FT_UINT16, BASE_DEC,
3932
15
            NULL, 0x0,
3933
15
            NULL, HFILL }
3934
15
        },
3935
15
        { &hf_citp_msex_source_height,
3936
15
            { "Height", "citp.msex.source.height",
3937
15
            FT_UINT16, BASE_DEC,
3938
15
            NULL, 0x0,
3939
15
            NULL, HFILL }
3940
15
        },
3941
3942
15
        { &hf_citp_msex_stream_format_count,
3943
15
            { "Stream Format Count", "citp.msex.stream_format_count",
3944
15
            FT_UINT8, BASE_DEC,
3945
15
            NULL, 0x0,
3946
15
            NULL, HFILL }
3947
15
        },
3948
15
        { &hf_citp_msex_stream_formats,
3949
15
            { "Stream Formats", "citp.msex.stream_formats",
3950
15
            FT_NONE, BASE_NONE,
3951
15
            NULL, 0x0,
3952
15
            NULL, HFILL }
3953
15
        },
3954
15
        { &hf_citp_msex_stream_format,
3955
15
            { "Stream Format", "citp.msex.stream.format",
3956
15
            FT_STRING, BASE_NONE,
3957
15
            NULL, 0x0,
3958
15
            NULL, HFILL }
3959
15
        },
3960
15
        { &hf_citp_msex_stream_width,
3961
15
            { "Width", "citp.msex.stream.width",
3962
15
            FT_UINT16, BASE_DEC,
3963
15
            NULL, 0x0,
3964
15
            NULL, HFILL }
3965
15
        },
3966
15
        { &hf_citp_msex_stream_height,
3967
15
            { "Height", "citp.msex.stream.height",
3968
15
            FT_UINT16, BASE_DEC,
3969
15
            NULL, 0x0,
3970
15
            NULL, HFILL }
3971
15
        },
3972
15
        { &hf_citp_msex_stream_fps,
3973
15
            { "FPS", "citp.msex.stream.fps",
3974
15
            FT_UINT8, BASE_DEC,
3975
15
            NULL, 0x0,
3976
15
            NULL, HFILL }
3977
15
        },
3978
15
        { &hf_citp_msex_stream_timeout,
3979
15
            { "Timeout", "citp.msex.stream.timeout",
3980
15
            FT_UINT8, BASE_DEC,
3981
15
            NULL, 0x0,
3982
15
            NULL, HFILL }
3983
15
        },
3984
3985
15
        { &hf_citp_msex_frame_buffer_size,
3986
15
            { "Frame Buffer Size", "citp.msex.frame.buffer_size",
3987
15
            FT_UINT16, BASE_DEC,
3988
15
            NULL, 0x0,
3989
15
            NULL, HFILL }
3990
15
        },
3991
15
        { &hf_citp_msex_frame_buffer,
3992
15
            { "Frame Buffer", "citp.msex.frame.buffer",
3993
15
            FT_BYTES, BASE_NONE,
3994
15
            NULL, 0x0,
3995
15
            NULL, HFILL }
3996
15
        },
3997
15
        { &hf_citp_msex_frame_index,
3998
15
            { "Frame Index", "citp.msex.frame.index",
3999
15
            FT_UINT32, BASE_DEC,
4000
15
            NULL, 0x0,
4001
15
            NULL, HFILL }
4002
15
        },
4003
15
        { &hf_citp_msex_frame_fragment,
4004
15
            { "Frame Fragment Preamble", "citp.msex.frame.fragment",
4005
15
            FT_NONE, BASE_NONE,
4006
15
            NULL, 0x0,
4007
15
            NULL, HFILL }
4008
15
        },
4009
15
        { &hf_citp_msex_frame_fragment_count,
4010
15
            { "Fragment Count", "citp.msex.frame.fragment.count",
4011
15
            FT_UINT16, BASE_DEC,
4012
15
            NULL, 0x0,
4013
15
            NULL, HFILL }
4014
15
        },
4015
15
        { &hf_citp_msex_frame_fragment_index,
4016
15
            { "Fragment Index", "citp.msex.frame.fragment.index",
4017
15
            FT_UINT16, BASE_DEC,
4018
15
            NULL, 0x0,
4019
15
            NULL, HFILL }
4020
15
        },
4021
15
        { &hf_citp_msex_frame_fragment_byte_offset,
4022
15
            { "Fragment Byte Offset", "citp.msex.frame.fragment.byte_offset",
4023
15
            FT_UINT32, BASE_HEX,
4024
15
            NULL, 0x0,
4025
15
            NULL, HFILL }
4026
15
        },
4027
15
    };
4028
4029
    /* Setup protocol subtree array */
4030
15
    static int *ett[] = {
4031
15
        &ett_citp,
4032
4033
15
        &ett_citp_pinf,
4034
4035
15
        &ett_citp_sdmx,
4036
15
        &ett_citp_sdmx_capabilities,
4037
4038
15
        &ett_citp_fptc,
4039
15
        &ett_citp_fptc_fixture_identifiers,
4040
15
        &ett_citp_fptc_content_hint,
4041
4042
15
        &ett_citp_fsel,
4043
15
        &ett_citp_fsel_fixture_identifiers,
4044
4045
15
        &ett_citp_finf,
4046
15
        &ett_citp_finf_fixture_identifiers,
4047
4048
15
        &ett_citp_caex,
4049
15
        &ett_citp_caex_view_pos,
4050
15
        &ett_citp_caex_view_focus,
4051
15
        &ett_citp_caex_cue_option,
4052
15
        &ett_citp_caex_laser_point,
4053
15
        &ett_citp_caex_laser_point_colour,
4054
15
        &ett_citp_caex_show_fixtures,
4055
15
        &ett_citp_caex_show_fixture,
4056
15
        &ett_citp_caex_show_fixture_identifier,
4057
15
        &ett_citp_caex_show_fixture_pos,
4058
15
        &ett_citp_caex_show_fixture_angles,
4059
15
        &ett_citp_caex_show_fixture_changed_fields,
4060
4061
15
        &ett_citp_msex,
4062
15
        &ett_citp_msex_supported_versions,
4063
15
        &ett_citp_msex_supported_version,
4064
15
        &ett_citp_msex_supported_library_types,
4065
15
        &ett_citp_msex_libraries,
4066
15
        &ett_citp_msex_library,
4067
15
        &ett_citp_msex_elements,
4068
15
        &ett_citp_msex_element,
4069
15
        &ett_citp_msex_element_parameter_names,
4070
15
        &ett_citp_msex_sources,
4071
15
        &ett_citp_msex_source,
4072
15
        &ett_citp_msex_layers,
4073
15
        &ett_citp_msex_layer,
4074
15
        &ett_citp_msex_layer_status_flags,
4075
15
        &ett_citp_msex_thumbnail_formats,
4076
15
        &ett_citp_msex_stream_formats,
4077
15
        &ett_citp_msex_library_update_flags,
4078
15
        &ett_citp_msex_thumbnail_flags,
4079
15
        &ett_citp_msex_source_flags,
4080
15
        &ett_citp_msex_library_id,
4081
15
        &ett_citp_msex_library_parent_id,
4082
15
        &ett_citp_msex_frame_fragment,
4083
15
        &ett_citp_msex_library_affected_elements,
4084
15
        &ett_citp_msex_library_affected_subs,
4085
15
    };
4086
4087
15
    static ei_register_info ei[] = {
4088
15
        { &ei_citp_content_type, { "citp.content_type.unknown", PI_PROTOCOL, PI_ERROR, "Unknown CITP content type", EXPFILL }},
4089
15
        { &ei_citp_message_size, { "citp.message_size.mismatch", PI_PROTOCOL, PI_WARN, "Mismatch between reported message size and consumed data", EXPFILL }},
4090
15
    };
4091
4092
15
    static ei_register_info ei_pinf[] = {
4093
15
        { &ei_citp_pinf_content_type,  { "citp.pinf.content_type.invalid", PI_PROTOCOL, PI_ERROR, "Invalid PINF content type", EXPFILL }},
4094
15
    };
4095
15
    static ei_register_info ei_sdmx[] = {
4096
15
        { &ei_citp_sdmx_content_type,  { "citp.sdmx.content_type.invalid", PI_PROTOCOL, PI_ERROR, "Invalid SDMX content type", EXPFILL }},
4097
15
    };
4098
15
    static ei_register_info ei_fptc[] = {
4099
15
        { &ei_citp_fptc_content_type,  { "citp.fptc.content_type.invalid", PI_PROTOCOL, PI_ERROR, "Invalid FPTC content type", EXPFILL }},
4100
15
    };
4101
15
    static ei_register_info ei_fsel[] = {
4102
15
        { &ei_citp_fsel_content_type,  { "citp.fsel.content_type.invalid", PI_PROTOCOL, PI_ERROR, "Invalid FSEL content type", EXPFILL }},
4103
15
    };
4104
15
    static ei_register_info ei_finf[] = {
4105
15
        { &ei_citp_finf_content_type,  { "citp.finf.content_type.invalid", PI_PROTOCOL, PI_ERROR, "Invalid FINF content type", EXPFILL }},
4106
15
    };
4107
15
    static ei_register_info ei_caex[] = {
4108
15
        { &ei_citp_caex_content_code,  { "citp.caex.content_code.invalid", PI_PROTOCOL, PI_ERROR, "Invalid CAEX content code", EXPFILL }},
4109
15
        { &ei_citp_caex_fixture_ident, { "citp.caex.show.fixture.identifier.type.unknown", PI_PROTOCOL, PI_ERROR, "Unknown fixture identifier type", EXPFILL }},
4110
15
        { &ei_citp_caex_view_format,   { "citp.caex.live_view.format.invalid", PI_PROTOCOL, PI_ERROR, "Invalid live-view image format. Must be JPEG", EXPFILL }},
4111
15
    };
4112
15
    static ei_register_info ei_msex[] = {
4113
15
        { &ei_citp_msex_content_type,  { "citp.msex.content_type.invalid", PI_PROTOCOL, PI_ERROR, "Invalid MSEX content type", EXPFILL }},
4114
15
        { &ei_citp_msex_version,       { "citp.msex.version.unknown", PI_PROTOCOL, PI_WARN, "Unrecognised MSEX version", EXPFILL }},
4115
15
        { &ei_citp_msex_thumb_format,  { "citp.msex.thumbnail.format.invalid", PI_PROTOCOL, PI_ERROR, "Invalid thumbnail format. Must be RGB8, JPEG or PNG", EXPFILL }},
4116
15
        { &ei_citp_msex_stream_format, { "citp.msex.stream.format.invalid", PI_PROTOCOL, PI_ERROR, "Invalid stream format. Must be RGB8, JPEG, PNG, fJPG or fPNG", EXPFILL }},
4117
15
    };
4118
4119
15
    proto_citp = proto_register_protocol("Controller Interface Transport Protocol", "CITP", "citp");
4120
4121
15
    proto_register_field_array(proto_citp, hf, array_length(hf));
4122
15
    proto_register_subtree_array(ett, array_length(ett));
4123
15
    expert_register_field_array(expert_register_protocol(proto_citp), ei, array_length(ei));
4124
4125
15
    citp_handle = register_dissector_with_description (
4126
15
        "citp",          /* dissector name           */
4127
15
        "Controller Interface Transport Protocol", /* dissector description    */
4128
15
        dissect_citp,    /* dissector function       */
4129
15
        proto_citp       /* protocol being dissected */
4130
15
    );
4131
15
    citp_tcp_handle = create_dissector_handle(dissect_citp_tcp, proto_citp);
4132
4133
15
    content_type_table = register_dissector_table("citp.content_type", "CITP Content Type", proto_citp, FT_UINT32, BASE_HEX);
4134
15
    encryption_id_table = register_dissector_table("citp.sdmx.encryption_identifier", "SDMX Encryption Id", proto_citp, FT_STRING, STRING_CASE_INSENSITIVE);
4135
4136
15
    proto_citp_pinf = proto_register_protocol("CITP Peer Information",        "CITP/PINF", "citp.pinf");
4137
15
    proto_citp_sdmx = proto_register_protocol("CITP Send DMX",                "CITP/SDMX", "citp.sdmx");
4138
15
    proto_citp_fptc = proto_register_protocol("CITP Fixture Patch",           "CITP/FPTC", "citp.fptc");
4139
15
    proto_citp_fsel = proto_register_protocol("CITP Fixture Selection",       "CITP/FSEL", "citp.fsel");
4140
15
    proto_citp_finf = proto_register_protocol("CITP Fixture Information",     "CITP/FINF", "citp.finf");
4141
15
    proto_citp_caex = proto_register_protocol("CITP Capture Extensions",      "CITP/CAEX", "citp.caex");
4142
15
    proto_citp_msex = proto_register_protocol("CITP Media Server Extensions", "CITP/MSEX", "citp.msex");
4143
4144
15
    proto_register_field_array(proto_citp_pinf, hf_pinf, array_length(hf_pinf));
4145
15
    proto_register_field_array(proto_citp_sdmx, hf_sdmx, array_length(hf_sdmx));
4146
15
    proto_register_field_array(proto_citp_fptc, hf_fptc, array_length(hf_fptc));
4147
15
    proto_register_field_array(proto_citp_fsel, hf_fsel, array_length(hf_fsel));
4148
15
    proto_register_field_array(proto_citp_finf, hf_finf, array_length(hf_finf));
4149
15
    proto_register_field_array(proto_citp_caex, hf_caex, array_length(hf_caex));
4150
15
    proto_register_field_array(proto_citp_msex, hf_msex, array_length(hf_msex));
4151
4152
15
    expert_register_field_array(expert_register_protocol(proto_citp_pinf), ei_pinf, array_length(ei_pinf));
4153
15
    expert_register_field_array(expert_register_protocol(proto_citp_sdmx), ei_sdmx, array_length(ei_sdmx));
4154
15
    expert_register_field_array(expert_register_protocol(proto_citp_fptc), ei_fptc, array_length(ei_fptc));
4155
15
    expert_register_field_array(expert_register_protocol(proto_citp_fsel), ei_fsel, array_length(ei_fsel));
4156
15
    expert_register_field_array(expert_register_protocol(proto_citp_finf), ei_finf, array_length(ei_finf));
4157
15
    expert_register_field_array(expert_register_protocol(proto_citp_caex), ei_caex, array_length(ei_caex));
4158
15
    expert_register_field_array(expert_register_protocol(proto_citp_msex), ei_msex, array_length(ei_msex));
4159
15
}
4160
4161
/******************************************************************************/
4162
/* Register handoff                                                           */
4163
void
4164
proto_reg_handoff_citp(void)
4165
15
{
4166
15
    dissector_add_uint_range_with_preference("udp.port", CITP_PORTS, citp_handle);
4167
4168
15
    heur_dissector_add("tcp", dissect_citp_heur_tcp, "CITP over TCP", "citp_tcp", proto_citp, HEURISTIC_ENABLE);
4169
4170
15
    dissector_add_uint("citp.content_type", CITP_PINF, create_dissector_handle(dissect_pinf, proto_citp_pinf));
4171
15
    dissector_add_uint("citp.content_type", CITP_SDMX, create_dissector_handle(dissect_sdmx, proto_citp_sdmx));
4172
15
    dissector_add_uint("citp.content_type", CITP_FPTC, create_dissector_handle(dissect_fptc, proto_citp_fptc));
4173
15
    dissector_add_uint("citp.content_type", CITP_FSEL, create_dissector_handle(dissect_fsel, proto_citp_fsel));
4174
15
    dissector_add_uint("citp.content_type", CITP_FINF, create_dissector_handle(dissect_finf, proto_citp_finf));
4175
15
    dissector_add_uint("citp.content_type", CITP_CAEX, create_dissector_handle(dissect_caex, proto_citp_caex));
4176
15
    dissector_add_uint("citp.content_type", CITP_MSEX, create_dissector_handle(dissect_msex, proto_citp_msex));
4177
4178
15
    dmx_chan_handle = find_dissector_add_dependency("dmx-chan", proto_citp);
4179
15
    jpeg_handle = find_dissector_add_dependency("image-jfif", proto_citp);
4180
15
    png_handle = find_dissector_add_dependency("png", proto_citp);
4181
15
}
4182
4183
/*
4184
 * Editor modelines
4185
 *
4186
 * Local Variables:
4187
 * c-basic-offset: 2
4188
 * tab-width: 8
4189
 * indent-tabs-mode: nil
4190
 * End:
4191
 *
4192
 * ex: set shiftwidth=2 tabstop=8 expandtab:
4193
 * :indentSize=2:tabSize=8:noTabs=true:
4194
 */