3 * Routines for ETV-AM from OC-SP-ETV-AM1.0-IO5
4 * Copyright 2012, Weston Schmidt <weston_schmidt@alumni.purdue.edu>
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <gerald@wireshark.org>
10 * Copyright 1998 Gerald Combs
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License along
23 * with this program; if not, write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
31 #include <epan/packet.h>
32 #include <epan/expert.h>
33 #include <epan/dissectors/packet-mpeg-sect.h>
35 void proto_register_etv(void);
36 void proto_reg_handoff_etv(void);
38 static int proto_etv_dii
= -1;
39 static int proto_etv_ddb
= -1;
41 static dissector_handle_t dsmcc_handle
;
43 static int hf_etv_dii_filter_info
= -1;
44 static int hf_etv_dii_reserved
= -1;
46 static expert_field ei_etv_dii_invalid_section_syntax_indicator
= EI_INIT
;
47 static expert_field ei_etv_dii_invalid_section_length
= EI_INIT
;
48 static expert_field ei_etv_dii_invalid_reserved_bits
= EI_INIT
;
49 static expert_field ei_etv_dii_filter_info
= EI_INIT
;
51 static int hf_etv_ddb_filter_info
= -1;
52 static int hf_etv_ddb_reserved
= -1;
54 static expert_field ei_etv_ddb_invalid_section_syntax_indicator
= EI_INIT
;
55 static expert_field ei_etv_ddb_invalid_section_length
= EI_INIT
;
56 static expert_field ei_etv_ddb_invalid_reserved_bits
= EI_INIT
;
57 static expert_field ei_etv_ddb_filter_info
= EI_INIT
;
59 static gint ett_etv
= -1;
60 static gint ett_etv_payload
= -1;
62 #define ETV_TID_DII_SECTION 0xe3
63 #define ETV_TID_DDB_SECTION 0xe4
66 dissect_etv_common(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, int proto
,
67 int hf_filter_info
, int hf_reserved
,
68 expert_field
* ei_section_syntax_indicator
, expert_field
* ei_reserved
,
69 expert_field
* ei_section_length
, expert_field
* ei_filter_info
)
76 proto_item
*items
[PACKET_MPEG_SECT_PI__SIZE
];
83 ti
= proto_tree_add_item(tree
, proto
, tvb
, offset
, -1, ENC_NA
);
84 etv_tree
= proto_item_add_subtree(ti
, ett_etv
);
86 offset
+= packet_mpeg_sect_header_extra(tvb
, offset
, etv_tree
, §_len
,
87 &reserved
, &ssi
, items
);
90 proto_item
*msg_error
;
91 msg_error
= items
[PACKET_MPEG_SECT_PI__SSI
];
93 PROTO_ITEM_SET_GENERATED(msg_error
);
94 expert_add_info(pinfo
, msg_error
, ei_section_syntax_indicator
);
98 proto_item
*msg_error
;
99 msg_error
= items
[PACKET_MPEG_SECT_PI__RESERVED
];
101 PROTO_ITEM_SET_GENERATED(msg_error
);
102 expert_add_info(pinfo
, msg_error
, ei_reserved
);
105 col_append_fstr(pinfo
->cinfo
, COL_INFO
, ", Length: %u", sect_len
);
106 proto_item_append_text(ti
, " Length=%u", sect_len
);
107 if (1021 < sect_len
) {
108 proto_item
*msg_error
;
109 msg_error
= items
[PACKET_MPEG_SECT_PI__LENGTH
];
111 PROTO_ITEM_SET_GENERATED(msg_error
);
112 expert_add_info(pinfo
, msg_error
, ei_section_length
);
115 filter_info
= tvb_get_ntohs(tvb
, offset
);
116 col_append_fstr(pinfo
->cinfo
, COL_INFO
, ", Filter: 0x%x", filter_info
);
117 proto_item_append_text(ti
, " Filter=0x%x", filter_info
);
118 pi
= proto_tree_add_item(etv_tree
, hf_filter_info
, tvb
, offset
, 2, ENC_BIG_ENDIAN
);
119 if ((proto_etv_dii
== proto
) && (0xFBFB != filter_info
)) {
120 expert_add_info_format(pinfo
, pi
, ei_filter_info
,
121 "Invalid filter_info value (must be 0xFBFB)");
122 } else if ((proto_etv_ddb
== proto
) &&
123 ((filter_info
< 1) || (0xfbef < filter_info
)))
125 expert_add_info_format(pinfo
, pi
, ei_filter_info
,
126 "Invalid filter_info value (must be [0x0001-0xFBEF] inclusive)");
130 reserved2
= tvb_get_guint8(tvb
, offset
);
131 pi
= proto_tree_add_item(etv_tree
, hf_reserved
, tvb
, offset
, 1, ENC_BIG_ENDIAN
);
132 if (0 != reserved2
) {
133 expert_add_info_format(pinfo
, pi
, ei_reserved
,
134 "Invalid reserved2 bits (should all be 0)");
138 sub_tvb
= tvb_new_subset(tvb
, offset
, sect_len
-7, sect_len
-7);
139 call_dissector(dsmcc_handle
, sub_tvb
, pinfo
, tree
);
141 sect_len
+= 3 - 4; /* add header, remove crc */
143 packet_mpeg_sect_crc(tvb
, pinfo
, etv_tree
, 0, sect_len
);
148 dissect_etv_ddb(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
)
150 col_set_str(pinfo
->cinfo
, COL_PROTOCOL
, "ETV-DDB");
151 col_set_str(pinfo
->cinfo
, COL_INFO
, "ETV DDB");
153 dissect_etv_common(tvb
, pinfo
, tree
, proto_etv_ddb
, hf_etv_ddb_filter_info
,
154 hf_etv_ddb_reserved
, &ei_etv_ddb_invalid_section_syntax_indicator
,
155 &ei_etv_ddb_invalid_reserved_bits
, &ei_etv_ddb_invalid_section_length
,
156 &ei_etv_ddb_filter_info
);
161 dissect_etv_dii(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
)
163 col_set_str(pinfo
->cinfo
, COL_PROTOCOL
, "ETV-DII");
164 col_set_str(pinfo
->cinfo
, COL_INFO
, "ETV DII");
165 dissect_etv_common(tvb
, pinfo
, tree
, proto_etv_dii
, hf_etv_dii_filter_info
,
166 hf_etv_dii_reserved
, &ei_etv_dii_invalid_section_syntax_indicator
,
167 &ei_etv_dii_invalid_reserved_bits
, &ei_etv_dii_invalid_section_length
,
168 &ei_etv_dii_filter_info
);
173 proto_register_etv(void)
175 static hf_register_info hf_ddb
[] = {
176 { &hf_etv_ddb_filter_info
, {
177 "Filter Info", "etv-ddb.filter_info",
178 FT_UINT16
, BASE_HEX
, NULL
, 0, NULL
, HFILL
181 { &hf_etv_ddb_reserved
, {
182 "Reserved", "etv-ddb.reserved",
183 FT_UINT8
, BASE_DEC
, NULL
, 0, NULL
, HFILL
187 static hf_register_info hf_dii
[] = {
188 { &hf_etv_dii_filter_info
, {
189 "Filter Info", "etv-dii.filter_info",
190 FT_UINT16
, BASE_HEX
, NULL
, 0, NULL
, HFILL
193 { &hf_etv_dii_reserved
, {
194 "Reserved", "etv-dii.reserved",
195 FT_UINT8
, BASE_DEC
, NULL
, 0, NULL
, HFILL
199 static gint
*ett
[] = {
204 static ei_register_info ei_ddb
[] = {
205 { &ei_etv_ddb_invalid_section_syntax_indicator
, { "etv-ddb.invalid_section_syntax_indicator", PI_MALFORMED
, PI_ERROR
, "Invalid section_syntax_indicator (should be 0)", EXPFILL
}},
206 { &ei_etv_ddb_invalid_reserved_bits
, { "etv-ddb.invalid_reserved_bits", PI_MALFORMED
, PI_ERROR
, "Invalid reserved bits", EXPFILL
}},
207 { &ei_etv_ddb_invalid_section_length
, { "etv-ddb.invalid_section_length", PI_MALFORMED
, PI_ERROR
, "Invalid section_length (must not exceed 1021)", EXPFILL
}},
208 { &ei_etv_ddb_filter_info
, { "etv-ddb.filter_info.invalid", PI_MALFORMED
, PI_ERROR
, "Invalid filter info", EXPFILL
}},
211 static ei_register_info ei_dii
[] = {
212 { &ei_etv_dii_invalid_section_syntax_indicator
, { "etv-dii.invalid_section_syntax_indicator", PI_MALFORMED
, PI_ERROR
, "Invalid section_syntax_indicator (should be 0)", EXPFILL
}},
213 { &ei_etv_dii_invalid_reserved_bits
, { "etv-dii.invalid_reserved_bits", PI_MALFORMED
, PI_ERROR
, "Invalid reserved bits", EXPFILL
}},
214 { &ei_etv_dii_invalid_section_length
, { "etv-dii.invalid_section_length", PI_MALFORMED
, PI_ERROR
, "Invalid section_length (must not exceed 1021)", EXPFILL
}},
215 { &ei_etv_dii_filter_info
, { "etv-dii.filter_info.invalid", PI_MALFORMED
, PI_ERROR
, "Invalid filter info", EXPFILL
}},
218 expert_module_t
* expert_etv_dii
;
219 expert_module_t
* expert_etv_ddb
;
221 proto_etv_dii
= proto_register_protocol("ETV-AM DII Section", "ETV-AM DII", "etv-dii");
222 proto_etv_ddb
= proto_register_protocol("ETV-AM DDB Section", "ETV-AM DDB", "etv-ddb");
224 proto_register_field_array(proto_etv_dii
, hf_dii
, array_length(hf_dii
));
225 proto_register_field_array(proto_etv_ddb
, hf_ddb
, array_length(hf_ddb
));
226 proto_register_subtree_array(ett
, array_length(ett
));
227 expert_etv_dii
= expert_register_protocol(proto_etv_dii
);
228 expert_register_field_array(expert_etv_dii
, ei_dii
, array_length(ei_dii
));
229 expert_etv_ddb
= expert_register_protocol(proto_etv_ddb
);
230 expert_register_field_array(expert_etv_ddb
, ei_ddb
, array_length(ei_ddb
));
235 proto_reg_handoff_etv(void)
237 dissector_handle_t etv_dii_handle
;
238 dissector_handle_t etv_ddb_handle
;
240 etv_dii_handle
= create_dissector_handle(dissect_etv_dii
, proto_etv_dii
);
241 etv_ddb_handle
= create_dissector_handle(dissect_etv_ddb
, proto_etv_ddb
);
242 dissector_add_uint("mpeg_sect.tid", ETV_TID_DII_SECTION
, etv_dii_handle
);
243 dissector_add_uint("mpeg_sect.tid", ETV_TID_DDB_SECTION
, etv_ddb_handle
);
244 dsmcc_handle
= find_dissector("mp2t-dsmcc");