HACK: pinfo->private_data points to smb_info again
[wireshark-wip.git] / epan / dissectors / packet-dvb-ait.c
blob86a0247bab53fa48d13a02bd3bbc81d30a6b22b2
1 /* packet-dvb-ait.c
2 * Routines for DVB Application Information Table (AIT) dissection
3 * Copyright 2012-2013, Martin Kaiser <martin@kaiser.cx>
5 * $Id$
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. */
29 #include "config.h"
31 #include <glib.h>
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" },
86 { 0x02, "Present" },
87 { 0x03, "Destroy" },
88 { 0x04, "Kill" },
89 { 0x05, "Prefetch" },
90 { 0x06, "Remote" },
91 { 0x07, "Disabled" },
92 { 0x08, "Playback autostart" },
93 { 0, NULL }
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" },
124 { 0, NULL }
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" },
133 { 0, NULL }
136 static const value_string app_vis[] = {
137 { 0x0, "not visible" },
138 { 0x1, "not visible to users, only to applications" },
139 { 0x3, "fully visible" },
140 { 0, NULL }
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 */
147 static gint
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;
152 guint8 app_prof_len;
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);
160 offset++;
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);
165 offset += 2;
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);
172 offset += 3;
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);
178 offset++;
179 proto_tree_add_item(tree, hf_dvb_ait_descr_app_prio,
180 tvb, offset, 1, ENC_BIG_ENDIAN);
181 offset++;
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);
185 offset++;
187 return (gint)(offset-offset_start);
191 static gint
192 dissect_dvb_ait_app_name_desc_body(tvbuff_t *tvb, guint offset,
193 guint8 body_len, packet_info *pinfo _U_, proto_tree *tree)
195 guint offset_start;
196 guint8 len;
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);
202 offset += 3;
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);
207 offset += 1+len;
210 return (gint)(offset-offset_start);
214 static gint
215 dissect_dvb_ait_trpt_proto_desc_body(tvbuff_t *tvb, guint offset,
216 guint8 body_len, packet_info *pinfo _U_, proto_tree *tree)
218 guint offset_start;
219 guint16 proto_id;
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);
227 offset += 2;
228 proto_tree_add_item(tree, hf_dvb_ait_descr_trpt_proto_label,
229 tvb, offset, 1, ENC_BIG_ENDIAN);
230 offset++;
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);
236 offset++;
237 if (remote_connection) {
238 proto_tree_add_item(tree, hf_dvb_ait_descr_trpt_sel_onid,
239 tvb, offset, 2, ENC_BIG_ENDIAN);
240 offset += 2;
241 proto_tree_add_item(tree, hf_dvb_ait_descr_trpt_sel_tsid,
242 tvb, offset, 2, ENC_BIG_ENDIAN);
243 offset += 2;
244 proto_tree_add_item(tree, hf_dvb_ait_descr_trpt_sel_svcid,
245 tvb, offset, 2, ENC_BIG_ENDIAN);
246 offset += 2;
248 proto_tree_add_item(tree, hf_dvb_ait_descr_trpt_sel_comp,
249 tvb, offset, 1, ENC_BIG_ENDIAN);
250 offset++;
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);
264 offset++;
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;
273 else {
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);
284 static gint
285 dissect_dvb_ait_descriptor(tvbuff_t *tvb, guint offset,
286 packet_info *pinfo, proto_tree *tree)
288 gint ret;
289 guint offset_start;
290 guint8 tag, len;
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);
310 offset++;
311 proto_tree_add_item(descr_tree, hf_dvb_ait_descr_len,
312 tvb, offset, 1, ENC_BIG_ENDIAN);
313 offset++;
315 switch (tag) {
316 case AIT_DESCR_APP:
317 ret = dissect_dvb_ait_app_desc_body(tvb, offset, len,
318 pinfo, descr_tree);
319 if (ret>0)
320 offset += ret;
321 break;
322 case AIT_DESCR_APP_NAME:
323 ret = dissect_dvb_ait_app_name_desc_body(tvb, offset, len,
324 pinfo, descr_tree);
325 if (ret>0)
326 offset += ret;
327 break;
328 case AIT_DESCR_TRPT_PROTO:
329 ret = dissect_dvb_ait_trpt_proto_desc_body(tvb, offset, len,
330 pinfo, descr_tree);
331 if (ret>0)
332 offset += ret;
333 break;
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);
338 offset += len;
339 break;
340 default:
341 proto_tree_add_item(descr_tree, hf_dvb_ait_descr_data,
342 tvb, offset, len, ENC_NA);
343 offset += len;
344 break;
347 ret = (gint)(offset-offset_start);
349 else
350 ret = (gint)proto_mpeg_descriptor_dissect(tvb, offset, tree);
352 return ret;
356 static int
357 dissect_dvb_ait(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
359 gint offset=0;
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;
364 gint ret;
365 guint32 org_id;
366 guint16 app_id;
368 col_set_str(pinfo->cinfo, COL_INFO, "Application Information Table (AIT)");
370 if (tree) {
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);
382 offset += 2;
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);
389 offset++;
391 proto_tree_add_item(ait_tree, hf_dvb_ait_section_number,
392 tvb, offset, 1, ENC_BIG_ENDIAN);
393 offset++;
395 proto_tree_add_item(ait_tree, hf_dvb_ait_last_section_number,
396 tvb, offset, 1, ENC_BIG_ENDIAN);
397 offset++;
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);
402 offset += 2;
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);
406 if (ret<=0)
407 break;
408 offset += ret;
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);
414 offset += 2;
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);
426 offset += 4;
427 proto_tree_add_item(ait_app_tree, hf_dvb_ait_app_id,
428 tvb, offset, 2, ENC_BIG_ENDIAN);
429 offset += 2;
430 proto_tree_add_item(ait_app_tree, hf_dvb_ait_app_ctrl_code,
431 tvb, offset, 1, ENC_BIG_ENDIAN);
432 offset++;
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);
436 offset += 2;
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);
440 if (ret<=0)
441 break;
442 offset += ret;
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);
451 return offset;
454 void
455 proto_register_dvb_ait(void)
457 static gint *ett[] = {
458 &ett_dvb_ait,
459 &ett_dvb_ait_descr,
460 &ett_dvb_ait_app
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));
580 void
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
592 * Local variables:
593 * c-basic-offset: 4
594 * tab-width: 8
595 * indent-tabs-mode: nil
596 * End:
598 * vi: set shiftwidth=4 tabstop=8 expandtab:
599 * :indentSize=4:tabSize=8:noTabs=true: