Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-h248.c
blob1dfaa30864894770ade40b6803854eaec2c6aa9a
1 /* Do not modify this file. Changes will be overwritten. */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler */
3 /* packet-h248.c */
4 /* asn2wrs.py -b -q -L -p h248 -c ./h248.cnf -s ./packet-h248-template -D . -O ../.. h248v3.asn h248v1support.asn */
6 /* packet-h248.c
7 * Routines for H.248/MEGACO packet dissection
9 * Ronnie Sahlberg 2004
11 * Luis Ontanon 2005 - Context and Transaction Tracing
13 * Wireshark - Network traffic analyzer
14 * By Gerald Combs <gerald@wireshark.org>
15 * Copyright 1998 Gerald Combs
17 * SPDX-License-Identifier: GPL-2.0-or-later
20 #include "config.h"
22 #include <epan/packet.h>
23 #include <epan/exceptions.h>
24 #include <epan/tap.h>
25 #include <epan/asn1.h>
26 #include <epan/proto_data.h>
27 #include <epan/prefs.h>
28 #include <epan/exported_pdu.h>
29 #include <epan/address_types.h>
30 #include <wsutil/array.h>
31 #include "packet-alcap.h"
32 #include "packet-ber.h"
33 #include "packet-tpkt.h"
34 #include "packet-mtp3.h"
35 #include "packet-h248.h"
37 #define PNAME "H.248 MEGACO"
38 #define PSNAME "H.248"
39 #define PFNAME "h248"
41 void proto_register_h248(void);
43 /* Initialize the protocol and registered fields */
44 static int proto_h248;
45 static int hf_248_magic_num;
46 static int hf_h248_mtpaddress_ni;
47 static int hf_h248_mtpaddress_pc;
48 static int hf_h248_pkg_name;
49 static int hf_248_pkg_param;
50 static int hf_h248_event_name;
51 static int hf_h248_signal_name;
52 static int hf_h248_signal_code;
53 static int hf_h248_event_code;
54 static int hf_h248_pkg_bcp_BNCChar_PDU;
58 static int hf_h248_context_id;
59 static int hf_h248_term_wild_type;
60 static int hf_h248_term_wild_level;
61 static int hf_h248_term_wild_position;
63 static int hf_h248_no_pkg;
64 static int hf_h248_no_sig;
65 static int hf_h248_no_evt;
66 static int hf_h248_param;
68 static int hf_h248_serviceChangeReasonStr;
69 static int hf_h248_transactionId64;
70 static int hf_h248_context_id64;
72 /* h248v1 support */
73 static int hf_h248_auditValueReplyV1;
75 static int hf_h248_authHeader; /* AuthenticationHeader */
76 static int hf_h248_mess; /* Message */
77 static int hf_h248_secParmIndex; /* SecurityParmIndex */
78 static int hf_h248_seqNum; /* SequenceNum */
79 static int hf_h248_ad; /* AuthData */
80 static int hf_h248_version; /* T_version */
81 static int hf_h248_mId; /* MId */
82 static int hf_h248_messageBody; /* T_messageBody */
83 static int hf_h248_messageError; /* ErrorDescriptor */
84 static int hf_h248_transactions; /* SEQUENCE_OF_Transaction */
85 static int hf_h248_transactions_item; /* Transaction */
86 static int hf_h248_ip4Address; /* IP4Address */
87 static int hf_h248_ip6Address; /* IP6Address */
88 static int hf_h248_domainName; /* DomainName */
89 static int hf_h248_deviceName; /* PathName */
90 static int hf_h248_mtpAddress; /* MtpAddress */
91 static int hf_h248_domName; /* IA5String */
92 static int hf_h248_portNumber; /* INTEGER_0_65535 */
93 static int hf_h248_iP4Address; /* OCTET_STRING_SIZE_4 */
94 static int hf_h248_iP6Address; /* OCTET_STRING_SIZE_16 */
95 static int hf_h248_transactionRequest; /* TransactionRequest */
96 static int hf_h248_transactionPending; /* TransactionPending */
97 static int hf_h248_transactionReply; /* TransactionReply */
98 static int hf_h248_transactionResponseAck; /* TransactionResponseAck */
99 static int hf_h248_segmentReply; /* SegmentReply */
100 static int hf_h248_transactionId; /* T_transactionId */
101 static int hf_h248_actions; /* SEQUENCE_OF_ActionRequest */
102 static int hf_h248_actions_item; /* ActionRequest */
103 static int hf_h248_tpend_transactionId; /* T_tpend_transactionId */
104 static int hf_h248_trep_transactionId; /* T_trep_transactionId */
105 static int hf_h248_immAckRequired; /* NULL */
106 static int hf_h248_transactionResult; /* T_transactionResult */
107 static int hf_h248_transactionError; /* ErrorDescriptor */
108 static int hf_h248_actionReplies; /* SEQUENCE_OF_ActionReply */
109 static int hf_h248_actionReplies_item; /* ActionReply */
110 static int hf_h248_segmentNumber; /* SegmentNumber */
111 static int hf_h248_segmentationComplete; /* NULL */
112 static int hf_h248_seg_rep_transactionId; /* T_seg_rep_transactionId */
113 static int hf_h248_TransactionResponseAck_item; /* TransactionAck */
114 static int hf_h248_firstAck; /* TransactionId */
115 static int hf_h248_lastAck; /* TransactionId */
116 static int hf_h248_errorCode; /* T_errorCode */
117 static int hf_h248_errorText; /* ErrorText */
118 static int hf_h248_contextId; /* ContextId */
119 static int hf_h248_contextRequest; /* ContextRequest */
120 static int hf_h248_contextAttrAuditReq; /* T_contextAttrAuditReq */
121 static int hf_h248_commandRequests; /* SEQUENCE_OF_CommandRequest */
122 static int hf_h248_commandRequests_item; /* CommandRequest */
123 static int hf_h248_errorDescriptor; /* ErrorDescriptor */
124 static int hf_h248_contextReply; /* ContextRequest */
125 static int hf_h248_commandReply; /* SEQUENCE_OF_CommandReply */
126 static int hf_h248_commandReply_item; /* CommandReply */
127 static int hf_h248_priority; /* INTEGER_0_15 */
128 static int hf_h248_emergency; /* BOOLEAN */
129 static int hf_h248_topologyReq; /* T_topologyReq */
130 static int hf_h248_topologyReq_item; /* TopologyRequest */
131 static int hf_h248_iepscallind_BOOL; /* Iepscallind_BOOL */
132 static int hf_h248_contextProp; /* SEQUENCE_OF_PropertyParm */
133 static int hf_h248_contextProp_item; /* PropertyParm */
134 static int hf_h248_contextList; /* SEQUENCE_OF_ContextIDinList */
135 static int hf_h248_contextList_item; /* ContextIDinList */
136 static int hf_h248_topology; /* NULL */
137 static int hf_h248_cAAREmergency; /* NULL */
138 static int hf_h248_cAARPriority; /* NULL */
139 static int hf_h248_iepscallind; /* NULL */
140 static int hf_h248_contextPropAud; /* SEQUENCE_OF_IndAudPropertyParm */
141 static int hf_h248_contextPropAud_item; /* IndAudPropertyParm */
142 static int hf_h248_selectpriority; /* INTEGER_0_15 */
143 static int hf_h248_selectemergency; /* BOOLEAN */
144 static int hf_h248_selectiepscallind; /* BOOLEAN */
145 static int hf_h248_selectLogic; /* SelectLogic */
146 static int hf_h248_andAUDITSelect; /* NULL */
147 static int hf_h248_orAUDITSelect; /* NULL */
148 static int hf_h248_command; /* Command */
149 static int hf_h248_optional; /* NULL */
150 static int hf_h248_wildcardReturn; /* NULL */
151 static int hf_h248_addReq; /* T_addReq */
152 static int hf_h248_moveReq; /* T_moveReq */
153 static int hf_h248_modReq; /* T_modReq */
154 static int hf_h248_subtractReq; /* T_subtractReq */
155 static int hf_h248_auditCapRequest; /* T_auditCapRequest */
156 static int hf_h248_auditValueRequest; /* T_auditValueRequest */
157 static int hf_h248_notifyReq; /* T_notifyReq */
158 static int hf_h248_serviceChangeReq; /* ServiceChangeRequest */
159 static int hf_h248_addReply; /* T_addReply */
160 static int hf_h248_moveReply; /* T_moveReply */
161 static int hf_h248_modReply; /* T_modReply */
162 static int hf_h248_subtractReply; /* T_subtractReply */
163 static int hf_h248_auditCapReply; /* T_auditCapReply */
164 static int hf_h248_auditValueReply; /* T_auditValueReply */
165 static int hf_h248_notifyReply; /* T_notifyReply */
166 static int hf_h248_serviceChangeReply; /* ServiceChangeReply */
167 static int hf_h248_terminationFrom; /* TerminationID */
168 static int hf_h248_terminationTo; /* TerminationID */
169 static int hf_h248_topologyDirection; /* T_topologyDirection */
170 static int hf_h248_streamID; /* StreamID */
171 static int hf_h248_topologyDirectionExtension; /* T_topologyDirectionExtension */
172 static int hf_h248_terminationIDList; /* TerminationIDList */
173 static int hf_h248_descriptors; /* SEQUENCE_OF_AmmDescriptor */
174 static int hf_h248_descriptors_item; /* AmmDescriptor */
175 static int hf_h248_mediaDescriptor; /* MediaDescriptor */
176 static int hf_h248_modemDescriptor; /* ModemDescriptor */
177 static int hf_h248_muxDescriptor; /* MuxDescriptor */
178 static int hf_h248_eventsDescriptor; /* EventsDescriptor */
179 static int hf_h248_eventBufferDescriptor; /* EventBufferDescriptor */
180 static int hf_h248_signalsDescriptor; /* SignalsDescriptor */
181 static int hf_h248_digitMapDescriptor; /* DigitMapDescriptor */
182 static int hf_h248_auditDescriptor; /* AuditDescriptor */
183 static int hf_h248_aDstatisticsDescriptor; /* StatisticsDescriptor */
184 static int hf_h248_terminationAudit; /* TerminationAudit */
185 static int hf_h248_terminationID; /* TerminationID */
186 static int hf_h248_contextAuditResult; /* TerminationIDList */
187 static int hf_h248_error; /* ErrorDescriptor */
188 static int hf_h248_auditResult; /* AuditResult */
189 static int hf_h248_auditResultTermList; /* TermListAuditResult */
190 static int hf_h248_terminationAuditResult; /* TerminationAudit */
191 static int hf_h248_TerminationAudit_item; /* AuditReturnParameter */
192 static int hf_h248_observedEventsDescriptor; /* ObservedEventsDescriptor */
193 static int hf_h248_aRPstatisticsDescriptor; /* StatisticsDescriptor */
194 static int hf_h248_packagesDescriptor; /* PackagesDescriptor */
195 static int hf_h248_emptyDescriptors; /* AuditDescriptor */
196 static int hf_h248_auditToken; /* T_auditToken */
197 static int hf_h248_auditPropertyToken; /* SEQUENCE_OF_IndAuditParameter */
198 static int hf_h248_auditPropertyToken_item; /* IndAuditParameter */
199 static int hf_h248_indaudmediaDescriptor; /* IndAudMediaDescriptor */
200 static int hf_h248_indaudeventsDescriptor; /* IndAudEventsDescriptor */
201 static int hf_h248_indaudeventBufferDescriptor; /* IndAudEventBufferDescriptor */
202 static int hf_h248_indaudsignalsDescriptor; /* IndAudSignalsDescriptor */
203 static int hf_h248_indauddigitMapDescriptor; /* IndAudDigitMapDescriptor */
204 static int hf_h248_indaudstatisticsDescriptor; /* IndAudStatisticsDescriptor */
205 static int hf_h248_indaudpackagesDescriptor; /* IndAudPackagesDescriptor */
206 static int hf_h248_indAudTerminationStateDescriptor; /* IndAudTerminationStateDescriptor */
207 static int hf_h248_indAudMediaDescriptorStreams; /* IndAudMediaDescriptorStreams */
208 static int hf_h248_oneStream; /* IndAudStreamParms */
209 static int hf_h248_multiStream; /* SEQUENCE_OF_IndAudStreamDescriptor */
210 static int hf_h248_multiStream_item; /* IndAudStreamDescriptor */
211 static int hf_h248_indAudStreamParms; /* IndAudStreamParms */
212 static int hf_h248_iASPLocalControlDescriptor; /* IndAudLocalControlDescriptor */
213 static int hf_h248_iASPLocalDescriptor; /* IndAudLocalRemoteDescriptor */
214 static int hf_h248_iASPRemoteDescriptor; /* IndAudLocalRemoteDescriptor */
215 static int hf_h248_statisticsDescriptor; /* IndAudStatisticsDescriptor */
216 static int hf_h248_iALCDStreamMode; /* NULL */
217 static int hf_h248_iALCDReserveValue; /* NULL */
218 static int hf_h248_iALCDReserveGroup; /* NULL */
219 static int hf_h248_indAudPropertyParms; /* SEQUENCE_OF_IndAudPropertyParm */
220 static int hf_h248_indAudPropertyParms_item; /* IndAudPropertyParm */
221 static int hf_h248_streamModeSel; /* StreamMode */
222 static int hf_h248_name; /* PkgdName */
223 static int hf_h248_propertyParms; /* PropertyParm */
224 static int hf_h248_propGroupID; /* INTEGER_0_65535 */
225 static int hf_h248_iAPropertyGroup; /* IndAudPropertyGroup */
226 static int hf_h248_IndAudPropertyGroup_item; /* IndAudPropertyParm */
227 static int hf_h248_eventBufferControl; /* NULL */
228 static int hf_h248_iATSDServiceState; /* NULL */
229 static int hf_h248_serviceStateSel; /* ServiceState */
230 static int hf_h248_requestID; /* RequestID */
231 static int hf_h248_iAEDPkgdName; /* PkgdName */
232 static int hf_h248_iAEBDEventName; /* PkgdName */
233 static int hf_h248_indAudSignal; /* IndAudSignal */
234 static int hf_h248_indAudSeqSigList; /* IndAudSeqSigList */
235 static int hf_h248_id; /* INTEGER_0_65535 */
236 static int hf_h248_iASignalList; /* IndAudSignal */
237 static int hf_h248_iASignalName; /* PkgdName */
238 static int hf_h248_signalRequestID; /* RequestID */
239 static int hf_h248_digitMapName; /* DigitMapName */
240 static int hf_h248_iAStatName; /* PkgdName */
241 static int hf_h248_packageName; /* Name */
242 static int hf_h248_packageVersion; /* INTEGER_0_99 */
243 static int hf_h248_requestId; /* RequestID */
244 static int hf_h248_observedEventLst; /* SEQUENCE_OF_ObservedEvent */
245 static int hf_h248_observedEventLst_item; /* ObservedEvent */
246 static int hf_h248_eventName; /* EventName */
247 static int hf_h248_eventParList; /* SEQUENCE_OF_EventParameter */
248 static int hf_h248_eventParList_item; /* EventParameter */
249 static int hf_h248_timeNotation; /* TimeNotation */
250 static int hf_h248_eventParameterName; /* EventParameterName */
251 static int hf_h248_eventParamValue; /* EventParamValues */
252 static int hf_h248_eventPar_extraInfo; /* EventPar_extraInfo */
253 static int hf_h248_relation; /* Relation */
254 static int hf_h248_range; /* BOOLEAN */
255 static int hf_h248_sublist; /* BOOLEAN */
256 static int hf_h248_EventParamValues_item; /* EventParamValue */
257 static int hf_h248_serviceChangeParms; /* ServiceChangeParm */
258 static int hf_h248_serviceChangeResult; /* ServiceChangeResult */
259 static int hf_h248_serviceChangeResParms; /* ServiceChangeResParm */
260 static int hf_h248_wildcard; /* SEQUENCE_OF_WildcardField */
261 static int hf_h248_wildcard_item; /* WildcardField */
262 static int hf_h248_terminationId; /* T_terminationId */
263 static int hf_h248_TerminationIDList_item; /* TerminationID */
264 static int hf_h248_termStateDescr; /* TerminationStateDescriptor */
265 static int hf_h248_streams; /* T_streams */
266 static int hf_h248_mediaDescriptorOneStream; /* StreamParms */
267 static int hf_h248_mediaDescriptorMultiStream; /* SEQUENCE_OF_StreamDescriptor */
268 static int hf_h248_mediaDescriptorMultiStream_item; /* StreamDescriptor */
269 static int hf_h248_streamParms; /* StreamParms */
270 static int hf_h248_localControlDescriptor; /* LocalControlDescriptor */
271 static int hf_h248_localDescriptor; /* LocalRemoteDescriptor */
272 static int hf_h248_remoteDescriptor; /* LocalRemoteDescriptor */
273 static int hf_h248_sPstatisticsDescriptor; /* StatisticsDescriptor */
274 static int hf_h248_streamMode; /* StreamMode */
275 static int hf_h248_reserveValue; /* BOOLEAN */
276 static int hf_h248_reserveGroup; /* BOOLEAN */
277 static int hf_h248_lCDpropertyParms; /* SEQUENCE_OF_PropertyParm */
278 static int hf_h248_lCDpropertyParms_item; /* PropertyParm */
279 static int hf_h248_propertyName; /* PropertyName */
280 static int hf_h248_propertyParamValue; /* SEQUENCE_OF_PropertyID */
281 static int hf_h248_propertyParamValue_item; /* PropertyID */
282 static int hf_h248_propParm_extraInfo; /* PropParm_extraInfo */
283 static int hf_h248_propGrps; /* SEQUENCE_OF_PropertyGroup */
284 static int hf_h248_propGrps_item; /* PropertyGroup */
285 static int hf_h248_PropertyGroup_item; /* PropertyParm */
286 static int hf_h248_tSDpropertyParms; /* SEQUENCE_OF_PropertyParm */
287 static int hf_h248_tSDpropertyParms_item; /* PropertyParm */
288 static int hf_h248_tSEventBufferControl; /* EventBufferControl */
289 static int hf_h248_serviceState; /* ServiceState */
290 static int hf_h248_muxType; /* MuxType */
291 static int hf_h248_termList; /* SEQUENCE_OF_TerminationID */
292 static int hf_h248_termList_item; /* TerminationID */
293 static int hf_h248_nonStandardData; /* NonStandardData */
294 static int hf_h248_eventList; /* SEQUENCE_OF_RequestedEvent */
295 static int hf_h248_eventList_item; /* RequestedEvent */
296 static int hf_h248_eventAction; /* RequestedActions */
297 static int hf_h248_evParList; /* SEQUENCE_OF_EventParameter */
298 static int hf_h248_evParList_item; /* EventParameter */
299 static int hf_h248_secondEvent; /* SecondEventsDescriptor */
300 static int hf_h248_notifyImmediate; /* NULL */
301 static int hf_h248_notifyRegulated; /* RegulatedEmbeddedDescriptor */
302 static int hf_h248_neverNotify; /* NULL */
303 static int hf_h248_keepActive; /* BOOLEAN */
304 static int hf_h248_eventDM; /* EventDM */
305 static int hf_h248_notifyBehaviour; /* NotifyBehaviour */
306 static int hf_h248_resetEventsDescriptor; /* NULL */
307 static int hf_h248_digitMapValue; /* DigitMapValue */
308 static int hf_h248_secondaryEventList; /* SEQUENCE_OF_SecondRequestedEvent */
309 static int hf_h248_secondaryEventList_item; /* SecondRequestedEvent */
310 static int hf_h248_pkgdName; /* PkgdName */
311 static int hf_h248_secondaryEventAction; /* SecondRequestedActions */
312 static int hf_h248_EventBufferDescriptor_item; /* EventSpec */
313 static int hf_h248_SignalsDescriptor_item; /* SignalRequest */
314 static int hf_h248_signal; /* Signal */
315 static int hf_h248_seqSigList; /* SeqSigList */
316 static int hf_h248_signalList; /* SEQUENCE_OF_Signal */
317 static int hf_h248_signalList_item; /* Signal */
318 static int hf_h248_signalName; /* SignalName */
319 static int hf_h248_sigType; /* SignalType */
320 static int hf_h248_duration; /* INTEGER_0_65535 */
321 static int hf_h248_notifyCompletion; /* NotifyCompletion */
322 static int hf_h248_sigParList; /* SEQUENCE_OF_SigParameter */
323 static int hf_h248_sigParList_item; /* SigParameter */
324 static int hf_h248_direction; /* SignalDirection */
325 static int hf_h248_intersigDelay; /* INTEGER_0_65535 */
326 static int hf_h248_sigParameterName; /* SigParameterName */
327 static int hf_h248_value; /* SigParamValues */
328 static int hf_h248_extraInfo; /* T_extraInfo */
329 static int hf_h248_SigParamValues_item; /* SigParamValue */
330 static int hf_h248_mtl; /* SEQUENCE_OF_ModemType */
331 static int hf_h248_mtl_item; /* ModemType */
332 static int hf_h248_mpl; /* SEQUENCE_OF_PropertyParm */
333 static int hf_h248_mpl_item; /* PropertyParm */
334 static int hf_h248_startTimer; /* INTEGER_0_99 */
335 static int hf_h248_shortTimer; /* INTEGER_0_99 */
336 static int hf_h248_longTimer; /* INTEGER_0_99 */
337 static int hf_h248_digitMapBody; /* IA5String */
338 static int hf_h248_durationTimer; /* INTEGER_0_99 */
339 static int hf_h248_serviceChangeMethod; /* ServiceChangeMethod */
340 static int hf_h248_serviceChangeAddress; /* ServiceChangeAddress */
341 static int hf_h248_serviceChangeVersion; /* INTEGER_0_99 */
342 static int hf_h248_serviceChangeProfile; /* ServiceChangeProfile */
343 static int hf_h248_serviceChangeReason; /* SCreasonValue */
344 static int hf_h248_serviceChangeDelay; /* INTEGER_0_4294967295 */
345 static int hf_h248_serviceChangeMgcId; /* MId */
346 static int hf_h248_timeStamp; /* TimeNotation */
347 static int hf_h248_serviceChangeInfo; /* AuditDescriptor */
348 static int hf_h248_serviceChangeIncompleteFlag; /* NULL */
349 static int hf_h248_SCreasonValue_item; /* SCreasonValueOctetStr */
350 static int hf_h248_timestamp; /* TimeNotation */
351 static int hf_h248_profileName; /* IA5String_SIZE_1_67 */
352 static int hf_h248_PackagesDescriptor_item; /* PackagesItem */
353 static int hf_h248_StatisticsDescriptor_item; /* StatisticsParameter */
354 static int hf_h248_statName; /* StatName */
355 static int hf_h248_statValue; /* StatValue */
356 static int hf_h248_nonStandardIdentifier; /* NonStandardIdentifier */
357 static int hf_h248_data; /* OCTET_STRING */
358 static int hf_h248_object; /* OBJECT_IDENTIFIER */
359 static int hf_h248_h221NonStandard; /* H221NonStandard */
360 static int hf_h248_experimental; /* IA5String_SIZE_8 */
361 static int hf_h248_t35CountryCode1; /* INTEGER_0_255 */
362 static int hf_h248_t35CountryCode2; /* INTEGER_0_255 */
363 static int hf_h248_t35Extension; /* INTEGER_0_255 */
364 static int hf_h248_manufacturerCode; /* INTEGER_0_65535 */
365 static int hf_h248_date; /* IA5String_SIZE_8 */
366 static int hf_h248_time; /* IA5String_SIZE_8 */
367 static int hf_h248_Value_item; /* OCTET_STRING */
368 static int hf_h248_audit_result; /* AuditResultV1 */
369 static int hf_h248_contectAuditResult; /* TerminationID */
370 static int hf_h248_eventParamterName; /* EventParameterName */
371 static int hf_h248_event_param_value; /* EventParamValueV1 */
372 static int hf_h248_sig_param_value; /* SigParamValueV1 */
373 /* named bits */
374 static int hf_h248_T_auditToken_muxToken;
375 static int hf_h248_T_auditToken_modemToken;
376 static int hf_h248_T_auditToken_mediaToken;
377 static int hf_h248_T_auditToken_eventsToken;
378 static int hf_h248_T_auditToken_signalsToken;
379 static int hf_h248_T_auditToken_digitMapToken;
380 static int hf_h248_T_auditToken_statsToken;
381 static int hf_h248_T_auditToken_observedEventsToken;
382 static int hf_h248_T_auditToken_packagesToken;
383 static int hf_h248_T_auditToken_eventBufferToken;
384 static int hf_h248_NotifyCompletion_onTimeOut;
385 static int hf_h248_NotifyCompletion_onInterruptByEvent;
386 static int hf_h248_NotifyCompletion_onInterruptByNewSignalDescr;
387 static int hf_h248_NotifyCompletion_otherReason;
388 static int hf_h248_NotifyCompletion_onIteration;
390 /* Initialize the subtree pointers */
391 static int ett_h248;
392 static int ett_mtpaddress;
393 static int ett_packagename;
394 static int ett_codec;
395 static int ett_wildcard;
397 static int ett_h248_no_pkg;
398 static int ett_h248_no_sig;
399 static int ett_h248_no_evt;
401 static int h248_tap;
403 static gcp_hf_ett_t h248_arrel;
405 static int exported_pdu_tap = -1;
408 static int ett_h248_MegacoMessage;
409 static int ett_h248_AuthenticationHeader;
410 static int ett_h248_Message;
411 static int ett_h248_T_messageBody;
412 static int ett_h248_SEQUENCE_OF_Transaction;
413 static int ett_h248_MId;
414 static int ett_h248_DomainName;
415 static int ett_h248_IP4Address;
416 static int ett_h248_IP6Address;
417 static int ett_h248_Transaction;
418 static int ett_h248_TransactionRequest;
419 static int ett_h248_SEQUENCE_OF_ActionRequest;
420 static int ett_h248_TransactionPending;
421 static int ett_h248_TransactionReply;
422 static int ett_h248_T_transactionResult;
423 static int ett_h248_SEQUENCE_OF_ActionReply;
424 static int ett_h248_SegmentReply;
425 static int ett_h248_TransactionResponseAck;
426 static int ett_h248_TransactionAck;
427 static int ett_h248_ErrorDescriptor;
428 static int ett_h248_ActionRequest;
429 static int ett_h248_SEQUENCE_OF_CommandRequest;
430 static int ett_h248_ActionReply;
431 static int ett_h248_SEQUENCE_OF_CommandReply;
432 static int ett_h248_ContextRequest;
433 static int ett_h248_T_topologyReq;
434 static int ett_h248_SEQUENCE_OF_PropertyParm;
435 static int ett_h248_SEQUENCE_OF_ContextIDinList;
436 static int ett_h248_ContextAttrAuditRequest;
437 static int ett_h248_SEQUENCE_OF_IndAudPropertyParm;
438 static int ett_h248_SelectLogic;
439 static int ett_h248_CommandRequest;
440 static int ett_h248_Command;
441 static int ett_h248_CommandReply;
442 static int ett_h248_TopologyRequest;
443 static int ett_h248_AmmRequest;
444 static int ett_h248_SEQUENCE_OF_AmmDescriptor;
445 static int ett_h248_AmmDescriptor;
446 static int ett_h248_AmmsReply;
447 static int ett_h248_SubtractRequest;
448 static int ett_h248_AuditRequest;
449 static int ett_h248_AuditReply;
450 static int ett_h248_AuditResult;
451 static int ett_h248_TermListAuditResult;
452 static int ett_h248_TerminationAudit;
453 static int ett_h248_AuditReturnParameter;
454 static int ett_h248_AuditDescriptor;
455 static int ett_h248_T_auditToken;
456 static int ett_h248_SEQUENCE_OF_IndAuditParameter;
457 static int ett_h248_IndAuditParameter;
458 static int ett_h248_IndAudMediaDescriptor;
459 static int ett_h248_IndAudMediaDescriptorStreams;
460 static int ett_h248_SEQUENCE_OF_IndAudStreamDescriptor;
461 static int ett_h248_IndAudStreamDescriptor;
462 static int ett_h248_IndAudStreamParms;
463 static int ett_h248_IndAudLocalControlDescriptor;
464 static int ett_h248_IndAudPropertyParm;
465 static int ett_h248_IndAudLocalRemoteDescriptor;
466 static int ett_h248_IndAudPropertyGroup;
467 static int ett_h248_IndAudTerminationStateDescriptor;
468 static int ett_h248_IndAudEventsDescriptor;
469 static int ett_h248_IndAudEventBufferDescriptor;
470 static int ett_h248_IndAudSignalsDescriptor;
471 static int ett_h248_IndAudSeqSigList;
472 static int ett_h248_IndAudSignal;
473 static int ett_h248_IndAudDigitMapDescriptor;
474 static int ett_h248_IndAudStatisticsDescriptor;
475 static int ett_h248_IndAudPackagesDescriptor;
476 static int ett_h248_NotifyRequest;
477 static int ett_h248_NotifyReply;
478 static int ett_h248_ObservedEventsDescriptor;
479 static int ett_h248_SEQUENCE_OF_ObservedEvent;
480 static int ett_h248_ObservedEvent;
481 static int ett_h248_SEQUENCE_OF_EventParameter;
482 static int ett_h248_EventParameter;
483 static int ett_h248_EventPar_extraInfo;
484 static int ett_h248_EventParamValues;
485 static int ett_h248_ServiceChangeRequest;
486 static int ett_h248_ServiceChangeReply;
487 static int ett_h248_ServiceChangeResult;
488 static int ett_h248_TerminationID;
489 static int ett_h248_SEQUENCE_OF_WildcardField;
490 static int ett_h248_TerminationIDList;
491 static int ett_h248_MediaDescriptor;
492 static int ett_h248_T_streams;
493 static int ett_h248_SEQUENCE_OF_StreamDescriptor;
494 static int ett_h248_StreamDescriptor;
495 static int ett_h248_StreamParms;
496 static int ett_h248_LocalControlDescriptor;
497 static int ett_h248_PropertyParm;
498 static int ett_h248_SEQUENCE_OF_PropertyID;
499 static int ett_h248_PropParm_extraInfo;
500 static int ett_h248_LocalRemoteDescriptor;
501 static int ett_h248_SEQUENCE_OF_PropertyGroup;
502 static int ett_h248_PropertyGroup;
503 static int ett_h248_TerminationStateDescriptor;
504 static int ett_h248_MuxDescriptor;
505 static int ett_h248_SEQUENCE_OF_TerminationID;
506 static int ett_h248_EventsDescriptor;
507 static int ett_h248_SEQUENCE_OF_RequestedEvent;
508 static int ett_h248_RequestedEvent;
509 static int ett_h248_RegulatedEmbeddedDescriptor;
510 static int ett_h248_NotifyBehaviour;
511 static int ett_h248_RequestedActions;
512 static int ett_h248_EventDM;
513 static int ett_h248_SecondEventsDescriptor;
514 static int ett_h248_SEQUENCE_OF_SecondRequestedEvent;
515 static int ett_h248_SecondRequestedEvent;
516 static int ett_h248_SecondRequestedActions;
517 static int ett_h248_EventBufferDescriptor;
518 static int ett_h248_EventSpec;
519 static int ett_h248_SignalsDescriptor;
520 static int ett_h248_SignalRequest;
521 static int ett_h248_SeqSigList;
522 static int ett_h248_SEQUENCE_OF_Signal;
523 static int ett_h248_Signal;
524 static int ett_h248_SEQUENCE_OF_SigParameter;
525 static int ett_h248_NotifyCompletion;
526 static int ett_h248_SigParameter;
527 static int ett_h248_T_extraInfo;
528 static int ett_h248_SigParamValues;
529 static int ett_h248_ModemDescriptor;
530 static int ett_h248_SEQUENCE_OF_ModemType;
531 static int ett_h248_DigitMapDescriptor;
532 static int ett_h248_DigitMapValue;
533 static int ett_h248_ServiceChangeParm;
534 static int ett_h248_SCreasonValue;
535 static int ett_h248_ServiceChangeAddress;
536 static int ett_h248_ServiceChangeResParm;
537 static int ett_h248_ServiceChangeProfile;
538 static int ett_h248_PackagesDescriptor;
539 static int ett_h248_PackagesItem;
540 static int ett_h248_StatisticsDescriptor;
541 static int ett_h248_StatisticsParameter;
542 static int ett_h248_NonStandardData;
543 static int ett_h248_NonStandardIdentifier;
544 static int ett_h248_H221NonStandard;
545 static int ett_h248_TimeNotation;
546 static int ett_h248_Value;
547 static int ett_h248_AuditReplyV1;
548 static int ett_h248_AuditResultV1;
549 static int ett_h248_EventParameterV1;
550 static int ett_h248_SigParameterV1;
552 static expert_field ei_h248_errored_command;
553 static expert_field ei_h248_transactionId64;
554 static expert_field ei_h248_context_id64;
555 static expert_field ei_h248_octet_string_expected;
557 static dissector_table_t subdissector_table;
559 static int ss7pc_address_type = -1;
561 /* Gateway Control Protocol -- Context Tracking */
563 const value_string gcp_cmd_type[] = {
564 { GCP_CMD_NONE, "NoCommand"},
565 { GCP_CMD_ADD_REQ, "addReq"},
566 { GCP_CMD_MOVE_REQ, "moveReq"},
567 { GCP_CMD_MOD_REQ, "modReq"},
568 { GCP_CMD_SUB_REQ, "subtractReq"},
569 { GCP_CMD_AUDITCAP_REQ, "auditCapRequest"},
570 { GCP_CMD_AUDITVAL_REQ, "auditValueRequest"},
571 { GCP_CMD_NOTIFY_REQ, "notifyReq"},
572 { GCP_CMD_SVCCHG_REQ, "serviceChangeReq"},
573 { GCP_CMD_TOPOLOGY_REQ, "topologyReq"},
574 { GCP_CMD_CTX_ATTR_AUDIT_REQ, "ctxAttrAuditReq"},
575 { GCP_CMD_ADD_REPLY, "addReply"},
576 { GCP_CMD_MOVE_REPLY, "moveReply"},
577 { GCP_CMD_MOD_REPLY, "modReply"},
578 { GCP_CMD_SUB_REPLY, "subtractReply"},
579 { GCP_CMD_AUDITCAP_REPLY, "auditCapReply"},
580 { GCP_CMD_AUDITVAL_REPLY, "auditValReply"},
581 { GCP_CMD_NOTIFY_REPLY, "notifyReply"},
582 { GCP_CMD_SVCCHG_REPLY, "serviceChangeReply"},
583 { GCP_CMD_TOPOLOGY_REPLY, "topologyReply"},
584 { 0, NULL }
587 const value_string gcp_term_types[] = {
588 { GCP_TERM_TYPE_AAL1, "aal1" },
589 { GCP_TERM_TYPE_AAL2, "aal2" },
590 { GCP_TERM_TYPE_AAL1_STRUCT, "aal1struct" },
591 { GCP_TERM_TYPE_IP_RTP, "ipRtp" },
592 { GCP_TERM_TYPE_TDM, "tdm" },
593 { 0, NULL }
596 static wmem_tree_t* gcp_msgs;
597 static wmem_tree_t* gcp_trxs;
598 static wmem_tree_t* gcp_ctxs_by_trx;
599 static wmem_tree_t* gcp_ctxs;
601 gcp_msg_t* gcp_msg(packet_info* pinfo, int o, bool keep_persistent_data) {
602 gcp_msg_t* m;
603 uint32_t framenum = (uint32_t)pinfo->num;
604 uint32_t offset = (uint32_t)o;
605 address* src = &(pinfo->src);
606 address* dst = &(pinfo->dst);
607 address* lo_addr;
608 address* hi_addr;
610 if (keep_persistent_data) {
611 wmem_tree_key_t key[3];
613 key[0].length = 1;
614 key[0].key = &(framenum);
615 key[1].length = 1;
616 key[1].key = &offset;
617 key[2].length = 0;
618 key[2].key =NULL;
620 if (( m = (gcp_msg_t *)wmem_tree_lookup32_array(gcp_msgs,key) )) {
621 m->committed = true;
622 return m;
623 } else {
624 m = wmem_new(wmem_file_scope(), gcp_msg_t);
625 m->framenum = framenum;
626 m->frametime = pinfo->abs_ts;
627 m->trxs = NULL;
628 m->committed = false;
630 wmem_tree_insert32_array(gcp_msgs,key,m);
632 } else {
633 m = wmem_new0(pinfo->pool, gcp_msg_t);
634 m->framenum = framenum;
635 m->trxs = NULL;
636 m->committed = false;
639 if (cmp_address(src, dst) < 0) {
640 lo_addr = src;
641 hi_addr = dst;
642 } else {
643 lo_addr = dst;
644 hi_addr = src;
647 switch(lo_addr->type) {
648 case AT_NONE:
649 m->lo_addr = 0;
650 m->hi_addr = 0;
651 break;
652 case AT_IPv4:
653 memcpy((uint8_t*)&(m->hi_addr),hi_addr->data,4);
654 memcpy((uint8_t*)&(m->lo_addr),lo_addr->data,4);
655 break;
656 default:
657 if (lo_addr->type == ss7pc_address_type) {
658 m->hi_addr = mtp3_pc_hash((const mtp3_addr_pc_t *)hi_addr->data);
659 m->lo_addr = mtp3_pc_hash((const mtp3_addr_pc_t *)lo_addr->data);
661 else {
662 /* XXX: heuristic and error prone */
663 m->hi_addr = g_str_hash(address_to_str(pinfo->pool, hi_addr));
664 m->lo_addr = g_str_hash(address_to_str(pinfo->pool, lo_addr));
666 break;
669 return m;
672 gcp_trx_t* gcp_trx(gcp_msg_t* m ,uint32_t t_id , gcp_trx_type_t type, packet_info *pinfo, bool keep_persistent_data) {
673 gcp_trx_t* t = NULL;
674 gcp_trx_msg_t* trxmsg;
676 if ( !m ) return NULL;
678 if (keep_persistent_data) {
679 if (m->committed) {
681 for ( trxmsg = m->trxs; trxmsg; trxmsg = trxmsg->next) {
682 if (trxmsg->trx && trxmsg->trx->id == t_id) {
683 return trxmsg->trx;
686 DISSECTOR_ASSERT_NOT_REACHED();
687 } else {
688 wmem_tree_key_t key[4];
690 key[0].length = 1;
691 key[0].key = &(m->hi_addr);
692 key[1].length = 1;
693 key[1].key = &(m->lo_addr);
694 key[2].length = 1;
695 key[2].key = &(t_id);
696 key[3].length = 0;
697 key[3].key = NULL;
699 trxmsg = wmem_new(wmem_file_scope(), gcp_trx_msg_t);
700 t = (gcp_trx_t *)wmem_tree_lookup32_array(gcp_trxs,key);
702 if (!t) {
703 t = wmem_new(wmem_file_scope(), gcp_trx_t);
704 t->initial = m;
705 t->id = t_id;
706 t->type = type;
707 t->pendings = 0;
708 t->error = 0;
709 t->cmds = NULL;
711 wmem_tree_insert32_array(gcp_trxs,key,t);
714 /* XXX: request, reply and ack + point to frames where they are */
715 switch ( type ) {
716 case GCP_TRX_PENDING:
717 t->pendings++;
718 break;
719 default:
720 break;
724 } else {
725 t = wmem_new(pinfo->pool, gcp_trx_t);
726 trxmsg = wmem_new(pinfo->pool, gcp_trx_msg_t);
727 t->initial = NULL;
728 t->id = t_id;
729 t->type = type;
730 t->pendings = 0;
731 t->error = 0;
732 t->cmds = NULL;
735 DISSECTOR_ASSERT(trxmsg);
737 trxmsg->trx = t;
738 trxmsg->next = NULL;
739 trxmsg->last = trxmsg;
741 if (m->trxs) {
742 m->trxs->last = m->trxs->last->next = trxmsg;
743 } else {
744 m->trxs = trxmsg;
747 return t;
751 gcp_ctx_t* gcp_ctx(gcp_msg_t* m, gcp_trx_t* t, uint32_t c_id, packet_info *pinfo, bool persistent) {
752 gcp_ctx_t* context = NULL;
753 gcp_ctx_t** context_p = NULL;
755 if ( !m || !t ) return NULL;
757 if (persistent) {
759 wmem_tree_key_t ctx_key[4];
760 wmem_tree_key_t trx_key[4];
762 ctx_key[0].length = 1;
763 ctx_key[0].key = &(m->hi_addr);
764 ctx_key[1].length = 1;
765 ctx_key[1].key = &(m->lo_addr);
766 ctx_key[2].length = 1;
767 ctx_key[2].key = &(c_id);
768 ctx_key[3].length = 0;
769 ctx_key[3].key = NULL;
771 trx_key[0].length = 1;
772 trx_key[0].key = &(m->hi_addr);
773 trx_key[1].length = 1;
774 trx_key[1].key = &(m->lo_addr);
775 trx_key[2].length = 1;
776 trx_key[2].key = &(t->id);
777 trx_key[3].length = 0;
778 trx_key[3].key = NULL;
780 if (m->committed) {
781 if (( context = (gcp_ctx_t *)wmem_tree_lookup32_array(gcp_ctxs_by_trx,trx_key) )) {
782 return context;
783 } if ((context_p = (gcp_ctx_t **)wmem_tree_lookup32_array(gcp_ctxs,ctx_key))) {
784 context = *context_p;
786 do {
787 if (context->initial->framenum <= m->framenum) {
788 return context;
790 } while(( context = context->prev ));
792 DISSECTOR_ASSERT(! "a context should exist");
794 } else {
795 if (c_id == CHOOSE_CONTEXT) {
796 if (! ( context = (gcp_ctx_t *)wmem_tree_lookup32_array(gcp_ctxs_by_trx,trx_key))) {
797 context = wmem_new(wmem_file_scope(), gcp_ctx_t);
798 context->initial = m;
799 context->cmds = NULL;
800 context->id = c_id;
801 context->terms.last = &(context->terms);
802 context->terms.next = NULL;
803 context->terms.term = NULL;
805 wmem_tree_insert32_array(gcp_ctxs_by_trx,trx_key,context);
807 } else {
808 if (( context = (gcp_ctx_t *)wmem_tree_lookup32_array(gcp_ctxs_by_trx,trx_key) )) {
809 if (( context_p = (gcp_ctx_t **)wmem_tree_lookup32_array(gcp_ctxs,ctx_key) )) {
810 if (context != *context_p) {
811 if(context->id != CHOOSE_CONTEXT) {
812 context = wmem_new(wmem_file_scope(), gcp_ctx_t);
814 context->initial = m;
815 context->id = c_id;
816 context->cmds = NULL;
817 context->terms.last = &(context->terms);
818 context->terms.next = NULL;
819 context->terms.term = NULL;
821 context->prev = *context_p;
822 *context_p = context;
824 } else {
825 context_p = wmem_new(wmem_file_scope(), gcp_ctx_t*);
826 *context_p = context;
827 context->initial = m;
828 context->id = c_id;
829 wmem_tree_insert32_array(gcp_ctxs,ctx_key,context_p);
831 } else if (! ( context_p = (gcp_ctx_t**)wmem_tree_lookup32_array(gcp_ctxs,ctx_key) )) {
832 context = wmem_new(wmem_file_scope(), gcp_ctx_t);
833 context->initial = m;
834 context->id = c_id;
835 context->cmds = NULL;
836 context->terms.last = &(context->terms);
837 context->terms.next = NULL;
838 context->terms.term = NULL;
840 context_p = wmem_new(wmem_file_scope(), gcp_ctx_t*);
841 *context_p = context;
842 wmem_tree_insert32_array(gcp_ctxs,ctx_key,context_p);
843 } else {
844 context = *context_p;
848 } else {
849 context = wmem_new(pinfo->pool, gcp_ctx_t);
850 context->initial = m;
851 context->cmds = NULL;
852 context->id = c_id;
853 context->terms.last = &(context->terms);
854 context->terms.next = NULL;
855 context->terms.term = NULL;
858 return context;
861 gcp_cmd_t* gcp_cmd(gcp_msg_t* m, gcp_trx_t* t, gcp_ctx_t* c, gcp_cmd_type_t type, unsigned offset, packet_info *pinfo, bool persistent) {
862 gcp_cmd_t* cmd;
863 gcp_cmd_msg_t* cmdtrx;
864 gcp_cmd_msg_t* cmdctx;
866 if ( !m || !t || !c ) return NULL;
868 if (persistent) {
869 if (m->committed) {
870 DISSECTOR_ASSERT(t->cmds != NULL);
872 for (cmdctx = t->cmds; cmdctx; cmdctx = cmdctx->next) {
873 cmd = cmdctx->cmd;
874 if (cmd->msg == m && cmd->offset == offset) {
875 return cmd;
879 DISSECTOR_ASSERT(!"called for a command that does not exist!");
881 return NULL;
882 } else {
883 cmd = wmem_new(wmem_file_scope(), gcp_cmd_t);
884 cmdtrx = wmem_new(wmem_file_scope(), gcp_cmd_msg_t);
885 cmdctx = wmem_new(wmem_file_scope(), gcp_cmd_msg_t);
887 } else {
888 cmd = wmem_new(pinfo->pool, gcp_cmd_t);
889 cmdtrx = wmem_new(pinfo->pool, gcp_cmd_msg_t);
890 cmdctx = wmem_new(pinfo->pool, gcp_cmd_msg_t);
893 cmd->type = type;
894 cmd->offset = offset;
895 cmd->terms.term = NULL;
896 cmd->terms.next = NULL;
897 cmd->terms.last = &(cmd->terms);
898 cmd->str = NULL;
899 cmd->msg = m;
900 if ((type != GCP_CMD_NONE) && (!persistent)){
901 cmd->str = val_to_str_const(type, gcp_cmd_type, "Unknown");
903 cmd->trx = t;
904 cmd->ctx = c;
905 cmd->error = 0;
907 cmdctx->cmd = cmdtrx->cmd = cmd;
908 cmdctx->next = cmdtrx->next = NULL;
909 cmdctx->last = cmdtrx->last = NULL;
911 if (t->cmds) {
912 t->cmds->last->next = cmdtrx;
913 t->cmds->last = cmdtrx;
914 } else {
915 t->cmds = cmdtrx;
916 t->cmds->last = cmdtrx;
919 if (c->cmds) {
920 c->cmds->last->next = cmdctx;
921 c->cmds->last = cmdctx;
922 } else {
923 c->cmds = cmdctx;
924 c->cmds->last = cmdctx;
927 return cmd;
930 gcp_term_t* gcp_cmd_add_term(gcp_msg_t* m, gcp_trx_t* tr, gcp_cmd_t* c, gcp_term_t* t, gcp_wildcard_t wildcard, packet_info *pinfo, bool persistent) {
931 gcp_terms_t* ct;
932 gcp_terms_t* ct2;
934 static gcp_term_t all_terms = {"$",(const uint8_t*)"",1,GCP_TERM_TYPE_UNKNOWN,NULL,NULL,NULL};
936 if ( !c ) return NULL;
938 if ( wildcard == GCP_WILDCARD_CHOOSE) {
939 return &all_terms;
942 if (persistent) {
943 if ( c->msg->committed ) {
944 if (wildcard == GCP_WILDCARD_ALL) {
945 for (ct = c->ctx->terms.next; ct; ct = ct->next) {
946 /* XXX not handling more wildcards in one msg */
947 if ( ct->term->start == m ) {
948 return ct->term;
951 return NULL;
952 } else {
953 for (ct = c->ctx->terms.next; ct; ct = ct->next) {
954 if ( g_str_equal(ct->term->str,t->str) ) {
955 return ct->term;
958 return NULL;
960 } else {
962 for (ct = c->ctx->terms.next; ct; ct = ct->next) {
963 if ( g_str_equal(ct->term->str,t->str) || ct->term->start == m) {
964 break;
968 if ( ! ct ) {
970 if (wildcard == GCP_WILDCARD_ALL) {
971 ct = wmem_new(wmem_file_scope(), gcp_terms_t);
972 ct->next = NULL;
973 ct->term = wmem_new0(wmem_file_scope(), gcp_term_t);
975 ct->term->start = m;
976 ct->term->str = "*";
977 ct->term->buffer = NULL;
978 ct->term->len = 0;
980 c->terms.last = c->terms.last->next = ct;
982 ct2 = wmem_new0(wmem_file_scope(), gcp_terms_t);
983 ct2->term = ct->term;
985 c->ctx->terms.last->next = ct2;
986 c->ctx->terms.last = ct2;
988 return ct->term;
989 } else {
990 for (ct = c->ctx->terms.next; ct; ct = ct->next) {
991 /* XXX not handling more wildcards in one msg */
992 if ( ct->term->buffer == NULL && tr->cmds->cmd->msg == ct->term->start ) {
993 ct->term->str = wmem_strdup(wmem_file_scope(), t->str);
994 ct->term->buffer = (const uint8_t *)wmem_memdup(wmem_file_scope(), t->buffer,t->len);
995 ct->term->len = t->len;
997 ct2 = wmem_new0(wmem_file_scope(), gcp_terms_t);
998 ct2->term = ct->term;
1000 c->terms.last = c->terms.last->next = ct2;
1002 return ct->term;
1005 if ( g_str_equal(ct->term->str,t->str) ) {
1006 ct2 = wmem_new0(wmem_file_scope(), gcp_terms_t);
1007 ct2->term = ct->term;
1009 c->terms.last = c->terms.last->next = ct2;
1011 return ct->term;
1015 ct = wmem_new(wmem_file_scope(), gcp_terms_t);
1016 ct->next = NULL;
1017 ct->term = wmem_new0(wmem_file_scope(), gcp_term_t);
1019 ct->term->start = m;
1020 ct->term->str = wmem_strdup(wmem_file_scope(), t->str);
1021 ct->term->buffer = (const uint8_t *)wmem_memdup(wmem_file_scope(), t->buffer,t->len);
1022 ct->term->len = t->len;
1024 ct2 = wmem_new0(wmem_file_scope(), gcp_terms_t);
1025 ct2->term = ct->term;
1027 c->terms.last = c->terms.last->next = ct2;
1029 ct2 = wmem_new0(wmem_file_scope(), gcp_terms_t);
1030 ct2->term = ct->term;
1032 c->ctx->terms.last = c->ctx->terms.last->next = ct2;
1034 return ct->term;
1036 } else {
1037 ct2 = wmem_new0(wmem_file_scope(), gcp_terms_t);
1038 ct2->term = ct->term;
1040 c->terms.last = c->terms.last->next = ct2;
1041 return ct->term;
1044 DISSECTOR_ASSERT_NOT_REACHED();
1046 } else {
1047 ct = wmem_new(pinfo->pool, gcp_terms_t);
1048 ct->term = t;
1049 ct->next = NULL;
1050 c->terms.last = c->terms.last->next = ct;
1052 return t;
1057 static const char* gcp_cmd_to_str(gcp_cmd_t* c, wmem_allocator_t *scope, bool persistent) {
1058 const char* s;
1059 gcp_terms_t* term;
1061 if ( !c ) return "-";
1063 switch (c->type) {
1064 case GCP_CMD_NONE:
1065 return "-";
1066 case GCP_CMD_ADD_REQ:
1067 s = "AddReq {";
1068 break;
1069 case GCP_CMD_MOVE_REQ:
1070 s = "MoveReq {";
1071 break;
1072 case GCP_CMD_MOD_REQ:
1073 s = "ModReq {";
1074 break;
1075 case GCP_CMD_SUB_REQ:
1076 s = "SubReq {";
1077 break;
1078 case GCP_CMD_AUDITCAP_REQ:
1079 s = "AuditCapReq {";
1080 break;
1081 case GCP_CMD_AUDITVAL_REQ:
1082 s = "AuditValReq {";
1083 break;
1084 case GCP_CMD_NOTIFY_REQ:
1085 s = "NotifyReq {";
1086 break;
1087 case GCP_CMD_SVCCHG_REQ:
1088 s = "SvcChgReq {";
1089 break;
1090 case GCP_CMD_TOPOLOGY_REQ:
1091 s = "TopologyReq {";
1092 break;
1093 case GCP_CMD_CTX_ATTR_AUDIT_REQ:
1094 s = "CtxAttribAuditReq {";
1095 break;
1096 case GCP_CMD_ADD_REPLY:
1097 s = "AddReply {";
1098 break;
1099 case GCP_CMD_MOVE_REPLY:
1100 s = "MoveReply {";
1101 break;
1102 case GCP_CMD_MOD_REPLY:
1103 s = "ModReply {";
1104 break;
1105 case GCP_CMD_SUB_REPLY:
1106 s = "SubReply {";
1107 break;
1108 case GCP_CMD_AUDITCAP_REPLY:
1109 s = "AuditCapReply {";
1110 break;
1111 case GCP_CMD_AUDITVAL_REPLY:
1112 s = "AuditValReply {";
1113 break;
1114 case GCP_CMD_NOTIFY_REPLY:
1115 s = "NotifyReply {";
1116 break;
1117 case GCP_CMD_SVCCHG_REPLY:
1118 s = "SvcChgReply {";
1119 break;
1120 case GCP_CMD_TOPOLOGY_REPLY:
1121 s = "TopologyReply {";
1122 break;
1123 case GCP_CMD_REPLY:
1124 s = "ActionReply {";
1125 break;
1126 case GCP_CMD_OTHER_REQ:
1127 s = "Request {";
1128 break;
1129 default:
1130 s = "-";
1131 break;
1134 for (term = c->terms.next; term; term = term->next) {
1135 s = wmem_strdup_printf(scope, "%s %s", s, term->term->str);
1138 if (c->error) {
1139 s = wmem_strdup_printf(scope, "%s Error=%i", s, c->error);
1142 s = wmem_strdup_printf(scope, "%s }", s);
1144 if (persistent) {
1145 /* FIXME: this method has a side-effect but is buried deep within an apparently side-effect free string helper */
1146 if (! c->str) c->str = wmem_strdup(wmem_file_scope(), s);
1147 } else {
1148 c->str = s;
1151 return s;
1154 static const char * gcp_trx_to_str(gcp_msg_t* m, gcp_trx_t* t, wmem_allocator_t *scope, bool persistent) {
1155 wmem_strbuf_t *s;
1156 gcp_cmd_msg_t* c;
1158 if ( !m || !t ) return "-";
1160 s = wmem_strbuf_new(scope, NULL);
1161 wmem_strbuf_append_printf(s, "T %x { ", t->id);
1163 if (t->cmds) {
1164 if (t->cmds->cmd->ctx) {
1165 wmem_strbuf_append_printf(s, " C %x {", t->cmds->cmd->ctx->id);
1167 for (c = t->cmds; c; c = c->next) {
1168 if (c->cmd->msg == m) {
1169 wmem_strbuf_append_c(s, ' ');
1170 wmem_strbuf_append(s, gcp_cmd_to_str(c->cmd, scope, persistent));
1174 wmem_strbuf_append(s, " }");
1178 if (t->error) {
1179 wmem_strbuf_append_printf(s, " Error=%i", t->error);
1182 wmem_strbuf_append(s, " }");
1184 return wmem_strbuf_finalize(s);
1187 const char* gcp_msg_to_str(gcp_msg_t* m, wmem_allocator_t *scope, bool persistent) {
1188 gcp_trx_msg_t* t;
1189 wmem_strbuf_t *s;
1191 if ( !m ) return "-";
1193 s = wmem_strbuf_new(scope, NULL);
1194 for (t = m->trxs; t; t = t->next) {
1195 wmem_strbuf_append_c(s, ' ');
1196 wmem_strbuf_append(s, gcp_trx_to_str(m, t->trx, scope, persistent));
1199 return wmem_strbuf_finalize(s);
1202 typedef struct _gcp_ctxs_t {
1203 struct _gcp_ctx_t* ctx;
1204 struct _gcp_ctxs_t* next;
1205 } gcp_ctxs_t;
1207 /*static const char* trx_types[] = {"None","Req","Reply","Pending","Ack"};*/
1209 void gcp_analyze_msg(proto_tree* gcp_tree, packet_info* pinfo, tvbuff_t* gcp_tvb, gcp_msg_t* m, gcp_hf_ett_t* ids, expert_field* command_err) {
1210 gcp_trx_msg_t* t;
1211 gcp_ctxs_t contexts = {NULL,NULL};
1212 gcp_ctxs_t* ctx_node;
1213 gcp_cmd_msg_t* c;
1216 for (t = m->trxs; t; t = t->next) {
1217 for (c = t->trx->cmds; c; c = c->next) {
1218 gcp_ctx_t* ctx = c->cmd->ctx;
1220 for (ctx_node = contexts.next; ctx_node; ctx_node = ctx_node->next) {
1221 if (ctx_node->ctx->id == ctx->id) {
1222 break;
1226 if (! ctx_node) {
1227 ctx_node = wmem_new(pinfo->pool, gcp_ctxs_t);
1228 ctx_node->ctx = ctx;
1229 ctx_node->next = contexts.next;
1230 contexts.next = ctx_node;
1235 for (ctx_node = contexts.next; ctx_node; ctx_node = ctx_node->next) {
1236 gcp_ctx_t* ctx = ctx_node->ctx;
1237 proto_item* ctx_item = proto_tree_add_uint(gcp_tree,ids->hf.ctx,gcp_tvb,0,0,ctx->id);
1238 proto_tree* ctx_tree = proto_item_add_subtree(ctx_item,ids->ett.ctx);
1239 gcp_terms_t *ctx_term;
1241 proto_item_set_generated(ctx_item);
1243 if (ctx->cmds) {
1244 proto_tree* history_tree = proto_tree_add_subtree(ctx_tree,gcp_tvb,0,0,ids->ett.ctx_cmds,NULL,"[ Command History ]");
1246 for (c = ctx->cmds; c; c = c->next) {
1247 proto_item* cmd_item = proto_tree_add_uint(history_tree,ids->hf.ctx_cmd,gcp_tvb,0,0,c->cmd->msg->framenum);
1248 if (c->cmd->str) proto_item_append_text(cmd_item," %s ",c->cmd->str);
1249 proto_item_set_generated(cmd_item);
1250 if (c->cmd->error) {
1251 expert_add_info(pinfo, cmd_item, command_err);
1256 if (( ctx_term = ctx->terms.next )) {
1257 proto_tree* terms_tree = proto_tree_add_subtree(ctx_tree,gcp_tvb,0,0,ids->ett.ctx_terms,NULL,"[ Terminations Used ]");
1259 for (; ctx_term; ctx_term = ctx_term->next ) {
1260 if ( ctx_term->term && ctx_term->term->str) {
1261 proto_item* pi = proto_tree_add_string(terms_tree,ids->hf.ctx_term,gcp_tvb,0,0,ctx_term->term->str);
1262 proto_tree* term_tree = proto_item_add_subtree(pi,ids->ett.ctx_term);
1264 proto_item_set_generated(pi);
1266 if (ctx_term->term->type) {
1267 pi = proto_tree_add_uint(term_tree,ids->hf.ctx_term_type,gcp_tvb,0,0,ctx_term->term->type);
1268 proto_item_set_generated(pi);
1271 if (ctx_term->term->bir) {
1272 pi = proto_tree_add_string(term_tree,ids->hf.ctx_term_bir,gcp_tvb,0,0,ctx_term->term->bir);
1273 proto_item_set_generated(pi);
1276 if (ctx_term->term->nsap) {
1277 pi = proto_tree_add_string(term_tree,ids->hf.ctx_term_nsap,gcp_tvb,0,0,ctx_term->term->nsap);
1278 proto_item_set_generated(pi);
1281 if (ctx_term->term->bir && ctx_term->term->nsap) {
1282 char* tmp_key = wmem_strdup_printf(pinfo->pool, "%s:%s",ctx_term->term->nsap,ctx_term->term->bir);
1283 char* key = g_ascii_strdown(tmp_key, -1);
1284 alcap_tree_from_bearer_key(term_tree, gcp_tvb, pinfo, key);
1285 g_free(key);
1293 /* END Gateway Control Protocol -- Context Tracking */
1295 #define H248_PORT 2945
1296 static bool keep_persistent_data;
1297 static bool h248_desegment = true;
1301 static proto_tree *h248_tree;
1303 static dissector_handle_t h248_handle;
1304 static dissector_handle_t h248_term_handle;
1305 static dissector_handle_t h248_tpkt_handle;
1307 /* Forward declarations */
1308 static int dissect_h248_ServiceChangeReasonStr(bool implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index);
1310 /* h248v1 support */
1311 static int dissect_h248_AuditReplyV1(bool implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index);
1313 static int dissect_h248_EventParameterV1(bool implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index);
1314 static int dissect_h248_SigParameterV1(bool implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index);
1315 static int dissect_h248_SigParamValueV1(bool implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index);
1317 #if 0
1318 static const value_string context_id_type[] = {
1319 {NULL_CONTEXT,"0 (Null Context)"},
1320 {CHOOSE_CONTEXT,"$ (Choose Context)"},
1321 {ALL_CONTEXTS,"* (All Contexts)"},
1322 {0,NULL}
1324 #endif
1326 /* the following value_strings are used to build defalut packages.
1327 To add additional detail to a package, build a register a h248_package_t structure
1330 static const value_string base_package_name_vals[] = {
1331 { 0x0000, "Media stream properties H.248.1 Annex C" },
1332 { 0x0001, "Generic H.248.1 Annex E" },
1333 { 0x0002, "root H.248.1 Annex E" },
1334 { 0x0003, "tonegen H.248.1 Annex E" },
1335 { 0x0004, "tonedet H.248.1 Annex E" },
1336 { 0x0005, "dg H.248.1 Annex E" },
1337 { 0x0006, "dd H.248.1 Annex E" },
1338 { 0x0007, "cg H.248.1 Annex E" },
1339 { 0x0008, "cd H.248.1 Annex E" },
1340 { 0x0009, "al H.248.1 Annex E" },
1341 { 0x000a, "ct H.248.1 Annex E" },
1342 { 0x000b, "nt H.248.1 Annex E" },
1343 { 0x000c, "rtp H.248.1 Annex E" },
1344 { 0x000d, "tdmc H.248.1 Annex E" },
1345 { 0x000e, "ftmd H.248.1 Annex E" },
1346 { 0x000f, "txc H.248.2" }, /* H.248.2 */
1347 { 0x0010, "txp H.248.2" },
1348 { 0x0011, "ctyp H.248.2" },
1349 { 0x0012, "fax H.248.2" },
1350 { 0x0013, "ipfax H.248.2" },
1351 { 0x0014, "dis H.248.3" }, /* H.248.3 */
1352 { 0x0015, "key H.248.3" },
1353 { 0x0016, "kp H.248.3" },
1354 { 0x0017, "labelkey H.248.3" },
1355 { 0x0018, "kf H.248.3" },
1356 { 0x0019, "ind H.248.3" },
1357 { 0x001a, "ks H.248.3" },
1358 { 0x001b, "anci H.248.3" },
1359 { 0x001c, "dtd H.248.6" }, /* H.248.6 */
1360 { 0x001d, "an H.248.7" }, /* H.248.7 */
1361 { 0x001e, "Bearer Characteristics Q.1950 Annex A" }, /* Q.1950 Annex A */
1362 { 0x001f, "Bearer Network Connection Cut Q.1950 Annex A" },
1363 { 0x0020, "Reuse Idle Q.1950 Annex A" },
1364 { 0x0021, "Generic Bearer Connection Q.1950 Annex A" },
1365 { 0x0022, "Bearer Control Tunnelling Q.1950 Annex A" },
1366 { 0x0023, "Basic Call Progress Tones Q.1950 Annex A" },
1367 { 0x0024, "Expanded Call Progress Tones Q.1950 Annex A" },
1368 { 0x0025, "Basic Services Tones Q.1950 Annex A" },
1369 { 0x0026, "Expanded Services Tones Q.1950 Annex A" },
1370 { 0x0027, "Intrusion Tones Q.1950 Annex A" },
1371 { 0x0028, "Business Tones Q.1950 Annex A" },
1372 { 0x0029, "Media Gateway Resource Congestion Handling H.248.10" }, /* H.248.10 */
1373 { 0x002a, "H245 package H.248.12" }, /* H.248.12 */
1374 { 0x002b, "H323 bearer control package H.248.12" }, /* H.248.12 */
1375 { 0x002c, "H324 package H.248.12" }, /* H.248.12 */
1376 { 0x002d, "H245 command package H.248.12" }, /* H.248.12 */
1377 { 0x002e, "H245 indication package H.248.12" }, /* H.248.12 */
1378 { 0x002f, "3G User Plane" }, /* 3GPP TS 29.232 v4.1.0 */
1379 { 0x0030, "3G Circuit Switched Data" },
1380 { 0x0031, "3G TFO Control" },
1381 { 0x0032, "3G Expanded Call Progress Tones" },
1382 { 0x0033, "Advanced Audio Server (AAS Base)" }, /* H.248.9 */
1383 { 0x0034, "AAS Digit Collection" }, /* H.248.9 */
1384 { 0x0035, "AAS Recording" }, /* H.248.9 */
1385 { 0x0036, "AAS Segment Management" }, /* H.248.9 */
1386 { 0x0037, "Quality Alert Ceasing" }, /* H.248.13 */
1387 { 0x0038, "Conferencing Tones Generation" }, /* H.248.27 */
1388 { 0x0039, "Diagnostic Tones Generation" }, /* H.248.27 */
1389 { 0x003a, "Carrier Tones Generation Package H.248.23" }, /* H.248.27 */
1390 { 0x003b, "Enhanced Alerting Package H.248.23" }, /* H.248.23 */
1391 { 0x003c, "Analog Display Signalling Package H.248.23" }, /* H.248.23 */
1392 { 0x003d, "Multi-Frequency Tone Generation Package H.248.24" }, /* H.248.24 */
1393 { 0x003e, "H.248.23Multi-Frequency Tone Detection Package H.248.24" }, /* H.248.24 */
1394 { 0x003f, "Basic CAS Package H.248.25" }, /* H.248.25 */
1395 { 0x0040, "Robbed Bit Signalling Package H.248.25" }, /* H.248.25 */
1396 { 0x0041, "Operator Services and Emergency Services Package H.248.25" },
1397 { 0x0042, "Operator Services Extension Package H.248.25" },
1398 { 0x0043, "Extended Analog Line Supervision Package H.248.26" },
1399 { 0x0044, "Automatic Metering Package H.248.26" },
1400 { 0x0045, "Inactivity Timer Package H.248.14" },
1401 { 0x0046, "3G Modification of Link Characteristics Bearer Capability" }, /* 3GPP TS 29.232 v4.4.0 */
1402 { 0x0047, "Base Announcement Syntax H.248.9" },
1403 { 0x0048, "Voice Variable Syntax H.248.9" },
1404 { 0x0049, "Announcement Set Syntax H.248.9" },
1405 { 0x004a, "Phrase Variable Syntax H.248.9" },
1406 { 0x004b, "Basic NAS package" },
1407 { 0x004c, "NAS incoming package" },
1408 { 0x004d, "NAS outgoing package" },
1409 { 0x004e, "NAS control package" },
1410 { 0x004f, "NAS root package" },
1411 { 0x0050, "Profile Handling Package H.248.18" },
1412 { 0x0051, "Media Gateway Overload Control Package H.248.11" },
1413 { 0x0052, "Extended DTMF Detection Package H.248.16" },
1414 { 0x0053, "Quiet Termination Line Test" },
1415 { 0x0054, "Loopback Line Test Response" }, /* H.248.17 */
1416 { 0x0055, "ITU 404Hz Line Test" }, /* H.248.17 */
1417 { 0x0056, "ITU 816Hz Line Test" }, /* H.248.17 */
1418 { 0x0057, "ITU 1020Hz Line Test" }, /* H.248.17 */
1419 { 0x0058, "ITU 2100Hz Disable Tone Line Test" }, /* H.248.17 */
1420 { 0x0059, "ITU 2100Hz Disable Echo Canceller Tone Line Test" }, /* H.248.17 */
1421 { 0x005a, "ITU 2804Hz Tone Line Test" }, /* H.248.17 */
1422 { 0x005b, "ITU Noise Test Tone Line Test" }, /* H.248.17 */
1423 { 0x005c, "ITU Digital Pseudo Random Test Line Test" }, /* H.248.17 */
1424 { 0x005d, "ITU ATME No.2 Test Line Response" }, /* H.248.17 */
1425 { 0x005e, "ANSI 1004Hz Test Tone Line Test" }, /* H.248.17 */
1426 { 0x005f, "ANSI Test Responder Line Test" }, /* H.248.17 */
1427 { 0x0060, "ANSI 2225Hz Test Progress Tone Line Test" }, /* H.248.17 */
1428 { 0x0061, "ANSI Digital Test Signal Line Test" }, /* H.248.17 */
1429 { 0x0062, "ANSI Inverting Loopback Line Test Response" }, /* H.248.17 */
1430 { 0x0063, "Extended H.324 Packages H.248.12 Annex A" },
1431 { 0x0064, "Extended H.245 Command Package H.248.12 Annex A" },
1432 { 0x0065, "Extended H.245 Indication Package H.248.12 Annex A" },
1433 { 0x0066, "Enhanced DTMF Detection Package H.248.16" },
1434 { 0x0067, "Connection Group Identity Package Q.1950 Annex E" },
1435 { 0x0068, "CTM Text Transport 3GPP TS 29.232 v5.2.0" },
1436 { 0x0069, "SPNE Control Package Q.115.0" },
1437 { 0x006a, "Semi-permanent Connection Package H.248.21" },
1438 { 0x006b, "Shared Risk Group Package H.248.22" },
1439 { 0x006c, "isuptn Annex B of ITU-T Rec. J.171" },
1440 { 0x006d, "Basic CAS Addressing Package H.248.25" },
1441 { 0x006e, "Floor Control Package H.248.19" },
1442 { 0x006f, "Indication of Being Viewed Package H.248.19" },
1443 { 0x0070, "Volume Control Package H.248.19" },
1444 { 0x0071, "UNASSIGNED" },
1445 { 0x0072, "Volume Detection Package H.248.19" },
1446 { 0x0073, "Volume Level Mixing Package H.248.19" },
1447 { 0x0074, "Mixing Volume Level Control Package H.248.19" },
1448 { 0x0075, "Voice Activated Video Switch Package H.248.19" },
1449 { 0x0076, "Lecture Video Mode Package H.248.19" },
1450 { 0x0077, "Contributing Video Source Package H.248.19" },
1451 { 0x0078, "Video Window Package H.248.19" },
1452 { 0x0079, "Tiled Window Package H.248.19" },
1453 { 0x007a, "Adaptive Jitter Buffer Package H.248.31" },
1454 { 0x007b, "International CAS Package H.248.28" },
1455 { 0x007c, "CAS Blocking Package H.248.28" },
1456 { 0x007d, "International CAS Compelled Package H.248.29" },
1457 { 0x007e, "International CAS Compelled with Overlap Package H.248.29" },
1458 { 0x007f, "International CAS Compelled with End-to-end Package H.248.29" },
1459 { 0x0080, "RTCP XR Package H.248.30" },
1460 { 0x0081, "RTCP XR Burst Metrics Package H.248.30" },
1461 { 0x0082, "threegcsden 3G Circuit Switched Data" }, /* 3GPP TS 29.232 v5.6.0 */
1462 { 0x0083, "threegiptra 3G Circuit Switched Data" }, /* 3GPP TS 29.232 v5.6.0 */
1463 { 0x0084, "threegflex 3G Circuit Switched Data" }, /* 3GPP TS 29.232 v5.6.0 */
1464 { 0x0085, "H.248 PCMSB" },
1465 { 0x008a, "TIPHON Extended H.248/MEGACO Package" }, /* ETSI specification TS 101 3 */
1466 { 0x008b, "Differentiated Services Package" }, /* Annex A of ETSI TS 102 333 */
1467 { 0x008c, "Gate Management Package" }, /* Annex B of ETSI TS 102 333 */
1468 { 0x008d, "Traffic Management Package" }, /* Annex C of ETSI TS 102 333 */
1469 { 0x008e, "Gate Recovery Information Package" }, /* Annex D of ETSI TS 102 333 */
1470 { 0x008f, "NAT Traversal Package" }, /* Annex E of ETSI TS 102 333 */
1471 { 0x0090, "MPLS Package" }, /* Annex F of ETSI TS 102 333 */
1472 { 0x0091, "VLAN Package" }, /* Annex G of ETSI TS 102 333 */
1473 { 0x0092, "Detailed Congestion Reporting Package" }, /* H.248.32 */
1474 { 0x0093, "Stimulus Analogue Lines Package" }, /* H.248.34 */
1475 { 0x0094, "icascgen" }, /* H.248.29 Annex B */
1476 { 0x0095, "Coin Operated Phone Control Package" }, /* H.248.35 */
1477 { 0x0096, "Metering Pulse Detection Package" }, /* H.248.26 Amendment 1 */
1478 { 0x0097, "Trace Package" }, /* 3GPP TS 29.232 v6.3.0 */
1479 { 0x0098, "Hanging Termination Package" }, /* H.248.36 */
1480 { 0x0099, "IP NAPT Traversal Package" }, /* H.248.37 */
1481 { 0x009a, "Notification Behaviour Package" }, /* H.248.1v3 */
1482 { 0x009b, "Base Context Package" }, /* H.248.38 */
1483 { 0x009c, "Application Data Inactivity Detection Package" }, /* H.248.40 */
1484 { 0x009d, "Domain Connection Package " }, /* H.248.41 */
1485 { 0x009e, "Digital Circuit Multiplication Equipment Package" }, /* H.248.42 */
1486 { 0x009f, "Multi-level Precedence and Pre-emption Package" }, /* H.248.44 */
1487 { 0x00a0, "MGC Information Package" }, /* H.248.45 */
1488 { 0x00a1, "Text Overlay Package" }, /* H.248.19 Amendment 1 */
1489 { 0x00a2, "Border and Background Package" }, /* H.248.19 Amendment 1 */
1490 { 0x00a3, "Segmentation Package" }, /* H.248.1v3 */
1491 { 0x00a4, "ETSI notification behaviour package" }, /* ETSI ES 283 039-3 */
1492 { 0x00a5, "ETSI notification rate package" }, /* ETSI ES 283 039-4 */
1493 { 0x00a6, "Automatic Speech Recognition Package" }, /* H.248.9 Amendment 1 */
1494 { 0x00a7, "Set extension to basic syntax for TTS enhancement Package" },/* H.248.9 Amendment 1 */
1495 { 0x00a8, "Advanced audio server base package for TTS enhancement" }, /* H.248.9 Amendment 1 */
1496 { 0x00a9, "Multimedia Play Package" }, /* H.248.9 Amendment 1 */
1497 { 0x00aa, "Floor Status Detection Package" }, /* H.248.19 Amendment 2 */
1498 { 0x00ab, "Floor Control Policy Package" }, /* H.248.19 Amendment 2 */
1499 { 0x00ac, "Address Reporting Package" }, /* H.248.37 Amendment 1 */
1500 { 0x00ad, "Connection Capability Control Package" }, /* H.248.46 */
1501 { 0x00ae, "Statistic Conditional Reporting Package" }, /* H.248.47 Amendment 1 */
1502 { 0x00af, "RTCP HR QoS Statistics Package" }, /* H.248.48 */
1503 { 0x00b0, "Received RTCP XR Package" }, /* H.248.30 (01/2007) */
1504 { 0x00b1, "Received RTCP XR Burst Metrics Package" }, /* H.248.30 (01/2007) */
1505 { 0x00b2, "ASCI Group call package" }, /* 3GPP TS 29.232 v7.4.0 */
1506 { 0x00b3, "Multimedia Recording Package" }, /* H.248.9 Amendment 1 */
1507 { 0x00b4, "H.245 Transport Package" }, /* H.248.12 Amendment 2 */
1508 { 0x00b5, "RTCP Handling package" }, /* H.248.57 */
1509 { 0x00b6, "Gate Management - Outgoing Destination Address/Port Filtering Package" },/* H.248.43 */
1510 { 0x00b7, "Gate Management - Incoming Protocol Filtering Package" }, /* H.248.43 */
1511 { 0x00b8, "Gate Management - Outgoing Protocol Filtering Package" }, /* H.248.43 */
1512 { 0x00b9, "Gate Management - Incoming Filtering Behaviour Package" }, /* H.248.43 */
1513 { 0x00ba, "Gate Management - Outgoing Filtering Behaviour Package" }, /* H.248.43 */
1514 { 0x00bb, "Session Description Protocol RFC Package" }, /* H.248.49 */
1515 { 0x00bc, "Session Description Protocol Capabilities Package" }, /* H.248.49 */
1516 { 0x00bd, "NAT Traversal Toolkit - STUN Base Package" }, /* H.248.50 */
1517 { 0x00be, "NAT Traversal Toolkit - MG STUN Client Package" }, /* H.248.50 */
1518 { 0x00bf, "NAT Traversal Toolkit - MG TURN Client Package" }, /* H.248.50 */
1519 { 0x00c0, "NAT Traversal Toolkit - MGC STUN Client Package" }, /* H.248.50 */
1520 { 0x00c1, "NAT Traversal Toolkit - STUN Information Package" }, /* H.248.50 */
1521 { 0x00c2, "NAT Traversal Toolkit - MG Act-as STUN Server Package" }, /* H.248.50 */
1522 { 0x00c3, "NAT Traversal Toolkit - Originate STUN Continuity Check Package" }, /* H.248.50 */
1523 { 0x00c4, "NAT Traversal Toolkit - MGC Originated STUN Request Package" }, /* H.248.50 */
1524 { 0x00c5, "NAT Traversal Toolkit - RTP NOOP Request Package" }, /* H.248.50 */
1525 { 0x00c6, "Termination Connection Model Package" }, /* H.248.51 */
1526 { 0x00c7, "QoS Class Package" }, /* H.248.52 */
1527 { 0x00c8, "Traffic Policing Statistics Package" }, /* H.248.53 */
1528 { 0x00c9, "Packet Size Package" }, /* H.248.53 */
1529 { 0x00ca, "Pull Mode Package" }, /* H.248.55 */
1530 { 0x00cb, "RTP Application Data Package" }, /* H.248.58 */
1531 { 0x00cc, "Event Timestamp Notification Package" }, /* H.248.59 */
1532 { 0x00cd, "Resource Management Rules Package" }, /* H.248.63 */
1533 { 0x00ce, "Resource Management Configuration Package" }, /* H.248.63 */
1534 { 0x00cf, "Abstract Resource Management Packages" }, /* H.248.63 */
1535 { 0x00d0, "IP layer octets count statistics Package" }, /* H.248.61 */
1536 { 0x00d1, "Content of Communication Identity Package" }, /* H.248.60 */
1537 { 0x00d2, "RSVP extension package" }, /* H.248.65 */
1538 { 0x00d3, "GCP Transport Mode Indication Package" }, /* H.248.67 */
1539 { 0x00d4, "IP Router Package" }, /* H.248.64 */
1540 { 0x00d5, "Media Resource Identification Package" }, /* H.248.66 */
1541 { 0x00d6, "Range Format Support Package" }, /* H.248.66 */
1542 { 0x00d7, "Media Resource Description Expiry Package" }, /* H.248.66 */
1543 { 0x00d8, "Media Block Size Package" }, /* H.248.66 */
1544 { 0x00d9, "RTSP Media Resource Syntax Package" }, /* H.248.66 */
1545 { 0x00da, "RTSP Play Package" }, /* H.248.66 */
1546 { 0x00db, "Signal Pause Package" }, /* H.248.66 */
1547 { 0x00dc, "Data Delivery Speed Adjustme Package" }, /* H.248.66 */
1548 { 0x00dd, "Playback Relative Scale Adjustment Package" }, /* H.248.66 */
1549 { 0x00de, "RTP Information Package" }, /* H.248.66 */
1550 { 0x00df, "RTP Interleaving Package" }, /* H.248.66 */
1551 { 0x00e0, "IP Realm Availability Package" }, /* H.248.41 Amendment 1 */
1552 { 0x00e1, "General IP Header QoS Octet Package" }, /* H.248.52 */
1553 { 0x00e2, "Re-answer Package" }, /* H.248.62 */
1554 { 0x00e3, "3G Interface Type package" }, /* 3GPP TS 29.232 v8.4.0 */
1555 { 0x00e4, "Latch Statistics Package" }, /* H.248.37 */
1556 { 0x00e5, "Floor Control Signalling Package" }, /* H.248.19 Amendment 2 */
1557 { 0x00e6, "Include Participant in Mix Package" }, /* H.248.19 Amendment 2 */
1558 { 0x00e7, "Speaker Reporting Package" }, /* H.248.19 Amendment 2 */
1559 { 0x00e8, "IP Layer Packet Count Statistics Package" }, /* H.248.61 */
1560 { 0x00e9, "Removal of Digits and Tones Package" }, /* H.248.68 */
1561 { 0x00ea, "MSRP Statistics Package" }, /* H.248.69 */
1562 { 0x00eb, "MSRP Connection Status Package" }, /* H.248.69 */
1563 { 0x00ec, "Play Message Package" }, /* H.248.69 */
1564 { 0x00ed, "Delete Stored Message Package" }, /* H.248.69 */
1565 { 0x00ee, "Message Session Information Package" }, /* H.248.69 */
1566 { 0x00ef, "Message Filtering Package" }, /* H.248.69 */
1567 { 0x00f0, "Stored Message Information Package" }, /* H.248.69 */
1568 { 0x00f1, "Record Message Package" }, /* H.248.69 */
1569 { 0x00f2, "Digit Dialling Method Information Package" }, /* H.248.70 */
1570 { 0x00f3, "Digit Dialling Method Information for Extended Digitmap Detection Package" }, /* H.248.70 */
1571 { 0x00f4, "Digit Dialling Method Information for Enhanced Digitmap Detection Package" }, /* H.248.70 */
1572 { 0x00f5, "Received RTCP Package " }, /* H.248.71 */
1573 { 0x00f6, "RTP Cumulative Loss Package" }, /* H.248.71 */
1574 { 0x00f7, "H.245 Transport Package for SPC use" }, /* H.248.72 */
1575 { 0x00f8, "MONA Preference Package" }, /* H.248.72 */
1576 { 0x00f9, "TDM Gain Control Package" }, /* H.248.73 */
1577 { 0x00fa, "Media Start Package" }, /* H.248.74 */
1578 { 0x00fb, "Trim Package" }, /* H.248.74 */
1579 { 0x00fc, "Enhanced Recording Package" }, /* H.248.74 */
1580 { 0x00fd, "Enhanced ASR Package" }, /* H.248.74 */
1581 { 0x00fe, "Enhanced TTS Package" }, /* H.248.74 */
1582 { 0x00ff, "Play Offset Control Package" }, /* H.248.74 */
1583 { 0x0100, "Enhanced DTMF Detection Package" }, /* H.248.9 Revised 2009 */
1584 { 0x0101, "IP Router NAT Package" }, /* H.248.64 */
1585 { 0x0102, "Voice Enrolled Grammar Package" }, /* H.248.74 */
1586 { 0x0103, "Filter Group Package" }, /* H.248.76 */
1587 { 0x0104, "RTCP Source Description Package" }, /* H.248.71 */
1588 { 0x0105, "Speaker Verification and Identification Package" }, /* H.248.74 */
1589 { 0x0106, "Package Identifier Publishing and Application Package" }, /* H.248 */
1590 { 0x0107, "Secure RTP Package " }, /* H.248.77 */
1591 { 0x0108, "MGC Controlled Bearer Level ALG Package" }, /* H.248.78 */
1592 { 0x0109, "Enhanced Revised Offer/Answer SDP Support Package" }, /* H.248.80 */
1593 { 0x010a, "Enhanced SDP Media Capabilities Negotiation Support Package" }, /* H.248.80 */
1594 { 0x8000, "Ericsson IU" },
1595 { 0x8001, "Ericsson UMTS and GSM Circuit" },
1596 { 0x8002, "Ericsson Tone Generator Package" },
1597 { 0x8003, "Ericsson Line Test Package" },
1598 { 0x8004, "Nokia Advanced TFO Package" },
1599 { 0x8005, "Nokia IWF Package" },
1600 { 0x8006, "Nokia Root Package" },
1601 { 0x8007, "Nokia Trace Package" },
1602 { 0x8008, "Ericsson V5.2 Layer" },
1603 { 0x8009, "Ericsson Detailed Termination Information Package" },
1604 { 0x800a, "Nokia Bearer Characteristics Package" },
1605 { 0x800b, "Nokia Test Call Package" },
1606 { 0x800c, "Nokia Extended Continuity Package" },
1607 { 0x800d, "Nokia IPnwR Package" },
1608 { 0x800e, "Ericsson Tracing Enhancements Package" },
1609 { 0x800f, "Ericsson Partially Wildcarded TerminationID Package" },
1610 { 0x8010, "SCTP Stream Handling Package" },
1611 {0, NULL}
1615 * This table consist of PackageName + EventName and its corresponding string
1618 static const value_string base_event_name_vals[] = {
1619 { 0x00000000, "Media stream properties H.248.1 Annex C" },
1620 { 0x00010000, "g H.248.1 Annex E" },
1621 { 0x00010001, "g/Cause" },
1622 { 0x00010002, "g/Signal Completion" },
1623 { 0x00040000, "tonedet H.248.1 Annex E" },
1624 { 0x00040001, "tonedet/std(Start tone detected)" },
1625 { 0x00040002, "tonedet/etd(End tone detected)" },
1626 { 0x00040003, "tonedet/ltd(Long tone detected)" },
1627 { 0x00060000, "dd H.248.1 Annex E" },
1628 { 0x00060001, "dd/std" },
1629 { 0x00060002, "dd/etd" },
1630 { 0x00060003, "dd/ltd" },
1631 { 0x00060004, "dd, DigitMap Completion Event" },
1632 { 0x00060010, "dd/d0, DTMF character 0" },
1633 { 0x00060011, "dd/d1, DTMF character 1" },
1634 { 0x00060012, "dd/d2, DTMF character 2" },
1635 { 0x00060013, "dd/d3, DTMF character 3" },
1636 { 0x00060014, "dd/d4, DTMF character 4" },
1637 { 0x00060015, "dd/d5, DTMF character 5" },
1638 { 0x00060016, "dd/d6, DTMF character 6" },
1639 { 0x00060017, "dd/d7, DTMF character 7" },
1640 { 0x00060018, "dd/d8, DTMF character 8" },
1641 { 0x00060019, "dd/d9, DTMF character 9" },
1642 { 0x0006001a, "dd/a, DTMF character A" },
1643 { 0x0006001b, "dd/b, DTMF character B" },
1644 { 0x0006001c, "dd/c, DTMF character C" },
1645 { 0x0006001d, "dd/d, DTMF character D" },
1646 { 0x00060020, "dd/" "*, DTMF character *" }, /* XXX: hack so checkAPIs & etc won't see a 'start of comment' */
1647 { 0x00060021, "dd/#, DTMF character #" },
1648 { 0x00080030, "cd, Dial Tone" },
1649 { 0x00080031, "cd, Ringing Tone" },
1650 { 0x00080032, "cd, Busy Tone" },
1651 { 0x00080033, "cd, Congestion Tone" },
1652 { 0x00080034, "cd, Special Information Tone" },
1653 { 0x00080035, "cd, (Recording) Warning Tone" },
1654 { 0x00080036, "cd, Payphone Recognition Tone" },
1655 { 0x00080037, "cd, Call Waiting Tone" },
1656 { 0x00080038, "cd, Caller Waiting Tone" },
1657 { 0x00090004, "al, onhook" },
1658 { 0x00090005, "al, offhook" },
1659 { 0x00090006, "al, flashhook" },
1660 { 0x0009ffff, "al, *" },
1661 { 0x000a0005, "ct, Completion of Continuity test" },
1662 { 0x000b0005, "nt, network failure" },
1663 { 0x000b0006, "nt, quality alert" },
1664 { 0x000c0001, "rtp, Payload Transition" },
1665 { 0x00210000, "Generic Bearer Connection Q.1950 Annex A" },
1666 { 0x00210001, "GB/BNCChange" },
1667 { 0x00220001, "BT/TIND (Tunnel Indication)" },
1668 { 0x002a0001, "H.245/h245msg (Incoming H.245 Message)" },
1669 { 0x002a0004, "H.245/h245ChC (H.245 Channel Closed)" },
1670 { 0x00450000, "Inactivity Timer H.248.14" },
1671 { 0x00450001, "it/ito" },
1672 { 0x00450002, "it/ito" },
1673 { 0x00460001, "threegmlc/mod_link_supp (Bearer Modification Support Event)" },
1674 { 0x00980000, "Hanging Termination Package" },
1675 { 0x00980001, "Termination Heartbeat" },
1676 { 0x800a0000, "Nokia Bearer Characteristics Package" },
1677 {0, NULL}
1681 * This table consist of PackageName + SignalName and its corresponding string
1683 static const value_string base_signal_name_vals[] = {
1684 { 0x00000000, "Media stream properties H.248.1 Annex C" },
1685 { 0x00010000, "g H.248.1 Annex E" },
1686 { 0x00030001, "tonegen/pt(Play tone)" },
1687 { 0x00050010, "dg, DTMF character 0" },
1688 { 0x00050011, "dg, DTMF character 1" },
1689 { 0x00050012, "dg, DTMF character 2" },
1690 { 0x00050013, "dg, DTMF character 3" },
1691 { 0x00050014, "dg, DTMF character 4" },
1692 { 0x00050015, "dg, DTMF character 5" },
1693 { 0x00050016, "dg, DTMF character 6" },
1694 { 0x00050017, "dg, DTMF character 7" },
1695 { 0x00050018, "dg, DTMF character 8" },
1696 { 0x00050019, "dg, DTMF character 9" },
1697 { 0x0005001a, "dg, DTMF character A" },
1698 { 0x0005001b, "dg, DTMF character B" },
1699 { 0x0005001c, "dg, DTMF character C" },
1700 { 0x0005001d, "dg, DTMF character D" },
1701 { 0x00050020, "dg, DTMF character *" },
1702 { 0x00050021, "dg, DTMF character #" },
1703 { 0x00070030, "cg, Dial Tone" },
1704 { 0x00070031, "cg/rt (Ringing Tone)" },
1705 { 0x00070032, "cg, Busy Tone" },
1706 { 0x00070033, "cg, Congestion Tone" },
1707 { 0x00070034, "cg, Special Information Tone" },
1708 { 0x00070035, "cg, (Recording) Warning Tone" },
1709 { 0x00070036, "cg, Payphone Recognition Tone" },
1710 { 0x00070037, "cg, Call Waiting Tone" },
1711 { 0x00070038, "cg, Caller Waiting Tone" },
1712 { 0x00090002, "al, ring" },
1713 { 0x0009ffff, "al, *" },
1714 { 0x000a0003, "ct, Continuity test" },
1715 { 0x000a0004, "ct, Continuity respond" },
1716 { 0x00210000, "GB Generic Bearer Connection Q.1950 Annex A" },
1717 { 0x00210001, "GB/EstBNC(Establish BNC)" },
1718 { 0x00210002, "GB/ModBNC (Modify BNC)" },
1719 { 0x00210003, "GB/RelBNC(Release BNC)" },
1720 { 0x002a0001, "H.245/cs (channel state)" },
1721 { 0x002a0002, "H.245/termtype (Terminal Type)" },
1722 { 0x002c0001, "H.324/cmod (Communication mode)" },
1723 { 0x002c0002, "H.324/muxlv (Highest Multiplexing level)" },
1724 { 0x002c0003, "H.324/demux (Demultiplex)" },
1725 { 0x002c0004, "H.324/h223capr (Remote H.223 capability)" },
1726 { 0x002c0005, "H.324/muxtbl_in (Incoming Multiplex Table)" },
1727 { 0x002c0006, "H.324/muxtbl_out (Outgoing Multiplex Table)" },
1728 { 0x800a0000, "Nokia Bearer Characteristics Package" },
1729 {0, NULL}
1733 static const value_string h248_reasons[] = {
1734 { 400, "Syntax error in message"},
1735 { 401, "Protocol Error"},
1736 { 402, "Unauthorized"},
1737 { 403, "Syntax error in transaction request"},
1738 { 406, "Version Not Supported"},
1739 { 410, "Incorrect identifier"},
1740 { 411, "The transaction refers to an unknown ContextId"},
1741 { 412, "No ContextIDs available"},
1742 { 413, "Number of transactions in message exceeds maximum"}, /* [H.248.8 (08/07)] */
1743 { 421, "Unknown action or illegal combination of actions"},
1744 { 422, "Syntax Error in Action"},
1745 { 430, "Unknown TerminationID"},
1746 { 431, "No TerminationID matched a wildcard"},
1747 { 432, "Out of TerminationIDs or No TerminationID available"},
1748 { 433, "TerminationID is already in a Context"},
1749 { 434, "Max number of Terminations in a Context exceeded"},
1750 { 435, "Termination ID is not in specified Context"},
1751 { 440, "Unsupported or unknown Package"},
1752 { 441, "Missing Remote or Local Descriptor"},
1753 { 442, "Syntax Error in Command"},
1754 { 443, "Unsupported or Unknown Command"},
1755 { 444, "Unsupported or Unknown Descriptor"},
1756 { 445, "Unsupported or Unknown Property"},
1757 { 446, "Unsupported or Unknown Parameter"},
1758 { 447, "Descriptor not legal in this command"},
1759 { 448, "Descriptor appears twice in a command"},
1760 { 449, "Unsupported or Unknown Parameter or Property Value"},
1761 { 450, "No such property in this package"},
1762 { 451, "No such event in this package"},
1763 { 452, "No such signal in this package"},
1764 { 453, "No such statistic in this package"},
1765 { 454, "No such parameter value in this package"},
1766 { 455, "Property illegal in this Descriptor"},
1767 { 456, "Property appears twice in this Descriptor"},
1768 { 457, "Missing parameter in signal or event"},
1769 { 458, "Unexpected Event/Request ID"},
1770 { 459, "Unsupported or Unknown Profile"},
1771 { 460, "Unable to set statistic on stream"},
1772 { 461, "Unsupported or Unknown Profile"}, /*[H.248.18] */
1774 { 471, "Implied Add for Multiplex failure"},
1775 { 472, "Required Information Missing"}, /*[H.248.8 (08/07)] */
1776 { 473, "Conflicting Property Values"}, /*[H.248.8 (08/07)] */
1777 { 474, "Invalid SDP Syntax"}, /*[H.248.49] */
1778 { 475, "Unable to pause the playout of the signal"}, /*[H.248.66] */
1779 { 476, "Unable to adjust the data delivery speed of the Signal"}, /*[H.248.66] */
1781 { 477, "Unable to adjust the playback relative scale of the signal"}, /*[H.248.66] */
1783 { 478, "Behaviour Contradicts Resource Rule"}, /*[H.248.63] */
1785 { 500, "Internal software Failure in MG"},
1786 { 501, "Not Implemented"},
1787 { 502, "Not ready"},
1788 { 503, "Service Unavailable"},
1789 { 504, "Command Received from unauthorized entity"},
1790 { 505, "Transaction Request Received before a Service Change Reply has been received"},
1791 { 506, "Number of Transaction Pendings Exceeded"},
1792 { 510, "Insufficient resources"},
1793 { 511, "Temporarily Busy"}, /* [H.248.8 (08/07)] */
1794 { 512, "Media Gateway unequipped to detect requested Event"},
1795 { 513, "Media Gateway unequipped to generate requested Signals"},
1796 { 514, "Media Gateway cannot send the specified announcement"},
1797 { 515, "Unsupported Media Type"},
1798 { 517, "Unsupported or invalid mode"},
1799 { 518, "Event buffer full"},
1800 { 519, "Out of space to store digit map"},
1801 { 520, "Digit Map undefined in the MG"},
1802 { 521, "Termination is ServiceChanging"},
1803 { 522, "Functionality Requested in Topology Triple Not Supported"},
1804 { 526, "Insufficient bandwidth"},
1805 { 529, "Internal hardware failure in MG"},
1806 { 530, "Temporary Network failure"},
1807 { 531, "Permanent Network failure"},
1808 { 532, "Audited Property, Statistic, Event or Signal does not exist"},
1809 { 533, "Response exceeds maximum transport PDU size"},
1810 { 534, "Illegal write or read only property"},
1811 { 540, "Unexpected initial hook state"},
1812 { 541, "Unexpected Spare Bit State"}, /* [H.248.33] */
1813 { 542, "Command is not allowed on this termination"},
1814 { 543, "MGC requested event detection timestamp not supported"}, /* [H.248.8 (08/07)] */
1815 { 581, "Does Not Exist"},
1816 { 600, "Illegal syntax within an announcement specification"},
1817 { 601, "Variable type not supported"},
1818 { 602, "Variable value out of range"},
1819 { 603, "Category not supported"},
1820 { 604, "Selector type not supported"},
1821 { 605, "Selector value not supported"},
1822 { 606, "Unknown segment ID"},
1823 { 607, "Mismatch between play specification and provisioned data"},
1824 { 608, "Provisioning error"},
1825 { 609, "Invalid offset"},
1826 { 610, "No free segment IDs"},
1827 { 611, "Temporary segment not found"},
1828 { 612, "Segment in use"},
1829 { 613, "ISP port limit overrun"},
1830 { 614, "No modems available"},
1831 { 615, "Calling number unacceptable"},
1832 { 616, "Called number unacceptable"},
1833 { 617, "Reserved for H.248.9 return code"}, /* [H.248.9] */
1834 { 618, "Reserved for H.248.9 return code"}, /* [H.248.9] */
1835 { 622, "Reserved for H.248.9 return code"}, /* [H.248.9] */
1836 { 623, "Reserved for H.248.9 return code"}, /* [H.248.9] */
1837 { 624, "Reserved for H.248.9 return code"}, /* [H.248.9] */
1838 { 625, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
1839 { 626, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
1840 { 627, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
1841 { 628, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
1842 { 629, "Reserved for H.248.9 return code"}, /* [H.248.9 Amendment 1] */
1843 { 700, "Sieve Script Syntax Error"}, /* [H.248.69] */
1844 { 701, "Unsupported Sieve Require Error"}, /* [H.248.69] */
1845 { 702, "Sieve Actions Exceeded Error"}, /* [H.248.69] */
1847 { 900, "Service Restored"},
1848 { 901, "Cold Boot"},
1849 { 902, "Warm Boot"},
1850 { 903, "MGC Directed Change"},
1851 { 904, "Termination malfunctioning"},
1852 { 905, "Termination taken out of service"},
1853 { 906, "Loss of lower layer connectivity (e.g. downstream sync)"},
1854 { 907, "Transmission Failure"},
1855 { 908, "MG Impending Failure"},
1856 { 909, "MGC Impending Failure"},
1857 { 910, "Media Capability Failure"},
1858 { 911, "Modem Capability Failure"},
1859 { 912, "Mux Capability Failure"},
1860 { 913, "Signal Capability Failure"},
1861 { 914, "Event Capability Failure"},
1862 { 915, "State Loss"},
1863 { 916, "Packages Change"},
1864 { 917, "Capabilities Change"},
1865 { 918, "Cancel Graceful"},
1866 { 919, "Warm Failover"},
1867 { 920, "Cold Failover"},
1868 {0,NULL}
1870 static value_string_ext h248_reasons_ext = VALUE_STRING_EXT_INIT(h248_reasons);
1872 static const value_string wildcard_modes[] = {
1873 { 0, "Choose" },
1874 { 1, "All" },
1875 { 0, NULL }
1878 static const value_string wildcard_levels[] = {
1879 { 0, "This One Level" },
1880 { 1, "This Level and those below" },
1881 { 0, NULL }
1884 static h248_curr_info_t curr_info;
1885 static uint32_t error_code;
1886 static uint32_t h248_version; /* h248v1 support */
1887 static gcp_wildcard_t wild_term;
1888 static uint8_t wild_card = 0xFF; /* place to store wildcardField */
1890 /* Call the export PDU tap with relevant data */
1891 static void
1892 export_h248_pdu(packet_info *pinfo, tvbuff_t *tvb)
1894 if (have_tap_listener(exported_pdu_tap)) {
1895 exp_pdu_data_t *exp_pdu_data = export_pdu_create_common_tags(pinfo, "h248", EXP_PDU_TAG_DISSECTOR_NAME);
1897 exp_pdu_data->tvb_captured_length = tvb_captured_length(tvb);
1898 exp_pdu_data->tvb_reported_length = tvb_reported_length(tvb);
1899 exp_pdu_data->pdu_tvb = tvb;
1901 tap_queue_packet(exported_pdu_tap, pinfo, exp_pdu_data);
1905 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) {
1906 asn1_ctx_t asn1_ctx;
1907 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
1908 dissect_ber_integer(implicit ? *((bool*)implicit) : false, &asn1_ctx, tree, tvb, 0, hfid, NULL);
1911 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) {
1912 asn1_ctx_t asn1_ctx;
1913 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
1914 dissect_ber_octet_string(implicit ? *((bool*)implicit) : false, &asn1_ctx, tree, tvb, 0, hfid, NULL);
1917 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) {
1918 asn1_ctx_t asn1_ctx;
1919 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
1920 dissect_ber_boolean(implicit ? *((bool*)implicit) : false, &asn1_ctx, tree, tvb, 0, hfid, NULL);
1923 extern void h248_param_bytes_item(proto_tree* tree,
1924 tvbuff_t* tvb,
1925 packet_info* pinfo _U_,
1926 int hfid,
1927 h248_curr_info_t* h248_info _U_,
1928 void* lenp ) {
1929 int len = lenp ? *((int*)lenp) : -1;
1930 proto_tree_add_item(tree,hfid,tvb,0,len,ENC_NA);
1933 extern void h248_param_uint_item(proto_tree* tree,
1934 tvbuff_t* tvb,
1935 packet_info* pinfo _U_,
1936 int hfid,
1937 h248_curr_info_t* h248_info _U_,
1938 void* lenp ) {
1939 int len = lenp ? *((int*)lenp) : -1;
1940 proto_tree_add_item(tree,hfid,tvb,0,len,ENC_BIG_ENDIAN);
1943 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) {
1944 call_dissector((dissector_handle_t) dissector_hdl,tvb,pinfo,tree);
1948 static const h248_package_t no_package = { 0xffff, &hf_h248_no_pkg, &ett_h248_no_pkg, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
1949 static const h248_pkg_sig_t no_signal = { 0, &hf_h248_no_sig, &ett_h248_no_sig, NULL, NULL };
1950 static const h248_pkg_param_t no_param = { 0, &hf_h248_param, h248_param_uint_item, NULL };
1951 static const h248_pkg_evt_t no_event = { 0, &hf_h248_no_evt, &ett_h248_no_evt, NULL, NULL };
1953 static const h248_package_t *find_package_id(uint16_t pkgid);
1954 static wmem_tree_t* packages;
1956 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_) {
1957 tvbuff_t *new_tvb = NULL;
1958 proto_tree *package_tree=NULL;
1959 uint16_t name_major, name_minor;
1960 const h248_package_t* pkg = NULL;
1961 int offset = 0;
1962 asn1_ctx_t asn1_ctx;
1963 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
1965 offset = dissect_ber_octet_string(false, &asn1_ctx, tree, tvb, offset, hfid , &new_tvb);
1967 if (new_tvb) {
1968 /* this field is always 4 bytes so just read it into two integers */
1969 name_major=tvb_get_ntohs(new_tvb, 0);
1970 name_minor=tvb_get_ntohs(new_tvb, 2);
1971 pkg = find_package_id(name_major);
1972 /* do the prettification */
1973 proto_item_append_text(asn1_ctx.created_item, " %s (%04x)",
1974 val_to_str_const(0, pkg->param_names, "Unknown Package"),
1975 name_major);
1977 if(tree){
1978 proto_item* pi;
1979 const char* strval;
1981 package_tree = proto_item_add_subtree(asn1_ctx.created_item, ett_packagename);
1982 proto_tree_add_uint_format(package_tree, hf_h248_pkg_name, tvb, offset-4, 2, name_major,
1983 "%s (0x%04x)", val_to_str_const(0, pkg->param_names, "Unknown Package"), name_major);
1985 pi = proto_tree_add_uint(package_tree, hf_248_pkg_param, tvb, offset-2, 2, name_minor);
1987 if (pkg->signal_names && ( strval = try_val_to_str(name_minor, pkg->signal_names) )) {
1988 strval = wmem_strdup_printf(pinfo->pool, "%s (%d)",strval,name_minor);
1989 } else {
1990 strval = wmem_strdup_printf(pinfo->pool, "Unknown (%d)",name_minor);
1993 proto_item_set_text(pi,"Signal ID: %s", strval);
2000 static int dissect_h248_trx_id(bool implicit_tag, packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, uint32_t* trx_id_p) {
2001 uint64_t trx_id = 0;
2002 int8_t ber_class;
2003 bool pc;
2004 int32_t tag;
2005 uint32_t len;
2006 uint32_t i;
2008 if(!implicit_tag){
2009 offset=dissect_ber_identifier(pinfo, tree, tvb, offset, &ber_class, &pc, &tag);
2010 offset=dissect_ber_length(pinfo, tree, tvb, offset, &len, NULL);
2011 } else {
2012 len=tvb_reported_length_remaining(tvb, offset);
2016 if (len > 8 || len < 1) {
2017 THROW(BoundsError);
2018 } else {
2019 for(i=1;i<=len;i++){
2020 trx_id=(trx_id<<8)|tvb_get_uint8(tvb, offset);
2021 offset++;
2023 if (trx_id > 0xffffffff) {
2024 proto_item* pi = proto_tree_add_uint64(tree, hf_h248_transactionId64, tvb, offset-len, len, trx_id);
2025 expert_add_info(pinfo, pi, &ei_h248_transactionId64);
2027 *trx_id_p = 0;
2029 } else {
2030 proto_tree_add_uint(tree, hf_h248_transactionId, tvb, offset-len, len, (uint32_t)trx_id);
2031 *trx_id_p = (uint32_t)trx_id;
2035 return offset;
2038 static int dissect_h248_ctx_id(bool implicit_tag, packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, uint32_t* ctx_id_p) {
2039 int8_t ber_class;
2040 bool pc;
2041 int32_t tag;
2042 uint32_t len;
2043 uint64_t ctx_id = 0;
2044 uint32_t i;
2046 if(!implicit_tag){
2047 offset=dissect_ber_identifier(pinfo, tree, tvb, offset, &ber_class, &pc, &tag);
2048 offset=dissect_ber_length(pinfo, tree, tvb, offset, &len, NULL);
2049 } else {
2050 len=tvb_reported_length_remaining(tvb, offset);
2054 if (len > 8 || len < 1) {
2055 THROW(BoundsError);
2056 } else {
2057 for(i=1;i<=len;i++){
2058 ctx_id=(ctx_id<<8)|tvb_get_uint8(tvb, offset);
2059 offset++;
2062 if (ctx_id > 0xffffffff) {
2063 proto_item* pi = proto_tree_add_uint64(tree, hf_h248_context_id64, tvb, offset-len, len, ctx_id);
2064 expert_add_info(pinfo, pi, &ei_h248_context_id64);
2066 *ctx_id_p = 0xfffffffd;
2068 } else {
2069 proto_item* pi = proto_tree_add_uint(tree, hf_h248_context_id, tvb, offset-len, len, (uint32_t)ctx_id);
2071 if ( ctx_id == NULL_CONTEXT ) {
2072 proto_item_set_text(pi,"contextId: Null Context(0)");
2073 } else if ( ctx_id == CHOOSE_CONTEXT ) {
2074 proto_item_set_text(pi,"contextId: $ (Choose Context = 0xfffffffe)");
2075 } else if ( ctx_id == ALL_CONTEXTS ) {
2076 proto_item_set_text(pi,"contextId: * (All Contexts = 0xffffffff)");
2079 *ctx_id_p = (uint32_t) ctx_id;
2083 return offset;
2086 static s_h248_package_t *s_find_package_id(uint16_t pkgid) {
2087 s_h248_package_t *s_pkg = NULL;
2088 s_pkg = (s_h248_package_t *)wmem_tree_lookup32(packages, (uint32_t)(pkgid));
2089 return s_pkg;
2092 static const h248_package_t *find_package_id(uint16_t pkgid) {
2093 s_h248_package_t *s_pkg = NULL;
2094 s_pkg = s_find_package_id(pkgid); /*(packages, GUINT_TO_POINTER((uint32_t)(pkgid))); */
2095 if (! s_pkg ) return &no_package;
2096 return s_pkg->pkg;
2099 static bool is_pkg_default(uint16_t pkgid) {
2100 s_h248_package_t *s_pkg = NULL;
2101 s_pkg = (s_h248_package_t *)wmem_tree_lookup32(packages, (uint32_t)(pkgid));
2102 if(! s_pkg ) return true;
2103 return s_pkg->is_default;
2106 void h248_register_package(h248_package_t* pkg, pkg_reg_action reg_action) {
2107 h248_package_t *pkg_found = NULL, *pkg_high = NULL, *pkg_low = NULL;
2108 s_h248_package_t *s_pkg = NULL;
2109 value_string *vst;
2110 bool pkg_default = false;
2111 int j = 0, idx = 0, i = 0, k = 0;
2112 if (! packages) {
2113 /* no packaegs are yet registerd so create tree and add default packages to tree
2115 packages = wmem_tree_new(wmem_epan_scope()); /* init tree if no entries */
2116 while (base_package_name_vals[i].strptr != NULL) {
2117 pkg_found = wmem_new0(wmem_epan_scope(), h248_package_t); /* create a h248 package structure */
2118 pkg_found->id = base_package_name_vals[i].value;
2119 vst = (value_string *)wmem_alloc0(wmem_epan_scope(), sizeof(value_string)*2);
2120 vst[0].strptr = base_package_name_vals[i].strptr;
2121 pkg_found->param_names = vst;
2122 pkg_found->hfid = &hf_h248_pkg_name;
2123 pkg_found->ett = &ett_packagename;
2124 try_val_to_str_idx((pkg_found->id)<<16,base_event_name_vals, &j);
2125 /* now look for events and signals that may be defined for package. If found, create value_strings */
2126 if (j != -1) {
2127 j++; idx=j;
2128 while((base_event_name_vals[j].strptr!=NULL) && (((base_event_name_vals[j].value)>>16) == (pkg_found->id))) {
2129 j++;
2131 if (idx < j) {
2132 vst = (value_string *)wmem_alloc0(wmem_epan_scope(), sizeof(value_string)*(j-idx+1));
2133 for (k=0;idx<j;k++) {
2134 vst[k].strptr = base_event_name_vals[idx].strptr;
2135 vst[k].value = (base_event_name_vals[idx].value & 0xffff);
2136 idx++;
2138 pkg_found->event_names = vst;
2141 /* now look at signals */
2142 if (!try_val_to_str_idx((pkg_found->id)<<16, base_signal_name_vals, &j)) {
2143 j++; idx=j;
2144 while((base_signal_name_vals[j].strptr != NULL) && ((base_signal_name_vals[j].value>>16) == (pkg_found->id))) {
2145 j++;
2147 if (idx < j) {
2148 vst = (value_string *)wmem_alloc0(wmem_epan_scope(), sizeof(value_string)*(j-idx+1));
2149 for (k=0;idx<j;k++) {
2150 vst[k].strptr = base_signal_name_vals[idx].strptr;
2151 vst[k].value = (base_signal_name_vals[idx].value &0xffff);
2152 idx++;
2154 pkg_found->signal_names = vst;
2157 s_pkg = wmem_new0(wmem_epan_scope(), s_h248_package_t);
2158 s_pkg->is_default = true;
2159 s_pkg->pkg = pkg_found;
2160 wmem_tree_insert32(packages, pkg_found->id, s_pkg);
2161 i++;
2163 pkg_found = NULL; /* reset pointer */
2165 pkg_default = is_pkg_default(pkg->id);
2166 if (((reg_action==REPLACE_PKG) || (reg_action==ADD_PKG)) && pkg_default) {
2167 /* add/replace in tree */
2168 s_pkg = wmem_new0(wmem_epan_scope(), s_h248_package_t);
2169 s_pkg->is_default = false;
2170 s_pkg->pkg = (h248_package_t *)pkg;
2171 wmem_tree_insert32(packages, pkg->id, s_pkg);
2172 return;
2174 if(pkg_default) reg_action = MERGE_PKG_HIGH; /* always make new package override default */
2175 s_pkg = s_find_package_id(pkg->id);
2176 if (s_pkg == NULL) { /* no need to merge - package not in tree */
2177 s_pkg = wmem_new0(wmem_epan_scope(), s_h248_package_t);
2178 s_pkg->is_default = false;
2179 s_pkg->pkg = (h248_package_t *)pkg;
2180 wmem_tree_insert32(packages, pkg->id, s_pkg);
2181 return;
2183 pkg_found = s_pkg->pkg;
2184 if (reg_action==MERGE_PKG_HIGH) {
2185 pkg_high = (h248_package_t *)pkg;
2186 pkg_low = pkg_found;
2188 if (reg_action==MERGE_PKG_LOW) {
2189 pkg_high = pkg_found;
2190 pkg_low = (h248_package_t *)pkg;
2192 if(pkg_high) {
2193 /* if h248_package_t High Priority value !NULL, replace it in the found tree entry else use current entry */
2194 (pkg_high->hfid ? (pkg_found->hfid=pkg_high->hfid) : (pkg_found->hfid=pkg_low->hfid));
2195 (pkg_high->ett ? (pkg_found->ett=pkg_high->ett ):( pkg_found->ett=pkg_low->ett));
2196 (pkg_high->param_names ? (pkg_found->param_names=pkg_high->param_names ):( pkg_found->param_names=pkg_low->param_names));
2197 (pkg_high->signal_names ? (pkg_found->signal_names=pkg_high->signal_names ):( pkg_found->signal_names=pkg_low->signal_names));
2198 (pkg_high->event_names ? (pkg_found->event_names=pkg_high->event_names ):( pkg_found->event_names=pkg_low->event_names));
2199 (pkg_high->stats_names ? (pkg_found->stats_names=pkg_high->stats_names ):( pkg_found->stats_names=pkg_low->stats_names));
2200 (pkg_high->properties ? (pkg_found->properties=pkg_high->properties ):( pkg_found->properties=pkg_low->properties));
2201 (pkg_high->signals ? (pkg_found->signals=pkg_high->signals ):( pkg_found->signals=pkg_low->signals));
2202 (pkg_high->events ? (pkg_found->events=pkg_high->events ):( pkg_found->events=pkg_low->events));
2203 (pkg_high->statistics ? (pkg_found->statistics=pkg_high->statistics ):( pkg_found->statistics=pkg_low->statistics));
2204 s_pkg->pkg = pkg_found;
2205 s_pkg->is_default = false;
2210 static uint32_t packageandid;
2212 static int dissect_h248_PkgdName(bool implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index) {
2213 tvbuff_t *new_tvb = NULL;
2214 proto_tree *package_tree=NULL;
2215 uint16_t name_major, name_minor;
2216 const h248_package_t* pkg = NULL;
2218 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
2220 if (new_tvb) {
2221 /* this field is always 4 bytes so just read it into two integers */
2222 name_major=tvb_get_ntohs(new_tvb, 0);
2223 name_minor=tvb_get_ntohs(new_tvb, 2);
2224 packageandid=(name_major<<16)|name_minor;
2226 pkg = find_package_id(name_major);
2227 /* do the prettification */
2228 proto_item_append_text(actx->created_item, " %s (%04x)",
2229 val_to_str_const(0, pkg->param_names, "Unknown Package"),
2230 name_major);
2232 if(tree){
2233 package_tree = proto_item_add_subtree(actx->created_item, ett_packagename);
2234 proto_tree_add_uint_format(package_tree, hf_h248_pkg_name, tvb, offset-4, 2, name_major,
2235 "PkgName: %s (0x%04x)", val_to_str_const(0, pkg->param_names, "Unknown Package"), name_major);
2239 proto_item* pi = proto_tree_add_uint(package_tree, hf_248_pkg_param, tvb, offset-2, 2, name_minor);
2240 const char* strval;
2242 if (pkg->param_names && ( strval = try_val_to_str(name_minor, pkg->param_names) )) {
2243 strval = wmem_strdup_printf(actx->pinfo->pool, "%s (%d)",strval,name_minor);
2244 } else {
2245 strval = wmem_strdup_printf(actx->pinfo->pool, "Unknown (%d)",name_minor);
2248 proto_item_set_text(pi,"Parameter: %s", strval);
2250 } else {
2251 pkg = &no_package;
2254 curr_info.pkg = pkg;
2256 return offset;
2259 static int dissect_h248_EventName(bool implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index) {
2260 tvbuff_t *new_tvb;
2261 proto_tree *package_tree=NULL;
2262 uint16_t name_major, name_minor;
2263 const h248_package_t* pkg = NULL;
2264 const h248_pkg_evt_t* evt = NULL;
2266 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
2268 if (new_tvb) {
2269 /* this field is always 4 bytes so just read it into two integers */
2270 name_major=tvb_get_ntohs(new_tvb, 0);
2271 name_minor=tvb_get_ntohs(new_tvb, 2);
2272 packageandid=(name_major<<16)|name_minor;
2274 pkg = find_package_id(name_major);
2275 /* do the prettification */
2276 proto_item_append_text(actx->created_item, " %s (%04x)",
2277 val_to_str_const(0, pkg->param_names, "Unknown Package"),
2278 name_major);
2279 if(tree){
2280 package_tree = proto_item_add_subtree(actx->created_item, ett_packagename);
2282 proto_tree_add_uint_format(package_tree, hf_h248_pkg_name, tvb, offset-4, 2, name_major,
2283 "%s (0x%04x)", val_to_str_const(0, pkg->param_names, "Unknown Package"), name_major);
2285 curr_info.pkg = pkg;
2287 if (pkg->events) {
2288 for (evt = pkg->events; evt->hfid; evt++) {
2289 if (name_minor == evt->id) {
2290 break;
2294 if (! evt->hfid) evt = &no_event;
2295 } else {
2296 evt = &no_event;
2299 curr_info.evt = evt;
2302 proto_item* pi = proto_tree_add_uint(package_tree, hf_h248_event_code, tvb, offset-2, 2, name_minor);
2303 const char* strval;
2305 if (pkg->event_names && ( strval = try_val_to_str(name_minor, pkg->event_names) )) {
2306 strval = wmem_strdup_printf(actx->pinfo->pool, "%s (%d)",strval,name_minor);
2307 } else {
2308 strval = wmem_strdup_printf(actx->pinfo->pool, "Unknown (%d)",name_minor);
2311 proto_item_set_text(pi,"Event ID: %s", strval);
2314 } else {
2315 curr_info.pkg = &no_package;
2316 curr_info.evt = &no_event;
2319 return offset;
2324 static int dissect_h248_SignalName(bool implicit_tag , tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index) {
2325 tvbuff_t *new_tvb;
2326 proto_tree *package_tree=NULL;
2327 uint16_t name_major, name_minor;
2328 const h248_package_t* pkg = NULL;
2329 const h248_pkg_sig_t* sig;
2331 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
2333 if (new_tvb) {
2334 /* this field is always 4 bytes so just read it into two integers */
2335 name_major=tvb_get_ntohs(new_tvb, 0);
2336 name_minor=tvb_get_ntohs(new_tvb, 2);
2337 packageandid=(name_major<<16)|name_minor;
2339 pkg = find_package_id(name_major);
2340 /* do the prettification */
2341 proto_item_append_text(actx->created_item, " %s (%04x)",
2342 val_to_str_const(0, pkg->param_names, "Unknown Package"),
2343 name_major);
2344 if(tree){
2345 package_tree = proto_item_add_subtree(actx->created_item, ett_packagename);
2347 proto_tree_add_uint_format(package_tree, hf_h248_pkg_name, tvb, offset-4, 2, name_major,
2348 "%s (0x%04x)", val_to_str_const(0, pkg->param_names, "Unknown Package"), name_major);
2350 if (pkg->signals) {
2351 for (sig = pkg->signals; sig->hfid; sig++) {
2352 if (name_minor == sig->id) {
2353 break;
2357 if (! sig->hfid) sig = &no_signal;
2359 curr_info.pkg = pkg;
2360 curr_info.sig = sig;
2361 } else {
2362 curr_info.pkg = &no_package;
2363 curr_info.sig = &no_signal;
2367 proto_item* pi = proto_tree_add_uint(package_tree, hf_h248_signal_code, tvb, offset-2, 2, name_minor);
2368 const char* strval;
2370 if (pkg->signal_names && ( strval = try_val_to_str(name_minor, pkg->signal_names) )) {
2371 strval = wmem_strdup_printf(actx->pinfo->pool, "%s (%d)",strval,name_minor);
2372 } else {
2373 strval = wmem_strdup_printf(actx->pinfo->pool, "Unknown (%d)",name_minor);
2376 proto_item_set_text(pi,"Signal ID: %s", strval);
2379 } else {
2380 curr_info.pkg = &no_package;
2381 curr_info.sig = &no_signal;
2384 return offset;
2387 static int dissect_h248_PropertyID(bool implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
2389 int8_t ber_class;
2390 bool pc, ind;
2391 int32_t tag;
2392 uint32_t len;
2393 uint16_t name_minor;
2394 int end_offset;
2395 const h248_package_t* pkg;
2396 const h248_pkg_param_t* prop;
2397 tvbuff_t *next_tvb = NULL;
2399 offset=dissect_ber_identifier(actx->pinfo, tree, tvb, offset, &ber_class, &pc, &tag);
2400 offset=dissect_ber_length(actx->pinfo, tree, tvb, offset, &len, &ind);
2401 end_offset=offset+len;
2403 if( (ber_class!=BER_CLASS_UNI)
2404 ||(tag!=BER_UNI_TAG_OCTETSTRING) ){
2405 proto_tree_add_expert_format(tree, actx->pinfo, &ei_h248_octet_string_expected, tvb, offset-2, 2,
2406 "H.248 BER Error: OctetString expected but Class:%d PC:%d Tag:%d was unexpected", ber_class, pc, tag);
2407 return end_offset;
2410 next_tvb = tvb_new_subset_length(tvb,offset,len);
2412 name_minor = packageandid & 0xffff;
2414 pkg = (curr_info.pkg) ? curr_info.pkg : &no_package;
2416 if (pkg->properties) {
2417 for (prop = pkg->properties; prop && prop->hfid; prop++) {
2418 if (name_minor == prop->id) {
2419 break;
2422 } else {
2423 prop = &no_param;
2425 if (prop && prop->hfid && prop->dissector) {
2426 prop->dissector(tree, next_tvb, actx->pinfo, *(prop->hfid), &curr_info, prop->data);
2429 return end_offset;
2434 static int dissect_h248_SigParameterName(bool implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
2435 tvbuff_t *next_tvb;
2436 uint32_t param_id = 0xffffffff;
2437 const h248_pkg_param_t* sigpar;
2438 const char* strval;
2439 proto_item* pi;
2441 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &next_tvb);
2442 pi = actx->created_item;
2444 switch(tvb_reported_length(next_tvb)) {
2445 case 4: param_id = tvb_get_ntohl(next_tvb,0); break;
2446 case 3: param_id = tvb_get_ntoh24(next_tvb,0); break;
2447 case 2: param_id = tvb_get_ntohs(next_tvb,0); break;
2448 case 1: param_id = tvb_get_uint8(next_tvb,0); break;
2449 default: break;
2452 curr_info.par = &no_param;
2454 if (curr_info.sig && curr_info.sig->parameters) {
2455 for(sigpar = curr_info.sig->parameters; sigpar->hfid; sigpar++) {
2456 if (sigpar->id == param_id) {
2457 curr_info.par = sigpar;
2458 break;
2463 if (curr_info.sig && curr_info.sig->param_names && ( strval = try_val_to_str(param_id, curr_info.sig->param_names) )) {
2464 strval = wmem_strdup_printf(actx->pinfo->pool, "%s (%d)",strval,param_id);
2465 } else {
2466 strval = wmem_strdup_printf(actx->pinfo->pool, "Unknown (%d)",param_id);
2469 proto_item_set_text(pi,"Parameter: %s", strval);
2471 return offset;
2474 static int dissect_h248_SigParamValue(bool implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
2475 int end_offset;
2476 int8_t ber_class;
2477 bool pc, ind;
2478 int32_t tag;
2479 uint32_t len;
2480 tvbuff_t *next_tvb = NULL;
2482 offset=dissect_ber_identifier(actx->pinfo, tree, tvb, offset, &ber_class, &pc, &tag);
2483 offset=dissect_ber_length(actx->pinfo, tree, tvb, offset, &len, &ind);
2484 end_offset=offset+len;
2486 if( (ber_class!=BER_CLASS_UNI)
2487 ||(tag!=BER_UNI_TAG_OCTETSTRING) ){
2488 proto_tree_add_expert_format(tree, actx->pinfo, &ei_h248_octet_string_expected, tvb, offset-2, 2,
2489 "H.248 BER Error: OctetString expected but Class:%d PC:%d Tag:%d was unexpected", ber_class, pc, tag);
2490 return end_offset;
2493 next_tvb = tvb_new_subset_length(tvb,offset,len);
2495 if ( curr_info.par && curr_info.par->dissector) {
2496 curr_info.par->dissector(tree, next_tvb, actx->pinfo, *(curr_info.par->hfid), &curr_info, curr_info.par->data);
2499 return end_offset;
2502 static int dissect_h248_SigParamValueV1(bool implicit_tag _U_, tvbuff_t *tvb, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
2503 return dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
2507 static int dissect_h248_EventParameterName(bool implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
2508 tvbuff_t *next_tvb;
2509 uint32_t param_id = 0xffffffff;
2510 const h248_pkg_param_t* evtpar;
2511 const char* strval;
2512 proto_item* pi;
2514 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &next_tvb);
2515 pi = actx->created_item;
2517 if (next_tvb) {
2518 switch(tvb_reported_length(next_tvb)) {
2519 case 4: param_id = tvb_get_ntohl(next_tvb,0); break;
2520 case 3: param_id = tvb_get_ntoh24(next_tvb,0); break;
2521 case 2: param_id = tvb_get_ntohs(next_tvb,0); break;
2522 case 1: param_id = tvb_get_uint8(next_tvb,0); break;
2523 default: break;
2528 curr_info.par = &no_param;
2530 if (curr_info.evt && curr_info.evt->parameters) {
2531 for(evtpar = curr_info.evt->parameters; evtpar->hfid; evtpar++) {
2532 if (evtpar->id == param_id) {
2533 curr_info.par = evtpar;
2534 break;
2537 } else {
2538 curr_info.par = &no_param;
2541 if (curr_info.evt && curr_info.evt->param_names && ( strval = try_val_to_str(param_id, curr_info.evt->param_names) )) {
2542 strval = wmem_strdup_printf(actx->pinfo->pool, "%s (%d)",strval,param_id);
2543 } else {
2544 strval = wmem_strdup_printf(actx->pinfo->pool, "Unknown (%d)",param_id);
2547 proto_item_set_text(pi,"Parameter: %s", strval);
2550 return offset;
2553 static int dissect_h248_EventParamValue(bool implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
2554 tvbuff_t *next_tvb;
2555 int end_offset;
2556 int8_t ber_class;
2557 bool pc, ind;
2558 int32_t tag;
2559 uint32_t len;
2561 offset=dissect_ber_identifier(actx->pinfo, tree, tvb, offset, &ber_class, &pc, &tag);
2562 offset=dissect_ber_length(actx->pinfo, tree, tvb, offset, &len, &ind);
2563 end_offset=offset+len;
2565 if( (ber_class!=BER_CLASS_UNI)
2566 ||(tag!=BER_UNI_TAG_OCTETSTRING) ){
2567 proto_tree_add_expert_format(tree, actx->pinfo, &ei_h248_octet_string_expected, tvb, offset-2, 2,
2568 "H.248 BER Error: OctetString expected but Class:%d PC:%d Tag:%d was unexpected", ber_class, pc, tag);
2569 return end_offset;
2572 next_tvb = tvb_new_subset_length(tvb,offset,len);
2574 if ( curr_info.par && curr_info.par->dissector) {
2575 curr_info.par->dissector(tree, next_tvb, actx->pinfo, *(curr_info.par->hfid), &curr_info, curr_info.par->data);
2578 return end_offset;
2581 static int dissect_h248_EventParamValueV1(bool implicit_tag _U_, tvbuff_t *tvb, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_) {
2582 return dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &tvb);
2586 static int dissect_h248_MtpAddress(bool implicit_tag, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index) {
2587 tvbuff_t *new_tvb;
2588 proto_tree *mtp_tree=NULL;
2589 uint32_t val;
2590 int i, len, old_offset;
2592 old_offset=offset;
2593 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
2595 if (new_tvb) {
2596 /* this field is either 2 or 4 bytes so just read it into an integer */
2597 val=0;
2598 len=tvb_reported_length(new_tvb);
2599 for(i=0;i<len;i++){
2600 val= (val<<8)|tvb_get_uint8(new_tvb, i);
2603 /* do the prettification */
2604 proto_item_append_text(actx->created_item, " NI = %d, PC = %d ( %d-%d )", val&0x03,val>>2,val&0x03,val>>2);
2605 if(tree){
2606 mtp_tree = proto_item_add_subtree(actx->created_item, ett_mtpaddress);
2608 proto_tree_add_uint(mtp_tree, hf_h248_mtpaddress_ni, tvb, old_offset, offset-old_offset, val&0x03);
2609 proto_tree_add_uint(mtp_tree, hf_h248_mtpaddress_pc, tvb, old_offset, offset-old_offset, val>>2);
2612 return offset;
2615 #define H248_TAP() do { if (keep_persistent_data && curr_info.cmd) tap_queue_packet(h248_tap, actx->pinfo, curr_info.cmd); } while(0)
2617 /*--- Cyclic dependencies ---*/
2619 /* SecondEventsDescriptor -> SecondEventsDescriptor/eventList -> SecondRequestedEvent -> SecondRequestedActions -> NotifyBehaviour -> RegulatedEmbeddedDescriptor -> SecondEventsDescriptor */
2620 static int dissect_h248_SecondEventsDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
2625 static int
2626 dissect_h248_SecurityParmIndex(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2627 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
2628 NULL);
2630 return offset;
2635 static int
2636 dissect_h248_SequenceNum(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2637 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
2638 NULL);
2640 return offset;
2645 static int
2646 dissect_h248_AuthData(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2647 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
2648 NULL);
2650 return offset;
2654 static const ber_sequence_t AuthenticationHeader_sequence[] = {
2655 { &hf_h248_secParmIndex , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_SecurityParmIndex },
2656 { &hf_h248_seqNum , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SequenceNum },
2657 { &hf_h248_ad , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_AuthData },
2658 { NULL, 0, 0, 0, NULL }
2661 static int
2662 dissect_h248_AuthenticationHeader(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2663 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
2664 AuthenticationHeader_sequence, hf_index, ett_h248_AuthenticationHeader);
2666 return offset;
2671 static int
2672 dissect_h248_T_version(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2673 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
2674 &h248_version);
2677 return offset;
2682 static int
2683 dissect_h248_OCTET_STRING_SIZE_4(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2684 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
2685 NULL);
2687 return offset;
2692 static int
2693 dissect_h248_INTEGER_0_65535(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2694 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
2695 NULL);
2697 return offset;
2701 static const ber_sequence_t IP4Address_sequence[] = {
2702 { &hf_h248_iP4Address , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_OCTET_STRING_SIZE_4 },
2703 { &hf_h248_portNumber , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
2704 { NULL, 0, 0, 0, NULL }
2707 static int
2708 dissect_h248_IP4Address(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2709 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
2710 IP4Address_sequence, hf_index, ett_h248_IP4Address);
2712 return offset;
2717 static int
2718 dissect_h248_OCTET_STRING_SIZE_16(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2719 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
2720 NULL);
2722 return offset;
2726 static const ber_sequence_t IP6Address_sequence[] = {
2727 { &hf_h248_iP6Address , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_OCTET_STRING_SIZE_16 },
2728 { &hf_h248_portNumber , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
2729 { NULL, 0, 0, 0, NULL }
2732 static int
2733 dissect_h248_IP6Address(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2734 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
2735 IP6Address_sequence, hf_index, ett_h248_IP6Address);
2737 return offset;
2742 static int
2743 dissect_h248_IA5String(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2744 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_IA5String,
2745 actx, tree, tvb, offset, hf_index,
2746 NULL);
2748 return offset;
2752 static const ber_sequence_t DomainName_sequence[] = {
2753 { &hf_h248_domName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_IA5String },
2754 { &hf_h248_portNumber , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
2755 { NULL, 0, 0, 0, NULL }
2758 static int
2759 dissect_h248_DomainName(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2760 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
2761 DomainName_sequence, hf_index, ett_h248_DomainName);
2763 return offset;
2768 static int
2769 dissect_h248_PathName(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2770 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_IA5String,
2771 actx, tree, tvb, offset, hf_index,
2772 NULL);
2774 return offset;
2779 static const value_string h248_MId_vals[] = {
2780 { 0, "ip4Address" },
2781 { 1, "ip6Address" },
2782 { 2, "domainName" },
2783 { 3, "deviceName" },
2784 { 4, "mtpAddress" },
2785 { 0, NULL }
2788 static const ber_choice_t MId_choice[] = {
2789 { 0, &hf_h248_ip4Address , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_IP4Address },
2790 { 1, &hf_h248_ip6Address , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_IP6Address },
2791 { 2, &hf_h248_domainName , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_DomainName },
2792 { 3, &hf_h248_deviceName , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_PathName },
2793 { 4, &hf_h248_mtpAddress , BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_h248_MtpAddress },
2794 { 0, NULL, 0, 0, 0, NULL }
2797 static int
2798 dissect_h248_MId(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2799 offset = dissect_ber_choice(actx, tree, tvb, offset,
2800 MId_choice, hf_index, ett_h248_MId,
2801 NULL);
2803 return offset;
2809 static int
2810 dissect_h248_T_errorCode(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2811 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index, &error_code);
2812 expert_add_info(actx->pinfo, actx->created_item, &ei_h248_errored_command);
2814 if (curr_info.cmd) {
2815 gcp_cmd_set_error(curr_info.cmd,error_code);
2816 } else if (curr_info.trx) {
2817 gcp_trx_set_error(curr_info.trx,error_code);
2820 return offset;
2825 static int
2826 dissect_h248_ErrorText(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2827 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_IA5String,
2828 actx, tree, tvb, offset, hf_index,
2829 NULL);
2831 return offset;
2835 static const ber_sequence_t ErrorDescriptor_sequence[] = {
2836 { &hf_h248_errorCode , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_T_errorCode },
2837 { &hf_h248_errorText , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ErrorText },
2838 { NULL, 0, 0, 0, NULL }
2841 static int
2842 dissect_h248_ErrorDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2843 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
2844 ErrorDescriptor_sequence, hf_index, ett_h248_ErrorDescriptor);
2846 return offset;
2851 static int
2852 dissect_h248_TransactionId(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2853 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
2854 NULL);
2856 return offset;
2861 static int
2862 dissect_h248_T_transactionId(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2863 uint32_t trx_id = 0;
2864 offset = dissect_h248_trx_id(implicit_tag, actx->pinfo, tree, tvb, offset, &trx_id);
2865 curr_info.trx = gcp_trx(curr_info.msg, trx_id, GCP_TRX_REQUEST, actx->pinfo, keep_persistent_data);
2866 error_code = 0;
2868 return offset;
2874 static int
2875 dissect_h248_ContextId(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2876 uint32_t ctx_id = 0;
2877 offset = dissect_h248_ctx_id(implicit_tag, actx->pinfo, tree, tvb, offset, &ctx_id);
2878 curr_info.ctx = gcp_ctx(curr_info.msg,curr_info.trx,ctx_id,actx->pinfo,keep_persistent_data);
2879 curr_info.cmd = NULL;
2880 curr_info.term = NULL;
2882 return offset;
2887 static int
2888 dissect_h248_INTEGER_0_15(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2889 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
2890 NULL);
2892 return offset;
2897 static int
2898 dissect_h248_BOOLEAN(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2899 offset = dissect_ber_boolean(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
2901 return offset;
2906 static int
2907 dissect_h248_WildcardField(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2908 tvbuff_t* new_tvb;
2909 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
2910 tree = proto_item_add_subtree(actx->created_item,ett_wildcard);
2911 proto_tree_add_item(tree,hf_h248_term_wild_type,new_tvb,0,1,ENC_BIG_ENDIAN);
2912 proto_tree_add_item(tree,hf_h248_term_wild_level,new_tvb,0,1,ENC_BIG_ENDIAN);
2913 proto_tree_add_item(tree,hf_h248_term_wild_position,new_tvb,0,1,ENC_BIG_ENDIAN);
2915 wild_term = tvb_get_uint8(new_tvb,0) & 0x80 ? GCP_WILDCARD_CHOOSE : GCP_WILDCARD_ALL;
2916 /* limitation: assume only one wildcard is used */
2917 wild_card = tvb_get_uint8(new_tvb,0);
2920 return offset;
2924 static const ber_sequence_t SEQUENCE_OF_WildcardField_sequence_of[1] = {
2925 { &hf_h248_wildcard_item , BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_h248_WildcardField },
2928 static int
2929 dissect_h248_SEQUENCE_OF_WildcardField(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2930 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
2931 SEQUENCE_OF_WildcardField_sequence_of, hf_index, ett_h248_SEQUENCE_OF_WildcardField);
2933 return offset;
2938 static int
2939 dissect_h248_T_terminationId(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2940 tvbuff_t* new_tvb;
2941 h248_term_info_t term_info;
2943 term_info.wild_card = wild_card;
2944 term_info.str = NULL;
2946 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &new_tvb);
2948 if (new_tvb) {
2949 curr_info.term->len = tvb_reported_length(new_tvb);
2950 curr_info.term->type = 0; /* unknown */
2952 if (h248_term_handle) {
2953 call_dissector_with_data(h248_term_handle, new_tvb, actx->pinfo, tree, &term_info);
2954 wild_card = 0xFF;
2957 if (curr_info.term->len) {
2958 curr_info.term->buffer = (uint8_t *)tvb_memdup(actx->pinfo->pool,new_tvb,0,curr_info.term->len);
2959 if(term_info.str){
2960 curr_info.term->str = wmem_strdup_printf(actx->pinfo->pool, "%s %s",
2961 bytes_to_str_punct(actx->pinfo->pool,curr_info.term->buffer,curr_info.term->len, 0),
2962 term_info.str);
2963 }else{
2964 curr_info.term->str = bytes_to_str_punct(actx->pinfo->pool,curr_info.term->buffer,curr_info.term->len, 0);
2969 curr_info.term = gcp_cmd_add_term(curr_info.msg, curr_info.trx, curr_info.cmd, curr_info.term, wild_term, actx->pinfo, keep_persistent_data);
2971 } else {
2972 curr_info.term->len = 0;
2973 curr_info.term->buffer = (uint8_t*)wmem_strdup(actx->pinfo->pool, "");
2974 curr_info.term->str = wmem_strdup(actx->pinfo->pool, "?");
2977 return offset;
2981 static const ber_sequence_t TerminationID_sequence[] = {
2982 { &hf_h248_wildcard , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_WildcardField },
2983 { &hf_h248_terminationId , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_T_terminationId },
2984 { NULL, 0, 0, 0, NULL }
2987 static int
2988 dissect_h248_TerminationID(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
2989 curr_info.term = wmem_new0(actx->pinfo->pool, gcp_term_t);
2990 wild_term = GCP_WILDCARD_NONE;
2991 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
2992 TerminationID_sequence, hf_index, ett_h248_TerminationID);
2994 return offset;
2998 static const value_string h248_T_topologyDirection_vals[] = {
2999 { 0, "bothway" },
3000 { 1, "isolate" },
3001 { 2, "oneway" },
3002 { 0, NULL }
3006 static int
3007 dissect_h248_T_topologyDirection(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3008 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3009 NULL);
3011 return offset;
3016 static int
3017 dissect_h248_StreamID(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3018 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3019 NULL);
3021 return offset;
3025 static const value_string h248_T_topologyDirectionExtension_vals[] = {
3026 { 0, "onewayexternal" },
3027 { 1, "onewayboth" },
3028 { 0, NULL }
3032 static int
3033 dissect_h248_T_topologyDirectionExtension(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3034 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3035 NULL);
3037 return offset;
3041 static const ber_sequence_t TopologyRequest_sequence[] = {
3042 { &hf_h248_terminationFrom, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationID },
3043 { &hf_h248_terminationTo , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_TerminationID },
3044 { &hf_h248_topologyDirection, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_T_topologyDirection },
3045 { &hf_h248_streamID , BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
3046 { &hf_h248_topologyDirectionExtension, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_T_topologyDirectionExtension },
3047 { NULL, 0, 0, 0, NULL }
3050 static int
3051 dissect_h248_TopologyRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3052 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3053 TopologyRequest_sequence, hf_index, ett_h248_TopologyRequest);
3055 return offset;
3059 static const ber_sequence_t T_topologyReq_sequence_of[1] = {
3060 { &hf_h248_topologyReq_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_TopologyRequest },
3063 static int
3064 dissect_h248_T_topologyReq(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3065 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_TOPOLOGY_REQ,offset,actx->pinfo,keep_persistent_data);
3066 H248_TAP();
3067 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3068 T_topologyReq_sequence_of, hf_index, ett_h248_T_topologyReq);
3070 curr_info.cmd = NULL;
3071 return offset;
3076 static int
3077 dissect_h248_Iepscallind_BOOL(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3078 offset = dissect_ber_boolean(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
3080 return offset;
3086 static int
3087 dissect_h248_PropertyName(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3088 offset = dissect_h248_PkgdName(implicit_tag, tvb, offset, actx, tree, hf_index);
3090 return offset;
3095 static const ber_sequence_t SEQUENCE_OF_PropertyID_sequence_of[1] = {
3096 { &hf_h248_propertyParamValue_item, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_h248_PropertyID },
3099 static int
3100 dissect_h248_SEQUENCE_OF_PropertyID(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3101 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3102 SEQUENCE_OF_PropertyID_sequence_of, hf_index, ett_h248_SEQUENCE_OF_PropertyID);
3104 return offset;
3108 static const value_string h248_Relation_vals[] = {
3109 { 0, "greaterThan" },
3110 { 1, "smallerThan" },
3111 { 2, "unequalTo" },
3112 { 0, NULL }
3116 static int
3117 dissect_h248_Relation(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3118 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3119 NULL);
3121 return offset;
3125 static const value_string h248_PropParm_extraInfo_vals[] = {
3126 { 0, "relation" },
3127 { 1, "range" },
3128 { 2, "sublist" },
3129 { 0, NULL }
3132 static const ber_choice_t PropParm_extraInfo_choice[] = {
3133 { 0, &hf_h248_relation , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_Relation },
3134 { 1, &hf_h248_range , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
3135 { 2, &hf_h248_sublist , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
3136 { 0, NULL, 0, 0, 0, NULL }
3139 static int
3140 dissect_h248_PropParm_extraInfo(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3141 offset = dissect_ber_choice(actx, tree, tvb, offset,
3142 PropParm_extraInfo_choice, hf_index, ett_h248_PropParm_extraInfo,
3143 NULL);
3145 return offset;
3149 static const ber_sequence_t PropertyParm_sequence[] = {
3150 { &hf_h248_propertyName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_PropertyName },
3151 { &hf_h248_propertyParamValue, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_PropertyID },
3152 { &hf_h248_propParm_extraInfo, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_PropParm_extraInfo },
3153 { NULL, 0, 0, 0, NULL }
3156 static int
3157 dissect_h248_PropertyParm(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3158 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3159 PropertyParm_sequence, hf_index, ett_h248_PropertyParm);
3161 return offset;
3165 static const ber_sequence_t SEQUENCE_OF_PropertyParm_sequence_of[1] = {
3166 { &hf_h248_contextProp_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_PropertyParm },
3169 static int
3170 dissect_h248_SEQUENCE_OF_PropertyParm(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3171 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3172 SEQUENCE_OF_PropertyParm_sequence_of, hf_index, ett_h248_SEQUENCE_OF_PropertyParm);
3174 return offset;
3179 static int
3180 dissect_h248_ContextIDinList(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3181 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3182 NULL);
3184 return offset;
3188 static const ber_sequence_t SEQUENCE_OF_ContextIDinList_sequence_of[1] = {
3189 { &hf_h248_contextList_item, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_h248_ContextIDinList },
3192 static int
3193 dissect_h248_SEQUENCE_OF_ContextIDinList(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3194 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3195 SEQUENCE_OF_ContextIDinList_sequence_of, hf_index, ett_h248_SEQUENCE_OF_ContextIDinList);
3197 return offset;
3201 static const ber_sequence_t ContextRequest_sequence[] = {
3202 { &hf_h248_priority , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_15 },
3203 { &hf_h248_emergency , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
3204 { &hf_h248_topologyReq , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_T_topologyReq },
3205 { &hf_h248_iepscallind_BOOL, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_Iepscallind_BOOL },
3206 { &hf_h248_contextProp , BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_PropertyParm },
3207 { &hf_h248_contextList , BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_ContextIDinList },
3208 { NULL, 0, 0, 0, NULL }
3211 static int
3212 dissect_h248_ContextRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3213 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3214 ContextRequest_sequence, hf_index, ett_h248_ContextRequest);
3216 return offset;
3221 static int
3222 dissect_h248_NULL(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3223 offset = dissect_ber_null(implicit_tag, actx, tree, tvb, offset, hf_index);
3225 return offset;
3229 static const ber_sequence_t IndAudPropertyParm_sequence[] = {
3230 { &hf_h248_name , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_PkgdName },
3231 { &hf_h248_propertyParms , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_PropertyParm },
3232 { NULL, 0, 0, 0, NULL }
3235 static int
3236 dissect_h248_IndAudPropertyParm(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3237 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3238 IndAudPropertyParm_sequence, hf_index, ett_h248_IndAudPropertyParm);
3240 return offset;
3244 static const ber_sequence_t SEQUENCE_OF_IndAudPropertyParm_sequence_of[1] = {
3245 { &hf_h248_contextPropAud_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_IndAudPropertyParm },
3248 static int
3249 dissect_h248_SEQUENCE_OF_IndAudPropertyParm(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3250 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3251 SEQUENCE_OF_IndAudPropertyParm_sequence_of, hf_index, ett_h248_SEQUENCE_OF_IndAudPropertyParm);
3253 return offset;
3257 static const value_string h248_SelectLogic_vals[] = {
3258 { 0, "andAUDITSelect" },
3259 { 1, "orAUDITSelect" },
3260 { 0, NULL }
3263 static const ber_choice_t SelectLogic_choice[] = {
3264 { 0, &hf_h248_andAUDITSelect , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_NULL },
3265 { 1, &hf_h248_orAUDITSelect , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_NULL },
3266 { 0, NULL, 0, 0, 0, NULL }
3269 static int
3270 dissect_h248_SelectLogic(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3271 offset = dissect_ber_choice(actx, tree, tvb, offset,
3272 SelectLogic_choice, hf_index, ett_h248_SelectLogic,
3273 NULL);
3275 return offset;
3279 static const ber_sequence_t ContextAttrAuditRequest_sequence[] = {
3280 { &hf_h248_topology , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
3281 { &hf_h248_cAAREmergency , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
3282 { &hf_h248_cAARPriority , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
3283 { &hf_h248_iepscallind , BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
3284 { &hf_h248_contextPropAud , BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_IndAudPropertyParm },
3285 { &hf_h248_selectpriority , BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_15 },
3286 { &hf_h248_selectemergency, BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
3287 { &hf_h248_selectiepscallind, BER_CLASS_CON, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
3288 { &hf_h248_selectLogic , BER_CLASS_CON, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_SelectLogic },
3289 { NULL, 0, 0, 0, NULL }
3292 static int
3293 dissect_h248_ContextAttrAuditRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3294 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3295 ContextAttrAuditRequest_sequence, hf_index, ett_h248_ContextAttrAuditRequest);
3297 return offset;
3302 static int
3303 dissect_h248_T_contextAttrAuditReq(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3304 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_CTX_ATTR_AUDIT_REQ,offset,actx->pinfo,keep_persistent_data);
3305 H248_TAP();
3306 offset = dissect_h248_ContextAttrAuditRequest(implicit_tag, tvb, offset, actx, tree, hf_index);
3308 curr_info.cmd = NULL;
3309 return offset;
3313 static const ber_sequence_t TerminationIDList_sequence_of[1] = {
3314 { &hf_h248_TerminationIDList_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_TerminationID },
3317 static int
3318 dissect_h248_TerminationIDList(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3319 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3320 TerminationIDList_sequence_of, hf_index, ett_h248_TerminationIDList);
3322 return offset;
3326 static const value_string h248_EventBufferControl_vals[] = {
3327 { 0, "off" },
3328 { 1, "lockStep" },
3329 { 0, NULL }
3333 static int
3334 dissect_h248_EventBufferControl(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3335 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3336 NULL);
3338 return offset;
3342 static const value_string h248_ServiceState_vals[] = {
3343 { 0, "test" },
3344 { 1, "outOfSvc" },
3345 { 2, "inSvc" },
3346 { 0, NULL }
3350 static int
3351 dissect_h248_ServiceState(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3352 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3353 NULL);
3355 return offset;
3359 static const ber_sequence_t TerminationStateDescriptor_sequence[] = {
3360 { &hf_h248_tSDpropertyParms, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_PropertyParm },
3361 { &hf_h248_tSEventBufferControl, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_EventBufferControl },
3362 { &hf_h248_serviceState , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ServiceState },
3363 { NULL, 0, 0, 0, NULL }
3366 static int
3367 dissect_h248_TerminationStateDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3368 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3369 TerminationStateDescriptor_sequence, hf_index, ett_h248_TerminationStateDescriptor);
3371 return offset;
3375 static const value_string h248_StreamMode_vals[] = {
3376 { 0, "sendOnly" },
3377 { 1, "recvOnly" },
3378 { 2, "sendRecv" },
3379 { 3, "inactive" },
3380 { 4, "loopBack" },
3381 { 0, NULL }
3385 static int
3386 dissect_h248_StreamMode(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3387 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3388 NULL);
3390 return offset;
3394 static const ber_sequence_t LocalControlDescriptor_sequence[] = {
3395 { &hf_h248_streamMode , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamMode },
3396 { &hf_h248_reserveValue , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
3397 { &hf_h248_reserveGroup , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
3398 { &hf_h248_lCDpropertyParms, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_PropertyParm },
3399 { NULL, 0, 0, 0, NULL }
3402 static int
3403 dissect_h248_LocalControlDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3404 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3405 LocalControlDescriptor_sequence, hf_index, ett_h248_LocalControlDescriptor);
3407 return offset;
3411 static const ber_sequence_t PropertyGroup_sequence_of[1] = {
3412 { &hf_h248_PropertyGroup_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_PropertyParm },
3415 static int
3416 dissect_h248_PropertyGroup(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3417 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3418 PropertyGroup_sequence_of, hf_index, ett_h248_PropertyGroup);
3420 return offset;
3424 static const ber_sequence_t SEQUENCE_OF_PropertyGroup_sequence_of[1] = {
3425 { &hf_h248_propGrps_item , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_PropertyGroup },
3428 static int
3429 dissect_h248_SEQUENCE_OF_PropertyGroup(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3430 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3431 SEQUENCE_OF_PropertyGroup_sequence_of, hf_index, ett_h248_SEQUENCE_OF_PropertyGroup);
3433 return offset;
3437 static const ber_sequence_t LocalRemoteDescriptor_sequence[] = {
3438 { &hf_h248_propGrps , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_PropertyGroup },
3439 { NULL, 0, 0, 0, NULL }
3442 static int
3443 dissect_h248_LocalRemoteDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3444 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3445 LocalRemoteDescriptor_sequence, hf_index, ett_h248_LocalRemoteDescriptor);
3447 return offset;
3452 static int
3453 dissect_h248_StatName(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3454 offset = dissect_h248_PkgdName(implicit_tag, tvb, offset, actx, tree, hf_index);
3456 return offset;
3461 static int
3462 dissect_h248_OCTET_STRING(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3463 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
3464 NULL);
3466 return offset;
3470 static const ber_sequence_t Value_sequence_of[1] = {
3471 { &hf_h248_Value_item , BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_h248_OCTET_STRING },
3474 static int
3475 dissect_h248_Value(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3476 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3477 Value_sequence_of, hf_index, ett_h248_Value);
3479 return offset;
3484 static int
3485 dissect_h248_StatValue(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3486 offset = dissect_h248_Value(implicit_tag, tvb, offset, actx, tree, hf_index);
3488 return offset;
3492 static const ber_sequence_t StatisticsParameter_sequence[] = {
3493 { &hf_h248_statName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_StatName },
3494 { &hf_h248_statValue , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StatValue },
3495 { NULL, 0, 0, 0, NULL }
3498 static int
3499 dissect_h248_StatisticsParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3500 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3501 StatisticsParameter_sequence, hf_index, ett_h248_StatisticsParameter);
3503 return offset;
3507 static const ber_sequence_t StatisticsDescriptor_sequence_of[1] = {
3508 { &hf_h248_StatisticsDescriptor_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_StatisticsParameter },
3511 static int
3512 dissect_h248_StatisticsDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3513 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3514 StatisticsDescriptor_sequence_of, hf_index, ett_h248_StatisticsDescriptor);
3516 return offset;
3520 static const ber_sequence_t StreamParms_sequence[] = {
3521 { &hf_h248_localControlDescriptor, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_LocalControlDescriptor },
3522 { &hf_h248_localDescriptor, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_LocalRemoteDescriptor },
3523 { &hf_h248_remoteDescriptor, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_LocalRemoteDescriptor },
3524 { &hf_h248_sPstatisticsDescriptor, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StatisticsDescriptor },
3525 { NULL, 0, 0, 0, NULL }
3528 static int
3529 dissect_h248_StreamParms(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3530 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3531 StreamParms_sequence, hf_index, ett_h248_StreamParms);
3533 return offset;
3537 static const ber_sequence_t StreamDescriptor_sequence[] = {
3538 { &hf_h248_streamID , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
3539 { &hf_h248_streamParms , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_StreamParms },
3540 { NULL, 0, 0, 0, NULL }
3543 static int
3544 dissect_h248_StreamDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3545 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3546 StreamDescriptor_sequence, hf_index, ett_h248_StreamDescriptor);
3548 return offset;
3552 static const ber_sequence_t SEQUENCE_OF_StreamDescriptor_sequence_of[1] = {
3553 { &hf_h248_mediaDescriptorMultiStream_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_StreamDescriptor },
3556 static int
3557 dissect_h248_SEQUENCE_OF_StreamDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3558 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3559 SEQUENCE_OF_StreamDescriptor_sequence_of, hf_index, ett_h248_SEQUENCE_OF_StreamDescriptor);
3561 return offset;
3565 static const value_string h248_T_streams_vals[] = {
3566 { 0, "oneStream" },
3567 { 1, "multiStream" },
3568 { 0, NULL }
3571 static const ber_choice_t T_streams_choice[] = {
3572 { 0, &hf_h248_mediaDescriptorOneStream, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_StreamParms },
3573 { 1, &hf_h248_mediaDescriptorMultiStream, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_StreamDescriptor },
3574 { 0, NULL, 0, 0, 0, NULL }
3577 static int
3578 dissect_h248_T_streams(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3579 offset = dissect_ber_choice(actx, tree, tvb, offset,
3580 T_streams_choice, hf_index, ett_h248_T_streams,
3581 NULL);
3583 return offset;
3587 static const ber_sequence_t MediaDescriptor_sequence[] = {
3588 { &hf_h248_termStateDescr , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_TerminationStateDescriptor },
3589 { &hf_h248_streams , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_T_streams },
3590 { NULL, 0, 0, 0, NULL }
3593 static int
3594 dissect_h248_MediaDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3595 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3596 MediaDescriptor_sequence, hf_index, ett_h248_MediaDescriptor);
3598 return offset;
3602 static const value_string h248_ModemType_vals[] = {
3603 { 0, "v18" },
3604 { 1, "v22" },
3605 { 2, "v22bis" },
3606 { 3, "v32" },
3607 { 4, "v32bis" },
3608 { 5, "v34" },
3609 { 6, "v90" },
3610 { 7, "v91" },
3611 { 8, "synchISDN" },
3612 { 0, NULL }
3616 static int
3617 dissect_h248_ModemType(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3618 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3619 NULL);
3621 return offset;
3625 static const ber_sequence_t SEQUENCE_OF_ModemType_sequence_of[1] = {
3626 { &hf_h248_mtl_item , BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_NOOWNTAG, dissect_h248_ModemType },
3629 static int
3630 dissect_h248_SEQUENCE_OF_ModemType(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3631 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3632 SEQUENCE_OF_ModemType_sequence_of, hf_index, ett_h248_SEQUENCE_OF_ModemType);
3634 return offset;
3639 static int
3640 dissect_h248_OBJECT_IDENTIFIER(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3641 offset = dissect_ber_object_identifier(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
3643 return offset;
3648 static int
3649 dissect_h248_INTEGER_0_255(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3650 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3651 NULL);
3653 return offset;
3657 static const ber_sequence_t H221NonStandard_sequence[] = {
3658 { &hf_h248_t35CountryCode1, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_255 },
3659 { &hf_h248_t35CountryCode2, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_255 },
3660 { &hf_h248_t35Extension , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_255 },
3661 { &hf_h248_manufacturerCode, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
3662 { NULL, 0, 0, 0, NULL }
3665 static int
3666 dissect_h248_H221NonStandard(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3667 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3668 H221NonStandard_sequence, hf_index, ett_h248_H221NonStandard);
3670 return offset;
3675 static int
3676 dissect_h248_IA5String_SIZE_8(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3677 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_IA5String,
3678 actx, tree, tvb, offset, hf_index,
3679 NULL);
3681 return offset;
3685 static const value_string h248_NonStandardIdentifier_vals[] = {
3686 { 0, "object" },
3687 { 1, "h221NonStandard" },
3688 { 2, "experimental" },
3689 { 0, NULL }
3692 static const ber_choice_t NonStandardIdentifier_choice[] = {
3693 { 0, &hf_h248_object , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_OBJECT_IDENTIFIER },
3694 { 1, &hf_h248_h221NonStandard, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_H221NonStandard },
3695 { 2, &hf_h248_experimental , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_IA5String_SIZE_8 },
3696 { 0, NULL, 0, 0, 0, NULL }
3699 static int
3700 dissect_h248_NonStandardIdentifier(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3701 offset = dissect_ber_choice(actx, tree, tvb, offset,
3702 NonStandardIdentifier_choice, hf_index, ett_h248_NonStandardIdentifier,
3703 NULL);
3705 return offset;
3709 static const ber_sequence_t NonStandardData_sequence[] = {
3710 { &hf_h248_nonStandardIdentifier, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_NonStandardIdentifier },
3711 { &hf_h248_data , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_OCTET_STRING },
3712 { NULL, 0, 0, 0, NULL }
3715 static int
3716 dissect_h248_NonStandardData(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3717 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3718 NonStandardData_sequence, hf_index, ett_h248_NonStandardData);
3720 return offset;
3724 static const ber_sequence_t ModemDescriptor_sequence[] = {
3725 { &hf_h248_mtl , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_ModemType },
3726 { &hf_h248_mpl , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_PropertyParm },
3727 { &hf_h248_nonStandardData, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NonStandardData },
3728 { NULL, 0, 0, 0, NULL }
3731 static int
3732 dissect_h248_ModemDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3733 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3734 ModemDescriptor_sequence, hf_index, ett_h248_ModemDescriptor);
3736 return offset;
3740 static const value_string h248_MuxType_vals[] = {
3741 { 0, "h221" },
3742 { 1, "h223" },
3743 { 2, "h226" },
3744 { 3, "v76" },
3745 { 4, "nx64k" },
3746 { 0, NULL }
3750 static int
3751 dissect_h248_MuxType(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3752 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3753 NULL);
3755 return offset;
3759 static const ber_sequence_t SEQUENCE_OF_TerminationID_sequence_of[1] = {
3760 { &hf_h248_termList_item , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_TerminationID },
3763 static int
3764 dissect_h248_SEQUENCE_OF_TerminationID(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3765 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3766 SEQUENCE_OF_TerminationID_sequence_of, hf_index, ett_h248_SEQUENCE_OF_TerminationID);
3768 return offset;
3772 static const ber_sequence_t MuxDescriptor_sequence[] = {
3773 { &hf_h248_muxType , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_MuxType },
3774 { &hf_h248_termList , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_TerminationID },
3775 { &hf_h248_nonStandardData, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NonStandardData },
3776 { NULL, 0, 0, 0, NULL }
3779 static int
3780 dissect_h248_MuxDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3781 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3782 MuxDescriptor_sequence, hf_index, ett_h248_MuxDescriptor);
3784 return offset;
3789 static int
3790 dissect_h248_RequestID(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3791 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3792 NULL);
3794 return offset;
3800 static int
3801 dissect_h248_Name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3802 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
3803 NULL);
3805 return offset;
3810 static int
3811 dissect_h248_DigitMapName(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3812 offset = dissect_h248_Name(implicit_tag, tvb, offset, actx, tree, hf_index);
3814 return offset;
3819 static int
3820 dissect_h248_INTEGER_0_99(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3821 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3822 NULL);
3824 return offset;
3828 static const ber_sequence_t DigitMapValue_sequence[] = {
3829 { &hf_h248_startTimer , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_99 },
3830 { &hf_h248_shortTimer , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_99 },
3831 { &hf_h248_longTimer , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_99 },
3832 { &hf_h248_digitMapBody , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_IA5String },
3833 { &hf_h248_durationTimer , BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_99 },
3834 { NULL, 0, 0, 0, NULL }
3837 static int
3838 dissect_h248_DigitMapValue(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3839 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3840 DigitMapValue_sequence, hf_index, ett_h248_DigitMapValue);
3842 return offset;
3846 static const value_string h248_EventDM_vals[] = {
3847 { 0, "digitMapName" },
3848 { 1, "digitMapValue" },
3849 { 0, NULL }
3852 static const ber_choice_t EventDM_choice[] = {
3853 { 0, &hf_h248_digitMapName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_DigitMapName },
3854 { 1, &hf_h248_digitMapValue , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_DigitMapValue },
3855 { 0, NULL, 0, 0, 0, NULL }
3858 static int
3859 dissect_h248_EventDM(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3860 offset = dissect_ber_choice(actx, tree, tvb, offset,
3861 EventDM_choice, hf_index, ett_h248_EventDM,
3862 NULL);
3864 return offset;
3869 static const value_string h248_SignalType_vals[] = {
3870 { 0, "brief" },
3871 { 1, "onOff" },
3872 { 2, "timeOut" },
3873 { 0, NULL }
3877 static int
3878 dissect_h248_SignalType(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3879 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3880 NULL);
3882 return offset;
3886 static int * const NotifyCompletion_bits[] = {
3887 &hf_h248_NotifyCompletion_onTimeOut,
3888 &hf_h248_NotifyCompletion_onInterruptByEvent,
3889 &hf_h248_NotifyCompletion_onInterruptByNewSignalDescr,
3890 &hf_h248_NotifyCompletion_otherReason,
3891 &hf_h248_NotifyCompletion_onIteration,
3892 NULL
3895 static int
3896 dissect_h248_NotifyCompletion(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3897 offset = dissect_ber_bitstring(implicit_tag, actx, tree, tvb, offset,
3898 NotifyCompletion_bits, 5, hf_index, ett_h248_NotifyCompletion,
3899 NULL);
3901 return offset;
3907 static const ber_sequence_t SigParamValues_sequence_of[1] = {
3908 { &hf_h248_SigParamValues_item, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_h248_SigParamValue },
3911 static int
3912 dissect_h248_SigParamValues(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3913 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3914 SigParamValues_sequence_of, hf_index, ett_h248_SigParamValues);
3916 return offset;
3920 static const value_string h248_T_extraInfo_vals[] = {
3921 { 0, "relation" },
3922 { 1, "range" },
3923 { 2, "sublist" },
3924 { 0, NULL }
3927 static const ber_choice_t T_extraInfo_choice[] = {
3928 { 0, &hf_h248_relation , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_Relation },
3929 { 1, &hf_h248_range , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
3930 { 2, &hf_h248_sublist , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
3931 { 0, NULL, 0, 0, 0, NULL }
3934 static int
3935 dissect_h248_T_extraInfo(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3936 offset = dissect_ber_choice(actx, tree, tvb, offset,
3937 T_extraInfo_choice, hf_index, ett_h248_T_extraInfo,
3938 NULL);
3940 return offset;
3944 static const ber_sequence_t SigParameter_sequence[] = {
3945 { &hf_h248_sigParameterName, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_SigParameterName },
3946 { &hf_h248_value , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SigParamValues },
3947 { &hf_h248_extraInfo , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_T_extraInfo },
3948 { NULL, 0, 0, 0, NULL }
3951 static int
3952 dissect_h248_SigParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3953 /* H248 v1 support */
3954 if (h248_version > 1) {
3955 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
3956 SigParameter_sequence, hf_index, ett_h248_SigParameter);
3958 } else {
3959 offset = dissect_h248_SigParameterV1( implicit_tag, tvb, offset, actx, tree, hf_index);
3962 return offset;
3966 static const ber_sequence_t SEQUENCE_OF_SigParameter_sequence_of[1] = {
3967 { &hf_h248_sigParList_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_SigParameter },
3970 static int
3971 dissect_h248_SEQUENCE_OF_SigParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3972 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
3973 SEQUENCE_OF_SigParameter_sequence_of, hf_index, ett_h248_SEQUENCE_OF_SigParameter);
3975 return offset;
3979 static const value_string h248_SignalDirection_vals[] = {
3980 { 0, "internal" },
3981 { 1, "external" },
3982 { 2, "both" },
3983 { 0, NULL }
3987 static int
3988 dissect_h248_SignalDirection(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
3989 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
3990 NULL);
3992 return offset;
3996 static const ber_sequence_t Signal_sequence[] = {
3997 { &hf_h248_signalName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_SignalName },
3998 { &hf_h248_streamID , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
3999 { &hf_h248_sigType , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SignalType },
4000 { &hf_h248_duration , BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
4001 { &hf_h248_notifyCompletion, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NotifyCompletion },
4002 { &hf_h248_keepActive , BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
4003 { &hf_h248_sigParList , BER_CLASS_CON, 6, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_SigParameter },
4004 { &hf_h248_direction , BER_CLASS_CON, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SignalDirection },
4005 { &hf_h248_requestID , BER_CLASS_CON, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_RequestID },
4006 { &hf_h248_intersigDelay , BER_CLASS_CON, 9, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
4007 { NULL, 0, 0, 0, NULL }
4010 static int
4011 dissect_h248_Signal(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4012 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4013 Signal_sequence, hf_index, ett_h248_Signal);
4015 return offset;
4019 static const ber_sequence_t SEQUENCE_OF_Signal_sequence_of[1] = {
4020 { &hf_h248_signalList_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_Signal },
4023 static int
4024 dissect_h248_SEQUENCE_OF_Signal(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4025 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4026 SEQUENCE_OF_Signal_sequence_of, hf_index, ett_h248_SEQUENCE_OF_Signal);
4028 return offset;
4032 static const ber_sequence_t SeqSigList_sequence[] = {
4033 { &hf_h248_id , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
4034 { &hf_h248_signalList , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_Signal },
4035 { NULL, 0, 0, 0, NULL }
4038 static int
4039 dissect_h248_SeqSigList(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4040 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4041 SeqSigList_sequence, hf_index, ett_h248_SeqSigList);
4043 return offset;
4047 static const value_string h248_SignalRequest_vals[] = {
4048 { 0, "signal" },
4049 { 1, "seqSigList" },
4050 { 0, NULL }
4053 static const ber_choice_t SignalRequest_choice[] = {
4054 { 0, &hf_h248_signal , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_Signal },
4055 { 1, &hf_h248_seqSigList , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SeqSigList },
4056 { 0, NULL, 0, 0, 0, NULL }
4059 static int
4060 dissect_h248_SignalRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4061 offset = dissect_ber_choice(actx, tree, tvb, offset,
4062 SignalRequest_choice, hf_index, ett_h248_SignalRequest,
4063 NULL);
4065 return offset;
4069 static const ber_sequence_t SignalsDescriptor_sequence_of[1] = {
4070 { &hf_h248_SignalsDescriptor_item, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_SignalRequest },
4073 static int
4074 dissect_h248_SignalsDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4075 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4076 SignalsDescriptor_sequence_of, hf_index, ett_h248_SignalsDescriptor);
4078 return offset;
4082 static const ber_sequence_t RegulatedEmbeddedDescriptor_sequence[] = {
4083 { &hf_h248_secondEvent , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SecondEventsDescriptor },
4084 { &hf_h248_signalsDescriptor, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SignalsDescriptor },
4085 { NULL, 0, 0, 0, NULL }
4088 static int
4089 dissect_h248_RegulatedEmbeddedDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4090 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4091 RegulatedEmbeddedDescriptor_sequence, hf_index, ett_h248_RegulatedEmbeddedDescriptor);
4093 return offset;
4097 static const value_string h248_NotifyBehaviour_vals[] = {
4098 { 0, "notifyImmediate" },
4099 { 1, "notifyRegulated" },
4100 { 2, "neverNotify" },
4101 { 0, NULL }
4104 static const ber_choice_t NotifyBehaviour_choice[] = {
4105 { 0, &hf_h248_notifyImmediate, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_NULL },
4106 { 1, &hf_h248_notifyRegulated, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_RegulatedEmbeddedDescriptor },
4107 { 2, &hf_h248_neverNotify , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_NULL },
4108 { 0, NULL, 0, 0, 0, NULL }
4111 static int
4112 dissect_h248_NotifyBehaviour(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4113 offset = dissect_ber_choice(actx, tree, tvb, offset,
4114 NotifyBehaviour_choice, hf_index, ett_h248_NotifyBehaviour,
4115 NULL);
4117 return offset;
4121 static const ber_sequence_t SecondRequestedActions_sequence[] = {
4122 { &hf_h248_keepActive , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
4123 { &hf_h248_eventDM , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_EventDM },
4124 { &hf_h248_signalsDescriptor, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SignalsDescriptor },
4125 { &hf_h248_notifyBehaviour, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_NotifyBehaviour },
4126 { &hf_h248_resetEventsDescriptor, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
4127 { NULL, 0, 0, 0, NULL }
4130 static int
4131 dissect_h248_SecondRequestedActions(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4132 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4133 SecondRequestedActions_sequence, hf_index, ett_h248_SecondRequestedActions);
4135 return offset;
4141 static const ber_sequence_t EventParamValues_sequence_of[1] = {
4142 { &hf_h248_EventParamValues_item, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_h248_EventParamValue },
4145 static int
4146 dissect_h248_EventParamValues(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4147 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4148 EventParamValues_sequence_of, hf_index, ett_h248_EventParamValues);
4150 return offset;
4154 static const value_string h248_EventPar_extraInfo_vals[] = {
4155 { 0, "relation" },
4156 { 1, "range" },
4157 { 2, "sublist" },
4158 { 0, NULL }
4161 static const ber_choice_t EventPar_extraInfo_choice[] = {
4162 { 0, &hf_h248_relation , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_Relation },
4163 { 1, &hf_h248_range , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
4164 { 2, &hf_h248_sublist , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
4165 { 0, NULL, 0, 0, 0, NULL }
4168 static int
4169 dissect_h248_EventPar_extraInfo(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4170 offset = dissect_ber_choice(actx, tree, tvb, offset,
4171 EventPar_extraInfo_choice, hf_index, ett_h248_EventPar_extraInfo,
4172 NULL);
4174 return offset;
4178 static const ber_sequence_t EventParameter_sequence[] = {
4179 { &hf_h248_eventParameterName, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_EventParameterName },
4180 { &hf_h248_eventParamValue, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_EventParamValues },
4181 { &hf_h248_eventPar_extraInfo, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_EventPar_extraInfo },
4182 { NULL, 0, 0, 0, NULL }
4185 static int
4186 dissect_h248_EventParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4187 /* H248 v1 support */
4188 if (h248_version > 1) {
4189 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4190 EventParameter_sequence, hf_index, ett_h248_EventParameter);
4192 } else {
4193 offset = dissect_h248_EventParameterV1( implicit_tag, tvb, offset, actx, tree, hf_index);
4196 return offset;
4200 static const ber_sequence_t SEQUENCE_OF_EventParameter_sequence_of[1] = {
4201 { &hf_h248_eventParList_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_EventParameter },
4204 static int
4205 dissect_h248_SEQUENCE_OF_EventParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4206 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4207 SEQUENCE_OF_EventParameter_sequence_of, hf_index, ett_h248_SEQUENCE_OF_EventParameter);
4209 return offset;
4213 static const ber_sequence_t SecondRequestedEvent_sequence[] = {
4214 { &hf_h248_pkgdName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_PkgdName },
4215 { &hf_h248_streamID , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
4216 { &hf_h248_secondaryEventAction, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SecondRequestedActions },
4217 { &hf_h248_evParList , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_EventParameter },
4218 { NULL, 0, 0, 0, NULL }
4221 static int
4222 dissect_h248_SecondRequestedEvent(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4223 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4224 SecondRequestedEvent_sequence, hf_index, ett_h248_SecondRequestedEvent);
4226 return offset;
4230 static const ber_sequence_t SEQUENCE_OF_SecondRequestedEvent_sequence_of[1] = {
4231 { &hf_h248_secondaryEventList_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_SecondRequestedEvent },
4234 static int
4235 dissect_h248_SEQUENCE_OF_SecondRequestedEvent(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4236 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4237 SEQUENCE_OF_SecondRequestedEvent_sequence_of, hf_index, ett_h248_SEQUENCE_OF_SecondRequestedEvent);
4239 return offset;
4243 static const ber_sequence_t SecondEventsDescriptor_sequence[] = {
4244 { &hf_h248_requestID , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_RequestID },
4245 { &hf_h248_secondaryEventList, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_SecondRequestedEvent },
4246 { NULL, 0, 0, 0, NULL }
4249 static int
4250 dissect_h248_SecondEventsDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4251 // SecondEventsDescriptor -> SecondEventsDescriptor/eventList -> SecondRequestedEvent -> SecondRequestedActions -> NotifyBehaviour -> RegulatedEmbeddedDescriptor -> SecondEventsDescriptor
4252 actx->pinfo->dissection_depth += 6;
4253 increment_dissection_depth(actx->pinfo);
4254 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4255 SecondEventsDescriptor_sequence, hf_index, ett_h248_SecondEventsDescriptor);
4257 actx->pinfo->dissection_depth -= 6;
4258 decrement_dissection_depth(actx->pinfo);
4259 return offset;
4263 static const ber_sequence_t RequestedActions_sequence[] = {
4264 { &hf_h248_keepActive , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_BOOLEAN },
4265 { &hf_h248_eventDM , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_EventDM },
4266 { &hf_h248_secondEvent , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SecondEventsDescriptor },
4267 { &hf_h248_signalsDescriptor, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SignalsDescriptor },
4268 { &hf_h248_notifyBehaviour, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_NotifyBehaviour },
4269 { &hf_h248_resetEventsDescriptor, BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
4270 { NULL, 0, 0, 0, NULL }
4273 static int
4274 dissect_h248_RequestedActions(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4275 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4276 RequestedActions_sequence, hf_index, ett_h248_RequestedActions);
4278 return offset;
4282 static const ber_sequence_t RequestedEvent_sequence[] = {
4283 { &hf_h248_eventName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_EventName },
4284 { &hf_h248_streamID , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
4285 { &hf_h248_eventAction , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_RequestedActions },
4286 { &hf_h248_evParList , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_EventParameter },
4287 { NULL, 0, 0, 0, NULL }
4290 static int
4291 dissect_h248_RequestedEvent(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4292 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4293 RequestedEvent_sequence, hf_index, ett_h248_RequestedEvent);
4295 return offset;
4299 static const ber_sequence_t SEQUENCE_OF_RequestedEvent_sequence_of[1] = {
4300 { &hf_h248_eventList_item , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_RequestedEvent },
4303 static int
4304 dissect_h248_SEQUENCE_OF_RequestedEvent(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4305 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4306 SEQUENCE_OF_RequestedEvent_sequence_of, hf_index, ett_h248_SEQUENCE_OF_RequestedEvent);
4308 return offset;
4312 static const ber_sequence_t EventsDescriptor_sequence[] = {
4313 { &hf_h248_requestID , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_RequestID },
4314 { &hf_h248_eventList , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_RequestedEvent },
4315 { NULL, 0, 0, 0, NULL }
4318 static int
4319 dissect_h248_EventsDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4320 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4321 EventsDescriptor_sequence, hf_index, ett_h248_EventsDescriptor);
4323 return offset;
4327 static const ber_sequence_t EventSpec_sequence[] = {
4328 { &hf_h248_eventName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_EventName },
4329 { &hf_h248_streamID , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
4330 { &hf_h248_eventParList , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_EventParameter },
4331 { NULL, 0, 0, 0, NULL }
4334 static int
4335 dissect_h248_EventSpec(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4336 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4337 EventSpec_sequence, hf_index, ett_h248_EventSpec);
4339 return offset;
4343 static const ber_sequence_t EventBufferDescriptor_sequence_of[1] = {
4344 { &hf_h248_EventBufferDescriptor_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_EventSpec },
4347 static int
4348 dissect_h248_EventBufferDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4349 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4350 EventBufferDescriptor_sequence_of, hf_index, ett_h248_EventBufferDescriptor);
4352 return offset;
4356 static const ber_sequence_t DigitMapDescriptor_sequence[] = {
4357 { &hf_h248_digitMapName , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_DigitMapName },
4358 { &hf_h248_digitMapValue , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_DigitMapValue },
4359 { NULL, 0, 0, 0, NULL }
4362 static int
4363 dissect_h248_DigitMapDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4364 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4365 DigitMapDescriptor_sequence, hf_index, ett_h248_DigitMapDescriptor);
4367 return offset;
4371 static int * const T_auditToken_bits[] = {
4372 &hf_h248_T_auditToken_muxToken,
4373 &hf_h248_T_auditToken_modemToken,
4374 &hf_h248_T_auditToken_mediaToken,
4375 &hf_h248_T_auditToken_eventsToken,
4376 &hf_h248_T_auditToken_signalsToken,
4377 &hf_h248_T_auditToken_digitMapToken,
4378 &hf_h248_T_auditToken_statsToken,
4379 &hf_h248_T_auditToken_observedEventsToken,
4380 &hf_h248_T_auditToken_packagesToken,
4381 &hf_h248_T_auditToken_eventBufferToken,
4382 NULL
4385 static int
4386 dissect_h248_T_auditToken(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4387 offset = dissect_ber_bitstring(implicit_tag, actx, tree, tvb, offset,
4388 T_auditToken_bits, 10, hf_index, ett_h248_T_auditToken,
4389 NULL);
4391 return offset;
4395 static const ber_sequence_t IndAudTerminationStateDescriptor_sequence[] = {
4396 { &hf_h248_indAudPropertyParms, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_IndAudPropertyParm },
4397 { &hf_h248_eventBufferControl, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
4398 { &hf_h248_iATSDServiceState, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
4399 { &hf_h248_serviceStateSel, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ServiceState },
4400 { NULL, 0, 0, 0, NULL }
4403 static int
4404 dissect_h248_IndAudTerminationStateDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4405 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4406 IndAudTerminationStateDescriptor_sequence, hf_index, ett_h248_IndAudTerminationStateDescriptor);
4408 return offset;
4412 static const ber_sequence_t IndAudLocalControlDescriptor_sequence[] = {
4413 { &hf_h248_iALCDStreamMode, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
4414 { &hf_h248_iALCDReserveValue, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
4415 { &hf_h248_iALCDReserveGroup, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
4416 { &hf_h248_indAudPropertyParms, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_IndAudPropertyParm },
4417 { &hf_h248_streamModeSel , BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamMode },
4418 { NULL, 0, 0, 0, NULL }
4421 static int
4422 dissect_h248_IndAudLocalControlDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4423 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4424 IndAudLocalControlDescriptor_sequence, hf_index, ett_h248_IndAudLocalControlDescriptor);
4426 return offset;
4430 static const ber_sequence_t IndAudPropertyGroup_sequence_of[1] = {
4431 { &hf_h248_IndAudPropertyGroup_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_IndAudPropertyParm },
4434 static int
4435 dissect_h248_IndAudPropertyGroup(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4436 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4437 IndAudPropertyGroup_sequence_of, hf_index, ett_h248_IndAudPropertyGroup);
4439 return offset;
4443 static const ber_sequence_t IndAudLocalRemoteDescriptor_sequence[] = {
4444 { &hf_h248_propGroupID , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
4445 { &hf_h248_iAPropertyGroup, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_IndAudPropertyGroup },
4446 { NULL, 0, 0, 0, NULL }
4449 static int
4450 dissect_h248_IndAudLocalRemoteDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4451 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4452 IndAudLocalRemoteDescriptor_sequence, hf_index, ett_h248_IndAudLocalRemoteDescriptor);
4454 return offset;
4458 static const ber_sequence_t IndAudStatisticsDescriptor_sequence[] = {
4459 { &hf_h248_iAStatName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_PkgdName },
4460 { NULL, 0, 0, 0, NULL }
4463 static int
4464 dissect_h248_IndAudStatisticsDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4465 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4466 IndAudStatisticsDescriptor_sequence, hf_index, ett_h248_IndAudStatisticsDescriptor);
4468 return offset;
4472 static const ber_sequence_t IndAudStreamParms_sequence[] = {
4473 { &hf_h248_iASPLocalControlDescriptor, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_IndAudLocalControlDescriptor },
4474 { &hf_h248_iASPLocalDescriptor, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_IndAudLocalRemoteDescriptor },
4475 { &hf_h248_iASPRemoteDescriptor, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_IndAudLocalRemoteDescriptor },
4476 { &hf_h248_statisticsDescriptor, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_IndAudStatisticsDescriptor },
4477 { NULL, 0, 0, 0, NULL }
4480 static int
4481 dissect_h248_IndAudStreamParms(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4482 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4483 IndAudStreamParms_sequence, hf_index, ett_h248_IndAudStreamParms);
4485 return offset;
4489 static const ber_sequence_t IndAudStreamDescriptor_sequence[] = {
4490 { &hf_h248_streamID , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
4491 { &hf_h248_indAudStreamParms, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_IndAudStreamParms },
4492 { NULL, 0, 0, 0, NULL }
4495 static int
4496 dissect_h248_IndAudStreamDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4497 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4498 IndAudStreamDescriptor_sequence, hf_index, ett_h248_IndAudStreamDescriptor);
4500 return offset;
4504 static const ber_sequence_t SEQUENCE_OF_IndAudStreamDescriptor_sequence_of[1] = {
4505 { &hf_h248_multiStream_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_IndAudStreamDescriptor },
4508 static int
4509 dissect_h248_SEQUENCE_OF_IndAudStreamDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4510 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4511 SEQUENCE_OF_IndAudStreamDescriptor_sequence_of, hf_index, ett_h248_SEQUENCE_OF_IndAudStreamDescriptor);
4513 return offset;
4517 static const value_string h248_IndAudMediaDescriptorStreams_vals[] = {
4518 { 0, "oneStream" },
4519 { 1, "multiStream" },
4520 { 0, NULL }
4523 static const ber_choice_t IndAudMediaDescriptorStreams_choice[] = {
4524 { 0, &hf_h248_oneStream , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_IndAudStreamParms },
4525 { 1, &hf_h248_multiStream , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_IndAudStreamDescriptor },
4526 { 0, NULL, 0, 0, 0, NULL }
4529 static int
4530 dissect_h248_IndAudMediaDescriptorStreams(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4531 offset = dissect_ber_choice(actx, tree, tvb, offset,
4532 IndAudMediaDescriptorStreams_choice, hf_index, ett_h248_IndAudMediaDescriptorStreams,
4533 NULL);
4535 return offset;
4539 static const ber_sequence_t IndAudMediaDescriptor_sequence[] = {
4540 { &hf_h248_indAudTerminationStateDescriptor, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_IndAudTerminationStateDescriptor },
4541 { &hf_h248_indAudMediaDescriptorStreams, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_IndAudMediaDescriptorStreams },
4542 { NULL, 0, 0, 0, NULL }
4545 static int
4546 dissect_h248_IndAudMediaDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4547 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4548 IndAudMediaDescriptor_sequence, hf_index, ett_h248_IndAudMediaDescriptor);
4550 return offset;
4554 static const ber_sequence_t IndAudEventsDescriptor_sequence[] = {
4555 { &hf_h248_requestID , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_RequestID },
4556 { &hf_h248_iAEDPkgdName , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_PkgdName },
4557 { &hf_h248_streamID , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
4558 { NULL, 0, 0, 0, NULL }
4561 static int
4562 dissect_h248_IndAudEventsDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4563 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4564 IndAudEventsDescriptor_sequence, hf_index, ett_h248_IndAudEventsDescriptor);
4566 return offset;
4570 static const ber_sequence_t IndAudEventBufferDescriptor_sequence[] = {
4571 { &hf_h248_iAEBDEventName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_PkgdName },
4572 { &hf_h248_streamID , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
4573 { NULL, 0, 0, 0, NULL }
4576 static int
4577 dissect_h248_IndAudEventBufferDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4578 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4579 IndAudEventBufferDescriptor_sequence, hf_index, ett_h248_IndAudEventBufferDescriptor);
4581 return offset;
4585 static const ber_sequence_t IndAudSignal_sequence[] = {
4586 { &hf_h248_iASignalName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_PkgdName },
4587 { &hf_h248_streamID , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
4588 { &hf_h248_signalRequestID, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_RequestID },
4589 { NULL, 0, 0, 0, NULL }
4592 static int
4593 dissect_h248_IndAudSignal(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4594 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4595 IndAudSignal_sequence, hf_index, ett_h248_IndAudSignal);
4597 return offset;
4601 static const ber_sequence_t IndAudSeqSigList_sequence[] = {
4602 { &hf_h248_id , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
4603 { &hf_h248_iASignalList , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_IndAudSignal },
4604 { NULL, 0, 0, 0, NULL }
4607 static int
4608 dissect_h248_IndAudSeqSigList(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4609 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4610 IndAudSeqSigList_sequence, hf_index, ett_h248_IndAudSeqSigList);
4612 return offset;
4616 static const value_string h248_IndAudSignalsDescriptor_vals[] = {
4617 { 0, "signal" },
4618 { 1, "seqSigList" },
4619 { 0, NULL }
4622 static const ber_choice_t IndAudSignalsDescriptor_choice[] = {
4623 { 0, &hf_h248_indAudSignal , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_IndAudSignal },
4624 { 1, &hf_h248_indAudSeqSigList, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_IndAudSeqSigList },
4625 { 0, NULL, 0, 0, 0, NULL }
4628 static int
4629 dissect_h248_IndAudSignalsDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4630 offset = dissect_ber_choice(actx, tree, tvb, offset,
4631 IndAudSignalsDescriptor_choice, hf_index, ett_h248_IndAudSignalsDescriptor,
4632 NULL);
4634 return offset;
4638 static const ber_sequence_t IndAudDigitMapDescriptor_sequence[] = {
4639 { &hf_h248_digitMapName , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_DigitMapName },
4640 { NULL, 0, 0, 0, NULL }
4643 static int
4644 dissect_h248_IndAudDigitMapDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4645 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4646 IndAudDigitMapDescriptor_sequence, hf_index, ett_h248_IndAudDigitMapDescriptor);
4648 return offset;
4652 static const ber_sequence_t IndAudPackagesDescriptor_sequence[] = {
4653 { &hf_h248_packageName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_Name },
4654 { &hf_h248_packageVersion , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_99 },
4655 { NULL, 0, 0, 0, NULL }
4658 static int
4659 dissect_h248_IndAudPackagesDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4660 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4661 IndAudPackagesDescriptor_sequence, hf_index, ett_h248_IndAudPackagesDescriptor);
4663 return offset;
4667 static const value_string h248_IndAuditParameter_vals[] = {
4668 { 0, "indaudmediaDescriptor" },
4669 { 1, "indaudeventsDescriptor" },
4670 { 2, "indaudeventBufferDescriptor" },
4671 { 3, "indaudsignalsDescriptor" },
4672 { 4, "indauddigitMapDescriptor" },
4673 { 5, "indaudstatisticsDescriptor" },
4674 { 6, "indaudpackagesDescriptor" },
4675 { 0, NULL }
4678 static const ber_choice_t IndAuditParameter_choice[] = {
4679 { 0, &hf_h248_indaudmediaDescriptor, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_IndAudMediaDescriptor },
4680 { 1, &hf_h248_indaudeventsDescriptor, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_IndAudEventsDescriptor },
4681 { 2, &hf_h248_indaudeventBufferDescriptor, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_IndAudEventBufferDescriptor },
4682 { 3, &hf_h248_indaudsignalsDescriptor, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_IndAudSignalsDescriptor },
4683 { 4, &hf_h248_indauddigitMapDescriptor, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_h248_IndAudDigitMapDescriptor },
4684 { 5, &hf_h248_indaudstatisticsDescriptor, BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_h248_IndAudStatisticsDescriptor },
4685 { 6, &hf_h248_indaudpackagesDescriptor, BER_CLASS_CON, 6, BER_FLAGS_IMPLTAG, dissect_h248_IndAudPackagesDescriptor },
4686 { 0, NULL, 0, 0, 0, NULL }
4689 static int
4690 dissect_h248_IndAuditParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4691 offset = dissect_ber_choice(actx, tree, tvb, offset,
4692 IndAuditParameter_choice, hf_index, ett_h248_IndAuditParameter,
4693 NULL);
4695 return offset;
4699 static const ber_sequence_t SEQUENCE_OF_IndAuditParameter_sequence_of[1] = {
4700 { &hf_h248_auditPropertyToken_item, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_IndAuditParameter },
4703 static int
4704 dissect_h248_SEQUENCE_OF_IndAuditParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4705 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4706 SEQUENCE_OF_IndAuditParameter_sequence_of, hf_index, ett_h248_SEQUENCE_OF_IndAuditParameter);
4708 return offset;
4712 static const ber_sequence_t AuditDescriptor_sequence[] = {
4713 { &hf_h248_auditToken , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_T_auditToken },
4714 { &hf_h248_auditPropertyToken, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_IndAuditParameter },
4715 { NULL, 0, 0, 0, NULL }
4718 static int
4719 dissect_h248_AuditDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4720 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4721 AuditDescriptor_sequence, hf_index, ett_h248_AuditDescriptor);
4723 return offset;
4727 static const value_string h248_AmmDescriptor_vals[] = {
4728 { 0, "mediaDescriptor" },
4729 { 1, "modemDescriptor" },
4730 { 2, "muxDescriptor" },
4731 { 3, "eventsDescriptor" },
4732 { 4, "eventBufferDescriptor" },
4733 { 5, "signalsDescriptor" },
4734 { 6, "digitMapDescriptor" },
4735 { 7, "auditDescriptor" },
4736 { 8, "statisticsDescriptor" },
4737 { 0, NULL }
4740 static const ber_choice_t AmmDescriptor_choice[] = {
4741 { 0, &hf_h248_mediaDescriptor, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_MediaDescriptor },
4742 { 1, &hf_h248_modemDescriptor, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_ModemDescriptor },
4743 { 2, &hf_h248_muxDescriptor , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_MuxDescriptor },
4744 { 3, &hf_h248_eventsDescriptor, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_EventsDescriptor },
4745 { 4, &hf_h248_eventBufferDescriptor, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_h248_EventBufferDescriptor },
4746 { 5, &hf_h248_signalsDescriptor, BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_h248_SignalsDescriptor },
4747 { 6, &hf_h248_digitMapDescriptor, BER_CLASS_CON, 6, BER_FLAGS_IMPLTAG, dissect_h248_DigitMapDescriptor },
4748 { 7, &hf_h248_auditDescriptor, BER_CLASS_CON, 7, BER_FLAGS_IMPLTAG, dissect_h248_AuditDescriptor },
4749 { 8, &hf_h248_aDstatisticsDescriptor, BER_CLASS_CON, 8, BER_FLAGS_IMPLTAG, dissect_h248_StatisticsDescriptor },
4750 { 0, NULL, 0, 0, 0, NULL }
4753 static int
4754 dissect_h248_AmmDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4755 offset = dissect_ber_choice(actx, tree, tvb, offset,
4756 AmmDescriptor_choice, hf_index, ett_h248_AmmDescriptor,
4757 NULL);
4759 return offset;
4763 static const ber_sequence_t SEQUENCE_OF_AmmDescriptor_sequence_of[1] = {
4764 { &hf_h248_descriptors_item, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_AmmDescriptor },
4767 static int
4768 dissect_h248_SEQUENCE_OF_AmmDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4769 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4770 SEQUENCE_OF_AmmDescriptor_sequence_of, hf_index, ett_h248_SEQUENCE_OF_AmmDescriptor);
4772 return offset;
4776 static const ber_sequence_t AmmRequest_sequence[] = {
4777 { &hf_h248_terminationIDList, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
4778 { &hf_h248_descriptors , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_AmmDescriptor },
4779 { NULL, 0, 0, 0, NULL }
4782 static int
4783 dissect_h248_AmmRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4784 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4785 AmmRequest_sequence, hf_index, ett_h248_AmmRequest);
4787 return offset;
4792 static int
4793 dissect_h248_T_addReq(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4794 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_ADD_REQ,offset,actx->pinfo,keep_persistent_data);
4795 H248_TAP();
4796 offset = dissect_h248_AmmRequest(implicit_tag, tvb, offset, actx, tree, hf_index);
4798 curr_info.cmd = NULL;
4799 return offset;
4804 static int
4805 dissect_h248_T_moveReq(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4806 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_MOVE_REQ,offset,actx->pinfo,keep_persistent_data);
4807 H248_TAP();
4809 offset = dissect_h248_AmmRequest(implicit_tag, tvb, offset, actx, tree, hf_index);
4811 curr_info.cmd = NULL;
4812 return offset;
4817 static int
4818 dissect_h248_T_modReq(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4819 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_MOD_REQ,offset,actx->pinfo,keep_persistent_data);
4820 H248_TAP();
4821 offset = dissect_h248_AmmRequest(implicit_tag, tvb, offset, actx, tree, hf_index);
4823 curr_info.cmd = NULL;
4824 return offset;
4828 static const ber_sequence_t SubtractRequest_sequence[] = {
4829 { &hf_h248_terminationIDList, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
4830 { &hf_h248_auditDescriptor, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_AuditDescriptor },
4831 { NULL, 0, 0, 0, NULL }
4834 static int
4835 dissect_h248_SubtractRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4836 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4837 SubtractRequest_sequence, hf_index, ett_h248_SubtractRequest);
4839 return offset;
4844 static int
4845 dissect_h248_T_subtractReq(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4846 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_SUB_REQ,offset,actx->pinfo,keep_persistent_data);
4847 H248_TAP();
4848 offset = dissect_h248_SubtractRequest(implicit_tag, tvb, offset, actx, tree, hf_index);
4850 curr_info.cmd = NULL;
4851 return offset;
4855 static const ber_sequence_t AuditRequest_sequence[] = {
4856 { &hf_h248_terminationID , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationID },
4857 { &hf_h248_auditDescriptor, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_AuditDescriptor },
4858 { &hf_h248_terminationIDList, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
4859 { NULL, 0, 0, 0, NULL }
4862 static int
4863 dissect_h248_AuditRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4864 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4865 AuditRequest_sequence, hf_index, ett_h248_AuditRequest);
4867 return offset;
4872 static int
4873 dissect_h248_T_auditCapRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4874 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_AUDITCAP_REQ,offset,actx->pinfo,keep_persistent_data);
4875 H248_TAP();
4876 offset = dissect_h248_AuditRequest(implicit_tag, tvb, offset, actx, tree, hf_index);
4878 curr_info.cmd = NULL;
4879 return offset;
4884 static int
4885 dissect_h248_T_auditValueRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4886 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_AUDITVAL_REQ,offset,actx->pinfo,keep_persistent_data);
4887 H248_TAP();
4888 offset = dissect_h248_AuditRequest(implicit_tag, tvb, offset, actx, tree, hf_index);
4890 curr_info.cmd = NULL;
4891 return offset;
4895 static const ber_sequence_t TimeNotation_sequence[] = {
4896 { &hf_h248_date , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_IA5String_SIZE_8 },
4897 { &hf_h248_time , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_IA5String_SIZE_8 },
4898 { NULL, 0, 0, 0, NULL }
4901 static int
4902 dissect_h248_TimeNotation(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4903 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4904 TimeNotation_sequence, hf_index, ett_h248_TimeNotation);
4906 return offset;
4910 static const ber_sequence_t ObservedEvent_sequence[] = {
4911 { &hf_h248_eventName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_EventName },
4912 { &hf_h248_streamID , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_StreamID },
4913 { &hf_h248_eventParList , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_EventParameter },
4914 { &hf_h248_timeNotation , BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_TimeNotation },
4915 { NULL, 0, 0, 0, NULL }
4918 static int
4919 dissect_h248_ObservedEvent(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4920 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4921 ObservedEvent_sequence, hf_index, ett_h248_ObservedEvent);
4923 return offset;
4927 static const ber_sequence_t SEQUENCE_OF_ObservedEvent_sequence_of[1] = {
4928 { &hf_h248_observedEventLst_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_ObservedEvent },
4931 static int
4932 dissect_h248_SEQUENCE_OF_ObservedEvent(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4933 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
4934 SEQUENCE_OF_ObservedEvent_sequence_of, hf_index, ett_h248_SEQUENCE_OF_ObservedEvent);
4936 return offset;
4940 static const ber_sequence_t ObservedEventsDescriptor_sequence[] = {
4941 { &hf_h248_requestId , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_RequestID },
4942 { &hf_h248_observedEventLst, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_ObservedEvent },
4943 { NULL, 0, 0, 0, NULL }
4946 static int
4947 dissect_h248_ObservedEventsDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4948 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4949 ObservedEventsDescriptor_sequence, hf_index, ett_h248_ObservedEventsDescriptor);
4951 return offset;
4955 static const ber_sequence_t NotifyRequest_sequence[] = {
4956 { &hf_h248_terminationIDList, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
4957 { &hf_h248_observedEventsDescriptor, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_ObservedEventsDescriptor },
4958 { &hf_h248_errorDescriptor, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ErrorDescriptor },
4959 { NULL, 0, 0, 0, NULL }
4962 static int
4963 dissect_h248_NotifyRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4964 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
4965 NotifyRequest_sequence, hf_index, ett_h248_NotifyRequest);
4967 return offset;
4972 static int
4973 dissect_h248_T_notifyReq(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4974 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_NOTIFY_REQ,offset,actx->pinfo,keep_persistent_data);
4975 H248_TAP();
4976 offset = dissect_h248_NotifyRequest(implicit_tag, tvb, offset, actx, tree, hf_index);
4978 curr_info.cmd = NULL;
4979 return offset;
4983 static const value_string h248_ServiceChangeMethod_vals[] = {
4984 { 0, "failover" },
4985 { 1, "forced" },
4986 { 2, "graceful" },
4987 { 3, "restart" },
4988 { 4, "disconnected" },
4989 { 5, "handOff" },
4990 { 0, NULL }
4994 static int
4995 dissect_h248_ServiceChangeMethod(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
4996 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
4997 NULL);
4999 return offset;
5003 static const value_string h248_ServiceChangeAddress_vals[] = {
5004 { 0, "portNumber" },
5005 { 1, "ip4Address" },
5006 { 2, "ip6Address" },
5007 { 3, "domainName" },
5008 { 4, "deviceName" },
5009 { 5, "mtpAddress" },
5010 { 0, NULL }
5013 static const ber_choice_t ServiceChangeAddress_choice[] = {
5014 { 0, &hf_h248_portNumber , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_65535 },
5015 { 1, &hf_h248_ip4Address , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_IP4Address },
5016 { 2, &hf_h248_ip6Address , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_IP6Address },
5017 { 3, &hf_h248_domainName , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_DomainName },
5018 { 4, &hf_h248_deviceName , BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_h248_PathName },
5019 { 5, &hf_h248_mtpAddress , BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_h248_MtpAddress },
5020 { 0, NULL, 0, 0, 0, NULL }
5023 static int
5024 dissect_h248_ServiceChangeAddress(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5025 offset = dissect_ber_choice(actx, tree, tvb, offset,
5026 ServiceChangeAddress_choice, hf_index, ett_h248_ServiceChangeAddress,
5027 NULL);
5029 return offset;
5034 static int
5035 dissect_h248_IA5String_SIZE_1_67(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5036 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_IA5String,
5037 actx, tree, tvb, offset, hf_index,
5038 NULL);
5040 return offset;
5044 static const ber_sequence_t ServiceChangeProfile_sequence[] = {
5045 { &hf_h248_profileName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_IA5String_SIZE_1_67 },
5046 { NULL, 0, 0, 0, NULL }
5049 static int
5050 dissect_h248_ServiceChangeProfile(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5051 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5052 ServiceChangeProfile_sequence, hf_index, ett_h248_ServiceChangeProfile);
5054 return offset;
5059 static int
5060 dissect_h248_SCreasonValueOctetStr(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5061 tvbuff_t *parameter_tvb;
5062 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
5063 &parameter_tvb);
5066 if (!parameter_tvb)
5067 return offset;
5069 dissect_h248_ServiceChangeReasonStr(false, parameter_tvb, 0, actx, tree, hf_h248_serviceChangeReasonStr);
5071 return offset;
5075 static const ber_sequence_t SCreasonValue_sequence_of[1] = {
5076 { &hf_h248_SCreasonValue_item, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_h248_SCreasonValueOctetStr },
5079 static int
5080 dissect_h248_SCreasonValue(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5081 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
5082 SCreasonValue_sequence_of, hf_index, ett_h248_SCreasonValue);
5084 return offset;
5089 static int
5090 dissect_h248_INTEGER_0_4294967295(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5091 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
5092 NULL);
5094 return offset;
5098 static const ber_sequence_t ServiceChangeParm_sequence[] = {
5099 { &hf_h248_serviceChangeMethod, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_ServiceChangeMethod },
5100 { &hf_h248_serviceChangeAddress, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_ServiceChangeAddress },
5101 { &hf_h248_serviceChangeVersion, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_99 },
5102 { &hf_h248_serviceChangeProfile, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ServiceChangeProfile },
5103 { &hf_h248_serviceChangeReason, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_h248_SCreasonValue },
5104 { &hf_h248_serviceChangeDelay, BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_4294967295 },
5105 { &hf_h248_serviceChangeMgcId, BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_MId },
5106 { &hf_h248_timeStamp , BER_CLASS_CON, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_TimeNotation },
5107 { &hf_h248_nonStandardData, BER_CLASS_CON, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NonStandardData },
5108 { &hf_h248_serviceChangeInfo, BER_CLASS_CON, 9, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_AuditDescriptor },
5109 { &hf_h248_serviceChangeIncompleteFlag, BER_CLASS_CON, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
5110 { NULL, 0, 0, 0, NULL }
5113 static int
5114 dissect_h248_ServiceChangeParm(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5115 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5116 ServiceChangeParm_sequence, hf_index, ett_h248_ServiceChangeParm);
5118 return offset;
5122 static const ber_sequence_t ServiceChangeRequest_sequence[] = {
5123 { &hf_h248_terminationIDList, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
5124 { &hf_h248_serviceChangeParms, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_ServiceChangeParm },
5125 { NULL, 0, 0, 0, NULL }
5128 static int
5129 dissect_h248_ServiceChangeRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5130 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_SVCCHG_REQ,offset,actx->pinfo,keep_persistent_data);
5131 H248_TAP();
5132 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5133 ServiceChangeRequest_sequence, hf_index, ett_h248_ServiceChangeRequest);
5135 curr_info.cmd = NULL;
5136 return offset;
5140 static const value_string h248_Command_vals[] = {
5141 { 0, "addReq" },
5142 { 1, "moveReq" },
5143 { 2, "modReq" },
5144 { 3, "subtractReq" },
5145 { 4, "auditCapRequest" },
5146 { 5, "auditValueRequest" },
5147 { 6, "notifyReq" },
5148 { 7, "serviceChangeReq" },
5149 { 0, NULL }
5152 static const ber_choice_t Command_choice[] = {
5153 { 0, &hf_h248_addReq , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_T_addReq },
5154 { 1, &hf_h248_moveReq , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_T_moveReq },
5155 { 2, &hf_h248_modReq , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_T_modReq },
5156 { 3, &hf_h248_subtractReq , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_T_subtractReq },
5157 { 4, &hf_h248_auditCapRequest, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_h248_T_auditCapRequest },
5158 { 5, &hf_h248_auditValueRequest, BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_h248_T_auditValueRequest },
5159 { 6, &hf_h248_notifyReq , BER_CLASS_CON, 6, BER_FLAGS_IMPLTAG, dissect_h248_T_notifyReq },
5160 { 7, &hf_h248_serviceChangeReq, BER_CLASS_CON, 7, BER_FLAGS_IMPLTAG, dissect_h248_ServiceChangeRequest },
5161 { 0, NULL, 0, 0, 0, NULL }
5164 static int
5165 dissect_h248_Command(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5166 offset = dissect_ber_choice(actx, tree, tvb, offset,
5167 Command_choice, hf_index, ett_h248_Command,
5168 NULL);
5170 return offset;
5174 static const ber_sequence_t CommandRequest_sequence[] = {
5175 { &hf_h248_command , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_Command },
5176 { &hf_h248_optional , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
5177 { &hf_h248_wildcardReturn , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
5178 { NULL, 0, 0, 0, NULL }
5181 static int
5182 dissect_h248_CommandRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5183 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5184 CommandRequest_sequence, hf_index, ett_h248_CommandRequest);
5186 return offset;
5190 static const ber_sequence_t SEQUENCE_OF_CommandRequest_sequence_of[1] = {
5191 { &hf_h248_commandRequests_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_CommandRequest },
5194 static int
5195 dissect_h248_SEQUENCE_OF_CommandRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5196 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
5197 SEQUENCE_OF_CommandRequest_sequence_of, hf_index, ett_h248_SEQUENCE_OF_CommandRequest);
5199 return offset;
5203 static const ber_sequence_t ActionRequest_sequence[] = {
5204 { &hf_h248_contextId , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_ContextId },
5205 { &hf_h248_contextRequest , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ContextRequest },
5206 { &hf_h248_contextAttrAuditReq, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_T_contextAttrAuditReq },
5207 { &hf_h248_commandRequests, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_CommandRequest },
5208 { NULL, 0, 0, 0, NULL }
5211 static int
5212 dissect_h248_ActionRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5213 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5214 ActionRequest_sequence, hf_index, ett_h248_ActionRequest);
5216 return offset;
5220 static const ber_sequence_t SEQUENCE_OF_ActionRequest_sequence_of[1] = {
5221 { &hf_h248_actions_item , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_ActionRequest },
5224 static int
5225 dissect_h248_SEQUENCE_OF_ActionRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5226 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
5227 SEQUENCE_OF_ActionRequest_sequence_of, hf_index, ett_h248_SEQUENCE_OF_ActionRequest);
5229 return offset;
5233 static const ber_sequence_t TransactionRequest_sequence[] = {
5234 { &hf_h248_transactionId , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_T_transactionId },
5235 { &hf_h248_actions , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_ActionRequest },
5236 { NULL, 0, 0, 0, NULL }
5239 static int
5240 dissect_h248_TransactionRequest(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5241 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5242 TransactionRequest_sequence, hf_index, ett_h248_TransactionRequest);
5244 return offset;
5249 static int
5250 dissect_h248_T_tpend_transactionId(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5251 uint32_t trx_id = 0;
5252 offset = dissect_h248_trx_id(implicit_tag, actx->pinfo, tree, tvb, offset, &trx_id);
5253 curr_info.trx = gcp_trx(curr_info.msg, trx_id, GCP_TRX_PENDING, actx->pinfo, keep_persistent_data);
5254 error_code = 0;
5257 return offset;
5261 static const ber_sequence_t TransactionPending_sequence[] = {
5262 { &hf_h248_tpend_transactionId, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_T_tpend_transactionId },
5263 { NULL, 0, 0, 0, NULL }
5266 static int
5267 dissect_h248_TransactionPending(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5268 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5269 TransactionPending_sequence, hf_index, ett_h248_TransactionPending);
5271 return offset;
5276 static int
5277 dissect_h248_T_trep_transactionId(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5278 uint32_t trx_id = 0;
5279 offset = dissect_h248_trx_id(implicit_tag, actx->pinfo, tree, tvb, offset, &trx_id);
5280 curr_info.trx = gcp_trx(curr_info.msg, trx_id, GCP_TRX_REPLY, actx->pinfo, keep_persistent_data);
5281 error_code = 0;
5284 return offset;
5288 static const ber_sequence_t PackagesItem_sequence[] = {
5289 { &hf_h248_packageName , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_Name },
5290 { &hf_h248_packageVersion , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_99 },
5291 { NULL, 0, 0, 0, NULL }
5294 static int
5295 dissect_h248_PackagesItem(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5296 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5297 PackagesItem_sequence, hf_index, ett_h248_PackagesItem);
5299 return offset;
5303 static const ber_sequence_t PackagesDescriptor_sequence_of[1] = {
5304 { &hf_h248_PackagesDescriptor_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_PackagesItem },
5307 static int
5308 dissect_h248_PackagesDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5309 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
5310 PackagesDescriptor_sequence_of, hf_index, ett_h248_PackagesDescriptor);
5312 return offset;
5316 static const value_string h248_AuditReturnParameter_vals[] = {
5317 { 0, "errorDescriptor" },
5318 { 1, "mediaDescriptor" },
5319 { 2, "modemDescriptor" },
5320 { 3, "muxDescriptor" },
5321 { 4, "eventsDescriptor" },
5322 { 5, "eventBufferDescriptor" },
5323 { 6, "signalsDescriptor" },
5324 { 7, "digitMapDescriptor" },
5325 { 8, "observedEventsDescriptor" },
5326 { 9, "statisticsDescriptor" },
5327 { 10, "packagesDescriptor" },
5328 { 11, "emptyDescriptors" },
5329 { 0, NULL }
5332 static const ber_choice_t AuditReturnParameter_choice[] = {
5333 { 0, &hf_h248_errorDescriptor, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_ErrorDescriptor },
5334 { 1, &hf_h248_mediaDescriptor, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_MediaDescriptor },
5335 { 2, &hf_h248_modemDescriptor, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_ModemDescriptor },
5336 { 3, &hf_h248_muxDescriptor , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_MuxDescriptor },
5337 { 4, &hf_h248_eventsDescriptor, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_h248_EventsDescriptor },
5338 { 5, &hf_h248_eventBufferDescriptor, BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_h248_EventBufferDescriptor },
5339 { 6, &hf_h248_signalsDescriptor, BER_CLASS_CON, 6, BER_FLAGS_IMPLTAG, dissect_h248_SignalsDescriptor },
5340 { 7, &hf_h248_digitMapDescriptor, BER_CLASS_CON, 7, BER_FLAGS_IMPLTAG, dissect_h248_DigitMapDescriptor },
5341 { 8, &hf_h248_observedEventsDescriptor, BER_CLASS_CON, 8, BER_FLAGS_IMPLTAG, dissect_h248_ObservedEventsDescriptor },
5342 { 9, &hf_h248_aRPstatisticsDescriptor, BER_CLASS_CON, 9, BER_FLAGS_IMPLTAG, dissect_h248_StatisticsDescriptor },
5343 { 10, &hf_h248_packagesDescriptor, BER_CLASS_CON, 10, BER_FLAGS_IMPLTAG, dissect_h248_PackagesDescriptor },
5344 { 11, &hf_h248_emptyDescriptors, BER_CLASS_CON, 11, BER_FLAGS_IMPLTAG, dissect_h248_AuditDescriptor },
5345 { 0, NULL, 0, 0, 0, NULL }
5348 static int
5349 dissect_h248_AuditReturnParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5350 offset = dissect_ber_choice(actx, tree, tvb, offset,
5351 AuditReturnParameter_choice, hf_index, ett_h248_AuditReturnParameter,
5352 NULL);
5354 return offset;
5358 static const ber_sequence_t TerminationAudit_sequence_of[1] = {
5359 { &hf_h248_TerminationAudit_item, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_AuditReturnParameter },
5362 static int
5363 dissect_h248_TerminationAudit(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5364 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
5365 TerminationAudit_sequence_of, hf_index, ett_h248_TerminationAudit);
5367 return offset;
5371 static const ber_sequence_t AmmsReply_sequence[] = {
5372 { &hf_h248_terminationIDList, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
5373 { &hf_h248_terminationAudit, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_TerminationAudit },
5374 { NULL, 0, 0, 0, NULL }
5377 static int
5378 dissect_h248_AmmsReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5379 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5380 AmmsReply_sequence, hf_index, ett_h248_AmmsReply);
5382 return offset;
5387 static int
5388 dissect_h248_T_addReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5389 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_ADD_REPLY,offset,actx->pinfo,keep_persistent_data);
5390 H248_TAP();
5391 offset = dissect_h248_AmmsReply(implicit_tag, tvb, offset, actx, tree, hf_index);
5393 return offset;
5398 static int
5399 dissect_h248_T_moveReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5400 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_MOVE_REPLY,offset,actx->pinfo,keep_persistent_data);
5401 H248_TAP();
5402 offset = dissect_h248_AmmsReply(implicit_tag, tvb, offset, actx, tree, hf_index);
5404 return offset;
5409 static int
5410 dissect_h248_T_modReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5411 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_MOD_REPLY,offset,actx->pinfo,keep_persistent_data);
5412 H248_TAP();
5413 offset = dissect_h248_AmmsReply(implicit_tag, tvb, offset, actx, tree, hf_index);
5415 return offset;
5420 static int
5421 dissect_h248_T_subtractReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5422 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_SUB_REPLY,offset,actx->pinfo,keep_persistent_data);
5423 H248_TAP();
5424 offset = dissect_h248_AmmsReply(implicit_tag, tvb, offset, actx, tree, hf_index);
5426 return offset;
5430 static const ber_sequence_t AuditResult_sequence[] = {
5431 { &hf_h248_terminationID , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationID },
5432 { &hf_h248_terminationAuditResult, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_TerminationAudit },
5433 { NULL, 0, 0, 0, NULL }
5436 static int
5437 dissect_h248_AuditResult(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5438 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5439 AuditResult_sequence, hf_index, ett_h248_AuditResult);
5441 return offset;
5445 static const ber_sequence_t TermListAuditResult_sequence[] = {
5446 { &hf_h248_terminationIDList, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
5447 { &hf_h248_terminationAuditResult, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_TerminationAudit },
5448 { NULL, 0, 0, 0, NULL }
5451 static int
5452 dissect_h248_TermListAuditResult(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5453 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5454 TermListAuditResult_sequence, hf_index, ett_h248_TermListAuditResult);
5456 return offset;
5460 static const value_string h248_AuditReply_vals[] = {
5461 { 0, "contextAuditResult" },
5462 { 1, "error" },
5463 { 2, "auditResult" },
5464 { 3, "auditResultTermList" },
5465 { 0, NULL }
5468 static const ber_choice_t AuditReply_choice[] = {
5469 { 0, &hf_h248_contextAuditResult, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
5470 { 1, &hf_h248_error , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_ErrorDescriptor },
5471 { 2, &hf_h248_auditResult , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_AuditResult },
5472 { 3, &hf_h248_auditResultTermList, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_TermListAuditResult },
5473 { 0, NULL, 0, 0, 0, NULL }
5476 static int
5477 dissect_h248_AuditReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5478 offset = dissect_ber_choice(actx, tree, tvb, offset,
5479 AuditReply_choice, hf_index, ett_h248_AuditReply,
5480 NULL);
5482 return offset;
5487 static int
5488 dissect_h248_T_auditCapReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5489 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_AUDITCAP_REPLY,offset,actx->pinfo,keep_persistent_data);
5490 H248_TAP();
5491 /* h248v1 support */
5492 if(h248_version > 1) {
5493 offset = dissect_h248_AuditReply(implicit_tag, tvb, offset, actx, tree, hf_index);
5495 } else {
5496 /* call V1 of the dissector */
5497 offset = dissect_h248_AuditReplyV1(implicit_tag, tvb, offset, actx, tree, hf_index);
5500 return offset;
5505 static int
5506 dissect_h248_T_auditValueReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5507 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_AUDITVAL_REPLY,offset,actx->pinfo,keep_persistent_data);
5508 H248_TAP();
5509 /* h248v1 support */
5510 if(h248_version > 1) {
5511 offset = dissect_h248_AuditReply(implicit_tag, tvb, offset, actx, tree, hf_index);
5513 } else {
5514 /* call V1 of the dissector */
5515 offset = dissect_h248_AuditReplyV1(implicit_tag, tvb, offset, actx, tree, hf_index);
5518 return offset;
5522 static const ber_sequence_t NotifyReply_sequence[] = {
5523 { &hf_h248_terminationIDList, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
5524 { &hf_h248_errorDescriptor, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ErrorDescriptor },
5525 { NULL, 0, 0, 0, NULL }
5528 static int
5529 dissect_h248_NotifyReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5530 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5531 NotifyReply_sequence, hf_index, ett_h248_NotifyReply);
5533 return offset;
5538 static int
5539 dissect_h248_T_notifyReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5540 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_NOTIFY_REPLY,offset,actx->pinfo,keep_persistent_data);
5541 H248_TAP();
5542 offset = dissect_h248_NotifyReply(implicit_tag, tvb, offset, actx, tree, hf_index);
5544 return offset;
5548 static const ber_sequence_t ServiceChangeResParm_sequence[] = {
5549 { &hf_h248_serviceChangeMgcId, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_MId },
5550 { &hf_h248_serviceChangeAddress, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_ServiceChangeAddress },
5551 { &hf_h248_serviceChangeVersion, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_INTEGER_0_99 },
5552 { &hf_h248_serviceChangeProfile, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ServiceChangeProfile },
5553 { &hf_h248_timestamp , BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_TimeNotation },
5554 { NULL, 0, 0, 0, NULL }
5557 static int
5558 dissect_h248_ServiceChangeResParm(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5559 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5560 ServiceChangeResParm_sequence, hf_index, ett_h248_ServiceChangeResParm);
5562 return offset;
5566 static const value_string h248_ServiceChangeResult_vals[] = {
5567 { 0, "errorDescriptor" },
5568 { 1, "serviceChangeResParms" },
5569 { 0, NULL }
5572 static const ber_choice_t ServiceChangeResult_choice[] = {
5573 { 0, &hf_h248_errorDescriptor, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_ErrorDescriptor },
5574 { 1, &hf_h248_serviceChangeResParms, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_ServiceChangeResParm },
5575 { 0, NULL, 0, 0, 0, NULL }
5578 static int
5579 dissect_h248_ServiceChangeResult(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5580 offset = dissect_ber_choice(actx, tree, tvb, offset,
5581 ServiceChangeResult_choice, hf_index, ett_h248_ServiceChangeResult,
5582 NULL);
5584 return offset;
5588 static const ber_sequence_t ServiceChangeReply_sequence[] = {
5589 { &hf_h248_terminationIDList, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationIDList },
5590 { &hf_h248_serviceChangeResult, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_ServiceChangeResult },
5591 { NULL, 0, 0, 0, NULL }
5594 static int
5595 dissect_h248_ServiceChangeReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5596 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_SVCCHG_REPLY,offset,actx->pinfo,keep_persistent_data);
5597 H248_TAP();
5598 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5599 ServiceChangeReply_sequence, hf_index, ett_h248_ServiceChangeReply);
5601 return offset;
5605 static const value_string h248_CommandReply_vals[] = {
5606 { 0, "addReply" },
5607 { 1, "moveReply" },
5608 { 2, "modReply" },
5609 { 3, "subtractReply" },
5610 { 4, "auditCapReply" },
5611 { 5, "auditValueReply" },
5612 { 6, "notifyReply" },
5613 { 7, "serviceChangeReply" },
5614 { 0, NULL }
5617 static const ber_choice_t CommandReply_choice[] = {
5618 { 0, &hf_h248_addReply , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_T_addReply },
5619 { 1, &hf_h248_moveReply , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_T_moveReply },
5620 { 2, &hf_h248_modReply , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_T_modReply },
5621 { 3, &hf_h248_subtractReply , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_T_subtractReply },
5622 { 4, &hf_h248_auditCapReply , BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_h248_T_auditCapReply },
5623 { 5, &hf_h248_auditValueReply, BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_h248_T_auditValueReply },
5624 { 6, &hf_h248_notifyReply , BER_CLASS_CON, 6, BER_FLAGS_IMPLTAG, dissect_h248_T_notifyReply },
5625 { 7, &hf_h248_serviceChangeReply, BER_CLASS_CON, 7, BER_FLAGS_IMPLTAG, dissect_h248_ServiceChangeReply },
5626 { 0, NULL, 0, 0, 0, NULL }
5629 static int
5630 dissect_h248_CommandReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5631 offset = dissect_ber_choice(actx, tree, tvb, offset,
5632 CommandReply_choice, hf_index, ett_h248_CommandReply,
5633 NULL);
5635 return offset;
5639 static const ber_sequence_t SEQUENCE_OF_CommandReply_sequence_of[1] = {
5640 { &hf_h248_commandReply_item, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_CommandReply },
5643 static int
5644 dissect_h248_SEQUENCE_OF_CommandReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5645 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
5646 SEQUENCE_OF_CommandReply_sequence_of, hf_index, ett_h248_SEQUENCE_OF_CommandReply);
5648 return offset;
5652 static const ber_sequence_t ActionReply_sequence[] = {
5653 { &hf_h248_contextId , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_ContextId },
5654 { &hf_h248_errorDescriptor, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ErrorDescriptor },
5655 { &hf_h248_contextReply , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_ContextRequest },
5656 { &hf_h248_commandReply , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_CommandReply },
5657 { NULL, 0, 0, 0, NULL }
5660 static int
5661 dissect_h248_ActionReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5662 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5663 ActionReply_sequence, hf_index, ett_h248_ActionReply);
5665 if (!curr_info.cmd) {
5666 curr_info.cmd = gcp_cmd(curr_info.msg,curr_info.trx,curr_info.ctx,GCP_CMD_REPLY,offset,actx->pinfo,keep_persistent_data);
5667 H248_TAP();
5669 return offset;
5673 static const ber_sequence_t SEQUENCE_OF_ActionReply_sequence_of[1] = {
5674 { &hf_h248_actionReplies_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_ActionReply },
5677 static int
5678 dissect_h248_SEQUENCE_OF_ActionReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5679 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
5680 SEQUENCE_OF_ActionReply_sequence_of, hf_index, ett_h248_SEQUENCE_OF_ActionReply);
5682 return offset;
5686 static const value_string h248_T_transactionResult_vals[] = {
5687 { 0, "transactionError" },
5688 { 1, "actionReplies" },
5689 { 0, NULL }
5692 static const ber_choice_t T_transactionResult_choice[] = {
5693 { 0, &hf_h248_transactionError, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_ErrorDescriptor },
5694 { 1, &hf_h248_actionReplies , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_ActionReply },
5695 { 0, NULL, 0, 0, 0, NULL }
5698 static int
5699 dissect_h248_T_transactionResult(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5700 offset = dissect_ber_choice(actx, tree, tvb, offset,
5701 T_transactionResult_choice, hf_index, ett_h248_T_transactionResult,
5702 NULL);
5704 return offset;
5709 static int
5710 dissect_h248_SegmentNumber(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5711 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
5712 NULL);
5714 return offset;
5718 static const ber_sequence_t TransactionReply_sequence[] = {
5719 { &hf_h248_trep_transactionId, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_T_trep_transactionId },
5720 { &hf_h248_immAckRequired , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
5721 { &hf_h248_transactionResult, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_T_transactionResult },
5722 { &hf_h248_segmentNumber , BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_SegmentNumber },
5723 { &hf_h248_segmentationComplete, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
5724 { NULL, 0, 0, 0, NULL }
5727 static int
5728 dissect_h248_TransactionReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5729 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5730 TransactionReply_sequence, hf_index, ett_h248_TransactionReply);
5732 return offset;
5736 static const ber_sequence_t TransactionAck_sequence[] = {
5737 { &hf_h248_firstAck , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TransactionId },
5738 { &hf_h248_lastAck , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_TransactionId },
5739 { NULL, 0, 0, 0, NULL }
5742 static int
5743 dissect_h248_TransactionAck(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5744 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5745 TransactionAck_sequence, hf_index, ett_h248_TransactionAck);
5747 return offset;
5751 static const ber_sequence_t TransactionResponseAck_sequence_of[1] = {
5752 { &hf_h248_TransactionResponseAck_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_h248_TransactionAck },
5755 static int
5756 dissect_h248_TransactionResponseAck(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5757 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
5758 TransactionResponseAck_sequence_of, hf_index, ett_h248_TransactionResponseAck);
5760 return offset;
5765 static int
5766 dissect_h248_T_seg_rep_transactionId(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5767 uint32_t trx_id = 0;
5768 offset = dissect_h248_trx_id(implicit_tag, actx->pinfo, tree, tvb, offset, &trx_id);
5769 curr_info.trx = gcp_trx(curr_info.msg, trx_id, GCP_TRX_ACK, actx->pinfo, keep_persistent_data);
5770 error_code = 0;
5773 return offset;
5777 static const ber_sequence_t SegmentReply_sequence[] = {
5778 { &hf_h248_seg_rep_transactionId, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_T_seg_rep_transactionId },
5779 { &hf_h248_segmentNumber , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SegmentNumber },
5780 { &hf_h248_segmentationComplete, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_NULL },
5781 { NULL, 0, 0, 0, NULL }
5784 static int
5785 dissect_h248_SegmentReply(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5786 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5787 SegmentReply_sequence, hf_index, ett_h248_SegmentReply);
5789 return offset;
5793 static const value_string h248_Transaction_vals[] = {
5794 { 0, "transactionRequest" },
5795 { 1, "transactionPending" },
5796 { 2, "transactionReply" },
5797 { 3, "transactionResponseAck" },
5798 { 4, "segmentReply" },
5799 { 0, NULL }
5802 static const ber_choice_t Transaction_choice[] = {
5803 { 0, &hf_h248_transactionRequest, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TransactionRequest },
5804 { 1, &hf_h248_transactionPending, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_TransactionPending },
5805 { 2, &hf_h248_transactionReply, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_TransactionReply },
5806 { 3, &hf_h248_transactionResponseAck, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_h248_TransactionResponseAck },
5807 { 4, &hf_h248_segmentReply , BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_h248_SegmentReply },
5808 { 0, NULL, 0, 0, 0, NULL }
5811 static int
5812 dissect_h248_Transaction(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5813 offset = dissect_ber_choice(actx, tree, tvb, offset,
5814 Transaction_choice, hf_index, ett_h248_Transaction,
5815 NULL);
5817 return offset;
5821 static const ber_sequence_t SEQUENCE_OF_Transaction_sequence_of[1] = {
5822 { &hf_h248_transactions_item, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_Transaction },
5825 static int
5826 dissect_h248_SEQUENCE_OF_Transaction(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5827 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
5828 SEQUENCE_OF_Transaction_sequence_of, hf_index, ett_h248_SEQUENCE_OF_Transaction);
5830 return offset;
5834 static const value_string h248_T_messageBody_vals[] = {
5835 { 0, "messageError" },
5836 { 1, "transactions" },
5837 { 0, NULL }
5840 static const ber_choice_t T_messageBody_choice[] = {
5841 { 0, &hf_h248_messageError , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_ErrorDescriptor },
5842 { 1, &hf_h248_transactions , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SEQUENCE_OF_Transaction },
5843 { 0, NULL, 0, 0, 0, NULL }
5846 static int
5847 dissect_h248_T_messageBody(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5848 offset = dissect_ber_choice(actx, tree, tvb, offset,
5849 T_messageBody_choice, hf_index, ett_h248_T_messageBody,
5850 NULL);
5852 return offset;
5856 static const ber_sequence_t Message_sequence[] = {
5857 { &hf_h248_version , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_T_version },
5858 { &hf_h248_mId , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_MId },
5859 { &hf_h248_messageBody , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_h248_T_messageBody },
5860 { NULL, 0, 0, 0, NULL }
5863 static int
5864 dissect_h248_Message(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5865 curr_info.msg = gcp_msg(actx->pinfo,tvb_raw_offset(tvb),keep_persistent_data);
5866 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5867 Message_sequence, hf_index, ett_h248_Message);
5869 col_add_str(actx->pinfo->cinfo, COL_INFO, gcp_msg_to_str(curr_info.msg,actx->pinfo->pool,keep_persistent_data));
5871 if (keep_persistent_data)
5872 gcp_analyze_msg(h248_tree, actx->pinfo, tvb, curr_info.msg, &h248_arrel, &ei_h248_errored_command);
5873 return offset;
5877 static const ber_sequence_t MegacoMessage_sequence[] = {
5878 { &hf_h248_authHeader , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_h248_AuthenticationHeader },
5879 { &hf_h248_mess , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_Message },
5880 { NULL, 0, 0, 0, NULL }
5883 static int
5884 dissect_h248_MegacoMessage(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5885 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5886 MegacoMessage_sequence, hf_index, ett_h248_MegacoMessage);
5888 return offset;
5893 static int
5894 dissect_h248_ServiceChangeReasonStr(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5895 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_IA5String,
5896 actx, tree, tvb, offset, hf_index,
5897 NULL);
5899 return offset;
5903 static const value_string h248_AuditResultV1_vals[] = {
5904 { 0, "contectAuditResult" },
5905 { 1, "terminationAuditResult" },
5906 { 0, NULL }
5909 static const ber_choice_t AuditResultV1_choice[] = {
5910 { 0, &hf_h248_contectAuditResult, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationID },
5911 { 1, &hf_h248_terminationAuditResult, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_TerminationAudit },
5912 { 0, NULL, 0, 0, 0, NULL }
5915 static int
5916 dissect_h248_AuditResultV1(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5917 offset = dissect_ber_choice(actx, tree, tvb, offset,
5918 AuditResultV1_choice, hf_index, ett_h248_AuditResultV1,
5919 NULL);
5921 return offset;
5925 static const ber_sequence_t AuditReplyV1_sequence[] = {
5926 { &hf_h248_terminationID , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_TerminationID },
5927 { &hf_h248_audit_result , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG|BER_FLAGS_NOTCHKTAG, dissect_h248_AuditResultV1 },
5928 { NULL, 0, 0, 0, NULL }
5931 static int
5932 dissect_h248_AuditReplyV1(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5933 /* h248v1 support */
5934 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5935 AuditReplyV1_sequence, hf_h248_auditValueReplyV1, ett_h248_AuditReplyV1);
5937 return offset;
5942 static const ber_sequence_t EventParameterV1_sequence[] = {
5943 { &hf_h248_eventParamterName, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_EventParameterName },
5944 { &hf_h248_event_param_value, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_EventParamValueV1 },
5945 { NULL, 0, 0, 0, NULL }
5948 static int
5949 dissect_h248_EventParameterV1(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5950 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5951 EventParameterV1_sequence, hf_index, ett_h248_EventParameterV1);
5953 return offset;
5958 static const ber_sequence_t SigParameterV1_sequence[] = {
5959 { &hf_h248_sigParameterName, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_h248_SigParameterName },
5960 { &hf_h248_sig_param_value, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_h248_SigParamValueV1 },
5961 { NULL, 0, 0, 0, NULL }
5964 static int
5965 dissect_h248_SigParameterV1(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
5966 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
5967 SigParameterV1_sequence, hf_index, ett_h248_SigParameterV1);
5969 return offset;
5973 static int dissect_h248_tpkt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) {
5974 dissect_tpkt_encap(tvb, pinfo, tree, h248_desegment, h248_handle);
5975 return tvb_captured_length(tvb);
5978 static int
5979 dissect_h248(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
5981 proto_item *h248_item;
5982 asn1_ctx_t asn1_ctx;
5983 h248_tree = NULL;
5985 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
5987 curr_info.msg = NULL;
5988 curr_info.trx = NULL;
5989 curr_info.ctx = NULL;
5990 curr_info.cmd = NULL;
5991 curr_info.term = NULL;
5992 curr_info.pkg = NULL;
5993 curr_info.evt = NULL;
5994 curr_info.sig = NULL;
5995 curr_info.stat = NULL;
5996 curr_info.par = NULL;
5998 /* Check if it is actually a text-based H.248 encoding, which we
5999 dissect with the "megaco" dissector in Wireshark. (Both
6000 encodings are MEGACO (RFC 3015) and both are H.248.)
6002 if(tvb_captured_length(tvb)>=6){
6003 if(!tvb_strneql(tvb, 0, "MEGACO", 6)){
6004 static dissector_handle_t megaco_handle=NULL;
6005 if(!megaco_handle){
6006 megaco_handle = find_dissector("megaco");
6008 if(megaco_handle){
6009 call_dissector(megaco_handle, tvb, pinfo, tree);
6010 return tvb_captured_length(tvb);
6014 proto_item *hidden_item = NULL;
6015 uint32_t magic_num = 0, offset = 0;
6016 magic_num = tvb_get_ntohl(tvb, offset);
6017 hidden_item = proto_tree_add_uint(tree, hf_248_magic_num, tvb, offset, 4, magic_num);
6018 proto_item_set_hidden(hidden_item);
6019 if( dissector_try_uint(subdissector_table, magic_num, tvb, pinfo, tree) ) {
6020 return tvb_captured_length(tvb);
6025 export_h248_pdu(pinfo, tvb);
6027 /* Make entry in the Protocol column on summary display */
6028 col_set_str(pinfo->cinfo, COL_PROTOCOL, "H.248");
6030 if (tree) {
6031 h248_item = proto_tree_add_item(tree, proto_h248, tvb, 0, -1, ENC_NA);
6032 h248_tree = proto_item_add_subtree(h248_item, ett_h248);
6035 dissect_h248_MegacoMessage(false, tvb, 0, &asn1_ctx, h248_tree, -1);
6037 return tvb_captured_length(tvb);
6040 /*--- proto_register_h248 ----------------------------------------------*/
6041 void proto_reg_handoff_h248(void);
6043 void proto_register_h248(void) {
6045 /* List of fields */
6046 static hf_register_info hf[] = {
6047 { &hf_248_magic_num,
6048 { "Magic Number for Avaya H.248", "h248.magic_num",
6049 FT_UINT32, BASE_HEX, NULL, 0,
6050 NULL, HFILL}},
6051 { &hf_h248_mtpaddress_ni,
6052 { "NI", "h248.mtpaddress.ni",
6053 FT_UINT32, BASE_DEC, NULL, 0,
6054 NULL, HFILL }},
6055 { &hf_h248_mtpaddress_pc,
6056 { "PC", "h248.mtpaddress.pc",
6057 FT_UINT32, BASE_DEC, NULL, 0,
6058 NULL, HFILL }},
6059 { &hf_h248_pkg_name,
6060 { "Package", "h248.package_name",
6061 FT_UINT16, BASE_HEX, NULL, 0,
6062 NULL, HFILL }},
6063 { &hf_248_pkg_param,
6064 { "Parameter ID", "h248.package_paramid",
6065 FT_UINT16, BASE_HEX, NULL, 0,
6066 NULL, HFILL }},
6067 { &hf_h248_signal_code,
6068 { "Signal ID", "h248.package_signalid",
6069 FT_UINT16, BASE_HEX, NULL, 0,
6070 NULL, HFILL }},
6071 { &hf_h248_event_code,
6072 { "Event ID", "h248.package_eventid",
6073 FT_UINT16, BASE_HEX, NULL, 0,
6074 NULL, HFILL }},
6075 { &hf_h248_event_name,
6076 { "Package and Event name", "h248.event_name",
6077 FT_UINT32, BASE_HEX, NULL, 0,
6078 NULL, HFILL }},
6079 { &hf_h248_signal_name,
6080 { "Package and Signal name", "h248.signal_name",
6081 FT_UINT32, BASE_HEX, NULL, 0,
6082 NULL, HFILL }},
6083 { &hf_h248_pkg_bcp_BNCChar_PDU,
6084 { "BNCChar", "h248.package_bcp.BNCChar",
6085 FT_UINT32, BASE_DEC, VALS(gcp_term_types), 0,
6086 NULL, HFILL }},
6087 { &hf_h248_context_id,
6088 { "contextId", "h248.contextId",
6089 FT_UINT32, BASE_HEX, NULL, 0,
6090 "Context ID", HFILL }},
6091 { &hf_h248_term_wild_type,
6092 { "Wildcard Mode", "h248.term.wildcard.mode",
6093 FT_UINT8, BASE_DEC, VALS(wildcard_modes), 0x80,
6094 NULL, HFILL }},
6095 { &hf_h248_term_wild_level,
6096 { "Wildcarding Level", "h248.term.wildcard.level",
6097 FT_UINT8, BASE_DEC, VALS(wildcard_levels), 0x40,
6098 NULL, HFILL }},
6099 { &hf_h248_term_wild_position,
6100 { "Wildcarding Position", "h248.term.wildcard.pos",
6101 FT_UINT8, BASE_DEC, NULL, 0x3F,
6102 NULL, HFILL }},
6104 { &hf_h248_no_pkg,
6105 { "Unknown Package", "h248.pkg.unknown",
6106 FT_BYTES, BASE_NONE, NULL, 0,
6107 NULL, HFILL }},
6108 { &hf_h248_no_sig,
6109 { "Unknown Signal", "h248.pkg.unknown.sig",
6110 FT_BYTES, BASE_NONE, NULL, 0,
6111 NULL, HFILL }},
6112 { &hf_h248_no_evt,
6113 { "Unknown Event", "h248.pkg.unknown.evt",
6114 FT_BYTES, BASE_NONE, NULL, 0,
6115 NULL, HFILL }},
6116 { &hf_h248_param,
6117 { "Parameter", "h248.pkg.unknown.param",
6118 FT_BYTES, BASE_NONE, NULL, 0,
6119 NULL, HFILL }},
6120 { &hf_h248_serviceChangeReasonStr,
6121 { "ServiceChangeReasonStr", "h248.serviceChangeReasonstr",
6122 FT_STRING, BASE_NONE, NULL, 0,
6123 "h248.IA5String", HFILL }},
6124 { &hf_h248_context_id64,
6125 { "contextId", "h248.contextId64",
6126 FT_UINT64, BASE_HEX, NULL, 0,
6127 "Context ID", HFILL }},
6128 { &hf_h248_transactionId64,
6129 { "transactionId", "h248.transactionId",
6130 FT_UINT64, BASE_DEC, NULL, 0,
6131 NULL, HFILL }},
6133 /* h248v1 support */
6134 { &hf_h248_auditValueReplyV1,
6135 { "auditValueReplyV1", "h248.auditValueReplyV1",
6136 FT_NONE, BASE_NONE, NULL, 0,
6137 NULL, HFILL }},
6139 { &hf_h248_authHeader,
6140 { "authHeader", "h248.authHeader_element",
6141 FT_NONE, BASE_NONE, NULL, 0,
6142 "AuthenticationHeader", HFILL }},
6143 { &hf_h248_mess,
6144 { "mess", "h248.mess_element",
6145 FT_NONE, BASE_NONE, NULL, 0,
6146 "Message", HFILL }},
6147 { &hf_h248_secParmIndex,
6148 { "secParmIndex", "h248.secParmIndex",
6149 FT_BYTES, BASE_NONE, NULL, 0,
6150 "SecurityParmIndex", HFILL }},
6151 { &hf_h248_seqNum,
6152 { "seqNum", "h248.seqNum",
6153 FT_BYTES, BASE_NONE, NULL, 0,
6154 "SequenceNum", HFILL }},
6155 { &hf_h248_ad,
6156 { "ad", "h248.ad",
6157 FT_BYTES, BASE_NONE, NULL, 0,
6158 "AuthData", HFILL }},
6159 { &hf_h248_version,
6160 { "version", "h248.version",
6161 FT_UINT32, BASE_DEC, NULL, 0,
6162 NULL, HFILL }},
6163 { &hf_h248_mId,
6164 { "mId", "h248.mId",
6165 FT_UINT32, BASE_DEC, VALS(h248_MId_vals), 0,
6166 NULL, HFILL }},
6167 { &hf_h248_messageBody,
6168 { "messageBody", "h248.messageBody",
6169 FT_UINT32, BASE_DEC, VALS(h248_T_messageBody_vals), 0,
6170 NULL, HFILL }},
6171 { &hf_h248_messageError,
6172 { "messageError", "h248.messageError_element",
6173 FT_NONE, BASE_NONE, NULL, 0,
6174 "ErrorDescriptor", HFILL }},
6175 { &hf_h248_transactions,
6176 { "transactions", "h248.transactions",
6177 FT_UINT32, BASE_DEC, NULL, 0,
6178 "SEQUENCE_OF_Transaction", HFILL }},
6179 { &hf_h248_transactions_item,
6180 { "Transaction", "h248.Transaction",
6181 FT_UINT32, BASE_DEC, VALS(h248_Transaction_vals), 0,
6182 NULL, HFILL }},
6183 { &hf_h248_ip4Address,
6184 { "ip4Address", "h248.ip4Address_element",
6185 FT_NONE, BASE_NONE, NULL, 0,
6186 NULL, HFILL }},
6187 { &hf_h248_ip6Address,
6188 { "ip6Address", "h248.ip6Address_element",
6189 FT_NONE, BASE_NONE, NULL, 0,
6190 NULL, HFILL }},
6191 { &hf_h248_domainName,
6192 { "domainName", "h248.domainName_element",
6193 FT_NONE, BASE_NONE, NULL, 0,
6194 NULL, HFILL }},
6195 { &hf_h248_deviceName,
6196 { "deviceName", "h248.deviceName",
6197 FT_STRING, BASE_NONE, NULL, 0,
6198 "PathName", HFILL }},
6199 { &hf_h248_mtpAddress,
6200 { "mtpAddress", "h248.mtpAddress",
6201 FT_BYTES, BASE_NONE, NULL, 0,
6202 NULL, HFILL }},
6203 { &hf_h248_domName,
6204 { "name", "h248.domainname",
6205 FT_STRING, BASE_NONE, NULL, 0,
6206 "IA5String", HFILL }},
6207 { &hf_h248_portNumber,
6208 { "portNumber", "h248.portNumber",
6209 FT_UINT32, BASE_DEC, NULL, 0,
6210 "INTEGER_0_65535", HFILL }},
6211 { &hf_h248_iP4Address,
6212 { "address", "h248.iP4Address",
6213 FT_IPv4, BASE_NONE, NULL, 0,
6214 "OCTET_STRING_SIZE_4", HFILL }},
6215 { &hf_h248_iP6Address,
6216 { "address", "h248.iP6Address",
6217 FT_IPv6, BASE_NONE, NULL, 0,
6218 "OCTET_STRING_SIZE_16", HFILL }},
6219 { &hf_h248_transactionRequest,
6220 { "transactionRequest", "h248.transactionRequest_element",
6221 FT_NONE, BASE_NONE, NULL, 0,
6222 NULL, HFILL }},
6223 { &hf_h248_transactionPending,
6224 { "transactionPending", "h248.transactionPending_element",
6225 FT_NONE, BASE_NONE, NULL, 0,
6226 NULL, HFILL }},
6227 { &hf_h248_transactionReply,
6228 { "transactionReply", "h248.transactionReply_element",
6229 FT_NONE, BASE_NONE, NULL, 0,
6230 NULL, HFILL }},
6231 { &hf_h248_transactionResponseAck,
6232 { "transactionResponseAck", "h248.transactionResponseAck",
6233 FT_UINT32, BASE_DEC, NULL, 0,
6234 NULL, HFILL }},
6235 { &hf_h248_segmentReply,
6236 { "segmentReply", "h248.segmentReply_element",
6237 FT_NONE, BASE_NONE, NULL, 0,
6238 NULL, HFILL }},
6239 { &hf_h248_transactionId,
6240 { "transactionId", "h248.transactionRequest.transactionId",
6241 FT_UINT32, BASE_DEC, NULL, 0,
6242 NULL, HFILL }},
6243 { &hf_h248_actions,
6244 { "actions", "h248.actions",
6245 FT_UINT32, BASE_DEC, NULL, 0,
6246 "SEQUENCE_OF_ActionRequest", HFILL }},
6247 { &hf_h248_actions_item,
6248 { "ActionRequest", "h248.ActionRequest_element",
6249 FT_NONE, BASE_NONE, NULL, 0,
6250 NULL, HFILL }},
6251 { &hf_h248_tpend_transactionId,
6252 { "transactionId", "h248.transactionpending.transactionId",
6253 FT_UINT32, BASE_DEC, NULL, 0,
6254 "T_tpend_transactionId", HFILL }},
6255 { &hf_h248_trep_transactionId,
6256 { "transactionId", "h248.transactionreply.transactionId",
6257 FT_UINT32, BASE_DEC, NULL, 0,
6258 "T_trep_transactionId", HFILL }},
6259 { &hf_h248_immAckRequired,
6260 { "immAckRequired", "h248.immAckRequired_element",
6261 FT_NONE, BASE_NONE, NULL, 0,
6262 NULL, HFILL }},
6263 { &hf_h248_transactionResult,
6264 { "transactionResult", "h248.transactionResult",
6265 FT_UINT32, BASE_DEC, VALS(h248_T_transactionResult_vals), 0,
6266 NULL, HFILL }},
6267 { &hf_h248_transactionError,
6268 { "transactionError", "h248.transactionError_element",
6269 FT_NONE, BASE_NONE, NULL, 0,
6270 "ErrorDescriptor", HFILL }},
6271 { &hf_h248_actionReplies,
6272 { "actionReplies", "h248.actionReplies",
6273 FT_UINT32, BASE_DEC, NULL, 0,
6274 "SEQUENCE_OF_ActionReply", HFILL }},
6275 { &hf_h248_actionReplies_item,
6276 { "ActionReply", "h248.ActionReply_element",
6277 FT_NONE, BASE_NONE, NULL, 0,
6278 NULL, HFILL }},
6279 { &hf_h248_segmentNumber,
6280 { "segmentNumber", "h248.segmentNumber",
6281 FT_UINT32, BASE_DEC, NULL, 0,
6282 NULL, HFILL }},
6283 { &hf_h248_segmentationComplete,
6284 { "segmentationComplete", "h248.segmentationComplete_element",
6285 FT_NONE, BASE_NONE, NULL, 0,
6286 NULL, HFILL }},
6287 { &hf_h248_seg_rep_transactionId,
6288 { "transactionId", "h248.segmentreply.transactionId",
6289 FT_UINT32, BASE_DEC, NULL, 0,
6290 "T_seg_rep_transactionId", HFILL }},
6291 { &hf_h248_TransactionResponseAck_item,
6292 { "TransactionAck", "h248.TransactionAck_element",
6293 FT_NONE, BASE_NONE, NULL, 0,
6294 NULL, HFILL }},
6295 { &hf_h248_firstAck,
6296 { "firstAck", "h248.firstAck",
6297 FT_UINT32, BASE_DEC, NULL, 0,
6298 "TransactionId", HFILL }},
6299 { &hf_h248_lastAck,
6300 { "lastAck", "h248.lastAck",
6301 FT_UINT32, BASE_DEC, NULL, 0,
6302 "TransactionId", HFILL }},
6303 { &hf_h248_errorCode,
6304 { "errorCode", "h248.errorCode",
6305 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &h248_reasons_ext, 0,
6306 NULL, HFILL }},
6307 { &hf_h248_errorText,
6308 { "errorText", "h248.errorText",
6309 FT_STRING, BASE_NONE, NULL, 0,
6310 NULL, HFILL }},
6311 { &hf_h248_contextId,
6312 { "contextId", "h248.contextId",
6313 FT_UINT32, BASE_HEX, NULL, 0,
6314 NULL, HFILL }},
6315 { &hf_h248_contextRequest,
6316 { "contextRequest", "h248.contextRequest_element",
6317 FT_NONE, BASE_NONE, NULL, 0,
6318 NULL, HFILL }},
6319 { &hf_h248_contextAttrAuditReq,
6320 { "contextAttrAuditReq", "h248.contextAttrAuditReq_element",
6321 FT_NONE, BASE_NONE, NULL, 0,
6322 NULL, HFILL }},
6323 { &hf_h248_commandRequests,
6324 { "commandRequests", "h248.commandRequests",
6325 FT_UINT32, BASE_DEC, NULL, 0,
6326 "SEQUENCE_OF_CommandRequest", HFILL }},
6327 { &hf_h248_commandRequests_item,
6328 { "CommandRequest", "h248.CommandRequest_element",
6329 FT_NONE, BASE_NONE, NULL, 0,
6330 NULL, HFILL }},
6331 { &hf_h248_errorDescriptor,
6332 { "errorDescriptor", "h248.errorDescriptor_element",
6333 FT_NONE, BASE_NONE, NULL, 0,
6334 NULL, HFILL }},
6335 { &hf_h248_contextReply,
6336 { "contextReply", "h248.contextReply_element",
6337 FT_NONE, BASE_NONE, NULL, 0,
6338 "ContextRequest", HFILL }},
6339 { &hf_h248_commandReply,
6340 { "commandReply", "h248.commandReply",
6341 FT_UINT32, BASE_DEC, NULL, 0,
6342 "SEQUENCE_OF_CommandReply", HFILL }},
6343 { &hf_h248_commandReply_item,
6344 { "CommandReply", "h248.CommandReply",
6345 FT_UINT32, BASE_DEC, VALS(h248_CommandReply_vals), 0,
6346 NULL, HFILL }},
6347 { &hf_h248_priority,
6348 { "priority", "h248.priority",
6349 FT_UINT32, BASE_DEC, NULL, 0,
6350 "INTEGER_0_15", HFILL }},
6351 { &hf_h248_emergency,
6352 { "emergency", "h248.emergency",
6353 FT_BOOLEAN, BASE_NONE, NULL, 0,
6354 "BOOLEAN", HFILL }},
6355 { &hf_h248_topologyReq,
6356 { "topologyReq", "h248.topologyReq",
6357 FT_UINT32, BASE_DEC, NULL, 0,
6358 NULL, HFILL }},
6359 { &hf_h248_topologyReq_item,
6360 { "TopologyRequest", "h248.TopologyRequest_element",
6361 FT_NONE, BASE_NONE, NULL, 0,
6362 NULL, HFILL }},
6363 { &hf_h248_iepscallind_BOOL,
6364 { "iepscallind", "h248.iepscallind_BOOL",
6365 FT_BOOLEAN, BASE_NONE, NULL, 0,
6366 "Iepscallind_BOOL", HFILL }},
6367 { &hf_h248_contextProp,
6368 { "contextProp", "h248.contextProp",
6369 FT_UINT32, BASE_DEC, NULL, 0,
6370 "SEQUENCE_OF_PropertyParm", HFILL }},
6371 { &hf_h248_contextProp_item,
6372 { "PropertyParm", "h248.PropertyParm_element",
6373 FT_NONE, BASE_NONE, NULL, 0,
6374 NULL, HFILL }},
6375 { &hf_h248_contextList,
6376 { "contextList", "h248.contextList",
6377 FT_UINT32, BASE_DEC, NULL, 0,
6378 "SEQUENCE_OF_ContextIDinList", HFILL }},
6379 { &hf_h248_contextList_item,
6380 { "ContextIDinList", "h248.ContextIDinList",
6381 FT_UINT32, BASE_DEC, NULL, 0,
6382 NULL, HFILL }},
6383 { &hf_h248_topology,
6384 { "topology", "h248.topology_element",
6385 FT_NONE, BASE_NONE, NULL, 0,
6386 NULL, HFILL }},
6387 { &hf_h248_cAAREmergency,
6388 { "emergency", "h248.cAAREmergency_element",
6389 FT_NONE, BASE_NONE, NULL, 0,
6390 NULL, HFILL }},
6391 { &hf_h248_cAARPriority,
6392 { "priority", "h248.cAARPriority_element",
6393 FT_NONE, BASE_NONE, NULL, 0,
6394 NULL, HFILL }},
6395 { &hf_h248_iepscallind,
6396 { "iepscallind", "h248.iepscallind_element",
6397 FT_NONE, BASE_NONE, NULL, 0,
6398 NULL, HFILL }},
6399 { &hf_h248_contextPropAud,
6400 { "contextPropAud", "h248.contextPropAud",
6401 FT_UINT32, BASE_DEC, NULL, 0,
6402 "SEQUENCE_OF_IndAudPropertyParm", HFILL }},
6403 { &hf_h248_contextPropAud_item,
6404 { "IndAudPropertyParm", "h248.IndAudPropertyParm_element",
6405 FT_NONE, BASE_NONE, NULL, 0,
6406 NULL, HFILL }},
6407 { &hf_h248_selectpriority,
6408 { "selectpriority", "h248.selectpriority",
6409 FT_UINT32, BASE_DEC, NULL, 0,
6410 "INTEGER_0_15", HFILL }},
6411 { &hf_h248_selectemergency,
6412 { "selectemergency", "h248.selectemergency",
6413 FT_BOOLEAN, BASE_NONE, NULL, 0,
6414 "BOOLEAN", HFILL }},
6415 { &hf_h248_selectiepscallind,
6416 { "selectiepscallind", "h248.selectiepscallind",
6417 FT_BOOLEAN, BASE_NONE, NULL, 0,
6418 "BOOLEAN", HFILL }},
6419 { &hf_h248_selectLogic,
6420 { "selectLogic", "h248.selectLogic",
6421 FT_UINT32, BASE_DEC, VALS(h248_SelectLogic_vals), 0,
6422 NULL, HFILL }},
6423 { &hf_h248_andAUDITSelect,
6424 { "andAUDITSelect", "h248.andAUDITSelect_element",
6425 FT_NONE, BASE_NONE, NULL, 0,
6426 NULL, HFILL }},
6427 { &hf_h248_orAUDITSelect,
6428 { "orAUDITSelect", "h248.orAUDITSelect_element",
6429 FT_NONE, BASE_NONE, NULL, 0,
6430 NULL, HFILL }},
6431 { &hf_h248_command,
6432 { "command", "h248.command",
6433 FT_UINT32, BASE_DEC, VALS(h248_Command_vals), 0,
6434 NULL, HFILL }},
6435 { &hf_h248_optional,
6436 { "optional", "h248.optional_element",
6437 FT_NONE, BASE_NONE, NULL, 0,
6438 NULL, HFILL }},
6439 { &hf_h248_wildcardReturn,
6440 { "wildcardReturn", "h248.wildcardReturn_element",
6441 FT_NONE, BASE_NONE, NULL, 0,
6442 NULL, HFILL }},
6443 { &hf_h248_addReq,
6444 { "addReq", "h248.addReq_element",
6445 FT_NONE, BASE_NONE, NULL, 0,
6446 NULL, HFILL }},
6447 { &hf_h248_moveReq,
6448 { "moveReq", "h248.moveReq_element",
6449 FT_NONE, BASE_NONE, NULL, 0,
6450 NULL, HFILL }},
6451 { &hf_h248_modReq,
6452 { "modReq", "h248.modReq_element",
6453 FT_NONE, BASE_NONE, NULL, 0,
6454 NULL, HFILL }},
6455 { &hf_h248_subtractReq,
6456 { "subtractReq", "h248.subtractReq_element",
6457 FT_NONE, BASE_NONE, NULL, 0,
6458 NULL, HFILL }},
6459 { &hf_h248_auditCapRequest,
6460 { "auditCapRequest", "h248.auditCapRequest_element",
6461 FT_NONE, BASE_NONE, NULL, 0,
6462 NULL, HFILL }},
6463 { &hf_h248_auditValueRequest,
6464 { "auditValueRequest", "h248.auditValueRequest_element",
6465 FT_NONE, BASE_NONE, NULL, 0,
6466 NULL, HFILL }},
6467 { &hf_h248_notifyReq,
6468 { "notifyReq", "h248.notifyReq_element",
6469 FT_NONE, BASE_NONE, NULL, 0,
6470 NULL, HFILL }},
6471 { &hf_h248_serviceChangeReq,
6472 { "serviceChangeReq", "h248.serviceChangeReq_element",
6473 FT_NONE, BASE_NONE, NULL, 0,
6474 "ServiceChangeRequest", HFILL }},
6475 { &hf_h248_addReply,
6476 { "addReply", "h248.addReply_element",
6477 FT_NONE, BASE_NONE, NULL, 0,
6478 NULL, HFILL }},
6479 { &hf_h248_moveReply,
6480 { "moveReply", "h248.moveReply_element",
6481 FT_NONE, BASE_NONE, NULL, 0,
6482 NULL, HFILL }},
6483 { &hf_h248_modReply,
6484 { "modReply", "h248.modReply_element",
6485 FT_NONE, BASE_NONE, NULL, 0,
6486 NULL, HFILL }},
6487 { &hf_h248_subtractReply,
6488 { "subtractReply", "h248.subtractReply_element",
6489 FT_NONE, BASE_NONE, NULL, 0,
6490 NULL, HFILL }},
6491 { &hf_h248_auditCapReply,
6492 { "auditCapReply", "h248.auditCapReply",
6493 FT_UINT32, BASE_DEC, VALS(h248_AuditReply_vals), 0,
6494 NULL, HFILL }},
6495 { &hf_h248_auditValueReply,
6496 { "auditValueReply", "h248.auditValueReply",
6497 FT_UINT32, BASE_DEC, VALS(h248_AuditReply_vals), 0,
6498 NULL, HFILL }},
6499 { &hf_h248_notifyReply,
6500 { "notifyReply", "h248.notifyReply_element",
6501 FT_NONE, BASE_NONE, NULL, 0,
6502 NULL, HFILL }},
6503 { &hf_h248_serviceChangeReply,
6504 { "serviceChangeReply", "h248.serviceChangeReply_element",
6505 FT_NONE, BASE_NONE, NULL, 0,
6506 NULL, HFILL }},
6507 { &hf_h248_terminationFrom,
6508 { "terminationFrom", "h248.terminationFrom_element",
6509 FT_NONE, BASE_NONE, NULL, 0,
6510 "TerminationID", HFILL }},
6511 { &hf_h248_terminationTo,
6512 { "terminationTo", "h248.terminationTo_element",
6513 FT_NONE, BASE_NONE, NULL, 0,
6514 "TerminationID", HFILL }},
6515 { &hf_h248_topologyDirection,
6516 { "topologyDirection", "h248.topologyDirection",
6517 FT_UINT32, BASE_DEC, VALS(h248_T_topologyDirection_vals), 0,
6518 NULL, HFILL }},
6519 { &hf_h248_streamID,
6520 { "streamID", "h248.streamID",
6521 FT_UINT32, BASE_DEC, NULL, 0,
6522 NULL, HFILL }},
6523 { &hf_h248_topologyDirectionExtension,
6524 { "topologyDirectionExtension", "h248.topologyDirectionExtension",
6525 FT_UINT32, BASE_DEC, VALS(h248_T_topologyDirectionExtension_vals), 0,
6526 NULL, HFILL }},
6527 { &hf_h248_terminationIDList,
6528 { "terminationID", "h248.terminationIDList",
6529 FT_UINT32, BASE_DEC, NULL, 0,
6530 "TerminationIDList", HFILL }},
6531 { &hf_h248_descriptors,
6532 { "descriptors", "h248.descriptors",
6533 FT_UINT32, BASE_DEC, NULL, 0,
6534 "SEQUENCE_OF_AmmDescriptor", HFILL }},
6535 { &hf_h248_descriptors_item,
6536 { "AmmDescriptor", "h248.AmmDescriptor",
6537 FT_UINT32, BASE_DEC, VALS(h248_AmmDescriptor_vals), 0,
6538 NULL, HFILL }},
6539 { &hf_h248_mediaDescriptor,
6540 { "mediaDescriptor", "h248.mediaDescriptor_element",
6541 FT_NONE, BASE_NONE, NULL, 0,
6542 NULL, HFILL }},
6543 { &hf_h248_modemDescriptor,
6544 { "modemDescriptor", "h248.modemDescriptor_element",
6545 FT_NONE, BASE_NONE, NULL, 0,
6546 NULL, HFILL }},
6547 { &hf_h248_muxDescriptor,
6548 { "muxDescriptor", "h248.muxDescriptor_element",
6549 FT_NONE, BASE_NONE, NULL, 0,
6550 NULL, HFILL }},
6551 { &hf_h248_eventsDescriptor,
6552 { "eventsDescriptor", "h248.eventsDescriptor_element",
6553 FT_NONE, BASE_NONE, NULL, 0,
6554 NULL, HFILL }},
6555 { &hf_h248_eventBufferDescriptor,
6556 { "eventBufferDescriptor", "h248.eventBufferDescriptor",
6557 FT_UINT32, BASE_DEC, NULL, 0,
6558 NULL, HFILL }},
6559 { &hf_h248_signalsDescriptor,
6560 { "signalsDescriptor", "h248.signalsDescriptor",
6561 FT_UINT32, BASE_DEC, NULL, 0,
6562 NULL, HFILL }},
6563 { &hf_h248_digitMapDescriptor,
6564 { "digitMapDescriptor", "h248.digitMapDescriptor_element",
6565 FT_NONE, BASE_NONE, NULL, 0,
6566 NULL, HFILL }},
6567 { &hf_h248_auditDescriptor,
6568 { "auditDescriptor", "h248.auditDescriptor_element",
6569 FT_NONE, BASE_NONE, NULL, 0,
6570 NULL, HFILL }},
6571 { &hf_h248_aDstatisticsDescriptor,
6572 { "statisticsDescriptor", "h248.aDstatisticsDescriptor",
6573 FT_UINT32, BASE_DEC, NULL, 0,
6574 NULL, HFILL }},
6575 { &hf_h248_terminationAudit,
6576 { "terminationAudit", "h248.terminationAudit",
6577 FT_UINT32, BASE_DEC, NULL, 0,
6578 NULL, HFILL }},
6579 { &hf_h248_terminationID,
6580 { "terminationID", "h248.terminationID_element",
6581 FT_NONE, BASE_NONE, NULL, 0,
6582 NULL, HFILL }},
6583 { &hf_h248_contextAuditResult,
6584 { "contextAuditResult", "h248.contextAuditResult",
6585 FT_UINT32, BASE_DEC, NULL, 0,
6586 "TerminationIDList", HFILL }},
6587 { &hf_h248_error,
6588 { "error", "h248.error_element",
6589 FT_NONE, BASE_NONE, NULL, 0,
6590 "ErrorDescriptor", HFILL }},
6591 { &hf_h248_auditResult,
6592 { "auditResult", "h248.auditResult_element",
6593 FT_NONE, BASE_NONE, NULL, 0,
6594 NULL, HFILL }},
6595 { &hf_h248_auditResultTermList,
6596 { "auditResultTermList", "h248.auditResultTermList_element",
6597 FT_NONE, BASE_NONE, NULL, 0,
6598 "TermListAuditResult", HFILL }},
6599 { &hf_h248_terminationAuditResult,
6600 { "terminationAuditResult", "h248.terminationAuditResult",
6601 FT_UINT32, BASE_DEC, NULL, 0,
6602 "TerminationAudit", HFILL }},
6603 { &hf_h248_TerminationAudit_item,
6604 { "AuditReturnParameter", "h248.AuditReturnParameter",
6605 FT_UINT32, BASE_DEC, VALS(h248_AuditReturnParameter_vals), 0,
6606 NULL, HFILL }},
6607 { &hf_h248_observedEventsDescriptor,
6608 { "observedEventsDescriptor", "h248.observedEventsDescriptor_element",
6609 FT_NONE, BASE_NONE, NULL, 0,
6610 NULL, HFILL }},
6611 { &hf_h248_aRPstatisticsDescriptor,
6612 { "statisticsDescriptor", "h248.aRPstatisticsDescriptor",
6613 FT_UINT32, BASE_DEC, NULL, 0,
6614 NULL, HFILL }},
6615 { &hf_h248_packagesDescriptor,
6616 { "packagesDescriptor", "h248.packagesDescriptor",
6617 FT_UINT32, BASE_DEC, NULL, 0,
6618 NULL, HFILL }},
6619 { &hf_h248_emptyDescriptors,
6620 { "emptyDescriptors", "h248.emptyDescriptors_element",
6621 FT_NONE, BASE_NONE, NULL, 0,
6622 "AuditDescriptor", HFILL }},
6623 { &hf_h248_auditToken,
6624 { "auditToken", "h248.auditToken",
6625 FT_BYTES, BASE_NONE, NULL, 0,
6626 NULL, HFILL }},
6627 { &hf_h248_auditPropertyToken,
6628 { "auditPropertyToken", "h248.auditPropertyToken",
6629 FT_UINT32, BASE_DEC, NULL, 0,
6630 "SEQUENCE_OF_IndAuditParameter", HFILL }},
6631 { &hf_h248_auditPropertyToken_item,
6632 { "IndAuditParameter", "h248.IndAuditParameter",
6633 FT_UINT32, BASE_DEC, VALS(h248_IndAuditParameter_vals), 0,
6634 NULL, HFILL }},
6635 { &hf_h248_indaudmediaDescriptor,
6636 { "indaudmediaDescriptor", "h248.indaudmediaDescriptor_element",
6637 FT_NONE, BASE_NONE, NULL, 0,
6638 NULL, HFILL }},
6639 { &hf_h248_indaudeventsDescriptor,
6640 { "indaudeventsDescriptor", "h248.indaudeventsDescriptor_element",
6641 FT_NONE, BASE_NONE, NULL, 0,
6642 NULL, HFILL }},
6643 { &hf_h248_indaudeventBufferDescriptor,
6644 { "indaudeventBufferDescriptor", "h248.indaudeventBufferDescriptor_element",
6645 FT_NONE, BASE_NONE, NULL, 0,
6646 NULL, HFILL }},
6647 { &hf_h248_indaudsignalsDescriptor,
6648 { "indaudsignalsDescriptor", "h248.indaudsignalsDescriptor",
6649 FT_UINT32, BASE_DEC, VALS(h248_IndAudSignalsDescriptor_vals), 0,
6650 NULL, HFILL }},
6651 { &hf_h248_indauddigitMapDescriptor,
6652 { "indauddigitMapDescriptor", "h248.indauddigitMapDescriptor_element",
6653 FT_NONE, BASE_NONE, NULL, 0,
6654 NULL, HFILL }},
6655 { &hf_h248_indaudstatisticsDescriptor,
6656 { "indaudstatisticsDescriptor", "h248.indaudstatisticsDescriptor_element",
6657 FT_NONE, BASE_NONE, NULL, 0,
6658 NULL, HFILL }},
6659 { &hf_h248_indaudpackagesDescriptor,
6660 { "indaudpackagesDescriptor", "h248.indaudpackagesDescriptor_element",
6661 FT_NONE, BASE_NONE, NULL, 0,
6662 NULL, HFILL }},
6663 { &hf_h248_indAudTerminationStateDescriptor,
6664 { "termStateDescr", "h248.indAudTerminationStateDescriptor_element",
6665 FT_NONE, BASE_NONE, NULL, 0,
6666 "IndAudTerminationStateDescriptor", HFILL }},
6667 { &hf_h248_indAudMediaDescriptorStreams,
6668 { "streams", "h248.indAudMediaDescriptorStreams",
6669 FT_UINT32, BASE_DEC, VALS(h248_IndAudMediaDescriptorStreams_vals), 0,
6670 "IndAudMediaDescriptorStreams", HFILL }},
6671 { &hf_h248_oneStream,
6672 { "oneStream", "h248.oneStream_element",
6673 FT_NONE, BASE_NONE, NULL, 0,
6674 "IndAudStreamParms", HFILL }},
6675 { &hf_h248_multiStream,
6676 { "multiStream", "h248.multiStream",
6677 FT_UINT32, BASE_DEC, NULL, 0,
6678 "SEQUENCE_OF_IndAudStreamDescriptor", HFILL }},
6679 { &hf_h248_multiStream_item,
6680 { "IndAudStreamDescriptor", "h248.IndAudStreamDescriptor_element",
6681 FT_NONE, BASE_NONE, NULL, 0,
6682 NULL, HFILL }},
6683 { &hf_h248_indAudStreamParms,
6684 { "streamParms", "h248.indAudStreamParms_element",
6685 FT_NONE, BASE_NONE, NULL, 0,
6686 "IndAudStreamParms", HFILL }},
6687 { &hf_h248_iASPLocalControlDescriptor,
6688 { "localControlDescriptor", "h248.iASPLocalControlDescriptor_element",
6689 FT_NONE, BASE_NONE, NULL, 0,
6690 "IndAudLocalControlDescriptor", HFILL }},
6691 { &hf_h248_iASPLocalDescriptor,
6692 { "localDescriptor", "h248.iASPLocalDescriptor_element",
6693 FT_NONE, BASE_NONE, NULL, 0,
6694 "IndAudLocalRemoteDescriptor", HFILL }},
6695 { &hf_h248_iASPRemoteDescriptor,
6696 { "remoteDescriptor", "h248.iASPRemoteDescriptor_element",
6697 FT_NONE, BASE_NONE, NULL, 0,
6698 "IndAudLocalRemoteDescriptor", HFILL }},
6699 { &hf_h248_statisticsDescriptor,
6700 { "statisticsDescriptor", "h248.statisticsDescriptor_element",
6701 FT_NONE, BASE_NONE, NULL, 0,
6702 "IndAudStatisticsDescriptor", HFILL }},
6703 { &hf_h248_iALCDStreamMode,
6704 { "streamMode", "h248.iALCDStreamMode_element",
6705 FT_NONE, BASE_NONE, NULL, 0,
6706 NULL, HFILL }},
6707 { &hf_h248_iALCDReserveValue,
6708 { "reserveValue", "h248.iALCDReserveValue_element",
6709 FT_NONE, BASE_NONE, NULL, 0,
6710 NULL, HFILL }},
6711 { &hf_h248_iALCDReserveGroup,
6712 { "reserveGroup", "h248.iALCDReserveGroup_element",
6713 FT_NONE, BASE_NONE, NULL, 0,
6714 NULL, HFILL }},
6715 { &hf_h248_indAudPropertyParms,
6716 { "propertyParms", "h248.indAudPropertyParms",
6717 FT_UINT32, BASE_DEC, NULL, 0,
6718 "SEQUENCE_OF_IndAudPropertyParm", HFILL }},
6719 { &hf_h248_indAudPropertyParms_item,
6720 { "IndAudPropertyParm", "h248.IndAudPropertyParm_element",
6721 FT_NONE, BASE_NONE, NULL, 0,
6722 NULL, HFILL }},
6723 { &hf_h248_streamModeSel,
6724 { "streamModeSel", "h248.streamModeSel",
6725 FT_UINT32, BASE_DEC, VALS(h248_StreamMode_vals), 0,
6726 "StreamMode", HFILL }},
6727 { &hf_h248_name,
6728 { "name", "h248.name",
6729 FT_BYTES, BASE_NONE, NULL, 0,
6730 "PkgdName", HFILL }},
6731 { &hf_h248_propertyParms,
6732 { "propertyParms", "h248.propertyParms_element",
6733 FT_NONE, BASE_NONE, NULL, 0,
6734 "PropertyParm", HFILL }},
6735 { &hf_h248_propGroupID,
6736 { "propGroupID", "h248.propGroupID",
6737 FT_UINT32, BASE_DEC, NULL, 0,
6738 "INTEGER_0_65535", HFILL }},
6739 { &hf_h248_iAPropertyGroup,
6740 { "propGrps", "h248.iAPropertyGroup",
6741 FT_UINT32, BASE_DEC, NULL, 0,
6742 "IndAudPropertyGroup", HFILL }},
6743 { &hf_h248_IndAudPropertyGroup_item,
6744 { "IndAudPropertyParm", "h248.IndAudPropertyParm_element",
6745 FT_NONE, BASE_NONE, NULL, 0,
6746 NULL, HFILL }},
6747 { &hf_h248_eventBufferControl,
6748 { "eventBufferControl", "h248.eventBufferControl_element",
6749 FT_NONE, BASE_NONE, NULL, 0,
6750 NULL, HFILL }},
6751 { &hf_h248_iATSDServiceState,
6752 { "serviceState", "h248.iATSDServiceState_element",
6753 FT_NONE, BASE_NONE, NULL, 0,
6754 NULL, HFILL }},
6755 { &hf_h248_serviceStateSel,
6756 { "serviceStateSel", "h248.serviceStateSel",
6757 FT_UINT32, BASE_DEC, VALS(h248_ServiceState_vals), 0,
6758 "ServiceState", HFILL }},
6759 { &hf_h248_requestID,
6760 { "requestID", "h248.requestID",
6761 FT_UINT32, BASE_DEC, NULL, 0,
6762 NULL, HFILL }},
6763 { &hf_h248_iAEDPkgdName,
6764 { "pkgdName", "h248.iAEDPkgdName",
6765 FT_BYTES, BASE_NONE, NULL, 0,
6766 NULL, HFILL }},
6767 { &hf_h248_iAEBDEventName,
6768 { "eventName", "h248.iAEBDEventName",
6769 FT_BYTES, BASE_NONE, NULL, 0,
6770 "PkgdName", HFILL }},
6771 { &hf_h248_indAudSignal,
6772 { "signal", "h248.indAudSignal_element",
6773 FT_NONE, BASE_NONE, NULL, 0,
6774 "IndAudSignal", HFILL }},
6775 { &hf_h248_indAudSeqSigList,
6776 { "seqSigList", "h248.indAudSeqSigList_element",
6777 FT_NONE, BASE_NONE, NULL, 0,
6778 "IndAudSeqSigList", HFILL }},
6779 { &hf_h248_id,
6780 { "id", "h248.id",
6781 FT_UINT32, BASE_DEC, NULL, 0,
6782 "INTEGER_0_65535", HFILL }},
6783 { &hf_h248_iASignalList,
6784 { "signalList", "h248.iASignalList_element",
6785 FT_NONE, BASE_NONE, NULL, 0,
6786 "IndAudSignal", HFILL }},
6787 { &hf_h248_iASignalName,
6788 { "signalName", "h248.iASignalName",
6789 FT_BYTES, BASE_NONE, NULL, 0,
6790 "PkgdName", HFILL }},
6791 { &hf_h248_signalRequestID,
6792 { "signalRequestID", "h248.signalRequestID",
6793 FT_UINT32, BASE_DEC, NULL, 0,
6794 "RequestID", HFILL }},
6795 { &hf_h248_digitMapName,
6796 { "digitMapName", "h248.digitMapName",
6797 FT_BYTES, BASE_NONE, NULL, 0,
6798 NULL, HFILL }},
6799 { &hf_h248_iAStatName,
6800 { "statName", "h248.iAStatName",
6801 FT_BYTES, BASE_NONE, NULL, 0,
6802 "PkgdName", HFILL }},
6803 { &hf_h248_packageName,
6804 { "packageName", "h248.packageName",
6805 FT_BYTES, BASE_NONE, NULL, 0,
6806 "Name", HFILL }},
6807 { &hf_h248_packageVersion,
6808 { "packageVersion", "h248.packageVersion",
6809 FT_UINT32, BASE_DEC, NULL, 0,
6810 "INTEGER_0_99", HFILL }},
6811 { &hf_h248_requestId,
6812 { "requestId", "h248.requestId",
6813 FT_UINT32, BASE_DEC, NULL, 0,
6814 NULL, HFILL }},
6815 { &hf_h248_observedEventLst,
6816 { "observedEventLst", "h248.observedEventLst",
6817 FT_UINT32, BASE_DEC, NULL, 0,
6818 "SEQUENCE_OF_ObservedEvent", HFILL }},
6819 { &hf_h248_observedEventLst_item,
6820 { "ObservedEvent", "h248.ObservedEvent_element",
6821 FT_NONE, BASE_NONE, NULL, 0,
6822 NULL, HFILL }},
6823 { &hf_h248_eventName,
6824 { "eventName", "h248.eventName",
6825 FT_BYTES, BASE_NONE, NULL, 0,
6826 NULL, HFILL }},
6827 { &hf_h248_eventParList,
6828 { "eventParList", "h248.eventParList",
6829 FT_UINT32, BASE_DEC, NULL, 0,
6830 "SEQUENCE_OF_EventParameter", HFILL }},
6831 { &hf_h248_eventParList_item,
6832 { "EventParameter", "h248.EventParameter_element",
6833 FT_NONE, BASE_NONE, NULL, 0,
6834 NULL, HFILL }},
6835 { &hf_h248_timeNotation,
6836 { "timeNotation", "h248.timeNotation_element",
6837 FT_NONE, BASE_NONE, NULL, 0,
6838 NULL, HFILL }},
6839 { &hf_h248_eventParameterName,
6840 { "eventParameterName", "h248.eventParameterName",
6841 FT_BYTES, BASE_NONE, NULL, 0,
6842 NULL, HFILL }},
6843 { &hf_h248_eventParamValue,
6844 { "eventParamValue", "h248.eventParamValue",
6845 FT_UINT32, BASE_DEC, NULL, 0,
6846 "EventParamValues", HFILL }},
6847 { &hf_h248_eventPar_extraInfo,
6848 { "extraInfo", "h248.eventPar_extraInfo",
6849 FT_UINT32, BASE_DEC, VALS(h248_EventPar_extraInfo_vals), 0,
6850 "EventPar_extraInfo", HFILL }},
6851 { &hf_h248_relation,
6852 { "relation", "h248.relation",
6853 FT_UINT32, BASE_DEC, VALS(h248_Relation_vals), 0,
6854 NULL, HFILL }},
6855 { &hf_h248_range,
6856 { "range", "h248.range",
6857 FT_BOOLEAN, BASE_NONE, NULL, 0,
6858 "BOOLEAN", HFILL }},
6859 { &hf_h248_sublist,
6860 { "sublist", "h248.sublist",
6861 FT_BOOLEAN, BASE_NONE, NULL, 0,
6862 "BOOLEAN", HFILL }},
6863 { &hf_h248_EventParamValues_item,
6864 { "EventParamValue", "h248.EventParamValue",
6865 FT_BYTES, BASE_NONE, NULL, 0,
6866 NULL, HFILL }},
6867 { &hf_h248_serviceChangeParms,
6868 { "serviceChangeParms", "h248.serviceChangeParms_element",
6869 FT_NONE, BASE_NONE, NULL, 0,
6870 "ServiceChangeParm", HFILL }},
6871 { &hf_h248_serviceChangeResult,
6872 { "serviceChangeResult", "h248.serviceChangeResult",
6873 FT_UINT32, BASE_DEC, VALS(h248_ServiceChangeResult_vals), 0,
6874 NULL, HFILL }},
6875 { &hf_h248_serviceChangeResParms,
6876 { "serviceChangeResParms", "h248.serviceChangeResParms_element",
6877 FT_NONE, BASE_NONE, NULL, 0,
6878 "ServiceChangeResParm", HFILL }},
6879 { &hf_h248_wildcard,
6880 { "wildcard", "h248.wildcard",
6881 FT_UINT32, BASE_DEC, NULL, 0,
6882 "SEQUENCE_OF_WildcardField", HFILL }},
6883 { &hf_h248_wildcard_item,
6884 { "WildcardField", "h248.WildcardField",
6885 FT_BYTES, BASE_NONE, NULL, 0,
6886 NULL, HFILL }},
6887 { &hf_h248_terminationId,
6888 { "id", "h248.terminationId",
6889 FT_BYTES, BASE_NONE, NULL, 0,
6890 "T_terminationId", HFILL }},
6891 { &hf_h248_TerminationIDList_item,
6892 { "TerminationID", "h248.TerminationID_element",
6893 FT_NONE, BASE_NONE, NULL, 0,
6894 NULL, HFILL }},
6895 { &hf_h248_termStateDescr,
6896 { "termStateDescr", "h248.termStateDescr_element",
6897 FT_NONE, BASE_NONE, NULL, 0,
6898 "TerminationStateDescriptor", HFILL }},
6899 { &hf_h248_streams,
6900 { "streams", "h248.streams",
6901 FT_UINT32, BASE_DEC, VALS(h248_T_streams_vals), 0,
6902 NULL, HFILL }},
6903 { &hf_h248_mediaDescriptorOneStream,
6904 { "oneStream", "h248.mediaDescriptorOneStream_element",
6905 FT_NONE, BASE_NONE, NULL, 0,
6906 "StreamParms", HFILL }},
6907 { &hf_h248_mediaDescriptorMultiStream,
6908 { "multiStream", "h248.mediaDescriptorMultiStream",
6909 FT_UINT32, BASE_DEC, NULL, 0,
6910 "SEQUENCE_OF_StreamDescriptor", HFILL }},
6911 { &hf_h248_mediaDescriptorMultiStream_item,
6912 { "StreamDescriptor", "h248.StreamDescriptor_element",
6913 FT_NONE, BASE_NONE, NULL, 0,
6914 NULL, HFILL }},
6915 { &hf_h248_streamParms,
6916 { "streamParms", "h248.streamParms_element",
6917 FT_NONE, BASE_NONE, NULL, 0,
6918 NULL, HFILL }},
6919 { &hf_h248_localControlDescriptor,
6920 { "localControlDescriptor", "h248.localControlDescriptor_element",
6921 FT_NONE, BASE_NONE, NULL, 0,
6922 NULL, HFILL }},
6923 { &hf_h248_localDescriptor,
6924 { "localDescriptor", "h248.localDescriptor_element",
6925 FT_NONE, BASE_NONE, NULL, 0,
6926 "LocalRemoteDescriptor", HFILL }},
6927 { &hf_h248_remoteDescriptor,
6928 { "remoteDescriptor", "h248.remoteDescriptor_element",
6929 FT_NONE, BASE_NONE, NULL, 0,
6930 "LocalRemoteDescriptor", HFILL }},
6931 { &hf_h248_sPstatisticsDescriptor,
6932 { "statisticsDescriptor", "h248.sPstatisticsDescriptor",
6933 FT_UINT32, BASE_DEC, NULL, 0,
6934 NULL, HFILL }},
6935 { &hf_h248_streamMode,
6936 { "streamMode", "h248.streamMode",
6937 FT_UINT32, BASE_DEC, VALS(h248_StreamMode_vals), 0,
6938 NULL, HFILL }},
6939 { &hf_h248_reserveValue,
6940 { "reserveValue", "h248.reserveValue",
6941 FT_BOOLEAN, BASE_NONE, NULL, 0,
6942 "BOOLEAN", HFILL }},
6943 { &hf_h248_reserveGroup,
6944 { "reserveGroup", "h248.reserveGroup",
6945 FT_BOOLEAN, BASE_NONE, NULL, 0,
6946 "BOOLEAN", HFILL }},
6947 { &hf_h248_lCDpropertyParms,
6948 { "propertyParms", "h248.lCDpropertyParms",
6949 FT_UINT32, BASE_DEC, NULL, 0,
6950 "SEQUENCE_OF_PropertyParm", HFILL }},
6951 { &hf_h248_lCDpropertyParms_item,
6952 { "PropertyParm", "h248.PropertyParm_element",
6953 FT_NONE, BASE_NONE, NULL, 0,
6954 NULL, HFILL }},
6955 { &hf_h248_propertyName,
6956 { "propertyName", "h248.propertyName",
6957 FT_BYTES, BASE_NONE, NULL, 0,
6958 NULL, HFILL }},
6959 { &hf_h248_propertyParamValue,
6960 { "value", "h248.propertyParamValue",
6961 FT_UINT32, BASE_DEC, NULL, 0,
6962 "SEQUENCE_OF_PropertyID", HFILL }},
6963 { &hf_h248_propertyParamValue_item,
6964 { "PropertyID", "h248.PropertyID",
6965 FT_BYTES, BASE_NONE, NULL, 0,
6966 NULL, HFILL }},
6967 { &hf_h248_propParm_extraInfo,
6968 { "extraInfo", "h248.propParm_extraInfo",
6969 FT_UINT32, BASE_DEC, VALS(h248_PropParm_extraInfo_vals), 0,
6970 "PropParm_extraInfo", HFILL }},
6971 { &hf_h248_propGrps,
6972 { "propGrps", "h248.propGrps",
6973 FT_UINT32, BASE_DEC, NULL, 0,
6974 "SEQUENCE_OF_PropertyGroup", HFILL }},
6975 { &hf_h248_propGrps_item,
6976 { "PropertyGroup", "h248.PropertyGroup",
6977 FT_UINT32, BASE_DEC, NULL, 0,
6978 NULL, HFILL }},
6979 { &hf_h248_PropertyGroup_item,
6980 { "PropertyParm", "h248.PropertyParm_element",
6981 FT_NONE, BASE_NONE, NULL, 0,
6982 NULL, HFILL }},
6983 { &hf_h248_tSDpropertyParms,
6984 { "propertyParms", "h248.tSDpropertyParms",
6985 FT_UINT32, BASE_DEC, NULL, 0,
6986 "SEQUENCE_OF_PropertyParm", HFILL }},
6987 { &hf_h248_tSDpropertyParms_item,
6988 { "PropertyParm", "h248.PropertyParm_element",
6989 FT_NONE, BASE_NONE, NULL, 0,
6990 NULL, HFILL }},
6991 { &hf_h248_tSEventBufferControl,
6992 { "eventBufferControl", "h248.tSEventBufferControl",
6993 FT_UINT32, BASE_DEC, VALS(h248_EventBufferControl_vals), 0,
6994 NULL, HFILL }},
6995 { &hf_h248_serviceState,
6996 { "serviceState", "h248.serviceState",
6997 FT_UINT32, BASE_DEC, VALS(h248_ServiceState_vals), 0,
6998 NULL, HFILL }},
6999 { &hf_h248_muxType,
7000 { "muxType", "h248.muxType",
7001 FT_UINT32, BASE_DEC, VALS(h248_MuxType_vals), 0,
7002 NULL, HFILL }},
7003 { &hf_h248_termList,
7004 { "termList", "h248.termList",
7005 FT_UINT32, BASE_DEC, NULL, 0,
7006 "SEQUENCE_OF_TerminationID", HFILL }},
7007 { &hf_h248_termList_item,
7008 { "TerminationID", "h248.TerminationID_element",
7009 FT_NONE, BASE_NONE, NULL, 0,
7010 NULL, HFILL }},
7011 { &hf_h248_nonStandardData,
7012 { "nonStandardData", "h248.nonStandardData_element",
7013 FT_NONE, BASE_NONE, NULL, 0,
7014 NULL, HFILL }},
7015 { &hf_h248_eventList,
7016 { "eventList", "h248.eventList",
7017 FT_UINT32, BASE_DEC, NULL, 0,
7018 "SEQUENCE_OF_RequestedEvent", HFILL }},
7019 { &hf_h248_eventList_item,
7020 { "RequestedEvent", "h248.RequestedEvent_element",
7021 FT_NONE, BASE_NONE, NULL, 0,
7022 NULL, HFILL }},
7023 { &hf_h248_eventAction,
7024 { "eventAction", "h248.eventAction_element",
7025 FT_NONE, BASE_NONE, NULL, 0,
7026 "RequestedActions", HFILL }},
7027 { &hf_h248_evParList,
7028 { "evParList", "h248.evParList",
7029 FT_UINT32, BASE_DEC, NULL, 0,
7030 "SEQUENCE_OF_EventParameter", HFILL }},
7031 { &hf_h248_evParList_item,
7032 { "EventParameter", "h248.EventParameter_element",
7033 FT_NONE, BASE_NONE, NULL, 0,
7034 NULL, HFILL }},
7035 { &hf_h248_secondEvent,
7036 { "secondEvent", "h248.secondEvent_element",
7037 FT_NONE, BASE_NONE, NULL, 0,
7038 "SecondEventsDescriptor", HFILL }},
7039 { &hf_h248_notifyImmediate,
7040 { "notifyImmediate", "h248.notifyImmediate_element",
7041 FT_NONE, BASE_NONE, NULL, 0,
7042 NULL, HFILL }},
7043 { &hf_h248_notifyRegulated,
7044 { "notifyRegulated", "h248.notifyRegulated_element",
7045 FT_NONE, BASE_NONE, NULL, 0,
7046 "RegulatedEmbeddedDescriptor", HFILL }},
7047 { &hf_h248_neverNotify,
7048 { "neverNotify", "h248.neverNotify_element",
7049 FT_NONE, BASE_NONE, NULL, 0,
7050 NULL, HFILL }},
7051 { &hf_h248_keepActive,
7052 { "keepActive", "h248.keepActive",
7053 FT_BOOLEAN, BASE_NONE, NULL, 0,
7054 "BOOLEAN", HFILL }},
7055 { &hf_h248_eventDM,
7056 { "eventDM", "h248.eventDM",
7057 FT_UINT32, BASE_DEC, VALS(h248_EventDM_vals), 0,
7058 NULL, HFILL }},
7059 { &hf_h248_notifyBehaviour,
7060 { "notifyBehaviour", "h248.notifyBehaviour",
7061 FT_UINT32, BASE_DEC, VALS(h248_NotifyBehaviour_vals), 0,
7062 NULL, HFILL }},
7063 { &hf_h248_resetEventsDescriptor,
7064 { "resetEventsDescriptor", "h248.resetEventsDescriptor_element",
7065 FT_NONE, BASE_NONE, NULL, 0,
7066 NULL, HFILL }},
7067 { &hf_h248_digitMapValue,
7068 { "digitMapValue", "h248.digitMapValue_element",
7069 FT_NONE, BASE_NONE, NULL, 0,
7070 NULL, HFILL }},
7071 { &hf_h248_secondaryEventList,
7072 { "eventList", "h248.secondaryEventList",
7073 FT_UINT32, BASE_DEC, NULL, 0,
7074 "SEQUENCE_OF_SecondRequestedEvent", HFILL }},
7075 { &hf_h248_secondaryEventList_item,
7076 { "SecondRequestedEvent", "h248.SecondRequestedEvent_element",
7077 FT_NONE, BASE_NONE, NULL, 0,
7078 NULL, HFILL }},
7079 { &hf_h248_pkgdName,
7080 { "pkgdName", "h248.pkgdName",
7081 FT_BYTES, BASE_NONE, NULL, 0,
7082 NULL, HFILL }},
7083 { &hf_h248_secondaryEventAction,
7084 { "eventAction", "h248.secondaryEventAction_element",
7085 FT_NONE, BASE_NONE, NULL, 0,
7086 "SecondRequestedActions", HFILL }},
7087 { &hf_h248_EventBufferDescriptor_item,
7088 { "EventSpec", "h248.EventSpec_element",
7089 FT_NONE, BASE_NONE, NULL, 0,
7090 NULL, HFILL }},
7091 { &hf_h248_SignalsDescriptor_item,
7092 { "SignalRequest", "h248.SignalRequest",
7093 FT_UINT32, BASE_DEC, VALS(h248_SignalRequest_vals), 0,
7094 NULL, HFILL }},
7095 { &hf_h248_signal,
7096 { "signal", "h248.signal_element",
7097 FT_NONE, BASE_NONE, NULL, 0,
7098 NULL, HFILL }},
7099 { &hf_h248_seqSigList,
7100 { "seqSigList", "h248.seqSigList_element",
7101 FT_NONE, BASE_NONE, NULL, 0,
7102 NULL, HFILL }},
7103 { &hf_h248_signalList,
7104 { "signalList", "h248.signalList",
7105 FT_UINT32, BASE_DEC, NULL, 0,
7106 "SEQUENCE_OF_Signal", HFILL }},
7107 { &hf_h248_signalList_item,
7108 { "Signal", "h248.Signal_element",
7109 FT_NONE, BASE_NONE, NULL, 0,
7110 NULL, HFILL }},
7111 { &hf_h248_signalName,
7112 { "signalName", "h248.signalName",
7113 FT_BYTES, BASE_NONE, NULL, 0,
7114 NULL, HFILL }},
7115 { &hf_h248_sigType,
7116 { "sigType", "h248.sigType",
7117 FT_UINT32, BASE_DEC, VALS(h248_SignalType_vals), 0,
7118 "SignalType", HFILL }},
7119 { &hf_h248_duration,
7120 { "duration", "h248.duration",
7121 FT_UINT32, BASE_DEC, NULL, 0,
7122 "INTEGER_0_65535", HFILL }},
7123 { &hf_h248_notifyCompletion,
7124 { "notifyCompletion", "h248.notifyCompletion",
7125 FT_BYTES, BASE_NONE, NULL, 0,
7126 NULL, HFILL }},
7127 { &hf_h248_sigParList,
7128 { "sigParList", "h248.sigParList",
7129 FT_UINT32, BASE_DEC, NULL, 0,
7130 "SEQUENCE_OF_SigParameter", HFILL }},
7131 { &hf_h248_sigParList_item,
7132 { "SigParameter", "h248.SigParameter_element",
7133 FT_NONE, BASE_NONE, NULL, 0,
7134 NULL, HFILL }},
7135 { &hf_h248_direction,
7136 { "direction", "h248.direction",
7137 FT_UINT32, BASE_DEC, VALS(h248_SignalDirection_vals), 0,
7138 "SignalDirection", HFILL }},
7139 { &hf_h248_intersigDelay,
7140 { "intersigDelay", "h248.intersigDelay",
7141 FT_UINT32, BASE_DEC, NULL, 0,
7142 "INTEGER_0_65535", HFILL }},
7143 { &hf_h248_sigParameterName,
7144 { "sigParameterName", "h248.sigParameterName",
7145 FT_BYTES, BASE_NONE, NULL, 0,
7146 NULL, HFILL }},
7147 { &hf_h248_value,
7148 { "value", "h248.value",
7149 FT_UINT32, BASE_DEC, NULL, 0,
7150 "SigParamValues", HFILL }},
7151 { &hf_h248_extraInfo,
7152 { "extraInfo", "h248.extraInfo",
7153 FT_UINT32, BASE_DEC, VALS(h248_T_extraInfo_vals), 0,
7154 NULL, HFILL }},
7155 { &hf_h248_SigParamValues_item,
7156 { "SigParamValue", "h248.SigParamValue",
7157 FT_BYTES, BASE_NONE, NULL, 0,
7158 NULL, HFILL }},
7159 { &hf_h248_mtl,
7160 { "mtl", "h248.mtl",
7161 FT_UINT32, BASE_DEC, NULL, 0,
7162 "SEQUENCE_OF_ModemType", HFILL }},
7163 { &hf_h248_mtl_item,
7164 { "ModemType", "h248.ModemType",
7165 FT_UINT32, BASE_DEC, VALS(h248_ModemType_vals), 0,
7166 NULL, HFILL }},
7167 { &hf_h248_mpl,
7168 { "mpl", "h248.mpl",
7169 FT_UINT32, BASE_DEC, NULL, 0,
7170 "SEQUENCE_OF_PropertyParm", HFILL }},
7171 { &hf_h248_mpl_item,
7172 { "PropertyParm", "h248.PropertyParm_element",
7173 FT_NONE, BASE_NONE, NULL, 0,
7174 NULL, HFILL }},
7175 { &hf_h248_startTimer,
7176 { "startTimer", "h248.startTimer",
7177 FT_UINT32, BASE_DEC, NULL, 0,
7178 "INTEGER_0_99", HFILL }},
7179 { &hf_h248_shortTimer,
7180 { "shortTimer", "h248.shortTimer",
7181 FT_UINT32, BASE_DEC, NULL, 0,
7182 "INTEGER_0_99", HFILL }},
7183 { &hf_h248_longTimer,
7184 { "longTimer", "h248.longTimer",
7185 FT_UINT32, BASE_DEC, NULL, 0,
7186 "INTEGER_0_99", HFILL }},
7187 { &hf_h248_digitMapBody,
7188 { "digitMapBody", "h248.digitMapBody",
7189 FT_STRING, BASE_NONE, NULL, 0,
7190 "IA5String", HFILL }},
7191 { &hf_h248_durationTimer,
7192 { "durationTimer", "h248.durationTimer",
7193 FT_UINT32, BASE_DEC, NULL, 0,
7194 "INTEGER_0_99", HFILL }},
7195 { &hf_h248_serviceChangeMethod,
7196 { "serviceChangeMethod", "h248.serviceChangeMethod",
7197 FT_UINT32, BASE_DEC, VALS(h248_ServiceChangeMethod_vals), 0,
7198 NULL, HFILL }},
7199 { &hf_h248_serviceChangeAddress,
7200 { "serviceChangeAddress", "h248.serviceChangeAddress",
7201 FT_UINT32, BASE_DEC, VALS(h248_ServiceChangeAddress_vals), 0,
7202 NULL, HFILL }},
7203 { &hf_h248_serviceChangeVersion,
7204 { "serviceChangeVersion", "h248.serviceChangeVersion",
7205 FT_UINT32, BASE_DEC, NULL, 0,
7206 "INTEGER_0_99", HFILL }},
7207 { &hf_h248_serviceChangeProfile,
7208 { "serviceChangeProfile", "h248.serviceChangeProfile_element",
7209 FT_NONE, BASE_NONE, NULL, 0,
7210 NULL, HFILL }},
7211 { &hf_h248_serviceChangeReason,
7212 { "serviceChangeReason", "h248.serviceChangeReason",
7213 FT_UINT32, BASE_DEC, NULL, 0,
7214 "SCreasonValue", HFILL }},
7215 { &hf_h248_serviceChangeDelay,
7216 { "serviceChangeDelay", "h248.serviceChangeDelay",
7217 FT_UINT32, BASE_DEC, NULL, 0,
7218 "INTEGER_0_4294967295", HFILL }},
7219 { &hf_h248_serviceChangeMgcId,
7220 { "serviceChangeMgcId", "h248.serviceChangeMgcId",
7221 FT_UINT32, BASE_DEC, VALS(h248_MId_vals), 0,
7222 "MId", HFILL }},
7223 { &hf_h248_timeStamp,
7224 { "timeStamp", "h248.timeStamp_element",
7225 FT_NONE, BASE_NONE, NULL, 0,
7226 "TimeNotation", HFILL }},
7227 { &hf_h248_serviceChangeInfo,
7228 { "serviceChangeInfo", "h248.serviceChangeInfo_element",
7229 FT_NONE, BASE_NONE, NULL, 0,
7230 "AuditDescriptor", HFILL }},
7231 { &hf_h248_serviceChangeIncompleteFlag,
7232 { "serviceChangeIncompleteFlag", "h248.serviceChangeIncompleteFlag_element",
7233 FT_NONE, BASE_NONE, NULL, 0,
7234 NULL, HFILL }},
7235 { &hf_h248_SCreasonValue_item,
7236 { "SCreasonValueOctetStr", "h248.SCreasonValueOctetStr",
7237 FT_BYTES, BASE_NONE, NULL, 0,
7238 NULL, HFILL }},
7239 { &hf_h248_timestamp,
7240 { "timestamp", "h248.timestamp_element",
7241 FT_NONE, BASE_NONE, NULL, 0,
7242 "TimeNotation", HFILL }},
7243 { &hf_h248_profileName,
7244 { "profileName", "h248.profileName",
7245 FT_STRING, BASE_NONE, NULL, 0,
7246 "IA5String_SIZE_1_67", HFILL }},
7247 { &hf_h248_PackagesDescriptor_item,
7248 { "PackagesItem", "h248.PackagesItem_element",
7249 FT_NONE, BASE_NONE, NULL, 0,
7250 NULL, HFILL }},
7251 { &hf_h248_StatisticsDescriptor_item,
7252 { "StatisticsParameter", "h248.StatisticsParameter_element",
7253 FT_NONE, BASE_NONE, NULL, 0,
7254 NULL, HFILL }},
7255 { &hf_h248_statName,
7256 { "statName", "h248.statName",
7257 FT_BYTES, BASE_NONE, NULL, 0,
7258 NULL, HFILL }},
7259 { &hf_h248_statValue,
7260 { "statValue", "h248.statValue",
7261 FT_UINT32, BASE_DEC, NULL, 0,
7262 NULL, HFILL }},
7263 { &hf_h248_nonStandardIdentifier,
7264 { "nonStandardIdentifier", "h248.nonStandardIdentifier",
7265 FT_UINT32, BASE_DEC, VALS(h248_NonStandardIdentifier_vals), 0,
7266 NULL, HFILL }},
7267 { &hf_h248_data,
7268 { "data", "h248.data",
7269 FT_BYTES, BASE_NONE, NULL, 0,
7270 "OCTET_STRING", HFILL }},
7271 { &hf_h248_object,
7272 { "object", "h248.object",
7273 FT_OID, BASE_NONE, NULL, 0,
7274 "OBJECT_IDENTIFIER", HFILL }},
7275 { &hf_h248_h221NonStandard,
7276 { "h221NonStandard", "h248.h221NonStandard_element",
7277 FT_NONE, BASE_NONE, NULL, 0,
7278 NULL, HFILL }},
7279 { &hf_h248_experimental,
7280 { "experimental", "h248.experimental",
7281 FT_STRING, BASE_NONE, NULL, 0,
7282 "IA5String_SIZE_8", HFILL }},
7283 { &hf_h248_t35CountryCode1,
7284 { "t35CountryCode1", "h248.t35CountryCode1",
7285 FT_UINT32, BASE_DEC, NULL, 0,
7286 "INTEGER_0_255", HFILL }},
7287 { &hf_h248_t35CountryCode2,
7288 { "t35CountryCode2", "h248.t35CountryCode2",
7289 FT_UINT32, BASE_DEC, NULL, 0,
7290 "INTEGER_0_255", HFILL }},
7291 { &hf_h248_t35Extension,
7292 { "t35Extension", "h248.t35Extension",
7293 FT_UINT32, BASE_DEC, NULL, 0,
7294 "INTEGER_0_255", HFILL }},
7295 { &hf_h248_manufacturerCode,
7296 { "manufacturerCode", "h248.manufacturerCode",
7297 FT_UINT32, BASE_DEC, NULL, 0,
7298 "INTEGER_0_65535", HFILL }},
7299 { &hf_h248_date,
7300 { "date", "h248.date",
7301 FT_STRING, BASE_NONE, NULL, 0,
7302 "IA5String_SIZE_8", HFILL }},
7303 { &hf_h248_time,
7304 { "time", "h248.time",
7305 FT_STRING, BASE_NONE, NULL, 0,
7306 "IA5String_SIZE_8", HFILL }},
7307 { &hf_h248_Value_item,
7308 { "Value item", "h248.Value_item",
7309 FT_BYTES, BASE_NONE, NULL, 0,
7310 "OCTET_STRING", HFILL }},
7311 { &hf_h248_audit_result,
7312 { "auditResult", "h248.audit_result",
7313 FT_UINT32, BASE_DEC, VALS(h248_AuditResultV1_vals), 0,
7314 "AuditResultV1", HFILL }},
7315 { &hf_h248_contectAuditResult,
7316 { "contectAuditResult", "h248.contectAuditResult_element",
7317 FT_NONE, BASE_NONE, NULL, 0,
7318 "TerminationID", HFILL }},
7319 { &hf_h248_eventParamterName,
7320 { "eventParamterName", "h248.eventParamterName",
7321 FT_BYTES, BASE_NONE, NULL, 0,
7322 "EventParameterName", HFILL }},
7323 { &hf_h248_event_param_value,
7324 { "value", "h248.event_param_value",
7325 FT_BYTES, BASE_NONE, NULL, 0,
7326 "EventParamValueV1", HFILL }},
7327 { &hf_h248_sig_param_value,
7328 { "value", "h248.sig_param_value",
7329 FT_BYTES, BASE_NONE, NULL, 0,
7330 "SigParamValueV1", HFILL }},
7331 { &hf_h248_T_auditToken_muxToken,
7332 { "muxToken", "h248.T.auditToken.muxToken",
7333 FT_BOOLEAN, 8, NULL, 0x80,
7334 NULL, HFILL }},
7335 { &hf_h248_T_auditToken_modemToken,
7336 { "modemToken", "h248.T.auditToken.modemToken",
7337 FT_BOOLEAN, 8, NULL, 0x40,
7338 NULL, HFILL }},
7339 { &hf_h248_T_auditToken_mediaToken,
7340 { "mediaToken", "h248.T.auditToken.mediaToken",
7341 FT_BOOLEAN, 8, NULL, 0x20,
7342 NULL, HFILL }},
7343 { &hf_h248_T_auditToken_eventsToken,
7344 { "eventsToken", "h248.T.auditToken.eventsToken",
7345 FT_BOOLEAN, 8, NULL, 0x10,
7346 NULL, HFILL }},
7347 { &hf_h248_T_auditToken_signalsToken,
7348 { "signalsToken", "h248.T.auditToken.signalsToken",
7349 FT_BOOLEAN, 8, NULL, 0x08,
7350 NULL, HFILL }},
7351 { &hf_h248_T_auditToken_digitMapToken,
7352 { "digitMapToken", "h248.T.auditToken.digitMapToken",
7353 FT_BOOLEAN, 8, NULL, 0x04,
7354 NULL, HFILL }},
7355 { &hf_h248_T_auditToken_statsToken,
7356 { "statsToken", "h248.T.auditToken.statsToken",
7357 FT_BOOLEAN, 8, NULL, 0x02,
7358 NULL, HFILL }},
7359 { &hf_h248_T_auditToken_observedEventsToken,
7360 { "observedEventsToken", "h248.T.auditToken.observedEventsToken",
7361 FT_BOOLEAN, 8, NULL, 0x01,
7362 NULL, HFILL }},
7363 { &hf_h248_T_auditToken_packagesToken,
7364 { "packagesToken", "h248.T.auditToken.packagesToken",
7365 FT_BOOLEAN, 8, NULL, 0x80,
7366 NULL, HFILL }},
7367 { &hf_h248_T_auditToken_eventBufferToken,
7368 { "eventBufferToken", "h248.T.auditToken.eventBufferToken",
7369 FT_BOOLEAN, 8, NULL, 0x40,
7370 NULL, HFILL }},
7371 { &hf_h248_NotifyCompletion_onTimeOut,
7372 { "onTimeOut", "h248.NotifyCompletion.onTimeOut",
7373 FT_BOOLEAN, 8, NULL, 0x80,
7374 NULL, HFILL }},
7375 { &hf_h248_NotifyCompletion_onInterruptByEvent,
7376 { "onInterruptByEvent", "h248.NotifyCompletion.onInterruptByEvent",
7377 FT_BOOLEAN, 8, NULL, 0x40,
7378 NULL, HFILL }},
7379 { &hf_h248_NotifyCompletion_onInterruptByNewSignalDescr,
7380 { "onInterruptByNewSignalDescr", "h248.NotifyCompletion.onInterruptByNewSignalDescr",
7381 FT_BOOLEAN, 8, NULL, 0x20,
7382 NULL, HFILL }},
7383 { &hf_h248_NotifyCompletion_otherReason,
7384 { "otherReason", "h248.NotifyCompletion.otherReason",
7385 FT_BOOLEAN, 8, NULL, 0x10,
7386 NULL, HFILL }},
7387 { &hf_h248_NotifyCompletion_onIteration,
7388 { "onIteration", "h248.NotifyCompletion.onIteration",
7389 FT_BOOLEAN, 8, NULL, 0x08,
7390 NULL, HFILL }},
7392 GCP_HF_ARR_ELEMS("h248",h248_arrel)
7396 /* List of subtrees */
7397 static int *ett[] = {
7398 &ett_h248,
7399 &ett_mtpaddress,
7400 &ett_packagename,
7401 &ett_codec,
7402 &ett_wildcard,
7403 &ett_h248_no_pkg,
7404 &ett_h248_no_sig,
7405 &ett_h248_no_evt,
7406 GCP_ETT_ARR_ELEMS(h248_arrel),
7408 &ett_h248_MegacoMessage,
7409 &ett_h248_AuthenticationHeader,
7410 &ett_h248_Message,
7411 &ett_h248_T_messageBody,
7412 &ett_h248_SEQUENCE_OF_Transaction,
7413 &ett_h248_MId,
7414 &ett_h248_DomainName,
7415 &ett_h248_IP4Address,
7416 &ett_h248_IP6Address,
7417 &ett_h248_Transaction,
7418 &ett_h248_TransactionRequest,
7419 &ett_h248_SEQUENCE_OF_ActionRequest,
7420 &ett_h248_TransactionPending,
7421 &ett_h248_TransactionReply,
7422 &ett_h248_T_transactionResult,
7423 &ett_h248_SEQUENCE_OF_ActionReply,
7424 &ett_h248_SegmentReply,
7425 &ett_h248_TransactionResponseAck,
7426 &ett_h248_TransactionAck,
7427 &ett_h248_ErrorDescriptor,
7428 &ett_h248_ActionRequest,
7429 &ett_h248_SEQUENCE_OF_CommandRequest,
7430 &ett_h248_ActionReply,
7431 &ett_h248_SEQUENCE_OF_CommandReply,
7432 &ett_h248_ContextRequest,
7433 &ett_h248_T_topologyReq,
7434 &ett_h248_SEQUENCE_OF_PropertyParm,
7435 &ett_h248_SEQUENCE_OF_ContextIDinList,
7436 &ett_h248_ContextAttrAuditRequest,
7437 &ett_h248_SEQUENCE_OF_IndAudPropertyParm,
7438 &ett_h248_SelectLogic,
7439 &ett_h248_CommandRequest,
7440 &ett_h248_Command,
7441 &ett_h248_CommandReply,
7442 &ett_h248_TopologyRequest,
7443 &ett_h248_AmmRequest,
7444 &ett_h248_SEQUENCE_OF_AmmDescriptor,
7445 &ett_h248_AmmDescriptor,
7446 &ett_h248_AmmsReply,
7447 &ett_h248_SubtractRequest,
7448 &ett_h248_AuditRequest,
7449 &ett_h248_AuditReply,
7450 &ett_h248_AuditResult,
7451 &ett_h248_TermListAuditResult,
7452 &ett_h248_TerminationAudit,
7453 &ett_h248_AuditReturnParameter,
7454 &ett_h248_AuditDescriptor,
7455 &ett_h248_T_auditToken,
7456 &ett_h248_SEQUENCE_OF_IndAuditParameter,
7457 &ett_h248_IndAuditParameter,
7458 &ett_h248_IndAudMediaDescriptor,
7459 &ett_h248_IndAudMediaDescriptorStreams,
7460 &ett_h248_SEQUENCE_OF_IndAudStreamDescriptor,
7461 &ett_h248_IndAudStreamDescriptor,
7462 &ett_h248_IndAudStreamParms,
7463 &ett_h248_IndAudLocalControlDescriptor,
7464 &ett_h248_IndAudPropertyParm,
7465 &ett_h248_IndAudLocalRemoteDescriptor,
7466 &ett_h248_IndAudPropertyGroup,
7467 &ett_h248_IndAudTerminationStateDescriptor,
7468 &ett_h248_IndAudEventsDescriptor,
7469 &ett_h248_IndAudEventBufferDescriptor,
7470 &ett_h248_IndAudSignalsDescriptor,
7471 &ett_h248_IndAudSeqSigList,
7472 &ett_h248_IndAudSignal,
7473 &ett_h248_IndAudDigitMapDescriptor,
7474 &ett_h248_IndAudStatisticsDescriptor,
7475 &ett_h248_IndAudPackagesDescriptor,
7476 &ett_h248_NotifyRequest,
7477 &ett_h248_NotifyReply,
7478 &ett_h248_ObservedEventsDescriptor,
7479 &ett_h248_SEQUENCE_OF_ObservedEvent,
7480 &ett_h248_ObservedEvent,
7481 &ett_h248_SEQUENCE_OF_EventParameter,
7482 &ett_h248_EventParameter,
7483 &ett_h248_EventPar_extraInfo,
7484 &ett_h248_EventParamValues,
7485 &ett_h248_ServiceChangeRequest,
7486 &ett_h248_ServiceChangeReply,
7487 &ett_h248_ServiceChangeResult,
7488 &ett_h248_TerminationID,
7489 &ett_h248_SEQUENCE_OF_WildcardField,
7490 &ett_h248_TerminationIDList,
7491 &ett_h248_MediaDescriptor,
7492 &ett_h248_T_streams,
7493 &ett_h248_SEQUENCE_OF_StreamDescriptor,
7494 &ett_h248_StreamDescriptor,
7495 &ett_h248_StreamParms,
7496 &ett_h248_LocalControlDescriptor,
7497 &ett_h248_PropertyParm,
7498 &ett_h248_SEQUENCE_OF_PropertyID,
7499 &ett_h248_PropParm_extraInfo,
7500 &ett_h248_LocalRemoteDescriptor,
7501 &ett_h248_SEQUENCE_OF_PropertyGroup,
7502 &ett_h248_PropertyGroup,
7503 &ett_h248_TerminationStateDescriptor,
7504 &ett_h248_MuxDescriptor,
7505 &ett_h248_SEQUENCE_OF_TerminationID,
7506 &ett_h248_EventsDescriptor,
7507 &ett_h248_SEQUENCE_OF_RequestedEvent,
7508 &ett_h248_RequestedEvent,
7509 &ett_h248_RegulatedEmbeddedDescriptor,
7510 &ett_h248_NotifyBehaviour,
7511 &ett_h248_RequestedActions,
7512 &ett_h248_EventDM,
7513 &ett_h248_SecondEventsDescriptor,
7514 &ett_h248_SEQUENCE_OF_SecondRequestedEvent,
7515 &ett_h248_SecondRequestedEvent,
7516 &ett_h248_SecondRequestedActions,
7517 &ett_h248_EventBufferDescriptor,
7518 &ett_h248_EventSpec,
7519 &ett_h248_SignalsDescriptor,
7520 &ett_h248_SignalRequest,
7521 &ett_h248_SeqSigList,
7522 &ett_h248_SEQUENCE_OF_Signal,
7523 &ett_h248_Signal,
7524 &ett_h248_SEQUENCE_OF_SigParameter,
7525 &ett_h248_NotifyCompletion,
7526 &ett_h248_SigParameter,
7527 &ett_h248_T_extraInfo,
7528 &ett_h248_SigParamValues,
7529 &ett_h248_ModemDescriptor,
7530 &ett_h248_SEQUENCE_OF_ModemType,
7531 &ett_h248_DigitMapDescriptor,
7532 &ett_h248_DigitMapValue,
7533 &ett_h248_ServiceChangeParm,
7534 &ett_h248_SCreasonValue,
7535 &ett_h248_ServiceChangeAddress,
7536 &ett_h248_ServiceChangeResParm,
7537 &ett_h248_ServiceChangeProfile,
7538 &ett_h248_PackagesDescriptor,
7539 &ett_h248_PackagesItem,
7540 &ett_h248_StatisticsDescriptor,
7541 &ett_h248_StatisticsParameter,
7542 &ett_h248_NonStandardData,
7543 &ett_h248_NonStandardIdentifier,
7544 &ett_h248_H221NonStandard,
7545 &ett_h248_TimeNotation,
7546 &ett_h248_Value,
7547 &ett_h248_AuditReplyV1,
7548 &ett_h248_AuditResultV1,
7549 &ett_h248_EventParameterV1,
7550 &ett_h248_SigParameterV1,
7553 static ei_register_info ei[] = {
7554 { &ei_h248_errored_command, { "h248.errored_command", PI_RESPONSE_CODE, PI_WARN, "Errored Command", EXPFILL }},
7555 { &ei_h248_transactionId64, { "h248.transactionId.error", PI_MALFORMED, PI_WARN, "Transaction ID invalid", EXPFILL }},
7556 { &ei_h248_context_id64, { "h248.contextId.error", PI_MALFORMED, PI_WARN, "Context ID invalid", EXPFILL }},
7557 { &ei_h248_octet_string_expected, { "h248.octet_string_expected", PI_PROTOCOL, PI_WARN, "H.248 BER Error: OctetString expected", EXPFILL }},
7560 expert_module_t* expert_h248;
7561 module_t *h248_module;
7563 /* Register protocol */
7564 proto_h248 = proto_register_protocol(PNAME, PSNAME, PFNAME);
7565 h248_handle = register_dissector("h248", dissect_h248, proto_h248);
7566 h248_tpkt_handle = register_dissector("h248.tpkt", dissect_h248_tpkt, proto_h248);
7568 /* Register fields and subtrees */
7569 proto_register_field_array(proto_h248, hf, array_length(hf));
7570 proto_register_subtree_array(ett, array_length(ett));
7571 expert_h248 = expert_register_protocol(proto_h248);
7572 expert_register_field_array(expert_h248, ei, array_length(ei));
7574 subdissector_table = register_dissector_table("h248.magic_num", "H.248 Magic Num", proto_h248, FT_UINT32, BASE_HEX);
7576 h248_module = prefs_register_protocol(proto_h248, NULL);
7577 prefs_register_bool_preference(h248_module, "ctx_info",
7578 "Track Context",
7579 "Maintain relationships between transactions and contexts and display an extra tree showing context data",
7580 &keep_persistent_data);
7581 prefs_register_bool_preference(h248_module, "desegment",
7582 "Desegment H.248 over TCP",
7583 "Desegment H.248 messages that span more TCP segments",
7584 &h248_desegment);
7586 gcp_msgs = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
7587 gcp_trxs = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
7588 gcp_ctxs_by_trx = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
7589 gcp_ctxs = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
7591 h248_tap = register_tap("h248");
7594 /*--- proto_reg_handoff_h248 -------------------------------------------*/
7595 void proto_reg_handoff_h248(void) {
7597 dissector_add_uint("mtp3.service_indicator", MTP_SI_GCP, h248_handle);
7598 h248_term_handle = find_dissector_add_dependency("h248term", proto_h248);
7599 dissector_add_uint_with_preference("tcp.port", H248_PORT, h248_tpkt_handle);
7600 dissector_add_uint_with_preference("udp.port", H248_PORT, h248_handle);
7602 ss7pc_address_type = address_type_get_by_name("AT_SS7PC");
7603 exported_pdu_tap = find_tap_id(EXPORT_PDU_TAP_NAME_LAYER_7);