2759b5f6b03bfae16b4e81e2ff5f9ebee4c8a377
[obnox/wireshark/wip.git] / epan / dissectors / packet-ansi_tcap.c
1 /* Do not modify this file.                                                   */
2 /* It is created automatically by the ASN.1 to Wireshark dissector compiler   */
3 /* packet-ansi_tcap.c                                                         */
4 /* ../../tools/asn2wrs.py -b -p ansi_tcap -c ./ansi_tcap.cnf -s ./packet-ansi_tcap-template -D . TCAP-Remote-Operations-Information-Objects.asn TCAPPackage.asn */
5
6 /* Input file: packet-ansi_tcap-template.c */
7
8 #line 1 "packet-ansi_tcap-template.c"
9 /* packet-ansi_tcap-template.c
10  * Routines for ANSI TCAP
11  * Copyright 2007 Anders Broman <anders.broman@ericsson.com>
12  * Built from the gsm-map dissector Copyright 2004 - 2005, Anders Broman <anders.broman@ericsson.com>
13  *
14  * $Id$
15  * Wireshark - Network traffic analyzer
16  * By Gerald Combs <gerald@wireshark.org>
17  * Copyright 1998 Gerald Combs
18  *
19  * This program is free software; you can redistribute it and/or
20  * modify it under the terms of the GNU General Public License
21  * as published by the Free Software Foundation; either version 2
22  * of the License, or (at your option) any later version.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program; if not, write to the Free Software
31  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
32  * References: T1.114
33  */
34
35 #ifdef HAVE_CONFIG_H
36 # include "config.h"
37 #endif
38
39 #include <glib.h>
40 #include <epan/packet.h>
41 #include <epan/oids.h>
42 #include <epan/emem.h>
43 #include <epan/asn1.h>
44 #include <epan/strutil.h>
45
46 #include <string.h>
47 #include "packet-ber.h"
48 #include "packet-tcap.h"
49 #include "packet-ansi_tcap.h"
50 #include <epan/tcap-persistentdata.h>
51
52 #define PNAME  "ANSI Transaction Capabilities Application Part"
53 #define PSNAME "ANSI_TCAP"
54 #define PFNAME "ansi_tcap"
55
56 /* Initialize the protocol and registered fields */
57 static int proto_ansi_tcap = -1;
58
59 static int hf_ansi_tcapsrt_SessionId = -1;
60 static int hf_ansi_tcapsrt_Duplicate = -1;
61 static int hf_ansi_tcapsrt_BeginSession = -1;
62 static int hf_ansi_tcapsrt_EndSession = -1;
63 static int hf_ansi_tcapsrt_SessionTime = -1;
64
65
66 /*--- Included file: packet-ansi_tcap-hf.c ---*/
67 #line 1 "packet-ansi_tcap-hf.c"
68 static int hf_ansi_tcap_national = -1;            /* T_national */
69 static int hf_ansi_tcap_private = -1;             /* T_private */
70 static int hf_ansi_tcap_national_01 = -1;         /* INTEGER_M128_127 */
71 static int hf_ansi_tcap_private_01 = -1;          /* INTEGER */
72 static int hf_ansi_tcap_unidirectional = -1;      /* T_unidirectional */
73 static int hf_ansi_tcap_queryWithPerm = -1;       /* T_queryWithPerm */
74 static int hf_ansi_tcap_queryWithoutPerm = -1;    /* T_queryWithoutPerm */
75 static int hf_ansi_tcap_response = -1;            /* T_response */
76 static int hf_ansi_tcap_conversationWithPerm = -1;  /* T_conversationWithPerm */
77 static int hf_ansi_tcap_conversationWithoutPerm = -1;  /* T_conversationWithoutPerm */
78 static int hf_ansi_tcap_abort = -1;               /* T_abort */
79 static int hf_ansi_tcap_identifier = -1;          /* TransactionID */
80 static int hf_ansi_tcap_dialoguePortion = -1;     /* DialoguePortion */
81 static int hf_ansi_tcap_componentPortion = -1;    /* ComponentSequence */
82 static int hf_ansi_tcap_dialogPortion = -1;       /* DialoguePortion */
83 static int hf_ansi_tcap_causeInformation = -1;    /* T_causeInformation */
84 static int hf_ansi_tcap_abortCause = -1;          /* P_Abort_cause */
85 static int hf_ansi_tcap_userInformation = -1;     /* UserAbortInformation */
86 static int hf_ansi_tcap_version = -1;             /* ProtocolVersion */
87 static int hf_ansi_tcap_applicationContext = -1;  /* T_applicationContext */
88 static int hf_ansi_tcap_integerApplicationId = -1;  /* IntegerApplicationContext */
89 static int hf_ansi_tcap_objectApplicationId = -1;  /* ObjectIDApplicationContext */
90 static int hf_ansi_tcap_userInformation_01 = -1;  /* UserInformation */
91 static int hf_ansi_tcap_securityContext = -1;     /* T_securityContext */
92 static int hf_ansi_tcap_integerSecurityId = -1;   /* INTEGER */
93 static int hf_ansi_tcap_objectSecurityId = -1;    /* OBJECT_IDENTIFIER */
94 static int hf_ansi_tcap_confidentiality = -1;     /* Confidentiality */
95 static int hf_ansi_tcap__untag_item = -1;         /* EXTERNAL */
96 static int hf_ansi_tcap_confidentialityId = -1;   /* T_confidentialityId */
97 static int hf_ansi_tcap_integerConfidentialityId = -1;  /* INTEGER */
98 static int hf_ansi_tcap_objectConfidentialityId = -1;  /* OBJECT_IDENTIFIER */
99 static int hf_ansi_tcap__untag_item_01 = -1;      /* ComponentPDU */
100 static int hf_ansi_tcap_invokeLast = -1;          /* Invoke */
101 static int hf_ansi_tcap_returnResultLast = -1;    /* ReturnResult */
102 static int hf_ansi_tcap_returnError = -1;         /* ReturnError */
103 static int hf_ansi_tcap_reject = -1;              /* Reject */
104 static int hf_ansi_tcap_invokeNotLast = -1;       /* Invoke */
105 static int hf_ansi_tcap_returnResultNotLast = -1;  /* ReturnResult */
106 static int hf_ansi_tcap_componentIDs = -1;        /* T_componentIDs */
107 static int hf_ansi_tcap_operationCode = -1;       /* OperationCode */
108 static int hf_ansi_tcap_parameter = -1;           /* T_parameter */
109 static int hf_ansi_tcap_componentID = -1;         /* T_componentID */
110 static int hf_ansi_tcap_parameter_01 = -1;        /* T_parameter_01 */
111 static int hf_ansi_tcap_componentID_01 = -1;      /* T_componentID_01 */
112 static int hf_ansi_tcap_errorCode = -1;           /* ErrorCode */
113 static int hf_ansi_tcap_parameter_02 = -1;        /* T_parameter_02 */
114 static int hf_ansi_tcap_componentID_02 = -1;      /* OCTET_STRING_SIZE_0_1 */
115 static int hf_ansi_tcap_rejectProblem = -1;       /* Problem */
116 static int hf_ansi_tcap_parameter_03 = -1;        /* T_parameter_03 */
117 static int hf_ansi_tcap_paramSequence = -1;       /* T_paramSequence */
118 static int hf_ansi_tcap_paramSet = -1;            /* T_paramSet */
119
120 /*--- End of included file: packet-ansi_tcap-hf.c ---*/
121 #line 58 "packet-ansi_tcap-template.c"
122
123 /* Initialize the subtree pointers */
124 static gint ett_tcap = -1;
125 static gint ett_param = -1;
126
127 static gint ett_otid = -1;
128 static gint ett_dtid = -1;
129 static gint ett_ansi_tcap_stat = -1;
130
131 static struct tcapsrt_info_t * gp_tcapsrt_info;
132 static gboolean tcap_subdissector_used=FALSE;
133
134 static struct tcaphash_context_t * gp_tcap_context=NULL;
135
136
137 /*--- Included file: packet-ansi_tcap-ett.c ---*/
138 #line 1 "packet-ansi_tcap-ett.c"
139 static gint ett_ansi_tcap_OperationCode = -1;
140 static gint ett_ansi_tcap_ErrorCode = -1;
141 static gint ett_ansi_tcap_PackageType = -1;
142 static gint ett_ansi_tcap_UniTransactionPDU = -1;
143 static gint ett_ansi_tcap_TransactionPDU = -1;
144 static gint ett_ansi_tcap_Abort = -1;
145 static gint ett_ansi_tcap_T_causeInformation = -1;
146 static gint ett_ansi_tcap_DialoguePortion_U = -1;
147 static gint ett_ansi_tcap_T_applicationContext = -1;
148 static gint ett_ansi_tcap_T_securityContext = -1;
149 static gint ett_ansi_tcap_UserInformation_U = -1;
150 static gint ett_ansi_tcap_Confidentiality = -1;
151 static gint ett_ansi_tcap_T_confidentialityId = -1;
152 static gint ett_ansi_tcap_SEQUENCE_OF_ComponentPDU = -1;
153 static gint ett_ansi_tcap_ComponentPDU = -1;
154 static gint ett_ansi_tcap_Invoke = -1;
155 static gint ett_ansi_tcap_ReturnResult = -1;
156 static gint ett_ansi_tcap_ReturnError = -1;
157 static gint ett_ansi_tcap_Reject = -1;
158 static gint ett_ansi_tcap_T_parameter_03 = -1;
159 static gint ett_ansi_tcap_T_paramSequence = -1;
160 static gint ett_ansi_tcap_T_paramSet = -1;
161
162 /*--- End of included file: packet-ansi_tcap-ett.c ---*/
163 #line 73 "packet-ansi_tcap-template.c"
164
165 #define MAX_SSN 254
166
167 extern gboolean gtcap_PersistentSRT;
168 extern guint gtcap_RepetitionTimeout;
169 extern guint gtcap_LostTimeout;
170
171 static dissector_table_t ber_oid_dissector_table=NULL;
172 static const char * cur_oid;
173 static const char * tcapext_oid;
174 static proto_tree * tcap_top_tree=NULL;
175 static proto_tree * tcap_stat_tree=NULL;
176 static proto_item * tcap_stat_item=NULL;
177
178 static dissector_handle_t ansi_map_handle;
179
180 struct ansi_tcap_private_t ansi_tcap_private;
181 #define MAX_TID_STR_LEN 1024
182
183 static void ansi_tcap_ctx_init(struct ansi_tcap_private_t *a_tcap_ctx) {
184   memset(a_tcap_ctx, '\0', sizeof(*a_tcap_ctx));
185   a_tcap_ctx->signature = ANSI_TCAP_CTX_SIGNATURE;
186   a_tcap_ctx->oid_is_present = FALSE;
187   a_tcap_ctx->TransactionID_str = NULL;
188 }
189
190 static void dissect_ansi_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree);
191
192 /*
193 static dissector_handle_t tcap_handle = NULL;
194 static dissector_table_t sccp_ssn_table;
195
196 static GHashTable* ansi_sub_dissectors = NULL;
197 static GHashTable* itu_sub_dissectors = NULL;
198
199   extern void add_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) {
200     g_hash_table_insert(ansi_sub_dissectors,GUINT_TO_POINTER(ssn),dissector);
201     dissector_add_uint("sccp.ssn",ssn,tcap_handle);
202 }
203
204 extern void delete_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector _U_) {
205     g_hash_table_remove(ansi_sub_dissectors,GUINT_TO_POINTER(ssn));
206     dissector_delete_uint("sccp.ssn",ssn,tcap_handle);
207 }
208
209 dissector_handle_t get_ansi_tcap_subdissector(guint32 ssn) {
210     return g_hash_table_lookup(ansi_sub_dissectors,GUINT_TO_POINTER(ssn));
211 }
212 */
213
214 /* Transaction tracking */
215 /* Transaction table */
216 struct ansi_tcap_invokedata_t {
217     gint OperationCode;
218       /*
219          0 : national,
220          1 : private
221       */
222     gint32 OperationCode_private;
223     gint32 OperationCode_national;
224 };
225
226 static GHashTable *TransactionId_table=NULL;
227
228 static void
229 TransactionId_table_cleanup(gpointer key , gpointer value, gpointer user_data _U_){
230
231         struct ansi_tcap_invokedata_t *ansi_tcap_saved_invokedata = value;
232         gchar *TransactionId_str = key;
233
234         g_free(TransactionId_str);
235         g_free(ansi_tcap_saved_invokedata);
236
237 }
238
239 void
240 ansi_tcap_init_transaction_table(void){
241
242         /* Destroy any existing memory chunks / hashes. */
243         if (TransactionId_table){
244                 g_hash_table_foreach(TransactionId_table, TransactionId_table_cleanup, NULL);
245                 g_hash_table_destroy(TransactionId_table);
246                 TransactionId_table = NULL;
247         }
248
249         TransactionId_table = g_hash_table_new(g_str_hash, g_str_equal);
250
251 }
252
253 static void
254 ansi_tcap_init_protocol(void)
255 {
256         ansi_tcap_init_transaction_table();
257 }
258
259 /* Store Invoke information needed for the corresponding reply */
260 static void
261 save_invoke_data(packet_info *pinfo, proto_tree *tree _U_, tvbuff_t *tvb _U_){
262   struct ansi_tcap_invokedata_t *ansi_tcap_saved_invokedata;
263   address* src = &(pinfo->src);
264   address* dst = &(pinfo->dst);
265   char *buf;
266
267   if ((!pinfo->fd->flags.visited)&&(ansi_tcap_private.TransactionID_str)){
268
269           /* Only do this once XXX I hope its the right thing to do */
270           /* The hash string needs to contain src and dest to distiguish differnt flows */
271           buf = ep_alloc(MAX_TID_STR_LEN);
272           buf[0] = '\0';
273           g_snprintf(buf, MAX_TID_STR_LEN, "%s%s%s",
274                 ansi_tcap_private.TransactionID_str, ep_address_to_str(src),
275                 ep_address_to_str(dst));
276
277           /* If the entry allready exists don't owervrite it */
278           ansi_tcap_saved_invokedata = g_hash_table_lookup(TransactionId_table,buf);
279           if(ansi_tcap_saved_invokedata)
280                   return;
281
282           ansi_tcap_saved_invokedata = g_malloc(sizeof(struct ansi_tcap_invokedata_t));
283           ansi_tcap_saved_invokedata->OperationCode = ansi_tcap_private.d.OperationCode;
284           ansi_tcap_saved_invokedata->OperationCode_national = ansi_tcap_private.d.OperationCode_national;
285           ansi_tcap_saved_invokedata->OperationCode_private = ansi_tcap_private.d.OperationCode_private;
286
287           g_hash_table_insert(TransactionId_table,
288                         g_strdup(buf),
289                         ansi_tcap_saved_invokedata);
290           /*
291           g_warning("Tcap Invoke Hash string %s",buf);
292           */
293   }
294 }
295
296 static gboolean
297 find_saved_invokedata(packet_info *pinfo, proto_tree *tree _U_, tvbuff_t *tvb _U_){
298   struct ansi_tcap_invokedata_t *ansi_tcap_saved_invokedata;
299   address* src = &(pinfo->src);
300   address* dst = &(pinfo->dst);
301   char *buf;
302
303   if (!ansi_tcap_private.TransactionID_str) {
304     return FALSE;
305   }
306
307   /* The hash string needs to contain src and dest to distiguish differnt flows */
308   buf = ep_alloc(MAX_TID_STR_LEN);
309   buf[0] = '\0';
310   /* Reverse order to invoke */
311   g_snprintf(buf, MAX_TID_STR_LEN, "%s%s%s",
312         ansi_tcap_private.TransactionID_str, ep_address_to_str(dst),
313         ep_address_to_str(src));
314
315   ansi_tcap_saved_invokedata = g_hash_table_lookup(TransactionId_table, buf);
316   if(ansi_tcap_saved_invokedata){
317           ansi_tcap_private.d.OperationCode                      = ansi_tcap_saved_invokedata->OperationCode;
318           ansi_tcap_private.d.OperationCode_national = ansi_tcap_saved_invokedata->OperationCode_national;
319           ansi_tcap_private.d.OperationCode_private  = ansi_tcap_saved_invokedata->OperationCode_private;
320           return TRUE;
321   }
322   return FALSE;
323 }
324
325 /* As currently ANSI MAP is the only possible sub dissector this function
326  *  must be improved to handle general cases.
327  *
328  *
329  *
330  * TODO:
331  * 1)Handle national codes
332  *     Design option
333  *     - Create a ansi.tcap.national dissector table and have dissectors for
334  *       national codes register there and let ansi tcap call them.
335  * 2)Handle Private codes properly
336  *     Design question
337  *     Unclear how to differentiate between different private "code sets".
338  *     Use SCCP SSN table as before? or a ansi.tcap.private dissector table?
339  *
340  */
341 static gboolean
342 find_tcap_subdissector(tvbuff_t *tvb, asn1_ctx_t *actx, proto_tree *tree){
343         proto_item *item;
344
345         /* If "DialoguePortion objectApplicationId ObjectIDApplicationContext
346          * points to the subdissector this code can be used.
347          *
348         if(ansi_tcap_private.d.oid_is_present){
349                 call_ber_oid_callback(ansi_tcap_private.objectApplicationId_oid, tvb, 0, actx-pinfo, tree);
350                 return TRUE;
351         }
352         */
353         if(ansi_tcap_private.d.pdu == 1){
354                 /* Save Invoke data for this transaction */
355                 save_invoke_data(actx->pinfo, tree, tvb);
356         }else{
357                 /* Get saved data for this transaction */
358                 if(find_saved_invokedata(actx->pinfo, tree, tvb)){
359                         if(ansi_tcap_private.d.OperationCode == 0){
360                                 /* national */
361                                 item = proto_tree_add_int(tree, hf_ansi_tcap_national, tvb, 0, 0, ansi_tcap_private.d.OperationCode_national);
362                         }else{
363                                 item = proto_tree_add_int(tree, hf_ansi_tcap_private, tvb, 0, 0, ansi_tcap_private.d.OperationCode_private);
364                         }
365                         PROTO_ITEM_SET_GENERATED(item);
366                         ansi_tcap_private.d.OperationCode_item = item;
367                 }
368         }
369         if(ansi_tcap_private.d.OperationCode == 0){
370                 /* national */
371                 item = proto_tree_add_text(tree, tvb, 0, -1,
372                         "Dissector for ANSI TCAP NATIONAL code:%u not implemented. Contact Wireshark developers if you want this supported",
373                         ansi_tcap_private.d.OperationCode_national);
374                 PROTO_ITEM_SET_GENERATED(item);
375                 return FALSE;
376         }else if(ansi_tcap_private.d.OperationCode == 1){
377                 /* private */
378                 if((ansi_tcap_private.d.OperationCode_private & 0x0900) != 0x0900){
379                         item = proto_tree_add_text(tree, tvb, 0, -1,
380                                 "Dissector for ANSI TCAP PRIVATE code:%u not implemented. Contact Wireshark developers if you want this supported",
381                                 ansi_tcap_private.d.OperationCode_private);
382                         PROTO_ITEM_SET_GENERATED(item);
383                         return FALSE;
384                 }
385         }
386         /* This is abit of a hack as it assumes the private codes with a "family" of 0x09 is ANSI MAP
387          * See TODO above.
388          * N.S0005-0 v 1.0 TCAP Formats and Procedures 5-16 Application Services
389          * 6.3.2 Component Portion
390          * The Operation Code is partitioned into an Operation Family followed by a
391          * Specifier associated with each Operation Family member. For TIA/EIA-41 the
392          * Operation Family is coded as decimal 9. Bit H of the Operation Family is always
393          * coded as 0.
394          */
395         call_dissector(ansi_map_handle, tvb, actx->pinfo, tcap_top_tree);
396
397         return TRUE;
398 }
399
400
401 /*--- Included file: packet-ansi_tcap-fn.c ---*/
402 #line 1 "packet-ansi_tcap-fn.c"
403
404
405 static int
406 dissect_ansi_tcap_T_national(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
407   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
408                                                 &ansi_tcap_private.d.OperationCode_national);
409
410   return offset;
411 }
412
413
414
415 static int
416 dissect_ansi_tcap_T_private(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
417   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
418                                                 &ansi_tcap_private.d.OperationCode_private);
419
420   return offset;
421 }
422
423
424 static const value_string ansi_tcap_OperationCode_vals[] = {
425   {  16, "national" },
426   {  17, "private" },
427   { 0, NULL }
428 };
429
430 static const ber_choice_t OperationCode_choice[] = {
431   {  16, &hf_ansi_tcap_national  , BER_CLASS_PRI, 16, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_national },
432   {  17, &hf_ansi_tcap_private   , BER_CLASS_PRI, 17, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_private },
433   { 0, NULL, 0, 0, 0, NULL }
434 };
435
436 static int
437 dissect_ansi_tcap_OperationCode(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
438   offset = dissect_ber_choice(actx, tree, tvb, offset,
439                                  OperationCode_choice, hf_index, ett_ansi_tcap_OperationCode,
440                                  &ansi_tcap_private.d.OperationCode);
441
442 #line 17 "ansi_tcap.cnf"
443   ansi_tcap_private.d.OperationCode_item = actx->created_item;
444
445   return offset;
446 }
447
448
449
450 static int
451 dissect_ansi_tcap_INTEGER_M128_127(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
452   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
453                                                 NULL);
454
455   return offset;
456 }
457
458
459
460 static int
461 dissect_ansi_tcap_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
462   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
463                                                 NULL);
464
465   return offset;
466 }
467
468
469 static const value_string ansi_tcap_ErrorCode_vals[] = {
470   {  19, "national" },
471   {  20, "private" },
472   { 0, NULL }
473 };
474
475 static const ber_choice_t ErrorCode_choice[] = {
476   {  19, &hf_ansi_tcap_national_01, BER_CLASS_PRI, 19, 0, dissect_ansi_tcap_INTEGER_M128_127 },
477   {  20, &hf_ansi_tcap_private_01, BER_CLASS_PRI, 20, 0, dissect_ansi_tcap_INTEGER },
478   { 0, NULL, 0, 0, 0, NULL }
479 };
480
481 static int
482 dissect_ansi_tcap_ErrorCode(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
483   offset = dissect_ber_choice(actx, tree, tvb, offset,
484                                  ErrorCode_choice, hf_index, ett_ansi_tcap_ErrorCode,
485                                  NULL);
486
487   return offset;
488 }
489
490
491
492 static int
493 dissect_ansi_tcap_TransactionID_U(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
494 #line 90 "ansi_tcap.cnf"
495
496 tvbuff_t *next_tvb;
497 guint8 len;
498
499   offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
500                                        &next_tvb);
501
502
503 if(next_tvb) {
504         len = tvb_length_remaining(next_tvb, 0);
505         if(len !=0){
506                 /* 0 octets for the Unidirectional, 
507                  * 4 octets for Query, Response & Abort
508                  * 8 octets for Conversation in the order Originating then Responding TID
509                  * 
510                  * In order to match this it seems like we should only use the last 4 octets
511                  * in the 8 octets case.
512                  */
513                 if (len > 4){
514                         ansi_tcap_private.TransactionID_str = tvb_bytes_to_str(next_tvb, 4,len-4);
515                 }else{
516                         ansi_tcap_private.TransactionID_str = tvb_bytes_to_str(next_tvb, 0,len);
517                 }
518         }
519         switch(len) {
520         case 1:
521                 gp_tcapsrt_info->src_tid=tvb_get_guint8(next_tvb, 0);
522                 break;
523         case 2:
524                 gp_tcapsrt_info->src_tid=tvb_get_ntohs(next_tvb, 0);
525                 break;
526         case 4:
527                 gp_tcapsrt_info->src_tid=tvb_get_ntohl(next_tvb, 0);
528                 break;
529         default:
530                 gp_tcapsrt_info->src_tid=0;
531                 break;
532         }
533 }
534
535
536
537   return offset;
538 }
539
540
541
542 static int
543 dissect_ansi_tcap_TransactionID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
544   offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
545                                       hf_index, BER_CLASS_PRI, 7, TRUE, dissect_ansi_tcap_TransactionID_U);
546
547   return offset;
548 }
549
550
551
552 static int
553 dissect_ansi_tcap_OCTET_STRING_SIZE_1(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
554   offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
555                                        NULL);
556
557   return offset;
558 }
559
560
561
562 static int
563 dissect_ansi_tcap_ProtocolVersion(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
564   offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
565                                       hf_index, BER_CLASS_PRI, 26, TRUE, dissect_ansi_tcap_OCTET_STRING_SIZE_1);
566
567   return offset;
568 }
569
570
571
572 static int
573 dissect_ansi_tcap_IntegerApplicationContext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
574   offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
575                                       hf_index, BER_CLASS_PRI, 27, TRUE, dissect_ansi_tcap_INTEGER);
576
577   return offset;
578 }
579
580
581
582 static int
583 dissect_ansi_tcap_OBJECT_IDENTIFIER(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
584   offset = dissect_ber_object_identifier(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
585
586   return offset;
587 }
588
589
590
591 static int
592 dissect_ansi_tcap_ObjectIDApplicationContext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
593 #line 54 "ansi_tcap.cnf"
594
595  static const char * oid_str;
596
597    offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
598                                       hf_index, BER_CLASS_PRI, 28, TRUE, dissect_ansi_tcap_OBJECT_IDENTIFIER);
599
600         ansi_tcap_private.objectApplicationId_oid= (void*) oid_str;
601         ansi_tcap_private.oid_is_present=TRUE;
602
603
604
605   return offset;
606 }
607
608
609 static const value_string ansi_tcap_T_applicationContext_vals[] = {
610   {  27, "integerApplicationId" },
611   {  28, "objectApplicationId" },
612   { 0, NULL }
613 };
614
615 static const ber_choice_t T_applicationContext_choice[] = {
616   {  27, &hf_ansi_tcap_integerApplicationId, BER_CLASS_PRI, 27, BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_IntegerApplicationContext },
617   {  28, &hf_ansi_tcap_objectApplicationId, BER_CLASS_PRI, 28, BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_ObjectIDApplicationContext },
618   { 0, NULL, 0, 0, 0, NULL }
619 };
620
621 static int
622 dissect_ansi_tcap_T_applicationContext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
623   offset = dissect_ber_choice(actx, tree, tvb, offset,
624                                  T_applicationContext_choice, hf_index, ett_ansi_tcap_T_applicationContext,
625                                  NULL);
626
627   return offset;
628 }
629
630
631
632 static int
633 dissect_ansi_tcap_EXTERNAL(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
634   offset = dissect_ber_external_type(implicit_tag, tree, tvb, offset, actx, hf_index, NULL);
635
636   return offset;
637 }
638
639
640 static const ber_sequence_t UserInformation_U_sequence_of[1] = {
641   { &hf_ansi_tcap__untag_item, BER_CLASS_UNI, BER_UNI_TAG_EXTERNAL, BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_EXTERNAL },
642 };
643
644 static int
645 dissect_ansi_tcap_UserInformation_U(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
646   offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
647                                       UserInformation_U_sequence_of, hf_index, ett_ansi_tcap_UserInformation_U);
648
649   return offset;
650 }
651
652
653
654 static int
655 dissect_ansi_tcap_UserInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
656   offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
657                                       hf_index, BER_CLASS_PRI, 29, TRUE, dissect_ansi_tcap_UserInformation_U);
658
659   return offset;
660 }
661
662
663 static const value_string ansi_tcap_T_securityContext_vals[] = {
664   {   0, "integerSecurityId" },
665   {   1, "objectSecurityId" },
666   { 0, NULL }
667 };
668
669 static const ber_choice_t T_securityContext_choice[] = {
670   {   0, &hf_ansi_tcap_integerSecurityId, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_INTEGER },
671   {   1, &hf_ansi_tcap_objectSecurityId, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_OBJECT_IDENTIFIER },
672   { 0, NULL, 0, 0, 0, NULL }
673 };
674
675 static int
676 dissect_ansi_tcap_T_securityContext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
677   offset = dissect_ber_choice(actx, tree, tvb, offset,
678                                  T_securityContext_choice, hf_index, ett_ansi_tcap_T_securityContext,
679                                  NULL);
680
681   return offset;
682 }
683
684
685 static const value_string ansi_tcap_T_confidentialityId_vals[] = {
686   {   0, "integerConfidentialityId" },
687   {   1, "objectConfidentialityId" },
688   { 0, NULL }
689 };
690
691 static const ber_choice_t T_confidentialityId_choice[] = {
692   {   0, &hf_ansi_tcap_integerConfidentialityId, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_INTEGER },
693   {   1, &hf_ansi_tcap_objectConfidentialityId, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_OBJECT_IDENTIFIER },
694   { 0, NULL, 0, 0, 0, NULL }
695 };
696
697 static int
698 dissect_ansi_tcap_T_confidentialityId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
699   offset = dissect_ber_choice(actx, tree, tvb, offset,
700                                  T_confidentialityId_choice, hf_index, ett_ansi_tcap_T_confidentialityId,
701                                  NULL);
702
703   return offset;
704 }
705
706
707 static const ber_sequence_t Confidentiality_sequence[] = {
708   { &hf_ansi_tcap_confidentialityId, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ansi_tcap_T_confidentialityId },
709   { NULL, 0, 0, 0, NULL }
710 };
711
712 static int
713 dissect_ansi_tcap_Confidentiality(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
714   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
715                                    Confidentiality_sequence, hf_index, ett_ansi_tcap_Confidentiality);
716
717   return offset;
718 }
719
720
721 static const ber_sequence_t DialoguePortion_U_sequence[] = {
722   { &hf_ansi_tcap_version   , BER_CLASS_PRI, 26, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_ProtocolVersion },
723   { &hf_ansi_tcap_applicationContext, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ansi_tcap_T_applicationContext },
724   { &hf_ansi_tcap_userInformation_01, BER_CLASS_PRI, 29, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_UserInformation },
725   { &hf_ansi_tcap_securityContext, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ansi_tcap_T_securityContext },
726   { &hf_ansi_tcap_confidentiality, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_ansi_tcap_Confidentiality },
727   { NULL, 0, 0, 0, NULL }
728 };
729
730 static int
731 dissect_ansi_tcap_DialoguePortion_U(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
732   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
733                                    DialoguePortion_U_sequence, hf_index, ett_ansi_tcap_DialoguePortion_U);
734
735   return offset;
736 }
737
738
739
740 static int
741 dissect_ansi_tcap_DialoguePortion(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
742   offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
743                                       hf_index, BER_CLASS_PRI, 25, TRUE, dissect_ansi_tcap_DialoguePortion_U);
744
745   return offset;
746 }
747
748
749
750 static int
751 dissect_ansi_tcap_T_componentIDs(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
752   offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
753                                        NULL);
754
755   return offset;
756 }
757
758
759
760 static int
761 dissect_ansi_tcap_T_parameter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
762 #line 23 "ansi_tcap.cnf"
763
764   if(find_tcap_subdissector(tvb, actx, tree))
765     offset = tvb_length(tvb);
766   
767
768
769
770   return offset;
771 }
772
773
774 static const ber_sequence_t Invoke_sequence[] = {
775   { &hf_ansi_tcap_componentIDs, BER_CLASS_PRI, 15, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_componentIDs },
776   { &hf_ansi_tcap_operationCode, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ansi_tcap_OperationCode },
777   { &hf_ansi_tcap_parameter , BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_T_parameter },
778   { NULL, 0, 0, 0, NULL }
779 };
780
781 static int
782 dissect_ansi_tcap_Invoke(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
783 #line 29 "ansi_tcap.cnf"
784   ansi_tcap_private.d.pdu = 1;
785
786
787
788   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
789                                    Invoke_sequence, hf_index, ett_ansi_tcap_Invoke);
790
791   return offset;
792 }
793
794
795
796 static int
797 dissect_ansi_tcap_T_componentID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
798   offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
799                                        NULL);
800
801   return offset;
802 }
803
804
805
806 static int
807 dissect_ansi_tcap_T_parameter_01(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
808 #line 36 "ansi_tcap.cnf"
809   if(find_tcap_subdissector(tvb, actx, tree))
810     offset = tvb_length(tvb);
811
812
813
814   return offset;
815 }
816
817
818 static const ber_sequence_t ReturnResult_sequence[] = {
819   { &hf_ansi_tcap_componentID, BER_CLASS_PRI, 15, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_componentID },
820   { &hf_ansi_tcap_parameter_01, BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_T_parameter_01 },
821   { NULL, 0, 0, 0, NULL }
822 };
823
824 static int
825 dissect_ansi_tcap_ReturnResult(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
826 #line 40 "ansi_tcap.cnf"
827   ansi_tcap_private.d.pdu = 2;
828
829
830
831
832   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
833                                    ReturnResult_sequence, hf_index, ett_ansi_tcap_ReturnResult);
834
835   return offset;
836 }
837
838
839
840 static int
841 dissect_ansi_tcap_T_componentID_01(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
842   offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
843                                        NULL);
844
845   return offset;
846 }
847
848
849
850 static int
851 dissect_ansi_tcap_T_parameter_02(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
852 #line 46 "ansi_tcap.cnf"
853   if(find_tcap_subdissector(tvb, actx, tree))
854     offset = tvb_length(tvb);
855
856
857
858   return offset;
859 }
860
861
862 static const ber_sequence_t ReturnError_sequence[] = {
863   { &hf_ansi_tcap_componentID_01, BER_CLASS_PRI, 15, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_componentID_01 },
864   { &hf_ansi_tcap_errorCode , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ansi_tcap_ErrorCode },
865   { &hf_ansi_tcap_parameter_02, BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_T_parameter_02 },
866   { NULL, 0, 0, 0, NULL }
867 };
868
869 static int
870 dissect_ansi_tcap_ReturnError(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
871 #line 50 "ansi_tcap.cnf"
872   ansi_tcap_private.d.pdu = 3;
873
874
875   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
876                                    ReturnError_sequence, hf_index, ett_ansi_tcap_ReturnError);
877
878   return offset;
879 }
880
881
882
883 static int
884 dissect_ansi_tcap_OCTET_STRING_SIZE_0_1(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
885   offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
886                                        NULL);
887
888   return offset;
889 }
890
891
892 static const value_string ansi_tcap_Problem_vals[] = {
893   { 257, "general-unrecognisedComponentType" },
894   { 258, "general-incorrectComponentPortion" },
895   { 259, "general-badlyStructuredCompPortion" },
896   { 260, "general-incorrectComponentCoding" },
897   { 513, "invoke-duplicateInvocation" },
898   { 514, "invoke-unrecognisedOperation" },
899   { 515, "invoke-incorrectParameter" },
900   { 516, "invoke-unrecognisedCorrelationID" },
901   { 769, "returnResult-unrecognisedCorrelationID" },
902   { 770, "returnResult-unexpectedReturnResult" },
903   { 771, "returnResult-incorrectParameter" },
904   { 1025, "returnError-unrecognisedCorrelationID" },
905   { 1026, "returnError-unexpectedReturnError" },
906   { 1027, "returnError-unrecognisedError" },
907   { 1028, "returnError-unexpectedError" },
908   { 1029, "returnError-incorrectParameter" },
909   { 1281, "transaction-unrecognizedPackageType" },
910   { 1282, "transaction-incorrectTransPortion" },
911   { 1283, "transaction-badlyStructuredTransPortion" },
912   { 1284, "transaction-unassignedRespondingTransID" },
913   { 1285, "transaction-permissionToReleaseProblem" },
914   { 1286, "transaction-resourceUnavailable" },
915   { 0, NULL }
916 };
917
918
919 static int
920 dissect_ansi_tcap_Problem(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
921   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
922                                                 NULL);
923
924   return offset;
925 }
926
927
928 static const ber_sequence_t T_paramSequence_sequence[] = {
929   { NULL, 0, 0, 0, NULL }
930 };
931
932 static int
933 dissect_ansi_tcap_T_paramSequence(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
934   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
935                                    T_paramSequence_sequence, hf_index, ett_ansi_tcap_T_paramSequence);
936
937   return offset;
938 }
939
940
941 static const ber_sequence_t T_paramSet_set[] = {
942   { NULL, 0, 0, 0, NULL }
943 };
944
945 static int
946 dissect_ansi_tcap_T_paramSet(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
947   offset = dissect_ber_set(implicit_tag, actx, tree, tvb, offset,
948                               T_paramSet_set, hf_index, ett_ansi_tcap_T_paramSet);
949
950   return offset;
951 }
952
953
954 static const value_string ansi_tcap_T_parameter_03_vals[] = {
955   {  16, "paramSequence" },
956   {  18, "paramSet" },
957   { 0, NULL }
958 };
959
960 static const ber_choice_t T_parameter_03_choice[] = {
961   {  16, &hf_ansi_tcap_paramSequence, BER_CLASS_PRI, 16, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_paramSequence },
962   {  18, &hf_ansi_tcap_paramSet  , BER_CLASS_PRI, 18, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_paramSet },
963   { 0, NULL, 0, 0, 0, NULL }
964 };
965
966 static int
967 dissect_ansi_tcap_T_parameter_03(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
968   offset = dissect_ber_choice(actx, tree, tvb, offset,
969                                  T_parameter_03_choice, hf_index, ett_ansi_tcap_T_parameter_03,
970                                  NULL);
971
972   return offset;
973 }
974
975
976 static const ber_sequence_t Reject_sequence[] = {
977   { &hf_ansi_tcap_componentID_02, BER_CLASS_PRI, 15, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_OCTET_STRING_SIZE_0_1 },
978   { &hf_ansi_tcap_rejectProblem, BER_CLASS_PRI, 21, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_Problem },
979   { &hf_ansi_tcap_parameter_03, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ansi_tcap_T_parameter_03 },
980   { NULL, 0, 0, 0, NULL }
981 };
982
983 static int
984 dissect_ansi_tcap_Reject(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
985   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
986                                    Reject_sequence, hf_index, ett_ansi_tcap_Reject);
987
988   return offset;
989 }
990
991
992 static const value_string ansi_tcap_ComponentPDU_vals[] = {
993   {   9, "invokeLast" },
994   {  10, "returnResultLast" },
995   {  11, "returnError" },
996   {  12, "reject" },
997   {  13, "invokeNotLast" },
998   {  14, "returnResultNotLast" },
999   { 0, NULL }
1000 };
1001
1002 static const ber_choice_t ComponentPDU_choice[] = {
1003   {   9, &hf_ansi_tcap_invokeLast, BER_CLASS_PRI, 9, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_Invoke },
1004   {  10, &hf_ansi_tcap_returnResultLast, BER_CLASS_PRI, 10, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_ReturnResult },
1005   {  11, &hf_ansi_tcap_returnError, BER_CLASS_PRI, 11, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_ReturnError },
1006   {  12, &hf_ansi_tcap_reject    , BER_CLASS_PRI, 12, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_Reject },
1007   {  13, &hf_ansi_tcap_invokeNotLast, BER_CLASS_PRI, 13, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_Invoke },
1008   {  14, &hf_ansi_tcap_returnResultNotLast, BER_CLASS_PRI, 14, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_ReturnResult },
1009   { 0, NULL, 0, 0, 0, NULL }
1010 };
1011
1012 static int
1013 dissect_ansi_tcap_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1014   offset = dissect_ber_choice(actx, tree, tvb, offset,
1015                                  ComponentPDU_choice, hf_index, ett_ansi_tcap_ComponentPDU,
1016                                  NULL);
1017
1018   return offset;
1019 }
1020
1021
1022 static const ber_sequence_t SEQUENCE_OF_ComponentPDU_sequence_of[1] = {
1023   { &hf_ansi_tcap__untag_item_01, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ansi_tcap_ComponentPDU },
1024 };
1025
1026 static int
1027 dissect_ansi_tcap_SEQUENCE_OF_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1028   offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
1029                                       SEQUENCE_OF_ComponentPDU_sequence_of, hf_index, ett_ansi_tcap_SEQUENCE_OF_ComponentPDU);
1030
1031   return offset;
1032 }
1033
1034
1035
1036 static int
1037 dissect_ansi_tcap_ComponentSequence(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1038   offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1039                                       hf_index, BER_CLASS_PRI, 8, TRUE, dissect_ansi_tcap_SEQUENCE_OF_ComponentPDU);
1040
1041   return offset;
1042 }
1043
1044
1045 static const ber_sequence_t UniTransactionPDU_sequence[] = {
1046   { &hf_ansi_tcap_identifier, BER_CLASS_PRI, 7, BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_TransactionID },
1047   { &hf_ansi_tcap_dialoguePortion, BER_CLASS_PRI, 25, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_DialoguePortion },
1048   { &hf_ansi_tcap_componentPortion, BER_CLASS_PRI, 8, BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_ComponentSequence },
1049   { NULL, 0, 0, 0, NULL }
1050 };
1051
1052 static int
1053 dissect_ansi_tcap_UniTransactionPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1054   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1055                                    UniTransactionPDU_sequence, hf_index, ett_ansi_tcap_UniTransactionPDU);
1056
1057   return offset;
1058 }
1059
1060
1061
1062 static int
1063 dissect_ansi_tcap_T_unidirectional(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1064 #line 62 "ansi_tcap.cnf"
1065 gp_tcapsrt_info->ope=TC_ANSI_ALL;
1066 col_set_str(actx->pinfo->cinfo, COL_INFO, "unidirectional ");
1067
1068
1069   offset = dissect_ansi_tcap_UniTransactionPDU(implicit_tag, tvb, offset, actx, tree, hf_index);
1070
1071   return offset;
1072 }
1073
1074
1075 static const ber_sequence_t TransactionPDU_sequence[] = {
1076   { &hf_ansi_tcap_identifier, BER_CLASS_PRI, 7, BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_TransactionID },
1077   { &hf_ansi_tcap_dialoguePortion, BER_CLASS_PRI, 25, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_DialoguePortion },
1078   { &hf_ansi_tcap_componentPortion, BER_CLASS_PRI, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_ComponentSequence },
1079   { NULL, 0, 0, 0, NULL }
1080 };
1081
1082 static int
1083 dissect_ansi_tcap_TransactionPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1084   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1085                                    TransactionPDU_sequence, hf_index, ett_ansi_tcap_TransactionPDU);
1086
1087   return offset;
1088 }
1089
1090
1091
1092 static int
1093 dissect_ansi_tcap_T_queryWithPerm(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1094 #line 66 "ansi_tcap.cnf"
1095 gp_tcapsrt_info->ope=TC_ANSI_ALL;
1096 col_set_str(actx->pinfo->cinfo, COL_INFO, "queryWithPerm ");
1097
1098
1099   offset = dissect_ansi_tcap_TransactionPDU(implicit_tag, tvb, offset, actx, tree, hf_index);
1100
1101   return offset;
1102 }
1103
1104
1105
1106 static int
1107 dissect_ansi_tcap_T_queryWithoutPerm(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1108 #line 70 "ansi_tcap.cnf"
1109 gp_tcapsrt_info->ope=TC_ANSI_ALL;
1110 col_set_str(actx->pinfo->cinfo, COL_INFO, "queryWithoutPerm ");
1111
1112
1113   offset = dissect_ansi_tcap_TransactionPDU(implicit_tag, tvb, offset, actx, tree, hf_index);
1114
1115   return offset;
1116 }
1117
1118
1119
1120 static int
1121 dissect_ansi_tcap_T_response(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1122 #line 74 "ansi_tcap.cnf"
1123 gp_tcapsrt_info->ope=TC_ANSI_ALL;
1124 col_set_str(actx->pinfo->cinfo, COL_INFO, "response ");
1125
1126
1127   offset = dissect_ansi_tcap_TransactionPDU(implicit_tag, tvb, offset, actx, tree, hf_index);
1128
1129   return offset;
1130 }
1131
1132
1133
1134 static int
1135 dissect_ansi_tcap_T_conversationWithPerm(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1136 #line 78 "ansi_tcap.cnf"
1137 gp_tcapsrt_info->ope=TC_ANSI_ALL;
1138 col_set_str(actx->pinfo->cinfo, COL_INFO, "conversationWithPerm ");
1139
1140
1141   offset = dissect_ansi_tcap_TransactionPDU(implicit_tag, tvb, offset, actx, tree, hf_index);
1142
1143   return offset;
1144 }
1145
1146
1147
1148 static int
1149 dissect_ansi_tcap_T_conversationWithoutPerm(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1150 #line 82 "ansi_tcap.cnf"
1151 gp_tcapsrt_info->ope=TC_ANSI_ALL;
1152 col_set_str(actx->pinfo->cinfo, COL_INFO, "conversationWithoutPerm ");
1153
1154
1155   offset = dissect_ansi_tcap_TransactionPDU(implicit_tag, tvb, offset, actx, tree, hf_index);
1156
1157   return offset;
1158 }
1159
1160
1161 static const value_string ansi_tcap_P_Abort_cause_U_vals[] = {
1162   {   1, "unrecognizedPackageType" },
1163   {   2, "incorrectTransactionPortion" },
1164   {   3, "badlyStructuredTransactionPortion" },
1165   {   4, "unassignedRespondingTransactionID" },
1166   {   5, "permissionToReleaseProblem" },
1167   {   6, "resourceUnavailable" },
1168   {   7, "unrecognizedDialoguePortionID" },
1169   {   8, "badlyStructuredDialoguePortion" },
1170   {   9, "missingDialoguePortion" },
1171   {  10, "inconsistentDialoguePortion" },
1172   { 0, NULL }
1173 };
1174
1175
1176 static int
1177 dissect_ansi_tcap_P_Abort_cause_U(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1178   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
1179                                                 NULL);
1180
1181   return offset;
1182 }
1183
1184
1185
1186 static int
1187 dissect_ansi_tcap_P_Abort_cause(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1188   offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1189                                       hf_index, BER_CLASS_PRI, 23, TRUE, dissect_ansi_tcap_P_Abort_cause_U);
1190
1191   return offset;
1192 }
1193
1194
1195
1196 static int
1197 dissect_ansi_tcap_UserAbortInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1198   offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1199                                       hf_index, BER_CLASS_PRI, 24, FALSE, dissect_ansi_tcap_EXTERNAL);
1200
1201   return offset;
1202 }
1203
1204
1205 static const value_string ansi_tcap_T_causeInformation_vals[] = {
1206   {  23, "abortCause" },
1207   {  24, "userInformation" },
1208   { 0, NULL }
1209 };
1210
1211 static const ber_choice_t T_causeInformation_choice[] = {
1212   {  23, &hf_ansi_tcap_abortCause, BER_CLASS_PRI, 23, BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_P_Abort_cause },
1213   {  24, &hf_ansi_tcap_userInformation, BER_CLASS_PRI, 24, BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_UserAbortInformation },
1214   { 0, NULL, 0, 0, 0, NULL }
1215 };
1216
1217 static int
1218 dissect_ansi_tcap_T_causeInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1219   offset = dissect_ber_choice(actx, tree, tvb, offset,
1220                                  T_causeInformation_choice, hf_index, ett_ansi_tcap_T_causeInformation,
1221                                  NULL);
1222
1223   return offset;
1224 }
1225
1226
1227 static const ber_sequence_t Abort_sequence[] = {
1228   { &hf_ansi_tcap_identifier, BER_CLASS_PRI, 7, BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_TransactionID },
1229   { &hf_ansi_tcap_dialogPortion, BER_CLASS_PRI, 25, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansi_tcap_DialoguePortion },
1230   { &hf_ansi_tcap_causeInformation, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ansi_tcap_T_causeInformation },
1231   { NULL, 0, 0, 0, NULL }
1232 };
1233
1234 static int
1235 dissect_ansi_tcap_Abort(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1236   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1237                                    Abort_sequence, hf_index, ett_ansi_tcap_Abort);
1238
1239   return offset;
1240 }
1241
1242
1243
1244 static int
1245 dissect_ansi_tcap_T_abort(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1246 #line 86 "ansi_tcap.cnf"
1247 gp_tcapsrt_info->ope=TC_ANSI_ABORT;
1248 col_set_str(actx->pinfo->cinfo, COL_INFO, "Abort ");
1249
1250
1251   offset = dissect_ansi_tcap_Abort(implicit_tag, tvb, offset, actx, tree, hf_index);
1252
1253   return offset;
1254 }
1255
1256
1257 static const value_string ansi_tcap_PackageType_vals[] = {
1258   {   1, "unidirectional" },
1259   {   2, "queryWithPerm" },
1260   {   3, "queryWithoutPerm" },
1261   {   4, "response" },
1262   {   5, "conversationWithPerm" },
1263   {   6, "conversationWithoutPerm" },
1264   {  22, "abort" },
1265   { 0, NULL }
1266 };
1267
1268 static const ber_choice_t PackageType_choice[] = {
1269   {   1, &hf_ansi_tcap_unidirectional, BER_CLASS_PRI, 1, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_unidirectional },
1270   {   2, &hf_ansi_tcap_queryWithPerm, BER_CLASS_PRI, 2, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_queryWithPerm },
1271   {   3, &hf_ansi_tcap_queryWithoutPerm, BER_CLASS_PRI, 3, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_queryWithoutPerm },
1272   {   4, &hf_ansi_tcap_response  , BER_CLASS_PRI, 4, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_response },
1273   {   5, &hf_ansi_tcap_conversationWithPerm, BER_CLASS_PRI, 5, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_conversationWithPerm },
1274   {   6, &hf_ansi_tcap_conversationWithoutPerm, BER_CLASS_PRI, 6, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_conversationWithoutPerm },
1275   {  22, &hf_ansi_tcap_abort     , BER_CLASS_PRI, 22, BER_FLAGS_IMPLTAG, dissect_ansi_tcap_T_abort },
1276   { 0, NULL, 0, 0, 0, NULL }
1277 };
1278
1279 static int
1280 dissect_ansi_tcap_PackageType(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1281   offset = dissect_ber_choice(actx, tree, tvb, offset,
1282                                  PackageType_choice, hf_index, ett_ansi_tcap_PackageType,
1283                                  NULL);
1284
1285   return offset;
1286 }
1287
1288
1289 /*--- End of included file: packet-ansi_tcap-fn.c ---*/
1290 #line 310 "packet-ansi_tcap-template.c"
1291
1292
1293
1294
1295 static void
1296 dissect_ansi_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
1297 {
1298     proto_item          *item=NULL;
1299     proto_tree          *tree=NULL;
1300 #if 0
1301     proto_item          *stat_item=NULL;
1302     proto_tree          *stat_tree=NULL;
1303         gint                    offset = 0;
1304     struct tcaphash_context_t * p_tcap_context;
1305     dissector_handle_t subdissector_handle;
1306 #endif
1307         asn1_ctx_t asn1_ctx;
1308
1309         asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1310         ansi_tcap_ctx_init(&ansi_tcap_private);
1311
1312     tcap_top_tree = parent_tree;
1313     col_set_str(pinfo->cinfo, COL_PROTOCOL, "ANSI TCAP");
1314
1315     /* create display subtree for the protocol */
1316     if(parent_tree){
1317       item = proto_tree_add_item(parent_tree, proto_ansi_tcap, tvb, 0, -1, FALSE);
1318       tree = proto_item_add_subtree(item, ett_tcap);
1319       tcap_stat_item=item;
1320       tcap_stat_tree=tree;
1321     }
1322     cur_oid = NULL;
1323     tcapext_oid = NULL;
1324
1325     pinfo->private_data = &ansi_tcap_private;
1326     gp_tcapsrt_info=tcapsrt_razinfo();
1327     tcap_subdissector_used=FALSE;
1328     gp_tcap_context=NULL;
1329     dissect_ansi_tcap_PackageType(FALSE, tvb, 0, &asn1_ctx, tree, -1);
1330
1331 #if 0 /* Skip this part for now it will be rewritten */
1332     if (g_ansi_tcap_HandleSRT && !tcap_subdissector_used ) {
1333                 if (gtcap_DisplaySRT && tree) {
1334                         stat_item = proto_tree_add_text(tree, tvb, 0, 0, "Stat");
1335                         PROTO_ITEM_SET_GENERATED(stat_item);
1336                         stat_tree = proto_item_add_subtree(stat_item, ett_ansi_tcap_stat);
1337                 }
1338                 p_tcap_context=tcapsrt_call_matching(tvb, pinfo, stat_tree, gp_tcapsrt_info);
1339                 ansi_tcap_private.context=p_tcap_context;
1340
1341                 /* If the current message is TCAP only,
1342                  * save the Application contexte name for the next messages
1343                  */
1344                 if ( p_tcap_context && cur_oid && !p_tcap_context->oid_present ) {
1345                         /* Save the application context and the sub dissector */
1346                         g_strlcpy(p_tcap_context->oid, cur_oid, sizeof(p_tcap_context->oid));
1347                         if ( (subdissector_handle = dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
1348                                 p_tcap_context->subdissector_handle=subdissector_handle;
1349                                 p_tcap_context->oid_present=TRUE;
1350                         }
1351                 }
1352                 if (g_ansi_tcap_HandleSRT && p_tcap_context && p_tcap_context->callback) {
1353                         /* Callback fonction for the upper layer */
1354                         (p_tcap_context->callback)(tvb, pinfo, stat_tree, p_tcap_context);
1355                 }
1356         }
1357 #endif
1358 }
1359
1360
1361 void
1362 proto_reg_handoff_ansi_tcap(void)
1363 {
1364
1365         ansi_map_handle = find_dissector("ansi_map");
1366         ber_oid_dissector_table = find_dissector_table("ber.oid");
1367 }
1368
1369
1370
1371 void
1372 proto_register_ansi_tcap(void)
1373 {
1374
1375 /* Setup list of header fields  See Section 1.6.1 for details*/
1376     static hf_register_info hf[] = {
1377         /* Tcap Service Response Time */
1378         { &hf_ansi_tcapsrt_SessionId,
1379           { "Session Id",
1380             "ansi_tcap.srt.session_id",
1381             FT_UINT32, BASE_DEC, NULL, 0x0,
1382             NULL, HFILL }
1383         },
1384         { &hf_ansi_tcapsrt_BeginSession,
1385           { "Begin Session",
1386             "ansi_tcap.srt.begin",
1387             FT_FRAMENUM, BASE_NONE, NULL, 0x0,
1388             "SRT Begin of Session", HFILL }
1389         },
1390         { &hf_ansi_tcapsrt_EndSession,
1391           { "End Session",
1392             "ansi_tcap.srt.end",
1393             FT_FRAMENUM, BASE_NONE, NULL, 0x0,
1394             "SRT End of Session", HFILL }
1395         },
1396         { &hf_ansi_tcapsrt_SessionTime,
1397           { "Session duration",
1398             "ansi_tcap.srt.sessiontime",
1399             FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0,
1400             "Duration of the TCAP session", HFILL }
1401         },
1402         { &hf_ansi_tcapsrt_Duplicate,
1403           { "Request Duplicate",
1404             "ansi_tcap.srt.duplicate",
1405             FT_UINT32, BASE_DEC, NULL, 0x0,
1406             NULL, HFILL }
1407         },
1408
1409 /*--- Included file: packet-ansi_tcap-hfarr.c ---*/
1410 #line 1 "packet-ansi_tcap-hfarr.c"
1411     { &hf_ansi_tcap_national,
1412       { "national", "ansi_tcap.national",
1413         FT_INT32, BASE_DEC, NULL, 0,
1414         NULL, HFILL }},
1415     { &hf_ansi_tcap_private,
1416       { "private", "ansi_tcap.private",
1417         FT_INT32, BASE_DEC, NULL, 0,
1418         NULL, HFILL }},
1419     { &hf_ansi_tcap_national_01,
1420       { "national", "ansi_tcap.national",
1421         FT_INT32, BASE_DEC, NULL, 0,
1422         "INTEGER_M128_127", HFILL }},
1423     { &hf_ansi_tcap_private_01,
1424       { "private", "ansi_tcap.private",
1425         FT_INT32, BASE_DEC, NULL, 0,
1426         "INTEGER", HFILL }},
1427     { &hf_ansi_tcap_unidirectional,
1428       { "unidirectional", "ansi_tcap.unidirectional",
1429         FT_NONE, BASE_NONE, NULL, 0,
1430         NULL, HFILL }},
1431     { &hf_ansi_tcap_queryWithPerm,
1432       { "queryWithPerm", "ansi_tcap.queryWithPerm",
1433         FT_NONE, BASE_NONE, NULL, 0,
1434         NULL, HFILL }},
1435     { &hf_ansi_tcap_queryWithoutPerm,
1436       { "queryWithoutPerm", "ansi_tcap.queryWithoutPerm",
1437         FT_NONE, BASE_NONE, NULL, 0,
1438         NULL, HFILL }},
1439     { &hf_ansi_tcap_response,
1440       { "response", "ansi_tcap.response",
1441         FT_NONE, BASE_NONE, NULL, 0,
1442         NULL, HFILL }},
1443     { &hf_ansi_tcap_conversationWithPerm,
1444       { "conversationWithPerm", "ansi_tcap.conversationWithPerm",
1445         FT_NONE, BASE_NONE, NULL, 0,
1446         NULL, HFILL }},
1447     { &hf_ansi_tcap_conversationWithoutPerm,
1448       { "conversationWithoutPerm", "ansi_tcap.conversationWithoutPerm",
1449         FT_NONE, BASE_NONE, NULL, 0,
1450         NULL, HFILL }},
1451     { &hf_ansi_tcap_abort,
1452       { "abort", "ansi_tcap.abort",
1453         FT_NONE, BASE_NONE, NULL, 0,
1454         NULL, HFILL }},
1455     { &hf_ansi_tcap_identifier,
1456       { "identifier", "ansi_tcap.identifier",
1457         FT_BYTES, BASE_NONE, NULL, 0,
1458         "TransactionID", HFILL }},
1459     { &hf_ansi_tcap_dialoguePortion,
1460       { "dialoguePortion", "ansi_tcap.dialoguePortion",
1461         FT_NONE, BASE_NONE, NULL, 0,
1462         NULL, HFILL }},
1463     { &hf_ansi_tcap_componentPortion,
1464       { "componentPortion", "ansi_tcap.componentPortion",
1465         FT_UINT32, BASE_DEC, NULL, 0,
1466         "ComponentSequence", HFILL }},
1467     { &hf_ansi_tcap_dialogPortion,
1468       { "dialogPortion", "ansi_tcap.dialogPortion",
1469         FT_NONE, BASE_NONE, NULL, 0,
1470         "DialoguePortion", HFILL }},
1471     { &hf_ansi_tcap_causeInformation,
1472       { "causeInformation", "ansi_tcap.causeInformation",
1473         FT_UINT32, BASE_DEC, VALS(ansi_tcap_T_causeInformation_vals), 0,
1474         NULL, HFILL }},
1475     { &hf_ansi_tcap_abortCause,
1476       { "abortCause", "ansi_tcap.abortCause",
1477         FT_INT32, BASE_DEC, VALS(ansi_tcap_P_Abort_cause_U_vals), 0,
1478         "P_Abort_cause", HFILL }},
1479     { &hf_ansi_tcap_userInformation,
1480       { "userInformation", "ansi_tcap.userInformation",
1481         FT_NONE, BASE_NONE, NULL, 0,
1482         "UserAbortInformation", HFILL }},
1483     { &hf_ansi_tcap_version,
1484       { "version", "ansi_tcap.version",
1485         FT_BYTES, BASE_NONE, NULL, 0,
1486         "ProtocolVersion", HFILL }},
1487     { &hf_ansi_tcap_applicationContext,
1488       { "applicationContext", "ansi_tcap.applicationContext",
1489         FT_UINT32, BASE_DEC, VALS(ansi_tcap_T_applicationContext_vals), 0,
1490         NULL, HFILL }},
1491     { &hf_ansi_tcap_integerApplicationId,
1492       { "integerApplicationId", "ansi_tcap.integerApplicationId",
1493         FT_INT32, BASE_DEC, NULL, 0,
1494         "IntegerApplicationContext", HFILL }},
1495     { &hf_ansi_tcap_objectApplicationId,
1496       { "objectApplicationId", "ansi_tcap.objectApplicationId",
1497         FT_OID, BASE_NONE, NULL, 0,
1498         "ObjectIDApplicationContext", HFILL }},
1499     { &hf_ansi_tcap_userInformation_01,
1500       { "userInformation", "ansi_tcap.userInformation",
1501         FT_UINT32, BASE_DEC, NULL, 0,
1502         NULL, HFILL }},
1503     { &hf_ansi_tcap_securityContext,
1504       { "securityContext", "ansi_tcap.securityContext",
1505         FT_UINT32, BASE_DEC, VALS(ansi_tcap_T_securityContext_vals), 0,
1506         NULL, HFILL }},
1507     { &hf_ansi_tcap_integerSecurityId,
1508       { "integerSecurityId", "ansi_tcap.integerSecurityId",
1509         FT_INT32, BASE_DEC, NULL, 0,
1510         "INTEGER", HFILL }},
1511     { &hf_ansi_tcap_objectSecurityId,
1512       { "objectSecurityId", "ansi_tcap.objectSecurityId",
1513         FT_OID, BASE_NONE, NULL, 0,
1514         "OBJECT_IDENTIFIER", HFILL }},
1515     { &hf_ansi_tcap_confidentiality,
1516       { "confidentiality", "ansi_tcap.confidentiality",
1517         FT_NONE, BASE_NONE, NULL, 0,
1518         NULL, HFILL }},
1519     { &hf_ansi_tcap__untag_item,
1520       { "_untag item", "ansi_tcap._untag_item",
1521         FT_NONE, BASE_NONE, NULL, 0,
1522         "EXTERNAL", HFILL }},
1523     { &hf_ansi_tcap_confidentialityId,
1524       { "confidentialityId", "ansi_tcap.confidentialityId",
1525         FT_UINT32, BASE_DEC, VALS(ansi_tcap_T_confidentialityId_vals), 0,
1526         NULL, HFILL }},
1527     { &hf_ansi_tcap_integerConfidentialityId,
1528       { "integerConfidentialityId", "ansi_tcap.integerConfidentialityId",
1529         FT_INT32, BASE_DEC, NULL, 0,
1530         "INTEGER", HFILL }},
1531     { &hf_ansi_tcap_objectConfidentialityId,
1532       { "objectConfidentialityId", "ansi_tcap.objectConfidentialityId",
1533         FT_OID, BASE_NONE, NULL, 0,
1534         "OBJECT_IDENTIFIER", HFILL }},
1535     { &hf_ansi_tcap__untag_item_01,
1536       { "ComponentPDU", "ansi_tcap.ComponentPDU",
1537         FT_UINT32, BASE_DEC, VALS(ansi_tcap_ComponentPDU_vals), 0,
1538         NULL, HFILL }},
1539     { &hf_ansi_tcap_invokeLast,
1540       { "invokeLast", "ansi_tcap.invokeLast",
1541         FT_NONE, BASE_NONE, NULL, 0,
1542         "Invoke", HFILL }},
1543     { &hf_ansi_tcap_returnResultLast,
1544       { "returnResultLast", "ansi_tcap.returnResultLast",
1545         FT_NONE, BASE_NONE, NULL, 0,
1546         "ReturnResult", HFILL }},
1547     { &hf_ansi_tcap_returnError,
1548       { "returnError", "ansi_tcap.returnError",
1549         FT_NONE, BASE_NONE, NULL, 0,
1550         NULL, HFILL }},
1551     { &hf_ansi_tcap_reject,
1552       { "reject", "ansi_tcap.reject",
1553         FT_NONE, BASE_NONE, NULL, 0,
1554         NULL, HFILL }},
1555     { &hf_ansi_tcap_invokeNotLast,
1556       { "invokeNotLast", "ansi_tcap.invokeNotLast",
1557         FT_NONE, BASE_NONE, NULL, 0,
1558         "Invoke", HFILL }},
1559     { &hf_ansi_tcap_returnResultNotLast,
1560       { "returnResultNotLast", "ansi_tcap.returnResultNotLast",
1561         FT_NONE, BASE_NONE, NULL, 0,
1562         "ReturnResult", HFILL }},
1563     { &hf_ansi_tcap_componentIDs,
1564       { "componentIDs", "ansi_tcap.componentIDs",
1565         FT_BYTES, BASE_NONE, NULL, 0,
1566         NULL, HFILL }},
1567     { &hf_ansi_tcap_operationCode,
1568       { "operationCode", "ansi_tcap.operationCode",
1569         FT_UINT32, BASE_DEC, VALS(ansi_tcap_OperationCode_vals), 0,
1570         NULL, HFILL }},
1571     { &hf_ansi_tcap_parameter,
1572       { "parameter", "ansi_tcap.parameter",
1573         FT_NONE, BASE_NONE, NULL, 0,
1574         NULL, HFILL }},
1575     { &hf_ansi_tcap_componentID,
1576       { "componentID", "ansi_tcap.componentID",
1577         FT_BYTES, BASE_NONE, NULL, 0,
1578         NULL, HFILL }},
1579     { &hf_ansi_tcap_parameter_01,
1580       { "parameter", "ansi_tcap.parameter",
1581         FT_NONE, BASE_NONE, NULL, 0,
1582         "T_parameter_01", HFILL }},
1583     { &hf_ansi_tcap_componentID_01,
1584       { "componentID", "ansi_tcap.componentID",
1585         FT_BYTES, BASE_NONE, NULL, 0,
1586         "T_componentID_01", HFILL }},
1587     { &hf_ansi_tcap_errorCode,
1588       { "errorCode", "ansi_tcap.errorCode",
1589         FT_UINT32, BASE_DEC, VALS(ansi_tcap_ErrorCode_vals), 0,
1590         NULL, HFILL }},
1591     { &hf_ansi_tcap_parameter_02,
1592       { "parameter", "ansi_tcap.parameter",
1593         FT_NONE, BASE_NONE, NULL, 0,
1594         "T_parameter_02", HFILL }},
1595     { &hf_ansi_tcap_componentID_02,
1596       { "componentID", "ansi_tcap.componentID",
1597         FT_BYTES, BASE_NONE, NULL, 0,
1598         "OCTET_STRING_SIZE_0_1", HFILL }},
1599     { &hf_ansi_tcap_rejectProblem,
1600       { "rejectProblem", "ansi_tcap.rejectProblem",
1601         FT_INT32, BASE_DEC, VALS(ansi_tcap_Problem_vals), 0,
1602         "Problem", HFILL }},
1603     { &hf_ansi_tcap_parameter_03,
1604       { "parameter", "ansi_tcap.parameter",
1605         FT_UINT32, BASE_DEC, VALS(ansi_tcap_T_parameter_03_vals), 0,
1606         "T_parameter_03", HFILL }},
1607     { &hf_ansi_tcap_paramSequence,
1608       { "paramSequence", "ansi_tcap.paramSequence",
1609         FT_NONE, BASE_NONE, NULL, 0,
1610         NULL, HFILL }},
1611     { &hf_ansi_tcap_paramSet,
1612       { "paramSet", "ansi_tcap.paramSet",
1613         FT_NONE, BASE_NONE, NULL, 0,
1614         NULL, HFILL }},
1615
1616 /*--- End of included file: packet-ansi_tcap-hfarr.c ---*/
1617 #line 428 "packet-ansi_tcap-template.c"
1618     };
1619
1620 /* Setup protocol subtree array */
1621     static gint *ett[] = {
1622         &ett_tcap,
1623         &ett_param,
1624         &ett_otid,
1625         &ett_dtid,
1626         &ett_ansi_tcap_stat,
1627
1628 /*--- Included file: packet-ansi_tcap-ettarr.c ---*/
1629 #line 1 "packet-ansi_tcap-ettarr.c"
1630     &ett_ansi_tcap_OperationCode,
1631     &ett_ansi_tcap_ErrorCode,
1632     &ett_ansi_tcap_PackageType,
1633     &ett_ansi_tcap_UniTransactionPDU,
1634     &ett_ansi_tcap_TransactionPDU,
1635     &ett_ansi_tcap_Abort,
1636     &ett_ansi_tcap_T_causeInformation,
1637     &ett_ansi_tcap_DialoguePortion_U,
1638     &ett_ansi_tcap_T_applicationContext,
1639     &ett_ansi_tcap_T_securityContext,
1640     &ett_ansi_tcap_UserInformation_U,
1641     &ett_ansi_tcap_Confidentiality,
1642     &ett_ansi_tcap_T_confidentialityId,
1643     &ett_ansi_tcap_SEQUENCE_OF_ComponentPDU,
1644     &ett_ansi_tcap_ComponentPDU,
1645     &ett_ansi_tcap_Invoke,
1646     &ett_ansi_tcap_ReturnResult,
1647     &ett_ansi_tcap_ReturnError,
1648     &ett_ansi_tcap_Reject,
1649     &ett_ansi_tcap_T_parameter_03,
1650     &ett_ansi_tcap_T_paramSequence,
1651     &ett_ansi_tcap_T_paramSet,
1652
1653 /*--- End of included file: packet-ansi_tcap-ettarr.c ---*/
1654 #line 438 "packet-ansi_tcap-template.c"
1655     };
1656
1657     /*static enum_val_t tcap_options[] = {
1658         { "itu", "ITU",  ITU_TCAP_STANDARD },
1659         { "ansi", "ANSI", ANSI_TCAP_STANDARD },
1660         { NULL, NULL, 0 }
1661     };*/
1662
1663
1664 /* Register the protocol name and description */
1665     proto_ansi_tcap = proto_register_protocol(PNAME, PSNAME, PFNAME);
1666         register_dissector("ansi_tcap", dissect_ansi_tcap, proto_ansi_tcap);
1667
1668 /* Required function calls to register the header fields and subtrees used */
1669     proto_register_field_array(proto_ansi_tcap, hf, array_length(hf));
1670     proto_register_subtree_array(ett, array_length(ett));
1671
1672
1673     register_init_routine(&ansi_tcap_init_protocol);
1674 }
1675
1676