2 * Routines for DVB Application Information Table (AIT) dissection
3 * Copyright 2012-2013, Martin Kaiser <martin@kaiser.cx>
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 /* This dissector processes a DVB Application Information Table (AIT) as
27 * defined in ETSI TS 102 809. */
32 #include <epan/packet.h>
34 #include "packet-mpeg-sect.h"
35 #include "packet-mpeg-descriptor.h"
37 void proto_register_dvb_ait(void);
38 void proto_reg_handoff_dvb_ait(void);
40 static int proto_dvb_ait
= -1;
42 static gint ett_dvb_ait
= -1;
43 static gint ett_dvb_ait_descr
= -1;
44 static gint ett_dvb_ait_app
= -1;
46 static int hf_dvb_ait_test_app_flag
= -1;
47 static int hf_dvb_ait_app_type
= -1;
48 static int hf_dvb_ait_version_number
= -1;
49 static int hf_dvb_ait_current_next_indicator
= -1;
50 static int hf_dvb_ait_section_number
= -1;
51 static int hf_dvb_ait_last_section_number
= -1;
52 static int hf_dvb_ait_descr_loop_len
= -1;
53 static int hf_dvb_ait_descr_tag
= -1;
54 static int hf_dvb_ait_descr_len
= -1;
55 static int hf_dvb_ait_descr_data
= -1;
56 static int hf_dvb_ait_descr_app_prof_len
= -1;
57 static int hf_dvb_ait_descr_app_prof
= -1;
58 static int hf_dvb_ait_descr_app_ver
= -1;
59 static int hf_dvb_ait_descr_app_svc_bound
= -1;
60 static int hf_dvb_ait_descr_app_vis
= -1;
61 static int hf_dvb_ait_descr_app_prio
= -1;
62 static int hf_dvb_ait_descr_app_trpt_proto_label
= -1;
63 static int hf_dvb_ait_descr_app_name_lang
= -1;
64 static int hf_dvb_ait_descr_app_name_name
= -1;
65 static int hf_dvb_ait_descr_trpt_proto_id
= -1;
66 static int hf_dvb_ait_descr_trpt_proto_label
= -1;
67 static int hf_dvb_ait_descr_trpt_sel_remote
= -1;
68 static int hf_dvb_ait_descr_trpt_sel_onid
= -1;
69 static int hf_dvb_ait_descr_trpt_sel_tsid
= -1;
70 static int hf_dvb_ait_descr_trpt_sel_svcid
= -1;
71 static int hf_dvb_ait_descr_trpt_sel_comp
= -1;
72 static int hf_dvb_ait_descr_trpt_sel_url_base
= -1;
73 static int hf_dvb_ait_descr_trpt_sel_url_ext_cnt
= -1;
74 static int hf_dvb_ait_descr_trpt_sel_url_ext
= -1;
75 static int hf_dvb_ait_descr_trpt_sel_bytes
= -1;
76 static int hf_dvb_ait_descr_sal_init_path
= -1;
77 static int hf_dvb_ait_app_loop_len
= -1;
78 static int hf_dvb_ait_org_id
= -1;
79 static int hf_dvb_ait_app_id
= -1;
80 static int hf_dvb_ait_app_ctrl_code
= -1;
82 #define DVB_AIT_TID 0x74
84 static const value_string app_ctrl_code
[] = {
85 { 0x01, "Autostart" },
92 { 0x08, "Playback autostart" },
96 /* tags of the descriptors defined in ETSI TS 102 809
97 some of these tags are conflicting with MPEG2 or DVB-SI definitions,
98 therefore these descriptors aren't supported by packet-mpeg-descriptor.c */
100 #define AIT_DESCR_APP 0x00
101 #define AIT_DESCR_APP_NAME 0x01
102 #define AIT_DESCR_TRPT_PROTO 0x02
103 #define AIT_DESCR_EXT_APP_AUTH 0x05
104 #define AIT_DESCR_APP_REC 0x06
105 #define AIT_DESCR_APP_ICO 0x0B
106 #define AIT_DESCR_APP_STOR 0x10
107 #define AIT_DESCR_GRA_CONST 0x14
108 #define AIT_DESCR_SIM_APP_LOC 0x15
109 #define AIT_DESCR_SIM_APP_BND 0x17
110 #define AIT_DESCR_APP_SIG 0x6F
112 static const value_string ait_descr_tag
[] = {
113 { AIT_DESCR_APP
, "Application descriptor" },
114 { AIT_DESCR_APP_NAME
, "Application name descriptor" },
115 { AIT_DESCR_TRPT_PROTO
, "Transport protocol descriptor" },
116 { AIT_DESCR_EXT_APP_AUTH
, "External application authorization descriptor" },
117 { AIT_DESCR_APP_REC
, "Application recording descriptor" },
118 { AIT_DESCR_APP_ICO
, "Application icons descriptor" },
119 { AIT_DESCR_APP_STOR
, "Application storage descriptor" },
120 { AIT_DESCR_GRA_CONST
, "Graphics constraints descriptor" },
121 { AIT_DESCR_SIM_APP_LOC
, "Simple application location descriptor" },
122 { AIT_DESCR_SIM_APP_BND
, "Simple application boundary descriptor" },
123 { AIT_DESCR_APP_SIG
, "Application signalling descriptor" },
127 #define TRPT_OBJ_CAROUSEL 0x0001
128 #define TRPT_HTTP 0x0003
130 static const value_string trpt_proto_id
[] = {
131 { TRPT_OBJ_CAROUSEL
, "Object Carousel" },
132 { TRPT_HTTP
, "Transport via HTTP" },
136 static const value_string app_vis
[] = {
137 { 0x0, "not visible" },
138 { 0x1, "not visible to users, only to applications" },
139 { 0x3, "fully visible" },
144 /* dissect the body of an application_descriptor
145 offset points to the start of the body,
146 i.e. to the first byte after the length field */
148 dissect_dvb_ait_app_desc_body(tvbuff_t
*tvb
, guint offset
,
149 guint8 body_len
, packet_info
*pinfo _U_
, proto_tree
*tree
)
151 guint offset_start
, offset_app_prof_start
;
153 guint8 ver_maj
, ver_min
, ver_mic
;
155 offset_start
= offset
;
157 app_prof_len
= tvb_get_guint8(tvb
, offset
);
158 proto_tree_add_item(tree
, hf_dvb_ait_descr_app_prof_len
,
159 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
161 offset_app_prof_start
= offset
;
162 while (offset
-offset_app_prof_start
< app_prof_len
) {
163 proto_tree_add_item(tree
, hf_dvb_ait_descr_app_prof
,
164 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
166 ver_maj
= tvb_get_guint8(tvb
, offset
);
167 ver_min
= tvb_get_guint8(tvb
, offset
+1);
168 ver_mic
= tvb_get_guint8(tvb
, offset
+2);
169 proto_tree_add_uint_format(tree
, hf_dvb_ait_descr_app_ver
,
170 tvb
, offset
, 3, ver_maj
<<16|ver_min
<<8|ver_mic
,
171 "Version %d.%d.%d", ver_maj
, ver_min
, ver_mic
);
174 proto_tree_add_item(tree
, hf_dvb_ait_descr_app_svc_bound
,
175 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
176 proto_tree_add_item(tree
, hf_dvb_ait_descr_app_vis
,
177 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
179 proto_tree_add_item(tree
, hf_dvb_ait_descr_app_prio
,
180 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
182 while (offset
-offset_start
< body_len
) {
183 proto_tree_add_item(tree
, hf_dvb_ait_descr_app_trpt_proto_label
,
184 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
187 return (gint
)(offset
-offset_start
);
192 dissect_dvb_ait_app_name_desc_body(tvbuff_t
*tvb
, guint offset
,
193 guint8 body_len
, packet_info
*pinfo _U_
, proto_tree
*tree
)
198 offset_start
= offset
;
199 while (offset
-offset_start
< body_len
) {
200 proto_tree_add_item(tree
, hf_dvb_ait_descr_app_name_lang
,
201 tvb
, offset
, 3, ENC_ASCII
|ENC_NA
);
203 len
= tvb_get_guint8(tvb
, offset
);
204 /* FT_UINT_STRING with 1 leading len byte */
205 proto_tree_add_item(tree
, hf_dvb_ait_descr_app_name_name
,
206 tvb
, offset
, 1, ENC_ASCII
|ENC_NA
);
210 return (gint
)(offset
-offset_start
);
215 dissect_dvb_ait_trpt_proto_desc_body(tvbuff_t
*tvb
, guint offset
,
216 guint8 body_len
, packet_info
*pinfo _U_
, proto_tree
*tree
)
220 gboolean remote_connection
;
222 offset_start
= offset
;
224 proto_id
= tvb_get_ntohs(tvb
, offset
);
225 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_proto_id
,
226 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
228 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_proto_label
,
229 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
231 if (offset
-offset_start
< body_len
) {
232 if (proto_id
== TRPT_OBJ_CAROUSEL
) {
233 remote_connection
= ((tvb_get_guint8(tvb
, offset
) & 0x80) == 0x80);
234 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_sel_remote
,
235 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
237 if (remote_connection
) {
238 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_sel_onid
,
239 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
241 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_sel_tsid
,
242 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
244 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_sel_svcid
,
245 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
248 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_sel_comp
,
249 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
252 else if (proto_id
== TRPT_HTTP
) {
253 guint8 url_base_len
, url_ext_cnt
, url_ext_len
, i
;
255 url_base_len
= tvb_get_guint8(tvb
, offset
);
256 /* FT_UINT_STRING with one leading length byte */
257 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_sel_url_base
,
258 tvb
, offset
, 1, ENC_ASCII
|ENC_NA
);
259 offset
+= 1+url_base_len
;
261 url_ext_cnt
= tvb_get_guint8(tvb
, offset
);
262 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_sel_url_ext_cnt
,
263 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
266 for (i
=0; i
<url_ext_cnt
; i
++) {
267 url_ext_len
= tvb_get_guint8(tvb
, offset
);
268 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_sel_url_ext
,
269 tvb
, offset
, 1, ENC_ASCII
|ENC_NA
);
270 offset
+= 1+url_ext_len
;
274 proto_tree_add_item(tree
, hf_dvb_ait_descr_trpt_sel_bytes
,
275 tvb
, offset
, offset_start
+body_len
-offset
, ENC_BIG_ENDIAN
);
276 offset
= offset_start
+body_len
;
280 return (gint
)(offset
-offset_start
);
285 dissect_dvb_ait_descriptor(tvbuff_t
*tvb
, guint offset
,
286 packet_info
*pinfo
, proto_tree
*tree
)
291 proto_item
*descr_tree_ti
= NULL
;
292 proto_tree
*descr_tree
= NULL
;
294 tag
= tvb_get_guint8(tvb
, offset
);
295 len
= tvb_get_guint8(tvb
, offset
+1);
297 /* if the descriptor is a special one that's defined in ETSI TS 102 809,
298 we dissect it ourselves
299 otherwise, we assume it's a generic DVB-SI descriptor and pass it
300 on to packet-mpeg-descriptor */
301 if (try_val_to_str(tag
, ait_descr_tag
)) {
303 offset_start
= offset
;
304 descr_tree_ti
= proto_tree_add_text(tree
, tvb
, offset_start
, len
+2,
305 "Descriptor Tag=0x%02x", tag
);
306 descr_tree
= proto_item_add_subtree(descr_tree_ti
, ett_dvb_ait_descr
);
308 proto_tree_add_item(descr_tree
, hf_dvb_ait_descr_tag
,
309 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
311 proto_tree_add_item(descr_tree
, hf_dvb_ait_descr_len
,
312 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
317 ret
= dissect_dvb_ait_app_desc_body(tvb
, offset
, len
,
322 case AIT_DESCR_APP_NAME
:
323 ret
= dissect_dvb_ait_app_name_desc_body(tvb
, offset
, len
,
328 case AIT_DESCR_TRPT_PROTO
:
329 ret
= dissect_dvb_ait_trpt_proto_desc_body(tvb
, offset
, len
,
334 case AIT_DESCR_SIM_APP_LOC
:
335 proto_tree_add_item(descr_tree
,
336 hf_dvb_ait_descr_sal_init_path
,
337 tvb
, offset
, len
, ENC_ASCII
|ENC_NA
);
341 proto_tree_add_item(descr_tree
, hf_dvb_ait_descr_data
,
342 tvb
, offset
, len
, ENC_NA
);
347 ret
= (gint
)(offset
-offset_start
);
350 ret
= (gint
)proto_mpeg_descriptor_dissect(tvb
, offset
, tree
);
357 dissect_dvb_ait(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *data _U_
)
360 proto_item
*ait_tree_ti
= NULL
, *app_tree_ti
= NULL
;
361 proto_tree
*ait_tree
= NULL
, *ait_app_tree
= NULL
;
362 gint offset_loop_start
, offset_inner_loop_start
, offset_app_start
;
363 guint16 descr_loop_len
, app_loop_len
;
368 col_set_str(pinfo
->cinfo
, COL_INFO
, "Application Information Table (AIT)");
371 ait_tree_ti
= proto_tree_add_protocol_format(tree
, proto_dvb_ait
,
372 tvb
, 0, -1, "Application Information Table (AIT)");
373 ait_tree
= proto_item_add_subtree(ait_tree_ti
, ett_dvb_ait
);
376 offset
+= packet_mpeg_sect_header(tvb
, offset
, ait_tree
, NULL
, NULL
);
378 proto_tree_add_item(ait_tree
, hf_dvb_ait_test_app_flag
,
379 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
380 proto_tree_add_item(ait_tree
, hf_dvb_ait_app_type
,
381 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
384 /* no hf for reserved bits */
385 proto_tree_add_item(ait_tree
, hf_dvb_ait_version_number
,
386 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
387 proto_tree_add_item(ait_tree
, hf_dvb_ait_current_next_indicator
,
388 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
391 proto_tree_add_item(ait_tree
, hf_dvb_ait_section_number
,
392 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
395 proto_tree_add_item(ait_tree
, hf_dvb_ait_last_section_number
,
396 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
399 descr_loop_len
= tvb_get_ntohs(tvb
, offset
) & 0x0FFF;
400 proto_tree_add_item(ait_tree
, hf_dvb_ait_descr_loop_len
,
401 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
403 offset_loop_start
= offset
;
404 while (offset
-offset_loop_start
< descr_loop_len
) {
405 ret
= dissect_dvb_ait_descriptor(tvb
, offset
, pinfo
, ait_tree
);
411 app_loop_len
= tvb_get_ntohs(tvb
, offset
) & 0x0FFF;
412 proto_tree_add_item(ait_tree
, hf_dvb_ait_app_loop_len
,
413 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
415 offset_loop_start
= offset
;
416 while (offset
-offset_loop_start
< app_loop_len
) {
417 offset_app_start
= offset
;
418 org_id
= tvb_get_ntohl(tvb
, offset
);
419 app_id
= tvb_get_ntohs(tvb
, offset
+4);
420 app_tree_ti
= proto_tree_add_text(ait_tree
, tvb
, offset
, -1,
421 "Application: Org 0x%x, App 0x%x", org_id
, app_id
);
422 ait_app_tree
= proto_item_add_subtree(app_tree_ti
, ett_dvb_ait_app
);
424 proto_tree_add_item(ait_app_tree
, hf_dvb_ait_org_id
,
425 tvb
, offset
, 4, ENC_BIG_ENDIAN
);
427 proto_tree_add_item(ait_app_tree
, hf_dvb_ait_app_id
,
428 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
430 proto_tree_add_item(ait_app_tree
, hf_dvb_ait_app_ctrl_code
,
431 tvb
, offset
, 1, ENC_BIG_ENDIAN
);
433 descr_loop_len
= tvb_get_ntohs(tvb
, offset
) & 0x0FFF;
434 proto_tree_add_item(ait_app_tree
, hf_dvb_ait_descr_loop_len
,
435 tvb
, offset
, 2, ENC_BIG_ENDIAN
);
437 offset_inner_loop_start
= offset
;
438 while (offset
-offset_inner_loop_start
< descr_loop_len
) {
439 ret
= dissect_dvb_ait_descriptor(tvb
, offset
, pinfo
, ait_app_tree
);
444 proto_item_set_len(app_tree_ti
, offset
-offset_app_start
);
447 offset
+= packet_mpeg_sect_crc(tvb
, pinfo
, ait_tree
, 0, offset
);
449 proto_item_set_len(ait_tree_ti
, offset
);
455 proto_register_dvb_ait(void)
457 static gint
*ett
[] = {
463 static hf_register_info hf
[] = {
464 { &hf_dvb_ait_test_app_flag
,
465 { "Test application flag", "dvb_ait.test_app_flag",
466 FT_UINT8
, BASE_HEX
, NULL
, 0x80, NULL
, HFILL
} },
467 { &hf_dvb_ait_app_type
,
468 { "Application type", "dvb_ait.app_type",
469 FT_UINT16
, BASE_HEX
, NULL
, 0x7FFF, NULL
, HFILL
} },
470 { &hf_dvb_ait_version_number
,
471 { "Version Number", "dvb_ait.version",
472 FT_UINT8
, BASE_HEX
, NULL
, 0x3E, NULL
, HFILL
} },
473 { &hf_dvb_ait_current_next_indicator
,
474 { "Current/Next Indicator", "dvb_ait.cur_next_ind",
475 FT_UINT8
, BASE_DEC
, NULL
, 0x01, NULL
, HFILL
} },
476 { &hf_dvb_ait_section_number
,
477 { "Section Number", "dvb_ait.sect_num",
478 FT_UINT8
, BASE_DEC
, NULL
, 0, NULL
, HFILL
} },
479 { &hf_dvb_ait_last_section_number
,
480 { "Last Section Number", "dvb_ait.last_sect_num",
481 FT_UINT8
, BASE_DEC
, NULL
, 0, NULL
, HFILL
} },
482 { &hf_dvb_ait_descr_loop_len
,
483 { "Descriptor loop length", "dvb_ait.descr_loop_len",
484 FT_UINT16
, BASE_DEC
, NULL
, 0x0FFF, NULL
, HFILL
} },
485 { &hf_dvb_ait_descr_tag
,
486 { "Descriptor Tag", "dvb_ait.descr.tag",
487 FT_UINT8
, BASE_HEX
, VALS(ait_descr_tag
), 0, NULL
, HFILL
} },
488 { &hf_dvb_ait_descr_len
,
489 { "Descriptor Length", "dvb_ait.descr.len",
490 FT_UINT8
, BASE_DEC
, NULL
, 0, NULL
, HFILL
} },
491 { &hf_dvb_ait_descr_data
,
492 { "Descriptor Data", "dvb_ait.descr.data",
493 FT_BYTES
, BASE_NONE
, NULL
, 0, NULL
, HFILL
} },
494 { &hf_dvb_ait_descr_app_prof_len
,
495 { "Application profiles length", "dvb_ait.descr.app.prof_len",
496 FT_UINT8
, BASE_DEC
, NULL
, 0, NULL
, HFILL
} },
497 { &hf_dvb_ait_descr_app_prof
,
498 { "Application profile", "dvb_ait.descr.app.prof",
499 FT_UINT16
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
500 /* version is major|minor|micro */
501 { &hf_dvb_ait_descr_app_ver
,
502 { "Version", "dvb_ait.descr.app.ver",
503 FT_UINT24
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
504 { &hf_dvb_ait_descr_app_svc_bound
,
505 { "Service-bound flag", "dvb_ait.descr.app.svc_bound_flag",
506 FT_UINT8
, BASE_HEX
, NULL
, 0x80, NULL
, HFILL
} },
507 { &hf_dvb_ait_descr_app_vis
,
508 { "Visibility", "dvb_ait.descr.app.visibility",
509 FT_UINT8
, BASE_HEX
, VALS(app_vis
), 0x60, NULL
, HFILL
} },
510 { &hf_dvb_ait_descr_app_prio
,
511 { "Application priority", "dvb_ait.descr.app.prio",
512 FT_UINT8
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
513 { &hf_dvb_ait_descr_app_trpt_proto_label
,
514 { "Transport protocol label", "dvb_ait.descr.app.trpt_proto_label",
515 FT_UINT8
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
516 { &hf_dvb_ait_descr_app_name_lang
,
517 { "ISO 639 language code", "dvb_ait.descr.app_name.lang",
518 FT_STRING
, BASE_NONE
, NULL
, 0, NULL
, HFILL
} },
519 { &hf_dvb_ait_descr_app_name_name
,
520 { "Application name", "dvb_ait.descr.app_name.name",
521 FT_UINT_STRING
, BASE_NONE
, NULL
, 0, NULL
, HFILL
} },
522 { &hf_dvb_ait_descr_trpt_proto_id
,
523 { "Protocol ID", "dvb_ait.descr.trpt_proto.id",
524 FT_UINT16
, BASE_HEX
, VALS(trpt_proto_id
), 0, NULL
, HFILL
} },
525 { &hf_dvb_ait_descr_trpt_proto_label
,
526 { "Transport protocol label", "dvb_ait.descr.trpt_proto.label",
527 FT_UINT8
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
528 { &hf_dvb_ait_descr_trpt_sel_remote
,
529 { "Remote connection", "dvb_ait.descr.trpt_proto.remote",
530 FT_UINT8
, BASE_HEX
, NULL
, 0x80, NULL
, HFILL
} },
531 { &hf_dvb_ait_descr_trpt_sel_onid
,
532 { "Original network ID", "dvb_ait.descr.trpt_proto.onid",
533 FT_UINT16
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
534 { &hf_dvb_ait_descr_trpt_sel_tsid
,
535 { "Transport stream ID", "dvb_ait.descr.trpt_proto.tsid",
536 FT_UINT16
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
537 { &hf_dvb_ait_descr_trpt_sel_svcid
,
538 { "Service ID", "dvb_ait.descr.trpt_proto.svcid",
539 FT_UINT16
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
540 { &hf_dvb_ait_descr_trpt_sel_comp
,
541 { "Component tag", "dvb_ait.descr.trpt_proto.comp_tag",
542 FT_UINT8
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
543 { &hf_dvb_ait_descr_trpt_sel_url_base
,
544 { "URL base", "dvb_ait.descr.trpt_proto.url_base",
545 FT_UINT_STRING
, BASE_NONE
, NULL
, 0, NULL
, HFILL
} },
546 { &hf_dvb_ait_descr_trpt_sel_url_ext_cnt
,
547 { "URL extension count", "dvb_ait.descr.trpt_proto.url_ext_cnt",
548 FT_UINT8
, BASE_DEC
, NULL
, 0, NULL
, HFILL
} },
549 { &hf_dvb_ait_descr_trpt_sel_url_ext
,
550 { "URL extension", "dvb_ait.descr.trpt_proto.url_ext",
551 FT_UINT_STRING
, BASE_NONE
, NULL
, 0, NULL
, HFILL
} },
552 { &hf_dvb_ait_descr_trpt_sel_bytes
,
553 { "Selector bytes", "dvb_ait.descr.trpt_proto.selector_bytes",
554 FT_BYTES
, BASE_NONE
, NULL
, 0, NULL
, HFILL
} },
555 { &hf_dvb_ait_descr_sal_init_path
,
556 { "Initial path", "dvb_ait.descr.sim_app_loc.initial_path",
557 FT_STRING
, BASE_NONE
, NULL
, 0, NULL
, HFILL
} },
558 { &hf_dvb_ait_app_loop_len
,
559 { "Application loop length", "dvb_ait.app_loop_len",
560 FT_UINT16
, BASE_DEC
, NULL
, 0x0FFF, NULL
, HFILL
} },
561 { &hf_dvb_ait_org_id
,
562 { "Organisation ID", "dvb_ait.app.org_id",
563 FT_UINT32
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
564 { &hf_dvb_ait_app_id
,
565 { "Application ID", "dvb_ait.app.app_id",
566 FT_UINT16
, BASE_HEX
, NULL
, 0, NULL
, HFILL
} },
567 { &hf_dvb_ait_app_ctrl_code
,
568 { "Application control code", "dvb_ait.app.ctrl_code",
569 FT_UINT8
, BASE_HEX
, VALS(app_ctrl_code
), 0, NULL
, HFILL
} }
572 proto_dvb_ait
= proto_register_protocol(
573 "DVB Application Information Table", "DVB AIT", "dvb_ait");
575 proto_register_field_array(proto_dvb_ait
, hf
, array_length(hf
));
576 proto_register_subtree_array(ett
, array_length(ett
));
581 proto_reg_handoff_dvb_ait(void)
583 dissector_handle_t dvb_ait_handle
;
585 dvb_ait_handle
= new_create_dissector_handle(dissect_dvb_ait
, proto_dvb_ait
);
586 dissector_add_uint("mpeg_sect.tid", DVB_AIT_TID
, dvb_ait_handle
);
590 * Editor modelines - http://www.wireshark.org/tools/modelines.html
595 * indent-tabs-mode: nil
598 * vi: set shiftwidth=4 tabstop=8 expandtab:
599 * :indentSize=4:tabSize=8:noTabs=true: