2 * Routines for H.248/MEGACO packet dissection
6 * Luis Ontanon 2005 - Context and Transaction Tracing
10 * Wireshark - Network traffic analyzer
11 * By Gerald Combs <gerald@wireshark.org>
12 * Copyright 1998 Gerald Combs
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 #include "packet-h248.h"
30 #include "packet-tpkt.h"
32 #define PNAME "H.248 MEGACO"
36 #define GATEWAY_CONTROL_PROTOCOL_USER_ID 14
39 /* Initialize the protocol and registered fields */
40 static int proto_h248 = -1;
41 static int hf_h248_mtpaddress_ni = -1;
42 static int hf_h248_mtpaddress_pc = -1;
43 static int hf_h248_pkg_name = -1;
44 static int hf_248_pkg_param = -1;
45 static int hf_h248_event_name = -1;
46 static int hf_h248_signal_name = -1;
47 static int hf_h248_signal_code = -1;
48 static int hf_h248_event_code = -1;
49 static int hf_h248_pkg_bcp_BNCChar_PDU = -1;
53 static int hf_h248_context_id = -1;
54 static int hf_h248_error_code = -1;
55 static int hf_h248_term_wild_type = -1;
56 static int hf_h248_term_wild_level = -1;
57 static int hf_h248_term_wild_position = -1;
59 static int hf_h248_no_pkg = -1;
60 static int hf_h248_no_sig = -1;
61 static int hf_h248_no_evt = -1;
62 static int hf_h248_param = -1;
64 static int hf_h248_serviceChangeReasonStr = -1;
66 #include "packet-h248-hf.c"
68 /* Initialize the subtree pointers */
69 static gint ett_h248 = -1;
70 static gint ett_mtpaddress = -1;
71 static gint ett_packagename = -1;
72 static gint ett_codec = -1;
73 static gint ett_wildcard = -1;
75 static gint ett_h248_no_pkg = -1;
76 static gint ett_h248_no_sig = -1;
77 static gint ett_h248_no_evt = -1;
79 static int h248_tap = -1;
81 static gcp_hf_ett_t h248_arrel = {{-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1}};
83 #include "packet-h248-ett.c"
85 static dissector_handle_t h248_term_handle;
87 static emem_tree_t* msgs = NULL;
88 static emem_tree_t* trxs = NULL;
89 static emem_tree_t* ctxs_by_trx = NULL;
90 static emem_tree_t* ctxs = NULL;
92 static gboolean keep_persistent_data = FALSE;
93 static guint global_udp_port = 2945;
94 static guint global_tcp_port = 2945;
95 static gboolean h248_desegment = TRUE;
99 static proto_tree *h248_tree;
100 static tvbuff_t* h248_tvb;
102 static dissector_handle_t h248_handle;
103 static dissector_handle_t h248_term_handle;
104 static dissector_handle_t h248_tpkt_handle;
106 /* Forward declarations */
107 static int dissect_h248_ServiceChangeReasonStr(gboolean implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index);
109 /* http://www.iana.org/assignments/megaco-h248 last updated 2007-11-28*/
110 static const value_string package_name_vals[] = {
111 { 0x0000, "Media stream properties H.248.1 Annex C" },
112 { 0x0001, "Generic H.248.1 Annex E" },
113 { 0x0002, "root H.248.1 Annex E" },
114 { 0x0003, "tonegen H.248.1 Annex E" },
115 { 0x0004, "tonedet H.248.1 Annex E" },
116 { 0x0005, "dg H.248.1 Annex E" },
117 { 0x0006, "dd H.248.1 Annex E" },
118 { 0x0007, "cg H.248.1 Annex E" },
119 { 0x0008, "cd H.248.1 Annex E" },
120 { 0x0009, "al H.248.1 Annex E" },
121 { 0x000a, "ct H.248.1 Annex E" },
122 { 0x000b, "nt H.248.1 Annex E" },
123 { 0x000c, "rtp H.248.1 Annex E" },
124 { 0x000d, "tdmc H.248.1 Annex E" },
125 { 0x000e, "ftmd H.248.1 Annex E" },
126 { 0x000f, "txc H.248.2" }, /* H.248.2 */
127 { 0x0010, "txp H.248.2" },
128 { 0x0011, "ctyp H.248.2" },
129 { 0x0012, "fax H.248.2" },
130 { 0x0013, "ipfax H.248.2" },
131 { 0x0014, "dis H.248.3" }, /* H.248.3 */
132 { 0x0015, "key H.248.3" },
133 { 0x0016, "kp H.248.3" },
134 { 0x0017, "labelkey H.248.3" },
135 { 0x0018, "kf H.248.3" },
136 { 0x0019, "ind H.248.3" },
137 { 0x001a, "ks H.248.3" },
138 { 0x001b, "anci H.248.3" },
139 { 0x001c, "dtd H.248.6" }, /* H.248.6 */
140 { 0x001d, "an H.248.7" }, /* H.248.7 */
141 { 0x001e, "Bearer Characteristics Q.1950 Annex A" }, /* Q.1950 Annex A */
142 { 0x001f, "Bearer Network Connection Cut Q.1950 Annex A" },
143 { 0x0020, "Reuse Idle Q.1950 Annex A" },
144 { 0x0021, "Generic Bearer Connection Q.1950 Annex A" },
145 { 0x0022, "Bearer Control Tunnelling Q.1950 Annex A" },
146 { 0x0023, "Basic Call Progress Tones Q.1950 Annex A" },
147 { 0x0024, "Expanded Call Progress Tones Q.1950 Annex A" },
148 { 0x0025, "Basic Services Tones Q.1950 Annex A" },
149 { 0x0026, "Expanded Services Tones Q.1950 Annex A" },
150 { 0x0027, "Intrusion Tones Q.1950 Annex A" },
151 { 0x0028, "Business Tones Q.1950 Annex A" },
152 { 0x0029, "Media Gateway Resource Congestion Handling H.248.10" }, /* H.248.10 */
153 { 0x002a, "H245 package H248.12" }, /* H.248.12 */
154 { 0x002b, "H323 bearer control package H.248.12" }, /* H.248.12 */
155 { 0x002c, "H324 package H.248.12" }, /* H.248.12 */
156 { 0x002d, "H245 command package H.248.12" }, /* H.248.12 */
157 { 0x002e, "H245 indication package H.248.12" }, /* H.248.12 */
158 { 0x002f, "3G User Plane" }, /* 3GPP TS 29.232 v4.1.0 */
159 { 0x0030, "3G Circuit Switched Data" },
160 { 0x0031, "3G TFO Control" },
161 { 0x0032, "3G Expanded Call Progress Tones" },
162 { 0x0033, "Advanced Audio Server (AAS Base)" }, /* H.248.9 */
163 { 0x0034, "AAS Digit Collection" }, /* H.248.9 */
164 { 0x0035, "AAS Recording" }, /* H.248.9 */
165 { 0x0036, "AAS Segment Management" }, /* H.248.9 */
166 { 0x0037, "Quality Alert Ceasing" }, /* H.248.13 */
167 { 0x0038, "Conferencing Tones Generation" }, /* H.248.27 */
168 { 0x0039, "Diagnostic Tones Generation" }, /* H.248.27 */
169 { 0x003a, "Carrier Tones Generation Package H.248.23" }, /* H.248.27 */
170 { 0x003b, "Enhanced Alerting Package H.248.23" }, /* H.248.23 */
171 { 0x003c, "Analog Display Signalling Package H.248.23" }, /* H.248.23 */
172 { 0x003d, "Multi-Frequency Tone Generation Package H.248.24" }, /* H.248.24 */
173 { 0x003e, "H.248.23Multi-Frequency Tone Detection Package H.248.24" }, /* H.248.24 */
174 { 0x003f, "Basic CAS Package H.248.25" }, /* H.248.25 */
175 { 0x0040, "Robbed Bit Signalling Package H.248.25" }, /* H.248.25 */
176 { 0x0041, "Operator Services and Emergency Services Package H.248.25" },
177 { 0x0042, "Operator Services Extension Package H.248.25" },
178 { 0x0043, "Extended Analog Line Supervision Package H.248.26" },
179 { 0x0044, "Automatic Metering Package H.248.26" },
180 { 0x0045, "Inactivity Timer Package H.248.14" },
181 { 0x0046, "3G Modification of Link Characteristics Bearer Capability" }, /* 3GPP TS 29.232 v4.4.0 */
182 { 0x0047, "Base Announcement Syntax H.248.9" },
183 { 0x0048, "Voice Variable Syntax H.248.9" },
184 { 0x0049, "Announcement Set Syntax H.248.9" },
185 { 0x004a, "Phrase Variable Syntax H.248.9" },
186 { 0x004b, "Basic NAS package" },
187 { 0x004c, "NAS incoming package" },
188 { 0x004d, "NAS outgoing package" },
189 { 0x004e, "NAS control package" },
190 { 0x004f, "NAS root package" },
191 { 0x0050, "Profile Handling Package H.248.18" },
192 { 0x0051, "Media Gateway Overload Control Package H.248.11" },
193 { 0x0052, "Extended DTMF Detection Package H.248.16" },
194 { 0x0053, "Quiet Termination Line Test" },
195 { 0x0054, "Loopback Line Test Response" }, /* H.248.17 */
196 { 0x0055, "ITU 404Hz Line Test" }, /* H.248.17 */
197 { 0x0056, "ITU 816Hz Line Test" }, /* H.248.17 */
198 { 0x0057, "ITU 1020Hz Line Test" }, /* H.248.17 */
199 { 0x0058, "ITU 2100Hz Disable Tone Line Test" }, /* H.248.17 */
200 { 0x0059, "ITU 2100Hz Disable Echo Canceller Tone Line Test" }, /* H.248.17 */
201 { 0x005a, "ITU 2804Hz Tone Line Test" }, /* H.248.17 */
202 { 0x005b, "ITU Noise Test Tone Line Test" }, /* H.248.17 */
203 { 0x005c, "ITU Digital Pseudo Random Test Line Test" }, /* H.248.17 */
204 { 0x005d, "ITU ATME No.2 Test Line Response" }, /* H.248.17 */
205 { 0x005e, "ANSI 1004Hz Test Tone Line Test" }, /* H.248.17 */
206 { 0x005f, "ANSI Test Responder Line Test" }, /* H.248.17 */
207 { 0x0060, "ANSI 2225Hz Test Progress Tone Line Test" }, /* H.248.17 */
208 { 0x0061, "ANSI Digital Test Signal Line Test" }, /* H.248.17 */
209 { 0x0062, "ANSI Inverting Loopback Line Test Response" }, /* H.248.17 */
210 { 0x0063, "Extended H.324 Packages H.248.12 Annex A" },
211 { 0x0064, "Extended H.245 Command Package H.248.12 Annex A" },
212 { 0x0065, "Extended H.245 Indication Package H.248.12 Annex A" },
213 { 0x0066, "Enhanced DTMF Detection Package H.248.16" },
214 { 0x0067, "Connection Group Identity Package Q.1950 Annex E" },
215 { 0x0068, "CTM Text Transport 3GPP TS 29.232 v5.2.0" },
216 { 0x0069, "SPNE Control Package Q.115.0" },
217 { 0x006a, "Semi-permanent Connection Package H.248.21" },
218 { 0x006b, "Shared Risk Group Package H.248.22" },
219 { 0x006c, "isuptn Annex B of ITU-T Rec. J.171" },
220 { 0x006d, "Basic CAS Addressing Package H.248.25" },
221 { 0x006e, "Floor Control Package H.248.19" },
222 { 0x006f, "Indication of Being Viewed Package H.248.19" },
223 { 0x0070, "Volume Control Package H.248.19" },
224 { 0x0071, "UNASSIGNED" },
225 { 0x0072, "Volume Detection Package H.248.19" },
226 { 0x0073, "Volume Level Mixing Package H.248.19" },
227 { 0x0074, "Mixing Volume Level Control Package H.248.19" },
228 { 0x0075, "Voice Activated Video Switch Package H.248.19" },
229 { 0x0076, "Lecture Video Mode Package H.248.19" },
230 { 0x0077, "Contributing Video Source Package H.248.19" },
231 { 0x0078, "Video Window Package H.248.19" },
232 { 0x0079, "Tiled Window Package H.248.19" },
233 { 0x007a, "Adaptive Jitter Buffer Package H.248.31" },
234 { 0x007b, "International CAS Package H.248.28" },
235 { 0x007c, "CAS Blocking Package H.248.28" },
236 { 0x007d, "International CAS Compelled Package H.248.29" },
237 { 0x007e, "International CAS Compelled with Overlap Package H.248.29" },
238 { 0x007f, "International CAS Compelled with End-to-end Package H.248.29" },
239 { 0x0080, "RTCP XR Package H.248.30" },
240 { 0x0081, "RTCP XR Burst Metrics Package H.248.30" },
241 { 0x0082, "threegcsden 3G Circuit Switched Data" }, /* 3GPP TS 29.232 v5.6.0 */
242 { 0x0083, "threegiptra 3G Circuit Switched Data" }, /* 3GPP TS 29.232 v5.6.0 */
243 { 0x0084, "threegflex 3G Circuit Switched Data" }, /* 3GPP TS 29.232 v5.6.0 */
244 { 0x0085, "H.248 PCMSB" },
245 { 0x008a, "TIPHON Extended H.248/MEGACO Package" }, /* ETSI specification TS 101 3 */
246 { 0x008b, "Differentiated Services Package" }, /* Annex A of ETSI TS 102 333 */
247 { 0x008c, "Gate Management Package" }, /* Annex B of ETSI TS 102 333 */
248 { 0x008d, "Traffic Management Package" }, /* Annex C of ETSI TS 102 333 */
249 { 0x008e, "Gate Recovery Information Package" }, /* Annex D of ETSI TS 102 333 */
250 { 0x008f, "NAT Traversal Package" }, /* Annex E of ETSI TS 102 333 */
251 { 0x0090, "MPLS Package" }, /* Annex F of ETSI TS 102 333 */
252 { 0x0091, "VLAN Package" }, /* Annex G of ETSI TS 102 333 */
253 { 0x0092, "Detailed Congestion Reporting Package" }, /* H.248.32 */
254 { 0x0093, "Stimulus Analogue Lines Package" }, /* H.248.34 */
255 { 0x0094, "icascgen" }, /* H.248.29 Annex B */
256 { 0x0095, "Coin Operated Phone Control Package" }, /* H.248.35 */
257 { 0x0096, "Metering Pulse Detection Package" }, /* H.248.26 Amendment 1 */
258 { 0x0097, "Trace Package" }, /* 3GPP TS 29.232 v6.3.0 */
259 { 0x0098, "Hanging Termination Package" }, /* H.248.36 */
260 { 0x0099, "IP NAPT Traversal Package" }, /* H.248.37 */
261 { 0x009a, "Notification Behaviour Package" }, /* H.248.1v3 */
262 { 0x009b, "Base Context Package" }, /* H.248.38 */
263 { 0x009c, "Application Data Inactivity Detection Package" }, /* H.248.40 */
264 { 0x009d, "Domain Connection Package " }, /* H.248.41 */
265 { 0x009e, "Digital Circuit Multiplication Equipment Package" }, /* H.248.42 */
266 { 0x009f, "Multi-level Precedence and Pre-emption Package" }, /* H.248.44 */
267 { 0x00a0, "MGC Information Package" }, /* H.248.45 */
268 { 0x00a1, "Text Overlay Package" }, /* H.248.19 Amendment 1 */
269 { 0x00a2, "Border and Background Package" }, /* H.248.19 Amendment 1 */
270 { 0x00a3, "Segmentation Package" }, /* H.248.1v3 */
271 { 0x00a4, "ETSI notification behaviour package" }, /* ETSI ES 283 039-3 */
272 { 0x00a5, "ETSI notification rate package" }, /* ETSI ES 283 039-4 */
273 { 0x00a6, "Automatic Speech Recognition Package" }, /* H.248.9 Amendment 1 */
274 { 0x00a7, "Set extension to basic syntax for TTS enhancement Package" },/* H.248.9 Amendment 1 */
275 { 0x00a8, "Advanced audio server base package for TTS enhancement" }, /* H.248.9 Amendment 1 */
276 { 0x00a9, "Multimedia Play Package" }, /* H.248.9 Amendment 1 */
277 { 0x00aa, "Floor Status Detection Package" }, /* H.248.19 Amendment 2 */
278 { 0x00ab, "Floor Control Policy Package" }, /* H.248.19 Amendment 2 */
279 { 0x00ac, "Address Reporting Package" }, /* H.248.37 Amendment 1 */
280 { 0x00ad, "Connection Capability Control Package" }, /* H.248.46 */
281 { 0x00ae, "Statistic Conditional Reporting Package" }, /* H.248.47 Amendment 1 */
282 { 0x00af, "RTCP HR QoS Statistics Package" }, /* H.248.48 */
283 { 0x00b0, "Received RTCP XR Package" }, /* H.248.30 (01/2007) */
284 { 0x00b1, "Received RTCP XR Burst Metrics Package" }, /* H.248.30 (01/2007) */
285 { 0x00b2, "ASCI Group call package" }, /* 3GPP TS 29.232 v7.4.0 */
286 { 0x00b3, "Multimedia Recording Package" }, /* H.248.9 Amendment 1 */
287 { 0x00b4, "H.245 Transport Package" }, /* H.248.12 Amendment 2 */
288 { 0x00b5, "RTCP Handling package" }, /* H.248.57 */
289 { 0x00b6, "Gate Management - Outgoing Destination Address/Port Filtering Package" },/* H.248.43 */
290 { 0x00b7, "Gate Management - Incoming Protocol Filtering Package" },/* H.248.43 */
291 { 0x00b8, "Gate Management - Outgoing Protocol Filtering Package" },/* H.248.43 */
292 { 0x00b9, "Gate Management - Incoming Filtering Behaviour Package" },/* H.248.43 */
293 { 0x00ba, "Gate Management - Outgoing Filtering Behaviour Package" }, /* H.248.43 */
294 { 0x00bb, "Session Description Protocol RFC Package" }, /* H.248.49 */
295 { 0x00bc, "Session Description Protocol Capabilities Package" }, /* H.248.49 */
296 { 0x00bd, "NAT Traversal Toolkit - STUN Base Package" }, /* H.248.50 */
297 { 0x00be, "NAT Traversal Toolkit - MG STUN Client Package" }, /* H.248.50 */
298 { 0x00bf, "NAT Traversal Toolkit - MG TURN Client Package" }, /* H.248.50 */
299 { 0x00c0, "NAT Traversal Toolkit - MGC STUN Client Package" }, /* H.248.50 */
300 { 0x00c1, "NAT Traversal Toolkit - STUN Information Package" }, /* H.248.50 */
301 { 0x00c2, "NAT Traversal Toolkit - MG Act-as STUN Server Package" }, /* H.248.50 */
302 { 0x00c3, "NAT Traversal Toolkit - Originate STUN Continuity Check Package" }, /* H.248.50 */
303 { 0x00c4, "NAT Traversal Toolkit - MGC Originated STUN Request Package" }, /* H.248.50 */
304 { 0x00c5, "NAT Traversal Toolkit - RTP NOOP Request Package" }, /* H.248.50 */
305 { 0x00c6, "Termination Connection Model Package" }, /* H.248.51 */
306 { 0x00c7, "QoS Class Package" }, /* H.248.52 */
307 { 0x00c8, "Traffic Policing Statistics Package" }, /* H.248.53 */
308 { 0x00c9, "Packet Size Package" }, /* H.248.53 */
309 { 0x00ca, "Pull Mode Package" }, /* H.248.55 */
310 { 0x00cb, "RTP Application Data Package" }, /* H.248.58 */
311 { 0x00cc, "Event Timestamp Notification Package" }, /* H.248.59 */
312 { 0x00ce, "Resource Management Rules Package" }, /* H.248.63 */
313 { 0x00cd, "Resource Management Configuration" }, /* H.248.63 */
314 { 0x00cf, "Abstract Resource Management" }, /* H.248.63 */
316 { 0x00d0, "IP layer octets count statistics Package" }, /* H.248.61 */
317 { 0x00d1, "Content of Communication Identity Package" }, /* H.248.60 */
318 { 0x00d2, "RSVP extension package" }, /* H.248.65 */
319 { 0x00d3, "GCP Transport Mode Indication Package" }, /* H.248.67 */
320 { 0x00d4, "IP Router Package" }, /* H.248.64 */
321 { 0x00d5, "Media Resource Identification Package" }, /* H.248.66 */
322 { 0x00d6, "Range Format Support Package" }, /* H.248.66 */
323 { 0x00d7, "Media Resource Description Expiry Package" }, /* H.248.66 */
324 { 0x00d8, "Media Block Size Package" }, /* H.248.66 */
325 { 0x00d9, "RTSP Media Resource Syntax Package" }, /* H.248.66 */
326 { 0x00da, "RTSP Play Package" }, /* H.248.66 */
327 { 0x00db, "Signal Pause Package" }, /* H.248.66 */
328 { 0x00dc, "Data Delivery Speed Adjustme Package" }, /* H.248.66 */
329 { 0x00de, "RTP Information Package" }, /* H.248.66 */
330 { 0x00dd, "Playback Relative Scale Adjustment Package" }, /* H.248.66 */
331 { 0x00df, "RTP Interleaving Package" }, /* H.248.66 */
332 { 0x00e0, "IP Realm Availability Package" }, /* H.248.41 Amendment 1 */
333 { 0x00e1, "General IP Header QoS Octet Package" }, /* H.248.52 */
334 { 0x00e2, "Re-answer Package" }, /* H.248.62 */
335 { 0x00e3, "3G Interface Type package" }, /* 3GPP TS 29.232 v8.4.0 */
336 { 0x00e4, "Latch Statistics Package" }, /* H.248.37 */
337 { 0x00e5, "Floor Control Signalling Package" }, /* H.248.19 Amendment 2 */
338 { 0x00e6, "Include Participant in Mix Package" }, /* H.248.19 Amendment 2 */
339 { 0x00e7, "Speaker Reporting Package" }, /* H.248.19 Amendment 2 */
340 { 0x00e8, "IP Layer Packet Count Statistics Package" }, /* H.248.61 */
341 { 0x00e9, "Removal of Digits and Tones Package" }, /* H.248.68 */
342 { 0x00ea, "MSRP Statistics Package" }, /* H.248.69 */
343 { 0x00eb, "MSRP Connection Status Package" }, /* H.248.69 */
344 { 0x00ec, "Play Message Package" }, /* H.248.69 */
345 { 0x00ed, "Delete Stored Message Package" }, /* H.248.69 */
346 { 0x00ee, "Message Session Information Package" }, /* H.248.69 */
347 { 0x00ef, "Message Filtering Package" }, /* H.248.69 */
348 { 0x00f0, "Stored Message Information Package" }, /* H.248.69 */
349 { 0x00f1, "Record Message Package" }, /* H.248.69 */
350 { 0x00f2, "Digit Dialling Method Information Package" }, /* H.248.70 */
351 { 0x00f, "Digit Dialling Method Information for Extended Digitmap Detection Package" }, /* H.248.70 */
352 { 0x00f4, "Digit Dialling Method Information for Enhanced Digitmap Detection Package" }, /* H.248.70 */
353 { 0x00f5, "Received RTCP Package " }, /* H.248.71 */
354 { 0x00f6, "RTP Cumulative Loss Package" }, /* H.248.71 */
355 { 0x00f7, "H.245 Transport Package for SPC use" }, /* H.248.72 */
356 { 0x00f8, "MONA Preference Package" }, /* H.248.72 */
357 { 0x00f9, "TDM Gain Control Package" }, /* H.248.73 */
358 { 0x8000, "Ericsson IU" },
359 { 0x8001, "Ericsson UMTS and GSM Circuit" },
360 { 0x8002, "Ericsson Tone Generator Package" },
361 { 0x8003, "Ericsson Line Test Package" },
362 { 0x8004, "Nokia Advanced TFO Package" },
363 { 0x8005, "Nokia IWF Package" },
364 { 0x8006, "Nokia Root Package" },
365 { 0x8007, "Nokia Trace Package" },
366 { 0x8008, "Ericsson V5.2 Layer" },
367 { 0x8009, "Ericsson Detailed Termination Information Package" },
368 { 0x800a, "Nokia Bearer Characteristics Package" },
369 { 0x800b, "Nokia Test Call Package" },
370 { 0x800c, "Nokia Extended Continuity Package" },
371 { 0x800d, "Nokia IPnwR Package" },
372 { 0x800e, "Ericsson Tracing Enhancements Package" },
373 { 0x800f, "Ericsson Partially Wildcarded TerminationID Package" },
374 { 0x8010, "SCTP Stream Handling Package" },
379 * This table consist of PackageName + EventName and its's corresponding string
382 static const value_string event_name_vals[] = {
383 { 0x00000000, "Media stream properties H.248.1 Annex C" },
384 { 0x00010000, "g H.248.1 Annex E" },
385 { 0x00010001, "g/Cause" },
386 { 0x00010002, "g/Signal Completion" },
387 { 0x00040000, "tonedet H.248.1 Annex E" },
388 { 0x00040001, "tonedet/std(Start tone detected)" },
389 { 0x00040002, "tonedet/etd(End tone detected)" },
390 { 0x00040003, "tonedet/ltd(Long tone detected)" },
391 { 0x00060000, "dd H.248.1 Annex E" },
392 { 0x00060001, "dd/std" },
393 { 0x00060002, "dd/etd" },
394 { 0x00060003, "dd/ltd" },
395 { 0x00060004, "dd, DigitMap Completion Event" },
396 { 0x00060010, "dd/d0, DTMF character 0" },
397 { 0x00060011, "dd/d1, DTMF character 1" },
398 { 0x00060012, "dd/d2, DTMF character 2" },
399 { 0x00060013, "dd/d3, DTMF character 3" },
400 { 0x00060014, "dd/d4, DTMF character 4" },
401 { 0x00060015, "dd/d5, DTMF character 5" },
402 { 0x00060016, "dd/d6, DTMF character 6" },
403 { 0x00060017, "dd/d7, DTMF character 7" },
404 { 0x00060018, "dd/d8, DTMF character 8" },
405 { 0x00060019, "dd/d9, DTMF character 9" },
406 { 0x0006001a, "dd/a, DTMF character A" },
407 { 0x0006001b, "dd/b, DTMF character B" },
408 { 0x0006001c, "dd/c, DTMF character C" },
409 { 0x0006001d, "dd/d, DTMF character D" },
410 { 0x00060020, "dd/*, DTMF character *" },
411 { 0x00060021, "dd/#, DTMF character #" },
412 { 0x00080030, "cd, Dial Tone" },
413 { 0x00080031, "cd, Ringing Tone" },
414 { 0x00080032, "cd, Busy Tone" },
415 { 0x00080033, "cd, Congestion Tone" },
416 { 0x00080034, "cd, Special Information Tone" },
417 { 0x00080035, "cd, (Recording) Warning Tone" },
418 { 0x00080036, "cd, Payphone Recognition Tone" },
419 { 0x00080037, "cd, Call Waiting Tone" },
420 { 0x00080038, "cd, Caller Waiting Tone" },
421 { 0x00090004, "al, onhook" },
422 { 0x00090005, "al, offhook" },
423 { 0x00090006, "al, flashhook" },
424 { 0x0009ffff, "al, *" },
425 { 0x000a0005, "ct, Completion of Continuity test" },
426 { 0x000b0005, "nt, network failure" },
427 { 0x000b0006, "nt, quality alert" },
428 { 0x000c0001, "rtp, Payload Transition" },
429 { 0x00210000, "Generic Bearer Connection Q.1950 Annex A" },
430 { 0x00210001, "GB/BNCChange" },
431 { 0x00220001, "BT/TIND (Tunnel Indication)" },
432 { 0x002a0001, "H.245/h245msg (Incoming H.245 Message)" },
433 { 0x002a0004, "H.245/h245ChC (H.245 Channel Closed)" },
434 { 0x00450000, "Inactivity Timer H.248.14" },
435 { 0x00450001, "it/ito" },
436 { 0x00450002, "it/ito" },
437 { 0x00460001, "threegmlc/mod_link_supp (Bearer Modification Support Event)" },
438 { 0x00980000, "Hanging Termination Package" },
439 { 0x00980001, "Termination Heartbeat" },
440 { 0x800a0000, "Nokia Bearer Characteristics Package" },
445 * This table consist of PackageName + SignalName and its's corresponding string
447 static const value_string signal_name_vals[] = {
448 { 0x00000000, "Media stream properties H.248.1 Annex C" },
449 { 0x00010000, "g H.248.1 Annex E" },
450 { 0x00030001, "tonegen/pt(Play tone)" },
451 { 0x00050010, "dg, DTMF character 0" },
452 { 0x00050011, "dg, DTMF character 1" },
453 { 0x00050012, "dg, DTMF character 2" },
454 { 0x00050013, "dg, DTMF character 3" },
455 { 0x00050014, "dg, DTMF character 4" },
456 { 0x00050015, "dg, DTMF character 5" },
457 { 0x00050016, "dg, DTMF character 6" },
458 { 0x00050017, "dg, DTMF character 7" },
459 { 0x00050018, "dg, DTMF character 8" },
460 { 0x00050019, "dg, DTMF character 9" },
461 { 0x0005001a, "dg, DTMF character A" },
462 { 0x0005001b, "dg, DTMF character B" },
463 { 0x0005001c, "dg, DTMF character C" },
464 { 0x0005001d, "dg, DTMF character D" },
465 { 0x00050020, "dg, DTMF character *" },
466 { 0x00050021, "dg, DTMF character #" },
467 { 0x00070030, "cg, Dial Tone" },
468 { 0x00070031, "cg/rt (Ringing Tone)" },
469 { 0x00070032, "cg, Busy Tone" },
470 { 0x00070033, "cg, Congestion Tone" },
471 { 0x00070034, "cg, Special Information Tone" },
472 { 0x00070035, "cg, (Recording) Warning Tone" },
473 { 0x00070036, "cg, Payphone Recognition Tone" },
474 { 0x00070037, "cg, Call Waiting Tone" },
475 { 0x00070038, "cg, Caller Waiting Tone" },
476 { 0x00090002, "al, ring" },
477 { 0x0009ffff, "al, *" },
478 { 0x000a0003, "ct, Continuity test" },
479 { 0x000a0004, "ct, Continuity respond" },
480 { 0x00210000, "GB Generic Bearer Connection Q.1950 Annex A" },
481 { 0x00210001, "GB/EstBNC(Establish BNC)" },
482 { 0x00210002, "GB/ModBNC (Modify BNC)" },
483 { 0x00210003, "GB/RelBNC(Release BNC)" },
485 { 0x002a0001, "H.245/cs (channel state)" },
486 { 0x002a0002, "H.245/termtype (Terminal Type)" },
488 { 0x002c0001, "H.324/cmod (Communication mode)" },
489 { 0x002c0002, "H.324/muxlv (Highest Multiplexing level)" },
490 { 0x002c0003, "H.324/demux (Demultiplex)" },
491 { 0x002c0004, "H.324/h223capr (Remote H.223 capability)" },
492 { 0x002c0005, "H.324/muxtbl_in (Incoming Multiplex Table)" },
493 { 0x002c0006, "H.324/muxtbl_out (Outgoing Multiplex Table)" },
495 { 0x800a0000, "Nokia Bearer Characteristics Package" },
500 static const value_string context_id_type[] = {
501 {NULL_CONTEXT,"0 (Null Context)"},
502 {CHOOSE_CONTEXT,"$ (Choose Context)"},
503 {ALL_CONTEXTS,"* (All Contexts)"},
510 static const value_string h248_reasons[] = {
511 { 400, "Syntax error in message"},
512 { 401, "Protocol Error"},
513 { 402, "Unauthorized"},
514 { 403, "Syntax error in transaction request"},
515 { 406, "Version Not Supported"},
516 { 410, "Incorrect identifier"},
517 { 411, "The transaction refers to an unknown ContextId"},
518 { 412, "No ContextIDs available"},
519 { 413, "Number of transactions in message exceeds maximum"}, /* [H.248.8 (08/07)] */
520 { 421, "Unknown action or illegal combination of actions"},
521 { 422, "Syntax Error in Action"},
522 { 430, "Unknown TerminationID"},
523 { 431, "No TerminationID matched a wildcard"},
524 { 432, "Out of TerminationIDs or No TerminationID available"},
525 { 433, "TerminationID is already in a Context"},
526 { 434, "Max number of Terminations in a Context exceeded"},
527 { 435, "Termination ID is not in specified Context"},
528 { 440, "Unsupported or unknown Package"},
529 { 441, "Missing Remote or Local Descriptor"},
530 { 442, "Syntax Error in Command"},
531 { 443, "Unsupported or Unknown Command"},
532 { 444, "Unsupported or Unknown Descriptor"},
533 { 445, "Unsupported or Unknown Property"},
534 { 446, "Unsupported or Unknown Parameter"},
535 { 447, "Descriptor not legal in this command"},
536 { 448, "Descriptor appears twice in a command"},
537 { 449, "Unsupported or Unknown Parameter or Property Value"},
538 { 450, "No such property in this package"},
539 { 451, "No such event in this package"},
540 { 452, "No such signal in this package"},
541 { 453, "No such statistic in this package"},
542 { 454, "No such parameter value in this package"},
543 { 455, "Property illegal in this Descriptor"},
544 { 456, "Property appears twice in this Descriptor"},
545 { 457, "Missing parameter in signal or event"},
546 { 458, "Unexpected Event/Request ID"},
547 { 459, "Unsupported or Unknown Profile"},
548 { 460, "Unable to set statistic on stream"},
549 { 461, "Unsupported or Unknown Profile"}, /*[H.248.18] */
551 { 471, "Implied Add for Multiplex failure"},
552 { 472, "Required Information Missing"}, /*[H.248.8 (08/07)] */
553 { 473, "Conflicting Property Values"}, /*[H.248.8 (08/07)] */
554 { 474, "Invalid SDP Syntax"}, /*[H.248.49] */
555 { 475, "Unable to pause the playout of the signal"}, /*[H.248.66] */
556 { 476, "Unable to adjust the data delivery speed of the Signal"}, /*[H.248.66] */
558 { 477, "Unable to adjust the playback relative scale of the signal"}, /*[H.248.66] */
560 { 478, "Behaviour Contradicts Resource Rule"}, /*[H.248.63] */
562 { 500, "Internal software Failure in MG"},
563 { 501, "Not Implemented"},
565 { 503, "Service Unavailable"},
566 { 504, "Command Received from unauthorized entity"},
567 { 505, "Transaction Request Received before a Service Change Reply has been received"},
568 { 506, "Number of Transaction Pendings Exceeded"},
569 { 510, "Insufficient resources"},
570 { 511, "Temporarily Busy"}, /* [H.248.8 (08/07)] */
571 { 512, "Media Gateway unequipped to detect requested Event"},
572 { 513, "Media Gateway unequipped to generate requested Signals"},
573 { 514, "Media Gateway cannot send the specified announcement"},
574 { 515, "Unsupported Media Type"},
575 { 517, "Unsupported or invalid mode"},
576 { 518, "Event buffer full"},
577 { 519, "Out of space to store digit map"},
578 { 520, "Digit Map undefined in the MG"},
579 { 521, "Termination is ServiceChangeing"},
580 { 522, "Functionality Requested in Topology Triple Not Supported"},
581 { 526, "Insufficient bandwidth"},
582 { 529, "Internal hardware failure in MG"},
583 { 530, "Temporary Network failure"},
584 { 531, "Permanent Network failure"},
585 { 532, "Audited Property, Statistic, Event or Signal does not exist"},
586 { 533, "Response exceeds maximum transport PDU size"},
587 { 534, "Illegal write or read only property"},
588 { 540, "Unexpected initial hook state"},
589 { 541, "Unexpected Spare Bit State"}, /* [H.248.33] */
590 { 542, "Command is not allowed on this termination"},
591 { 543, "MGC requested event detection timestamp not supported"}, /* [H.248.8 (08/07)] */
592 { 581, "Does Not Exist"},
593 { 600, "Illegal syntax within an announcement specification"},
594 { 601, "Variable type not supported"},
595 { 602, "Variable value out of range"},
596 { 603, "Category not supported"},
597 { 604, "Selector type not supported"},
598 { 605, "Selector value not supported"},
599 { 606, "Unknown segment ID"},
600 { 607, "Mismatch between play specification and provisioned data"},
601 { 608, "Provisioning error"},
602 { 609, "Invalid offset"},
603 { 610, "No free segment IDs"},
604 { 611, "Temporary segment not found"},
605 { 612, "Segment in use"},
606 { 613, "ISP port limit overrun"},
607 { 614, "No modems available"},
608 { 615, "Calling number unacceptable"},
609 { 616, "Called number unacceptable"},
610 { 617, "Reserved for H.248.9 return code"}, /* [H.248.9] */
611 { 618, "Reserved for H.248.9 return code"}, /* [H.248.9] */
612 { 622, "Reserved for H.248.9 return code"}, /* [H.248.9] */
613 { 623, "Reserved for H.248.9 return code"}, /* [H.248.9] */
614 { 624, "Reserved for H.248.9 return code"}, /* [H.248.9] */
615 { 625, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
616 { 626, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
617 { 627, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
618 { 628, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
619 { 629, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
620 { 700, "Sieve Script Syntax Error"}, /* [H.248.69] */
621 { 701, "Unsupported Sieve Require Error"}, /* [H.248.69] */
622 { 702, "Sieve Actions Exceeded Error"}, /* [H.248.69] */
624 { 900, "Service Restored"},
627 { 903, "MGC Directed Change"},
628 { 904, "Termination malfunctioning"},
629 { 905, "Termination taken out of service"},
630 { 906, "Loss of lower layer connectivity (e.g. downstream sync)"},
631 { 907, "Transmission Failure"},
632 { 908, "MG Impending Failure"},
633 { 909, "MGC Impending Failure"},
634 { 910, "Media Capability Failure"},
635 { 911, "Modem Capability Failure"},
636 { 912, "Mux Capability Failure"},
637 { 913, "Signal Capability Failure"},
638 { 914, "Event Capability Failure"},
639 { 915, "State Loss"},
640 { 916, "Packages Change"},
641 { 917, "Capabilities Change"},
642 { 918, "Cancel Graceful"},
643 { 919, "Warm Failover"},
644 { 920, "Cold Failover"},
648 static const value_string wildcard_modes[] = {
654 static const value_string wildcard_levels[] = {
655 { 0, "This One Level" },
656 { 1, "This Level and those below" },
660 static h248_curr_info_t curr_info = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
661 static guint32 error_code;
662 static gcp_wildcard_t wild_term;
665 extern void h248_param_ber_integer(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, int hfid, h248_curr_info_t* u _U_, void* implicit) {
667 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
668 dissect_ber_integer(implicit ? *((gboolean*)implicit) : FALSE, &asn1_ctx, tree, tvb, 0, hfid, NULL);
671 extern void h248_param_ber_octetstring(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, int hfid, h248_curr_info_t* u _U_, void* implicit) {
673 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
674 dissect_ber_octet_string(implicit ? *((gboolean*)implicit) : FALSE, &asn1_ctx, tree, tvb, 0, hfid, NULL);
677 extern void h248_param_ber_boolean(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, int hfid, h248_curr_info_t* u _U_, void* implicit) {
679 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
680 dissect_ber_boolean(implicit ? *((gboolean*)implicit) : FALSE, &asn1_ctx, tree, tvb, 0, hfid, NULL);
683 extern void h248_param_item(proto_tree* tree,
685 packet_info* pinfo _U_,
687 h248_curr_info_t* h248_info _U_,
689 int len = lenp ? *((int*)lenp) : -1;
690 proto_tree_add_item(tree,hfid,tvb,0,len,FALSE);
693 extern void h248_param_external_dissector(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo , int hfid _U_, h248_curr_info_t* u _U_, void* dissector_hdl) {
694 call_dissector((dissector_handle_t) dissector_hdl,tvb,pinfo,tree);
698 static const h248_package_t no_package = { 0xffff, &hf_h248_no_pkg, &ett_h248_no_pkg, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
699 static const h248_pkg_sig_t no_signal = { 0, &hf_h248_no_sig, &ett_h248_no_sig, NULL, NULL };
700 static const h248_pkg_param_t no_param = { 0, &hf_h248_param, h248_param_item, NULL };
701 static const h248_pkg_evt_t no_event = { 0, &hf_h248_no_evt, &ett_h248_no_evt, NULL, NULL };
703 static GPtrArray* packages = NULL;
705 extern void h248_param_PkgdName(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo , int hfid _U_, h248_curr_info_t* u1 _U_, void* u2 _U_) {
706 tvbuff_t *new_tvb = NULL;
707 proto_tree *package_tree=NULL;
708 guint16 name_major, name_minor;
710 const h248_package_t* pkg = NULL;
714 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
717 offset = dissect_ber_octet_string(FALSE, &asn1_ctx, tree, tvb, offset, hfid , &new_tvb);
720 /* this field is always 4 bytes so just read it into two integers */
721 name_major=tvb_get_ntohs(new_tvb, 0);
722 name_minor=tvb_get_ntohs(new_tvb, 2);
724 /* do the prettification */
725 proto_item_append_text(asn1_ctx.created_item, " %s (%04x)", val_to_str(name_major, package_name_vals, "Unknown Package"), name_major);
731 package_tree = proto_item_add_subtree(asn1_ctx.created_item, ett_packagename);
732 proto_tree_add_uint(package_tree, hf_h248_pkg_name, tvb, offset-4, 2, name_major);
734 for(i=0; i < packages->len; i++) {
735 pkg = g_ptr_array_index(packages,i);
737 if (name_major == pkg->id) {
744 if (! pkg ) pkg = &no_package;
747 pi = proto_tree_add_uint(package_tree, hf_248_pkg_param, tvb, offset-2, 2, name_minor);
749 if (pkg->signal_names && ( strval = match_strval(name_minor, pkg->signal_names) )) {
750 strval = ep_strdup_printf("%s (%d)",strval,name_minor);
752 strval = ep_strdup_printf("Unknown (%d)",name_minor);
755 proto_item_set_text(pi,"Signal ID: %s", strval);
762 static int dissect_h248_trx_id(gboolean implicit_tag, packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, guint32* trx_id_p) {
771 offset=dissect_ber_identifier(pinfo, tree, tvb, offset, &class, &pc, &tag);
772 offset=dissect_ber_length(pinfo, tree, tvb, offset, &len, NULL);
774 len=tvb_length_remaining(tvb, offset);
778 if (len > 8 || len < 1) {
782 trx_id=(trx_id<<8)|tvb_get_guint8(tvb, offset);
785 if (trx_id > 0xffffffff) {
786 proto_item* pi = proto_tree_add_text(tree, tvb, offset-len, len,"transactionId %" G_GINT64_MODIFIER "u", trx_id);
787 proto_item_set_expert_flags(pi, PI_MALFORMED, PI_WARN);
792 proto_tree_add_uint(tree, hf_h248_transactionId, tvb, offset-len, len, (guint32)trx_id);
793 *trx_id_p = (guint32)trx_id;
800 static int dissect_h248_ctx_id(gboolean implicit_tag, packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, guint32* ctx_id_p) {
809 offset=dissect_ber_identifier(pinfo, tree, tvb, offset, &class, &pc, &tag);
810 offset=dissect_ber_length(pinfo, tree, tvb, offset, &len, NULL);
812 len=tvb_length_remaining(tvb, offset);
816 if (len > 8 || len < 1) {
820 ctx_id=(ctx_id<<8)|tvb_get_guint8(tvb, offset);
824 if (ctx_id > 0xffffffff) {
825 proto_item* pi = proto_tree_add_text(tree, tvb, offset-len, len,
826 "contextId: %" G_GINT64_MODIFIER "u", ctx_id);
827 proto_item_set_expert_flags(pi, PI_MALFORMED, PI_WARN);
829 *ctx_id_p = 0xfffffffd;
832 proto_item* pi = proto_tree_add_uint(tree, hf_h248_context_id, tvb, offset-len, len, (guint32)ctx_id);
834 if ( ctx_id == NULL_CONTEXT ) {
835 proto_item_set_text(pi,"contextId: Null Context(0)");
836 } else if ( ctx_id == CHOOSE_CONTEXT ) {
837 proto_item_set_text(pi,"contextId: $ (Choose Context = 0xfffffffe)");
838 } else if ( ctx_id == ALL_CONTEXTS ) {
839 proto_item_set_text(pi,"contextId: * (All Contexts = 0xffffffff)");
842 *ctx_id_p = (guint32) ctx_id;
849 void h248_register_package(const h248_package_t* pkg) {
850 if (! packages) packages = g_ptr_array_new();
852 g_ptr_array_add(packages,(void*)pkg);
855 static guint32 packageandid;
857 static int dissect_h248_PkgdName(gboolean implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index) {
858 tvbuff_t *new_tvb = NULL;
859 proto_tree *package_tree=NULL;
860 guint16 name_major, name_minor;
862 const h248_package_t* pkg = NULL;
866 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
869 /* this field is always 4 bytes so just read it into two integers */
870 name_major=tvb_get_ntohs(new_tvb, 0);
871 name_minor=tvb_get_ntohs(new_tvb, 2);
872 packageandid=(name_major<<16)|name_minor;
874 /* do the prettification */
875 proto_item_append_text(actx->created_item, " %s (%04x)", val_to_str(name_major, package_name_vals, "Unknown Package"), name_major);
878 package_tree = proto_item_add_subtree(actx->created_item, ett_packagename);
879 proto_tree_add_uint(package_tree, hf_h248_pkg_name, tvb, offset-4, 2, name_major);
882 for(i=0; i < packages->len; i++) {
883 pkg = g_ptr_array_index(packages,i);
885 if (name_major == pkg->id) {
892 if (! pkg ) pkg = &no_package;
895 proto_item* pi = proto_tree_add_uint(package_tree, hf_248_pkg_param, tvb, offset-2, 2, name_minor);
898 if (pkg->param_names && ( strval = match_strval(name_minor, pkg->param_names) )) {
899 strval = ep_strdup_printf("%s (%d)",strval,name_minor);
901 strval = ep_strdup_printf("Unknown (%d)",name_minor);
904 proto_item_set_text(pi,"Parameter: %s", strval);
915 static int dissect_h248_EventName(gboolean implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index) {
917 proto_tree *package_tree=NULL;
918 guint16 name_major, name_minor;
920 const h248_package_t* pkg = NULL;
921 const h248_pkg_evt_t* evt = NULL;
925 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
928 /* this field is always 4 bytes so just read it into two integers */
929 name_major=tvb_get_ntohs(new_tvb, 0);
930 name_minor=tvb_get_ntohs(new_tvb, 2);
931 packageandid=(name_major<<16)|name_minor;
933 /* do the prettification */
934 proto_item_append_text(actx->created_item, " %s (%04x)", val_to_str(name_major, package_name_vals, "Unknown Package"), name_major);
936 package_tree = proto_item_add_subtree(actx->created_item, ett_packagename);
938 proto_tree_add_uint(package_tree, hf_h248_pkg_name, tvb, offset-4, 2, name_major);
941 for(i=0; i < packages->len; i++) {
942 pkg = g_ptr_array_index(packages,i);
944 if (name_major == pkg->id) {
951 if (! pkg ) pkg = &no_package;
956 for (evt = pkg->events; evt->hfid; evt++) {
957 if (name_minor == evt->id) {
962 if (! evt->hfid) evt = &no_event;
970 proto_item* pi = proto_tree_add_uint(package_tree, hf_h248_event_code, tvb, offset-2, 2, name_minor);
973 if (pkg->event_names && ( strval = match_strval(name_minor, pkg->event_names) )) {
974 strval = ep_strdup_printf("%s (%d)",strval,name_minor);
976 strval = ep_strdup_printf("Unknown (%d)",name_minor);
979 proto_item_set_text(pi,"Event ID: %s", strval);
983 curr_info.pkg = &no_package;
984 curr_info.evt = &no_event;
992 static int dissect_h248_SignalName(gboolean implicit_tag , tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index) {
994 proto_tree *package_tree=NULL;
995 guint16 name_major, name_minor;
997 const h248_package_t* pkg = NULL;
998 const h248_pkg_sig_t* sig;
1002 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
1005 /* this field is always 4 bytes so just read it into two integers */
1006 name_major=tvb_get_ntohs(new_tvb, 0);
1007 name_minor=tvb_get_ntohs(new_tvb, 2);
1008 packageandid=(name_major<<16)|name_minor;
1010 /* do the prettification */
1011 proto_item_append_text(actx->created_item, " %s (%04x)", val_to_str(name_major, package_name_vals, "Unknown Package"), name_major);
1013 package_tree = proto_item_add_subtree(actx->created_item, ett_packagename);
1015 proto_tree_add_uint(package_tree, hf_h248_pkg_name, tvb, offset-4, 2, name_major);
1017 for(i=0; i < packages->len; i++) {
1018 pkg = g_ptr_array_index(packages,i);
1020 if (name_major == pkg->id) {
1027 if (! pkg ) pkg = &no_package;
1030 for (sig = pkg->signals; sig->hfid; sig++) {
1031 if (name_minor == sig->id) {
1036 if (! sig->hfid) sig = &no_signal;
1038 curr_info.pkg = pkg;
1039 curr_info.sig = sig;
1041 curr_info.pkg = &no_package;
1042 curr_info.sig = &no_signal;
1046 proto_item* pi = proto_tree_add_uint(package_tree, hf_h248_signal_code, tvb, offset-2, 2, name_minor);
1047 const gchar* strval;
1049 if (pkg->signal_names && ( strval = match_strval(name_minor, pkg->signal_names) )) {
1050 strval = ep_strdup_printf("%s (%d)",strval,name_minor);
1052 strval = ep_strdup_printf("Unknown (%d)",name_minor);
1055 proto_item_set_text(pi,"Signal ID: %s", strval);
1059 curr_info.pkg = &no_package;
1060 curr_info.sig = &no_signal;
1066 static int dissect_h248_PropertyID(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
1074 int old_offset, end_offset;
1076 const h248_package_t* pkg;
1077 const h248_pkg_param_t* prop;
1080 offset=dissect_ber_identifier(actx->pinfo, tree, tvb, offset, &class, &pc, &tag);
1081 offset=dissect_ber_length(actx->pinfo, tree, tvb, offset, &len, &ind);
1082 end_offset=offset+len;
1084 if( (class!=BER_CLASS_UNI)
1085 ||(tag!=BER_UNI_TAG_OCTETSTRING) ){
1086 proto_tree_add_text(tree, tvb, offset-2, 2, "H.248 BER Error: OctetString expected but Class:%d PC:%d Tag:%d was unexpected", class, pc, tag);
1091 next_tvb = tvb_new_subset(tvb, offset , len , len );
1092 name_major = packageandid >> 16;
1093 name_minor = packageandid & 0xffff;
1095 pkg = (curr_info.pkg) ? curr_info.pkg : &no_package;
1097 if (pkg->properties) {
1098 for (prop = pkg->properties; prop && prop->hfid; prop++) {
1099 if (name_minor == prop->id) {
1107 if (prop && prop->hfid ) {
1108 if (!prop->dissector) prop = &no_param;
1109 prop->dissector(tree, next_tvb, actx->pinfo, *(prop->hfid), &curr_info, prop->data);
1116 static int dissect_h248_SigParameterName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
1118 guint32 param_id = 0xffffffff;
1119 const h248_pkg_param_t* sigpar;
1120 const gchar* strval;
1123 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &next_tvb);
1124 pi = actx->created_item;
1126 switch(tvb_length(next_tvb)) {
1127 case 4: param_id = tvb_get_ntohl(next_tvb,0); break;
1128 case 3: param_id = tvb_get_ntoh24(next_tvb,0); break;
1129 case 2: param_id = tvb_get_ntohs(next_tvb,0); break;
1130 case 1: param_id = tvb_get_guint8(next_tvb,0); break;
1134 curr_info.par = &no_param;
1136 if (curr_info.sig && curr_info.sig->parameters) {
1137 for(sigpar = curr_info.sig->parameters; sigpar->hfid; sigpar++) {
1138 if (sigpar->id == param_id) {
1139 curr_info.par = sigpar;
1145 if (curr_info.sig && curr_info.sig->param_names && ( strval = match_strval(param_id, curr_info.sig->param_names) )) {
1146 strval = ep_strdup_printf("%s (%d)",strval,param_id);
1148 strval = ep_strdup_printf("Unknown (%d)",param_id);
1151 proto_item_set_text(pi,"Parameter: %s", strval);
1156 static int dissect_h248_SigParamValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
1158 int old_offset, end_offset;
1165 offset=dissect_ber_identifier(actx->pinfo, tree, tvb, offset, &class, &pc, &tag);
1166 offset=dissect_ber_length(actx->pinfo, tree, tvb, offset, &len, &ind);
1167 end_offset=offset+len;
1169 if( (class!=BER_CLASS_UNI)
1170 ||(tag!=BER_UNI_TAG_OCTETSTRING) ){
1171 proto_tree_add_text(tree, tvb, offset-2, 2, "H.248 BER Error: OctetString expected but Class:%d PC:%d Tag:%d was unexpected", class, pc, tag);
1176 next_tvb = tvb_new_subset(tvb,offset,len,len);
1178 if ( curr_info.par && curr_info.par->dissector) {
1179 curr_info.par->dissector(tree, next_tvb, actx->pinfo, *(curr_info.par->hfid), &curr_info, curr_info.par->data);
1185 static int dissect_h248_EventParameterName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
1187 guint32 param_id = 0xffffffff;
1188 const h248_pkg_param_t* evtpar;
1189 const gchar* strval;
1192 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &next_tvb);
1193 pi = actx->created_item;
1196 switch(tvb_length(next_tvb)) {
1197 case 4: param_id = tvb_get_ntohl(next_tvb,0); break;
1198 case 3: param_id = tvb_get_ntoh24(next_tvb,0); break;
1199 case 2: param_id = tvb_get_ntohs(next_tvb,0); break;
1200 case 1: param_id = tvb_get_guint8(next_tvb,0); break;
1206 curr_info.par = &no_param;
1208 if (curr_info.evt && curr_info.evt->parameters) {
1209 for(evtpar = curr_info.evt->parameters; evtpar->hfid; evtpar++) {
1210 if (evtpar->id == param_id) {
1211 curr_info.par = evtpar;
1216 curr_info.par = &no_param;
1219 if (curr_info.evt && curr_info.evt->param_names && ( strval = match_strval(param_id, curr_info.evt->param_names) )) {
1220 strval = ep_strdup_printf("%s (%d)",strval,param_id);
1222 strval = ep_strdup_printf("Unknown (%d)",param_id);
1225 proto_item_set_text(pi,"Parameter: %s", strval);
1231 static int dissect_h248_EventParamValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
1233 int old_offset, end_offset;
1240 offset=dissect_ber_identifier(actx->pinfo, tree, tvb, offset, &class, &pc, &tag);
1241 offset=dissect_ber_length(actx->pinfo, tree, tvb, offset, &len, &ind);
1242 end_offset=offset+len;
1244 if( (class!=BER_CLASS_UNI)
1245 ||(tag!=BER_UNI_TAG_OCTETSTRING) ){
1246 proto_tree_add_text(tree, tvb, offset-2, 2, "H.248 BER Error: OctetString expected but Class:%d PC:%d Tag:%d was unexpected", class, pc, tag);
1251 next_tvb = tvb_new_subset(tvb,offset,len,len);
1253 if ( curr_info.par && curr_info.par->dissector) {
1254 curr_info.par->dissector(tree, next_tvb, actx->pinfo, *(curr_info.par->hfid), &curr_info, curr_info.par->data);
1260 static int dissect_h248_MtpAddress(gboolean implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index) {
1262 proto_tree *mtp_tree=NULL;
1264 int i, len, old_offset;
1267 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
1270 /* this field is either 2 or 4 bytes so just read it into an integer */
1272 len=tvb_length(new_tvb);
1274 val= (val<<8)|tvb_get_guint8(new_tvb, i);
1277 /* do the prettification */
1278 proto_item_append_text(actx->created_item, " NI = %d, PC = %d ( %d-%d )", val&0x03,val>>2,val&0x03,val>>2);
1280 mtp_tree = proto_item_add_subtree(actx->created_item, ett_mtpaddress);
1282 proto_tree_add_uint(mtp_tree, hf_h248_mtpaddress_ni, tvb, old_offset, offset-old_offset, val&0x03);
1283 proto_tree_add_uint(mtp_tree, hf_h248_mtpaddress_pc, tvb, old_offset, offset-old_offset, val>>2);
1289 #define H248_TAP() do { if (keep_persistent_data && curr_info.cmd) tap_queue_packet(h248_tap, actx->pinfo, curr_info.cmd); } while(0)
1291 #include "packet-h248-fn.c"
1293 static void dissect_h248_tpkt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
1294 dissect_tpkt_encap(tvb, pinfo, tree, h248_desegment, h248_handle);
1298 dissect_h248(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1300 proto_item *h248_item;
1301 asn1_ctx_t asn1_ctx;
1305 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1307 curr_info.msg = NULL;
1308 curr_info.trx = NULL;
1309 curr_info.ctx = NULL;
1310 curr_info.cmd = NULL;
1311 curr_info.term = NULL;
1312 curr_info.pkg = NULL;
1313 curr_info.evt = NULL;
1314 curr_info.sig = NULL;
1315 curr_info.stat = NULL;
1316 curr_info.par = NULL;
1318 /* Check if it is actually a text-based H.248 encoding, which we
1319 dissect with the "megaco" dissector in Wireshark. (Both
1320 encodings are MEGACO (RFC 3015) and both are H.248.)
1322 if(tvb_length(tvb)>=6){
1323 if(!tvb_strneql(tvb, 0, "MEGACO", 6)){
1324 static dissector_handle_t megaco_handle=NULL;
1326 megaco_handle = find_dissector("megaco");
1329 call_dissector(megaco_handle, tvb, pinfo, tree);
1335 /* Make entry in the Protocol column on summary display */
1336 if (check_col(pinfo->cinfo, COL_PROTOCOL))
1337 col_set_str(pinfo->cinfo, COL_PROTOCOL, "H.248");
1340 h248_item = proto_tree_add_item(tree, proto_h248, tvb, 0, -1, FALSE);
1341 h248_tree = proto_item_add_subtree(h248_item, ett_h248);
1344 dissect_h248_MegacoMessage(FALSE, tvb, 0, &asn1_ctx, h248_tree, -1);
1348 /*--- proto_register_h248 ----------------------------------------------*/
1349 void proto_reg_handoff_h248(void);
1351 void proto_register_h248(void) {
1353 /* List of fields */
1354 static hf_register_info hf[] = {
1355 { &hf_h248_mtpaddress_ni, {
1356 "NI", "h248.mtpaddress.ni", FT_UINT32, BASE_DEC,
1357 NULL, 0, "NI", HFILL }},
1358 { &hf_h248_mtpaddress_pc, {
1359 "PC", "h248.mtpaddress.pc", FT_UINT32, BASE_DEC,
1360 NULL, 0, "PC", HFILL }},
1361 { &hf_h248_pkg_name, {
1362 "Package", "h248.package_name", FT_UINT16, BASE_HEX,
1363 VALS(package_name_vals), 0, "Package", HFILL }},
1364 { &hf_248_pkg_param, {
1365 "Parameter ID", "h248.package_paramid", FT_UINT16, BASE_HEX,
1366 NULL, 0, "Parameter ID", HFILL }},
1367 { &hf_h248_signal_code, {
1368 "Signal ID", "h248.package_signalid", FT_UINT16, BASE_HEX,
1369 NULL, 0, "Parameter ID", HFILL }},
1370 { &hf_h248_event_code, {
1371 "Event ID", "h248.package_eventid", FT_UINT16, BASE_HEX,
1372 NULL, 0, "Parameter ID", HFILL }},
1373 { &hf_h248_event_name, {
1374 "Package and Event name", "h248.event_name", FT_UINT32, BASE_HEX,
1375 VALS(event_name_vals), 0, "Package", HFILL }},
1376 { &hf_h248_signal_name, {
1377 "Package and Signal name", "h248.signal_name", FT_UINT32, BASE_HEX,
1378 VALS(signal_name_vals), 0, "Package", HFILL }},
1379 { &hf_h248_pkg_bcp_BNCChar_PDU,
1380 { "BNCChar", "h248.package_bcp.BNCChar",
1381 FT_UINT32, BASE_DEC, VALS(gcp_term_types), 0,
1382 "BNCChar", HFILL }},
1384 { &hf_h248_error_code,
1385 { "errorCode", "h248.errorCode",
1386 FT_UINT32, BASE_DEC, VALS(h248_reasons), 0,
1387 "ErrorDescriptor/errorCode", HFILL }},
1388 { &hf_h248_context_id,
1389 { "contextId", "h248.contextId",
1390 FT_UINT32, BASE_HEX, NULL, 0,
1391 "Context ID", HFILL }},
1392 { &hf_h248_term_wild_type,
1393 { "Wildcard Mode", "h248.term.wildcard.mode",
1394 FT_UINT8, BASE_DEC, VALS(wildcard_modes), 0x80,
1396 { &hf_h248_term_wild_level,
1397 { "Wildcarding Level", "h248.term.wildcard.level",
1398 FT_UINT8, BASE_DEC, VALS(wildcard_levels), 0x40,
1400 { &hf_h248_term_wild_position,
1401 { "Wildcarding Position", "h248.term.wildcard.pos",
1402 FT_UINT8, BASE_DEC, NULL, 0x3F,
1406 { "Unknown Package", "h248.pkg.unknown",
1407 FT_BYTES, BASE_HEX, NULL, 0,
1410 { "Unknown Signal", "h248.pkg.unknown.sig",
1411 FT_BYTES, BASE_HEX, NULL, 0,
1414 { "Unknown Event", "h248.pkg.unknown.evt",
1415 FT_BYTES, BASE_HEX, NULL, 0,
1418 { "Parameter", "h248.pkg.unknown.param",
1419 FT_BYTES, BASE_HEX, NULL, 0,
1421 { &hf_h248_serviceChangeReasonStr,
1422 { "ServiceChangeReasonStr", "h248.serviceChangeReasonstr",
1423 FT_STRING, BASE_NONE, NULL, 0,
1424 "h248.IA5String", HFILL }},
1426 #include "packet-h248-hfarr.c"
1428 GCP_HF_ARR_ELEMS("h248",h248_arrel)
1432 /* List of subtrees */
1433 static gint *ett[] = {
1442 GCP_ETT_ARR_ELEMS(h248_arrel),
1444 #include "packet-h248-ettarr.c"
1447 module_t *h248_module;
1450 /* Register protocol */
1451 proto_h248 = proto_register_protocol(PNAME, PSNAME, PFNAME);
1452 register_dissector("h248", dissect_h248, proto_h248);
1453 register_dissector("h248.tpkt", dissect_h248_tpkt, proto_h248);
1455 /* Register fields and subtrees */
1456 proto_register_field_array(proto_h248, hf, array_length(hf));
1457 proto_register_subtree_array(ett, array_length(ett));
1459 h248_module = prefs_register_protocol(proto_h248, proto_reg_handoff_h248);
1460 prefs_register_bool_preference(h248_module, "ctx_info",
1462 "Mantain relationships between transactions and contexts and display an extra tree showing context data",
1463 &keep_persistent_data);
1464 prefs_register_uint_preference(h248_module, "udp_port",
1466 "Port to be decoded as h248",
1469 prefs_register_uint_preference(h248_module, "tcp_port",
1471 "Port to be decoded as h248",
1474 prefs_register_bool_preference(h248_module, "desegment",
1475 "Desegment H.248 over TCP",
1476 "Desegment H.248 messages that span more TCP segments",
1479 msgs = se_tree_create(EMEM_TREE_TYPE_RED_BLACK, "h248_msgs");
1480 trxs = se_tree_create(EMEM_TREE_TYPE_RED_BLACK, "h248_trxs");
1481 ctxs_by_trx = se_tree_create(EMEM_TREE_TYPE_RED_BLACK, "h248_ctxs_by_trx");
1482 ctxs = se_tree_create(EMEM_TREE_TYPE_RED_BLACK, "h248_ctxs");
1484 h248_tap = register_tap("h248");
1489 /*--- proto_reg_handoff_h248 -------------------------------------------*/
1490 void proto_reg_handoff_h248(void) {
1492 static gboolean initialized = FALSE;
1493 static guint32 udp_port;
1494 static guint32 tcp_port;
1497 h248_handle = find_dissector("h248");
1498 h248_tpkt_handle = find_dissector("h248.tpkt");
1499 dissector_add("mtp3.service_indicator", GATEWAY_CONTROL_PROTOCOL_USER_ID, h248_handle);
1500 h248_term_handle = find_dissector("h248term");
1504 dissector_delete("udp.port", udp_port, h248_handle);
1507 dissector_delete("tcp.port", tcp_port, h248_tpkt_handle);
1510 udp_port = global_udp_port;
1511 tcp_port = global_tcp_port;
1513 if (udp_port != 0) {
1514 dissector_add("udp.port", udp_port, h248_handle);
1517 if (tcp_port != 0) {
1518 dissector_add("tcp.port", tcp_port, h248_tpkt_handle);